diff --git a/README.md b/README.md index af06e23..ad8f1c7 100644 --- a/README.md +++ b/README.md @@ -1,32 +1,85 @@ ## TODO -日志记录,使用任务来实现 +限制提取单次最大量 -支付后事件,需要检测是否已完成操作 +支付后异步任务,到时间后需要尝试完成订单,如果无法完成再关闭 + +重新实现接口 proxy 注册与注销接口: +- 注册时向 redis ports 可用池中加入端口 +- 注销时需要同时移除可用池与租约池中的端口(需要考虑具体实现,考虑正在使用的节点归还问题) + +otel 检查接口性能 + +trade/create 性能问题,缩短事务时间,考虑其他方式实现可靠分布式事务 + +需要确认以下 ID.GenSerial 的分布式并发安全性 ### 长期 -模型字段修改,特定枚举字段使用自定义类型代替通用 int32 +分离 task 的客户端,支持多进程(prefork 必要!) +调整目录结构: + +``` +- /core 核心概念 +- /util 工具函数 + +- /models 模型 +- /queries 数据库层 +- /clients 三方依赖的客户端实例 + +- /services 服务层 +- /auth 认证相关,特化服务 + +- /app 应用相关,初始化日志,环境变量等 +- /http 协议层,http 服务 +- /cmd 主函数 + +逐层向上依赖 +cmd 调用 app, http 的初始化函数 +http 调用 clients 的初始化函数 +``` + +考虑一个方案限制接口请求速率,无侵入更好 + +冷数据迁移方案 + proxy 网关更新接口可以传输更结构化的数据,直接区分不同类型以加快更新速度 ## 业务逻辑 ### 订单关闭的几种方式 -1. 创建订单后推送异步任务,到时间后尝试关闭订单 +1. 创建订单后推送异步任务,到时间后尝试完成订单或关闭订单 2. sse 接口推送订单状态,轮询尝试完成订单 3. 异步回调事件,收到支付成功事件后自动完成订单 +4. 用户退出支付界面,客户端主动发起关闭订单 ### 产品字典表 -| 代码 | 产品 | -|-------|------| -| short | 短效代理 | -| long | 长效代理 | +| 代码 | 产品 | +| ----- | ------------ | +| short | 短效动态代理 | +| long | 长效动态代理 | -## 问题备忘录 +### 节点分配与存储逻辑 -### 商福通支付接口的同步跳转参数 +添加: +- 检查用户 ip 是否在白名单内 +- 取用端口,不够则返回失败 +- 将分配结果转写成配置发送到网关 +- 保存通道信息和分配记录,其中通道信息以网关为主体,分配记录以用户为主体 +- 添加异步任务,当时间结束后释放取用的端口并清空网关配置 -部分通道支持这个参数,银盛和汇付不支持这个参数 +删除: +- 如果传入用户信息,检查要删除的连接是否属于该用户 +- 释放可用端口 + - redis 脚本中检查,如果端口所属节点已下线则直接忽略 +- 提交清空配置到网关 + +缩扩容: +- 通过调度任务实现缩扩容 +- 每 n 秒检查一次全部配置,按代理分组 +- 获取所有代理后备配置 +- 后备配置/当前配置 + - 当比例 < 1.5 或 > 3 时,重新更新为 2 倍 diff --git a/cmd/gen/main.go b/cmd/gen/main.go index c6b46e4..2ec3a95 100644 --- a/cmd/gen/main.go +++ b/cmd/gen/main.go @@ -1,11 +1,10 @@ package main import ( - "strings" + m "platform/web/models" "gorm.io/driver/postgres" "gorm.io/gen" - "gorm.io/gen/field" "gorm.io/gorm" "gorm.io/gorm/schema" ) @@ -26,149 +25,42 @@ func main() { g = gen.NewGenerator(gen.Config{ OutPath: "web/queries", - ModelPkgPath: "models", FieldNullable: true, FieldSignable: true, FieldWithTypeTag: true, Mode: gen.WithDefaultQuery | gen.WithoutContext, }) g.UseDB(db) - - // 公共参数 - common := []gen.ModelOpt{ - gen.FieldModify(func(field gen.Field) gen.Field { - switch { - case field.Type == "*time.Time": - field.Type = "*orm.LocalDateTime" - case field.Type == "time.Time": - field.Type = "orm.LocalDateTime" - case strings.Contains(field.Tags(), "numeric"): - field.Type = "decimal.Decimal" - } - return field - }), - gen.FieldRename("contact_qq", "ContactQQ"), - gen.FieldRename("ua", "UA"), - } - - // 生成模型 - customs := make(map[string]any) - - // resource - resourceShort := g.GenerateModel("resource_short", common...) - customs["resource_short"] = resourceShort - - resourceLong := g.GenerateModel("resource_long", common...) - customs["resource_long"] = resourceLong - - resource := g.GenerateModel("resource", append(common, - gen.FieldRelate(field.HasOne, "Short", resourceShort, &field.RelateConfig{ - RelatePointer: true, - GORMTag: field.GormTag{ - "foreignKey": []string{"ResourceID"}, - "references": []string{"ID"}, - }, - }), - gen.FieldRelate(field.HasOne, "Long", resourceLong, &field.RelateConfig{ - RelatePointer: true, - GORMTag: field.GormTag{ - "foreignKey": []string{"ResourceID"}, - "references": []string{"ID"}, - }, - }), - )...) - customs["resource"] = resource - - // trade - trade := g.GenerateModel("trade", common...) - customs["trade"] = trade - - refund := g.GenerateModel("refund", common...) - customs["refund"] = refund - - bill := g.GenerateModel("bill", append(common, - gen.FieldRelate(field.BelongsTo, "Trade", trade, &field.RelateConfig{ - RelatePointer: true, - GORMTag: field.GormTag{ - "foreignKey": []string{"TradeID"}, - }, - }), - gen.FieldRelate(field.BelongsTo, "Refund", refund, &field.RelateConfig{ - RelatePointer: true, - GORMTag: field.GormTag{ - "foreignKey": []string{"RefundID"}, - }, - }), - gen.FieldRelate(field.BelongsTo, "Resource", resource, &field.RelateConfig{ - RelatePointer: true, - GORMTag: field.GormTag{ - "foreignKey": []string{"ResourceID"}, - }, - }), - )...) - customs["bill"] = bill - - // proxy - edge := g.GenerateModel("edge", common...) - customs["edge"] = edge - - proxy := g.GenerateModel("proxy", append(common, - gen.FieldRelate(field.HasMany, "Edges", edge, &field.RelateConfig{ - GORMTag: field.GormTag{ - "foreignKey": []string{"ProxyID"}, - "references": []string{"ID"}, - }, - }), - )...) - customs["proxy"] = proxy - - // session - user := g.GenerateModel("user", common...) - customs["user"] = user - - admin := g.GenerateModel("admin", common...) - customs["admin"] = admin - - client := g.GenerateModel("client", common...) - customs["client"] = client - - session := g.GenerateModel("session", append(common, - gen.FieldRelate(field.BelongsTo, "User", user, &field.RelateConfig{ - RelatePointer: true, - GORMTag: field.GormTag{ - "foreignKey": []string{"UserID"}, - }, - }), - gen.FieldRelate(field.BelongsTo, "Admin", admin, &field.RelateConfig{ - RelatePointer: true, - GORMTag: field.GormTag{ - "foreignKey": []string{"AdminID"}, - }, - }), - gen.FieldRelate(field.BelongsTo, "Client", client, &field.RelateConfig{ - RelatePointer: true, - GORMTag: field.GormTag{ - "foreignKey": []string{"ClientID"}, - "belongsTo": []string{"ID"}, - }, - }), - )...) - customs["session"] = session - - // 生成表结构 - tables, _ := db.Migrator().GetTables() - models := make([]any, len(tables)) - for i, name := range tables { - if customs[name] != nil { - models[i] = customs[name] - } else { - models[i] = g.GenerateModel(name, common...) - } - } - - g.ApplyBasic(models...) - - // 生成查询 - + g.ApplyBasic( + m.Admin{}, + m.AdminRole{}, + m.Announcement{}, + m.Bill{}, + m.Channel{}, + m.Client{}, + m.Coupon{}, + m.Edge{}, + m.LinkAdminRole{}, + m.LinkAdminRolePermission{}, + m.LinkClientPermission{}, + m.LinkUserRole{}, + m.LinkUserRolePermission{}, + m.LogsLogin{}, + m.LogsRequest{}, + m.LogsUserBandwidth{}, + m.LogsUserUsage{}, + m.Permission{}, + m.Product{}, + m.Proxy{}, + m.Refund{}, + m.Resource{}, + m.ResourceLong{}, + m.ResourceShort{}, + m.Session{}, + m.Trade{}, + m.User{}, + m.UserRole{}, + m.Whitelist{}, + ) g.Execute() } diff --git a/docker-compose.yaml b/docker-compose.yaml index a877b62..1ae52b0 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -1,4 +1,4 @@ -name: server-dev +name: lanhu services: postgres: @@ -11,6 +11,7 @@ services: - "${DB_PORT}:5432" volumes: - postgres_data:/var/lib/postgresql/data + - ./scripts/sql/init.sql:/docker-entrypoint-initdb.d/init.sql restart: unless-stopped redis: diff --git a/pkg/u/u.go b/pkg/u/u.go index 00973a9..bebadea 100644 --- a/pkg/u/u.go +++ b/pkg/u/u.go @@ -5,11 +5,36 @@ import ( "time" ) -// P 是一个工具函数,用于在表达式内原地创建一个指针 +// ==================== +// 逻辑 +// ==================== + +func Else[T any](v *T, or T) T { + if v == nil { + return or + } else { + return *v + } +} + +func ElseTo[A any, B any](a *A, f func(A) B) *B { + if a == nil { + return nil + } else { + return P(f(*a)) + } +} + +// ==================== +// 指针 +// ==================== + +// P 原地创建值的指针 func P[T any](v T) *T { return &v } +// Z 转换值为不可空,如果值为 nil,则返回其零值 func Z[T any](v *T) T { if v == nil { var zero T @@ -18,6 +43,7 @@ func Z[T any](v *T) T { return *v } +// X 转换值为可空,如果值为零值,则返回 nil func X[T comparable](v T) *T { var zero T if v == zero { @@ -26,28 +52,50 @@ func X[T comparable](v T) *T { return &v } -func Today() time.Time { - var now = time.Now() - return time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location()) -} +// ==================== +// 数组 +// ==================== -func Date(date time.Time) time.Time { - return time.Date(date.Year(), date.Month(), date.Day(), 0, 0, 0, 0, date.Location()) -} - -func SameDate(date time.Time) bool { - var now = time.Now() - return date.Year() == now.Year() && date.Month() == now.Month() && date.Day() == now.Day() -} - -func Or[T any](v *T, or T) T { - if v == nil { - return or - } else { - return *v +func Map[T any, R any](src []T, convert func(T) R) []R { + dst := make([]R, len(src)) + for i, item := range src { + dst[i] = convert(item) } + return dst } +// ==================== +// 时间 +// ==================== + +func DateHead(date time.Time) time.Time { + var y, m, d = date.Date() + return time.Date(y, m, d, 0, 0, 0, 0, date.Location()) +} + +func DateFoot(date time.Time) time.Time { + var y, m, d = date.Date() + return time.Date(y, m, d, 23, 59, 59, 999999999, date.Location()) +} + +func Today() time.Time { + return DateHead(time.Now()) +} + +func IsSameDate(date1, date2 time.Time) bool { + var y1, m1, d1 = date1.Date() + var y2, m2, d2 = date2.Date() + return y1 == y2 && m1 == m2 && d1 == d2 +} + +func IsToday(date time.Time) bool { + return IsSameDate(date, time.Now()) +} + +// ==================== +// 错误 +// ==================== + func CombineErrors(errs []error) error { var combinedErr error = nil for _, err := range errs { diff --git a/scripts/sql/init.sql b/scripts/sql/init.sql index bc2e6b8..1ec850c 100644 --- a/scripts/sql/init.sql +++ b/scripts/sql/init.sql @@ -5,24 +5,18 @@ -- logs_request drop table if exists logs_request cascade; create table logs_request ( - id serial primary key, - - ip varchar(45) not null, - ua varchar(255) not null, + id int generated by default as identity primary key, + ip inet not null, + ua text not null, user_id int, client_id int, - - method varchar(10) not null, - path varchar(255) not null, - - status int not null, + method text not null, + path text not null, + status smallint not null, error text, - - time timestamp not null, - latency varchar(255) not null + time timestamptz not null, + latency text not null ); -create index logs_request_user_id_index on logs_request (user_id); -create index logs_request_client_id_index on logs_request (client_id); -- logs_access表字段注释 comment on table logs_request is '访问日志表'; @@ -42,16 +36,15 @@ comment on column logs_request.latency is '请求延迟'; drop table if exists logs_login cascade; create table logs_login ( - id serial primary key, - ip varchar(45) not null, - ua varchar(255) not null, - grant_type varchar(255) not null, - password_grant_type varchar(255) not null, - success bool not null, - user_id int, - time timestamp not null + id int generated by default as identity primary key, + ip inet not null, + ua text not null, + grant_type text not null, + password_type text not null, + success bool not null, + user_id int, + time timestamptz not null ); -create index logs_login_user_id_index on logs_login (user_id); -- logs_login表字段注释 comment on table logs_login is '登录日志表'; @@ -60,25 +53,26 @@ comment on column logs_login.user_id is '用户ID'; comment on column logs_login.ip is 'IP地址'; comment on column logs_login.ua is '用户代理'; comment on column logs_login.grant_type is '授权类型:authorization_code-授权码模式,client_credentials-客户端凭证模式,refresh_token-刷新令牌模式,password-密码模式'; -comment on column logs_login.password_grant_type is '密码模式子授权类型:password-账号密码,phone_code-手机验证码,email_code-邮箱验证码'; +comment on column logs_login.password_type is '密码模式子授权类型:password-账号密码,phone_code-手机验证码,email_code-邮箱验证码'; comment on column logs_login.success is '登录是否成功'; comment on column logs_login.time is '登录时间'; -- logs_user_usage drop table if exists logs_user_usage cascade; create table logs_user_usage ( - id serial primary key, + id int generated by default as identity primary key, user_id int not null, resource_id int not null, count int not null, - prov varchar(255), - city varchar(255), - isp varchar(255), - ip varchar(45) not null, - time timestamp not null + prov text, + city text, + isp text, + ip inet not null, + time timestamptz not null ); -create index logs_user_usage_user_id_index on logs_user_usage (user_id); -create index logs_user_usage_resource_id_index on logs_user_usage (resource_id); +create index idx_logs_user_usage_user_id on logs_user_usage (user_id); +create index idx_logs_user_usage_resource_id on logs_user_usage (resource_id); +create index idx_logs_user_usage_time on logs_user_usage (time); -- logs_user_usage表字段注释 comment on table logs_user_usage is '用户使用日志表'; @@ -95,12 +89,13 @@ comment on column logs_user_usage.time is '提取时间'; -- logs_user_bandwidth drop table if exists logs_user_bandwidth cascade; create table logs_user_bandwidth ( - id serial primary key, - user_id int not null, - bandwidth int not null, - time timestamp not null + id int generated by default as identity primary key, + user_id int not null, + bandwidth int not null, + time timestamptz not null ); -create index logs_user_bandwidth_user_id_index on logs_user_bandwidth (user_id); +create index idx_logs_user_bandwidth_user_id on logs_user_bandwidth (user_id); +create index idx_logs_user_bandwidth_time on logs_user_bandwidth (time); -- logs_user_bandwidth表字段注释 comment on table logs_user_bandwidth is '用户带宽日志表'; @@ -109,8 +104,6 @@ comment on column logs_user_bandwidth.user_id is '用户ID'; comment on column logs_user_bandwidth.bandwidth is '带宽使用量(KB)'; comment on column logs_user_bandwidth.time is '记录时间'; --- logs_user_bandwidth - -- endregion -- ==================== @@ -120,23 +113,24 @@ comment on column logs_user_bandwidth.time is '记录时间'; -- admin drop table if exists admin cascade; create table admin ( - id serial primary key, - username varchar(255) not null unique, - password varchar(255) not null, - name varchar(255), - avatar varchar(255), - phone varchar(255), - email varchar(255), - status int not null default 1, - last_login timestamp, - last_login_host varchar(45), - last_login_agent varchar(255), - created_at timestamp default current_timestamp, - updated_at timestamp default current_timestamp, - deleted_at timestamp + id int generated by default as identity primary key, + username text not null, + password text not null, + name text, + avatar text, + phone text, + email text, + status int not null default 1, + last_login timestamptz, + last_login_ip inet, + last_login_ua text, + created_at timestamptz default current_timestamp, + updated_at timestamptz default current_timestamp, + deleted_at timestamptz ); -create index admin_status_index on admin (status); -create index admin_deleted_at_index on admin (deleted_at); +create unique index udx_admin_username on admin (username); +create index idx_admin_status on admin (status) where deleted_at is null; +create index idx_admin_created_at on admin (created_at) where deleted_at is null; -- admin表字段注释 comment on table admin is '管理员表'; @@ -149,8 +143,8 @@ comment on column admin.phone is '手机号码'; comment on column admin.email is '邮箱'; comment on column admin.status is '状态:0-禁用,1-正常'; comment on column admin.last_login is '最后登录时间'; -comment on column admin.last_login_host is '最后登录地址'; -comment on column admin.last_login_agent is '最后登录代理'; +comment on column admin.last_login_ip is '最后登录地址'; +comment on column admin.last_login_ua is '最后登录代理'; comment on column admin.created_at is '创建时间'; comment on column admin.updated_at is '更新时间'; comment on column admin.deleted_at is '删除时间'; @@ -158,16 +152,17 @@ comment on column admin.deleted_at is '删除时间'; -- admin_role drop table if exists admin_role cascade; create table admin_role ( - id serial primary key, - name varchar(255) not null unique, - description varchar(255), + id int generated by default as identity primary key, + name text not null, + description text, active bool default true, sort int default 0, - created_at timestamp default current_timestamp, - updated_at timestamp default current_timestamp, - deleted_at timestamp + created_at timestamptz default current_timestamp, + updated_at timestamptz default current_timestamp, + deleted_at timestamptz ); -create index admin_role_deleted_at_index on admin_role (deleted_at); +create unique index udx_admin_role_name on admin_role (name) where deleted_at is null; +create index idx_admin_role_created_at on admin_role (created_at) where deleted_at is null; -- admin_role表字段注释 comment on table admin_role is '管理员角色关联表'; @@ -183,19 +178,20 @@ comment on column admin_role.deleted_at is '删除时间'; -- announcement drop table if exists announcement cascade; create table announcement ( - id serial primary key, - title varchar(255) not null, + id int generated by default as identity primary key, + title text not null, content text, - type int not null default 1, - pin bool not null default false, - status int not null default 1, - sort int not null default 0, - created_at timestamp default current_timestamp, - updated_at timestamp default current_timestamp, - deleted_at timestamp + type int not null default 1, + pin bool not null default false, + status int not null default 1, + sort int not null default 0, + created_at timestamptz default current_timestamp, + updated_at timestamptz default current_timestamp, + deleted_at timestamptz ); -create index announcement_status_index on announcement (status); -create index announcement_deleted_at_index on announcement (deleted_at); +create index idx_announcement_type on announcement (type) where deleted_at is null; +create index idx_announcement_pin on announcement (pin) where deleted_at is null; +create index idx_announcement_created_at on announcement (created_at) where deleted_at is null; -- announcement表字段注释 comment on table announcement is '公告表'; @@ -219,33 +215,33 @@ comment on column announcement.deleted_at is '删除时间'; -- user drop table if exists "user" cascade; create table "user" ( - id serial primary key, - admin_id int, - phone varchar(255) not null unique, - username varchar(255), - email varchar(255), - password varchar(255), - name varchar(255), - avatar varchar(255), - status int not null default 1, - balance decimal(12, 2) not null default 0, - id_type int not null default 0, - id_no varchar(255), - id_token varchar(255), - contact_qq varchar(255), - contact_wechat varchar(255), - last_login timestamp, - last_login_host varchar(45), - last_login_agent varchar(255), - created_at timestamp default current_timestamp, - updated_at timestamp default current_timestamp, - deleted_at timestamp + id int generated by default as identity primary key, + admin_id int, + phone text not null unique, + username text, + email text, + password text, + name text, + avatar text, + status int not null default 1, + balance decimal(12, 2) not null default 0, + id_type int not null default 0, + id_no text, + id_token text, + contact_qq text, + contact_wechat text, + last_login timestamptz, + last_login_ip inet, + last_login_ua text, + created_at timestamptz default current_timestamp, + updated_at timestamptz default current_timestamp, + deleted_at timestamptz ); -create index user_admin_id_index on "user" (admin_id); -create index user_username_index on "user" (username); -create index user_email_index on "user" (email); -create index user_status_index on "user" (status); -create index user_deleted_at_index on "user" (deleted_at); +create index idx_user_admin_id on "user" (admin_id) where deleted_at is null; +create unique index udx_user_phone on "user" (phone) where deleted_at is null; +create unique index udx_user_username on "user" (username) where deleted_at is null; +create unique index udx_user_email on "user" (email) where deleted_at is null; +create index idx_user_created_at on "user" (created_at) where deleted_at is null; -- user表字段注释 comment on table "user" is '用户表'; @@ -264,8 +260,8 @@ comment on column "user".id_token is '身份验证标识'; comment on column "user".contact_qq is 'QQ联系方式'; comment on column "user".contact_wechat is '微信联系方式'; comment on column "user".last_login is '最后登录时间'; -comment on column "user".last_login_host is '最后登录地址'; -comment on column "user".last_login_agent is '最后登录代理'; +comment on column "user".last_login_ip is '最后登录地址'; +comment on column "user".last_login_ua is '最后登录代理'; comment on column "user".created_at is '创建时间'; comment on column "user".updated_at is '更新时间'; comment on column "user".deleted_at is '删除时间'; @@ -273,16 +269,17 @@ comment on column "user".deleted_at is '删除时间'; -- user_role drop table if exists user_role cascade; create table user_role ( - id serial primary key, - name varchar(255) not null unique, - description varchar(255), + id int generated by default as identity primary key, + name text not null, + description text, active bool default true, sort int default 0, - created_at timestamp default current_timestamp, - updated_at timestamp default current_timestamp, - deleted_at timestamp + created_at timestamptz default current_timestamp, + updated_at timestamptz default current_timestamp, + deleted_at timestamptz ); -create index user_role_deleted_at_index on user_role (deleted_at); +create unique index udx_user_role_name on user_role (name) where deleted_at is null; +create index idx_user_role_created_at on user_role (created_at) where deleted_at is null; -- user_role表字段注释 comment on table user_role is '用户角色表'; @@ -303,24 +300,22 @@ comment on column user_role.deleted_at is '删除时间'; drop table if exists client cascade; create table client ( - id serial primary key, - client_id varchar(255) not null unique, - client_secret varchar(255) not null, - redirect_uri varchar(255), - spec int not null, - name varchar(255) not null, - icon varchar(255), - status int not null default 1, - type int not null default 0, - created_at timestamp default current_timestamp, - updated_at timestamp default current_timestamp, - deleted_at timestamp + id int generated by default as identity primary key, + client_id text not null unique, + client_secret text not null, + redirect_uri text, + spec int not null, + name text not null, + icon text, + status int not null default 1, + type int not null default 0, + created_at timestamptz default current_timestamp, + updated_at timestamptz default current_timestamp, + deleted_at timestamptz ); - -create index client_client_id_index on client (client_id); -create index client_name_index on client (name); -create index client_status_index on client (status); -create index client_deleted_at_index on client (deleted_at); +create unique index udx_client_client_id on client (client_id); +create index idx_client_name on client (name) where deleted_at is null; +create index idx_client_created_at on client (created_at) where deleted_at is null; -- client表字段注释 comment on table client is '客户端表'; @@ -346,28 +341,27 @@ comment on column client.deleted_at is '删除时间'; -- session drop table if exists session cascade; create table session ( - id serial primary key, + id int generated by default as identity primary key, user_id int, admin_id int, client_id int, - ip varchar(45), - ua varchar(255), - access_token varchar(255) not null unique, - access_token_expires timestamp not null, - refresh_token varchar(255) unique, - refresh_token_expires timestamp, - scopes varchar(255), - created_at timestamp default current_timestamp, - updated_at timestamp default current_timestamp, - deleted_at timestamp + ip inet, + ua text, + access_token text not null, + access_token_expires timestamptz not null, + refresh_token text, + refresh_token_expires timestamptz, + scopes text, + created_at timestamptz default current_timestamp, + updated_at timestamptz default current_timestamp, + deleted_at timestamptz ); -create index session_user_id_index on session (user_id); -create index session_admin_id_index on session (admin_id); -create index session_client_id_index on session (client_id); -create index session_access_token_index on session (access_token); -create index session_refresh_token_index on session (refresh_token); -create index session_created_at_index on session (created_at); -create index session_deleted_at_index on session (deleted_at); +create unique index udx_session_access_token on session (access_token) where deleted_at is null; +create unique index udx_session_refresh_token on session (refresh_token) where deleted_at is null; +create index idx_session_user_id on session (user_id) where deleted_at is null; +create index idx_session_admin_id on session (admin_id) where deleted_at is null; +create index idx_session_client_id on session (client_id) where deleted_at is null; +create index idx_session_created_at on session (created_at) where deleted_at is null; -- session表字段注释 comment on table session is '会话表'; @@ -389,17 +383,17 @@ comment on column session.deleted_at is '删除时间'; -- permission drop table if exists permission cascade; create table permission ( - id serial primary key, + id int generated by default as identity primary key, parent_id int, - name varchar(255) not null unique, - description varchar(255), - created_at timestamp default current_timestamp, - updated_at timestamp default current_timestamp, - deleted_at timestamp + name text not null, + description text, + created_at timestamptz default current_timestamp, + updated_at timestamptz default current_timestamp, + deleted_at timestamptz ); -create index permission_parent_id_index on permission (parent_id); -create index permission_name_index on permission (name); -create index permission_deleted_at_index on permission (deleted_at); +create unique index udx_permission_name on permission (name) where deleted_at is null; +create index idx_permission_parent_id on permission (parent_id) where deleted_at is null; +create index idx_permission_created_at on permission (created_at) where deleted_at is null; -- permission表字段注释 comment on table permission is '权限表'; @@ -411,120 +405,85 @@ comment on column permission.created_at is '创建时间'; comment on column permission.updated_at is '更新时间'; comment on column permission.deleted_at is '删除时间'; --- user_role_link -drop table if exists user_role_link cascade; -create table user_role_link ( - id serial primary key, - user_id int not null, - role_id int not null, - created_at timestamp default current_timestamp, - updated_at timestamp default current_timestamp, - deleted_at timestamp +-- link_user_role +drop table if exists link_user_role cascade; +create table link_user_role ( + id int generated by default as identity primary key, + user_id int not null, + role_id int not null ); -create index user_role_link_user_id_index on user_role_link (user_id); -create index user_role_link_role_id_index on user_role_link (role_id); -create index user_role_link_deleted_at_index on user_role_link (deleted_at); +create index idx_link_user_role_user_id on link_user_role (user_id); +create index idx_link_user_role_role_id on link_user_role (role_id); --- user_role_link表字段注释 -comment on table user_role_link is '用户角色关联表'; -comment on column user_role_link.id is '关联ID'; -comment on column user_role_link.user_id is '用户ID'; -comment on column user_role_link.role_id is '角色ID'; -comment on column user_role_link.created_at is '创建时间'; -comment on column user_role_link.updated_at is '更新时间'; -comment on column user_role_link.deleted_at is '删除时间'; +-- link_user_role表字段注释 +comment on table link_user_role is '用户角色关联表'; +comment on column link_user_role.id is '关联ID'; +comment on column link_user_role.user_id is '用户ID'; +comment on column link_user_role.role_id is '角色ID'; --- admin_role_link -drop table if exists admin_role_link cascade; -create table admin_role_link ( - id serial primary key, - admin_id int not null, - role_id int not null, - created_at timestamp default current_timestamp, - updated_at timestamp default current_timestamp, - deleted_at timestamp +-- link_admin_role +drop table if exists link_admin_role cascade; +create table link_admin_role ( + id int generated by default as identity primary key, + admin_id int not null, + role_id int not null ); -create index admin_role_link_admin_id_index on admin_role_link (admin_id); -create index admin_role_link_role_id_index on admin_role_link (role_id); -create index admin_role_link_deleted_at_index on admin_role_link (deleted_at); +create index idx_link_admin_role_admin_id on link_admin_role (admin_id); +create index idx_link_admin_role_role_id on link_admin_role (role_id); --- admin_role_link表字段注释 -comment on table admin_role_link is '管理员角色关联表'; -comment on column admin_role_link.id is '关联ID'; -comment on column admin_role_link.admin_id is '管理员ID'; -comment on column admin_role_link.role_id is '角色ID'; -comment on column admin_role_link.created_at is '创建时间'; -comment on column admin_role_link.updated_at is '更新时间'; -comment on column admin_role_link.deleted_at is '删除时间'; +-- link_admin_role表字段注释 +comment on table link_admin_role is '管理员角色关联表'; +comment on column link_admin_role.id is '关联ID'; +comment on column link_admin_role.admin_id is '管理员ID'; +comment on column link_admin_role.role_id is '角色ID'; --- user_role_permission_link -drop table if exists user_role_permission_link cascade; -create table user_role_permission_link ( - id serial primary key, +-- link_user_role_permission +drop table if exists link_user_role_permission cascade; +create table link_user_role_permission ( + id int generated by default as identity primary key, role_id int not null, - permission_id int not null, - created_at timestamp default current_timestamp, - updated_at timestamp default current_timestamp, - deleted_at timestamp + permission_id int not null ); -create index user_role_permission_link_role_id_index on user_role_permission_link (role_id); -create index user_role_permission_link_permission_id_index on user_role_permission_link (permission_id); -create index user_role_permission_link_deleted_at_index on user_role_permission_link (deleted_at); +create index idx_link_user_role_permission_role_id on link_user_role_permission (role_id); +create index idx_link_user_role_permission_permission_id on link_user_role_permission (permission_id); --- user_role_permission_link表字段注释 -comment on table user_role_permission_link is '用户角色权限关联表'; -comment on column user_role_permission_link.id is '关联ID'; -comment on column user_role_permission_link.role_id is '角色ID'; -comment on column user_role_permission_link.permission_id is '权限ID'; -comment on column user_role_permission_link.created_at is '创建时间'; -comment on column user_role_permission_link.updated_at is '更新时间'; -comment on column user_role_permission_link.deleted_at is '删除时间'; +-- link_user_role_permission表字段注释 +comment on table link_user_role_permission is '用户角色权限关联表'; +comment on column link_user_role_permission.id is '关联ID'; +comment on column link_user_role_permission.role_id is '角色ID'; +comment on column link_user_role_permission.permission_id is '权限ID'; --- admin_role_permission_link -drop table if exists admin_role_permission_link cascade; -create table admin_role_permission_link ( - id serial primary key, +-- link_admin_role_permission +drop table if exists link_admin_role_permission cascade; +create table link_admin_role_permission ( + id int generated by default as identity primary key, role_id int not null, - permission_id int not null, - created_at timestamp default current_timestamp, - updated_at timestamp default current_timestamp, - deleted_at timestamp + permission_id int not null ); -create index admin_role_permission_link_role_id_index on admin_role_permission_link (role_id); -create index admin_role_permission_link_permission_id_index on admin_role_permission_link (permission_id); -create index admin_role_permission_link_deleted_at_index on admin_role_permission_link (deleted_at); +create index idx_link_admin_role_permission_role_id on link_admin_role_permission (role_id); +create index idx_link_admin_role_permission_permission_id on link_admin_role_permission (permission_id); --- admin_role_permission_link表字段注释 -comment on table admin_role_permission_link is '管理员角色权限关联表'; -comment on column admin_role_permission_link.id is '关联ID'; -comment on column admin_role_permission_link.role_id is '角色ID'; -comment on column admin_role_permission_link.permission_id is '权限ID'; -comment on column admin_role_permission_link.created_at is '创建时间'; -comment on column admin_role_permission_link.updated_at is '更新时间'; -comment on column admin_role_permission_link.deleted_at is '删除时间'; +-- link_admin_role_permission表字段注释 +comment on table link_admin_role_permission is '管理员角色权限关联表'; +comment on column link_admin_role_permission.id is '关联ID'; +comment on column link_admin_role_permission.role_id is '角色ID'; +comment on column link_admin_role_permission.permission_id is '权限ID'; --- client_permission_link -drop table if exists client_permission_link cascade; -create table client_permission_link ( - id serial primary key, +-- link_client_permission +drop table if exists link_client_permission cascade; +create table link_client_permission ( + id int generated by default as identity primary key, client_id int not null, - permission_id int not null, - created_at timestamp default current_timestamp, - updated_at timestamp default current_timestamp, - deleted_at timestamp + permission_id int not null ); -create index client_permission_link_client_id_index on client_permission_link (client_id); -create index client_permission_link_permission_id_index on client_permission_link (permission_id); -create index client_permission_link_deleted_at_index on client_permission_link (deleted_at); +create index idx_link_client_permission_client_id on link_client_permission (client_id); +create index idx_link_client_permission_permission_id on link_client_permission (permission_id); --- client_permission_link表字段注释 -comment on table client_permission_link is '客户端权限关联表'; -comment on column client_permission_link.id is '关联ID'; -comment on column client_permission_link.client_id is '客户端ID'; -comment on column client_permission_link.permission_id is '权限ID'; -comment on column client_permission_link.created_at is '创建时间'; -comment on column client_permission_link.updated_at is '更新时间'; -comment on column client_permission_link.deleted_at is '删除时间'; +-- link_client_permission表字段注释 +comment on table link_client_permission is '客户端权限关联表'; +comment on column link_client_permission.id is '关联ID'; +comment on column link_client_permission.client_id is '客户端ID'; +comment on column link_client_permission.permission_id is '权限ID'; -- endregion @@ -535,32 +494,32 @@ comment on column client_permission_link.deleted_at is '删除时间'; -- proxy drop table if exists proxy cascade; create table proxy ( - id serial primary key, - version int not null, - name varchar(255) not null unique, - host varchar(255) not null, - secret varchar(255), - type int not null, - status int not null, - created_at timestamp default current_timestamp, - updated_at timestamp default current_timestamp, - deleted_at timestamp + id int generated by default as identity primary key, + version int not null, + mac text not null, + ip inet not null, + secret text, + type int not null, + status int not null, + meta jsonb not null, + created_at timestamptz default current_timestamp, + updated_at timestamptz default current_timestamp, + deleted_at timestamptz ); -create index proxy_name_index on proxy (name); -create index proxy_host_index on proxy (host); -create index proxy_type_index on proxy (type); -create index proxy_status_index on proxy (status); -create index proxy_deleted_at_index on proxy (deleted_at); +create unique index udx_proxy_mac on proxy (mac) where deleted_at is null; +create unique index udx_proxy_ip on proxy (ip) where deleted_at is null; +create index idx_proxy_created_at on proxy (created_at) where deleted_at is null; -- proxy表字段注释 comment on table proxy is '代理服务表'; comment on column proxy.id is '代理服务ID'; comment on column proxy.version is '代理服务版本'; -comment on column proxy.name is '代理服务名称'; -comment on column proxy.host is '代理服务地址'; -comment on column proxy.type is '代理服务类型:1-三方,2-自有'; +comment on column proxy.mac is '代理服务名称'; +comment on column proxy.ip is '代理服务地址'; +comment on column proxy.type is '代理服务类型:1-自有,2-白银'; comment on column proxy.secret is '代理服务密钥'; comment on column proxy.status is '代理服务状态:0-离线,1-在线'; +comment on column proxy.meta is '代理服务元信息'; comment on column proxy.created_at is '创建时间'; comment on column proxy.updated_at is '更新时间'; comment on column proxy.deleted_at is '删除时间'; @@ -568,42 +527,37 @@ comment on column proxy.deleted_at is '删除时间'; -- edge drop table if exists edge cascade; create table edge ( - id serial primary key, - proxy_id int, - type int not null, - version int not null, - name varchar(255) not null unique, - host varchar(255) not null, - isp int not null, - prov varchar(255) not null, - city varchar(255) not null, - proxy_port int, - status int not null default 0, + id int generated by default as identity primary key, + type int not null, + version int not null, + mac text not null, + ip inet not null, + isp int not null, + prov text not null, + city text not null, + status int not null default 0, rtt int default 0, loss int default 0, - created_at timestamp default current_timestamp, - updated_at timestamp default current_timestamp, - deleted_at timestamp + created_at timestamptz default current_timestamp, + updated_at timestamptz default current_timestamp, + deleted_at timestamptz ); -create index edge_proxy_id_index on edge (proxy_id); -create index edge_type_index on edge (type); -create index edge_isp_index on edge (isp); -create index edge_prov_index on edge (prov); -create index edge_city_index on edge (city); -create index edge_deleted_at_index on edge (deleted_at); +create unique index udx_edge_mac on edge (mac) where deleted_at is null; +create index idx_edge_isp on edge (isp) where deleted_at is null; +create index idx_edge_prov on edge (prov) where deleted_at is null; +create index idx_edge_city on edge (city) where deleted_at is null; +create index idx_edge_created_at on edge (created_at) where deleted_at is null; -- edge表字段注释 comment on table edge is '节点表'; comment on column edge.id is '节点ID'; comment on column edge.type is '节点类型:1-自建'; comment on column edge.version is '节点版本'; -comment on column edge.name is '节点名称'; -comment on column edge.host is '节点地址'; -comment on column edge.isp is '运营商:0-未知,1-电信,2-联通,3-移动'; +comment on column edge.mac is '节点 mac 地址'; +comment on column edge.ip is '节点地址'; +comment on column edge.isp is '运营商:1-电信,2-联通,3-移动'; comment on column edge.prov is '省份'; comment on column edge.city is '城市'; -comment on column edge.proxy_id is '代理ID'; -comment on column edge.proxy_port is '代理端口'; comment on column edge.status is '节点状态:0-离线,1-正常'; comment on column edge.rtt is '最近平均延迟'; comment on column edge.loss is '最近丢包率'; @@ -614,23 +568,23 @@ comment on column edge.deleted_at is '删除时间'; -- whitelist drop table if exists whitelist cascade; create table whitelist ( - id serial primary key, - user_id int not null, - host varchar(45) not null, - remark varchar(255), - created_at timestamp default current_timestamp, - updated_at timestamp default current_timestamp, - deleted_at timestamp + id int generated by default as identity primary key, + user_id int not null, + ip inet not null, + remark text, + created_at timestamptz default current_timestamp, + updated_at timestamptz default current_timestamp, + deleted_at timestamptz ); -create index whitelist_user_id_index on whitelist (user_id); -create index whitelist_host_index on whitelist (host); -create index whitelist_deleted_at_index on whitelist (deleted_at); +create index idx_whitelist_user_id on whitelist (user_id) where deleted_at is null; +create index idx_whitelist_ip on whitelist (ip) where deleted_at is null; +create index idx_whitelist_created_at on whitelist (created_at) where deleted_at is null; -- whitelist表字段注释 comment on table whitelist is '白名单表'; comment on column whitelist.id is '白名单ID'; comment on column whitelist.user_id is '用户ID'; -comment on column whitelist.host is 'IP地址'; +comment on column whitelist.ip is 'IP地址'; comment on column whitelist.remark is '备注'; comment on column whitelist.created_at is '创建时间'; comment on column whitelist.updated_at is '更新时间'; @@ -639,51 +593,47 @@ comment on column whitelist.deleted_at is '删除时间'; -- channel drop table if exists channel cascade; create table channel ( - id serial primary key, - user_id int not null, - proxy_id int not null, + id int generated by default as identity primary key, + user_id int not null, + resource_id int not null, + batch_no text not null, + proxy_id int not null, + port int not null, edge_id int, - resource_id int not null, - proxy_host varchar(255) not null default '', - proxy_port int not null, - edge_host varchar(255), - protocol int, - auth_ip bool not null default false, - whitelists text, - auth_pass bool not null default false, - username varchar(255), - password varchar(255), - expiration timestamp not null, - created_at timestamp default current_timestamp, - updated_at timestamp default current_timestamp, - deleted_at timestamp + filter_isp int, + filter_prov text, + filter_city text, + ip inet, + whitelists text[], + username text, + password text, + expired_at timestamptz not null, + created_at timestamptz default current_timestamp, + updated_at timestamptz default current_timestamp, + deleted_at timestamptz ); -create index channel_user_id_index on channel (user_id); -create index channel_proxy_id_index on channel (proxy_id); -create index channel_edge_id_index on channel (edge_id); -create index channel_resource_id_index on channel (resource_id); -create index channel_auth_ip_index on channel (auth_ip); -create index channel_auth_pass_index on channel (auth_pass); -create index channel_expiration_index on channel (expiration); -create index channel_deleted_at_index on channel (deleted_at); +create index idx_channel_user_resource on channel (user_id, resource_id) where deleted_at is null; +create index idx_channel_batch_no on channel (batch_no); +create index idx_channel_proxy_id on channel (proxy_id) where deleted_at is null; +create index idx_channel_created_at on channel (created_at) where deleted_at is null; -- channel表字段注释 comment on table channel is '通道表'; comment on column channel.id is '通道ID'; comment on column channel.user_id is '用户ID'; -comment on column channel.proxy_id is '代理ID'; -comment on column channel.edge_id is '节点ID'; comment on column channel.resource_id is '套餐ID'; -comment on column channel.proxy_host is '代理地址'; -comment on column channel.proxy_port is '转发端口'; -comment on column channel.edge_host is '节点地址'; -comment on column channel.protocol is '协议类型:1-http,2-https,3-socks5'; -comment on column channel.auth_ip is 'IP认证'; +comment on column channel.batch_no is '批次编号'; +comment on column channel.proxy_id is '代理ID'; +comment on column channel.port is '代理端口'; +comment on column channel.edge_id is '节点ID(手动配置)'; +comment on column channel.filter_isp is '运营商过滤(自动配置):参考 edge.isp'; +comment on column channel.filter_prov is '省份过滤(自动配置)'; +comment on column channel.filter_city is '城市过滤(自动配置)'; +comment on column channel.ip is '节点地址'; comment on column channel.whitelists is 'IP白名单,逗号分隔'; -comment on column channel.auth_pass is '密码认证'; comment on column channel.username is '用户名'; comment on column channel.password is '密码'; -comment on column channel.expiration is '过期时间'; +comment on column channel.expired_at is '过期时间'; comment on column channel.created_at is '创建时间'; comment on column channel.updated_at is '更新时间'; comment on column channel.deleted_at is '删除时间'; @@ -697,17 +647,19 @@ comment on column channel.deleted_at is '删除时间'; -- product drop table if exists product cascade; create table product ( - id serial primary key, - code varchar(255) not null unique, - name varchar(255) not null, - description varchar(255), - sort int not null default 0, - status int not null default 1, - created_at timestamp default current_timestamp, - updated_at timestamp default current_timestamp, - deleted_at timestamp + id int generated by default as identity primary key, + code text not null unique, + name text not null, + description text, + sort int not null default 0, + status int not null default 1, + created_at timestamptz default current_timestamp, + updated_at timestamptz default current_timestamp, + deleted_at timestamptz ); -create index product_deleted_at_index on product (deleted_at); +create unique index udx_product_code on product (code); +create index idx_product_name on product (name) where deleted_at is null; +create index idx_product_created_at on product (created_at) where deleted_at is null; -- product表字段注释 comment on table product is '产品表'; @@ -724,20 +676,18 @@ comment on column product.deleted_at is '删除时间'; -- resource drop table if exists resource cascade; create table resource ( - id serial primary key, + id int generated by default as identity primary key, user_id int not null, - resource_no varchar(255) unique, + resource_no text, active bool not null default true, type int not null, - created_at timestamp default current_timestamp, - updated_at timestamp default current_timestamp, - deleted_at timestamp + created_at timestamptz default current_timestamp, + updated_at timestamptz default current_timestamp, + deleted_at timestamptz ); -create index resource_user_id_index on resource (user_id); -create index resource_resource_no_index on resource (resource_no); -create index resource_active_index on resource (active); -create index resource_type_index on resource (type); -create index resource_deleted_at_index on resource (deleted_at); +create unique index udx_resource_resource_no on resource (resource_no); +create index idx_resource_user_id on resource (user_id) where deleted_at is null; +create index idx_resource_created_at on resource (created_at) where deleted_at is null; -- resource表字段注释 comment on table resource is '套餐表'; @@ -753,18 +703,18 @@ comment on column resource.deleted_at is '删除时间'; -- resource_short drop table if exists resource_short cascade; create table resource_short ( - id serial primary key, + id int generated by default as identity primary key, resource_id int not null, type int not null, live int not null, - expire timestamp, + expire timestamptz, quota int, used int not null default 0, daily_limit int not null default 0, daily_used int not null default 0, - daily_last timestamp + daily_last timestamptz ); -create index resource_short_resource_id_index on resource_short (resource_id); +create index idx_resource_short_resource_id on resource_short (resource_id); -- resource_short表字段注释 comment on table resource_short is '短效动态套餐表'; @@ -782,18 +732,18 @@ comment on column resource_short.daily_last is '今日最后使用时间'; -- resource_long drop table if exists resource_long cascade; create table resource_long ( - id serial primary key, + id int generated by default as identity primary key, resource_id int not null, type int not null, live int not null, - expire timestamp, + expire timestamptz, quota int, used int not null default 0, daily_limit int not null default 0, daily_used int not null default 0, - daily_last timestamp + daily_last timestamptz ); -create index resource_long_resource_id_index on resource_long (resource_id); +create index idx_resource_long_resource_id on resource_long (resource_id); -- resource_long表字段注释 comment on table resource_long is '长效动态套餐表'; @@ -817,13 +767,13 @@ comment on column resource_long.daily_last is '今日最后使用时间'; -- trade drop table if exists trade cascade; create table trade ( - id serial primary key, + id int generated by default as identity primary key, user_id int not null, - inner_no varchar(255) not null unique, - outer_no varchar(255), + inner_no text not null, + outer_no text, type int not null, - subject varchar(255) not null, - remark varchar(255), + subject text not null, + remark text, amount decimal(12, 2) not null default 0, payment decimal(12, 2) not null default 0, method int not null, @@ -832,17 +782,16 @@ create table trade ( status int not null default 0, refunded bool not null default false, payment_url text, - completed_at timestamp, - canceled_at timestamp, - created_at timestamp default current_timestamp, - updated_at timestamp default current_timestamp, - deleted_at timestamp + completed_at timestamptz, + canceled_at timestamptz, + created_at timestamptz default current_timestamp, + updated_at timestamptz default current_timestamp, + deleted_at timestamptz ); -create index trade_user_id_index on trade (user_id); -create index trade_outer_no_index on trade (outer_no); -create index trade_type_index on trade (type); -create index trade_status_index on trade (status); -create index trade_deleted_at_index on trade (deleted_at); +create unique index udx_trade_inner_no on trade (inner_no); +create index idx_trade_outer_no on trade (outer_no) where deleted_at is null; +create index idx_trade_user_id on trade (user_id) where deleted_at is null; +create index idx_trade_created_at on trade (created_at) where deleted_at is null; -- trade表字段注释 comment on table trade is '订单表'; @@ -869,19 +818,19 @@ comment on column trade.deleted_at is '删除时间'; -- refund drop table if exists refund cascade; create table refund ( - id serial primary key, + id int generated by default as identity primary key, trade_id int not null, product_id int, amount decimal(12, 2) not null default 0, - reason varchar(255), + reason text, status int not null default 0, - created_at timestamp default current_timestamp, - updated_at timestamp default current_timestamp, - deleted_at timestamp + created_at timestamptz default current_timestamp, + updated_at timestamptz default current_timestamp, + deleted_at timestamptz ); -create index refund_trade_id_index on refund (trade_id); -create index refund_product_id_index on refund (product_id); -create index refund_deleted_at_index on refund (deleted_at); +create index idx_refund_trade_id on refund (trade_id) where deleted_at is null; +create index idx_refund_product_id on refund (product_id) where deleted_at is null; +create index idx_refund_created_at on refund (created_at) where deleted_at is null; -- refund表字段注释 comment on table refund is '退款记录表'; @@ -898,26 +847,25 @@ comment on column refund.deleted_at is '删除时间'; -- bill drop table if exists bill cascade; create table bill ( - id serial primary key, + id int generated by default as identity primary key, user_id int not null, trade_id int, resource_id int, refund_id int, - bill_no varchar(255) not null unique, - info varchar(255), + bill_no text not null, + info text, type int not null, amount decimal(12, 2) not null default 0, - created_at timestamp default current_timestamp, - updated_at timestamp default current_timestamp, - deleted_at timestamp + created_at timestamptz default current_timestamp, + updated_at timestamptz default current_timestamp, + deleted_at timestamptz ); -create index bill_user_id_index on bill (user_id); -create index bill_trade_id_index on bill (trade_id); -create index bill_resource_id_index on bill (resource_id); -create index bill_refund_id_index on bill (refund_id); -create index bill_bill_no_index on bill (bill_no); -create index bill_type_index on bill (type); -create index bill_deleted_at_index on bill (deleted_at); +create unique index udx_bill_bill_no on bill (bill_no); +create index idx_bill_user_id on bill (user_id) where deleted_at is null; +create index idx_bill_trade_id on bill (trade_id) where deleted_at is null; +create index idx_bill_resource_id on bill (resource_id) where deleted_at is null; +create index idx_bill_refund_id on bill (refund_id) where deleted_at is null; +create index idx_bill_created_at on bill (created_at) where deleted_at is null; -- bill表字段注释 comment on table bill is '账单表'; @@ -937,22 +885,21 @@ comment on column bill.deleted_at is '删除时间'; -- coupon 优惠券 drop table if exists coupon cascade; create table coupon ( - id serial primary key, + id int generated by default as identity primary key, user_id int, - code varchar(255) not null unique, - remark varchar(255), + code text not null, + remark text, amount decimal(12, 2) not null default 0, min_amount decimal(12, 2) not null default 0, status int not null default 0, - expire_at timestamp, - created_at timestamp default current_timestamp, - updated_at timestamp default current_timestamp, - deleted_at timestamp + expire_at timestamptz, + created_at timestamptz default current_timestamp, + updated_at timestamptz default current_timestamp, + deleted_at timestamptz ); -create index coupon_user_id_index on coupon (user_id); -create index coupon_code_index on coupon (code); -create index coupon_status_index on coupon (status); -create index coupon_deleted_at_index on coupon (deleted_at); +create index idx_coupon_user_id on coupon (user_id) where deleted_at is null; +create index idx_coupon_code on coupon (code) where deleted_at is null; +create index idx_coupon_created_at on coupon (created_at) where deleted_at is null; -- coupon表字段注释 comment on table coupon is '优惠券表'; @@ -988,39 +935,35 @@ alter table session alter table permission add constraint fk_permission_parent_id foreign key (parent_id) references permission (id) on delete set null; --- user_role_link表外键 -alter table user_role_link - add constraint fk_user_role_link_user_id foreign key (user_id) references "user" (id) on delete cascade; -alter table user_role_link - add constraint fk_user_role_link_role_id foreign key (role_id) references user_role (id) on delete cascade; +-- link_user_role表外键 +alter table link_user_role + add constraint fk_link_user_role_user_id foreign key (user_id) references "user" (id) on delete cascade; +alter table link_user_role + add constraint fk_link_user_role_role_id foreign key (role_id) references user_role (id) on delete cascade; --- admin_role_link表外键 -alter table admin_role_link - add constraint fk_admin_role_link_admin_id foreign key (admin_id) references admin (id) on delete cascade; -alter table admin_role_link - add constraint fk_admin_role_link_role_id foreign key (role_id) references admin_role (id) on delete cascade; +-- link_admin_role表外键 +alter table link_admin_role + add constraint fk_link_admin_role_admin_id foreign key (admin_id) references admin (id) on delete cascade; +alter table link_admin_role + add constraint fk_link_admin_role_role_id foreign key (role_id) references admin_role (id) on delete cascade; --- user_role_permission_link表外键 -alter table user_role_permission_link - add constraint fk_user_role_permission_link_role_id foreign key (role_id) references user_role (id) on delete cascade; -alter table user_role_permission_link - add constraint fk_user_role_permission_link_permission_id foreign key (permission_id) references permission (id) on delete cascade; +-- link_user_role_permission表外键 +alter table link_user_role_permission + add constraint fk_link_user_role_permission_role_id foreign key (role_id) references user_role (id) on delete cascade; +alter table link_user_role_permission + add constraint fk_link_user_role_permission_permission_id foreign key (permission_id) references permission (id) on delete cascade; --- admin_role_permission_link表外键 -alter table admin_role_permission_link - add constraint fk_admin_role_permission_link_role_id foreign key (role_id) references admin_role (id) on delete cascade; -alter table admin_role_permission_link - add constraint fk_admin_role_permission_link_permission_id foreign key (permission_id) references permission (id) on delete cascade; +-- link_admin_role_permission表外键 +alter table link_admin_role_permission + add constraint fk_link_admin_role_permission_role_id foreign key (role_id) references admin_role (id) on delete cascade; +alter table link_admin_role_permission + add constraint fk_link_admin_role_permission_permission_id foreign key (permission_id) references permission (id) on delete cascade; --- client_permission_link表外键 -alter table client_permission_link - add constraint fk_client_permission_link_client_id foreign key (client_id) references client (id) on delete cascade; -alter table client_permission_link - add constraint fk_client_permission_link_permission_id foreign key (permission_id) references permission (id) on delete cascade; - --- edge表外键 -alter table edge - add constraint fk_edge_proxy_id foreign key (proxy_id) references proxy (id) on delete cascade; +-- link_client_permission表外键 +alter table link_client_permission + add constraint fk_link_client_permission_client_id foreign key (client_id) references client (id) on delete cascade; +alter table link_client_permission + add constraint fk_link_client_permission_permission_id foreign key (permission_id) references permission (id) on delete cascade; -- whitelist表外键 alter table whitelist @@ -1081,6 +1024,8 @@ alter table coupon insert into client ( client_id, client_secret, redirect_uri, spec, name, type ) -values ('web', '$2a$10$Ss12mXQgpYyo1CKIZ3URouDm.Lc2KcYJzsvEK2PTIXlv6fHQht45a', '', 3, 'web', 1) +values ( + 'web', '$2a$10$Ss12mXQgpYyo1CKIZ3URouDm.Lc2KcYJzsvEK2PTIXlv6fHQht45a', '', 3, 'web', 1 +); -- endregion diff --git a/web/auth/authenticate.go b/web/auth/authenticate.go index 8095c1a..0aa3ef5 100644 --- a/web/auth/authenticate.go +++ b/web/auth/authenticate.go @@ -7,7 +7,6 @@ import ( "fmt" "log/slog" "platform/web/core" - client2 "platform/web/domains/client" m "platform/web/models" q "platform/web/queries" s "platform/web/services" @@ -86,8 +85,8 @@ func authBearer(_ context.Context, token string) (*AuthCtx, error) { } scopes := []string{} - if session.Scopes_ != nil { - scopes = strings.Split(*session.Scopes_, " ") + if session.Scopes != nil { + scopes = strings.Split(*session.Scopes, " ") } return &AuthCtx{ User: session.User, @@ -138,8 +137,7 @@ func authClient(clientId, clientSecret string) (*m.Client, error) { } // 检查客户端密钥 - spec := client2.Spec(client.Spec) - if spec == client2.SpecWeb || spec == client2.SpecApi { + if client.Spec == m.ClientSpecWeb || client.Spec == m.ClientSpecAPI { if bcrypt.CompareHashAndPassword([]byte(client.ClientSecret), []byte(clientSecret)) != nil { return nil, errors.New("客户端密钥错误") } diff --git a/web/auth/authorize.go b/web/auth/authorize.go index 1e7ffb9..8358287 100644 --- a/web/auth/authorize.go +++ b/web/auth/authorize.go @@ -10,7 +10,6 @@ import ( "platform/pkg/env" "platform/pkg/u" "platform/web/core" - user2 "platform/web/domains/user" g "platform/web/globals" "platform/web/globals/orm" m "platform/web/models" @@ -162,7 +161,7 @@ func Token(c *fiber.Ctx) error { AccessToken: session.AccessToken, RefreshToken: u.Z(session.RefreshToken), ExpiresIn: int(time.Time(session.AccessTokenExpires).Sub(now).Seconds()), - Scope: u.Z(session.Scopes_), + Scope: u.Z(session.Scopes), }) } @@ -202,7 +201,7 @@ func authAuthorizationCode(ctx *fiber.Ctx, auth *AuthCtx, req *TokenReq, now tim user, err := q.User.Where( q.User.ID.Eq(codeCtx.UserID), - q.User.Status.Eq(int32(user2.StatusEnabled)), + q.User.Status.Eq(int(m.UserStatusEnabled)), ).First() if err != nil { return nil, err @@ -211,18 +210,20 @@ func authAuthorizationCode(ctx *fiber.Ctx, auth *AuthCtx, req *TokenReq, now tim // todo 检查 scope // 生成会话 + ip, _ := orm.ParseInet(ctx.Get(core.HeaderUserIP)) + ua := ctx.Get(core.HeaderUserUA) session := &m.Session{ - IP: u.X(ctx.IP()), - UA: u.X(ctx.Get(fiber.HeaderUserAgent)), + IP: ip, + UA: u.X(ua), UserID: &user.ID, ClientID: &auth.Client.ID, - Scopes_: u.P(strings.Join(codeCtx.Scopes, " ")), + Scopes: u.P(strings.Join(codeCtx.Scopes, " ")), AccessToken: uuid.NewString(), - AccessTokenExpires: orm.LocalDateTime(now.Add(time.Duration(env.SessionAccessExpire) * time.Second)), + AccessTokenExpires: now.Add(time.Duration(env.SessionAccessExpire) * time.Second), } if codeCtx.Remember { session.RefreshToken = u.P(uuid.NewString()) - session.RefreshTokenExpires = u.P(orm.LocalDateTime(now.Add(time.Duration(env.SessionRefreshExpire) * time.Second))) + session.RefreshTokenExpires = u.P(now.Add(time.Duration(env.SessionRefreshExpire) * time.Second)) } err = SaveSession(session) @@ -237,12 +238,14 @@ func authClientCredential(ctx *fiber.Ctx, auth *AuthCtx, _ *TokenReq, now time.T // todo 检查 scope // 生成会话 + ip, _ := orm.ParseInet(ctx.Get(core.HeaderUserIP)) + ua := ctx.Get(core.HeaderUserUA) session := &m.Session{ - IP: u.X(ctx.IP()), - UA: u.X(ctx.Get(fiber.HeaderUserAgent)), + IP: ip, + UA: u.X(ua), ClientID: &auth.Client.ID, AccessToken: uuid.NewString(), - AccessTokenExpires: orm.LocalDateTime(now.Add(time.Duration(env.SessionAccessExpire) * time.Second)), + AccessTokenExpires: now.Add(time.Duration(env.SessionAccessExpire) * time.Second), } // 保存会话 @@ -255,6 +258,9 @@ func authClientCredential(ctx *fiber.Ctx, auth *AuthCtx, _ *TokenReq, now time.T } func authPassword(ctx *fiber.Ctx, auth *AuthCtx, req *TokenReq, now time.Time) (*m.Session, error) { + ip, _ := orm.ParseInet(ctx.Get(core.HeaderUserIP)) + ua := ctx.Get(core.HeaderUserUA) + var user *m.User err := q.Q.Transaction(func(tx *q.Query) (err error) { switch req.LoginType { @@ -267,7 +273,7 @@ func authPassword(ctx *fiber.Ctx, auth *AuthCtx, req *TokenReq, now time.Time) ( user = &m.User{ Phone: req.Username, Username: u.P(req.Username), - Status: int32(user2.StatusEnabled), + Status: m.UserStatusEnabled, } } case GrantPasswordEmail: @@ -285,15 +291,15 @@ func authPassword(ctx *fiber.Ctx, auth *AuthCtx, req *TokenReq, now time.Time) ( } // 账户状态 - if user2.Status(user.Status) == user2.StatusDisabled { + if user.Status == m.UserStatusDisabled { slog.Debug("账户状态异常", "username", req.Username, "status", user.Status) return core.NewBizErr("账号无法登录") } // 更新用户的登录时间 - user.LastLogin = u.P(orm.LocalDateTime(time.Now())) - user.LastLoginHost = u.X(ctx.IP()) - user.LastLoginAgent = u.X(ctx.Get(fiber.HeaderUserAgent)) + user.LastLogin = u.P(time.Now()) + user.LastLoginIP = ip + user.LastLoginUA = u.X(ua) if err := tx.User.Save(user); err != nil { return err } @@ -306,17 +312,17 @@ func authPassword(ctx *fiber.Ctx, auth *AuthCtx, req *TokenReq, now time.Time) ( // 生成会话 session := &m.Session{ - IP: u.X(ctx.IP()), - UA: u.X(ctx.Get(fiber.HeaderUserAgent)), + IP: ip, + UA: u.X(ua), UserID: &user.ID, ClientID: &auth.Client.ID, - Scopes_: u.X(req.Scope), + Scopes: u.X(req.Scope), AccessToken: uuid.NewString(), - AccessTokenExpires: orm.LocalDateTime(now.Add(time.Duration(env.SessionAccessExpire) * time.Second)), + AccessTokenExpires: now.Add(time.Duration(env.SessionAccessExpire) * time.Second), } if req.Remember { session.RefreshToken = u.P(uuid.NewString()) - session.RefreshTokenExpires = u.P(orm.LocalDateTime(now.Add(time.Duration(env.SessionRefreshExpire) * time.Second))) + session.RefreshTokenExpires = u.P(now.Add(time.Duration(env.SessionRefreshExpire) * time.Second)) } err = SaveSession(session) @@ -340,10 +346,10 @@ func authRefreshToken(_ *fiber.Ctx, _ *AuthCtx, req *TokenReq, now time.Time) (* // 生成令牌 session.AccessToken = uuid.NewString() - session.AccessTokenExpires = orm.LocalDateTime(now.Add(time.Duration(env.SessionAccessExpire) * time.Second)) + session.AccessTokenExpires = now.Add(time.Duration(env.SessionAccessExpire) * time.Second) if session.RefreshToken != nil { session.RefreshToken = u.P(uuid.NewString()) - session.RefreshTokenExpires = u.P(orm.LocalDateTime(now.Add(time.Duration(env.SessionRefreshExpire) * time.Second))) + session.RefreshTokenExpires = u.P(now.Add(time.Duration(env.SessionRefreshExpire) * time.Second)) } // 保存令牌 diff --git a/web/auth/check.go b/web/auth/check.go index 269242b..4b292dd 100644 --- a/web/auth/check.go +++ b/web/auth/check.go @@ -1,7 +1,6 @@ package auth import ( - "platform/web/domains/client" m "platform/web/models" "github.com/gofiber/fiber/v2" @@ -40,8 +39,7 @@ func (a *AuthCtx) PermitSecretClient(scopes ...string) (*AuthCtx, error) { if a.Client == nil { return a, ErrAuthenticateForbidden } - spec := client.Spec(a.Client.Spec) - if spec != client.SpecApi && spec != client.SpecWeb { + if a.Client.Spec != m.ClientSpecAPI && a.Client.Spec != m.ClientSpecWeb { return a, ErrAuthenticateForbidden } if !a.checkScopes(scopes...) { @@ -50,16 +48,14 @@ func (a *AuthCtx) PermitSecretClient(scopes ...string) (*AuthCtx, error) { return a, nil } -func (a *AuthCtx) PermitInternalClient(scopes ...string) (*AuthCtx, error) { +func (a *AuthCtx) PermitOfficialClient(scopes ...string) (*AuthCtx, error) { if a.Client == nil { return a, ErrAuthenticateForbidden } - spec := client.Spec(a.Client.Spec) - if spec != client.SpecApi && spec != client.SpecWeb { + if a.Client.Spec != m.ClientSpecAPI && a.Client.Spec != m.ClientSpecWeb { return a, ErrAuthenticateForbidden } - cType := client.Type(a.Client.Type) - if cType != client.TypeInternal { + if a.Client.Type != m.ClientTypeOfficial { return a, ErrAuthenticateForbidden } if !a.checkScopes(scopes...) { diff --git a/web/auth/session.go b/web/auth/session.go index 1070a03..b4aad68 100644 --- a/web/auth/session.go +++ b/web/auth/session.go @@ -4,7 +4,6 @@ import ( "context" "fmt" g "platform/web/globals" - "platform/web/globals/orm" m "platform/web/models" q "platform/web/queries" "time" @@ -17,7 +16,7 @@ func FindSession(accessToken string, now time.Time) (*m.Session, error) { Preload(field.Associations). Where( q.Session.AccessToken.Eq(accessToken), - q.Session.AccessTokenExpires.Gt(orm.LocalDateTime(now)), + q.Session.AccessTokenExpires.Gt(now), ).First() } @@ -26,7 +25,7 @@ func FindSessionByRefresh(refreshToken string, now time.Time) (*m.Session, error Preload(field.Associations). Where( q.Session.RefreshToken.Eq(refreshToken), - q.Session.RefreshTokenExpires.Gt(orm.LocalDateTime(now)), + q.Session.RefreshTokenExpires.Gt(now), ).First() } diff --git a/web/core/types.go b/web/core/error.go similarity index 61% rename from web/core/types.go rename to web/core/error.go index 33102ae..5297405 100644 --- a/web/core/types.go +++ b/web/core/error.go @@ -6,49 +6,6 @@ import ( "runtime" ) -// region page - -type PageReq struct { - RawPage int `json:"page"` - RawSize int `json:"size"` -} - -func (p *PageReq) GetPage() int { - if p.RawPage < 1 { - return 1 - } - return p.RawPage -} - -func (p *PageReq) GetSize() int { - if p.RawSize < 1 { - return 10 - } - if p.RawSize > 100 { - return 100 - } - return p.RawSize -} - -func (p *PageReq) GetOffset() int { - return (p.GetPage() - 1) * p.GetSize() -} - -func (p *PageReq) GetLimit() int { - return p.GetSize() -} - -type PageResp struct { - Total int `json:"total"` - Page int `json:"page"` - Size int `json:"size"` - List any `json:"list"` -} - -// endregion - -// region error - type Err struct { msg string err error @@ -109,5 +66,3 @@ type ServErr struct{ Err } func NewServErr(msg string, err ...error) *ServErr { return &ServErr{newErr(msg, err...)} } - -// endregion diff --git a/web/core/http.go b/web/core/http.go new file mode 100644 index 0000000..a44b5ea --- /dev/null +++ b/web/core/http.go @@ -0,0 +1,43 @@ +package core + +const HeaderUserIP = "X-Data-IP" +const HeaderUserUA = "X-Data-UA" + +// PageReq 分页请求参数 +type PageReq struct { + RawPage int `json:"page"` + RawSize int `json:"size"` +} + +func (p *PageReq) GetPage() int { + if p.RawPage < 1 { + return 1 + } + return p.RawPage +} + +func (p *PageReq) GetSize() int { + if p.RawSize < 1 { + return 10 + } + if p.RawSize > 100 { + return 100 + } + return p.RawSize +} + +func (p *PageReq) GetOffset() int { + return (p.GetPage() - 1) * p.GetSize() +} + +func (p *PageReq) GetLimit() int { + return p.GetSize() +} + +// PageResp 分页响应参数 +type PageResp struct { + Total int `json:"total"` + Page int `json:"page"` + Size int `json:"size"` + List any `json:"list"` +} diff --git a/web/core/model.go b/web/core/model.go new file mode 100644 index 0000000..646501a --- /dev/null +++ b/web/core/model.go @@ -0,0 +1,29 @@ +package core + +import ( + "platform/pkg/u" + "time" + + "gorm.io/gorm" +) + +type IModel interface { + GetID() int32 +} + +type Model struct { + ID int32 `json:"id" gorm:"column:id;primaryKey"` + CreatedAt time.Time `json:"created_at" gorm:"column:created_at"` + UpdatedAt time.Time `json:"updated_at" gorm:"column:updated_at"` + DeletedAt gorm.DeletedAt `json:"deleted_at" gorm:"column:deleted_at"` +} + +func (m *Model) GetID() int32 { + return m.ID +} + +func GetIDs[T IModel](models []T) []int32 { + return u.Map(models, func(m T) int32 { + return m.GetID() + }) +} diff --git a/web/domains/announcement/types.go b/web/domains/announcement/types.go deleted file mode 100644 index 2f6c397..0000000 --- a/web/domains/announcement/types.go +++ /dev/null @@ -1,7 +0,0 @@ -package announcement - -type Type int32 - -const ( - TypeNormal Type = iota + 1 // 普通公告 -) diff --git a/web/domains/bill/bill.go b/web/domains/bill/bill.go deleted file mode 100644 index 45696af..0000000 --- a/web/domains/bill/bill.go +++ /dev/null @@ -1,34 +0,0 @@ -package bill - -import ( - "github.com/shopspring/decimal" - m "platform/web/models" -) - -func NewForRecharge(uid int32, billNo string, info string, amount decimal.Decimal, trade *m.Trade) *m.Bill { - return &m.Bill{ - UserID: uid, - BillNo: billNo, - TradeID: &trade.ID, - Type: int32(TypeRecharge), - Info: &info, - Amount: amount, - } -} - -func NewForConsume(uid int32, billNo string, info string, amount decimal.Decimal, resource *m.Resource, trade ...*m.Trade) *m.Bill { - var bill = &m.Bill{ - UserID: uid, - BillNo: billNo, - ResourceID: &resource.ID, - Type: int32(TypeConsume), - Info: &info, - Amount: amount, - } - - if len(trade) > 0 { - bill.TradeID = &trade[0].ID - } - - return bill -} diff --git a/web/domains/bill/types.go b/web/domains/bill/types.go deleted file mode 100644 index 9a57a46..0000000 --- a/web/domains/bill/types.go +++ /dev/null @@ -1,9 +0,0 @@ -package bill - -type Type int32 - -const ( - TypeConsume Type = iota + 1 // 消费 - TypeRefund // 退款 - TypeRecharge // 充值 -) diff --git a/web/domains/channel/types.go b/web/domains/channel/types.go deleted file mode 100644 index 34cf97e..0000000 --- a/web/domains/channel/types.go +++ /dev/null @@ -1,9 +0,0 @@ -package channel - -type Protocol int32 - -const ( - ProtocolHttp Protocol = iota + 1 - ProtocolHttps - ProtocolSocks5 -) diff --git a/web/domains/client/types.go b/web/domains/client/types.go deleted file mode 100644 index b8659cf..0000000 --- a/web/domains/client/types.go +++ /dev/null @@ -1,17 +0,0 @@ -package client - -type Spec int32 - -const ( - SpecNative Spec = iota + 1 // 原生客户端 - SpecBrowser // 浏览器客户端 - SpecWeb // Web 服务 - SpecApi // Api 服务 -) - -type Type int32 - -const ( - TypeNormal Type = iota // 普通客户端 - TypeInternal // 内部客户端 -) diff --git a/web/domains/coupon/types.go b/web/domains/coupon/types.go deleted file mode 100644 index 1731622..0000000 --- a/web/domains/coupon/types.go +++ /dev/null @@ -1,9 +0,0 @@ -package coupon - -type Status int32 - -const ( - StatusUnused = iota // 未使用 - StatusUsed // 已使用 - StatusExpired // 已过期 -) diff --git a/web/domains/edge/types.go b/web/domains/edge/types.go deleted file mode 100644 index 0d630e9..0000000 --- a/web/domains/edge/types.go +++ /dev/null @@ -1,43 +0,0 @@ -package edge - -import "strings" - -type ISP int32 - -const ( - IspUnknown ISP = iota // 未知 - IspChinaTelecom // 中国电信 - IspChinaUnicom // 中国联通 - IspChinaMobile // 中国移动 -) - -func ISPFromStr(str string) ISP { - switch { - case strings.Contains(str, "电信"): - return IspChinaTelecom - case strings.Contains(str, "联通"): - return IspChinaUnicom - case strings.Contains(str, "移动"): - return IspChinaMobile - } - return IspUnknown -} - -func (isp ISP) String() string { - switch isp { - case IspChinaTelecom: - return "电信" - case IspChinaUnicom: - return "联通" - case IspChinaMobile: - return "移动" - default: - return "未知" - } -} - -type Type int32 - -const ( - TypeSelfHosted Type = iota + 1 // 自建节点 -) diff --git a/web/domains/proxy/types.go b/web/domains/proxy/types.go deleted file mode 100644 index 750702d..0000000 --- a/web/domains/proxy/types.go +++ /dev/null @@ -1,8 +0,0 @@ -package proxy - -type Type int32 - -const ( - TypeThirdParty Type = iota + 1 // 三方代理 - TypeSelfHosted // 自建代理 -) diff --git a/web/domains/refund/types.go b/web/domains/refund/types.go deleted file mode 100644 index bfd7435..0000000 --- a/web/domains/refund/types.go +++ /dev/null @@ -1,9 +0,0 @@ -package refund - -type Status int32 - -const ( - StatusHandling Status = iota + 1 // 待处理 - StatusSuccess // 已退款 - StatusRefused // 已拒绝 -) diff --git a/web/domains/resource/types.go b/web/domains/resource/types.go deleted file mode 100644 index 46b586d..0000000 --- a/web/domains/resource/types.go +++ /dev/null @@ -1,15 +0,0 @@ -package resource - -type Type int32 - -const ( - TypeShort Type = iota + 1 // 短效动态 - TypeLong // 长效动态 -) - -type Mode int32 - -const ( - ModeTime Mode = iota + 1 // 包时 - ModeCount // 包量 -) diff --git a/web/domains/trade/types.go b/web/domains/trade/types.go deleted file mode 100644 index 4863775..0000000 --- a/web/domains/trade/types.go +++ /dev/null @@ -1,60 +0,0 @@ -package trade - -import ( - m "platform/web/models" - - "github.com/shopspring/decimal" -) - -type Type int32 - -const ( - TypePurchase Type = iota + 1 // 购买 - TypeRecharge // 充值 -) - -type Method int32 - -const ( - MethodAlipay Method = iota + 1 // 支付宝 - MethodWeChat // 微信 - MethodSft // 商福通 - MethodSftAlipay // 商福通渠道指定支付宝 - MethodSftWeChat // 商福通渠道指定微信 -) - -type Platform int32 - -const ( - PlatformDesktop Platform = iota + 1 // 桌面网站 - PlatformMobile // 手机网站 -) - -type Acquirer int32 - -const ( - AcquirerAlipay Acquirer = iota + 1 // 支付宝 - AcquirerWeChat // 微信 - AcquirerUnionPay // 银联 -) - -type Status int32 - -const ( - StatusPending Status = iota // 待支付 - StatusSuccess // 已支付 - StatusCanceled // 已取消 -) - -type ProductInfo interface { - GetType() Type - GetSubject() string - GetAmount() decimal.Decimal - Serialize() (string, error) - Deserialize(str string) error -} - -type CompleteEvent interface { - Check(t Type) (ProductInfo, bool) - OnTradeComplete(info ProductInfo, trade *m.Trade) error -} diff --git a/web/domains/user/types.go b/web/domains/user/types.go deleted file mode 100644 index 0207fa8..0000000 --- a/web/domains/user/types.go +++ /dev/null @@ -1,16 +0,0 @@ -package user - -type IdType int32 - -const ( - IdTypeNone IdType = iota // 未认证 - IdTypePersonal // 个人认证 - IdTypeEnterprise // 企业认证 -) - -type Status int32 - -const ( - StatusDisabled Status = iota // 禁用 - StatusEnabled // 启用 -) diff --git a/web/events/channel.go b/web/events/channel.go index 2de386b..59d734a 100644 --- a/web/events/channel.go +++ b/web/events/channel.go @@ -2,14 +2,20 @@ package events import ( "encoding/json" - "github.com/hibiken/asynq" "log/slog" + + "github.com/hibiken/asynq" ) const RemoveChannel = "channel:remove" -func NewRemoveChannel(ids []int32) *asynq.Task { - bytes, err := json.Marshal(ids) +type RemoveChannelData struct { + Batch string `json:"batch"` + IDs []int32 `json:"ids"` +} + +func NewRemoveChannel(data RemoveChannelData) *asynq.Task { + bytes, err := json.Marshal(data) if err != nil { slog.Error("序列化删除通道任务失败", "error", err) return nil diff --git a/web/events/proxy.go b/web/events/proxy.go new file mode 100644 index 0000000..84837c6 --- /dev/null +++ b/web/events/proxy.go @@ -0,0 +1,9 @@ +package events + +import "github.com/hibiken/asynq" + +const FlushGateway = "gateway:flush" + +func NewFlushGateway() *asynq.Task { + return asynq.NewTask(FlushGateway, nil) +} diff --git a/web/events/trade.go b/web/events/trade.go index c5c94d0..3351f07 100644 --- a/web/events/trade.go +++ b/web/events/trade.go @@ -3,7 +3,8 @@ package events import ( "encoding/json" "log/slog" - trade2 "platform/web/domains/trade" + + m "platform/web/models" "github.com/hibiken/asynq" ) @@ -12,7 +13,7 @@ const CancelTrade = "trade:update" type CancelTradeData struct { TradeNo string `json:"trade_no" validate:"required"` - Method trade2.Method `json:"method" validate:"required"` + Method m.TradeMethod `json:"method" validate:"required"` } func NewCancelTrade(data CancelTradeData) *asynq.Task { diff --git a/web/globals/orm/inet.go b/web/globals/orm/inet.go new file mode 100644 index 0000000..8bba19b --- /dev/null +++ b/web/globals/orm/inet.go @@ -0,0 +1,32 @@ +package orm + +import ( + "database/sql/driver" + "fmt" + "net/netip" +) + +type Inet struct { + netip.Addr +} + +func (inet Inet) Value() (driver.Value, error) { + return inet.MarshalBinary() +} + +func (inet *Inet) Scan(value any) (err error) { + switch value := value.(type) { + case []byte: + return inet.UnmarshalBinary(value) + default: + return fmt.Errorf("不支持的类型: %T", value) + } +} + +func ParseInet(ip string) (*Inet, error) { + addr, err := netip.ParseAddr(ip) + if err != nil { + return nil, err + } + return &Inet{addr}, nil +} diff --git a/web/globals/orm/localdatetime.go b/web/globals/orm/localdatetime.go index 17bbd69..bec4cad 100644 --- a/web/globals/orm/localdatetime.go +++ b/web/globals/orm/localdatetime.go @@ -20,8 +20,7 @@ var formats = []string{ "2006-01-02", } -//goland:noinspection GoMixedReceiverTypes -func (ldt *LocalDateTime) Scan(value interface{}) (err error) { +func (ldt *LocalDateTime) Scan(value any) (err error) { var t time.Time if strValue, ok := value.(string); ok { var timeValue time.Time @@ -50,35 +49,26 @@ func (ldt *LocalDateTime) Scan(value interface{}) (err error) { return } -//goland:noinspection GoMixedReceiverTypes func (ldt LocalDateTime) Value() (driver.Value, error) { return time.Time(ldt).Local(), nil } -// GormDataType gorm common data type -// -//goland:noinspection GoMixedReceiverTy -//goland:noinspection GoMixedReceiverTypes func (ldt LocalDateTime) GormDataType() string { return "ldt" } -//goland:noinspection GoMixedReceiverTypes func (ldt LocalDateTime) GobEncode() ([]byte, error) { return time.Time(ldt).GobEncode() } -//goland:noinspection GoMixedReceiverTypes func (ldt *LocalDateTime) GobDecode(b []byte) error { return (*time.Time)(ldt).GobDecode(b) } -//goland:noinspection GoMixedReceiverTypes func (ldt LocalDateTime) MarshalJSON() ([]byte, error) { return time.Time(ldt).MarshalJSON() } -//goland:noinspection GoMixedReceiverTypes func (ldt *LocalDateTime) UnmarshalJSON(b []byte) error { return (*time.Time)(ldt).UnmarshalJSON(b) } diff --git a/web/globals/orm/slice.go b/web/globals/orm/slice.go new file mode 100644 index 0000000..5f97ae1 --- /dev/null +++ b/web/globals/orm/slice.go @@ -0,0 +1,24 @@ +package orm + +import ( + "database/sql/driver" + "encoding/json" + "fmt" +) + +type Slice[T any] struct { + Arr []T +} + +func (s Slice[T]) Value() (driver.Value, error) { + return json.Marshal(s) +} + +func (s *Slice[T]) Scan(value any) error { + switch value := value.(type) { + case []byte: + return json.Unmarshal(value, s) + default: + return fmt.Errorf("不支持的类型: %T", value) + } +} diff --git a/web/handlers/bill.go b/web/handlers/bill.go index 016f9c5..50d75fb 100644 --- a/web/handlers/bill.go +++ b/web/handlers/bill.go @@ -3,7 +3,6 @@ package handlers import ( "platform/web/auth" "platform/web/core" - "platform/web/globals/orm" q "platform/web/queries" "time" @@ -39,13 +38,13 @@ func ListBill(c *fiber.Ctx) error { Where(q.Bill.UserID.Eq(authCtx.User.ID)) if req.Type != nil { - do.Where(q.Bill.Type.Eq(int32(*req.Type))) + do.Where(q.Bill.Type.Eq(int(*req.Type))) } if req.CreateAfter != nil { - do.Where(q.Bill.CreatedAt.Gte(orm.LocalDateTime(*req.CreateAfter))) + do.Where(q.Bill.CreatedAt.Gte(*req.CreateAfter)) } if req.CreateBefore != nil { - do.Where(q.Bill.CreatedAt.Lte(orm.LocalDateTime(*req.CreateBefore))) + do.Where(q.Bill.CreatedAt.Lte(*req.CreateBefore)) } if req.BillNo != nil && *req.BillNo != "" { do.Where(q.Bill.BillNo.Eq(*req.BillNo)) diff --git a/web/handlers/channel.go b/web/handlers/channel.go index 32d7000..b24c642 100644 --- a/web/handlers/channel.go +++ b/web/handlers/channel.go @@ -1,11 +1,11 @@ package handlers import ( - "fmt" + "net/netip" + "platform/pkg/u" "platform/web/auth" "platform/web/core" - channel2 "platform/web/domains/channel" - "platform/web/globals/orm" + m "platform/web/models" q "platform/web/queries" s "platform/web/services" "time" @@ -40,18 +40,18 @@ func ListChannels(c *fiber.Ctx) error { Where(q.Channel.UserID.Eq(authContext.User.ID)) switch req.AuthType { case s.ChannelAuthTypeIp: - cond.Where(q.Channel.AuthIP.Is(true)) + cond.Where(q.Channel.Whitelists.IsNotNull()) case s.ChannelAuthTypePass: - cond.Where(q.Channel.AuthPass.Is(true)) + cond.Where(q.Channel.Username.IsNotNull(), q.Channel.Password.IsNotNull()) default: break } if req.ExpireAfter != nil { - cond.Where(q.Channel.Expiration.Gte(orm.LocalDateTime(*req.ExpireAfter))) + cond.Where(q.Channel.ExpiredAt.Gte(*req.ExpireAfter)) } if req.ExpireBefore != nil { - cond.Where(q.Channel.Expiration.Lte(orm.LocalDateTime(*req.ExpireBefore))) + cond.Where(q.Channel.ExpiredAt.Lte(*req.ExpireBefore)) } // 查询数据 @@ -92,19 +92,19 @@ func ListChannels(c *fiber.Ctx) error { type CreateChannelReq struct { ResourceId int32 `json:"resource_id" validate:"required"` AuthType s.ChannelAuthType `json:"auth_type" validate:"required"` - Protocol channel2.Protocol `json:"protocol" validate:"required"` + Protocol int `json:"protocol" validate:"required"` Count int `json:"count" validate:"required"` - Prov string `json:"prov"` - City string `json:"city"` - Isp string `json:"isp"` + Prov *string `json:"prov"` + City *string `json:"city"` + Isp *int `json:"isp"` } type CreateChannelRespItem struct { - Proto channel2.Protocol `json:"-"` - Host string `json:"host"` - Port int32 `json:"port"` - Username *string `json:"username,omitempty"` - Password *string `json:"password,omitempty"` + Proto int `json:"-"` + Host string `json:"host"` + Port uint16 `json:"port"` + Username *string `json:"username,omitempty"` + Password *string `json:"password,omitempty"` } func CreateChannel(c *fiber.Ctx) error { @@ -115,48 +115,32 @@ func CreateChannel(c *fiber.Ctx) error { return err } - // 检查用户其他权限 user := authCtx.User if user.IDToken == nil || *user.IDToken == "" { return fiber.NewError(fiber.StatusForbidden, "账号未实名") } - count, err := q.Whitelist.Where( - q.Whitelist.UserID.Eq(user.ID), - q.Whitelist.Host.Eq(c.IP()), - ).Count() - if err != nil { - return err - } - if count == 0 { - return fiber.NewError(fiber.StatusForbidden, fmt.Sprintf("非白名单IP %s", c.IP())) - } - + // 解析参数 req := new(CreateChannelReq) if err := c.BodyParser(req); err != nil { return err } - var isp string - switch req.Isp { - case "1": - isp = "电信" - case "2": - isp = "联通" - case "3": - isp = "移动" + ip, err := netip.ParseAddr(c.Get(core.HeaderUserIP)) + if err != nil { + return core.NewBizErr("解析请求头客户端 IP 地址失败", err) } // 创建通道 - result, err := s.Channel.CreateChannel( - c, + result, err := s.Channel.CreateChannels( + ip, user.ID, req.ResourceId, - req.Protocol, - req.AuthType, + req.AuthType == s.ChannelAuthTypeIp, + req.AuthType == s.ChannelAuthTypePass, req.Count, s.EdgeFilter{ - Isp: isp, + Isp: u.ElseTo(req.Isp, m.ToEdgeISP), Prov: req.Prov, City: req.City, }, @@ -170,8 +154,8 @@ func CreateChannel(c *fiber.Ctx) error { for i, channel := range result { resp[i] = &CreateChannelRespItem{ Proto: req.Protocol, - Host: channel.ProxyHost, - Port: channel.ProxyPort, + Host: channel.Proxy.IP.String(), + Port: channel.Port, } if req.AuthType == s.ChannelAuthTypePass { resp[i].Username = channel.Username @@ -188,12 +172,13 @@ type CreateChannelResultType string // region RemoveChannels type RemoveChannelsReq struct { - ByIds []int32 `json:"by_ids" validate:"required"` + Batch string `json:"batch" validate:"required"` + Ids []int32 `json:"ids" validate:"required"` } func RemoveChannels(c *fiber.Ctx) error { // 检查权限 - authCtx, err := auth.GetAuthCtx(c).PermitUser() + _, err := auth.GetAuthCtx(c).PermitOfficialClient() if err != nil { return err } @@ -205,7 +190,7 @@ func RemoveChannels(c *fiber.Ctx) error { } // 删除通道 - err = s.Channel.RemoveChannels(req.ByIds, authCtx.User.ID) + err = s.Channel.RemoveChannels(req.Batch, req.Ids) if err != nil { return err } diff --git a/web/handlers/edge.go b/web/handlers/edge.go index de19e46..552fab4 100644 --- a/web/handlers/edge.go +++ b/web/handlers/edge.go @@ -1,20 +1,8 @@ package handlers import ( - "errors" - "log/slog" - "platform/pkg/u" - "platform/web/auth" - edge2 "platform/web/domains/edge" - proxy2 "platform/web/domains/proxy" - g "platform/web/globals" - m "platform/web/models" - q "platform/web/queries" s "platform/web/services" - "gorm.io/gen/field" - "gorm.io/gorm" - "github.com/gofiber/fiber/v2" ) @@ -29,80 +17,82 @@ type RegisterEdgeResp struct { } func AssignEdge(c *fiber.Ctx) (err error) { - - // 验证请求参数 - var req = new(RegisterEdgeReq) - err = g.Validator.Validate(c, req) - if err != nil { - return err - } - - // 全局锁,防止并发注册 - var mutex = g.Redsync.NewMutex("edge:discovery") - if err := mutex.Lock(); err != nil { - return errors.New("服务繁忙,请稍后重试") - } - defer func() { - if ok, err := mutex.Unlock(); err != nil { - slog.Error("解锁失败", slog.Bool("ok", ok), slog.Any("err", err)) - } - }() - - // 检查节点 - var fwd *m.Proxy - var edge *m.Edge - edge, err = q.Edge. - Where(q.Edge.Name.Eq(req.Name)). - Take() - if errors.Is(err, gorm.ErrRecordNotFound) { - // 挑选合适的转发服务 - fwd, err = q.Proxy. - LeftJoin(q.Edge, q.Edge.ProxyID.EqCol(q.Proxy.ID), q.Edge.Status.Eq(1)). - Select(q.Proxy.ALL, q.Edge.ALL.Count().As("count")). - Where(q.Proxy.Type.Eq(int32(proxy2.TypeSelfHosted))). - Group(q.Proxy.ID). - Order(field.NewField("", "count").Desc()). - First() - if err != nil { - return err - } - // 保存节点信息 - edge = &m.Edge{ - Name: req.Name, - Version: int32(req.Version), - Type: int32(edge2.TypeSelfHosted), - ProxyID: &fwd.ID, - } - err = q.Edge.Create(edge) - if err != nil { - return err - } - } else if err == nil { - // 获取已配置的转发服务 - fwd, err = q.Proxy. - Where(q.Proxy.ID.Eq(*edge.ProxyID)). - Take() - if err != nil { - return err - } - // 节点已存在,更新版本号 - if edge.Version < int32(req.Version) { - _, err = q.Edge. - Where(q.Edge.ID.Eq(edge.ID)). - UpdateSimple(q.Edge.Version.Value(int32(req.Version))) - if err != nil { - return err - } - } - } else { - return err - } - - // 返回服务地址 - return c.JSON(RegisterEdgeResp{ - Id: edge.ID, - Host: fwd.Host, + return c.JSON(map[string]any{ + "error": "接口暂不可用", }) + // // 验证请求参数 + // var req = new(RegisterEdgeReq) + // err = g.Validator.Validate(c, req) + // if err != nil { + // return err + // } + + // // 全局锁,防止并发注册 + // var mutex = g.Redsync.NewMutex("edge:discovery") + // if err := mutex.Lock(); err != nil { + // return errors.New("服务繁忙,请稍后重试") + // } + // defer func() { + // if ok, err := mutex.Unlock(); err != nil { + // slog.Error("解锁失败", slog.Bool("ok", ok), slog.Any("err", err)) + // } + // }() + + // // 检查节点 + // var fwd *m.Proxy + // var edge *m.Edge + // edge, err = q.Edge. + // Where(q.Edge.Mac.Eq(req.Name)). + // Take() + // if errors.Is(err, gorm.ErrRecordNotFound) { + // // 挑选合适的转发服务 + // fwd, err = q.Proxy. + // LeftJoin(q.Edge, q.Edge.ProxyID.EqCol(q.Proxy.ID), q.Edge.Status.Eq(1)). + // Select(q.Proxy.ALL, q.Edge.ALL.Count().As("count")). + // Where(q.Proxy.Type.Eq(int32(proxy2.TypeSelfHosted))). + // Group(q.Proxy.ID). + // Order(field.NewField("", "count").Desc()). + // First() + // if err != nil { + // return err + // } + // // 保存节点信息 + // edge = &m.Edge{ + // Name: req.Name, + // Version: int32(req.Version), + // Type: int32(edge2.TypeSelfHosted), + // ProxyID: &fwd.ID, + // } + // err = q.Edge.Create(edge) + // if err != nil { + // return err + // } + // } else if err == nil { + // // 获取已配置的转发服务 + // fwd, err = q.Proxy. + // Where(q.Proxy.ID.Eq(*edge.ProxyID)). + // Take() + // if err != nil { + // return err + // } + // // 节点已存在,更新版本号 + // if edge.Version < int32(req.Version) { + // _, err = q.Edge. + // Where(q.Edge.ID.Eq(edge.ID)). + // UpdateSimple(q.Edge.Version.Value(int32(req.Version))) + // if err != nil { + // return err + // } + // } + // } else { + // return err + // } + + // // 返回服务地址 + // return c.JSON(RegisterEdgeResp{ + // Id: edge.ID, + // Host: fwd.Host, + // }) } type AllEdgesAvailableReq struct { @@ -120,36 +110,40 @@ type AllEdgesAvailableRespItem struct { } func AllEdgesAvailable(c *fiber.Ctx) (err error) { - // 检查权限 - _, err = auth.GetAuthCtx(c).PermitSecretClient() - if err != nil { - return err - } + return c.JSON(map[string]any{ + "error": "接口暂不可用", + }) - // 验证请求参数 - var req = new(AllEdgesAvailableReq) - err = g.Validator.Validate(c, req) - if err != nil { - return err - } + // // 检查权限 + // _, err = auth.GetAuthCtx(c).PermitSecretClient() + // if err != nil { + // return err + // } - // 获取可用的转发服务 - infos, err := s.Edge.AllEdges(req.Count, req.EdgeFilter) - if err != nil { - return err - } + // // 验证请求参数 + // var req = new(AllEdgesAvailableReq) + // err = g.Validator.Validate(c, req) + // if err != nil { + // return err + // } - // 返回结果 - var edges = make([]AllEdgesAvailableRespItem, len(infos)) - for i, info := range infos { - edges[i] = AllEdgesAvailableRespItem{ - Ip: info.Host, - Port: u.Z(info.ProxyPort), - Isp: edge2.ISP(info.Isp).String(), - Prov: info.Prov, - City: info.City, - Status: info.Status, - } - } - return c.JSON(edges) + // // 获取可用的转发服务 + // infos, err := s.Edge.AllEdges(req.Count, req.EdgeFilter) + // if err != nil { + // return err + // } + + // // 返回结果 + // var edges = make([]AllEdgesAvailableRespItem, len(infos)) + // for i, info := range infos { + // edges[i] = AllEdgesAvailableRespItem{ + // Ip: info.Host, + // Port: u.Z(info.ProxyPort), + // Isp: edge2.ISP(info.Isp).String(), + // Prov: info.Prov, + // City: info.City, + // Status: info.Status, + // } + // } + // return c.JSON(edges) } diff --git a/web/handlers/iden.go b/web/handlers/iden.go index 97c06f2..40dba80 100644 --- a/web/handlers/iden.go +++ b/web/handlers/iden.go @@ -24,7 +24,7 @@ import ( // region Identify type IdentifyReq struct { - Type int32 `json:"type" validate:"required,oneof=1 2"` + Type int `json:"type" validate:"required,oneof=1 2"` Name string `json:"name" validate:"required"` IdenNo string `json:"iden_no" validate:"required"` } @@ -173,7 +173,7 @@ func IdentifyCallback(c *fiber.Ctx) error { q.User.Name, ). Updates(m.User{ - IDType: info.Type, + IDType: m.UserIDType(info.Type), IDNo: &info.IdNo, IDToken: &info.Token, Name: &info.Name, @@ -202,7 +202,7 @@ func idenKey(id string) string { type idenInfo struct { Uid int32 `json:"uid"` - Type int32 `json:"type"` + Type int `json:"type"` Name string `json:"name"` IdNo string `json:"id_no"` Token string `json:"token"` diff --git a/web/handlers/proxy.go b/web/handlers/proxy.go index dd634d2..dd4d3bf 100644 --- a/web/handlers/proxy.go +++ b/web/handlers/proxy.go @@ -1,26 +1,9 @@ package handlers import ( - "crypto/rand" - "encoding/base32" - "fmt" - "log/slog" - "platform/pkg/u" - auth2 "platform/web/auth" - "platform/web/core" - edge2 "platform/web/domains/edge" - proxy2 "platform/web/domains/proxy" - g "platform/web/globals" - "platform/web/globals/orm" - m "platform/web/models" - q "platform/web/queries" - "strings" "time" "github.com/gofiber/fiber/v2" - - "gorm.io/gen/field" - "gorm.io/gorm/clause" ) // region 报告上线 @@ -38,103 +21,106 @@ type ProxyReportOnlineResp struct { } func ProxyReportOnline(c *fiber.Ctx) (err error) { - - // 检查接口权限 - _, err = auth2.GetAuthCtx(c).PermitSecretClient() - if err != nil { - return err - } - - // 验证请求参数 - var req = new(ProxyReportOnlineReq) - err = g.Validator.Validate(c, req) - if err != nil { - return err - } - - // 创建代理 - var ip = c.Context().RemoteIP() - - var secretBytes = make([]byte, 16) - if _, err := rand.Read(secretBytes); err != nil { - return err - } - var secret = base32.StdEncoding. - WithPadding(base32.NoPadding). - EncodeToString(secretBytes) - slog.Debug("生成随机密钥", "ip", ip, "secret", secret) - - var proxy = &m.Proxy{ - Name: req.Name, - Version: int32(req.Version), - Type: int32(proxy2.TypeSelfHosted), - Host: ip.String(), - Secret: &secret, - Status: 1, - } - err = q.Proxy. - Clauses(clause.OnConflict{ - UpdateAll: true, - Columns: []clause.Column{ - {Name: q.Proxy.Name.ColumnName().String()}, - }, - }). - Create(proxy) - if err != nil { - return err - } - - // 获取边缘节点信息 - data, err := q.Edge.Where( - q.Edge.ProxyID.Eq(proxy.ID), - ).Find() - if err != nil { - return err - } - edges := make([]*ProxyEdge, len(data)) - for i, edge := range data { - edges[i] = &ProxyEdge{ - Id: edge.ID, - Port: edge.ProxyPort, - Prov: &edge.Prov, - City: &edge.City, - Isp: u.P(edge2.ISP(edge.Isp).String()), - Status: &edge.Status, - Loss: edge.Loss, - Rtt: edge.Rtt, - } - } - - // 获取许可配置 - channels, err := q.Channel.Where( - q.Channel.ProxyID.Eq(proxy.ID), - q.Channel.Expiration.Gt(orm.LocalDateTime(time.Now())), - ).Find() - if err != nil { - return err - } - - var permits = make([]*ProxyPermit, len(channels)) - for i, channel := range channels { - if channel.EdgeID == nil { - return core.NewBizErr(fmt.Sprintf("权限解析异常,通道缺少边缘节点ID %d", channel.ID)) - } - permits[i] = &ProxyPermit{ - Id: *channel.EdgeID, - Expire: time.Time(channel.Expiration), - Whitelists: u.P(strings.Split(u.Z(channel.Whitelists), ",")), - Username: channel.Username, - Password: channel.Password, - } - } - - slog.Debug("注册转发服务", "ip", ip, "id", proxy.ID) - return c.JSON(&ProxyReportOnlineResp{ - Id: proxy.ID, - Secret: secret, - Edges: edges, - Permits: permits, + return c.JSON(map[string]any{ + "error": "接口暂不可用", }) + + // // 检查接口权限 + // _, err = auth2.GetAuthCtx(c).PermitSecretClient() + // if err != nil { + // return err + // } + + // // 验证请求参数 + // var req = new(ProxyReportOnlineReq) + // err = g.Validator.Validate(c, req) + // if err != nil { + // return err + // } + + // // 创建代理 + // var ip = c.Context().RemoteIP() + + // var secretBytes = make([]byte, 16) + // if _, err := rand.Read(secretBytes); err != nil { + // return err + // } + // var secret = base32.StdEncoding. + // WithPadding(base32.NoPadding). + // EncodeToString(secretBytes) + // slog.Debug("生成随机密钥", "ip", ip, "secret", secret) + + // var proxy = &m.Proxy{ + // Mac: req.Name, + // Version: int32(req.Version), + // Type: m.ProxyTypeSelfHosted, + // IP: ip, + // Secret: &secret, + // Status: 1, + // } + // err = q.Proxy. + // Clauses(clause.OnConflict{ + // UpdateAll: true, + // Columns: []clause.Column{ + // {Name: q.Proxy.Mac.ColumnName().String()}, + // }, + // }). + // Create(proxy) + // if err != nil { + // return err + // } + + // // 获取边缘节点信息 + // data, err := q.Edge.Where( + // q.Edge.ProxyID.Eq(proxy.ID), + // ).Find() + // if err != nil { + // return err + // } + // edges := make([]*ProxyEdge, len(data)) + // for i, edge := range data { + // edges[i] = &ProxyEdge{ + // Id: edge.ID, + // Port: edge.ProxyPort, + // Prov: &edge.Prov, + // City: &edge.City, + // Isp: u.P(edge2.ISP(edge.Isp).String()), + // Status: &edge.Status, + // Loss: edge.Loss, + // Rtt: edge.Rtt, + // } + // } + + // // 获取许可配置 + // channels, err := q.Channel.Where( + // q.Channel.ProxyID.Eq(proxy.ID), + // q.Channel.Expiration.Gt(orm.LocalDateTime(time.Now())), + // ).Find() + // if err != nil { + // return err + // } + + // var permits = make([]*ProxyPermit, len(channels)) + // for i, channel := range channels { + // if channel.EdgeID == nil { + // return core.NewBizErr(fmt.Sprintf("权限解析异常,通道缺少边缘节点ID %d", channel.ID)) + // } + // permits[i] = &ProxyPermit{ + // Id: *channel.EdgeID, + // Expire: time.Time(channel.Expiration), + // Whitelists: u.P(strings.Split(u.Z(channel.Whitelists), ",")), + // Username: channel.Username, + // Password: channel.Password, + // } + // } + + // slog.Debug("注册转发服务", "ip", ip, "id", proxy.ID) + // return c.JSON(&ProxyReportOnlineResp{ + // Id: proxy.ID, + // Secret: secret, + // Edges: edges, + // Permits: permits, + // }) } // endregion @@ -146,36 +132,40 @@ type ProxyReportOfflineReq struct { } func ProxyReportOffline(c *fiber.Ctx) (err error) { - // 检查接口权限 - _, err = auth2.GetAuthCtx(c).PermitSecretClient() - if err != nil { - return err - } + return c.JSON(map[string]any{ + "error": "接口暂不可用", + }) - // 验证请求参数 - var req = new(ProxyReportOfflineReq) - err = g.Validator.Validate(c, req) - if err != nil { - return err - } + // // 检查接口权限 + // _, err = auth2.GetAuthCtx(c).PermitSecretClient() + // if err != nil { + // return err + // } - // 下线转发服务 - _, err = q.Proxy. - Where(q.Proxy.ID.Eq(req.Id)). - UpdateSimple(q.Proxy.Status.Value(0)) - if err != nil { - return err - } + // // 验证请求参数 + // var req = new(ProxyReportOfflineReq) + // err = g.Validator.Validate(c, req) + // if err != nil { + // return err + // } - // 下线所有相关的边缘节点 - _, err = q.Edge. - Where(q.Edge.ProxyID.Eq(req.Id)). - UpdateSimple(q.Edge.Status.Value(0)) - if err != nil { - return err - } + // // 下线转发服务 + // _, err = q.Proxy. + // Where(q.Proxy.ID.Eq(req.Id)). + // UpdateSimple(q.Proxy.Status.Value(0)) + // if err != nil { + // return err + // } - return nil + // // 下线所有相关的边缘节点 + // _, err = q.Edge. + // Where(q.Edge.ProxyID.Eq(req.Id)). + // UpdateSimple(q.Edge.Status.Value(0)) + // if err != nil { + // return err + // } + + // return nil } // endregion @@ -188,157 +178,161 @@ type ProxyReportUpdateReq struct { } func ProxyReportUpdate(c *fiber.Ctx) (err error) { - // 检查接口权限 - _, err = auth2.GetAuthCtx(c).PermitSecretClient() - if err != nil { - return err - } - - // 验证请求参数 - var req = new(ProxyReportUpdateReq) - err = g.Validator.Validate(c, req) - if err != nil { - return err - } - - // 更新节点信息 - var idsActive = make([]int32, 0, len(req.Edges)) - var idsInactive = make([]int32, 0, len(req.Edges)) - var idsIspUnknown = make([]int32, 0, len(req.Edges)) - var idsIspTelecom = make([]int32, 0, len(req.Edges)) - var idsIspUnicom = make([]int32, 0, len(req.Edges)) - var idsIspMobile = make([]int32, 0, len(req.Edges)) - var otherEdges = make([]*ProxyEdge, 0, len(req.Edges)) - for _, edge := range req.Edges { - - // 检查更新ISP - if edge.Isp != nil { - switch edge2.ISPFromStr(*edge.Isp) { - case edge2.IspUnknown: - idsIspUnknown = append(idsIspUnknown, edge.Id) - case edge2.IspChinaTelecom: - idsIspTelecom = append(idsIspTelecom, edge.Id) - case edge2.IspChinaUnicom: - idsIspUnicom = append(idsIspUnicom, edge.Id) - case edge2.IspChinaMobile: - idsIspMobile = append(idsIspMobile, edge.Id) - } - } - - // 检查更新状态 - if edge.Status != nil { - if *edge.Status == 1 { - idsActive = append(idsActive, edge.Id) - } else { - idsInactive = append(idsInactive, edge.Id) - } - } - - // 无法分类更新 - if edge.Host != nil || edge.Port != nil || edge.Prov != nil || edge.City != nil { - otherEdges = append(otherEdges, edge) - continue - } - } - - slog.Debug("更新边缘节点信息", - "active", len(idsActive), - "inactive", len(idsInactive), - "isp_unknown", len(idsIspUnknown), - "isp_telecom", len(idsIspTelecom), - "isp_unicom", len(idsIspUnicom), - "isp_mobile", len(idsIspMobile), - "other_edges", len(otherEdges), - ) - - err = q.Q.Transaction(func(q *q.Query) error { - // 更新边缘节点状态 - if len(idsActive) > 0 { - _, err = q.Edge.Debug(). - Where(q.Edge.ID.In(idsActive...)). - UpdateSimple(q.Edge.Status.Value(1)) - if err != nil { - return err - } - } - - if len(idsInactive) > 0 { - _, err = q.Edge.Debug(). - Where(q.Edge.ID.In(idsInactive...)). - UpdateSimple(q.Edge.Status.Value(0)) - if err != nil { - return err - } - } - - // 更新边缘节点ISP - if len(idsIspUnknown) > 0 { - _, err = q.Edge.Debug(). - Where(q.Edge.ID.In(idsIspUnknown...)). - UpdateSimple(q.Edge.Isp.Value(int32(edge2.IspUnknown))) - if err != nil { - return err - } - } - - if len(idsIspTelecom) > 0 { - _, err = q.Edge.Debug(). - Where(q.Edge.ID.In(idsIspTelecom...)). - UpdateSimple(q.Edge.Isp.Value(int32(edge2.IspChinaTelecom))) - if err != nil { - return err - } - } - - if len(idsIspUnicom) > 0 { - _, err = q.Edge.Debug(). - Where(q.Edge.ID.In(idsIspUnicom...)). - UpdateSimple(q.Edge.Isp.Value(int32(edge2.IspChinaUnicom))) - if err != nil { - return err - } - } - - if len(idsIspMobile) > 0 { - _, err = q.Edge.Debug(). - Where(q.Edge.ID.In(idsIspMobile...)). - UpdateSimple(q.Edge.Isp.Value(int32(edge2.IspChinaMobile))) - if err != nil { - return err - } - } - - // 更新其他边缘节点信息 - for _, edge := range otherEdges { - do := q.Edge.Debug().Where(q.Edge.ID.Eq(edge.Id)) - - var assigns = make([]field.AssignExpr, 0, 5) - if edge.Host != nil { - assigns = append(assigns, q.Edge.Host.Value(*edge.Host)) - } - if edge.Port != nil { - assigns = append(assigns, q.Edge.ProxyPort.Value(*edge.Port)) - } - if edge.Prov != nil { - assigns = append(assigns, q.Edge.Prov.Value(*edge.Prov)) - } - if edge.City != nil { - assigns = append(assigns, q.Edge.City.Value(*edge.City)) - } - - // 更新边缘节点 - _, err := do.UpdateSimple(assigns...) - if err != nil { - return fmt.Errorf("更新边缘节点 %d 失败: %w", edge.Id, err) - } - } - return nil + return c.JSON(map[string]any{ + "error": "接口暂不可用", }) - if err != nil { - return err - } - return nil + // // 检查接口权限 + // _, err = auth2.GetAuthCtx(c).PermitSecretClient() + // if err != nil { + // return err + // } + + // // 验证请求参数 + // var req = new(ProxyReportUpdateReq) + // err = g.Validator.Validate(c, req) + // if err != nil { + // return err + // } + + // // 更新节点信息 + // var idsActive = make([]int32, 0, len(req.Edges)) + // var idsInactive = make([]int32, 0, len(req.Edges)) + // var idsIspUnknown = make([]int32, 0, len(req.Edges)) + // var idsIspTelecom = make([]int32, 0, len(req.Edges)) + // var idsIspUnicom = make([]int32, 0, len(req.Edges)) + // var idsIspMobile = make([]int32, 0, len(req.Edges)) + // var otherEdges = make([]*ProxyEdge, 0, len(req.Edges)) + // for _, edge := range req.Edges { + + // // 检查更新ISP + // if edge.Isp != nil { + // switch edge2.ISPFromStr(*edge.Isp) { + // case edge2.IspUnknown: + // idsIspUnknown = append(idsIspUnknown, edge.Id) + // case edge2.IspChinaTelecom: + // idsIspTelecom = append(idsIspTelecom, edge.Id) + // case edge2.IspChinaUnicom: + // idsIspUnicom = append(idsIspUnicom, edge.Id) + // case edge2.IspChinaMobile: + // idsIspMobile = append(idsIspMobile, edge.Id) + // } + // } + + // // 检查更新状态 + // if edge.Status != nil { + // if *edge.Status == 1 { + // idsActive = append(idsActive, edge.Id) + // } else { + // idsInactive = append(idsInactive, edge.Id) + // } + // } + + // // 无法分类更新 + // if edge.Host != nil || edge.Port != nil || edge.Prov != nil || edge.City != nil { + // otherEdges = append(otherEdges, edge) + // continue + // } + // } + + // slog.Debug("更新边缘节点信息", + // "active", len(idsActive), + // "inactive", len(idsInactive), + // "isp_unknown", len(idsIspUnknown), + // "isp_telecom", len(idsIspTelecom), + // "isp_unicom", len(idsIspUnicom), + // "isp_mobile", len(idsIspMobile), + // "other_edges", len(otherEdges), + // ) + + // err = q.Q.Transaction(func(q *q.Query) error { + // // 更新边缘节点状态 + // if len(idsActive) > 0 { + // _, err = q.Edge.Debug(). + // Where(q.Edge.ID.In(idsActive...)). + // UpdateSimple(q.Edge.Status.Value(1)) + // if err != nil { + // return err + // } + // } + + // if len(idsInactive) > 0 { + // _, err = q.Edge.Debug(). + // Where(q.Edge.ID.In(idsInactive...)). + // UpdateSimple(q.Edge.Status.Value(0)) + // if err != nil { + // return err + // } + // } + + // // 更新边缘节点ISP + // if len(idsIspUnknown) > 0 { + // _, err = q.Edge.Debug(). + // Where(q.Edge.ID.In(idsIspUnknown...)). + // UpdateSimple(q.Edge.Isp.Value(int32(edge2.IspUnknown))) + // if err != nil { + // return err + // } + // } + + // if len(idsIspTelecom) > 0 { + // _, err = q.Edge.Debug(). + // Where(q.Edge.ID.In(idsIspTelecom...)). + // UpdateSimple(q.Edge.Isp.Value(int32(edge2.IspChinaTelecom))) + // if err != nil { + // return err + // } + // } + + // if len(idsIspUnicom) > 0 { + // _, err = q.Edge.Debug(). + // Where(q.Edge.ID.In(idsIspUnicom...)). + // UpdateSimple(q.Edge.Isp.Value(int32(edge2.IspChinaUnicom))) + // if err != nil { + // return err + // } + // } + + // if len(idsIspMobile) > 0 { + // _, err = q.Edge.Debug(). + // Where(q.Edge.ID.In(idsIspMobile...)). + // UpdateSimple(q.Edge.Isp.Value(int32(edge2.IspChinaMobile))) + // if err != nil { + // return err + // } + // } + + // // 更新其他边缘节点信息 + // for _, edge := range otherEdges { + // do := q.Edge.Debug().Where(q.Edge.ID.Eq(edge.Id)) + + // var assigns = make([]field.AssignExpr, 0, 5) + // if edge.Host != nil { + // assigns = append(assigns, q.Edge.Host.Value(*edge.Host)) + // } + // if edge.Port != nil { + // assigns = append(assigns, q.Edge.ProxyPort.Value(*edge.Port)) + // } + // if edge.Prov != nil { + // assigns = append(assigns, q.Edge.Prov.Value(*edge.Prov)) + // } + // if edge.City != nil { + // assigns = append(assigns, q.Edge.City.Value(*edge.City)) + // } + + // // 更新边缘节点 + // _, err := do.UpdateSimple(assigns...) + // if err != nil { + // return fmt.Errorf("更新边缘节点 %d 失败: %w", edge.Id, err) + // } + // } + // return nil + // }) + // if err != nil { + // return err + // } + + // return nil } // endregion diff --git a/web/handlers/resource.go b/web/handlers/resource.go index 97110a8..8e28f4d 100644 --- a/web/handlers/resource.go +++ b/web/handlers/resource.go @@ -4,9 +4,8 @@ import ( "platform/pkg/u" "platform/web/auth" "platform/web/core" - resource2 "platform/web/domains/resource" g "platform/web/globals" - "platform/web/globals/orm" + m "platform/web/models" q "platform/web/queries" s "platform/web/services" "time" @@ -43,7 +42,7 @@ func ListResourceShort(c *fiber.Ctx) error { // 查询套餐列表 do := q.Resource.Where( q.Resource.UserID.Eq(authCtx.User.ID), - q.Resource.Type.Eq(int32(resource2.TypeShort)), + q.Resource.Type.Eq(int(m.ResourceTypeShort)), ) if req.ResourceNo != nil && *req.ResourceNo != "" { do.Where(q.Resource.ResourceNo.Eq(*req.ResourceNo)) @@ -52,19 +51,19 @@ func ListResourceShort(c *fiber.Ctx) error { do.Where(q.Resource.Active.Is(*req.Active)) } if req.Type != nil { - do.Where(q.ResourceShort.As(q.Resource.Short.Name()).Type.Eq(int32(*req.Type))) + do.Where(q.ResourceShort.As(q.Resource.Short.Name()).Type.Eq(*req.Type)) } if req.CreateAfter != nil { - do.Where(q.Resource.CreatedAt.Gte(orm.LocalDateTime(*req.CreateAfter))) + do.Where(q.Resource.CreatedAt.Gte(*req.CreateAfter)) } if req.CreateBefore != nil { - do.Where(q.Resource.CreatedAt.Lte(orm.LocalDateTime(*req.CreateBefore))) + do.Where(q.Resource.CreatedAt.Lte(*req.CreateBefore)) } if req.ExpireAfter != nil { - do.Where(q.ResourceShort.As(q.Resource.Short.Name()).Expire.Gte(orm.LocalDateTime(*req.ExpireAfter))) + do.Where(q.ResourceShort.As(q.Resource.Short.Name()).Expire.Gte(*req.ExpireAfter)) } if req.ExpireBefore != nil { - do.Where(q.ResourceShort.As(q.Resource.Short.Name()).Expire.Lte(orm.LocalDateTime(*req.ExpireBefore))) + do.Where(q.ResourceShort.As(q.Resource.Short.Name()).Expire.Lte(*req.ExpireBefore)) } resource, err := q.Resource.Debug().Where(do). @@ -124,7 +123,7 @@ func ListResourceLong(c *fiber.Ctx) error { // 查询套餐列表 do := q.Resource.Where( q.Resource.UserID.Eq(authCtx.User.ID), - q.Resource.Type.Eq(int32(resource2.TypeLong)), + q.Resource.Type.Eq(int(m.ResourceTypeLong)), ) if req.ResourceNo != nil && *req.ResourceNo != "" { do.Where(q.Resource.ResourceNo.Eq(*req.ResourceNo)) @@ -133,19 +132,19 @@ func ListResourceLong(c *fiber.Ctx) error { do.Where(q.Resource.Active.Is(*req.Active)) } if req.Type != nil { - do.Where(q.ResourceLong.As(q.Resource.Long.Name()).Type.Eq(int32(*req.Type))) + do.Where(q.ResourceLong.As(q.Resource.Long.Name()).Type.Eq(int(*req.Type))) } if req.CreateAfter != nil { - do.Where(q.Resource.CreatedAt.Gte(orm.LocalDateTime(*req.CreateAfter))) + do.Where(q.Resource.CreatedAt.Gte(*req.CreateAfter)) } if req.CreateBefore != nil { - do.Where(q.Resource.CreatedAt.Lte(orm.LocalDateTime(*req.CreateBefore))) + do.Where(q.Resource.CreatedAt.Lte(*req.CreateBefore)) } if req.ExpireAfter != nil { - do.Where(q.ResourceLong.As(q.Resource.Long.Name()).Expire.Gte(orm.LocalDateTime(*req.ExpireAfter))) + do.Where(q.ResourceLong.As(q.Resource.Long.Name()).Expire.Gte(*req.ExpireAfter)) } if req.ExpireBefore != nil { - do.Where(q.ResourceLong.As(q.Resource.Long.Name()).Expire.Lte(orm.LocalDateTime(*req.ExpireBefore))) + do.Where(q.ResourceLong.As(q.Resource.Long.Name()).Expire.Lte(*req.ExpireBefore)) } resource, err := q.Resource.Debug().Where(do). @@ -202,27 +201,27 @@ func AllActiveResource(c *fiber.Ctx) error { q.Resource.UserID.Eq(authCtx.User.ID), q.Resource.Active.Is(true), q.Resource.Where( - q.Resource.Type.Eq(int32(resource2.TypeShort)), + q.Resource.Type.Eq(int(m.ResourceTypeShort)), q.ResourceShort.As(q.Resource.Short.Name()).Where( - short.Type.Eq(int32(resource2.ModeTime)), - short.Expire.Gte(orm.LocalDateTime(now)), + short.Type.Eq(int(m.ResourceModeTime)), + short.Expire.Gte(now), q.ResourceShort.As(q.Resource.Short.Name()). - Where(short.DailyLast.Lt(orm.LocalDateTime(u.Today()))). + Where(short.DailyLast.Lt(u.Today())). Or(short.DailyLimit.GtCol(short.DailyUsed)), ).Or( - short.Type.Eq(int32(resource2.ModeCount)), + short.Type.Eq(int(m.ResourceModeQuota)), short.Quota.GtCol(short.Used), ), ).Or( - q.Resource.Type.Eq(int32(resource2.TypeLong)), + q.Resource.Type.Eq(int(m.ResourceTypeLong)), q.ResourceLong.As(q.Resource.Long.Name()).Where( - long.Type.Eq(int32(resource2.ModeTime)), - long.Expire.Gte(orm.LocalDateTime(now)), + long.Type.Eq(int(m.ResourceModeTime)), + long.Expire.Gte(now), q.ResourceLong.As(q.Resource.Long.Name()). - Where(long.DailyLast.Lt(orm.LocalDateTime(u.Today()))). + Where(long.DailyLast.Lt(u.Today())). Or(long.DailyLimit.GtCol(long.DailyUsed)), ).Or( - long.Type.Eq(int32(resource2.ModeCount)), + long.Type.Eq(int(m.ResourceModeQuota)), long.Quota.GtCol(long.Used), ), ), @@ -282,23 +281,23 @@ func StatisticResourceFree(c *fiber.Ctx) error { switch { // 短效包量 - case resource2.Type(resource.Type) == resource2.TypeShort && resource2.Mode(resource.Short.Type) == resource2.ModeCount: + case resource.Type == m.ResourceTypeShort && resource.Short.Type == m.ResourceModeQuota: if u.Z(resource.Short.Quota) > resource.Short.Used { shortCount++ shortQuotaSum += int(u.Z(resource.Short.Quota) - resource.Short.Used) } // 长效包量 - case resource2.Type(resource.Type) == resource2.TypeLong && resource2.Mode(resource.Long.Type) == resource2.ModeCount: + case resource.Type == m.ResourceTypeLong && resource.Long.Type == m.ResourceModeQuota: if u.Z(resource.Long.Quota) > resource.Long.Used { longCount++ longQuotaSum += int(u.Z(resource.Long.Quota) - resource.Long.Used) } // 短效包时 - case resource2.Type(resource.Type) == resource2.TypeShort && resource2.Mode(resource.Short.Type) == resource2.ModeTime: + case resource.Type == m.ResourceTypeShort && resource.Short.Type == m.ResourceModeTime: if time.Time(*resource.Short.Expire).After(time.Now()) { - if resource.Short.DailyLast == nil || u.SameDate(time.Time(*resource.Short.DailyLast)) == false { + if resource.Short.DailyLast == nil || u.IsToday(time.Time(*resource.Short.DailyLast)) == false { shortCount++ shortDailyFreeSum += int(resource.Short.DailyLimit) } else if resource.Short.DailyLimit > resource.Short.DailyUsed { @@ -308,9 +307,9 @@ func StatisticResourceFree(c *fiber.Ctx) error { } // 长效包时 - case resource2.Type(resource.Type) == resource2.TypeLong && resource2.Mode(resource.Long.Type) == resource2.ModeTime: + case resource.Type == m.ResourceTypeLong && resource.Long.Type == m.ResourceModeTime: if time.Time(*resource.Long.Expire).After(time.Now()) { - if resource.Long.DailyLast == nil || u.SameDate(time.Time(*resource.Long.DailyLast)) == false { + if resource.Long.DailyLast == nil || u.IsToday(time.Time(*resource.Long.DailyLast)) == false { longCount++ longDailyFreeSum += int(resource.Long.DailyLimit) } else if resource.Long.DailyLimit > resource.Long.DailyUsed { @@ -376,10 +375,10 @@ func StatisticResourceUsage(c *fiber.Ctx) error { do.Where(q.LogsUserUsage.ResourceID.Eq(resourceID)) } if req.TimeAfter != nil { - do.Where(q.LogsUserUsage.Time.Gte(orm.LocalDateTime(*req.TimeAfter))) + do.Where(q.LogsUserUsage.Time.Gte(*req.TimeAfter)) } if req.TimeBefore != nil { - do.Where(q.LogsUserUsage.Time.Lte(orm.LocalDateTime(*req.TimeBefore))) + do.Where(q.LogsUserUsage.Time.Lte(*req.TimeBefore)) } var data = new(StatisticResourceUsageResp) diff --git a/web/handlers/trade.go b/web/handlers/trade.go index 466a01e..bf0e6f7 100644 --- a/web/handlers/trade.go +++ b/web/handlers/trade.go @@ -4,8 +4,8 @@ import ( "log/slog" "platform/web/auth" "platform/web/core" - trade2 "platform/web/domains/trade" g "platform/web/globals" + m "platform/web/models" s "platform/web/services" "time" @@ -14,7 +14,7 @@ import ( type TradeCreateReq struct { s.CreateTradeData - Type trade2.Type `json:"type" validate:"required"` + Type m.TradeType `json:"type" validate:"required"` Resource *s.CreateResourceData `json:"resource,omitempty"` Recharge *s.RechargeProductInfo `json:"recharge,omitempty"` } @@ -38,12 +38,12 @@ func TradeCreate(c *fiber.Ctx) error { } switch req.Type { - case trade2.TypePurchase: + case m.TradeTypePurchase: if req.Resource == nil { return core.NewBizErr("购买信息不能为空") } req.Product = req.Resource - case trade2.TypeRecharge: + case m.TradeTypeRecharge: if req.Recharge == nil { return core.NewBizErr("充值信息不能为空") } diff --git a/web/handlers/verifier.go b/web/handlers/verifier.go index e1465ce..1e5ae16 100644 --- a/web/handlers/verifier.go +++ b/web/handlers/verifier.go @@ -19,7 +19,7 @@ type VerifierReq struct { func SmsCode(c *fiber.Ctx) error { - _, err := auth.GetAuthCtx(c).PermitInternalClient() + _, err := auth.GetAuthCtx(c).PermitOfficialClient() if err != nil { return err } diff --git a/web/handlers/whitelist.go b/web/handlers/whitelist.go index d8c3416..4630c88 100644 --- a/web/handlers/whitelist.go +++ b/web/handlers/whitelist.go @@ -1,11 +1,12 @@ package handlers import ( - "net" "platform/pkg/env" + "platform/pkg/u" "platform/web/auth" "platform/web/core" g "platform/web/globals" + "platform/web/globals/orm" m "platform/web/models" q "platform/web/queries" "time" @@ -89,7 +90,7 @@ func CreateWhitelist(c *fiber.Ctx) error { return err } - err = secureAddr(req.Host) + ip, err := secureAddr(req.Host) if err != nil { return err } @@ -97,7 +98,7 @@ func CreateWhitelist(c *fiber.Ctx) error { // 创建白名单 err = q.Whitelist.Create(&m.Whitelist{ UserID: authCtx.User.ID, - Host: req.Host, + IP: u.Z(ip), Remark: &req.Remark, }) return nil @@ -125,17 +126,21 @@ func UpdateWhitelist(c *fiber.Ctx) error { return fiber.NewError(fiber.StatusBadRequest, "id is required") } + ip, err := secureAddr(req.Host) + if err != nil { + return err + } + // 更新白名单 _, err = q.Whitelist. Where( q.Whitelist.ID.Eq(req.ID), q.Whitelist.UserID.Eq(authCtx.User.ID), ). - Updates(&m.Whitelist{ - ID: req.ID, - Host: req.Host, - Remark: &req.Remark, - }) + UpdateSimple( + q.Whitelist.IP.Value(ip), + q.Whitelist.Remark.Value(req.Remark), + ) if err != nil { return err } @@ -186,13 +191,13 @@ func RemoveWhitelist(c *fiber.Ctx) error { return nil } -func secureAddr(str string) error { - var addr = net.ParseIP(str) - if addr == nil { - return fiber.NewError(fiber.StatusBadRequest, "IP 解析失败") +func secureAddr(str string) (*orm.Inet, error) { + ip, err := orm.ParseInet(str) + if err != nil { + return nil, err } - if env.RunMode == env.RunModeDev || addr.IsGlobalUnicast() { - return nil + if !ip.IsGlobalUnicast() && env.RunMode != env.RunModeDev { + return nil, fiber.NewError(fiber.StatusBadRequest, "IP 地址不可用") } - return fiber.NewError(fiber.StatusBadRequest, "IP 地址不可用") + return ip, nil } diff --git a/web/models/admin.gen.go b/web/models/admin.gen.go deleted file mode 100644 index e5df0ae..0000000 --- a/web/models/admin.gen.go +++ /dev/null @@ -1,36 +0,0 @@ -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. - -package models - -import ( - "platform/web/globals/orm" - - "gorm.io/gorm" -) - -const TableNameAdmin = "admin" - -// Admin mapped from table -type Admin struct { - ID int32 `gorm:"column:id;type:integer;primaryKey;autoIncrement:true;comment:管理员ID" json:"id"` // 管理员ID - Username string `gorm:"column:username;type:character varying(255);not null;comment:用户名" json:"username"` // 用户名 - Password string `gorm:"column:password;type:character varying(255);not null;comment:密码" json:"password"` // 密码 - Name *string `gorm:"column:name;type:character varying(255);comment:真实姓名" json:"name"` // 真实姓名 - Avatar *string `gorm:"column:avatar;type:character varying(255);comment:头像URL" json:"avatar"` // 头像URL - Phone *string `gorm:"column:phone;type:character varying(255);comment:手机号码" json:"phone"` // 手机号码 - Email *string `gorm:"column:email;type:character varying(255);comment:邮箱" json:"email"` // 邮箱 - Status int32 `gorm:"column:status;type:integer;not null;default:1;comment:状态:0-禁用,1-正常" json:"status"` // 状态:0-禁用,1-正常 - LastLogin *orm.LocalDateTime `gorm:"column:last_login;type:timestamp without time zone;comment:最后登录时间" json:"last_login"` // 最后登录时间 - LastLoginHost *string `gorm:"column:last_login_host;type:character varying(45);comment:最后登录地址" json:"last_login_host"` // 最后登录地址 - LastLoginAgent *string `gorm:"column:last_login_agent;type:character varying(255);comment:最后登录代理" json:"last_login_agent"` // 最后登录代理 - CreatedAt *orm.LocalDateTime `gorm:"column:created_at;type:timestamp without time zone;default:CURRENT_TIMESTAMP;comment:创建时间" json:"created_at"` // 创建时间 - UpdatedAt *orm.LocalDateTime `gorm:"column:updated_at;type:timestamp without time zone;default:CURRENT_TIMESTAMP;comment:更新时间" json:"updated_at"` // 更新时间 - DeletedAt gorm.DeletedAt `gorm:"column:deleted_at;type:timestamp without time zone;comment:删除时间" json:"deleted_at"` // 删除时间 -} - -// TableName Admin's table name -func (*Admin) TableName() string { - return TableNameAdmin -} diff --git a/web/models/admin.go b/web/models/admin.go new file mode 100644 index 0000000..405ba0d --- /dev/null +++ b/web/models/admin.go @@ -0,0 +1,31 @@ +package models + +import ( + "time" + + "platform/web/core" + "platform/web/globals/orm" +) + +// Admin 管理员表 +type Admin struct { + core.Model + Username string `json:"username" gorm:"column:username"` // 用户名 + Password string `json:"password" gorm:"column:password"` // 密码 + Name *string `json:"name" gorm:"column:name"` // 真实姓名 + Avatar *string `json:"avatar" gorm:"column:avatar"` // 头像URL + Phone *string `json:"phone" gorm:"column:phone"` // 手机号码 + Email *string `json:"email" gorm:"column:email"` // 邮箱 + Status AdminStatus `json:"status" gorm:"column:status"` // 状态:0-禁用,1-正常 + LastLogin *time.Time `json:"last_login" gorm:"column:last_login"` // 最后登录时间 + LastLoginIP *orm.Inet `json:"last_login_ip" gorm:"column:last_login_ip"` // 最后登录地址 + LastLoginUA *string `json:"last_login_ua" gorm:"column:last_login_ua"` // 最后登录代理 +} + +// AdminStatus 管理员状态枚举 +type AdminStatus int + +const ( + AdminStatusDisabled AdminStatus = 0 // 禁用 + AdminStatusEnabled AdminStatus = 1 // 正常 +) diff --git a/web/models/admin_role.gen.go b/web/models/admin_role.gen.go deleted file mode 100644 index f1c543a..0000000 --- a/web/models/admin_role.gen.go +++ /dev/null @@ -1,30 +0,0 @@ -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. - -package models - -import ( - "platform/web/globals/orm" - - "gorm.io/gorm" -) - -const TableNameAdminRole = "admin_role" - -// AdminRole mapped from table -type AdminRole struct { - ID int32 `gorm:"column:id;type:integer;primaryKey;autoIncrement:true;comment:管理员角色ID" json:"id"` // 管理员角色ID - Name string `gorm:"column:name;type:character varying(255);not null;comment:角色名称" json:"name"` // 角色名称 - Description *string `gorm:"column:description;type:character varying(255);comment:角色描述" json:"description"` // 角色描述 - Active *bool `gorm:"column:active;type:boolean;default:true;comment:是否激活" json:"active"` // 是否激活 - Sort *int32 `gorm:"column:sort;type:integer;comment:排序" json:"sort"` // 排序 - CreatedAt *orm.LocalDateTime `gorm:"column:created_at;type:timestamp without time zone;default:CURRENT_TIMESTAMP;comment:创建时间" json:"created_at"` // 创建时间 - UpdatedAt *orm.LocalDateTime `gorm:"column:updated_at;type:timestamp without time zone;default:CURRENT_TIMESTAMP;comment:更新时间" json:"updated_at"` // 更新时间 - DeletedAt gorm.DeletedAt `gorm:"column:deleted_at;type:timestamp without time zone;comment:删除时间" json:"deleted_at"` // 删除时间 -} - -// TableName AdminRole's table name -func (*AdminRole) TableName() string { - return TableNameAdminRole -} diff --git a/web/models/admin_role.go b/web/models/admin_role.go new file mode 100644 index 0000000..ca56e26 --- /dev/null +++ b/web/models/admin_role.go @@ -0,0 +1,14 @@ +package models + +import ( + "platform/web/core" +) + +// AdminRole 管理员角色表 +type AdminRole struct { + core.Model + Name string `json:"name" gorm:"column:name"` // 角色名称 + Description *string `json:"description" gorm:"column:description"` // 角色描述 + Active bool `json:"active" gorm:"column:active"` // 是否激活 + Sort int32 `json:"sort" gorm:"column:sort"` // 排序 +} diff --git a/web/models/admin_role_link.gen.go b/web/models/admin_role_link.gen.go deleted file mode 100644 index 969a406..0000000 --- a/web/models/admin_role_link.gen.go +++ /dev/null @@ -1,28 +0,0 @@ -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. - -package models - -import ( - "platform/web/globals/orm" - - "gorm.io/gorm" -) - -const TableNameAdminRoleLink = "admin_role_link" - -// AdminRoleLink mapped from table -type AdminRoleLink struct { - ID int32 `gorm:"column:id;type:integer;primaryKey;autoIncrement:true;comment:关联ID" json:"id"` // 关联ID - AdminID int32 `gorm:"column:admin_id;type:integer;not null;comment:管理员ID" json:"admin_id"` // 管理员ID - RoleID int32 `gorm:"column:role_id;type:integer;not null;comment:角色ID" json:"role_id"` // 角色ID - CreatedAt *orm.LocalDateTime `gorm:"column:created_at;type:timestamp without time zone;default:CURRENT_TIMESTAMP;comment:创建时间" json:"created_at"` // 创建时间 - UpdatedAt *orm.LocalDateTime `gorm:"column:updated_at;type:timestamp without time zone;default:CURRENT_TIMESTAMP;comment:更新时间" json:"updated_at"` // 更新时间 - DeletedAt gorm.DeletedAt `gorm:"column:deleted_at;type:timestamp without time zone;comment:删除时间" json:"deleted_at"` // 删除时间 -} - -// TableName AdminRoleLink's table name -func (*AdminRoleLink) TableName() string { - return TableNameAdminRoleLink -} diff --git a/web/models/admin_role_permission_link.gen.go b/web/models/admin_role_permission_link.gen.go deleted file mode 100644 index b613a05..0000000 --- a/web/models/admin_role_permission_link.gen.go +++ /dev/null @@ -1,28 +0,0 @@ -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. - -package models - -import ( - "platform/web/globals/orm" - - "gorm.io/gorm" -) - -const TableNameAdminRolePermissionLink = "admin_role_permission_link" - -// AdminRolePermissionLink mapped from table -type AdminRolePermissionLink struct { - ID int32 `gorm:"column:id;type:integer;primaryKey;autoIncrement:true;comment:关联ID" json:"id"` // 关联ID - RoleID int32 `gorm:"column:role_id;type:integer;not null;comment:角色ID" json:"role_id"` // 角色ID - PermissionID int32 `gorm:"column:permission_id;type:integer;not null;comment:权限ID" json:"permission_id"` // 权限ID - CreatedAt *orm.LocalDateTime `gorm:"column:created_at;type:timestamp without time zone;default:CURRENT_TIMESTAMP;comment:创建时间" json:"created_at"` // 创建时间 - UpdatedAt *orm.LocalDateTime `gorm:"column:updated_at;type:timestamp without time zone;default:CURRENT_TIMESTAMP;comment:更新时间" json:"updated_at"` // 更新时间 - DeletedAt gorm.DeletedAt `gorm:"column:deleted_at;type:timestamp without time zone;comment:删除时间" json:"deleted_at"` // 删除时间 -} - -// TableName AdminRolePermissionLink's table name -func (*AdminRolePermissionLink) TableName() string { - return TableNameAdminRolePermissionLink -} diff --git a/web/models/announcement.gen.go b/web/models/announcement.gen.go deleted file mode 100644 index 55d3fbf..0000000 --- a/web/models/announcement.gen.go +++ /dev/null @@ -1,32 +0,0 @@ -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. - -package models - -import ( - "platform/web/globals/orm" - - "gorm.io/gorm" -) - -const TableNameAnnouncement = "announcement" - -// Announcement mapped from table -type Announcement struct { - ID int32 `gorm:"column:id;type:integer;primaryKey;autoIncrement:true;comment:公告ID" json:"id"` // 公告ID - Title string `gorm:"column:title;type:character varying(255);not null;comment:公告标题" json:"title"` // 公告标题 - Content *string `gorm:"column:content;type:text;comment:公告内容" json:"content"` // 公告内容 - Type int32 `gorm:"column:type;type:integer;not null;default:1;comment:公告类型:1-普通公告" json:"type"` // 公告类型:1-普通公告 - Pin bool `gorm:"column:pin;type:boolean;not null;comment:是否置顶" json:"pin"` // 是否置顶 - Status int32 `gorm:"column:status;type:integer;not null;default:1;comment:公告状态:0-禁用,1-正常" json:"status"` // 公告状态:0-禁用,1-正常 - Sort int32 `gorm:"column:sort;type:integer;not null;comment:公告排序" json:"sort"` // 公告排序 - CreatedAt *orm.LocalDateTime `gorm:"column:created_at;type:timestamp without time zone;default:CURRENT_TIMESTAMP;comment:创建时间" json:"created_at"` // 创建时间 - UpdatedAt *orm.LocalDateTime `gorm:"column:updated_at;type:timestamp without time zone;default:CURRENT_TIMESTAMP;comment:更新时间" json:"updated_at"` // 更新时间 - DeletedAt gorm.DeletedAt `gorm:"column:deleted_at;type:timestamp without time zone;comment:删除时间" json:"deleted_at"` // 删除时间 -} - -// TableName Announcement's table name -func (*Announcement) TableName() string { - return TableNameAnnouncement -} diff --git a/web/models/announcement.go b/web/models/announcement.go new file mode 100644 index 0000000..699f7d4 --- /dev/null +++ b/web/models/announcement.go @@ -0,0 +1,31 @@ +package models + +import ( + "platform/web/core" +) + +// Announcement 公告表 +type Announcement struct { + core.Model + Title string `json:"title" gorm:"column:title"` // 公告标题 + Content *string `json:"content" gorm:"column:content"` // 公告内容 + Type AnnouncementType `json:"type" gorm:"column:type"` // 公告类型:1-普通公告 + Pin bool `json:"pin" gorm:"column:pin"` // 是否置顶 + Status AnnouncementStatus `json:"status" gorm:"column:status"` // 公告状态:0-禁用,1-正常 + Sort int32 `json:"sort" gorm:"column:sort"` // 公告排序 +} + +// AnnouncementType 公告类型枚举 +type AnnouncementType int + +const ( + AnnouncementTypeNormal AnnouncementType = 1 // 普通公告 +) + +// AnnouncementStatus 公告状态枚举 +type AnnouncementStatus int + +const ( + AnnouncementStatusDisabled AnnouncementStatus = 0 // 禁用 + AnnouncementStatusEnabled AnnouncementStatus = 1 // 正常 +) diff --git a/web/models/bill.gen.go b/web/models/bill.gen.go deleted file mode 100644 index 7ddec98..0000000 --- a/web/models/bill.gen.go +++ /dev/null @@ -1,38 +0,0 @@ -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. - -package models - -import ( - "platform/web/globals/orm" - - "github.com/shopspring/decimal" - "gorm.io/gorm" -) - -const TableNameBill = "bill" - -// Bill mapped from table -type Bill struct { - ID int32 `gorm:"column:id;type:integer;primaryKey;autoIncrement:true;comment:账单ID" json:"id"` // 账单ID - UserID int32 `gorm:"column:user_id;type:integer;not null;comment:用户ID" json:"user_id"` // 用户ID - TradeID *int32 `gorm:"column:trade_id;type:integer;comment:订单ID" json:"trade_id"` // 订单ID - ResourceID *int32 `gorm:"column:resource_id;type:integer;comment:套餐ID" json:"resource_id"` // 套餐ID - RefundID *int32 `gorm:"column:refund_id;type:integer;comment:退款ID" json:"refund_id"` // 退款ID - BillNo string `gorm:"column:bill_no;type:character varying(255);not null;comment:易读账单号" json:"bill_no"` // 易读账单号 - Info *string `gorm:"column:info;type:character varying(255);comment:产品可读信息" json:"info"` // 产品可读信息 - Type int32 `gorm:"column:type;type:integer;not null;comment:账单类型:1-消费,2-退款,3-充值" json:"type"` // 账单类型:1-消费,2-退款,3-充值 - Amount decimal.Decimal `gorm:"column:amount;type:numeric(12,2);not null;comment:账单金额" json:"amount"` // 账单金额 - CreatedAt *orm.LocalDateTime `gorm:"column:created_at;type:timestamp without time zone;default:CURRENT_TIMESTAMP;comment:创建时间" json:"created_at"` // 创建时间 - UpdatedAt *orm.LocalDateTime `gorm:"column:updated_at;type:timestamp without time zone;default:CURRENT_TIMESTAMP;comment:更新时间" json:"updated_at"` // 更新时间 - DeletedAt gorm.DeletedAt `gorm:"column:deleted_at;type:timestamp without time zone;comment:删除时间" json:"deleted_at"` // 删除时间 - Trade *Trade `gorm:"foreignKey:TradeID" json:"trade"` - Refund *Refund `gorm:"foreignKey:RefundID" json:"refund"` - Resource *Resource `gorm:"foreignKey:ResourceID" json:"resource"` -} - -// TableName Bill's table name -func (*Bill) TableName() string { - return TableNameBill -} diff --git a/web/models/bill.go b/web/models/bill.go new file mode 100644 index 0000000..fc64d7f --- /dev/null +++ b/web/models/bill.go @@ -0,0 +1,34 @@ +package models + +import ( + "platform/web/core" + + "github.com/shopspring/decimal" +) + +// Bill 账单表 +type Bill struct { + core.Model + UserID int32 `json:"user_id" gorm:"column:user_id"` // 用户ID + TradeID *int32 `json:"trade_id" gorm:"column:trade_id"` // 订单ID + ResourceID *int32 `json:"resource_id" gorm:"column:resource_id"` // 套餐ID + RefundID *int32 `json:"refund_id" gorm:"column:refund_id"` // 退款ID + BillNo string `json:"bill_no" gorm:"column:bill_no"` // 易读账单号 + Info *string `json:"info" gorm:"column:info"` // 产品可读信息 + Type BillType `json:"type" gorm:"column:type"` // 账单类型:1-消费,2-退款,3-充值 + Amount decimal.Decimal `json:"amount" gorm:"column:amount"` // 账单金额 + + User *User `json:"user" gorm:"foreignKey:UserID"` + Trade *Trade `json:"trade" gorm:"foreignKey:TradeID"` + Resource *Resource `json:"resource" gorm:"foreignKey:ResourceID"` + Refund *Refund `json:"refund" gorm:"foreignKey:RefundID"` +} + +// BillType 账单类型枚举 +type BillType int + +const ( + BillTypeConsume BillType = 1 // 消费 + BillTypeRefund BillType = 2 // 退款 + BillTypeRecharge BillType = 3 // 充值 +) diff --git a/web/models/channel.gen.go b/web/models/channel.gen.go deleted file mode 100644 index 24211bc..0000000 --- a/web/models/channel.gen.go +++ /dev/null @@ -1,40 +0,0 @@ -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. - -package models - -import ( - "platform/web/globals/orm" - - "gorm.io/gorm" -) - -const TableNameChannel = "channel" - -// Channel mapped from table -type Channel struct { - ID int32 `gorm:"column:id;type:integer;primaryKey;autoIncrement:true;comment:通道ID" json:"id"` // 通道ID - UserID int32 `gorm:"column:user_id;type:integer;not null;comment:用户ID" json:"user_id"` // 用户ID - ProxyID int32 `gorm:"column:proxy_id;type:integer;not null;comment:代理ID" json:"proxy_id"` // 代理ID - EdgeID *int32 `gorm:"column:edge_id;type:integer;comment:节点ID" json:"edge_id"` // 节点ID - ResourceID int32 `gorm:"column:resource_id;type:integer;not null;comment:套餐ID" json:"resource_id"` // 套餐ID - ProxyHost string `gorm:"column:proxy_host;type:character varying(255);not null;comment:代理地址" json:"proxy_host"` // 代理地址 - ProxyPort int32 `gorm:"column:proxy_port;type:integer;not null;comment:转发端口" json:"proxy_port"` // 转发端口 - EdgeHost *string `gorm:"column:edge_host;type:character varying(255);comment:节点地址" json:"edge_host"` // 节点地址 - Protocol *int32 `gorm:"column:protocol;type:integer;comment:协议类型:1-http,2-https,3-socks5" json:"protocol"` // 协议类型:1-http,2-https,3-socks5 - AuthIP bool `gorm:"column:auth_ip;type:boolean;not null;comment:IP认证" json:"auth_ip"` // IP认证 - Whitelists *string `gorm:"column:whitelists;type:text;comment:IP白名单,逗号分隔" json:"whitelists"` // IP白名单,逗号分隔 - AuthPass bool `gorm:"column:auth_pass;type:boolean;not null;comment:密码认证" json:"auth_pass"` // 密码认证 - Username *string `gorm:"column:username;type:character varying(255);comment:用户名" json:"username"` // 用户名 - Password *string `gorm:"column:password;type:character varying(255);comment:密码" json:"password"` // 密码 - Expiration orm.LocalDateTime `gorm:"column:expiration;type:timestamp without time zone;not null;comment:过期时间" json:"expiration"` // 过期时间 - CreatedAt *orm.LocalDateTime `gorm:"column:created_at;type:timestamp without time zone;default:CURRENT_TIMESTAMP;comment:创建时间" json:"created_at"` // 创建时间 - UpdatedAt *orm.LocalDateTime `gorm:"column:updated_at;type:timestamp without time zone;default:CURRENT_TIMESTAMP;comment:更新时间" json:"updated_at"` // 更新时间 - DeletedAt gorm.DeletedAt `gorm:"column:deleted_at;type:timestamp without time zone;comment:删除时间" json:"deleted_at"` // 删除时间 -} - -// TableName Channel's table name -func (*Channel) TableName() string { - return TableNameChannel -} diff --git a/web/models/channel.go b/web/models/channel.go new file mode 100644 index 0000000..6225df2 --- /dev/null +++ b/web/models/channel.go @@ -0,0 +1,31 @@ +package models + +import ( + "platform/web/core" + "platform/web/globals/orm" + "time" +) + +// Channel 通道表 +type Channel struct { + core.Model + UserID int32 `json:"user_id" gorm:"column:user_id"` // 用户ID + ResourceID int32 `json:"resource_id" gorm:"column:resource_id"` // 套餐ID + ProxyID int32 `json:"proxy_id" gorm:"column:proxy_id"` // 代理ID + BatchNo string `json:"batch_no" gorm:"column:batch_no"` // 批次编号 + Port uint16 `json:"port" gorm:"column:port"` // 代理端口 + EdgeID *int32 `json:"edge_id" gorm:"column:edge_id"` // 节点ID(手动配置) + FilterISP *EdgeISP `json:"filter_isp" gorm:"column:filter_isp"` // 运营商过滤(自动配置):参考 edge.isp + FilterProv *string `json:"filter_prov" gorm:"column:filter_prov"` // 省份过滤(自动配置) + FilterCity *string `json:"filter_city" gorm:"column:filter_city"` // 城市过滤(自动配置) + IP *orm.Inet `json:"ip" gorm:"column:ip"` // 节点地址 + Whitelists *orm.Slice[string] `json:"whitelists" gorm:"column:whitelists"` // IP白名单,逗号分隔 + Username *string `json:"username" gorm:"column:username"` // 用户名 + Password *string `json:"password" gorm:"column:password"` // 密码 + ExpiredAt time.Time `json:"expired_at" gorm:"column:expired_at"` // 过期时间 + + User User `json:"user" gorm:"foreignKey:UserID"` + Resource Resource `json:"resource" gorm:"foreignKey:ResourceID"` + Proxy Proxy `json:"proxy" gorm:"foreignKey:ProxyID"` + Edge *Edge `json:"edge" gorm:"foreignKey:EdgeID"` +} diff --git a/web/models/client.gen.go b/web/models/client.gen.go deleted file mode 100644 index 1039e2b..0000000 --- a/web/models/client.gen.go +++ /dev/null @@ -1,34 +0,0 @@ -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. - -package models - -import ( - "platform/web/globals/orm" - - "gorm.io/gorm" -) - -const TableNameClient = "client" - -// Client mapped from table -type Client struct { - ID int32 `gorm:"column:id;type:integer;primaryKey;autoIncrement:true;comment:客户端ID" json:"id"` // 客户端ID - ClientID string `gorm:"column:client_id;type:character varying(255);not null;comment:OAuth2客户端标识符" json:"client_id"` // OAuth2客户端标识符 - ClientSecret string `gorm:"column:client_secret;type:character varying(255);not null;comment:OAuth2客户端密钥" json:"client_secret"` // OAuth2客户端密钥 - RedirectURI *string `gorm:"column:redirect_uri;type:character varying(255);comment:OAuth2 重定向URI" json:"redirect_uri"` // OAuth2 重定向URI - Spec int32 `gorm:"column:spec;type:integer;not null;comment:安全规范:1-native,2-browser,3-web,4-api" json:"spec"` // 安全规范:1-native,2-browser,3-web,4-api - Name string `gorm:"column:name;type:character varying(255);not null;comment:名称" json:"name"` // 名称 - Icon *string `gorm:"column:icon;type:character varying(255);comment:图标URL" json:"icon"` // 图标URL - Status int32 `gorm:"column:status;type:integer;not null;default:1;comment:状态:0-禁用,1-正常" json:"status"` // 状态:0-禁用,1-正常 - Type int32 `gorm:"column:type;type:integer;not null;comment:类型:0-普通,1-官方" json:"type"` // 类型:0-普通,1-官方 - CreatedAt *orm.LocalDateTime `gorm:"column:created_at;type:timestamp without time zone;default:CURRENT_TIMESTAMP;comment:创建时间" json:"created_at"` // 创建时间 - UpdatedAt *orm.LocalDateTime `gorm:"column:updated_at;type:timestamp without time zone;default:CURRENT_TIMESTAMP;comment:更新时间" json:"updated_at"` // 更新时间 - DeletedAt gorm.DeletedAt `gorm:"column:deleted_at;type:timestamp without time zone;comment:删除时间" json:"deleted_at"` // 删除时间 -} - -// TableName Client's table name -func (*Client) TableName() string { - return TableNameClient -} diff --git a/web/models/client.go b/web/models/client.go new file mode 100644 index 0000000..872890b --- /dev/null +++ b/web/models/client.go @@ -0,0 +1,44 @@ +package models + +import ( + "platform/web/core" +) + +// Client 客户端表 +type Client struct { + core.Model + ClientID string `json:"client_id" gorm:"column:client_id"` // OAuth2客户端标识符 + ClientSecret string `json:"client_secret" gorm:"column:client_secret"` // OAuth2客户端密钥 + RedirectURI *string `json:"redirect_uri" gorm:"column:redirect_uri"` // OAuth2 重定向URI + Spec ClientSpec `json:"spec" gorm:"column:spec"` // 安全规范:1-native,2-browser,3-web,4-api + Name string `json:"name" gorm:"column:name"` // 名称 + Icon *string `json:"icon" gorm:"column:icon"` // 图标URL + Status ClientStatus `json:"status" gorm:"column:status"` // 状态:0-禁用,1-正常 + Type ClientType `json:"type" gorm:"column:type"` // 类型:0-普通,1-官方 +} + +// ClientSpec 客户端安全规范枚举 +type ClientSpec int + +const ( + ClientSpecNative ClientSpec = 1 // native + ClientSpecBrowser ClientSpec = 2 // browser + ClientSpecWeb ClientSpec = 3 // web + ClientSpecAPI ClientSpec = 4 // api +) + +// ClientStatus 客户端状态枚举 +type ClientStatus int + +const ( + ClientStatusDisabled ClientStatus = 0 // 禁用 + ClientStatusEnabled ClientStatus = 1 // 正常 +) + +// ClientType 客户端类型枚举 +type ClientType int + +const ( + ClientTypeNormal ClientType = 0 // 普通 + ClientTypeOfficial ClientType = 1 // 官方 +) diff --git a/web/models/client_permission_link.gen.go b/web/models/client_permission_link.gen.go deleted file mode 100644 index 767972e..0000000 --- a/web/models/client_permission_link.gen.go +++ /dev/null @@ -1,28 +0,0 @@ -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. - -package models - -import ( - "platform/web/globals/orm" - - "gorm.io/gorm" -) - -const TableNameClientPermissionLink = "client_permission_link" - -// ClientPermissionLink mapped from table -type ClientPermissionLink struct { - ID int32 `gorm:"column:id;type:integer;primaryKey;autoIncrement:true;comment:关联ID" json:"id"` // 关联ID - ClientID int32 `gorm:"column:client_id;type:integer;not null;comment:客户端ID" json:"client_id"` // 客户端ID - PermissionID int32 `gorm:"column:permission_id;type:integer;not null;comment:权限ID" json:"permission_id"` // 权限ID - CreatedAt *orm.LocalDateTime `gorm:"column:created_at;type:timestamp without time zone;default:CURRENT_TIMESTAMP;comment:创建时间" json:"created_at"` // 创建时间 - UpdatedAt *orm.LocalDateTime `gorm:"column:updated_at;type:timestamp without time zone;default:CURRENT_TIMESTAMP;comment:更新时间" json:"updated_at"` // 更新时间 - DeletedAt gorm.DeletedAt `gorm:"column:deleted_at;type:timestamp without time zone;comment:删除时间" json:"deleted_at"` // 删除时间 -} - -// TableName ClientPermissionLink's table name -func (*ClientPermissionLink) TableName() string { - return TableNameClientPermissionLink -} diff --git a/web/models/coupon.gen.go b/web/models/coupon.gen.go deleted file mode 100644 index 3990297..0000000 --- a/web/models/coupon.gen.go +++ /dev/null @@ -1,34 +0,0 @@ -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. - -package models - -import ( - "platform/web/globals/orm" - - "github.com/shopspring/decimal" - "gorm.io/gorm" -) - -const TableNameCoupon = "coupon" - -// Coupon mapped from table -type Coupon struct { - ID int32 `gorm:"column:id;type:integer;primaryKey;autoIncrement:true;comment:优惠券ID" json:"id"` // 优惠券ID - UserID *int32 `gorm:"column:user_id;type:integer;comment:用户ID" json:"user_id"` // 用户ID - Code string `gorm:"column:code;type:character varying(255);not null;comment:优惠券代码" json:"code"` // 优惠券代码 - Remark *string `gorm:"column:remark;type:character varying(255);comment:优惠券备注" json:"remark"` // 优惠券备注 - Amount decimal.Decimal `gorm:"column:amount;type:numeric(12,2);not null;comment:优惠券金额" json:"amount"` // 优惠券金额 - MinAmount decimal.Decimal `gorm:"column:min_amount;type:numeric(12,2);not null;comment:最低消费金额" json:"min_amount"` // 最低消费金额 - Status int32 `gorm:"column:status;type:integer;not null;comment:优惠券状态:0-未使用,1-已使用,2-已过期" json:"status"` // 优惠券状态:0-未使用,1-已使用,2-已过期 - ExpireAt *orm.LocalDateTime `gorm:"column:expire_at;type:timestamp without time zone;comment:过期时间" json:"expire_at"` // 过期时间 - CreatedAt *orm.LocalDateTime `gorm:"column:created_at;type:timestamp without time zone;default:CURRENT_TIMESTAMP;comment:创建时间" json:"created_at"` // 创建时间 - UpdatedAt *orm.LocalDateTime `gorm:"column:updated_at;type:timestamp without time zone;default:CURRENT_TIMESTAMP;comment:更新时间" json:"updated_at"` // 更新时间 - DeletedAt gorm.DeletedAt `gorm:"column:deleted_at;type:timestamp without time zone;comment:删除时间" json:"deleted_at"` // 删除时间 -} - -// TableName Coupon's table name -func (*Coupon) TableName() string { - return TableNameCoupon -} diff --git a/web/models/coupon.go b/web/models/coupon.go new file mode 100644 index 0000000..6d543c3 --- /dev/null +++ b/web/models/coupon.go @@ -0,0 +1,29 @@ +package models + +import ( + "platform/web/core" + "time" + + "github.com/shopspring/decimal" +) + +// Coupon 优惠券表 +type Coupon struct { + core.Model + UserID *int32 `json:"user_id" gorm:"column:user_id"` // 用户ID + Code string `json:"code" gorm:"column:code"` // 优惠券代码 + Remark *string `json:"remark" gorm:"column:remark"` // 优惠券备注 + Amount decimal.Decimal `json:"amount" gorm:"column:amount"` // 优惠券金额 + MinAmount decimal.Decimal `json:"min_amount" gorm:"column:min_amount"` // 最低消费金额 + Status CouponStatus `json:"status" gorm:"column:status"` // 优惠券状态:0-未使用,1-已使用,2-已过期 + ExpireAt *time.Time `json:"expire_at" gorm:"column:expire_at"` // 过期时间 +} + +// CouponStatus 优惠券状态枚举 +type CouponStatus int + +const ( + CouponStatusUnused CouponStatus = 0 // 未使用 + CouponStatusUsed CouponStatus = 1 // 已使用 + CouponStatusExpired CouponStatus = 2 // 已过期 +) diff --git a/web/models/edge.gen.go b/web/models/edge.gen.go deleted file mode 100644 index 747c07f..0000000 --- a/web/models/edge.gen.go +++ /dev/null @@ -1,38 +0,0 @@ -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. - -package models - -import ( - "platform/web/globals/orm" - - "gorm.io/gorm" -) - -const TableNameEdge = "edge" - -// Edge mapped from table -type Edge struct { - ID int32 `gorm:"column:id;type:integer;primaryKey;autoIncrement:true;comment:节点ID" json:"id"` // 节点ID - ProxyID *int32 `gorm:"column:proxy_id;type:integer;comment:代理ID" json:"proxy_id"` // 代理ID - Type int32 `gorm:"column:type;type:integer;not null;comment:节点类型:1-自建" json:"type"` // 节点类型:1-自建 - Version int32 `gorm:"column:version;type:integer;not null;comment:节点版本" json:"version"` // 节点版本 - Name string `gorm:"column:name;type:character varying(255);not null;comment:节点名称" json:"name"` // 节点名称 - Host string `gorm:"column:host;type:character varying(255);not null;comment:节点地址" json:"host"` // 节点地址 - Isp int32 `gorm:"column:isp;type:integer;not null;comment:运营商:0-未知,1-电信,2-联通,3-移动" json:"isp"` // 运营商:0-未知,1-电信,2-联通,3-移动 - Prov string `gorm:"column:prov;type:character varying(255);not null;comment:省份" json:"prov"` // 省份 - City string `gorm:"column:city;type:character varying(255);not null;comment:城市" json:"city"` // 城市 - ProxyPort *int32 `gorm:"column:proxy_port;type:integer;comment:代理端口" json:"proxy_port"` // 代理端口 - Status int32 `gorm:"column:status;type:integer;not null;comment:节点状态:0-离线,1-正常" json:"status"` // 节点状态:0-离线,1-正常 - Rtt *int32 `gorm:"column:rtt;type:integer;comment:最近平均延迟" json:"rtt"` // 最近平均延迟 - Loss *int32 `gorm:"column:loss;type:integer;comment:最近丢包率" json:"loss"` // 最近丢包率 - CreatedAt *orm.LocalDateTime `gorm:"column:created_at;type:timestamp without time zone;default:CURRENT_TIMESTAMP;comment:创建时间" json:"created_at"` // 创建时间 - UpdatedAt *orm.LocalDateTime `gorm:"column:updated_at;type:timestamp without time zone;default:CURRENT_TIMESTAMP;comment:更新时间" json:"updated_at"` // 更新时间 - DeletedAt gorm.DeletedAt `gorm:"column:deleted_at;type:timestamp without time zone;comment:删除时间" json:"deleted_at"` // 删除时间 -} - -// TableName Edge's table name -func (*Edge) TableName() string { - return TableNameEdge -} diff --git a/web/models/edge.go b/web/models/edge.go new file mode 100644 index 0000000..c10c042 --- /dev/null +++ b/web/models/edge.go @@ -0,0 +1,65 @@ +package models + +import ( + "platform/web/core" + "platform/web/globals/orm" +) + +// Edge 节点表 +type Edge struct { + core.Model + Type EdgeType `json:"type" gorm:"column:type"` // 节点类型:1-自建 + Version int32 `json:"version" gorm:"column:version"` // 节点版本 + Mac string `json:"mac" gorm:"column:mac"` // 节点 mac 地址 + IP orm.Inet `json:"ip" gorm:"column:ip;not null"` // 节点地址 + ISP EdgeISP `json:"isp" gorm:"column:isp"` // 运营商:0-未知,1-电信,2-联通,3-移动 + Prov string `json:"prov" gorm:"column:prov"` // 省份 + City string `json:"city" gorm:"column:city"` // 城市 + Status EdgeStatus `json:"status" gorm:"column:status"` // 节点状态:0-离线,1-正常 + RTT int32 `json:"rtt" gorm:"column:rtt"` // 最近平均延迟 + Loss int32 `json:"loss" gorm:"column:loss"` // 最近丢包率 +} + +// EdgeType 节点类型枚举 +type EdgeType int + +const ( + EdgeTypeSelfBuilt EdgeType = 1 // 自建 +) + +// EdgeStatus 节点状态枚举 +type EdgeStatus int + +const ( + EdgeStatusOffline EdgeStatus = 0 // 离线 + EdgeStatusNormal EdgeStatus = 1 // 正常 +) + +// EdgeISP 运营商枚举 +type EdgeISP int + +const ( + EdgeISPTelecom EdgeISP = 1 // 电信 + EdgeISPUnicom EdgeISP = 2 // 联通 + EdgeISPMobile EdgeISP = 3 // 移动 +) + +func (isp *EdgeISP) String() string { + if isp == nil { + return "" + } + switch *isp { + case EdgeISPTelecom: + return "电信" + case EdgeISPUnicom: + return "联通" + case EdgeISPMobile: + return "移动" + default: + return "" + } +} + +func ToEdgeISP(i int) EdgeISP { + return EdgeISP(i) +} diff --git a/web/models/link_admin_role.go b/web/models/link_admin_role.go new file mode 100644 index 0000000..5b5ffa7 --- /dev/null +++ b/web/models/link_admin_role.go @@ -0,0 +1,8 @@ +package models + +// LinkAdminRole 管理员角色关联表 +type LinkAdminRole struct { + ID int32 `json:"id" gorm:"column:id"` // 关联ID + AdminID int32 `json:"admin_id" gorm:"column:admin_id"` // 管理员ID + RoleID int32 `json:"role_id" gorm:"column:role_id"` // 角色ID +} diff --git a/web/models/link_admin_role_permission.go b/web/models/link_admin_role_permission.go new file mode 100644 index 0000000..6ddbeb4 --- /dev/null +++ b/web/models/link_admin_role_permission.go @@ -0,0 +1,8 @@ +package models + +// LinkAdminRolePermission 管理员角色权限关联表 +type LinkAdminRolePermission struct { + ID int32 `json:"id" gorm:"column:id"` // 关联ID + RoleID int32 `json:"role_id" gorm:"column:role_id"` // 角色ID + PermissionID int32 `json:"permission_id" gorm:"column:permission_id"` // 权限ID +} diff --git a/web/models/link_client_permission.go b/web/models/link_client_permission.go new file mode 100644 index 0000000..3be60c9 --- /dev/null +++ b/web/models/link_client_permission.go @@ -0,0 +1,8 @@ +package models + +// LinkClientPermission 客户端权限关联表 +type LinkClientPermission struct { + ID int32 `json:"id" gorm:"column:id"` // 关联ID + ClientID int32 `json:"client_id" gorm:"column:client_id"` // 客户端ID + PermissionID int32 `json:"permission_id" gorm:"column:permission_id"` // 权限ID +} diff --git a/web/models/link_user_role.go b/web/models/link_user_role.go new file mode 100644 index 0000000..8141918 --- /dev/null +++ b/web/models/link_user_role.go @@ -0,0 +1,8 @@ +package models + +// LinkUserRole 用户角色关联表 +type LinkUserRole struct { + ID int32 `json:"id" gorm:"column:id"` // 关联ID + UserID int32 `json:"user_id" gorm:"column:user_id"` // 用户ID + RoleID int32 `json:"role_id" gorm:"column:role_id"` // 角色ID +} diff --git a/web/models/link_user_role_permission.go b/web/models/link_user_role_permission.go new file mode 100644 index 0000000..994c7c7 --- /dev/null +++ b/web/models/link_user_role_permission.go @@ -0,0 +1,8 @@ +package models + +// LinkUserRolePermission 用户角色权限关联表 +type LinkUserRolePermission struct { + ID int32 `json:"id" gorm:"column:id"` // 关联ID + RoleID int32 `json:"role_id" gorm:"column:role_id"` // 角色ID + PermissionID int32 `json:"permission_id" gorm:"column:permission_id"` // 权限ID +} diff --git a/web/models/logs_login.gen.go b/web/models/logs_login.gen.go deleted file mode 100644 index b2111b9..0000000 --- a/web/models/logs_login.gen.go +++ /dev/null @@ -1,26 +0,0 @@ -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. - -package models - -import "platform/web/globals/orm" - -const TableNameLogsLogin = "logs_login" - -// LogsLogin mapped from table -type LogsLogin struct { - ID int32 `gorm:"column:id;type:integer;primaryKey;autoIncrement:true;comment:登录日志ID" json:"id"` // 登录日志ID - IP string `gorm:"column:ip;type:character varying(45);not null;comment:IP地址" json:"ip"` // IP地址 - UA string `gorm:"column:ua;type:character varying(255);not null;comment:用户代理" json:"ua"` // 用户代理 - GrantType string `gorm:"column:grant_type;type:character varying(255);not null;comment:授权类型:authorization_code-授权码模式,client_credentials-客户端凭证模式,refresh_token-刷新令牌模式,password-密码模式" json:"grant_type"` // 授权类型:authorization_code-授权码模式,client_credentials-客户端凭证模式,refresh_token-刷新令牌模式,password-密码模式 - PasswordGrantType string `gorm:"column:password_grant_type;type:character varying(255);not null;comment:密码模式子授权类型:password-账号密码,phone_code-手机验证码,email_code-邮箱验证码" json:"password_grant_type"` // 密码模式子授权类型:password-账号密码,phone_code-手机验证码,email_code-邮箱验证码 - Success bool `gorm:"column:success;type:boolean;not null;comment:登录是否成功" json:"success"` // 登录是否成功 - UserID *int32 `gorm:"column:user_id;type:integer;comment:用户ID" json:"user_id"` // 用户ID - Time orm.LocalDateTime `gorm:"column:time;type:timestamp without time zone;not null;comment:登录时间" json:"time"` // 登录时间 -} - -// TableName LogsLogin's table name -func (*LogsLogin) TableName() string { - return TableNameLogsLogin -} diff --git a/web/models/logs_login.go b/web/models/logs_login.go new file mode 100644 index 0000000..d76ef79 --- /dev/null +++ b/web/models/logs_login.go @@ -0,0 +1,39 @@ +package models + +import ( + "platform/web/globals/orm" + "time" +) + +// LogsLogin 登录日志表 +type LogsLogin struct { + ID int32 `json:"id" gorm:"column:id"` // 登录日志ID + IP orm.Inet `json:"ip" gorm:"column:ip;not null"` // IP地址 + UA string `json:"ua" gorm:"column:ua"` // 用户代理 + GrantType GrantType `json:"grant_type" gorm:"column:grant_type"` // 授权类型 + PasswordType PasswordType `json:"password_type" gorm:"column:password_type"` // 密码模式子授权类型 + Success bool `json:"success" gorm:"column:success"` // 登录是否成功 + UserID *int32 `json:"user_id" gorm:"column:user_id"` // 用户ID + Time time.Time `json:"time" gorm:"column:time"` // 登录时间 + + User *User `json:"user" gorm:"foreignKey:UserID"` +} + +// GrantType 授权类型枚举 +type GrantType string + +const ( + GrantTypeAuthorizationCode GrantType = "authorization_code" // 授权码模式 + GrantTypeClientCredentials GrantType = "client_credentials" // 客户端凭证模式 + GrantTypeRefreshToken GrantType = "refresh_token" // 刷新令牌模式 + GrantTypePassword GrantType = "password" // 密码模式 +) + +// PasswordType 密码模式子授权类型枚举 +type PasswordType string + +const ( + PasswordTypePassword PasswordType = "password" // 账号密码 + PasswordTypePhoneCode PasswordType = "phone_code" // 手机验证码 + PasswordTypeEmailCode PasswordType = "email_code" // 邮箱验证码 +) diff --git a/web/models/logs_request.gen.go b/web/models/logs_request.gen.go deleted file mode 100644 index 0c828ca..0000000 --- a/web/models/logs_request.gen.go +++ /dev/null @@ -1,29 +0,0 @@ -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. - -package models - -import "platform/web/globals/orm" - -const TableNameLogsRequest = "logs_request" - -// LogsRequest mapped from table -type LogsRequest struct { - ID int32 `gorm:"column:id;type:integer;primaryKey;autoIncrement:true;comment:访问日志ID" json:"id"` // 访问日志ID - IP string `gorm:"column:ip;type:character varying(45);not null;comment:IP地址" json:"ip"` // IP地址 - UA string `gorm:"column:ua;type:character varying(255);not null;comment:用户代理" json:"ua"` // 用户代理 - UserID *int32 `gorm:"column:user_id;type:integer;comment:用户ID" json:"user_id"` // 用户ID - ClientID *int32 `gorm:"column:client_id;type:integer;comment:客户端ID" json:"client_id"` // 客户端ID - Method string `gorm:"column:method;type:character varying(10);not null;comment:请求方法" json:"method"` // 请求方法 - Path string `gorm:"column:path;type:character varying(255);not null;comment:请求路径" json:"path"` // 请求路径 - Status int32 `gorm:"column:status;type:integer;not null;comment:响应状态码" json:"status"` // 响应状态码 - Error *string `gorm:"column:error;type:text;comment:错误信息" json:"error"` // 错误信息 - Time orm.LocalDateTime `gorm:"column:time;type:timestamp without time zone;not null;comment:请求时间" json:"time"` // 请求时间 - Latency string `gorm:"column:latency;type:character varying(255);not null;comment:请求延迟" json:"latency"` // 请求延迟 -} - -// TableName LogsRequest's table name -func (*LogsRequest) TableName() string { - return TableNameLogsRequest -} diff --git a/web/models/logs_request.go b/web/models/logs_request.go new file mode 100644 index 0000000..cd6c643 --- /dev/null +++ b/web/models/logs_request.go @@ -0,0 +1,24 @@ +package models + +import ( + "platform/web/globals/orm" + "time" +) + +// LogsRequest 访问日志表 +type LogsRequest struct { + ID int32 `json:"id" gorm:"column:id"` // 访问日志ID + IP orm.Inet `json:"ip" gorm:"column:ip;not null"` // IP地址 + UA string `json:"ua" gorm:"column:ua"` // 用户代理 + UserID *int32 `json:"user_id" gorm:"column:user_id"` // 用户ID + ClientID *int32 `json:"client_id" gorm:"column:client_id"` // 客户端ID + Method string `json:"method" gorm:"column:method"` // 请求方法 + Path string `json:"path" gorm:"column:path"` // 请求路径 + Status int16 `json:"status" gorm:"column:status"` // 响应状态码 + Error *string `json:"error" gorm:"column:error"` // 错误信息 + Time time.Time `json:"time" gorm:"column:time"` // 请求时间 + Latency string `json:"latency" gorm:"column:latency"` // 请求延迟 + + User *User `json:"user" gorm:"foreignKey:UserID"` + Client *Client `json:"client" gorm:"foreignKey:ClientID"` +} diff --git a/web/models/logs_user_bandwidth.gen.go b/web/models/logs_user_bandwidth.gen.go deleted file mode 100644 index f4e4c94..0000000 --- a/web/models/logs_user_bandwidth.gen.go +++ /dev/null @@ -1,22 +0,0 @@ -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. - -package models - -import "platform/web/globals/orm" - -const TableNameLogsUserBandwidth = "logs_user_bandwidth" - -// LogsUserBandwidth mapped from table -type LogsUserBandwidth struct { - ID int32 `gorm:"column:id;type:integer;primaryKey;autoIncrement:true;comment:日志ID" json:"id"` // 日志ID - UserID int32 `gorm:"column:user_id;type:integer;not null;comment:用户ID" json:"user_id"` // 用户ID - Bandwidth int32 `gorm:"column:bandwidth;type:integer;not null;comment:带宽使用量(KB)" json:"bandwidth"` // 带宽使用量(KB) - Time orm.LocalDateTime `gorm:"column:time;type:timestamp without time zone;not null;comment:记录时间" json:"time"` // 记录时间 -} - -// TableName LogsUserBandwidth's table name -func (*LogsUserBandwidth) TableName() string { - return TableNameLogsUserBandwidth -} diff --git a/web/models/logs_user_bandwidth.go b/web/models/logs_user_bandwidth.go new file mode 100644 index 0000000..6c69b50 --- /dev/null +++ b/web/models/logs_user_bandwidth.go @@ -0,0 +1,13 @@ +package models + +import ( + "time" +) + +// LogsUserBandwidth 用户带宽日志表 +type LogsUserBandwidth struct { + ID int32 `json:"id" gorm:"column:id;not null"` // 日志ID + UserID int32 `json:"user_id" gorm:"column:user_id"` // 用户ID + Bandwidth int32 `json:"bandwidth" gorm:"column:bandwidth"` // 带宽使用量(KB) + Time time.Time `json:"time" gorm:"column:time"` // 记录时间 +} diff --git a/web/models/logs_user_usage.gen.go b/web/models/logs_user_usage.gen.go deleted file mode 100644 index 8ab6f05..0000000 --- a/web/models/logs_user_usage.gen.go +++ /dev/null @@ -1,27 +0,0 @@ -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. - -package models - -import "platform/web/globals/orm" - -const TableNameLogsUserUsage = "logs_user_usage" - -// LogsUserUsage mapped from table -type LogsUserUsage struct { - ID int32 `gorm:"column:id;type:integer;primaryKey;autoIncrement:true;comment:日志ID" json:"id"` // 日志ID - UserID int32 `gorm:"column:user_id;type:integer;not null;comment:用户ID" json:"user_id"` // 用户ID - ResourceID int32 `gorm:"column:resource_id;type:integer;not null;comment:套餐ID" json:"resource_id"` // 套餐ID - Count_ int32 `gorm:"column:count;type:integer;not null;comment:数量" json:"count"` // 数量 - Prov *string `gorm:"column:prov;type:character varying(255);comment:省份" json:"prov"` // 省份 - City *string `gorm:"column:city;type:character varying(255);comment:城市" json:"city"` // 城市 - Isp *string `gorm:"column:isp;type:character varying(255);comment:运营商" json:"isp"` // 运营商 - IP string `gorm:"column:ip;type:character varying(45);not null;comment:IP地址" json:"ip"` // IP地址 - Time orm.LocalDateTime `gorm:"column:time;type:timestamp without time zone;not null;comment:提取时间" json:"time"` // 提取时间 -} - -// TableName LogsUserUsage's table name -func (*LogsUserUsage) TableName() string { - return TableNameLogsUserUsage -} diff --git a/web/models/logs_user_usage.go b/web/models/logs_user_usage.go new file mode 100644 index 0000000..e7409ff --- /dev/null +++ b/web/models/logs_user_usage.go @@ -0,0 +1,19 @@ +package models + +import ( + "platform/web/globals/orm" + "time" +) + +// LogsUserUsage 用户使用日志表 +type LogsUserUsage struct { + ID int32 `json:"id" gorm:"column:id"` // 日志ID + UserID int32 `json:"user_id" gorm:"column:user_id"` // 用户ID + ResourceID int32 `json:"resource_id" gorm:"column:resource_id"` // 套餐ID + Count int32 `json:"count" gorm:"column:count"` // 数量 + Prov *string `json:"prov" gorm:"column:prov"` // 省份 + City *string `json:"city" gorm:"column:city"` // 城市 + ISP *string `json:"isp" gorm:"column:isp"` // 运营商 + IP orm.Inet `json:"ip" gorm:"column:ip"` // IP地址 + Time time.Time `json:"time" gorm:"column:time"` // 提取时间 +} diff --git a/web/models/permission.gen.go b/web/models/permission.gen.go deleted file mode 100644 index 0f30db7..0000000 --- a/web/models/permission.gen.go +++ /dev/null @@ -1,29 +0,0 @@ -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. - -package models - -import ( - "platform/web/globals/orm" - - "gorm.io/gorm" -) - -const TableNamePermission = "permission" - -// Permission mapped from table -type Permission struct { - ID int32 `gorm:"column:id;type:integer;primaryKey;autoIncrement:true;comment:权限ID" json:"id"` // 权限ID - ParentID *int32 `gorm:"column:parent_id;type:integer;comment:父权限ID" json:"parent_id"` // 父权限ID - Name string `gorm:"column:name;type:character varying(255);not null;comment:权限名称" json:"name"` // 权限名称 - Description *string `gorm:"column:description;type:character varying(255);comment:权限描述" json:"description"` // 权限描述 - CreatedAt *orm.LocalDateTime `gorm:"column:created_at;type:timestamp without time zone;default:CURRENT_TIMESTAMP;comment:创建时间" json:"created_at"` // 创建时间 - UpdatedAt *orm.LocalDateTime `gorm:"column:updated_at;type:timestamp without time zone;default:CURRENT_TIMESTAMP;comment:更新时间" json:"updated_at"` // 更新时间 - DeletedAt gorm.DeletedAt `gorm:"column:deleted_at;type:timestamp without time zone;comment:删除时间" json:"deleted_at"` // 删除时间 -} - -// TableName Permission's table name -func (*Permission) TableName() string { - return TableNamePermission -} diff --git a/web/models/permission.go b/web/models/permission.go new file mode 100644 index 0000000..7f07191 --- /dev/null +++ b/web/models/permission.go @@ -0,0 +1,14 @@ +package models + +import "platform/web/core" + +// Permission 权限表 +type Permission struct { + core.Model + ParentID *int32 `json:"parent_id" gorm:"column:parent_id"` // 父权限ID + Name string `json:"name" gorm:"column:name"` // 权限名称 + Description *string `json:"description" gorm:"column:description"` // 权限描述 + + Parent *Permission `json:"parent" gorm:"foreignKey:ParentID"` + Children []*Permission `json:"children" gorm:"foreignKey:ParentID"` +} diff --git a/web/models/product.gen.go b/web/models/product.gen.go deleted file mode 100644 index a8bf6e9..0000000 --- a/web/models/product.gen.go +++ /dev/null @@ -1,31 +0,0 @@ -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. - -package models - -import ( - "platform/web/globals/orm" - - "gorm.io/gorm" -) - -const TableNameProduct = "product" - -// Product mapped from table -type Product struct { - ID int32 `gorm:"column:id;type:integer;primaryKey;autoIncrement:true;comment:产品ID" json:"id"` // 产品ID - Code string `gorm:"column:code;type:character varying(255);not null;comment:产品代码" json:"code"` // 产品代码 - Name string `gorm:"column:name;type:character varying(255);not null;comment:产品名称" json:"name"` // 产品名称 - Description *string `gorm:"column:description;type:character varying(255);comment:产品描述" json:"description"` // 产品描述 - Sort int32 `gorm:"column:sort;type:integer;not null;comment:排序" json:"sort"` // 排序 - Status int32 `gorm:"column:status;type:integer;not null;default:1;comment:产品状态:0-禁用,1-正常" json:"status"` // 产品状态:0-禁用,1-正常 - CreatedAt *orm.LocalDateTime `gorm:"column:created_at;type:timestamp without time zone;default:CURRENT_TIMESTAMP;comment:创建时间" json:"created_at"` // 创建时间 - UpdatedAt *orm.LocalDateTime `gorm:"column:updated_at;type:timestamp without time zone;default:CURRENT_TIMESTAMP;comment:更新时间" json:"updated_at"` // 更新时间 - DeletedAt gorm.DeletedAt `gorm:"column:deleted_at;type:timestamp without time zone;comment:删除时间" json:"deleted_at"` // 删除时间 -} - -// TableName Product's table name -func (*Product) TableName() string { - return TableNameProduct -} diff --git a/web/models/product.go b/web/models/product.go new file mode 100644 index 0000000..c1d578c --- /dev/null +++ b/web/models/product.go @@ -0,0 +1,23 @@ +package models + +import ( + "platform/web/core" +) + +// Product 产品表 +type Product struct { + core.Model + Code string `json:"code" gorm:"column:code"` // 产品代码 + Name string `json:"name" gorm:"column:name"` // 产品名称 + Description *string `json:"description" gorm:"column:description"` // 产品描述 + Sort int32 `json:"sort" gorm:"column:sort"` // 排序 + Status ProductStatus `json:"status" gorm:"column:status"` // 产品状态:0-禁用,1-正常 +} + +// ProductStatus 产品状态枚举 +type ProductStatus int + +const ( + ProductStatusDisabled ProductStatus = 0 // 禁用 + ProductStatusEnabled ProductStatus = 1 // 正常 +) diff --git a/web/models/proxy.gen.go b/web/models/proxy.gen.go deleted file mode 100644 index 2a78abe..0000000 --- a/web/models/proxy.gen.go +++ /dev/null @@ -1,33 +0,0 @@ -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. - -package models - -import ( - "platform/web/globals/orm" - - "gorm.io/gorm" -) - -const TableNameProxy = "proxy" - -// Proxy mapped from table -type Proxy struct { - ID int32 `gorm:"column:id;type:integer;primaryKey;autoIncrement:true;comment:代理服务ID" json:"id"` // 代理服务ID - Version int32 `gorm:"column:version;type:integer;not null;comment:代理服务版本" json:"version"` // 代理服务版本 - Name string `gorm:"column:name;type:character varying(255);not null;comment:代理服务名称" json:"name"` // 代理服务名称 - Host string `gorm:"column:host;type:character varying(255);not null;comment:代理服务地址" json:"host"` // 代理服务地址 - Secret *string `gorm:"column:secret;type:character varying(255);comment:代理服务密钥" json:"secret"` // 代理服务密钥 - Type int32 `gorm:"column:type;type:integer;not null;comment:代理服务类型:1-三方,2-自有" json:"type"` // 代理服务类型:1-三方,2-自有 - Status int32 `gorm:"column:status;type:integer;not null;comment:代理服务状态:0-离线,1-在线" json:"status"` // 代理服务状态:0-离线,1-在线 - CreatedAt *orm.LocalDateTime `gorm:"column:created_at;type:timestamp without time zone;default:CURRENT_TIMESTAMP;comment:创建时间" json:"created_at"` // 创建时间 - UpdatedAt *orm.LocalDateTime `gorm:"column:updated_at;type:timestamp without time zone;default:CURRENT_TIMESTAMP;comment:更新时间" json:"updated_at"` // 更新时间 - DeletedAt gorm.DeletedAt `gorm:"column:deleted_at;type:timestamp without time zone;comment:删除时间" json:"deleted_at"` // 删除时间 - Edges []Edge `gorm:"foreignKey:ProxyID;references:ID" json:"edges"` -} - -// TableName Proxy's table name -func (*Proxy) TableName() string { - return TableNameProxy -} diff --git a/web/models/proxy.go b/web/models/proxy.go new file mode 100644 index 0000000..52d9bda --- /dev/null +++ b/web/models/proxy.go @@ -0,0 +1,38 @@ +package models + +import ( + "platform/web/core" + "platform/web/globals/orm" + + "gorm.io/datatypes" +) + +// Proxy 代理服务表 +type Proxy struct { + core.Model + Version int32 `json:"version" gorm:"column:version"` // 代理服务版本 + Mac string `json:"mac" gorm:"column:mac"` // 代理服务名称 + IP orm.Inet `json:"ip" gorm:"column:ip;not null"` // 代理服务地址 + Secret *string `json:"secret" gorm:"column:secret"` // 代理服务密钥 + Type ProxyType `json:"type" gorm:"column:type"` // 代理服务类型:1-自有,2-白银 + Status ProxyStatus `json:"status" gorm:"column:status"` // 代理服务状态:0-离线,1-在线 + Meta *datatypes.JSONType[any] `json:"meta" gorm:"column:meta"` // 代理服务元信息 + + Channels []Channel `json:"channels" gorm:"foreignkey:ProxyID"` +} + +// ProxyType 代理服务类型枚举 +type ProxyType int + +const ( + ProxyTypeSelfHosted ProxyType = 1 // 自有 + ProxyTypeBaiYin ProxyType = 2 // 白银 +) + +// ProxyStatus 代理服务状态枚举 +type ProxyStatus int + +const ( + ProxyStatusOffline ProxyStatus = 0 // 离线 + ProxyStatusOnline ProxyStatus = 1 // 在线 +) diff --git a/web/models/refund.gen.go b/web/models/refund.gen.go deleted file mode 100644 index 3fa488c..0000000 --- a/web/models/refund.gen.go +++ /dev/null @@ -1,32 +0,0 @@ -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. - -package models - -import ( - "platform/web/globals/orm" - - "github.com/shopspring/decimal" - "gorm.io/gorm" -) - -const TableNameRefund = "refund" - -// Refund mapped from table -type Refund struct { - ID int32 `gorm:"column:id;type:integer;primaryKey;autoIncrement:true;comment:退款ID" json:"id"` // 退款ID - TradeID int32 `gorm:"column:trade_id;type:integer;not null;comment:订单ID" json:"trade_id"` // 订单ID - ProductID *int32 `gorm:"column:product_id;type:integer;comment:产品ID" json:"product_id"` // 产品ID - Amount decimal.Decimal `gorm:"column:amount;type:numeric(12,2);not null;comment:退款金额" json:"amount"` // 退款金额 - Reason *string `gorm:"column:reason;type:character varying(255);comment:退款原因" json:"reason"` // 退款原因 - Status int32 `gorm:"column:status;type:integer;not null;comment:退款状态:0-待处理,1-已退款,2-已拒绝" json:"status"` // 退款状态:0-待处理,1-已退款,2-已拒绝 - CreatedAt *orm.LocalDateTime `gorm:"column:created_at;type:timestamp without time zone;default:CURRENT_TIMESTAMP;comment:创建时间" json:"created_at"` // 创建时间 - UpdatedAt *orm.LocalDateTime `gorm:"column:updated_at;type:timestamp without time zone;default:CURRENT_TIMESTAMP;comment:更新时间" json:"updated_at"` // 更新时间 - DeletedAt gorm.DeletedAt `gorm:"column:deleted_at;type:timestamp without time zone;comment:删除时间" json:"deleted_at"` // 删除时间 -} - -// TableName Refund's table name -func (*Refund) TableName() string { - return TableNameRefund -} diff --git a/web/models/refund.go b/web/models/refund.go new file mode 100644 index 0000000..91bb83e --- /dev/null +++ b/web/models/refund.go @@ -0,0 +1,26 @@ +package models + +import ( + "platform/web/core" + + "github.com/shopspring/decimal" +) + +// Refund 退款记录表 +type Refund struct { + core.Model + TradeID int32 `json:"trade_id" gorm:"column:trade_id"` // 订单ID + ProductID *int32 `json:"product_id" gorm:"column:product_id"` // 产品ID + Amount decimal.Decimal `json:"amount" gorm:"column:amount"` // 退款金额 + Reason *string `json:"reason" gorm:"column:reason"` // 退款原因 + Status RefundStatus `json:"status" gorm:"column:status"` // 退款状态:0-待处理,1-已退款,2-已拒绝 +} + +// RefundStatus 退款状态枚举 +type RefundStatus int + +const ( + RefundStatusPending RefundStatus = 0 // 待处理 + RefundStatusRefunded RefundStatus = 1 // 已退款 + RefundStatusRejected RefundStatus = 2 // 已拒绝 +) diff --git a/web/models/resource.gen.go b/web/models/resource.gen.go deleted file mode 100644 index 57534a8..0000000 --- a/web/models/resource.gen.go +++ /dev/null @@ -1,32 +0,0 @@ -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. - -package models - -import ( - "platform/web/globals/orm" - - "gorm.io/gorm" -) - -const TableNameResource = "resource" - -// Resource mapped from table -type Resource struct { - ID int32 `gorm:"column:id;type:integer;primaryKey;autoIncrement:true;comment:套餐ID" json:"id"` // 套餐ID - UserID int32 `gorm:"column:user_id;type:integer;not null;comment:用户ID" json:"user_id"` // 用户ID - ResourceNo *string `gorm:"column:resource_no;type:character varying(255);comment:套餐编号" json:"resource_no"` // 套餐编号 - Active bool `gorm:"column:active;type:boolean;not null;default:true;comment:套餐状态" json:"active"` // 套餐状态 - Type int32 `gorm:"column:type;type:integer;not null;comment:套餐类型:1-短效动态,2-长效动态" json:"type"` // 套餐类型:1-短效动态,2-长效动态 - CreatedAt *orm.LocalDateTime `gorm:"column:created_at;type:timestamp without time zone;default:CURRENT_TIMESTAMP;comment:创建时间" json:"created_at"` // 创建时间 - UpdatedAt *orm.LocalDateTime `gorm:"column:updated_at;type:timestamp without time zone;default:CURRENT_TIMESTAMP;comment:更新时间" json:"updated_at"` // 更新时间 - DeletedAt gorm.DeletedAt `gorm:"column:deleted_at;type:timestamp without time zone;comment:删除时间" json:"deleted_at"` // 删除时间 - Short *ResourceShort `gorm:"foreignKey:ResourceID;references:ID" json:"short"` - Long *ResourceLong `gorm:"foreignKey:ResourceID;references:ID" json:"long"` -} - -// TableName Resource's table name -func (*Resource) TableName() string { - return TableNameResource -} diff --git a/web/models/resource.go b/web/models/resource.go new file mode 100644 index 0000000..1b76cee --- /dev/null +++ b/web/models/resource.go @@ -0,0 +1,34 @@ +package models + +import ( + "platform/web/core" +) + +// Resource 套餐表 +type Resource struct { + core.Model + UserID int32 `json:"user_id" gorm:"column:user_id"` // 用户ID + ResourceNo *string `json:"resource_no" gorm:"column:resource_no"` // 套餐编号 + Active bool `json:"active" gorm:"column:active"` // 套餐状态 + Type ResourceType `json:"type" gorm:"column:type"` // 套餐类型:1-短效动态,2-长效动态 + + User User `json:"user" gorm:"foreignKey:UserID"` + Short *ResourceShort `json:"short" gorm:"foreignKey:ResourceID"` + Long *ResourceLong `json:"long" gorm:"foreignKey:ResourceID"` +} + +// ResourceType 套餐类型枚举 +type ResourceType int + +const ( + ResourceTypeShort ResourceType = 1 // 短效动态 + ResourceTypeLong ResourceType = 2 // 长效动态 +) + +// ResourceLongType 套餐计费模式枚举 +type ResourceMode int + +const ( + ResourceModeTime ResourceMode = 1 // 包时 + ResourceModeQuota ResourceMode = 2 // 包量 +) diff --git a/web/models/resource_long.gen.go b/web/models/resource_long.gen.go deleted file mode 100644 index 67ab73f..0000000 --- a/web/models/resource_long.gen.go +++ /dev/null @@ -1,28 +0,0 @@ -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. - -package models - -import "platform/web/globals/orm" - -const TableNameResourceLong = "resource_long" - -// ResourceLong mapped from table -type ResourceLong struct { - ID int32 `gorm:"column:id;type:integer;primaryKey;autoIncrement:true;comment:ID" json:"id"` // ID - ResourceID int32 `gorm:"column:resource_id;type:integer;not null;comment:套餐ID" json:"resource_id"` // 套餐ID - Type int32 `gorm:"column:type;type:integer;not null;comment:套餐类型:1-包时,2-包量" json:"type"` // 套餐类型:1-包时,2-包量 - Live int32 `gorm:"column:live;type:integer;not null;comment:可用时长(天)" json:"live"` // 可用时长(天) - Expire *orm.LocalDateTime `gorm:"column:expire;type:timestamp without time zone;comment:过期时间" json:"expire"` // 过期时间 - Quota *int32 `gorm:"column:quota;type:integer;comment:配额数量" json:"quota"` // 配额数量 - Used int32 `gorm:"column:used;type:integer;not null;comment:已用数量" json:"used"` // 已用数量 - DailyLimit int32 `gorm:"column:daily_limit;type:integer;not null;comment:每日限制" json:"daily_limit"` // 每日限制 - DailyUsed int32 `gorm:"column:daily_used;type:integer;not null;comment:今日已用数量" json:"daily_used"` // 今日已用数量 - DailyLast *orm.LocalDateTime `gorm:"column:daily_last;type:timestamp without time zone;comment:今日最后使用时间" json:"daily_last"` // 今日最后使用时间 -} - -// TableName ResourceLong's table name -func (*ResourceLong) TableName() string { - return TableNameResourceLong -} diff --git a/web/models/resource_long.go b/web/models/resource_long.go new file mode 100644 index 0000000..ecddf5f --- /dev/null +++ b/web/models/resource_long.go @@ -0,0 +1,19 @@ +package models + +import ( + "time" +) + +// ResourceLong 长效动态套餐表 +type ResourceLong struct { + ID int32 `json:"id" gorm:"column:id"` // ID + ResourceID int32 `json:"resource_id" gorm:"column:resource_id"` // 套餐ID + Type ResourceMode `json:"type" gorm:"column:type"` // 套餐类型:1-包时,2-包量 + Live int32 `json:"live" gorm:"column:live"` // 可用时长(天) + Expire *time.Time `json:"expire" gorm:"column:expire"` // 过期时间 + Quota *int32 `json:"quota" gorm:"column:quota"` // 配额数量 + Used int32 `json:"used" gorm:"column:used"` // 已用数量 + DailyLimit int32 `json:"daily_limit" gorm:"column:daily_limit"` // 每日限制 + DailyUsed int32 `json:"daily_used" gorm:"column:daily_used"` // 今日已用数量 + DailyLast *time.Time `json:"daily_last" gorm:"column:daily_last"` // 今日最后使用时间 +} diff --git a/web/models/resource_short.gen.go b/web/models/resource_short.gen.go deleted file mode 100644 index 2d92af5..0000000 --- a/web/models/resource_short.gen.go +++ /dev/null @@ -1,28 +0,0 @@ -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. - -package models - -import "platform/web/globals/orm" - -const TableNameResourceShort = "resource_short" - -// ResourceShort mapped from table -type ResourceShort struct { - ID int32 `gorm:"column:id;type:integer;primaryKey;autoIncrement:true;comment:ID" json:"id"` // ID - ResourceID int32 `gorm:"column:resource_id;type:integer;not null;comment:套餐ID" json:"resource_id"` // 套餐ID - Type int32 `gorm:"column:type;type:integer;not null;comment:套餐类型:1-包时,2-包量" json:"type"` // 套餐类型:1-包时,2-包量 - Live int32 `gorm:"column:live;type:integer;not null;comment:可用时长(秒)" json:"live"` // 可用时长(秒) - Expire *orm.LocalDateTime `gorm:"column:expire;type:timestamp without time zone;comment:过期时间" json:"expire"` // 过期时间 - Quota *int32 `gorm:"column:quota;type:integer;comment:配额数量" json:"quota"` // 配额数量 - Used int32 `gorm:"column:used;type:integer;not null;comment:已用数量" json:"used"` // 已用数量 - DailyLimit int32 `gorm:"column:daily_limit;type:integer;not null;comment:每日限制" json:"daily_limit"` // 每日限制 - DailyUsed int32 `gorm:"column:daily_used;type:integer;not null;comment:今日已用数量" json:"daily_used"` // 今日已用数量 - DailyLast *orm.LocalDateTime `gorm:"column:daily_last;type:timestamp without time zone;comment:今日最后使用时间" json:"daily_last"` // 今日最后使用时间 -} - -// TableName ResourceShort's table name -func (*ResourceShort) TableName() string { - return TableNameResourceShort -} diff --git a/web/models/resource_short.go b/web/models/resource_short.go new file mode 100644 index 0000000..edc545f --- /dev/null +++ b/web/models/resource_short.go @@ -0,0 +1,19 @@ +package models + +import ( + "time" +) + +// ResourceShort 短效动态套餐表 +type ResourceShort struct { + ID int32 `json:"id" gorm:"column:id"` // ID + ResourceID int32 `json:"resource_id" gorm:"column:resource_id"` // 套餐ID + Type ResourceMode `json:"type" gorm:"column:type"` // 套餐类型:1-包时,2-包量 + Live int32 `json:"live" gorm:"column:live"` // 可用时长(秒) + Expire *time.Time `json:"expire" gorm:"column:expire"` // 过期时间 + Quota *int32 `json:"quota" gorm:"column:quota"` // 配额数量 + Used int32 `json:"used" gorm:"column:used"` // 已用数量 + DailyLimit int32 `json:"daily_limit" gorm:"column:daily_limit"` // 每日限制 + DailyUsed int32 `json:"daily_used" gorm:"column:daily_used"` // 今日已用数量 + DailyLast *time.Time `json:"daily_last" gorm:"column:daily_last"` // 今日最后使用时间 +} diff --git a/web/models/session.gen.go b/web/models/session.gen.go deleted file mode 100644 index f4b2fe5..0000000 --- a/web/models/session.gen.go +++ /dev/null @@ -1,39 +0,0 @@ -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. - -package models - -import ( - "platform/web/globals/orm" - - "gorm.io/gorm" -) - -const TableNameSession = "session" - -// Session mapped from table -type Session struct { - ID int32 `gorm:"column:id;type:integer;primaryKey;autoIncrement:true;comment:会话ID" json:"id"` // 会话ID - UserID *int32 `gorm:"column:user_id;type:integer;comment:用户ID" json:"user_id"` // 用户ID - AdminID *int32 `gorm:"column:admin_id;type:integer;comment:管理员ID" json:"admin_id"` // 管理员ID - ClientID *int32 `gorm:"column:client_id;type:integer;comment:客户端ID" json:"client_id"` // 客户端ID - IP *string `gorm:"column:ip;type:character varying(45);comment:IP地址" json:"ip"` // IP地址 - UA *string `gorm:"column:ua;type:character varying(255);comment:用户代理" json:"ua"` // 用户代理 - AccessToken string `gorm:"column:access_token;type:character varying(255);not null;comment:访问令牌" json:"access_token"` // 访问令牌 - AccessTokenExpires orm.LocalDateTime `gorm:"column:access_token_expires;type:timestamp without time zone;not null;comment:访问令牌过期时间" json:"access_token_expires"` // 访问令牌过期时间 - RefreshToken *string `gorm:"column:refresh_token;type:character varying(255);comment:刷新令牌" json:"refresh_token"` // 刷新令牌 - RefreshTokenExpires *orm.LocalDateTime `gorm:"column:refresh_token_expires;type:timestamp without time zone;comment:刷新令牌过期时间" json:"refresh_token_expires"` // 刷新令牌过期时间 - Scopes_ *string `gorm:"column:scopes;type:character varying(255);comment:权限范围" json:"scopes"` // 权限范围 - CreatedAt *orm.LocalDateTime `gorm:"column:created_at;type:timestamp without time zone;default:CURRENT_TIMESTAMP;comment:创建时间" json:"created_at"` // 创建时间 - UpdatedAt *orm.LocalDateTime `gorm:"column:updated_at;type:timestamp without time zone;default:CURRENT_TIMESTAMP;comment:更新时间" json:"updated_at"` // 更新时间 - DeletedAt gorm.DeletedAt `gorm:"column:deleted_at;type:timestamp without time zone;comment:删除时间" json:"deleted_at"` // 删除时间 - User *User `gorm:"foreignKey:UserID" json:"user"` - Admin *Admin `gorm:"foreignKey:UserID" json:"admin"` - Client *Client `gorm:"belongsTo:ID;foreignKey:ClientID" json:"client"` -} - -// TableName Session's table name -func (*Session) TableName() string { - return TableNameSession -} diff --git a/web/models/session.go b/web/models/session.go new file mode 100644 index 0000000..f734c50 --- /dev/null +++ b/web/models/session.go @@ -0,0 +1,26 @@ +package models + +import ( + "platform/web/core" + "platform/web/globals/orm" + "time" +) + +// Session 会话表 +type Session struct { + core.Model + UserID *int32 `json:"user_id" gorm:"column:user_id"` // 用户ID + AdminID *int32 `json:"admin_id" gorm:"column:admin_id"` // 管理员ID + ClientID *int32 `json:"client_id" gorm:"column:client_id"` // 客户端ID + IP *orm.Inet `json:"ip" gorm:"column:ip"` // IP地址 + UA *string `json:"ua" gorm:"column:ua"` // 用户代理 + AccessToken string `json:"access_token" gorm:"column:access_token"` // 访问令牌 + AccessTokenExpires time.Time `json:"access_token_expires" gorm:"column:access_token_expires"` // 访问令牌过期时间 + RefreshToken *string `json:"refresh_token" gorm:"column:refresh_token"` // 刷新令牌 + RefreshTokenExpires *time.Time `json:"refresh_token_expires" gorm:"column:refresh_token_expires"` // 刷新令牌过期时间 + Scopes *string `json:"scopes" gorm:"column:scopes"` // 权限范围 + + User *User `json:"user" gorm:"foreignKey:UserID"` + Admin *Admin `json:"admin" gorm:"foreignKey:AdminID"` + Client *Client `json:"client" gorm:"foreignKey:ClientID;belongsTo:ID"` +} diff --git a/web/models/trade.gen.go b/web/models/trade.gen.go deleted file mode 100644 index d5b0f76..0000000 --- a/web/models/trade.gen.go +++ /dev/null @@ -1,43 +0,0 @@ -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. - -package models - -import ( - "platform/web/globals/orm" - - "github.com/shopspring/decimal" - "gorm.io/gorm" -) - -const TableNameTrade = "trade" - -// Trade mapped from table -type Trade struct { - ID int32 `gorm:"column:id;type:integer;primaryKey;autoIncrement:true;comment:订单ID" json:"id"` // 订单ID - UserID int32 `gorm:"column:user_id;type:integer;not null;comment:用户ID" json:"user_id"` // 用户ID - InnerNo string `gorm:"column:inner_no;type:character varying(255);not null;comment:内部订单号" json:"inner_no"` // 内部订单号 - OuterNo *string `gorm:"column:outer_no;type:character varying(255);comment:外部订单号" json:"outer_no"` // 外部订单号 - Type int32 `gorm:"column:type;type:integer;not null;comment:订单类型:1-购买产品,2-充值余额" json:"type"` // 订单类型:1-购买产品,2-充值余额 - Subject string `gorm:"column:subject;type:character varying(255);not null;comment:订单主题" json:"subject"` // 订单主题 - Remark *string `gorm:"column:remark;type:character varying(255);comment:订单备注" json:"remark"` // 订单备注 - Amount decimal.Decimal `gorm:"column:amount;type:numeric(12,2);not null;comment:订单总金额" json:"amount"` // 订单总金额 - Payment decimal.Decimal `gorm:"column:payment;type:numeric(12,2);not null;comment:实际支付金额" json:"payment"` // 实际支付金额 - Method int32 `gorm:"column:method;type:integer;not null;comment:支付方式:1-支付宝,2-微信,3-商福通,4-商福通渠道支付宝,5-商福通渠道微信" json:"method"` // 支付方式:1-支付宝,2-微信,3-商福通,4-商福通渠道支付宝,5-商福通渠道微信 - Platform int32 `gorm:"column:platform;type:integer;not null;comment:支付平台:1-电脑网站,2-手机网站" json:"platform"` // 支付平台:1-电脑网站,2-手机网站 - Acquirer *int32 `gorm:"column:acquirer;type:integer;comment:收单机构:1-支付宝,2-微信,3-银联" json:"acquirer"` // 收单机构:1-支付宝,2-微信,3-银联 - Status int32 `gorm:"column:status;type:integer;not null;comment:订单状态:0-待支付,1-已支付,2-已取消" json:"status"` // 订单状态:0-待支付,1-已支付,2-已取消 - Refunded bool `gorm:"column:refunded;type:boolean;not null" json:"refunded"` - PaymentURL *string `gorm:"column:payment_url;type:text;comment:支付链接" json:"payment_url"` // 支付链接 - CompletedAt *orm.LocalDateTime `gorm:"column:completed_at;type:timestamp without time zone;comment:支付时间" json:"completed_at"` // 支付时间 - CanceledAt *orm.LocalDateTime `gorm:"column:canceled_at;type:timestamp without time zone;comment:取消时间" json:"canceled_at"` // 取消时间 - CreatedAt *orm.LocalDateTime `gorm:"column:created_at;type:timestamp without time zone;default:CURRENT_TIMESTAMP;comment:创建时间" json:"created_at"` // 创建时间 - UpdatedAt *orm.LocalDateTime `gorm:"column:updated_at;type:timestamp without time zone;default:CURRENT_TIMESTAMP;comment:更新时间" json:"updated_at"` // 更新时间 - DeletedAt gorm.DeletedAt `gorm:"column:deleted_at;type:timestamp without time zone;comment:删除时间" json:"deleted_at"` // 删除时间 -} - -// TableName Trade's table name -func (*Trade) TableName() string { - return TableNameTrade -} diff --git a/web/models/trade.go b/web/models/trade.go new file mode 100644 index 0000000..2d543eb --- /dev/null +++ b/web/models/trade.go @@ -0,0 +1,74 @@ +package models + +import ( + "platform/web/core" + "time" + + "github.com/shopspring/decimal" +) + +// Trade 订单表 +type Trade struct { + core.Model + UserID int32 `json:"user_id" gorm:"column:user_id"` // 用户ID + InnerNo string `json:"inner_no" gorm:"column:inner_no"` // 内部订单号 + OuterNo *string `json:"outer_no" gorm:"column:outer_no"` // 外部订单号 + Type TradeType `json:"type" gorm:"column:type"` // 订单类型:1-购买产品,2-充值余额 + Subject string `json:"subject" gorm:"column:subject"` // 订单主题 + Remark *string `json:"remark" gorm:"column:remark"` // 订单备注 + Amount decimal.Decimal `json:"amount" gorm:"column:amount"` // 订单总金额 + Payment decimal.Decimal `json:"payment" gorm:"column:payment"` // 实际支付金额 + Method TradeMethod `json:"method" gorm:"column:method"` // 支付方式:1-支付宝,2-微信,3-商福通,4-商福通渠道支付宝,5-商福通渠道微信 + Platform TradePlatform `json:"platform" gorm:"column:platform"` // 支付平台:1-电脑网站,2-手机网站 + Acquirer *TradeAcquirer `json:"acquirer" gorm:"column:acquirer"` // 收单机构:1-支付宝,2-微信,3-银联 + Status TradeStatus `json:"status" gorm:"column:status"` // 订单状态:0-待支付,1-已支付,2-已取消 + Refunded bool `json:"refunded" gorm:"column:refunded"` // 是否已退款 + PaymentURL *string `json:"payment_url" gorm:"column:payment_url"` // 支付链接 + CompletedAt *time.Time `json:"completed_at" gorm:"column:completed_at"` // 支付时间 + CanceledAt *time.Time `json:"canceled_at" gorm:"column:canceled_at"` // 取消时间 +} + +// TradeType 订单类型枚举 +type TradeType int + +const ( + TradeTypePurchase TradeType = 1 // 购买产品 + TradeTypeRecharge TradeType = 2 // 充值余额 +) + +// TradeMethod 支付方式枚举 +type TradeMethod int + +const ( + TradeMethodAlipay TradeMethod = 1 // 支付宝 + TradeMethodWechat TradeMethod = 2 // 微信 + TradeMethodSft TradeMethod = 3 // 商福通 + TradeMethodSftAlipay TradeMethod = 4 // 商福通渠道支付宝 + TradeMethodSftWechat TradeMethod = 5 // 商福通渠道微信 +) + +// TradePlatform 支付平台枚举 +type TradePlatform int + +const ( + TradePlatformPC TradePlatform = 1 // 电脑网站 + TradePlatformMobile TradePlatform = 2 // 手机网站 +) + +// TradeAcquirer 收单机构枚举 +type TradeAcquirer int + +const ( + TradeAcquirerAlipay TradeAcquirer = 1 // 支付宝 + TradeAcquirerWechat TradeAcquirer = 2 // 微信 + TradeAcquirerUnionPay TradeAcquirer = 3 // 银联 +) + +// TradeStatus 订单状态枚举 +type TradeStatus int + +const ( + TradeStatusPending TradeStatus = 0 // 待支付 + TradeStatusSuccess TradeStatus = 1 // 已支付 + TradeStatusCanceled TradeStatus = 2 // 已取消 +) diff --git a/web/models/user.gen.go b/web/models/user.gen.go deleted file mode 100644 index d034b5f..0000000 --- a/web/models/user.gen.go +++ /dev/null @@ -1,44 +0,0 @@ -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. - -package models - -import ( - "platform/web/globals/orm" - - "github.com/shopspring/decimal" - "gorm.io/gorm" -) - -const TableNameUser = "user" - -// User mapped from table -type User struct { - ID int32 `gorm:"column:id;type:integer;primaryKey;autoIncrement:true;comment:用户ID" json:"id"` // 用户ID - AdminID *int32 `gorm:"column:admin_id;type:integer;comment:管理员ID" json:"admin_id"` // 管理员ID - Phone string `gorm:"column:phone;type:character varying(255);not null;comment:手机号码" json:"phone"` // 手机号码 - Username *string `gorm:"column:username;type:character varying(255);comment:用户名" json:"username"` // 用户名 - Email *string `gorm:"column:email;type:character varying(255)" json:"email"` - Password *string `gorm:"column:password;type:character varying(255);comment:用户密码" json:"password"` // 用户密码 - Name *string `gorm:"column:name;type:character varying(255);comment:真实姓名" json:"name"` // 真实姓名 - Avatar *string `gorm:"column:avatar;type:character varying(255);comment:头像URL" json:"avatar"` // 头像URL - Status int32 `gorm:"column:status;type:integer;not null;default:1;comment:用户状态:0-禁用,1-正常" json:"status"` // 用户状态:0-禁用,1-正常 - Balance decimal.Decimal `gorm:"column:balance;type:numeric(12,2);not null;comment:账户余额" json:"balance"` // 账户余额 - IDType int32 `gorm:"column:id_type;type:integer;not null;comment:认证类型:0-未认证,1-个人认证,2-企业认证" json:"id_type"` // 认证类型:0-未认证,1-个人认证,2-企业认证 - IDNo *string `gorm:"column:id_no;type:character varying(255);comment:身份证号或营业执照号" json:"id_no"` // 身份证号或营业执照号 - IDToken *string `gorm:"column:id_token;type:character varying(255);comment:身份验证标识" json:"id_token"` // 身份验证标识 - ContactQQ *string `gorm:"column:contact_qq;type:character varying(255);comment:QQ联系方式" json:"contact_qq"` // QQ联系方式 - ContactWechat *string `gorm:"column:contact_wechat;type:character varying(255);comment:微信联系方式" json:"contact_wechat"` // 微信联系方式 - LastLogin *orm.LocalDateTime `gorm:"column:last_login;type:timestamp without time zone;comment:最后登录时间" json:"last_login"` // 最后登录时间 - LastLoginHost *string `gorm:"column:last_login_host;type:character varying(45);comment:最后登录地址" json:"last_login_host"` // 最后登录地址 - LastLoginAgent *string `gorm:"column:last_login_agent;type:character varying(255);comment:最后登录代理" json:"last_login_agent"` // 最后登录代理 - CreatedAt *orm.LocalDateTime `gorm:"column:created_at;type:timestamp without time zone;default:CURRENT_TIMESTAMP;comment:创建时间" json:"created_at"` // 创建时间 - UpdatedAt *orm.LocalDateTime `gorm:"column:updated_at;type:timestamp without time zone;default:CURRENT_TIMESTAMP;comment:更新时间" json:"updated_at"` // 更新时间 - DeletedAt gorm.DeletedAt `gorm:"column:deleted_at;type:timestamp without time zone;comment:删除时间" json:"deleted_at"` // 删除时间 -} - -// TableName User's table name -func (*User) TableName() string { - return TableNameUser -} diff --git a/web/models/user.go b/web/models/user.go new file mode 100644 index 0000000..97360be --- /dev/null +++ b/web/models/user.go @@ -0,0 +1,50 @@ +package models + +import ( + "platform/web/core" + "platform/web/globals/orm" + "time" + + "github.com/shopspring/decimal" +) + +// User 用户表 +type User struct { + core.Model + AdminID *int32 `json:"admin_id" gorm:"column:admin_id"` // 管理员ID + Phone string `json:"phone" gorm:"column:phone"` // 手机号码 + Username *string `json:"username" gorm:"column:username"` // 用户名 + Email *string `json:"email" gorm:"column:email"` // 邮箱 + Password *string `json:"password" gorm:"column:password"` // 用户密码 + Name *string `json:"name" gorm:"column:name"` // 真实姓名 + Avatar *string `json:"avatar" gorm:"column:avatar"` // 头像URL + Status UserStatus `json:"status" gorm:"column:status"` // 用户状态:0-禁用,1-正常 + Balance decimal.Decimal `json:"balance" gorm:"column:balance"` // 账户余额 + IDType UserIDType `json:"id_type" gorm:"column:id_type"` // 认证类型:0-未认证,1-个人认证,2-企业认证 + IDNo *string `json:"id_no" gorm:"column:id_no"` // 身份证号或营业执照号 + IDToken *string `json:"id_token" gorm:"column:id_token"` // 身份验证标识 + ContactQQ *string `json:"contact_qq" gorm:"column:contact_qq"` // QQ联系方式 + ContactWechat *string `json:"contact_wechat" gorm:"column:contact_wechat"` // 微信联系方式 + LastLogin *time.Time `json:"last_login" gorm:"column:last_login"` // 最后登录时间 + LastLoginIP *orm.Inet `json:"last_login_ip" gorm:"column:last_login_ip"` // 最后登录地址 + LastLoginUA *string `json:"last_login_ua" gorm:"column:last_login_ua"` // 最后登录代理 + + Admin Admin `json:"admin" gorm:"foreignKey:AdminID"` +} + +// UserStatus 用户状态枚举 +type UserStatus int + +const ( + UserStatusDisabled UserStatus = 0 // 禁用 + UserStatusEnabled UserStatus = 1 // 正常 +) + +// UserIDType 用户认证类型枚举 +type UserIDType int + +const ( + UserIDTypeUnverified UserIDType = 0 // 未认证 + UserIDTypePersonal UserIDType = 1 // 个人认证 + UserIDTypeEnterprise UserIDType = 2 // 企业认证 +) diff --git a/web/models/user_role.gen.go b/web/models/user_role.gen.go deleted file mode 100644 index ef8fa21..0000000 --- a/web/models/user_role.gen.go +++ /dev/null @@ -1,30 +0,0 @@ -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. - -package models - -import ( - "platform/web/globals/orm" - - "gorm.io/gorm" -) - -const TableNameUserRole = "user_role" - -// UserRole mapped from table -type UserRole struct { - ID int32 `gorm:"column:id;type:integer;primaryKey;autoIncrement:true;comment:角色ID" json:"id"` // 角色ID - Name string `gorm:"column:name;type:character varying(255);not null;comment:角色名称" json:"name"` // 角色名称 - Description *string `gorm:"column:description;type:character varying(255);comment:角色描述" json:"description"` // 角色描述 - Active *bool `gorm:"column:active;type:boolean;default:true;comment:是否激活" json:"active"` // 是否激活 - Sort *int32 `gorm:"column:sort;type:integer;comment:排序" json:"sort"` // 排序 - CreatedAt *orm.LocalDateTime `gorm:"column:created_at;type:timestamp without time zone;default:CURRENT_TIMESTAMP;comment:创建时间" json:"created_at"` // 创建时间 - UpdatedAt *orm.LocalDateTime `gorm:"column:updated_at;type:timestamp without time zone;default:CURRENT_TIMESTAMP;comment:更新时间" json:"updated_at"` // 更新时间 - DeletedAt gorm.DeletedAt `gorm:"column:deleted_at;type:timestamp without time zone;comment:删除时间" json:"deleted_at"` // 删除时间 -} - -// TableName UserRole's table name -func (*UserRole) TableName() string { - return TableNameUserRole -} diff --git a/web/models/user_role.go b/web/models/user_role.go new file mode 100644 index 0000000..6f90e19 --- /dev/null +++ b/web/models/user_role.go @@ -0,0 +1,14 @@ +package models + +import ( + "platform/web/core" +) + +// UserRole 用户角色表 +type UserRole struct { + core.Model + Name string `json:"name" gorm:"column:name"` // 角色名称 + Description *string `json:"description" gorm:"column:description"` // 角色描述 + Active bool `json:"active" gorm:"column:active"` // 是否激活 + Sort int32 `json:"sort" gorm:"column:sort"` // 排序 +} diff --git a/web/models/user_role_link.gen.go b/web/models/user_role_link.gen.go deleted file mode 100644 index 3ef421f..0000000 --- a/web/models/user_role_link.gen.go +++ /dev/null @@ -1,28 +0,0 @@ -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. - -package models - -import ( - "platform/web/globals/orm" - - "gorm.io/gorm" -) - -const TableNameUserRoleLink = "user_role_link" - -// UserRoleLink mapped from table -type UserRoleLink struct { - ID int32 `gorm:"column:id;type:integer;primaryKey;autoIncrement:true;comment:关联ID" json:"id"` // 关联ID - UserID int32 `gorm:"column:user_id;type:integer;not null;comment:用户ID" json:"user_id"` // 用户ID - RoleID int32 `gorm:"column:role_id;type:integer;not null;comment:角色ID" json:"role_id"` // 角色ID - CreatedAt *orm.LocalDateTime `gorm:"column:created_at;type:timestamp without time zone;default:CURRENT_TIMESTAMP;comment:创建时间" json:"created_at"` // 创建时间 - UpdatedAt *orm.LocalDateTime `gorm:"column:updated_at;type:timestamp without time zone;default:CURRENT_TIMESTAMP;comment:更新时间" json:"updated_at"` // 更新时间 - DeletedAt gorm.DeletedAt `gorm:"column:deleted_at;type:timestamp without time zone;comment:删除时间" json:"deleted_at"` // 删除时间 -} - -// TableName UserRoleLink's table name -func (*UserRoleLink) TableName() string { - return TableNameUserRoleLink -} diff --git a/web/models/user_role_permission_link.gen.go b/web/models/user_role_permission_link.gen.go deleted file mode 100644 index c7181fb..0000000 --- a/web/models/user_role_permission_link.gen.go +++ /dev/null @@ -1,28 +0,0 @@ -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. - -package models - -import ( - "platform/web/globals/orm" - - "gorm.io/gorm" -) - -const TableNameUserRolePermissionLink = "user_role_permission_link" - -// UserRolePermissionLink mapped from table -type UserRolePermissionLink struct { - ID int32 `gorm:"column:id;type:integer;primaryKey;autoIncrement:true;comment:关联ID" json:"id"` // 关联ID - RoleID int32 `gorm:"column:role_id;type:integer;not null;comment:角色ID" json:"role_id"` // 角色ID - PermissionID int32 `gorm:"column:permission_id;type:integer;not null;comment:权限ID" json:"permission_id"` // 权限ID - CreatedAt *orm.LocalDateTime `gorm:"column:created_at;type:timestamp without time zone;default:CURRENT_TIMESTAMP;comment:创建时间" json:"created_at"` // 创建时间 - UpdatedAt *orm.LocalDateTime `gorm:"column:updated_at;type:timestamp without time zone;default:CURRENT_TIMESTAMP;comment:更新时间" json:"updated_at"` // 更新时间 - DeletedAt gorm.DeletedAt `gorm:"column:deleted_at;type:timestamp without time zone;comment:删除时间" json:"deleted_at"` // 删除时间 -} - -// TableName UserRolePermissionLink's table name -func (*UserRolePermissionLink) TableName() string { - return TableNameUserRolePermissionLink -} diff --git a/web/models/whitelist.gen.go b/web/models/whitelist.gen.go deleted file mode 100644 index b6c4517..0000000 --- a/web/models/whitelist.gen.go +++ /dev/null @@ -1,29 +0,0 @@ -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. - -package models - -import ( - "platform/web/globals/orm" - - "gorm.io/gorm" -) - -const TableNameWhitelist = "whitelist" - -// Whitelist mapped from table -type Whitelist struct { - ID int32 `gorm:"column:id;type:integer;primaryKey;autoIncrement:true;comment:白名单ID" json:"id"` // 白名单ID - UserID int32 `gorm:"column:user_id;type:integer;not null;comment:用户ID" json:"user_id"` // 用户ID - Host string `gorm:"column:host;type:character varying(45);not null;comment:IP地址" json:"host"` // IP地址 - Remark *string `gorm:"column:remark;type:character varying(255);comment:备注" json:"remark"` // 备注 - CreatedAt *orm.LocalDateTime `gorm:"column:created_at;type:timestamp without time zone;default:CURRENT_TIMESTAMP;comment:创建时间" json:"created_at"` // 创建时间 - UpdatedAt *orm.LocalDateTime `gorm:"column:updated_at;type:timestamp without time zone;default:CURRENT_TIMESTAMP;comment:更新时间" json:"updated_at"` // 更新时间 - DeletedAt gorm.DeletedAt `gorm:"column:deleted_at;type:timestamp without time zone;comment:删除时间" json:"deleted_at"` // 删除时间 -} - -// TableName Whitelist's table name -func (*Whitelist) TableName() string { - return TableNameWhitelist -} diff --git a/web/models/whitelist.go b/web/models/whitelist.go new file mode 100644 index 0000000..a61ce9b --- /dev/null +++ b/web/models/whitelist.go @@ -0,0 +1,14 @@ +package models + +import ( + "platform/web/core" + "platform/web/globals/orm" +) + +// Whitelist 白名单表 +type Whitelist struct { + core.Model + UserID int32 `json:"user_id" gorm:"column:user_id"` // 用户ID + IP orm.Inet `json:"ip" gorm:"column:ip;not null"` // IP地址 + Remark *string `json:"remark" gorm:"column:remark"` // 备注 +} diff --git a/web/queries/admin.gen.go b/web/queries/admin.gen.go index a1da837..bc68f0b 100644 --- a/web/queries/admin.gen.go +++ b/web/queries/admin.gen.go @@ -28,19 +28,19 @@ func newAdmin(db *gorm.DB, opts ...gen.DOOption) admin { tableName := _admin.adminDo.TableName() _admin.ALL = field.NewAsterisk(tableName) _admin.ID = field.NewInt32(tableName, "id") + _admin.CreatedAt = field.NewTime(tableName, "created_at") + _admin.UpdatedAt = field.NewTime(tableName, "updated_at") + _admin.DeletedAt = field.NewField(tableName, "deleted_at") _admin.Username = field.NewString(tableName, "username") _admin.Password = field.NewString(tableName, "password") _admin.Name = field.NewString(tableName, "name") _admin.Avatar = field.NewString(tableName, "avatar") _admin.Phone = field.NewString(tableName, "phone") _admin.Email = field.NewString(tableName, "email") - _admin.Status = field.NewInt32(tableName, "status") - _admin.LastLogin = field.NewField(tableName, "last_login") - _admin.LastLoginHost = field.NewString(tableName, "last_login_host") - _admin.LastLoginAgent = field.NewString(tableName, "last_login_agent") - _admin.CreatedAt = field.NewField(tableName, "created_at") - _admin.UpdatedAt = field.NewField(tableName, "updated_at") - _admin.DeletedAt = field.NewField(tableName, "deleted_at") + _admin.Status = field.NewInt(tableName, "status") + _admin.LastLogin = field.NewTime(tableName, "last_login") + _admin.LastLoginIP = field.NewField(tableName, "last_login_ip") + _admin.LastLoginUA = field.NewString(tableName, "last_login_ua") _admin.fillFieldMap() @@ -50,21 +50,21 @@ func newAdmin(db *gorm.DB, opts ...gen.DOOption) admin { type admin struct { adminDo - ALL field.Asterisk - ID field.Int32 // 管理员ID - Username field.String // 用户名 - Password field.String // 密码 - Name field.String // 真实姓名 - Avatar field.String // 头像URL - Phone field.String // 手机号码 - Email field.String // 邮箱 - Status field.Int32 // 状态:0-禁用,1-正常 - LastLogin field.Field // 最后登录时间 - LastLoginHost field.String // 最后登录地址 - LastLoginAgent field.String // 最后登录代理 - CreatedAt field.Field // 创建时间 - UpdatedAt field.Field // 更新时间 - DeletedAt field.Field // 删除时间 + ALL field.Asterisk + ID field.Int32 + CreatedAt field.Time + UpdatedAt field.Time + DeletedAt field.Field + Username field.String + Password field.String + Name field.String + Avatar field.String + Phone field.String + Email field.String + Status field.Int + LastLogin field.Time + LastLoginIP field.Field + LastLoginUA field.String fieldMap map[string]field.Expr } @@ -82,19 +82,19 @@ func (a admin) As(alias string) *admin { func (a *admin) updateTableName(table string) *admin { a.ALL = field.NewAsterisk(table) a.ID = field.NewInt32(table, "id") + a.CreatedAt = field.NewTime(table, "created_at") + a.UpdatedAt = field.NewTime(table, "updated_at") + a.DeletedAt = field.NewField(table, "deleted_at") a.Username = field.NewString(table, "username") a.Password = field.NewString(table, "password") a.Name = field.NewString(table, "name") a.Avatar = field.NewString(table, "avatar") a.Phone = field.NewString(table, "phone") a.Email = field.NewString(table, "email") - a.Status = field.NewInt32(table, "status") - a.LastLogin = field.NewField(table, "last_login") - a.LastLoginHost = field.NewString(table, "last_login_host") - a.LastLoginAgent = field.NewString(table, "last_login_agent") - a.CreatedAt = field.NewField(table, "created_at") - a.UpdatedAt = field.NewField(table, "updated_at") - a.DeletedAt = field.NewField(table, "deleted_at") + a.Status = field.NewInt(table, "status") + a.LastLogin = field.NewTime(table, "last_login") + a.LastLoginIP = field.NewField(table, "last_login_ip") + a.LastLoginUA = field.NewString(table, "last_login_ua") a.fillFieldMap() @@ -113,6 +113,9 @@ func (a *admin) GetFieldByName(fieldName string) (field.OrderExpr, bool) { func (a *admin) fillFieldMap() { a.fieldMap = make(map[string]field.Expr, 14) a.fieldMap["id"] = a.ID + a.fieldMap["created_at"] = a.CreatedAt + a.fieldMap["updated_at"] = a.UpdatedAt + a.fieldMap["deleted_at"] = a.DeletedAt a.fieldMap["username"] = a.Username a.fieldMap["password"] = a.Password a.fieldMap["name"] = a.Name @@ -121,11 +124,8 @@ func (a *admin) fillFieldMap() { a.fieldMap["email"] = a.Email a.fieldMap["status"] = a.Status a.fieldMap["last_login"] = a.LastLogin - a.fieldMap["last_login_host"] = a.LastLoginHost - a.fieldMap["last_login_agent"] = a.LastLoginAgent - a.fieldMap["created_at"] = a.CreatedAt - a.fieldMap["updated_at"] = a.UpdatedAt - a.fieldMap["deleted_at"] = a.DeletedAt + a.fieldMap["last_login_ip"] = a.LastLoginIP + a.fieldMap["last_login_ua"] = a.LastLoginUA } func (a admin) clone(db *gorm.DB) admin { diff --git a/web/queries/admin_role.gen.go b/web/queries/admin_role.gen.go index f8c5883..8855796 100644 --- a/web/queries/admin_role.gen.go +++ b/web/queries/admin_role.gen.go @@ -28,13 +28,13 @@ func newAdminRole(db *gorm.DB, opts ...gen.DOOption) adminRole { tableName := _adminRole.adminRoleDo.TableName() _adminRole.ALL = field.NewAsterisk(tableName) _adminRole.ID = field.NewInt32(tableName, "id") + _adminRole.CreatedAt = field.NewTime(tableName, "created_at") + _adminRole.UpdatedAt = field.NewTime(tableName, "updated_at") + _adminRole.DeletedAt = field.NewField(tableName, "deleted_at") _adminRole.Name = field.NewString(tableName, "name") _adminRole.Description = field.NewString(tableName, "description") _adminRole.Active = field.NewBool(tableName, "active") _adminRole.Sort = field.NewInt32(tableName, "sort") - _adminRole.CreatedAt = field.NewField(tableName, "created_at") - _adminRole.UpdatedAt = field.NewField(tableName, "updated_at") - _adminRole.DeletedAt = field.NewField(tableName, "deleted_at") _adminRole.fillFieldMap() @@ -45,14 +45,14 @@ type adminRole struct { adminRoleDo ALL field.Asterisk - ID field.Int32 // 管理员角色ID - Name field.String // 角色名称 - Description field.String // 角色描述 - Active field.Bool // 是否激活 - Sort field.Int32 // 排序 - CreatedAt field.Field // 创建时间 - UpdatedAt field.Field // 更新时间 - DeletedAt field.Field // 删除时间 + ID field.Int32 + CreatedAt field.Time + UpdatedAt field.Time + DeletedAt field.Field + Name field.String + Description field.String + Active field.Bool + Sort field.Int32 fieldMap map[string]field.Expr } @@ -70,13 +70,13 @@ func (a adminRole) As(alias string) *adminRole { func (a *adminRole) updateTableName(table string) *adminRole { a.ALL = field.NewAsterisk(table) a.ID = field.NewInt32(table, "id") + a.CreatedAt = field.NewTime(table, "created_at") + a.UpdatedAt = field.NewTime(table, "updated_at") + a.DeletedAt = field.NewField(table, "deleted_at") a.Name = field.NewString(table, "name") a.Description = field.NewString(table, "description") a.Active = field.NewBool(table, "active") a.Sort = field.NewInt32(table, "sort") - a.CreatedAt = field.NewField(table, "created_at") - a.UpdatedAt = field.NewField(table, "updated_at") - a.DeletedAt = field.NewField(table, "deleted_at") a.fillFieldMap() @@ -95,13 +95,13 @@ func (a *adminRole) GetFieldByName(fieldName string) (field.OrderExpr, bool) { func (a *adminRole) fillFieldMap() { a.fieldMap = make(map[string]field.Expr, 8) a.fieldMap["id"] = a.ID + a.fieldMap["created_at"] = a.CreatedAt + a.fieldMap["updated_at"] = a.UpdatedAt + a.fieldMap["deleted_at"] = a.DeletedAt a.fieldMap["name"] = a.Name a.fieldMap["description"] = a.Description a.fieldMap["active"] = a.Active a.fieldMap["sort"] = a.Sort - a.fieldMap["created_at"] = a.CreatedAt - a.fieldMap["updated_at"] = a.UpdatedAt - a.fieldMap["deleted_at"] = a.DeletedAt } func (a adminRole) clone(db *gorm.DB) adminRole { diff --git a/web/queries/admin_role_link.gen.go b/web/queries/admin_role_link.gen.go deleted file mode 100644 index 67fd76f..0000000 --- a/web/queries/admin_role_link.gen.go +++ /dev/null @@ -1,339 +0,0 @@ -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. - -package queries - -import ( - "context" - - "gorm.io/gorm" - "gorm.io/gorm/clause" - "gorm.io/gorm/schema" - - "gorm.io/gen" - "gorm.io/gen/field" - - "gorm.io/plugin/dbresolver" - - "platform/web/models" -) - -func newAdminRoleLink(db *gorm.DB, opts ...gen.DOOption) adminRoleLink { - _adminRoleLink := adminRoleLink{} - - _adminRoleLink.adminRoleLinkDo.UseDB(db, opts...) - _adminRoleLink.adminRoleLinkDo.UseModel(&models.AdminRoleLink{}) - - tableName := _adminRoleLink.adminRoleLinkDo.TableName() - _adminRoleLink.ALL = field.NewAsterisk(tableName) - _adminRoleLink.ID = field.NewInt32(tableName, "id") - _adminRoleLink.AdminID = field.NewInt32(tableName, "admin_id") - _adminRoleLink.RoleID = field.NewInt32(tableName, "role_id") - _adminRoleLink.CreatedAt = field.NewField(tableName, "created_at") - _adminRoleLink.UpdatedAt = field.NewField(tableName, "updated_at") - _adminRoleLink.DeletedAt = field.NewField(tableName, "deleted_at") - - _adminRoleLink.fillFieldMap() - - return _adminRoleLink -} - -type adminRoleLink struct { - adminRoleLinkDo - - ALL field.Asterisk - ID field.Int32 // 关联ID - AdminID field.Int32 // 管理员ID - RoleID field.Int32 // 角色ID - CreatedAt field.Field // 创建时间 - UpdatedAt field.Field // 更新时间 - DeletedAt field.Field // 删除时间 - - fieldMap map[string]field.Expr -} - -func (a adminRoleLink) Table(newTableName string) *adminRoleLink { - a.adminRoleLinkDo.UseTable(newTableName) - return a.updateTableName(newTableName) -} - -func (a adminRoleLink) As(alias string) *adminRoleLink { - a.adminRoleLinkDo.DO = *(a.adminRoleLinkDo.As(alias).(*gen.DO)) - return a.updateTableName(alias) -} - -func (a *adminRoleLink) updateTableName(table string) *adminRoleLink { - a.ALL = field.NewAsterisk(table) - a.ID = field.NewInt32(table, "id") - a.AdminID = field.NewInt32(table, "admin_id") - a.RoleID = field.NewInt32(table, "role_id") - a.CreatedAt = field.NewField(table, "created_at") - a.UpdatedAt = field.NewField(table, "updated_at") - a.DeletedAt = field.NewField(table, "deleted_at") - - a.fillFieldMap() - - return a -} - -func (a *adminRoleLink) GetFieldByName(fieldName string) (field.OrderExpr, bool) { - _f, ok := a.fieldMap[fieldName] - if !ok || _f == nil { - return nil, false - } - _oe, ok := _f.(field.OrderExpr) - return _oe, ok -} - -func (a *adminRoleLink) fillFieldMap() { - a.fieldMap = make(map[string]field.Expr, 6) - a.fieldMap["id"] = a.ID - a.fieldMap["admin_id"] = a.AdminID - a.fieldMap["role_id"] = a.RoleID - a.fieldMap["created_at"] = a.CreatedAt - a.fieldMap["updated_at"] = a.UpdatedAt - a.fieldMap["deleted_at"] = a.DeletedAt -} - -func (a adminRoleLink) clone(db *gorm.DB) adminRoleLink { - a.adminRoleLinkDo.ReplaceConnPool(db.Statement.ConnPool) - return a -} - -func (a adminRoleLink) replaceDB(db *gorm.DB) adminRoleLink { - a.adminRoleLinkDo.ReplaceDB(db) - return a -} - -type adminRoleLinkDo struct{ gen.DO } - -func (a adminRoleLinkDo) Debug() *adminRoleLinkDo { - return a.withDO(a.DO.Debug()) -} - -func (a adminRoleLinkDo) WithContext(ctx context.Context) *adminRoleLinkDo { - return a.withDO(a.DO.WithContext(ctx)) -} - -func (a adminRoleLinkDo) ReadDB() *adminRoleLinkDo { - return a.Clauses(dbresolver.Read) -} - -func (a adminRoleLinkDo) WriteDB() *adminRoleLinkDo { - return a.Clauses(dbresolver.Write) -} - -func (a adminRoleLinkDo) Session(config *gorm.Session) *adminRoleLinkDo { - return a.withDO(a.DO.Session(config)) -} - -func (a adminRoleLinkDo) Clauses(conds ...clause.Expression) *adminRoleLinkDo { - return a.withDO(a.DO.Clauses(conds...)) -} - -func (a adminRoleLinkDo) Returning(value interface{}, columns ...string) *adminRoleLinkDo { - return a.withDO(a.DO.Returning(value, columns...)) -} - -func (a adminRoleLinkDo) Not(conds ...gen.Condition) *adminRoleLinkDo { - return a.withDO(a.DO.Not(conds...)) -} - -func (a adminRoleLinkDo) Or(conds ...gen.Condition) *adminRoleLinkDo { - return a.withDO(a.DO.Or(conds...)) -} - -func (a adminRoleLinkDo) Select(conds ...field.Expr) *adminRoleLinkDo { - return a.withDO(a.DO.Select(conds...)) -} - -func (a adminRoleLinkDo) Where(conds ...gen.Condition) *adminRoleLinkDo { - return a.withDO(a.DO.Where(conds...)) -} - -func (a adminRoleLinkDo) Order(conds ...field.Expr) *adminRoleLinkDo { - return a.withDO(a.DO.Order(conds...)) -} - -func (a adminRoleLinkDo) Distinct(cols ...field.Expr) *adminRoleLinkDo { - return a.withDO(a.DO.Distinct(cols...)) -} - -func (a adminRoleLinkDo) Omit(cols ...field.Expr) *adminRoleLinkDo { - return a.withDO(a.DO.Omit(cols...)) -} - -func (a adminRoleLinkDo) Join(table schema.Tabler, on ...field.Expr) *adminRoleLinkDo { - return a.withDO(a.DO.Join(table, on...)) -} - -func (a adminRoleLinkDo) LeftJoin(table schema.Tabler, on ...field.Expr) *adminRoleLinkDo { - return a.withDO(a.DO.LeftJoin(table, on...)) -} - -func (a adminRoleLinkDo) RightJoin(table schema.Tabler, on ...field.Expr) *adminRoleLinkDo { - return a.withDO(a.DO.RightJoin(table, on...)) -} - -func (a adminRoleLinkDo) Group(cols ...field.Expr) *adminRoleLinkDo { - return a.withDO(a.DO.Group(cols...)) -} - -func (a adminRoleLinkDo) Having(conds ...gen.Condition) *adminRoleLinkDo { - return a.withDO(a.DO.Having(conds...)) -} - -func (a adminRoleLinkDo) Limit(limit int) *adminRoleLinkDo { - return a.withDO(a.DO.Limit(limit)) -} - -func (a adminRoleLinkDo) Offset(offset int) *adminRoleLinkDo { - return a.withDO(a.DO.Offset(offset)) -} - -func (a adminRoleLinkDo) Scopes(funcs ...func(gen.Dao) gen.Dao) *adminRoleLinkDo { - return a.withDO(a.DO.Scopes(funcs...)) -} - -func (a adminRoleLinkDo) Unscoped() *adminRoleLinkDo { - return a.withDO(a.DO.Unscoped()) -} - -func (a adminRoleLinkDo) Create(values ...*models.AdminRoleLink) error { - if len(values) == 0 { - return nil - } - return a.DO.Create(values) -} - -func (a adminRoleLinkDo) CreateInBatches(values []*models.AdminRoleLink, batchSize int) error { - return a.DO.CreateInBatches(values, batchSize) -} - -// Save : !!! underlying implementation is different with GORM -// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values) -func (a adminRoleLinkDo) Save(values ...*models.AdminRoleLink) error { - if len(values) == 0 { - return nil - } - return a.DO.Save(values) -} - -func (a adminRoleLinkDo) First() (*models.AdminRoleLink, error) { - if result, err := a.DO.First(); err != nil { - return nil, err - } else { - return result.(*models.AdminRoleLink), nil - } -} - -func (a adminRoleLinkDo) Take() (*models.AdminRoleLink, error) { - if result, err := a.DO.Take(); err != nil { - return nil, err - } else { - return result.(*models.AdminRoleLink), nil - } -} - -func (a adminRoleLinkDo) Last() (*models.AdminRoleLink, error) { - if result, err := a.DO.Last(); err != nil { - return nil, err - } else { - return result.(*models.AdminRoleLink), nil - } -} - -func (a adminRoleLinkDo) Find() ([]*models.AdminRoleLink, error) { - result, err := a.DO.Find() - return result.([]*models.AdminRoleLink), err -} - -func (a adminRoleLinkDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.AdminRoleLink, err error) { - buf := make([]*models.AdminRoleLink, 0, batchSize) - err = a.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error { - defer func() { results = append(results, buf...) }() - return fc(tx, batch) - }) - return results, err -} - -func (a adminRoleLinkDo) FindInBatches(result *[]*models.AdminRoleLink, batchSize int, fc func(tx gen.Dao, batch int) error) error { - return a.DO.FindInBatches(result, batchSize, fc) -} - -func (a adminRoleLinkDo) Attrs(attrs ...field.AssignExpr) *adminRoleLinkDo { - return a.withDO(a.DO.Attrs(attrs...)) -} - -func (a adminRoleLinkDo) Assign(attrs ...field.AssignExpr) *adminRoleLinkDo { - return a.withDO(a.DO.Assign(attrs...)) -} - -func (a adminRoleLinkDo) Joins(fields ...field.RelationField) *adminRoleLinkDo { - for _, _f := range fields { - a = *a.withDO(a.DO.Joins(_f)) - } - return &a -} - -func (a adminRoleLinkDo) Preload(fields ...field.RelationField) *adminRoleLinkDo { - for _, _f := range fields { - a = *a.withDO(a.DO.Preload(_f)) - } - return &a -} - -func (a adminRoleLinkDo) FirstOrInit() (*models.AdminRoleLink, error) { - if result, err := a.DO.FirstOrInit(); err != nil { - return nil, err - } else { - return result.(*models.AdminRoleLink), nil - } -} - -func (a adminRoleLinkDo) FirstOrCreate() (*models.AdminRoleLink, error) { - if result, err := a.DO.FirstOrCreate(); err != nil { - return nil, err - } else { - return result.(*models.AdminRoleLink), nil - } -} - -func (a adminRoleLinkDo) FindByPage(offset int, limit int) (result []*models.AdminRoleLink, count int64, err error) { - result, err = a.Offset(offset).Limit(limit).Find() - if err != nil { - return - } - - if size := len(result); 0 < limit && 0 < size && size < limit { - count = int64(size + offset) - return - } - - count, err = a.Offset(-1).Limit(-1).Count() - return -} - -func (a adminRoleLinkDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) { - count, err = a.Count() - if err != nil { - return - } - - err = a.Offset(offset).Limit(limit).Scan(result) - return -} - -func (a adminRoleLinkDo) Scan(result interface{}) (err error) { - return a.DO.Scan(result) -} - -func (a adminRoleLinkDo) Delete(models ...*models.AdminRoleLink) (result gen.ResultInfo, err error) { - return a.DO.Delete(models) -} - -func (a *adminRoleLinkDo) withDO(do gen.Dao) *adminRoleLinkDo { - a.DO = *do.(*gen.DO) - return a -} diff --git a/web/queries/admin_role_permission_link.gen.go b/web/queries/admin_role_permission_link.gen.go deleted file mode 100644 index 7a04418..0000000 --- a/web/queries/admin_role_permission_link.gen.go +++ /dev/null @@ -1,339 +0,0 @@ -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. - -package queries - -import ( - "context" - - "gorm.io/gorm" - "gorm.io/gorm/clause" - "gorm.io/gorm/schema" - - "gorm.io/gen" - "gorm.io/gen/field" - - "gorm.io/plugin/dbresolver" - - "platform/web/models" -) - -func newAdminRolePermissionLink(db *gorm.DB, opts ...gen.DOOption) adminRolePermissionLink { - _adminRolePermissionLink := adminRolePermissionLink{} - - _adminRolePermissionLink.adminRolePermissionLinkDo.UseDB(db, opts...) - _adminRolePermissionLink.adminRolePermissionLinkDo.UseModel(&models.AdminRolePermissionLink{}) - - tableName := _adminRolePermissionLink.adminRolePermissionLinkDo.TableName() - _adminRolePermissionLink.ALL = field.NewAsterisk(tableName) - _adminRolePermissionLink.ID = field.NewInt32(tableName, "id") - _adminRolePermissionLink.RoleID = field.NewInt32(tableName, "role_id") - _adminRolePermissionLink.PermissionID = field.NewInt32(tableName, "permission_id") - _adminRolePermissionLink.CreatedAt = field.NewField(tableName, "created_at") - _adminRolePermissionLink.UpdatedAt = field.NewField(tableName, "updated_at") - _adminRolePermissionLink.DeletedAt = field.NewField(tableName, "deleted_at") - - _adminRolePermissionLink.fillFieldMap() - - return _adminRolePermissionLink -} - -type adminRolePermissionLink struct { - adminRolePermissionLinkDo - - ALL field.Asterisk - ID field.Int32 // 关联ID - RoleID field.Int32 // 角色ID - PermissionID field.Int32 // 权限ID - CreatedAt field.Field // 创建时间 - UpdatedAt field.Field // 更新时间 - DeletedAt field.Field // 删除时间 - - fieldMap map[string]field.Expr -} - -func (a adminRolePermissionLink) Table(newTableName string) *adminRolePermissionLink { - a.adminRolePermissionLinkDo.UseTable(newTableName) - return a.updateTableName(newTableName) -} - -func (a adminRolePermissionLink) As(alias string) *adminRolePermissionLink { - a.adminRolePermissionLinkDo.DO = *(a.adminRolePermissionLinkDo.As(alias).(*gen.DO)) - return a.updateTableName(alias) -} - -func (a *adminRolePermissionLink) updateTableName(table string) *adminRolePermissionLink { - a.ALL = field.NewAsterisk(table) - a.ID = field.NewInt32(table, "id") - a.RoleID = field.NewInt32(table, "role_id") - a.PermissionID = field.NewInt32(table, "permission_id") - a.CreatedAt = field.NewField(table, "created_at") - a.UpdatedAt = field.NewField(table, "updated_at") - a.DeletedAt = field.NewField(table, "deleted_at") - - a.fillFieldMap() - - return a -} - -func (a *adminRolePermissionLink) GetFieldByName(fieldName string) (field.OrderExpr, bool) { - _f, ok := a.fieldMap[fieldName] - if !ok || _f == nil { - return nil, false - } - _oe, ok := _f.(field.OrderExpr) - return _oe, ok -} - -func (a *adminRolePermissionLink) fillFieldMap() { - a.fieldMap = make(map[string]field.Expr, 6) - a.fieldMap["id"] = a.ID - a.fieldMap["role_id"] = a.RoleID - a.fieldMap["permission_id"] = a.PermissionID - a.fieldMap["created_at"] = a.CreatedAt - a.fieldMap["updated_at"] = a.UpdatedAt - a.fieldMap["deleted_at"] = a.DeletedAt -} - -func (a adminRolePermissionLink) clone(db *gorm.DB) adminRolePermissionLink { - a.adminRolePermissionLinkDo.ReplaceConnPool(db.Statement.ConnPool) - return a -} - -func (a adminRolePermissionLink) replaceDB(db *gorm.DB) adminRolePermissionLink { - a.adminRolePermissionLinkDo.ReplaceDB(db) - return a -} - -type adminRolePermissionLinkDo struct{ gen.DO } - -func (a adminRolePermissionLinkDo) Debug() *adminRolePermissionLinkDo { - return a.withDO(a.DO.Debug()) -} - -func (a adminRolePermissionLinkDo) WithContext(ctx context.Context) *adminRolePermissionLinkDo { - return a.withDO(a.DO.WithContext(ctx)) -} - -func (a adminRolePermissionLinkDo) ReadDB() *adminRolePermissionLinkDo { - return a.Clauses(dbresolver.Read) -} - -func (a adminRolePermissionLinkDo) WriteDB() *adminRolePermissionLinkDo { - return a.Clauses(dbresolver.Write) -} - -func (a adminRolePermissionLinkDo) Session(config *gorm.Session) *adminRolePermissionLinkDo { - return a.withDO(a.DO.Session(config)) -} - -func (a adminRolePermissionLinkDo) Clauses(conds ...clause.Expression) *adminRolePermissionLinkDo { - return a.withDO(a.DO.Clauses(conds...)) -} - -func (a adminRolePermissionLinkDo) Returning(value interface{}, columns ...string) *adminRolePermissionLinkDo { - return a.withDO(a.DO.Returning(value, columns...)) -} - -func (a adminRolePermissionLinkDo) Not(conds ...gen.Condition) *adminRolePermissionLinkDo { - return a.withDO(a.DO.Not(conds...)) -} - -func (a adminRolePermissionLinkDo) Or(conds ...gen.Condition) *adminRolePermissionLinkDo { - return a.withDO(a.DO.Or(conds...)) -} - -func (a adminRolePermissionLinkDo) Select(conds ...field.Expr) *adminRolePermissionLinkDo { - return a.withDO(a.DO.Select(conds...)) -} - -func (a adminRolePermissionLinkDo) Where(conds ...gen.Condition) *adminRolePermissionLinkDo { - return a.withDO(a.DO.Where(conds...)) -} - -func (a adminRolePermissionLinkDo) Order(conds ...field.Expr) *adminRolePermissionLinkDo { - return a.withDO(a.DO.Order(conds...)) -} - -func (a adminRolePermissionLinkDo) Distinct(cols ...field.Expr) *adminRolePermissionLinkDo { - return a.withDO(a.DO.Distinct(cols...)) -} - -func (a adminRolePermissionLinkDo) Omit(cols ...field.Expr) *adminRolePermissionLinkDo { - return a.withDO(a.DO.Omit(cols...)) -} - -func (a adminRolePermissionLinkDo) Join(table schema.Tabler, on ...field.Expr) *adminRolePermissionLinkDo { - return a.withDO(a.DO.Join(table, on...)) -} - -func (a adminRolePermissionLinkDo) LeftJoin(table schema.Tabler, on ...field.Expr) *adminRolePermissionLinkDo { - return a.withDO(a.DO.LeftJoin(table, on...)) -} - -func (a adminRolePermissionLinkDo) RightJoin(table schema.Tabler, on ...field.Expr) *adminRolePermissionLinkDo { - return a.withDO(a.DO.RightJoin(table, on...)) -} - -func (a adminRolePermissionLinkDo) Group(cols ...field.Expr) *adminRolePermissionLinkDo { - return a.withDO(a.DO.Group(cols...)) -} - -func (a adminRolePermissionLinkDo) Having(conds ...gen.Condition) *adminRolePermissionLinkDo { - return a.withDO(a.DO.Having(conds...)) -} - -func (a adminRolePermissionLinkDo) Limit(limit int) *adminRolePermissionLinkDo { - return a.withDO(a.DO.Limit(limit)) -} - -func (a adminRolePermissionLinkDo) Offset(offset int) *adminRolePermissionLinkDo { - return a.withDO(a.DO.Offset(offset)) -} - -func (a adminRolePermissionLinkDo) Scopes(funcs ...func(gen.Dao) gen.Dao) *adminRolePermissionLinkDo { - return a.withDO(a.DO.Scopes(funcs...)) -} - -func (a adminRolePermissionLinkDo) Unscoped() *adminRolePermissionLinkDo { - return a.withDO(a.DO.Unscoped()) -} - -func (a adminRolePermissionLinkDo) Create(values ...*models.AdminRolePermissionLink) error { - if len(values) == 0 { - return nil - } - return a.DO.Create(values) -} - -func (a adminRolePermissionLinkDo) CreateInBatches(values []*models.AdminRolePermissionLink, batchSize int) error { - return a.DO.CreateInBatches(values, batchSize) -} - -// Save : !!! underlying implementation is different with GORM -// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values) -func (a adminRolePermissionLinkDo) Save(values ...*models.AdminRolePermissionLink) error { - if len(values) == 0 { - return nil - } - return a.DO.Save(values) -} - -func (a adminRolePermissionLinkDo) First() (*models.AdminRolePermissionLink, error) { - if result, err := a.DO.First(); err != nil { - return nil, err - } else { - return result.(*models.AdminRolePermissionLink), nil - } -} - -func (a adminRolePermissionLinkDo) Take() (*models.AdminRolePermissionLink, error) { - if result, err := a.DO.Take(); err != nil { - return nil, err - } else { - return result.(*models.AdminRolePermissionLink), nil - } -} - -func (a adminRolePermissionLinkDo) Last() (*models.AdminRolePermissionLink, error) { - if result, err := a.DO.Last(); err != nil { - return nil, err - } else { - return result.(*models.AdminRolePermissionLink), nil - } -} - -func (a adminRolePermissionLinkDo) Find() ([]*models.AdminRolePermissionLink, error) { - result, err := a.DO.Find() - return result.([]*models.AdminRolePermissionLink), err -} - -func (a adminRolePermissionLinkDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.AdminRolePermissionLink, err error) { - buf := make([]*models.AdminRolePermissionLink, 0, batchSize) - err = a.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error { - defer func() { results = append(results, buf...) }() - return fc(tx, batch) - }) - return results, err -} - -func (a adminRolePermissionLinkDo) FindInBatches(result *[]*models.AdminRolePermissionLink, batchSize int, fc func(tx gen.Dao, batch int) error) error { - return a.DO.FindInBatches(result, batchSize, fc) -} - -func (a adminRolePermissionLinkDo) Attrs(attrs ...field.AssignExpr) *adminRolePermissionLinkDo { - return a.withDO(a.DO.Attrs(attrs...)) -} - -func (a adminRolePermissionLinkDo) Assign(attrs ...field.AssignExpr) *adminRolePermissionLinkDo { - return a.withDO(a.DO.Assign(attrs...)) -} - -func (a adminRolePermissionLinkDo) Joins(fields ...field.RelationField) *adminRolePermissionLinkDo { - for _, _f := range fields { - a = *a.withDO(a.DO.Joins(_f)) - } - return &a -} - -func (a adminRolePermissionLinkDo) Preload(fields ...field.RelationField) *adminRolePermissionLinkDo { - for _, _f := range fields { - a = *a.withDO(a.DO.Preload(_f)) - } - return &a -} - -func (a adminRolePermissionLinkDo) FirstOrInit() (*models.AdminRolePermissionLink, error) { - if result, err := a.DO.FirstOrInit(); err != nil { - return nil, err - } else { - return result.(*models.AdminRolePermissionLink), nil - } -} - -func (a adminRolePermissionLinkDo) FirstOrCreate() (*models.AdminRolePermissionLink, error) { - if result, err := a.DO.FirstOrCreate(); err != nil { - return nil, err - } else { - return result.(*models.AdminRolePermissionLink), nil - } -} - -func (a adminRolePermissionLinkDo) FindByPage(offset int, limit int) (result []*models.AdminRolePermissionLink, count int64, err error) { - result, err = a.Offset(offset).Limit(limit).Find() - if err != nil { - return - } - - if size := len(result); 0 < limit && 0 < size && size < limit { - count = int64(size + offset) - return - } - - count, err = a.Offset(-1).Limit(-1).Count() - return -} - -func (a adminRolePermissionLinkDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) { - count, err = a.Count() - if err != nil { - return - } - - err = a.Offset(offset).Limit(limit).Scan(result) - return -} - -func (a adminRolePermissionLinkDo) Scan(result interface{}) (err error) { - return a.DO.Scan(result) -} - -func (a adminRolePermissionLinkDo) Delete(models ...*models.AdminRolePermissionLink) (result gen.ResultInfo, err error) { - return a.DO.Delete(models) -} - -func (a *adminRolePermissionLinkDo) withDO(do gen.Dao) *adminRolePermissionLinkDo { - a.DO = *do.(*gen.DO) - return a -} diff --git a/web/queries/announcement.gen.go b/web/queries/announcement.gen.go index 291913a..0ce972b 100644 --- a/web/queries/announcement.gen.go +++ b/web/queries/announcement.gen.go @@ -28,15 +28,15 @@ func newAnnouncement(db *gorm.DB, opts ...gen.DOOption) announcement { tableName := _announcement.announcementDo.TableName() _announcement.ALL = field.NewAsterisk(tableName) _announcement.ID = field.NewInt32(tableName, "id") + _announcement.CreatedAt = field.NewTime(tableName, "created_at") + _announcement.UpdatedAt = field.NewTime(tableName, "updated_at") + _announcement.DeletedAt = field.NewField(tableName, "deleted_at") _announcement.Title = field.NewString(tableName, "title") _announcement.Content = field.NewString(tableName, "content") - _announcement.Type = field.NewInt32(tableName, "type") + _announcement.Type = field.NewInt(tableName, "type") _announcement.Pin = field.NewBool(tableName, "pin") - _announcement.Status = field.NewInt32(tableName, "status") + _announcement.Status = field.NewInt(tableName, "status") _announcement.Sort = field.NewInt32(tableName, "sort") - _announcement.CreatedAt = field.NewField(tableName, "created_at") - _announcement.UpdatedAt = field.NewField(tableName, "updated_at") - _announcement.DeletedAt = field.NewField(tableName, "deleted_at") _announcement.fillFieldMap() @@ -47,16 +47,16 @@ type announcement struct { announcementDo ALL field.Asterisk - ID field.Int32 // 公告ID - Title field.String // 公告标题 - Content field.String // 公告内容 - Type field.Int32 // 公告类型:1-普通公告 - Pin field.Bool // 是否置顶 - Status field.Int32 // 公告状态:0-禁用,1-正常 - Sort field.Int32 // 公告排序 - CreatedAt field.Field // 创建时间 - UpdatedAt field.Field // 更新时间 - DeletedAt field.Field // 删除时间 + ID field.Int32 + CreatedAt field.Time + UpdatedAt field.Time + DeletedAt field.Field + Title field.String + Content field.String + Type field.Int + Pin field.Bool + Status field.Int + Sort field.Int32 fieldMap map[string]field.Expr } @@ -74,15 +74,15 @@ func (a announcement) As(alias string) *announcement { func (a *announcement) updateTableName(table string) *announcement { a.ALL = field.NewAsterisk(table) a.ID = field.NewInt32(table, "id") + a.CreatedAt = field.NewTime(table, "created_at") + a.UpdatedAt = field.NewTime(table, "updated_at") + a.DeletedAt = field.NewField(table, "deleted_at") a.Title = field.NewString(table, "title") a.Content = field.NewString(table, "content") - a.Type = field.NewInt32(table, "type") + a.Type = field.NewInt(table, "type") a.Pin = field.NewBool(table, "pin") - a.Status = field.NewInt32(table, "status") + a.Status = field.NewInt(table, "status") a.Sort = field.NewInt32(table, "sort") - a.CreatedAt = field.NewField(table, "created_at") - a.UpdatedAt = field.NewField(table, "updated_at") - a.DeletedAt = field.NewField(table, "deleted_at") a.fillFieldMap() @@ -101,15 +101,15 @@ func (a *announcement) GetFieldByName(fieldName string) (field.OrderExpr, bool) func (a *announcement) fillFieldMap() { a.fieldMap = make(map[string]field.Expr, 10) a.fieldMap["id"] = a.ID + a.fieldMap["created_at"] = a.CreatedAt + a.fieldMap["updated_at"] = a.UpdatedAt + a.fieldMap["deleted_at"] = a.DeletedAt a.fieldMap["title"] = a.Title a.fieldMap["content"] = a.Content a.fieldMap["type"] = a.Type a.fieldMap["pin"] = a.Pin a.fieldMap["status"] = a.Status a.fieldMap["sort"] = a.Sort - a.fieldMap["created_at"] = a.CreatedAt - a.fieldMap["updated_at"] = a.UpdatedAt - a.fieldMap["deleted_at"] = a.DeletedAt } func (a announcement) clone(db *gorm.DB) announcement { diff --git a/web/queries/bill.gen.go b/web/queries/bill.gen.go index 7a17bfc..1949dfc 100644 --- a/web/queries/bill.gen.go +++ b/web/queries/bill.gen.go @@ -28,33 +28,43 @@ func newBill(db *gorm.DB, opts ...gen.DOOption) bill { tableName := _bill.billDo.TableName() _bill.ALL = field.NewAsterisk(tableName) _bill.ID = field.NewInt32(tableName, "id") + _bill.CreatedAt = field.NewTime(tableName, "created_at") + _bill.UpdatedAt = field.NewTime(tableName, "updated_at") + _bill.DeletedAt = field.NewField(tableName, "deleted_at") _bill.UserID = field.NewInt32(tableName, "user_id") _bill.TradeID = field.NewInt32(tableName, "trade_id") _bill.ResourceID = field.NewInt32(tableName, "resource_id") _bill.RefundID = field.NewInt32(tableName, "refund_id") _bill.BillNo = field.NewString(tableName, "bill_no") _bill.Info = field.NewString(tableName, "info") - _bill.Type = field.NewInt32(tableName, "type") + _bill.Type = field.NewInt(tableName, "type") _bill.Amount = field.NewField(tableName, "amount") - _bill.CreatedAt = field.NewField(tableName, "created_at") - _bill.UpdatedAt = field.NewField(tableName, "updated_at") - _bill.DeletedAt = field.NewField(tableName, "deleted_at") + _bill.User = billBelongsToUser{ + db: db.Session(&gorm.Session{}), + + RelationField: field.NewRelation("User", "models.User"), + Admin: struct { + field.RelationField + }{ + RelationField: field.NewRelation("User.Admin", "models.Admin"), + }, + } + _bill.Trade = billBelongsToTrade{ db: db.Session(&gorm.Session{}), RelationField: field.NewRelation("Trade", "models.Trade"), } - _bill.Refund = billBelongsToRefund{ - db: db.Session(&gorm.Session{}), - - RelationField: field.NewRelation("Refund", "models.Refund"), - } - _bill.Resource = billBelongsToResource{ db: db.Session(&gorm.Session{}), RelationField: field.NewRelation("Resource", "models.Resource"), + User: struct { + field.RelationField + }{ + RelationField: field.NewRelation("Resource.User", "models.User"), + }, Short: struct { field.RelationField }{ @@ -67,6 +77,12 @@ func newBill(db *gorm.DB, opts ...gen.DOOption) bill { }, } + _bill.Refund = billBelongsToRefund{ + db: db.Session(&gorm.Session{}), + + RelationField: field.NewRelation("Refund", "models.Refund"), + } + _bill.fillFieldMap() return _bill @@ -76,24 +92,26 @@ type bill struct { billDo ALL field.Asterisk - ID field.Int32 // 账单ID - UserID field.Int32 // 用户ID - TradeID field.Int32 // 订单ID - ResourceID field.Int32 // 套餐ID - RefundID field.Int32 // 退款ID - BillNo field.String // 易读账单号 - Info field.String // 产品可读信息 - Type field.Int32 // 账单类型:1-消费,2-退款,3-充值 - Amount field.Field // 账单金额 - CreatedAt field.Field // 创建时间 - UpdatedAt field.Field // 更新时间 - DeletedAt field.Field // 删除时间 - Trade billBelongsToTrade + ID field.Int32 + CreatedAt field.Time + UpdatedAt field.Time + DeletedAt field.Field + UserID field.Int32 + TradeID field.Int32 + ResourceID field.Int32 + RefundID field.Int32 + BillNo field.String + Info field.String + Type field.Int + Amount field.Field + User billBelongsToUser - Refund billBelongsToRefund + Trade billBelongsToTrade Resource billBelongsToResource + Refund billBelongsToRefund + fieldMap map[string]field.Expr } @@ -110,17 +128,17 @@ func (b bill) As(alias string) *bill { func (b *bill) updateTableName(table string) *bill { b.ALL = field.NewAsterisk(table) b.ID = field.NewInt32(table, "id") + b.CreatedAt = field.NewTime(table, "created_at") + b.UpdatedAt = field.NewTime(table, "updated_at") + b.DeletedAt = field.NewField(table, "deleted_at") b.UserID = field.NewInt32(table, "user_id") b.TradeID = field.NewInt32(table, "trade_id") b.ResourceID = field.NewInt32(table, "resource_id") b.RefundID = field.NewInt32(table, "refund_id") b.BillNo = field.NewString(table, "bill_no") b.Info = field.NewString(table, "info") - b.Type = field.NewInt32(table, "type") + b.Type = field.NewInt(table, "type") b.Amount = field.NewField(table, "amount") - b.CreatedAt = field.NewField(table, "created_at") - b.UpdatedAt = field.NewField(table, "updated_at") - b.DeletedAt = field.NewField(table, "deleted_at") b.fillFieldMap() @@ -137,8 +155,11 @@ func (b *bill) GetFieldByName(fieldName string) (field.OrderExpr, bool) { } func (b *bill) fillFieldMap() { - b.fieldMap = make(map[string]field.Expr, 15) + b.fieldMap = make(map[string]field.Expr, 16) b.fieldMap["id"] = b.ID + b.fieldMap["created_at"] = b.CreatedAt + b.fieldMap["updated_at"] = b.UpdatedAt + b.fieldMap["deleted_at"] = b.DeletedAt b.fieldMap["user_id"] = b.UserID b.fieldMap["trade_id"] = b.TradeID b.fieldMap["resource_id"] = b.ResourceID @@ -147,31 +168,116 @@ func (b *bill) fillFieldMap() { b.fieldMap["info"] = b.Info b.fieldMap["type"] = b.Type b.fieldMap["amount"] = b.Amount - b.fieldMap["created_at"] = b.CreatedAt - b.fieldMap["updated_at"] = b.UpdatedAt - b.fieldMap["deleted_at"] = b.DeletedAt } func (b bill) clone(db *gorm.DB) bill { b.billDo.ReplaceConnPool(db.Statement.ConnPool) + b.User.db = db.Session(&gorm.Session{Initialized: true}) + b.User.db.Statement.ConnPool = db.Statement.ConnPool b.Trade.db = db.Session(&gorm.Session{Initialized: true}) b.Trade.db.Statement.ConnPool = db.Statement.ConnPool - b.Refund.db = db.Session(&gorm.Session{Initialized: true}) - b.Refund.db.Statement.ConnPool = db.Statement.ConnPool b.Resource.db = db.Session(&gorm.Session{Initialized: true}) b.Resource.db.Statement.ConnPool = db.Statement.ConnPool + b.Refund.db = db.Session(&gorm.Session{Initialized: true}) + b.Refund.db.Statement.ConnPool = db.Statement.ConnPool return b } func (b bill) replaceDB(db *gorm.DB) bill { b.billDo.ReplaceDB(db) + b.User.db = db.Session(&gorm.Session{}) b.Trade.db = db.Session(&gorm.Session{}) - b.Refund.db = db.Session(&gorm.Session{}) b.Resource.db = db.Session(&gorm.Session{}) + b.Refund.db = db.Session(&gorm.Session{}) return b } +type billBelongsToUser struct { + db *gorm.DB + + field.RelationField + + Admin struct { + field.RelationField + } +} + +func (a billBelongsToUser) Where(conds ...field.Expr) *billBelongsToUser { + if len(conds) == 0 { + return &a + } + + exprs := make([]clause.Expression, 0, len(conds)) + for _, cond := range conds { + exprs = append(exprs, cond.BeCond().(clause.Expression)) + } + a.db = a.db.Clauses(clause.Where{Exprs: exprs}) + return &a +} + +func (a billBelongsToUser) WithContext(ctx context.Context) *billBelongsToUser { + a.db = a.db.WithContext(ctx) + return &a +} + +func (a billBelongsToUser) Session(session *gorm.Session) *billBelongsToUser { + a.db = a.db.Session(session) + return &a +} + +func (a billBelongsToUser) Model(m *models.Bill) *billBelongsToUserTx { + return &billBelongsToUserTx{a.db.Model(m).Association(a.Name())} +} + +func (a billBelongsToUser) Unscoped() *billBelongsToUser { + a.db = a.db.Unscoped() + return &a +} + +type billBelongsToUserTx struct{ tx *gorm.Association } + +func (a billBelongsToUserTx) Find() (result *models.User, err error) { + return result, a.tx.Find(&result) +} + +func (a billBelongsToUserTx) Append(values ...*models.User) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Append(targetValues...) +} + +func (a billBelongsToUserTx) Replace(values ...*models.User) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Replace(targetValues...) +} + +func (a billBelongsToUserTx) Delete(values ...*models.User) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Delete(targetValues...) +} + +func (a billBelongsToUserTx) Clear() error { + return a.tx.Clear() +} + +func (a billBelongsToUserTx) Count() int64 { + return a.tx.Count() +} + +func (a billBelongsToUserTx) Unscoped() *billBelongsToUserTx { + a.tx = a.tx.Unscoped() + return &a +} + type billBelongsToTrade struct { db *gorm.DB @@ -253,92 +359,14 @@ func (a billBelongsToTradeTx) Unscoped() *billBelongsToTradeTx { return &a } -type billBelongsToRefund struct { - db *gorm.DB - - field.RelationField -} - -func (a billBelongsToRefund) Where(conds ...field.Expr) *billBelongsToRefund { - if len(conds) == 0 { - return &a - } - - exprs := make([]clause.Expression, 0, len(conds)) - for _, cond := range conds { - exprs = append(exprs, cond.BeCond().(clause.Expression)) - } - a.db = a.db.Clauses(clause.Where{Exprs: exprs}) - return &a -} - -func (a billBelongsToRefund) WithContext(ctx context.Context) *billBelongsToRefund { - a.db = a.db.WithContext(ctx) - return &a -} - -func (a billBelongsToRefund) Session(session *gorm.Session) *billBelongsToRefund { - a.db = a.db.Session(session) - return &a -} - -func (a billBelongsToRefund) Model(m *models.Bill) *billBelongsToRefundTx { - return &billBelongsToRefundTx{a.db.Model(m).Association(a.Name())} -} - -func (a billBelongsToRefund) Unscoped() *billBelongsToRefund { - a.db = a.db.Unscoped() - return &a -} - -type billBelongsToRefundTx struct{ tx *gorm.Association } - -func (a billBelongsToRefundTx) Find() (result *models.Refund, err error) { - return result, a.tx.Find(&result) -} - -func (a billBelongsToRefundTx) Append(values ...*models.Refund) (err error) { - targetValues := make([]interface{}, len(values)) - for i, v := range values { - targetValues[i] = v - } - return a.tx.Append(targetValues...) -} - -func (a billBelongsToRefundTx) Replace(values ...*models.Refund) (err error) { - targetValues := make([]interface{}, len(values)) - for i, v := range values { - targetValues[i] = v - } - return a.tx.Replace(targetValues...) -} - -func (a billBelongsToRefundTx) Delete(values ...*models.Refund) (err error) { - targetValues := make([]interface{}, len(values)) - for i, v := range values { - targetValues[i] = v - } - return a.tx.Delete(targetValues...) -} - -func (a billBelongsToRefundTx) Clear() error { - return a.tx.Clear() -} - -func (a billBelongsToRefundTx) Count() int64 { - return a.tx.Count() -} - -func (a billBelongsToRefundTx) Unscoped() *billBelongsToRefundTx { - a.tx = a.tx.Unscoped() - return &a -} - type billBelongsToResource struct { db *gorm.DB field.RelationField + User struct { + field.RelationField + } Short struct { field.RelationField } @@ -422,6 +450,87 @@ func (a billBelongsToResourceTx) Unscoped() *billBelongsToResourceTx { return &a } +type billBelongsToRefund struct { + db *gorm.DB + + field.RelationField +} + +func (a billBelongsToRefund) Where(conds ...field.Expr) *billBelongsToRefund { + if len(conds) == 0 { + return &a + } + + exprs := make([]clause.Expression, 0, len(conds)) + for _, cond := range conds { + exprs = append(exprs, cond.BeCond().(clause.Expression)) + } + a.db = a.db.Clauses(clause.Where{Exprs: exprs}) + return &a +} + +func (a billBelongsToRefund) WithContext(ctx context.Context) *billBelongsToRefund { + a.db = a.db.WithContext(ctx) + return &a +} + +func (a billBelongsToRefund) Session(session *gorm.Session) *billBelongsToRefund { + a.db = a.db.Session(session) + return &a +} + +func (a billBelongsToRefund) Model(m *models.Bill) *billBelongsToRefundTx { + return &billBelongsToRefundTx{a.db.Model(m).Association(a.Name())} +} + +func (a billBelongsToRefund) Unscoped() *billBelongsToRefund { + a.db = a.db.Unscoped() + return &a +} + +type billBelongsToRefundTx struct{ tx *gorm.Association } + +func (a billBelongsToRefundTx) Find() (result *models.Refund, err error) { + return result, a.tx.Find(&result) +} + +func (a billBelongsToRefundTx) Append(values ...*models.Refund) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Append(targetValues...) +} + +func (a billBelongsToRefundTx) Replace(values ...*models.Refund) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Replace(targetValues...) +} + +func (a billBelongsToRefundTx) Delete(values ...*models.Refund) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Delete(targetValues...) +} + +func (a billBelongsToRefundTx) Clear() error { + return a.tx.Clear() +} + +func (a billBelongsToRefundTx) Count() int64 { + return a.tx.Count() +} + +func (a billBelongsToRefundTx) Unscoped() *billBelongsToRefundTx { + a.tx = a.tx.Unscoped() + return &a +} + type billDo struct{ gen.DO } func (b billDo) Debug() *billDo { diff --git a/web/queries/channel.gen.go b/web/queries/channel.gen.go index fdb750c..c4f2a2a 100644 --- a/web/queries/channel.gen.go +++ b/web/queries/channel.gen.go @@ -28,23 +28,103 @@ func newChannel(db *gorm.DB, opts ...gen.DOOption) channel { tableName := _channel.channelDo.TableName() _channel.ALL = field.NewAsterisk(tableName) _channel.ID = field.NewInt32(tableName, "id") + _channel.CreatedAt = field.NewTime(tableName, "created_at") + _channel.UpdatedAt = field.NewTime(tableName, "updated_at") + _channel.DeletedAt = field.NewField(tableName, "deleted_at") _channel.UserID = field.NewInt32(tableName, "user_id") - _channel.ProxyID = field.NewInt32(tableName, "proxy_id") - _channel.EdgeID = field.NewInt32(tableName, "edge_id") _channel.ResourceID = field.NewInt32(tableName, "resource_id") - _channel.ProxyHost = field.NewString(tableName, "proxy_host") - _channel.ProxyPort = field.NewInt32(tableName, "proxy_port") - _channel.EdgeHost = field.NewString(tableName, "edge_host") - _channel.Protocol = field.NewInt32(tableName, "protocol") - _channel.AuthIP = field.NewBool(tableName, "auth_ip") - _channel.Whitelists = field.NewString(tableName, "whitelists") - _channel.AuthPass = field.NewBool(tableName, "auth_pass") + _channel.ProxyID = field.NewInt32(tableName, "proxy_id") + _channel.BatchNo = field.NewString(tableName, "batch_no") + _channel.Port = field.NewUint16(tableName, "port") + _channel.EdgeID = field.NewInt32(tableName, "edge_id") + _channel.FilterISP = field.NewInt(tableName, "filter_isp") + _channel.FilterProv = field.NewString(tableName, "filter_prov") + _channel.FilterCity = field.NewString(tableName, "filter_city") + _channel.IP = field.NewField(tableName, "ip") + _channel.Whitelists = field.NewField(tableName, "whitelists") _channel.Username = field.NewString(tableName, "username") _channel.Password = field.NewString(tableName, "password") - _channel.Expiration = field.NewField(tableName, "expiration") - _channel.CreatedAt = field.NewField(tableName, "created_at") - _channel.UpdatedAt = field.NewField(tableName, "updated_at") - _channel.DeletedAt = field.NewField(tableName, "deleted_at") + _channel.ExpiredAt = field.NewTime(tableName, "expired_at") + _channel.User = channelBelongsToUser{ + db: db.Session(&gorm.Session{}), + + RelationField: field.NewRelation("User", "models.User"), + Admin: struct { + field.RelationField + }{ + RelationField: field.NewRelation("User.Admin", "models.Admin"), + }, + } + + _channel.Resource = channelBelongsToResource{ + db: db.Session(&gorm.Session{}), + + RelationField: field.NewRelation("Resource", "models.Resource"), + User: struct { + field.RelationField + }{ + RelationField: field.NewRelation("Resource.User", "models.User"), + }, + Short: struct { + field.RelationField + }{ + RelationField: field.NewRelation("Resource.Short", "models.ResourceShort"), + }, + Long: struct { + field.RelationField + }{ + RelationField: field.NewRelation("Resource.Long", "models.ResourceLong"), + }, + } + + _channel.Proxy = channelBelongsToProxy{ + db: db.Session(&gorm.Session{}), + + RelationField: field.NewRelation("Proxy", "models.Proxy"), + Channels: struct { + field.RelationField + User struct { + field.RelationField + } + Resource struct { + field.RelationField + } + Proxy struct { + field.RelationField + } + Edge struct { + field.RelationField + } + }{ + RelationField: field.NewRelation("Proxy.Channels", "models.Channel"), + User: struct { + field.RelationField + }{ + RelationField: field.NewRelation("Proxy.Channels.User", "models.User"), + }, + Resource: struct { + field.RelationField + }{ + RelationField: field.NewRelation("Proxy.Channels.Resource", "models.Resource"), + }, + Proxy: struct { + field.RelationField + }{ + RelationField: field.NewRelation("Proxy.Channels.Proxy", "models.Proxy"), + }, + Edge: struct { + field.RelationField + }{ + RelationField: field.NewRelation("Proxy.Channels.Edge", "models.Edge"), + }, + }, + } + + _channel.Edge = channelBelongsToEdge{ + db: db.Session(&gorm.Session{}), + + RelationField: field.NewRelation("Edge", "models.Edge"), + } _channel.fillFieldMap() @@ -55,24 +135,31 @@ type channel struct { channelDo ALL field.Asterisk - ID field.Int32 // 通道ID - UserID field.Int32 // 用户ID - ProxyID field.Int32 // 代理ID - EdgeID field.Int32 // 节点ID - ResourceID field.Int32 // 套餐ID - ProxyHost field.String // 代理地址 - ProxyPort field.Int32 // 转发端口 - EdgeHost field.String // 节点地址 - Protocol field.Int32 // 协议类型:1-http,2-https,3-socks5 - AuthIP field.Bool // IP认证 - Whitelists field.String // IP白名单,逗号分隔 - AuthPass field.Bool // 密码认证 - Username field.String // 用户名 - Password field.String // 密码 - Expiration field.Field // 过期时间 - CreatedAt field.Field // 创建时间 - UpdatedAt field.Field // 更新时间 - DeletedAt field.Field // 删除时间 + ID field.Int32 + CreatedAt field.Time + UpdatedAt field.Time + DeletedAt field.Field + UserID field.Int32 + ResourceID field.Int32 + ProxyID field.Int32 + BatchNo field.String + Port field.Uint16 + EdgeID field.Int32 + FilterISP field.Int + FilterProv field.String + FilterCity field.String + IP field.Field + Whitelists field.Field + Username field.String + Password field.String + ExpiredAt field.Time + User channelBelongsToUser + + Resource channelBelongsToResource + + Proxy channelBelongsToProxy + + Edge channelBelongsToEdge fieldMap map[string]field.Expr } @@ -90,23 +177,23 @@ func (c channel) As(alias string) *channel { func (c *channel) updateTableName(table string) *channel { c.ALL = field.NewAsterisk(table) c.ID = field.NewInt32(table, "id") + c.CreatedAt = field.NewTime(table, "created_at") + c.UpdatedAt = field.NewTime(table, "updated_at") + c.DeletedAt = field.NewField(table, "deleted_at") c.UserID = field.NewInt32(table, "user_id") - c.ProxyID = field.NewInt32(table, "proxy_id") - c.EdgeID = field.NewInt32(table, "edge_id") c.ResourceID = field.NewInt32(table, "resource_id") - c.ProxyHost = field.NewString(table, "proxy_host") - c.ProxyPort = field.NewInt32(table, "proxy_port") - c.EdgeHost = field.NewString(table, "edge_host") - c.Protocol = field.NewInt32(table, "protocol") - c.AuthIP = field.NewBool(table, "auth_ip") - c.Whitelists = field.NewString(table, "whitelists") - c.AuthPass = field.NewBool(table, "auth_pass") + c.ProxyID = field.NewInt32(table, "proxy_id") + c.BatchNo = field.NewString(table, "batch_no") + c.Port = field.NewUint16(table, "port") + c.EdgeID = field.NewInt32(table, "edge_id") + c.FilterISP = field.NewInt(table, "filter_isp") + c.FilterProv = field.NewString(table, "filter_prov") + c.FilterCity = field.NewString(table, "filter_city") + c.IP = field.NewField(table, "ip") + c.Whitelists = field.NewField(table, "whitelists") c.Username = field.NewString(table, "username") c.Password = field.NewString(table, "password") - c.Expiration = field.NewField(table, "expiration") - c.CreatedAt = field.NewField(table, "created_at") - c.UpdatedAt = field.NewField(table, "updated_at") - c.DeletedAt = field.NewField(table, "deleted_at") + c.ExpiredAt = field.NewTime(table, "expired_at") c.fillFieldMap() @@ -123,37 +210,404 @@ func (c *channel) GetFieldByName(fieldName string) (field.OrderExpr, bool) { } func (c *channel) fillFieldMap() { - c.fieldMap = make(map[string]field.Expr, 18) + c.fieldMap = make(map[string]field.Expr, 22) c.fieldMap["id"] = c.ID - c.fieldMap["user_id"] = c.UserID - c.fieldMap["proxy_id"] = c.ProxyID - c.fieldMap["edge_id"] = c.EdgeID - c.fieldMap["resource_id"] = c.ResourceID - c.fieldMap["proxy_host"] = c.ProxyHost - c.fieldMap["proxy_port"] = c.ProxyPort - c.fieldMap["edge_host"] = c.EdgeHost - c.fieldMap["protocol"] = c.Protocol - c.fieldMap["auth_ip"] = c.AuthIP - c.fieldMap["whitelists"] = c.Whitelists - c.fieldMap["auth_pass"] = c.AuthPass - c.fieldMap["username"] = c.Username - c.fieldMap["password"] = c.Password - c.fieldMap["expiration"] = c.Expiration c.fieldMap["created_at"] = c.CreatedAt c.fieldMap["updated_at"] = c.UpdatedAt c.fieldMap["deleted_at"] = c.DeletedAt + c.fieldMap["user_id"] = c.UserID + c.fieldMap["resource_id"] = c.ResourceID + c.fieldMap["proxy_id"] = c.ProxyID + c.fieldMap["batch_no"] = c.BatchNo + c.fieldMap["port"] = c.Port + c.fieldMap["edge_id"] = c.EdgeID + c.fieldMap["filter_isp"] = c.FilterISP + c.fieldMap["filter_prov"] = c.FilterProv + c.fieldMap["filter_city"] = c.FilterCity + c.fieldMap["ip"] = c.IP + c.fieldMap["whitelists"] = c.Whitelists + c.fieldMap["username"] = c.Username + c.fieldMap["password"] = c.Password + c.fieldMap["expired_at"] = c.ExpiredAt + } func (c channel) clone(db *gorm.DB) channel { c.channelDo.ReplaceConnPool(db.Statement.ConnPool) + c.User.db = db.Session(&gorm.Session{Initialized: true}) + c.User.db.Statement.ConnPool = db.Statement.ConnPool + c.Resource.db = db.Session(&gorm.Session{Initialized: true}) + c.Resource.db.Statement.ConnPool = db.Statement.ConnPool + c.Proxy.db = db.Session(&gorm.Session{Initialized: true}) + c.Proxy.db.Statement.ConnPool = db.Statement.ConnPool + c.Edge.db = db.Session(&gorm.Session{Initialized: true}) + c.Edge.db.Statement.ConnPool = db.Statement.ConnPool return c } func (c channel) replaceDB(db *gorm.DB) channel { c.channelDo.ReplaceDB(db) + c.User.db = db.Session(&gorm.Session{}) + c.Resource.db = db.Session(&gorm.Session{}) + c.Proxy.db = db.Session(&gorm.Session{}) + c.Edge.db = db.Session(&gorm.Session{}) return c } +type channelBelongsToUser struct { + db *gorm.DB + + field.RelationField + + Admin struct { + field.RelationField + } +} + +func (a channelBelongsToUser) Where(conds ...field.Expr) *channelBelongsToUser { + if len(conds) == 0 { + return &a + } + + exprs := make([]clause.Expression, 0, len(conds)) + for _, cond := range conds { + exprs = append(exprs, cond.BeCond().(clause.Expression)) + } + a.db = a.db.Clauses(clause.Where{Exprs: exprs}) + return &a +} + +func (a channelBelongsToUser) WithContext(ctx context.Context) *channelBelongsToUser { + a.db = a.db.WithContext(ctx) + return &a +} + +func (a channelBelongsToUser) Session(session *gorm.Session) *channelBelongsToUser { + a.db = a.db.Session(session) + return &a +} + +func (a channelBelongsToUser) Model(m *models.Channel) *channelBelongsToUserTx { + return &channelBelongsToUserTx{a.db.Model(m).Association(a.Name())} +} + +func (a channelBelongsToUser) Unscoped() *channelBelongsToUser { + a.db = a.db.Unscoped() + return &a +} + +type channelBelongsToUserTx struct{ tx *gorm.Association } + +func (a channelBelongsToUserTx) Find() (result *models.User, err error) { + return result, a.tx.Find(&result) +} + +func (a channelBelongsToUserTx) Append(values ...*models.User) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Append(targetValues...) +} + +func (a channelBelongsToUserTx) Replace(values ...*models.User) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Replace(targetValues...) +} + +func (a channelBelongsToUserTx) Delete(values ...*models.User) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Delete(targetValues...) +} + +func (a channelBelongsToUserTx) Clear() error { + return a.tx.Clear() +} + +func (a channelBelongsToUserTx) Count() int64 { + return a.tx.Count() +} + +func (a channelBelongsToUserTx) Unscoped() *channelBelongsToUserTx { + a.tx = a.tx.Unscoped() + return &a +} + +type channelBelongsToResource struct { + db *gorm.DB + + field.RelationField + + User struct { + field.RelationField + } + Short struct { + field.RelationField + } + Long struct { + field.RelationField + } +} + +func (a channelBelongsToResource) Where(conds ...field.Expr) *channelBelongsToResource { + if len(conds) == 0 { + return &a + } + + exprs := make([]clause.Expression, 0, len(conds)) + for _, cond := range conds { + exprs = append(exprs, cond.BeCond().(clause.Expression)) + } + a.db = a.db.Clauses(clause.Where{Exprs: exprs}) + return &a +} + +func (a channelBelongsToResource) WithContext(ctx context.Context) *channelBelongsToResource { + a.db = a.db.WithContext(ctx) + return &a +} + +func (a channelBelongsToResource) Session(session *gorm.Session) *channelBelongsToResource { + a.db = a.db.Session(session) + return &a +} + +func (a channelBelongsToResource) Model(m *models.Channel) *channelBelongsToResourceTx { + return &channelBelongsToResourceTx{a.db.Model(m).Association(a.Name())} +} + +func (a channelBelongsToResource) Unscoped() *channelBelongsToResource { + a.db = a.db.Unscoped() + return &a +} + +type channelBelongsToResourceTx struct{ tx *gorm.Association } + +func (a channelBelongsToResourceTx) Find() (result *models.Resource, err error) { + return result, a.tx.Find(&result) +} + +func (a channelBelongsToResourceTx) Append(values ...*models.Resource) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Append(targetValues...) +} + +func (a channelBelongsToResourceTx) Replace(values ...*models.Resource) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Replace(targetValues...) +} + +func (a channelBelongsToResourceTx) Delete(values ...*models.Resource) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Delete(targetValues...) +} + +func (a channelBelongsToResourceTx) Clear() error { + return a.tx.Clear() +} + +func (a channelBelongsToResourceTx) Count() int64 { + return a.tx.Count() +} + +func (a channelBelongsToResourceTx) Unscoped() *channelBelongsToResourceTx { + a.tx = a.tx.Unscoped() + return &a +} + +type channelBelongsToProxy struct { + db *gorm.DB + + field.RelationField + + Channels struct { + field.RelationField + User struct { + field.RelationField + } + Resource struct { + field.RelationField + } + Proxy struct { + field.RelationField + } + Edge struct { + field.RelationField + } + } +} + +func (a channelBelongsToProxy) Where(conds ...field.Expr) *channelBelongsToProxy { + if len(conds) == 0 { + return &a + } + + exprs := make([]clause.Expression, 0, len(conds)) + for _, cond := range conds { + exprs = append(exprs, cond.BeCond().(clause.Expression)) + } + a.db = a.db.Clauses(clause.Where{Exprs: exprs}) + return &a +} + +func (a channelBelongsToProxy) WithContext(ctx context.Context) *channelBelongsToProxy { + a.db = a.db.WithContext(ctx) + return &a +} + +func (a channelBelongsToProxy) Session(session *gorm.Session) *channelBelongsToProxy { + a.db = a.db.Session(session) + return &a +} + +func (a channelBelongsToProxy) Model(m *models.Channel) *channelBelongsToProxyTx { + return &channelBelongsToProxyTx{a.db.Model(m).Association(a.Name())} +} + +func (a channelBelongsToProxy) Unscoped() *channelBelongsToProxy { + a.db = a.db.Unscoped() + return &a +} + +type channelBelongsToProxyTx struct{ tx *gorm.Association } + +func (a channelBelongsToProxyTx) Find() (result *models.Proxy, err error) { + return result, a.tx.Find(&result) +} + +func (a channelBelongsToProxyTx) Append(values ...*models.Proxy) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Append(targetValues...) +} + +func (a channelBelongsToProxyTx) Replace(values ...*models.Proxy) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Replace(targetValues...) +} + +func (a channelBelongsToProxyTx) Delete(values ...*models.Proxy) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Delete(targetValues...) +} + +func (a channelBelongsToProxyTx) Clear() error { + return a.tx.Clear() +} + +func (a channelBelongsToProxyTx) Count() int64 { + return a.tx.Count() +} + +func (a channelBelongsToProxyTx) Unscoped() *channelBelongsToProxyTx { + a.tx = a.tx.Unscoped() + return &a +} + +type channelBelongsToEdge struct { + db *gorm.DB + + field.RelationField +} + +func (a channelBelongsToEdge) Where(conds ...field.Expr) *channelBelongsToEdge { + if len(conds) == 0 { + return &a + } + + exprs := make([]clause.Expression, 0, len(conds)) + for _, cond := range conds { + exprs = append(exprs, cond.BeCond().(clause.Expression)) + } + a.db = a.db.Clauses(clause.Where{Exprs: exprs}) + return &a +} + +func (a channelBelongsToEdge) WithContext(ctx context.Context) *channelBelongsToEdge { + a.db = a.db.WithContext(ctx) + return &a +} + +func (a channelBelongsToEdge) Session(session *gorm.Session) *channelBelongsToEdge { + a.db = a.db.Session(session) + return &a +} + +func (a channelBelongsToEdge) Model(m *models.Channel) *channelBelongsToEdgeTx { + return &channelBelongsToEdgeTx{a.db.Model(m).Association(a.Name())} +} + +func (a channelBelongsToEdge) Unscoped() *channelBelongsToEdge { + a.db = a.db.Unscoped() + return &a +} + +type channelBelongsToEdgeTx struct{ tx *gorm.Association } + +func (a channelBelongsToEdgeTx) Find() (result *models.Edge, err error) { + return result, a.tx.Find(&result) +} + +func (a channelBelongsToEdgeTx) Append(values ...*models.Edge) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Append(targetValues...) +} + +func (a channelBelongsToEdgeTx) Replace(values ...*models.Edge) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Replace(targetValues...) +} + +func (a channelBelongsToEdgeTx) Delete(values ...*models.Edge) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Delete(targetValues...) +} + +func (a channelBelongsToEdgeTx) Clear() error { + return a.tx.Clear() +} + +func (a channelBelongsToEdgeTx) Count() int64 { + return a.tx.Count() +} + +func (a channelBelongsToEdgeTx) Unscoped() *channelBelongsToEdgeTx { + a.tx = a.tx.Unscoped() + return &a +} + type channelDo struct{ gen.DO } func (c channelDo) Debug() *channelDo { diff --git a/web/queries/client.gen.go b/web/queries/client.gen.go index 6c0247f..79874f7 100644 --- a/web/queries/client.gen.go +++ b/web/queries/client.gen.go @@ -28,17 +28,17 @@ func newClient(db *gorm.DB, opts ...gen.DOOption) client { tableName := _client.clientDo.TableName() _client.ALL = field.NewAsterisk(tableName) _client.ID = field.NewInt32(tableName, "id") + _client.CreatedAt = field.NewTime(tableName, "created_at") + _client.UpdatedAt = field.NewTime(tableName, "updated_at") + _client.DeletedAt = field.NewField(tableName, "deleted_at") _client.ClientID = field.NewString(tableName, "client_id") _client.ClientSecret = field.NewString(tableName, "client_secret") _client.RedirectURI = field.NewString(tableName, "redirect_uri") - _client.Spec = field.NewInt32(tableName, "spec") + _client.Spec = field.NewInt(tableName, "spec") _client.Name = field.NewString(tableName, "name") _client.Icon = field.NewString(tableName, "icon") - _client.Status = field.NewInt32(tableName, "status") - _client.Type = field.NewInt32(tableName, "type") - _client.CreatedAt = field.NewField(tableName, "created_at") - _client.UpdatedAt = field.NewField(tableName, "updated_at") - _client.DeletedAt = field.NewField(tableName, "deleted_at") + _client.Status = field.NewInt(tableName, "status") + _client.Type = field.NewInt(tableName, "type") _client.fillFieldMap() @@ -49,18 +49,18 @@ type client struct { clientDo ALL field.Asterisk - ID field.Int32 // 客户端ID - ClientID field.String // OAuth2客户端标识符 - ClientSecret field.String // OAuth2客户端密钥 - RedirectURI field.String // OAuth2 重定向URI - Spec field.Int32 // 安全规范:1-native,2-browser,3-web,4-api - Name field.String // 名称 - Icon field.String // 图标URL - Status field.Int32 // 状态:0-禁用,1-正常 - Type field.Int32 // 类型:0-普通,1-官方 - CreatedAt field.Field // 创建时间 - UpdatedAt field.Field // 更新时间 - DeletedAt field.Field // 删除时间 + ID field.Int32 + CreatedAt field.Time + UpdatedAt field.Time + DeletedAt field.Field + ClientID field.String + ClientSecret field.String + RedirectURI field.String + Spec field.Int + Name field.String + Icon field.String + Status field.Int + Type field.Int fieldMap map[string]field.Expr } @@ -78,17 +78,17 @@ func (c client) As(alias string) *client { func (c *client) updateTableName(table string) *client { c.ALL = field.NewAsterisk(table) c.ID = field.NewInt32(table, "id") + c.CreatedAt = field.NewTime(table, "created_at") + c.UpdatedAt = field.NewTime(table, "updated_at") + c.DeletedAt = field.NewField(table, "deleted_at") c.ClientID = field.NewString(table, "client_id") c.ClientSecret = field.NewString(table, "client_secret") c.RedirectURI = field.NewString(table, "redirect_uri") - c.Spec = field.NewInt32(table, "spec") + c.Spec = field.NewInt(table, "spec") c.Name = field.NewString(table, "name") c.Icon = field.NewString(table, "icon") - c.Status = field.NewInt32(table, "status") - c.Type = field.NewInt32(table, "type") - c.CreatedAt = field.NewField(table, "created_at") - c.UpdatedAt = field.NewField(table, "updated_at") - c.DeletedAt = field.NewField(table, "deleted_at") + c.Status = field.NewInt(table, "status") + c.Type = field.NewInt(table, "type") c.fillFieldMap() @@ -107,6 +107,9 @@ func (c *client) GetFieldByName(fieldName string) (field.OrderExpr, bool) { func (c *client) fillFieldMap() { c.fieldMap = make(map[string]field.Expr, 12) c.fieldMap["id"] = c.ID + c.fieldMap["created_at"] = c.CreatedAt + c.fieldMap["updated_at"] = c.UpdatedAt + c.fieldMap["deleted_at"] = c.DeletedAt c.fieldMap["client_id"] = c.ClientID c.fieldMap["client_secret"] = c.ClientSecret c.fieldMap["redirect_uri"] = c.RedirectURI @@ -115,9 +118,6 @@ func (c *client) fillFieldMap() { c.fieldMap["icon"] = c.Icon c.fieldMap["status"] = c.Status c.fieldMap["type"] = c.Type - c.fieldMap["created_at"] = c.CreatedAt - c.fieldMap["updated_at"] = c.UpdatedAt - c.fieldMap["deleted_at"] = c.DeletedAt } func (c client) clone(db *gorm.DB) client { diff --git a/web/queries/client_permission_link.gen.go b/web/queries/client_permission_link.gen.go deleted file mode 100644 index 02b66f4..0000000 --- a/web/queries/client_permission_link.gen.go +++ /dev/null @@ -1,339 +0,0 @@ -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. - -package queries - -import ( - "context" - - "gorm.io/gorm" - "gorm.io/gorm/clause" - "gorm.io/gorm/schema" - - "gorm.io/gen" - "gorm.io/gen/field" - - "gorm.io/plugin/dbresolver" - - "platform/web/models" -) - -func newClientPermissionLink(db *gorm.DB, opts ...gen.DOOption) clientPermissionLink { - _clientPermissionLink := clientPermissionLink{} - - _clientPermissionLink.clientPermissionLinkDo.UseDB(db, opts...) - _clientPermissionLink.clientPermissionLinkDo.UseModel(&models.ClientPermissionLink{}) - - tableName := _clientPermissionLink.clientPermissionLinkDo.TableName() - _clientPermissionLink.ALL = field.NewAsterisk(tableName) - _clientPermissionLink.ID = field.NewInt32(tableName, "id") - _clientPermissionLink.ClientID = field.NewInt32(tableName, "client_id") - _clientPermissionLink.PermissionID = field.NewInt32(tableName, "permission_id") - _clientPermissionLink.CreatedAt = field.NewField(tableName, "created_at") - _clientPermissionLink.UpdatedAt = field.NewField(tableName, "updated_at") - _clientPermissionLink.DeletedAt = field.NewField(tableName, "deleted_at") - - _clientPermissionLink.fillFieldMap() - - return _clientPermissionLink -} - -type clientPermissionLink struct { - clientPermissionLinkDo - - ALL field.Asterisk - ID field.Int32 // 关联ID - ClientID field.Int32 // 客户端ID - PermissionID field.Int32 // 权限ID - CreatedAt field.Field // 创建时间 - UpdatedAt field.Field // 更新时间 - DeletedAt field.Field // 删除时间 - - fieldMap map[string]field.Expr -} - -func (c clientPermissionLink) Table(newTableName string) *clientPermissionLink { - c.clientPermissionLinkDo.UseTable(newTableName) - return c.updateTableName(newTableName) -} - -func (c clientPermissionLink) As(alias string) *clientPermissionLink { - c.clientPermissionLinkDo.DO = *(c.clientPermissionLinkDo.As(alias).(*gen.DO)) - return c.updateTableName(alias) -} - -func (c *clientPermissionLink) updateTableName(table string) *clientPermissionLink { - c.ALL = field.NewAsterisk(table) - c.ID = field.NewInt32(table, "id") - c.ClientID = field.NewInt32(table, "client_id") - c.PermissionID = field.NewInt32(table, "permission_id") - c.CreatedAt = field.NewField(table, "created_at") - c.UpdatedAt = field.NewField(table, "updated_at") - c.DeletedAt = field.NewField(table, "deleted_at") - - c.fillFieldMap() - - return c -} - -func (c *clientPermissionLink) GetFieldByName(fieldName string) (field.OrderExpr, bool) { - _f, ok := c.fieldMap[fieldName] - if !ok || _f == nil { - return nil, false - } - _oe, ok := _f.(field.OrderExpr) - return _oe, ok -} - -func (c *clientPermissionLink) fillFieldMap() { - c.fieldMap = make(map[string]field.Expr, 6) - c.fieldMap["id"] = c.ID - c.fieldMap["client_id"] = c.ClientID - c.fieldMap["permission_id"] = c.PermissionID - c.fieldMap["created_at"] = c.CreatedAt - c.fieldMap["updated_at"] = c.UpdatedAt - c.fieldMap["deleted_at"] = c.DeletedAt -} - -func (c clientPermissionLink) clone(db *gorm.DB) clientPermissionLink { - c.clientPermissionLinkDo.ReplaceConnPool(db.Statement.ConnPool) - return c -} - -func (c clientPermissionLink) replaceDB(db *gorm.DB) clientPermissionLink { - c.clientPermissionLinkDo.ReplaceDB(db) - return c -} - -type clientPermissionLinkDo struct{ gen.DO } - -func (c clientPermissionLinkDo) Debug() *clientPermissionLinkDo { - return c.withDO(c.DO.Debug()) -} - -func (c clientPermissionLinkDo) WithContext(ctx context.Context) *clientPermissionLinkDo { - return c.withDO(c.DO.WithContext(ctx)) -} - -func (c clientPermissionLinkDo) ReadDB() *clientPermissionLinkDo { - return c.Clauses(dbresolver.Read) -} - -func (c clientPermissionLinkDo) WriteDB() *clientPermissionLinkDo { - return c.Clauses(dbresolver.Write) -} - -func (c clientPermissionLinkDo) Session(config *gorm.Session) *clientPermissionLinkDo { - return c.withDO(c.DO.Session(config)) -} - -func (c clientPermissionLinkDo) Clauses(conds ...clause.Expression) *clientPermissionLinkDo { - return c.withDO(c.DO.Clauses(conds...)) -} - -func (c clientPermissionLinkDo) Returning(value interface{}, columns ...string) *clientPermissionLinkDo { - return c.withDO(c.DO.Returning(value, columns...)) -} - -func (c clientPermissionLinkDo) Not(conds ...gen.Condition) *clientPermissionLinkDo { - return c.withDO(c.DO.Not(conds...)) -} - -func (c clientPermissionLinkDo) Or(conds ...gen.Condition) *clientPermissionLinkDo { - return c.withDO(c.DO.Or(conds...)) -} - -func (c clientPermissionLinkDo) Select(conds ...field.Expr) *clientPermissionLinkDo { - return c.withDO(c.DO.Select(conds...)) -} - -func (c clientPermissionLinkDo) Where(conds ...gen.Condition) *clientPermissionLinkDo { - return c.withDO(c.DO.Where(conds...)) -} - -func (c clientPermissionLinkDo) Order(conds ...field.Expr) *clientPermissionLinkDo { - return c.withDO(c.DO.Order(conds...)) -} - -func (c clientPermissionLinkDo) Distinct(cols ...field.Expr) *clientPermissionLinkDo { - return c.withDO(c.DO.Distinct(cols...)) -} - -func (c clientPermissionLinkDo) Omit(cols ...field.Expr) *clientPermissionLinkDo { - return c.withDO(c.DO.Omit(cols...)) -} - -func (c clientPermissionLinkDo) Join(table schema.Tabler, on ...field.Expr) *clientPermissionLinkDo { - return c.withDO(c.DO.Join(table, on...)) -} - -func (c clientPermissionLinkDo) LeftJoin(table schema.Tabler, on ...field.Expr) *clientPermissionLinkDo { - return c.withDO(c.DO.LeftJoin(table, on...)) -} - -func (c clientPermissionLinkDo) RightJoin(table schema.Tabler, on ...field.Expr) *clientPermissionLinkDo { - return c.withDO(c.DO.RightJoin(table, on...)) -} - -func (c clientPermissionLinkDo) Group(cols ...field.Expr) *clientPermissionLinkDo { - return c.withDO(c.DO.Group(cols...)) -} - -func (c clientPermissionLinkDo) Having(conds ...gen.Condition) *clientPermissionLinkDo { - return c.withDO(c.DO.Having(conds...)) -} - -func (c clientPermissionLinkDo) Limit(limit int) *clientPermissionLinkDo { - return c.withDO(c.DO.Limit(limit)) -} - -func (c clientPermissionLinkDo) Offset(offset int) *clientPermissionLinkDo { - return c.withDO(c.DO.Offset(offset)) -} - -func (c clientPermissionLinkDo) Scopes(funcs ...func(gen.Dao) gen.Dao) *clientPermissionLinkDo { - return c.withDO(c.DO.Scopes(funcs...)) -} - -func (c clientPermissionLinkDo) Unscoped() *clientPermissionLinkDo { - return c.withDO(c.DO.Unscoped()) -} - -func (c clientPermissionLinkDo) Create(values ...*models.ClientPermissionLink) error { - if len(values) == 0 { - return nil - } - return c.DO.Create(values) -} - -func (c clientPermissionLinkDo) CreateInBatches(values []*models.ClientPermissionLink, batchSize int) error { - return c.DO.CreateInBatches(values, batchSize) -} - -// Save : !!! underlying implementation is different with GORM -// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values) -func (c clientPermissionLinkDo) Save(values ...*models.ClientPermissionLink) error { - if len(values) == 0 { - return nil - } - return c.DO.Save(values) -} - -func (c clientPermissionLinkDo) First() (*models.ClientPermissionLink, error) { - if result, err := c.DO.First(); err != nil { - return nil, err - } else { - return result.(*models.ClientPermissionLink), nil - } -} - -func (c clientPermissionLinkDo) Take() (*models.ClientPermissionLink, error) { - if result, err := c.DO.Take(); err != nil { - return nil, err - } else { - return result.(*models.ClientPermissionLink), nil - } -} - -func (c clientPermissionLinkDo) Last() (*models.ClientPermissionLink, error) { - if result, err := c.DO.Last(); err != nil { - return nil, err - } else { - return result.(*models.ClientPermissionLink), nil - } -} - -func (c clientPermissionLinkDo) Find() ([]*models.ClientPermissionLink, error) { - result, err := c.DO.Find() - return result.([]*models.ClientPermissionLink), err -} - -func (c clientPermissionLinkDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.ClientPermissionLink, err error) { - buf := make([]*models.ClientPermissionLink, 0, batchSize) - err = c.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error { - defer func() { results = append(results, buf...) }() - return fc(tx, batch) - }) - return results, err -} - -func (c clientPermissionLinkDo) FindInBatches(result *[]*models.ClientPermissionLink, batchSize int, fc func(tx gen.Dao, batch int) error) error { - return c.DO.FindInBatches(result, batchSize, fc) -} - -func (c clientPermissionLinkDo) Attrs(attrs ...field.AssignExpr) *clientPermissionLinkDo { - return c.withDO(c.DO.Attrs(attrs...)) -} - -func (c clientPermissionLinkDo) Assign(attrs ...field.AssignExpr) *clientPermissionLinkDo { - return c.withDO(c.DO.Assign(attrs...)) -} - -func (c clientPermissionLinkDo) Joins(fields ...field.RelationField) *clientPermissionLinkDo { - for _, _f := range fields { - c = *c.withDO(c.DO.Joins(_f)) - } - return &c -} - -func (c clientPermissionLinkDo) Preload(fields ...field.RelationField) *clientPermissionLinkDo { - for _, _f := range fields { - c = *c.withDO(c.DO.Preload(_f)) - } - return &c -} - -func (c clientPermissionLinkDo) FirstOrInit() (*models.ClientPermissionLink, error) { - if result, err := c.DO.FirstOrInit(); err != nil { - return nil, err - } else { - return result.(*models.ClientPermissionLink), nil - } -} - -func (c clientPermissionLinkDo) FirstOrCreate() (*models.ClientPermissionLink, error) { - if result, err := c.DO.FirstOrCreate(); err != nil { - return nil, err - } else { - return result.(*models.ClientPermissionLink), nil - } -} - -func (c clientPermissionLinkDo) FindByPage(offset int, limit int) (result []*models.ClientPermissionLink, count int64, err error) { - result, err = c.Offset(offset).Limit(limit).Find() - if err != nil { - return - } - - if size := len(result); 0 < limit && 0 < size && size < limit { - count = int64(size + offset) - return - } - - count, err = c.Offset(-1).Limit(-1).Count() - return -} - -func (c clientPermissionLinkDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) { - count, err = c.Count() - if err != nil { - return - } - - err = c.Offset(offset).Limit(limit).Scan(result) - return -} - -func (c clientPermissionLinkDo) Scan(result interface{}) (err error) { - return c.DO.Scan(result) -} - -func (c clientPermissionLinkDo) Delete(models ...*models.ClientPermissionLink) (result gen.ResultInfo, err error) { - return c.DO.Delete(models) -} - -func (c *clientPermissionLinkDo) withDO(do gen.Dao) *clientPermissionLinkDo { - c.DO = *do.(*gen.DO) - return c -} diff --git a/web/queries/coupon.gen.go b/web/queries/coupon.gen.go index 9f6b80c..9e5f7c7 100644 --- a/web/queries/coupon.gen.go +++ b/web/queries/coupon.gen.go @@ -28,16 +28,16 @@ func newCoupon(db *gorm.DB, opts ...gen.DOOption) coupon { tableName := _coupon.couponDo.TableName() _coupon.ALL = field.NewAsterisk(tableName) _coupon.ID = field.NewInt32(tableName, "id") + _coupon.CreatedAt = field.NewTime(tableName, "created_at") + _coupon.UpdatedAt = field.NewTime(tableName, "updated_at") + _coupon.DeletedAt = field.NewField(tableName, "deleted_at") _coupon.UserID = field.NewInt32(tableName, "user_id") _coupon.Code = field.NewString(tableName, "code") _coupon.Remark = field.NewString(tableName, "remark") _coupon.Amount = field.NewField(tableName, "amount") _coupon.MinAmount = field.NewField(tableName, "min_amount") - _coupon.Status = field.NewInt32(tableName, "status") - _coupon.ExpireAt = field.NewField(tableName, "expire_at") - _coupon.CreatedAt = field.NewField(tableName, "created_at") - _coupon.UpdatedAt = field.NewField(tableName, "updated_at") - _coupon.DeletedAt = field.NewField(tableName, "deleted_at") + _coupon.Status = field.NewInt(tableName, "status") + _coupon.ExpireAt = field.NewTime(tableName, "expire_at") _coupon.fillFieldMap() @@ -48,17 +48,17 @@ type coupon struct { couponDo ALL field.Asterisk - ID field.Int32 // 优惠券ID - UserID field.Int32 // 用户ID - Code field.String // 优惠券代码 - Remark field.String // 优惠券备注 - Amount field.Field // 优惠券金额 - MinAmount field.Field // 最低消费金额 - Status field.Int32 // 优惠券状态:0-未使用,1-已使用,2-已过期 - ExpireAt field.Field // 过期时间 - CreatedAt field.Field // 创建时间 - UpdatedAt field.Field // 更新时间 - DeletedAt field.Field // 删除时间 + ID field.Int32 + CreatedAt field.Time + UpdatedAt field.Time + DeletedAt field.Field + UserID field.Int32 + Code field.String + Remark field.String + Amount field.Field + MinAmount field.Field + Status field.Int + ExpireAt field.Time fieldMap map[string]field.Expr } @@ -76,16 +76,16 @@ func (c coupon) As(alias string) *coupon { func (c *coupon) updateTableName(table string) *coupon { c.ALL = field.NewAsterisk(table) c.ID = field.NewInt32(table, "id") + c.CreatedAt = field.NewTime(table, "created_at") + c.UpdatedAt = field.NewTime(table, "updated_at") + c.DeletedAt = field.NewField(table, "deleted_at") c.UserID = field.NewInt32(table, "user_id") c.Code = field.NewString(table, "code") c.Remark = field.NewString(table, "remark") c.Amount = field.NewField(table, "amount") c.MinAmount = field.NewField(table, "min_amount") - c.Status = field.NewInt32(table, "status") - c.ExpireAt = field.NewField(table, "expire_at") - c.CreatedAt = field.NewField(table, "created_at") - c.UpdatedAt = field.NewField(table, "updated_at") - c.DeletedAt = field.NewField(table, "deleted_at") + c.Status = field.NewInt(table, "status") + c.ExpireAt = field.NewTime(table, "expire_at") c.fillFieldMap() @@ -104,6 +104,9 @@ func (c *coupon) GetFieldByName(fieldName string) (field.OrderExpr, bool) { func (c *coupon) fillFieldMap() { c.fieldMap = make(map[string]field.Expr, 11) c.fieldMap["id"] = c.ID + c.fieldMap["created_at"] = c.CreatedAt + c.fieldMap["updated_at"] = c.UpdatedAt + c.fieldMap["deleted_at"] = c.DeletedAt c.fieldMap["user_id"] = c.UserID c.fieldMap["code"] = c.Code c.fieldMap["remark"] = c.Remark @@ -111,9 +114,6 @@ func (c *coupon) fillFieldMap() { c.fieldMap["min_amount"] = c.MinAmount c.fieldMap["status"] = c.Status c.fieldMap["expire_at"] = c.ExpireAt - c.fieldMap["created_at"] = c.CreatedAt - c.fieldMap["updated_at"] = c.UpdatedAt - c.fieldMap["deleted_at"] = c.DeletedAt } func (c coupon) clone(db *gorm.DB) coupon { diff --git a/web/queries/edge.gen.go b/web/queries/edge.gen.go index 6c46d19..8e72315 100644 --- a/web/queries/edge.gen.go +++ b/web/queries/edge.gen.go @@ -28,21 +28,19 @@ func newEdge(db *gorm.DB, opts ...gen.DOOption) edge { tableName := _edge.edgeDo.TableName() _edge.ALL = field.NewAsterisk(tableName) _edge.ID = field.NewInt32(tableName, "id") - _edge.ProxyID = field.NewInt32(tableName, "proxy_id") - _edge.Type = field.NewInt32(tableName, "type") + _edge.CreatedAt = field.NewTime(tableName, "created_at") + _edge.UpdatedAt = field.NewTime(tableName, "updated_at") + _edge.DeletedAt = field.NewField(tableName, "deleted_at") + _edge.Type = field.NewInt(tableName, "type") _edge.Version = field.NewInt32(tableName, "version") - _edge.Name = field.NewString(tableName, "name") - _edge.Host = field.NewString(tableName, "host") - _edge.Isp = field.NewInt32(tableName, "isp") + _edge.Mac = field.NewString(tableName, "mac") + _edge.IP = field.NewField(tableName, "ip") + _edge.ISP = field.NewInt(tableName, "isp") _edge.Prov = field.NewString(tableName, "prov") _edge.City = field.NewString(tableName, "city") - _edge.ProxyPort = field.NewInt32(tableName, "proxy_port") - _edge.Status = field.NewInt32(tableName, "status") - _edge.Rtt = field.NewInt32(tableName, "rtt") + _edge.Status = field.NewInt(tableName, "status") + _edge.RTT = field.NewInt32(tableName, "rtt") _edge.Loss = field.NewInt32(tableName, "loss") - _edge.CreatedAt = field.NewField(tableName, "created_at") - _edge.UpdatedAt = field.NewField(tableName, "updated_at") - _edge.DeletedAt = field.NewField(tableName, "deleted_at") _edge.fillFieldMap() @@ -53,22 +51,20 @@ type edge struct { edgeDo ALL field.Asterisk - ID field.Int32 // 节点ID - ProxyID field.Int32 // 代理ID - Type field.Int32 // 节点类型:1-自建 - Version field.Int32 // 节点版本 - Name field.String // 节点名称 - Host field.String // 节点地址 - Isp field.Int32 // 运营商:0-未知,1-电信,2-联通,3-移动 - Prov field.String // 省份 - City field.String // 城市 - ProxyPort field.Int32 // 代理端口 - Status field.Int32 // 节点状态:0-离线,1-正常 - Rtt field.Int32 // 最近平均延迟 - Loss field.Int32 // 最近丢包率 - CreatedAt field.Field // 创建时间 - UpdatedAt field.Field // 更新时间 - DeletedAt field.Field // 删除时间 + ID field.Int32 + CreatedAt field.Time + UpdatedAt field.Time + DeletedAt field.Field + Type field.Int + Version field.Int32 + Mac field.String + IP field.Field + ISP field.Int + Prov field.String + City field.String + Status field.Int + RTT field.Int32 + Loss field.Int32 fieldMap map[string]field.Expr } @@ -86,21 +82,19 @@ func (e edge) As(alias string) *edge { func (e *edge) updateTableName(table string) *edge { e.ALL = field.NewAsterisk(table) e.ID = field.NewInt32(table, "id") - e.ProxyID = field.NewInt32(table, "proxy_id") - e.Type = field.NewInt32(table, "type") + e.CreatedAt = field.NewTime(table, "created_at") + e.UpdatedAt = field.NewTime(table, "updated_at") + e.DeletedAt = field.NewField(table, "deleted_at") + e.Type = field.NewInt(table, "type") e.Version = field.NewInt32(table, "version") - e.Name = field.NewString(table, "name") - e.Host = field.NewString(table, "host") - e.Isp = field.NewInt32(table, "isp") + e.Mac = field.NewString(table, "mac") + e.IP = field.NewField(table, "ip") + e.ISP = field.NewInt(table, "isp") e.Prov = field.NewString(table, "prov") e.City = field.NewString(table, "city") - e.ProxyPort = field.NewInt32(table, "proxy_port") - e.Status = field.NewInt32(table, "status") - e.Rtt = field.NewInt32(table, "rtt") + e.Status = field.NewInt(table, "status") + e.RTT = field.NewInt32(table, "rtt") e.Loss = field.NewInt32(table, "loss") - e.CreatedAt = field.NewField(table, "created_at") - e.UpdatedAt = field.NewField(table, "updated_at") - e.DeletedAt = field.NewField(table, "deleted_at") e.fillFieldMap() @@ -117,23 +111,21 @@ func (e *edge) GetFieldByName(fieldName string) (field.OrderExpr, bool) { } func (e *edge) fillFieldMap() { - e.fieldMap = make(map[string]field.Expr, 16) + e.fieldMap = make(map[string]field.Expr, 14) e.fieldMap["id"] = e.ID - e.fieldMap["proxy_id"] = e.ProxyID - e.fieldMap["type"] = e.Type - e.fieldMap["version"] = e.Version - e.fieldMap["name"] = e.Name - e.fieldMap["host"] = e.Host - e.fieldMap["isp"] = e.Isp - e.fieldMap["prov"] = e.Prov - e.fieldMap["city"] = e.City - e.fieldMap["proxy_port"] = e.ProxyPort - e.fieldMap["status"] = e.Status - e.fieldMap["rtt"] = e.Rtt - e.fieldMap["loss"] = e.Loss e.fieldMap["created_at"] = e.CreatedAt e.fieldMap["updated_at"] = e.UpdatedAt e.fieldMap["deleted_at"] = e.DeletedAt + e.fieldMap["type"] = e.Type + e.fieldMap["version"] = e.Version + e.fieldMap["mac"] = e.Mac + e.fieldMap["ip"] = e.IP + e.fieldMap["isp"] = e.ISP + e.fieldMap["prov"] = e.Prov + e.fieldMap["city"] = e.City + e.fieldMap["status"] = e.Status + e.fieldMap["rtt"] = e.RTT + e.fieldMap["loss"] = e.Loss } func (e edge) clone(db *gorm.DB) edge { diff --git a/web/queries/gen.go b/web/queries/gen.go index f7d459d..fbbd2af 100644 --- a/web/queries/gen.go +++ b/web/queries/gen.go @@ -19,15 +19,17 @@ var ( Q = new(Query) Admin *admin AdminRole *adminRole - AdminRoleLink *adminRoleLink - AdminRolePermissionLink *adminRolePermissionLink Announcement *announcement Bill *bill Channel *channel Client *client - ClientPermissionLink *clientPermissionLink Coupon *coupon Edge *edge + LinkAdminRole *linkAdminRole + LinkAdminRolePermission *linkAdminRolePermission + LinkClientPermission *linkClientPermission + LinkUserRole *linkUserRole + LinkUserRolePermission *linkUserRolePermission LogsLogin *logsLogin LogsRequest *logsRequest LogsUserBandwidth *logsUserBandwidth @@ -43,8 +45,6 @@ var ( Trade *trade User *user UserRole *userRole - UserRoleLink *userRoleLink - UserRolePermissionLink *userRolePermissionLink Whitelist *whitelist ) @@ -52,15 +52,17 @@ func SetDefault(db *gorm.DB, opts ...gen.DOOption) { *Q = *Use(db, opts...) Admin = &Q.Admin AdminRole = &Q.AdminRole - AdminRoleLink = &Q.AdminRoleLink - AdminRolePermissionLink = &Q.AdminRolePermissionLink Announcement = &Q.Announcement Bill = &Q.Bill Channel = &Q.Channel Client = &Q.Client - ClientPermissionLink = &Q.ClientPermissionLink Coupon = &Q.Coupon Edge = &Q.Edge + LinkAdminRole = &Q.LinkAdminRole + LinkAdminRolePermission = &Q.LinkAdminRolePermission + LinkClientPermission = &Q.LinkClientPermission + LinkUserRole = &Q.LinkUserRole + LinkUserRolePermission = &Q.LinkUserRolePermission LogsLogin = &Q.LogsLogin LogsRequest = &Q.LogsRequest LogsUserBandwidth = &Q.LogsUserBandwidth @@ -76,8 +78,6 @@ func SetDefault(db *gorm.DB, opts ...gen.DOOption) { Trade = &Q.Trade User = &Q.User UserRole = &Q.UserRole - UserRoleLink = &Q.UserRoleLink - UserRolePermissionLink = &Q.UserRolePermissionLink Whitelist = &Q.Whitelist } @@ -86,15 +86,17 @@ func Use(db *gorm.DB, opts ...gen.DOOption) *Query { db: db, Admin: newAdmin(db, opts...), AdminRole: newAdminRole(db, opts...), - AdminRoleLink: newAdminRoleLink(db, opts...), - AdminRolePermissionLink: newAdminRolePermissionLink(db, opts...), Announcement: newAnnouncement(db, opts...), Bill: newBill(db, opts...), Channel: newChannel(db, opts...), Client: newClient(db, opts...), - ClientPermissionLink: newClientPermissionLink(db, opts...), Coupon: newCoupon(db, opts...), Edge: newEdge(db, opts...), + LinkAdminRole: newLinkAdminRole(db, opts...), + LinkAdminRolePermission: newLinkAdminRolePermission(db, opts...), + LinkClientPermission: newLinkClientPermission(db, opts...), + LinkUserRole: newLinkUserRole(db, opts...), + LinkUserRolePermission: newLinkUserRolePermission(db, opts...), LogsLogin: newLogsLogin(db, opts...), LogsRequest: newLogsRequest(db, opts...), LogsUserBandwidth: newLogsUserBandwidth(db, opts...), @@ -110,8 +112,6 @@ func Use(db *gorm.DB, opts ...gen.DOOption) *Query { Trade: newTrade(db, opts...), User: newUser(db, opts...), UserRole: newUserRole(db, opts...), - UserRoleLink: newUserRoleLink(db, opts...), - UserRolePermissionLink: newUserRolePermissionLink(db, opts...), Whitelist: newWhitelist(db, opts...), } } @@ -121,15 +121,17 @@ type Query struct { Admin admin AdminRole adminRole - AdminRoleLink adminRoleLink - AdminRolePermissionLink adminRolePermissionLink Announcement announcement Bill bill Channel channel Client client - ClientPermissionLink clientPermissionLink Coupon coupon Edge edge + LinkAdminRole linkAdminRole + LinkAdminRolePermission linkAdminRolePermission + LinkClientPermission linkClientPermission + LinkUserRole linkUserRole + LinkUserRolePermission linkUserRolePermission LogsLogin logsLogin LogsRequest logsRequest LogsUserBandwidth logsUserBandwidth @@ -145,8 +147,6 @@ type Query struct { Trade trade User user UserRole userRole - UserRoleLink userRoleLink - UserRolePermissionLink userRolePermissionLink Whitelist whitelist } @@ -157,15 +157,17 @@ func (q *Query) clone(db *gorm.DB) *Query { db: db, Admin: q.Admin.clone(db), AdminRole: q.AdminRole.clone(db), - AdminRoleLink: q.AdminRoleLink.clone(db), - AdminRolePermissionLink: q.AdminRolePermissionLink.clone(db), Announcement: q.Announcement.clone(db), Bill: q.Bill.clone(db), Channel: q.Channel.clone(db), Client: q.Client.clone(db), - ClientPermissionLink: q.ClientPermissionLink.clone(db), Coupon: q.Coupon.clone(db), Edge: q.Edge.clone(db), + LinkAdminRole: q.LinkAdminRole.clone(db), + LinkAdminRolePermission: q.LinkAdminRolePermission.clone(db), + LinkClientPermission: q.LinkClientPermission.clone(db), + LinkUserRole: q.LinkUserRole.clone(db), + LinkUserRolePermission: q.LinkUserRolePermission.clone(db), LogsLogin: q.LogsLogin.clone(db), LogsRequest: q.LogsRequest.clone(db), LogsUserBandwidth: q.LogsUserBandwidth.clone(db), @@ -181,8 +183,6 @@ func (q *Query) clone(db *gorm.DB) *Query { Trade: q.Trade.clone(db), User: q.User.clone(db), UserRole: q.UserRole.clone(db), - UserRoleLink: q.UserRoleLink.clone(db), - UserRolePermissionLink: q.UserRolePermissionLink.clone(db), Whitelist: q.Whitelist.clone(db), } } @@ -200,15 +200,17 @@ func (q *Query) ReplaceDB(db *gorm.DB) *Query { db: db, Admin: q.Admin.replaceDB(db), AdminRole: q.AdminRole.replaceDB(db), - AdminRoleLink: q.AdminRoleLink.replaceDB(db), - AdminRolePermissionLink: q.AdminRolePermissionLink.replaceDB(db), Announcement: q.Announcement.replaceDB(db), Bill: q.Bill.replaceDB(db), Channel: q.Channel.replaceDB(db), Client: q.Client.replaceDB(db), - ClientPermissionLink: q.ClientPermissionLink.replaceDB(db), Coupon: q.Coupon.replaceDB(db), Edge: q.Edge.replaceDB(db), + LinkAdminRole: q.LinkAdminRole.replaceDB(db), + LinkAdminRolePermission: q.LinkAdminRolePermission.replaceDB(db), + LinkClientPermission: q.LinkClientPermission.replaceDB(db), + LinkUserRole: q.LinkUserRole.replaceDB(db), + LinkUserRolePermission: q.LinkUserRolePermission.replaceDB(db), LogsLogin: q.LogsLogin.replaceDB(db), LogsRequest: q.LogsRequest.replaceDB(db), LogsUserBandwidth: q.LogsUserBandwidth.replaceDB(db), @@ -224,8 +226,6 @@ func (q *Query) ReplaceDB(db *gorm.DB) *Query { Trade: q.Trade.replaceDB(db), User: q.User.replaceDB(db), UserRole: q.UserRole.replaceDB(db), - UserRoleLink: q.UserRoleLink.replaceDB(db), - UserRolePermissionLink: q.UserRolePermissionLink.replaceDB(db), Whitelist: q.Whitelist.replaceDB(db), } } @@ -233,15 +233,17 @@ func (q *Query) ReplaceDB(db *gorm.DB) *Query { type queryCtx struct { Admin *adminDo AdminRole *adminRoleDo - AdminRoleLink *adminRoleLinkDo - AdminRolePermissionLink *adminRolePermissionLinkDo Announcement *announcementDo Bill *billDo Channel *channelDo Client *clientDo - ClientPermissionLink *clientPermissionLinkDo Coupon *couponDo Edge *edgeDo + LinkAdminRole *linkAdminRoleDo + LinkAdminRolePermission *linkAdminRolePermissionDo + LinkClientPermission *linkClientPermissionDo + LinkUserRole *linkUserRoleDo + LinkUserRolePermission *linkUserRolePermissionDo LogsLogin *logsLoginDo LogsRequest *logsRequestDo LogsUserBandwidth *logsUserBandwidthDo @@ -257,8 +259,6 @@ type queryCtx struct { Trade *tradeDo User *userDo UserRole *userRoleDo - UserRoleLink *userRoleLinkDo - UserRolePermissionLink *userRolePermissionLinkDo Whitelist *whitelistDo } @@ -266,15 +266,17 @@ func (q *Query) WithContext(ctx context.Context) *queryCtx { return &queryCtx{ Admin: q.Admin.WithContext(ctx), AdminRole: q.AdminRole.WithContext(ctx), - AdminRoleLink: q.AdminRoleLink.WithContext(ctx), - AdminRolePermissionLink: q.AdminRolePermissionLink.WithContext(ctx), Announcement: q.Announcement.WithContext(ctx), Bill: q.Bill.WithContext(ctx), Channel: q.Channel.WithContext(ctx), Client: q.Client.WithContext(ctx), - ClientPermissionLink: q.ClientPermissionLink.WithContext(ctx), Coupon: q.Coupon.WithContext(ctx), Edge: q.Edge.WithContext(ctx), + LinkAdminRole: q.LinkAdminRole.WithContext(ctx), + LinkAdminRolePermission: q.LinkAdminRolePermission.WithContext(ctx), + LinkClientPermission: q.LinkClientPermission.WithContext(ctx), + LinkUserRole: q.LinkUserRole.WithContext(ctx), + LinkUserRolePermission: q.LinkUserRolePermission.WithContext(ctx), LogsLogin: q.LogsLogin.WithContext(ctx), LogsRequest: q.LogsRequest.WithContext(ctx), LogsUserBandwidth: q.LogsUserBandwidth.WithContext(ctx), @@ -290,8 +292,6 @@ func (q *Query) WithContext(ctx context.Context) *queryCtx { Trade: q.Trade.WithContext(ctx), User: q.User.WithContext(ctx), UserRole: q.UserRole.WithContext(ctx), - UserRoleLink: q.UserRoleLink.WithContext(ctx), - UserRolePermissionLink: q.UserRolePermissionLink.WithContext(ctx), Whitelist: q.Whitelist.WithContext(ctx), } } diff --git a/web/queries/link_admin_role.gen.go b/web/queries/link_admin_role.gen.go new file mode 100644 index 0000000..86a5de9 --- /dev/null +++ b/web/queries/link_admin_role.gen.go @@ -0,0 +1,327 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package queries + +import ( + "context" + + "gorm.io/gorm" + "gorm.io/gorm/clause" + "gorm.io/gorm/schema" + + "gorm.io/gen" + "gorm.io/gen/field" + + "gorm.io/plugin/dbresolver" + + "platform/web/models" +) + +func newLinkAdminRole(db *gorm.DB, opts ...gen.DOOption) linkAdminRole { + _linkAdminRole := linkAdminRole{} + + _linkAdminRole.linkAdminRoleDo.UseDB(db, opts...) + _linkAdminRole.linkAdminRoleDo.UseModel(&models.LinkAdminRole{}) + + tableName := _linkAdminRole.linkAdminRoleDo.TableName() + _linkAdminRole.ALL = field.NewAsterisk(tableName) + _linkAdminRole.ID = field.NewInt32(tableName, "id") + _linkAdminRole.AdminID = field.NewInt32(tableName, "admin_id") + _linkAdminRole.RoleID = field.NewInt32(tableName, "role_id") + + _linkAdminRole.fillFieldMap() + + return _linkAdminRole +} + +type linkAdminRole struct { + linkAdminRoleDo + + ALL field.Asterisk + ID field.Int32 + AdminID field.Int32 + RoleID field.Int32 + + fieldMap map[string]field.Expr +} + +func (l linkAdminRole) Table(newTableName string) *linkAdminRole { + l.linkAdminRoleDo.UseTable(newTableName) + return l.updateTableName(newTableName) +} + +func (l linkAdminRole) As(alias string) *linkAdminRole { + l.linkAdminRoleDo.DO = *(l.linkAdminRoleDo.As(alias).(*gen.DO)) + return l.updateTableName(alias) +} + +func (l *linkAdminRole) updateTableName(table string) *linkAdminRole { + l.ALL = field.NewAsterisk(table) + l.ID = field.NewInt32(table, "id") + l.AdminID = field.NewInt32(table, "admin_id") + l.RoleID = field.NewInt32(table, "role_id") + + l.fillFieldMap() + + return l +} + +func (l *linkAdminRole) GetFieldByName(fieldName string) (field.OrderExpr, bool) { + _f, ok := l.fieldMap[fieldName] + if !ok || _f == nil { + return nil, false + } + _oe, ok := _f.(field.OrderExpr) + return _oe, ok +} + +func (l *linkAdminRole) fillFieldMap() { + l.fieldMap = make(map[string]field.Expr, 3) + l.fieldMap["id"] = l.ID + l.fieldMap["admin_id"] = l.AdminID + l.fieldMap["role_id"] = l.RoleID +} + +func (l linkAdminRole) clone(db *gorm.DB) linkAdminRole { + l.linkAdminRoleDo.ReplaceConnPool(db.Statement.ConnPool) + return l +} + +func (l linkAdminRole) replaceDB(db *gorm.DB) linkAdminRole { + l.linkAdminRoleDo.ReplaceDB(db) + return l +} + +type linkAdminRoleDo struct{ gen.DO } + +func (l linkAdminRoleDo) Debug() *linkAdminRoleDo { + return l.withDO(l.DO.Debug()) +} + +func (l linkAdminRoleDo) WithContext(ctx context.Context) *linkAdminRoleDo { + return l.withDO(l.DO.WithContext(ctx)) +} + +func (l linkAdminRoleDo) ReadDB() *linkAdminRoleDo { + return l.Clauses(dbresolver.Read) +} + +func (l linkAdminRoleDo) WriteDB() *linkAdminRoleDo { + return l.Clauses(dbresolver.Write) +} + +func (l linkAdminRoleDo) Session(config *gorm.Session) *linkAdminRoleDo { + return l.withDO(l.DO.Session(config)) +} + +func (l linkAdminRoleDo) Clauses(conds ...clause.Expression) *linkAdminRoleDo { + return l.withDO(l.DO.Clauses(conds...)) +} + +func (l linkAdminRoleDo) Returning(value interface{}, columns ...string) *linkAdminRoleDo { + return l.withDO(l.DO.Returning(value, columns...)) +} + +func (l linkAdminRoleDo) Not(conds ...gen.Condition) *linkAdminRoleDo { + return l.withDO(l.DO.Not(conds...)) +} + +func (l linkAdminRoleDo) Or(conds ...gen.Condition) *linkAdminRoleDo { + return l.withDO(l.DO.Or(conds...)) +} + +func (l linkAdminRoleDo) Select(conds ...field.Expr) *linkAdminRoleDo { + return l.withDO(l.DO.Select(conds...)) +} + +func (l linkAdminRoleDo) Where(conds ...gen.Condition) *linkAdminRoleDo { + return l.withDO(l.DO.Where(conds...)) +} + +func (l linkAdminRoleDo) Order(conds ...field.Expr) *linkAdminRoleDo { + return l.withDO(l.DO.Order(conds...)) +} + +func (l linkAdminRoleDo) Distinct(cols ...field.Expr) *linkAdminRoleDo { + return l.withDO(l.DO.Distinct(cols...)) +} + +func (l linkAdminRoleDo) Omit(cols ...field.Expr) *linkAdminRoleDo { + return l.withDO(l.DO.Omit(cols...)) +} + +func (l linkAdminRoleDo) Join(table schema.Tabler, on ...field.Expr) *linkAdminRoleDo { + return l.withDO(l.DO.Join(table, on...)) +} + +func (l linkAdminRoleDo) LeftJoin(table schema.Tabler, on ...field.Expr) *linkAdminRoleDo { + return l.withDO(l.DO.LeftJoin(table, on...)) +} + +func (l linkAdminRoleDo) RightJoin(table schema.Tabler, on ...field.Expr) *linkAdminRoleDo { + return l.withDO(l.DO.RightJoin(table, on...)) +} + +func (l linkAdminRoleDo) Group(cols ...field.Expr) *linkAdminRoleDo { + return l.withDO(l.DO.Group(cols...)) +} + +func (l linkAdminRoleDo) Having(conds ...gen.Condition) *linkAdminRoleDo { + return l.withDO(l.DO.Having(conds...)) +} + +func (l linkAdminRoleDo) Limit(limit int) *linkAdminRoleDo { + return l.withDO(l.DO.Limit(limit)) +} + +func (l linkAdminRoleDo) Offset(offset int) *linkAdminRoleDo { + return l.withDO(l.DO.Offset(offset)) +} + +func (l linkAdminRoleDo) Scopes(funcs ...func(gen.Dao) gen.Dao) *linkAdminRoleDo { + return l.withDO(l.DO.Scopes(funcs...)) +} + +func (l linkAdminRoleDo) Unscoped() *linkAdminRoleDo { + return l.withDO(l.DO.Unscoped()) +} + +func (l linkAdminRoleDo) Create(values ...*models.LinkAdminRole) error { + if len(values) == 0 { + return nil + } + return l.DO.Create(values) +} + +func (l linkAdminRoleDo) CreateInBatches(values []*models.LinkAdminRole, batchSize int) error { + return l.DO.CreateInBatches(values, batchSize) +} + +// Save : !!! underlying implementation is different with GORM +// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values) +func (l linkAdminRoleDo) Save(values ...*models.LinkAdminRole) error { + if len(values) == 0 { + return nil + } + return l.DO.Save(values) +} + +func (l linkAdminRoleDo) First() (*models.LinkAdminRole, error) { + if result, err := l.DO.First(); err != nil { + return nil, err + } else { + return result.(*models.LinkAdminRole), nil + } +} + +func (l linkAdminRoleDo) Take() (*models.LinkAdminRole, error) { + if result, err := l.DO.Take(); err != nil { + return nil, err + } else { + return result.(*models.LinkAdminRole), nil + } +} + +func (l linkAdminRoleDo) Last() (*models.LinkAdminRole, error) { + if result, err := l.DO.Last(); err != nil { + return nil, err + } else { + return result.(*models.LinkAdminRole), nil + } +} + +func (l linkAdminRoleDo) Find() ([]*models.LinkAdminRole, error) { + result, err := l.DO.Find() + return result.([]*models.LinkAdminRole), err +} + +func (l linkAdminRoleDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.LinkAdminRole, err error) { + buf := make([]*models.LinkAdminRole, 0, batchSize) + err = l.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error { + defer func() { results = append(results, buf...) }() + return fc(tx, batch) + }) + return results, err +} + +func (l linkAdminRoleDo) FindInBatches(result *[]*models.LinkAdminRole, batchSize int, fc func(tx gen.Dao, batch int) error) error { + return l.DO.FindInBatches(result, batchSize, fc) +} + +func (l linkAdminRoleDo) Attrs(attrs ...field.AssignExpr) *linkAdminRoleDo { + return l.withDO(l.DO.Attrs(attrs...)) +} + +func (l linkAdminRoleDo) Assign(attrs ...field.AssignExpr) *linkAdminRoleDo { + return l.withDO(l.DO.Assign(attrs...)) +} + +func (l linkAdminRoleDo) Joins(fields ...field.RelationField) *linkAdminRoleDo { + for _, _f := range fields { + l = *l.withDO(l.DO.Joins(_f)) + } + return &l +} + +func (l linkAdminRoleDo) Preload(fields ...field.RelationField) *linkAdminRoleDo { + for _, _f := range fields { + l = *l.withDO(l.DO.Preload(_f)) + } + return &l +} + +func (l linkAdminRoleDo) FirstOrInit() (*models.LinkAdminRole, error) { + if result, err := l.DO.FirstOrInit(); err != nil { + return nil, err + } else { + return result.(*models.LinkAdminRole), nil + } +} + +func (l linkAdminRoleDo) FirstOrCreate() (*models.LinkAdminRole, error) { + if result, err := l.DO.FirstOrCreate(); err != nil { + return nil, err + } else { + return result.(*models.LinkAdminRole), nil + } +} + +func (l linkAdminRoleDo) FindByPage(offset int, limit int) (result []*models.LinkAdminRole, count int64, err error) { + result, err = l.Offset(offset).Limit(limit).Find() + if err != nil { + return + } + + if size := len(result); 0 < limit && 0 < size && size < limit { + count = int64(size + offset) + return + } + + count, err = l.Offset(-1).Limit(-1).Count() + return +} + +func (l linkAdminRoleDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) { + count, err = l.Count() + if err != nil { + return + } + + err = l.Offset(offset).Limit(limit).Scan(result) + return +} + +func (l linkAdminRoleDo) Scan(result interface{}) (err error) { + return l.DO.Scan(result) +} + +func (l linkAdminRoleDo) Delete(models ...*models.LinkAdminRole) (result gen.ResultInfo, err error) { + return l.DO.Delete(models) +} + +func (l *linkAdminRoleDo) withDO(do gen.Dao) *linkAdminRoleDo { + l.DO = *do.(*gen.DO) + return l +} diff --git a/web/queries/link_admin_role_permission.gen.go b/web/queries/link_admin_role_permission.gen.go new file mode 100644 index 0000000..5e137e9 --- /dev/null +++ b/web/queries/link_admin_role_permission.gen.go @@ -0,0 +1,327 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package queries + +import ( + "context" + + "gorm.io/gorm" + "gorm.io/gorm/clause" + "gorm.io/gorm/schema" + + "gorm.io/gen" + "gorm.io/gen/field" + + "gorm.io/plugin/dbresolver" + + "platform/web/models" +) + +func newLinkAdminRolePermission(db *gorm.DB, opts ...gen.DOOption) linkAdminRolePermission { + _linkAdminRolePermission := linkAdminRolePermission{} + + _linkAdminRolePermission.linkAdminRolePermissionDo.UseDB(db, opts...) + _linkAdminRolePermission.linkAdminRolePermissionDo.UseModel(&models.LinkAdminRolePermission{}) + + tableName := _linkAdminRolePermission.linkAdminRolePermissionDo.TableName() + _linkAdminRolePermission.ALL = field.NewAsterisk(tableName) + _linkAdminRolePermission.ID = field.NewInt32(tableName, "id") + _linkAdminRolePermission.RoleID = field.NewInt32(tableName, "role_id") + _linkAdminRolePermission.PermissionID = field.NewInt32(tableName, "permission_id") + + _linkAdminRolePermission.fillFieldMap() + + return _linkAdminRolePermission +} + +type linkAdminRolePermission struct { + linkAdminRolePermissionDo + + ALL field.Asterisk + ID field.Int32 + RoleID field.Int32 + PermissionID field.Int32 + + fieldMap map[string]field.Expr +} + +func (l linkAdminRolePermission) Table(newTableName string) *linkAdminRolePermission { + l.linkAdminRolePermissionDo.UseTable(newTableName) + return l.updateTableName(newTableName) +} + +func (l linkAdminRolePermission) As(alias string) *linkAdminRolePermission { + l.linkAdminRolePermissionDo.DO = *(l.linkAdminRolePermissionDo.As(alias).(*gen.DO)) + return l.updateTableName(alias) +} + +func (l *linkAdminRolePermission) updateTableName(table string) *linkAdminRolePermission { + l.ALL = field.NewAsterisk(table) + l.ID = field.NewInt32(table, "id") + l.RoleID = field.NewInt32(table, "role_id") + l.PermissionID = field.NewInt32(table, "permission_id") + + l.fillFieldMap() + + return l +} + +func (l *linkAdminRolePermission) GetFieldByName(fieldName string) (field.OrderExpr, bool) { + _f, ok := l.fieldMap[fieldName] + if !ok || _f == nil { + return nil, false + } + _oe, ok := _f.(field.OrderExpr) + return _oe, ok +} + +func (l *linkAdminRolePermission) fillFieldMap() { + l.fieldMap = make(map[string]field.Expr, 3) + l.fieldMap["id"] = l.ID + l.fieldMap["role_id"] = l.RoleID + l.fieldMap["permission_id"] = l.PermissionID +} + +func (l linkAdminRolePermission) clone(db *gorm.DB) linkAdminRolePermission { + l.linkAdminRolePermissionDo.ReplaceConnPool(db.Statement.ConnPool) + return l +} + +func (l linkAdminRolePermission) replaceDB(db *gorm.DB) linkAdminRolePermission { + l.linkAdminRolePermissionDo.ReplaceDB(db) + return l +} + +type linkAdminRolePermissionDo struct{ gen.DO } + +func (l linkAdminRolePermissionDo) Debug() *linkAdminRolePermissionDo { + return l.withDO(l.DO.Debug()) +} + +func (l linkAdminRolePermissionDo) WithContext(ctx context.Context) *linkAdminRolePermissionDo { + return l.withDO(l.DO.WithContext(ctx)) +} + +func (l linkAdminRolePermissionDo) ReadDB() *linkAdminRolePermissionDo { + return l.Clauses(dbresolver.Read) +} + +func (l linkAdminRolePermissionDo) WriteDB() *linkAdminRolePermissionDo { + return l.Clauses(dbresolver.Write) +} + +func (l linkAdminRolePermissionDo) Session(config *gorm.Session) *linkAdminRolePermissionDo { + return l.withDO(l.DO.Session(config)) +} + +func (l linkAdminRolePermissionDo) Clauses(conds ...clause.Expression) *linkAdminRolePermissionDo { + return l.withDO(l.DO.Clauses(conds...)) +} + +func (l linkAdminRolePermissionDo) Returning(value interface{}, columns ...string) *linkAdminRolePermissionDo { + return l.withDO(l.DO.Returning(value, columns...)) +} + +func (l linkAdminRolePermissionDo) Not(conds ...gen.Condition) *linkAdminRolePermissionDo { + return l.withDO(l.DO.Not(conds...)) +} + +func (l linkAdminRolePermissionDo) Or(conds ...gen.Condition) *linkAdminRolePermissionDo { + return l.withDO(l.DO.Or(conds...)) +} + +func (l linkAdminRolePermissionDo) Select(conds ...field.Expr) *linkAdminRolePermissionDo { + return l.withDO(l.DO.Select(conds...)) +} + +func (l linkAdminRolePermissionDo) Where(conds ...gen.Condition) *linkAdminRolePermissionDo { + return l.withDO(l.DO.Where(conds...)) +} + +func (l linkAdminRolePermissionDo) Order(conds ...field.Expr) *linkAdminRolePermissionDo { + return l.withDO(l.DO.Order(conds...)) +} + +func (l linkAdminRolePermissionDo) Distinct(cols ...field.Expr) *linkAdminRolePermissionDo { + return l.withDO(l.DO.Distinct(cols...)) +} + +func (l linkAdminRolePermissionDo) Omit(cols ...field.Expr) *linkAdminRolePermissionDo { + return l.withDO(l.DO.Omit(cols...)) +} + +func (l linkAdminRolePermissionDo) Join(table schema.Tabler, on ...field.Expr) *linkAdminRolePermissionDo { + return l.withDO(l.DO.Join(table, on...)) +} + +func (l linkAdminRolePermissionDo) LeftJoin(table schema.Tabler, on ...field.Expr) *linkAdminRolePermissionDo { + return l.withDO(l.DO.LeftJoin(table, on...)) +} + +func (l linkAdminRolePermissionDo) RightJoin(table schema.Tabler, on ...field.Expr) *linkAdminRolePermissionDo { + return l.withDO(l.DO.RightJoin(table, on...)) +} + +func (l linkAdminRolePermissionDo) Group(cols ...field.Expr) *linkAdminRolePermissionDo { + return l.withDO(l.DO.Group(cols...)) +} + +func (l linkAdminRolePermissionDo) Having(conds ...gen.Condition) *linkAdminRolePermissionDo { + return l.withDO(l.DO.Having(conds...)) +} + +func (l linkAdminRolePermissionDo) Limit(limit int) *linkAdminRolePermissionDo { + return l.withDO(l.DO.Limit(limit)) +} + +func (l linkAdminRolePermissionDo) Offset(offset int) *linkAdminRolePermissionDo { + return l.withDO(l.DO.Offset(offset)) +} + +func (l linkAdminRolePermissionDo) Scopes(funcs ...func(gen.Dao) gen.Dao) *linkAdminRolePermissionDo { + return l.withDO(l.DO.Scopes(funcs...)) +} + +func (l linkAdminRolePermissionDo) Unscoped() *linkAdminRolePermissionDo { + return l.withDO(l.DO.Unscoped()) +} + +func (l linkAdminRolePermissionDo) Create(values ...*models.LinkAdminRolePermission) error { + if len(values) == 0 { + return nil + } + return l.DO.Create(values) +} + +func (l linkAdminRolePermissionDo) CreateInBatches(values []*models.LinkAdminRolePermission, batchSize int) error { + return l.DO.CreateInBatches(values, batchSize) +} + +// Save : !!! underlying implementation is different with GORM +// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values) +func (l linkAdminRolePermissionDo) Save(values ...*models.LinkAdminRolePermission) error { + if len(values) == 0 { + return nil + } + return l.DO.Save(values) +} + +func (l linkAdminRolePermissionDo) First() (*models.LinkAdminRolePermission, error) { + if result, err := l.DO.First(); err != nil { + return nil, err + } else { + return result.(*models.LinkAdminRolePermission), nil + } +} + +func (l linkAdminRolePermissionDo) Take() (*models.LinkAdminRolePermission, error) { + if result, err := l.DO.Take(); err != nil { + return nil, err + } else { + return result.(*models.LinkAdminRolePermission), nil + } +} + +func (l linkAdminRolePermissionDo) Last() (*models.LinkAdminRolePermission, error) { + if result, err := l.DO.Last(); err != nil { + return nil, err + } else { + return result.(*models.LinkAdminRolePermission), nil + } +} + +func (l linkAdminRolePermissionDo) Find() ([]*models.LinkAdminRolePermission, error) { + result, err := l.DO.Find() + return result.([]*models.LinkAdminRolePermission), err +} + +func (l linkAdminRolePermissionDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.LinkAdminRolePermission, err error) { + buf := make([]*models.LinkAdminRolePermission, 0, batchSize) + err = l.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error { + defer func() { results = append(results, buf...) }() + return fc(tx, batch) + }) + return results, err +} + +func (l linkAdminRolePermissionDo) FindInBatches(result *[]*models.LinkAdminRolePermission, batchSize int, fc func(tx gen.Dao, batch int) error) error { + return l.DO.FindInBatches(result, batchSize, fc) +} + +func (l linkAdminRolePermissionDo) Attrs(attrs ...field.AssignExpr) *linkAdminRolePermissionDo { + return l.withDO(l.DO.Attrs(attrs...)) +} + +func (l linkAdminRolePermissionDo) Assign(attrs ...field.AssignExpr) *linkAdminRolePermissionDo { + return l.withDO(l.DO.Assign(attrs...)) +} + +func (l linkAdminRolePermissionDo) Joins(fields ...field.RelationField) *linkAdminRolePermissionDo { + for _, _f := range fields { + l = *l.withDO(l.DO.Joins(_f)) + } + return &l +} + +func (l linkAdminRolePermissionDo) Preload(fields ...field.RelationField) *linkAdminRolePermissionDo { + for _, _f := range fields { + l = *l.withDO(l.DO.Preload(_f)) + } + return &l +} + +func (l linkAdminRolePermissionDo) FirstOrInit() (*models.LinkAdminRolePermission, error) { + if result, err := l.DO.FirstOrInit(); err != nil { + return nil, err + } else { + return result.(*models.LinkAdminRolePermission), nil + } +} + +func (l linkAdminRolePermissionDo) FirstOrCreate() (*models.LinkAdminRolePermission, error) { + if result, err := l.DO.FirstOrCreate(); err != nil { + return nil, err + } else { + return result.(*models.LinkAdminRolePermission), nil + } +} + +func (l linkAdminRolePermissionDo) FindByPage(offset int, limit int) (result []*models.LinkAdminRolePermission, count int64, err error) { + result, err = l.Offset(offset).Limit(limit).Find() + if err != nil { + return + } + + if size := len(result); 0 < limit && 0 < size && size < limit { + count = int64(size + offset) + return + } + + count, err = l.Offset(-1).Limit(-1).Count() + return +} + +func (l linkAdminRolePermissionDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) { + count, err = l.Count() + if err != nil { + return + } + + err = l.Offset(offset).Limit(limit).Scan(result) + return +} + +func (l linkAdminRolePermissionDo) Scan(result interface{}) (err error) { + return l.DO.Scan(result) +} + +func (l linkAdminRolePermissionDo) Delete(models ...*models.LinkAdminRolePermission) (result gen.ResultInfo, err error) { + return l.DO.Delete(models) +} + +func (l *linkAdminRolePermissionDo) withDO(do gen.Dao) *linkAdminRolePermissionDo { + l.DO = *do.(*gen.DO) + return l +} diff --git a/web/queries/link_client_permission.gen.go b/web/queries/link_client_permission.gen.go new file mode 100644 index 0000000..2f24591 --- /dev/null +++ b/web/queries/link_client_permission.gen.go @@ -0,0 +1,327 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package queries + +import ( + "context" + + "gorm.io/gorm" + "gorm.io/gorm/clause" + "gorm.io/gorm/schema" + + "gorm.io/gen" + "gorm.io/gen/field" + + "gorm.io/plugin/dbresolver" + + "platform/web/models" +) + +func newLinkClientPermission(db *gorm.DB, opts ...gen.DOOption) linkClientPermission { + _linkClientPermission := linkClientPermission{} + + _linkClientPermission.linkClientPermissionDo.UseDB(db, opts...) + _linkClientPermission.linkClientPermissionDo.UseModel(&models.LinkClientPermission{}) + + tableName := _linkClientPermission.linkClientPermissionDo.TableName() + _linkClientPermission.ALL = field.NewAsterisk(tableName) + _linkClientPermission.ID = field.NewInt32(tableName, "id") + _linkClientPermission.ClientID = field.NewInt32(tableName, "client_id") + _linkClientPermission.PermissionID = field.NewInt32(tableName, "permission_id") + + _linkClientPermission.fillFieldMap() + + return _linkClientPermission +} + +type linkClientPermission struct { + linkClientPermissionDo + + ALL field.Asterisk + ID field.Int32 + ClientID field.Int32 + PermissionID field.Int32 + + fieldMap map[string]field.Expr +} + +func (l linkClientPermission) Table(newTableName string) *linkClientPermission { + l.linkClientPermissionDo.UseTable(newTableName) + return l.updateTableName(newTableName) +} + +func (l linkClientPermission) As(alias string) *linkClientPermission { + l.linkClientPermissionDo.DO = *(l.linkClientPermissionDo.As(alias).(*gen.DO)) + return l.updateTableName(alias) +} + +func (l *linkClientPermission) updateTableName(table string) *linkClientPermission { + l.ALL = field.NewAsterisk(table) + l.ID = field.NewInt32(table, "id") + l.ClientID = field.NewInt32(table, "client_id") + l.PermissionID = field.NewInt32(table, "permission_id") + + l.fillFieldMap() + + return l +} + +func (l *linkClientPermission) GetFieldByName(fieldName string) (field.OrderExpr, bool) { + _f, ok := l.fieldMap[fieldName] + if !ok || _f == nil { + return nil, false + } + _oe, ok := _f.(field.OrderExpr) + return _oe, ok +} + +func (l *linkClientPermission) fillFieldMap() { + l.fieldMap = make(map[string]field.Expr, 3) + l.fieldMap["id"] = l.ID + l.fieldMap["client_id"] = l.ClientID + l.fieldMap["permission_id"] = l.PermissionID +} + +func (l linkClientPermission) clone(db *gorm.DB) linkClientPermission { + l.linkClientPermissionDo.ReplaceConnPool(db.Statement.ConnPool) + return l +} + +func (l linkClientPermission) replaceDB(db *gorm.DB) linkClientPermission { + l.linkClientPermissionDo.ReplaceDB(db) + return l +} + +type linkClientPermissionDo struct{ gen.DO } + +func (l linkClientPermissionDo) Debug() *linkClientPermissionDo { + return l.withDO(l.DO.Debug()) +} + +func (l linkClientPermissionDo) WithContext(ctx context.Context) *linkClientPermissionDo { + return l.withDO(l.DO.WithContext(ctx)) +} + +func (l linkClientPermissionDo) ReadDB() *linkClientPermissionDo { + return l.Clauses(dbresolver.Read) +} + +func (l linkClientPermissionDo) WriteDB() *linkClientPermissionDo { + return l.Clauses(dbresolver.Write) +} + +func (l linkClientPermissionDo) Session(config *gorm.Session) *linkClientPermissionDo { + return l.withDO(l.DO.Session(config)) +} + +func (l linkClientPermissionDo) Clauses(conds ...clause.Expression) *linkClientPermissionDo { + return l.withDO(l.DO.Clauses(conds...)) +} + +func (l linkClientPermissionDo) Returning(value interface{}, columns ...string) *linkClientPermissionDo { + return l.withDO(l.DO.Returning(value, columns...)) +} + +func (l linkClientPermissionDo) Not(conds ...gen.Condition) *linkClientPermissionDo { + return l.withDO(l.DO.Not(conds...)) +} + +func (l linkClientPermissionDo) Or(conds ...gen.Condition) *linkClientPermissionDo { + return l.withDO(l.DO.Or(conds...)) +} + +func (l linkClientPermissionDo) Select(conds ...field.Expr) *linkClientPermissionDo { + return l.withDO(l.DO.Select(conds...)) +} + +func (l linkClientPermissionDo) Where(conds ...gen.Condition) *linkClientPermissionDo { + return l.withDO(l.DO.Where(conds...)) +} + +func (l linkClientPermissionDo) Order(conds ...field.Expr) *linkClientPermissionDo { + return l.withDO(l.DO.Order(conds...)) +} + +func (l linkClientPermissionDo) Distinct(cols ...field.Expr) *linkClientPermissionDo { + return l.withDO(l.DO.Distinct(cols...)) +} + +func (l linkClientPermissionDo) Omit(cols ...field.Expr) *linkClientPermissionDo { + return l.withDO(l.DO.Omit(cols...)) +} + +func (l linkClientPermissionDo) Join(table schema.Tabler, on ...field.Expr) *linkClientPermissionDo { + return l.withDO(l.DO.Join(table, on...)) +} + +func (l linkClientPermissionDo) LeftJoin(table schema.Tabler, on ...field.Expr) *linkClientPermissionDo { + return l.withDO(l.DO.LeftJoin(table, on...)) +} + +func (l linkClientPermissionDo) RightJoin(table schema.Tabler, on ...field.Expr) *linkClientPermissionDo { + return l.withDO(l.DO.RightJoin(table, on...)) +} + +func (l linkClientPermissionDo) Group(cols ...field.Expr) *linkClientPermissionDo { + return l.withDO(l.DO.Group(cols...)) +} + +func (l linkClientPermissionDo) Having(conds ...gen.Condition) *linkClientPermissionDo { + return l.withDO(l.DO.Having(conds...)) +} + +func (l linkClientPermissionDo) Limit(limit int) *linkClientPermissionDo { + return l.withDO(l.DO.Limit(limit)) +} + +func (l linkClientPermissionDo) Offset(offset int) *linkClientPermissionDo { + return l.withDO(l.DO.Offset(offset)) +} + +func (l linkClientPermissionDo) Scopes(funcs ...func(gen.Dao) gen.Dao) *linkClientPermissionDo { + return l.withDO(l.DO.Scopes(funcs...)) +} + +func (l linkClientPermissionDo) Unscoped() *linkClientPermissionDo { + return l.withDO(l.DO.Unscoped()) +} + +func (l linkClientPermissionDo) Create(values ...*models.LinkClientPermission) error { + if len(values) == 0 { + return nil + } + return l.DO.Create(values) +} + +func (l linkClientPermissionDo) CreateInBatches(values []*models.LinkClientPermission, batchSize int) error { + return l.DO.CreateInBatches(values, batchSize) +} + +// Save : !!! underlying implementation is different with GORM +// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values) +func (l linkClientPermissionDo) Save(values ...*models.LinkClientPermission) error { + if len(values) == 0 { + return nil + } + return l.DO.Save(values) +} + +func (l linkClientPermissionDo) First() (*models.LinkClientPermission, error) { + if result, err := l.DO.First(); err != nil { + return nil, err + } else { + return result.(*models.LinkClientPermission), nil + } +} + +func (l linkClientPermissionDo) Take() (*models.LinkClientPermission, error) { + if result, err := l.DO.Take(); err != nil { + return nil, err + } else { + return result.(*models.LinkClientPermission), nil + } +} + +func (l linkClientPermissionDo) Last() (*models.LinkClientPermission, error) { + if result, err := l.DO.Last(); err != nil { + return nil, err + } else { + return result.(*models.LinkClientPermission), nil + } +} + +func (l linkClientPermissionDo) Find() ([]*models.LinkClientPermission, error) { + result, err := l.DO.Find() + return result.([]*models.LinkClientPermission), err +} + +func (l linkClientPermissionDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.LinkClientPermission, err error) { + buf := make([]*models.LinkClientPermission, 0, batchSize) + err = l.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error { + defer func() { results = append(results, buf...) }() + return fc(tx, batch) + }) + return results, err +} + +func (l linkClientPermissionDo) FindInBatches(result *[]*models.LinkClientPermission, batchSize int, fc func(tx gen.Dao, batch int) error) error { + return l.DO.FindInBatches(result, batchSize, fc) +} + +func (l linkClientPermissionDo) Attrs(attrs ...field.AssignExpr) *linkClientPermissionDo { + return l.withDO(l.DO.Attrs(attrs...)) +} + +func (l linkClientPermissionDo) Assign(attrs ...field.AssignExpr) *linkClientPermissionDo { + return l.withDO(l.DO.Assign(attrs...)) +} + +func (l linkClientPermissionDo) Joins(fields ...field.RelationField) *linkClientPermissionDo { + for _, _f := range fields { + l = *l.withDO(l.DO.Joins(_f)) + } + return &l +} + +func (l linkClientPermissionDo) Preload(fields ...field.RelationField) *linkClientPermissionDo { + for _, _f := range fields { + l = *l.withDO(l.DO.Preload(_f)) + } + return &l +} + +func (l linkClientPermissionDo) FirstOrInit() (*models.LinkClientPermission, error) { + if result, err := l.DO.FirstOrInit(); err != nil { + return nil, err + } else { + return result.(*models.LinkClientPermission), nil + } +} + +func (l linkClientPermissionDo) FirstOrCreate() (*models.LinkClientPermission, error) { + if result, err := l.DO.FirstOrCreate(); err != nil { + return nil, err + } else { + return result.(*models.LinkClientPermission), nil + } +} + +func (l linkClientPermissionDo) FindByPage(offset int, limit int) (result []*models.LinkClientPermission, count int64, err error) { + result, err = l.Offset(offset).Limit(limit).Find() + if err != nil { + return + } + + if size := len(result); 0 < limit && 0 < size && size < limit { + count = int64(size + offset) + return + } + + count, err = l.Offset(-1).Limit(-1).Count() + return +} + +func (l linkClientPermissionDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) { + count, err = l.Count() + if err != nil { + return + } + + err = l.Offset(offset).Limit(limit).Scan(result) + return +} + +func (l linkClientPermissionDo) Scan(result interface{}) (err error) { + return l.DO.Scan(result) +} + +func (l linkClientPermissionDo) Delete(models ...*models.LinkClientPermission) (result gen.ResultInfo, err error) { + return l.DO.Delete(models) +} + +func (l *linkClientPermissionDo) withDO(do gen.Dao) *linkClientPermissionDo { + l.DO = *do.(*gen.DO) + return l +} diff --git a/web/queries/link_user_role.gen.go b/web/queries/link_user_role.gen.go new file mode 100644 index 0000000..8dafde4 --- /dev/null +++ b/web/queries/link_user_role.gen.go @@ -0,0 +1,327 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package queries + +import ( + "context" + + "gorm.io/gorm" + "gorm.io/gorm/clause" + "gorm.io/gorm/schema" + + "gorm.io/gen" + "gorm.io/gen/field" + + "gorm.io/plugin/dbresolver" + + "platform/web/models" +) + +func newLinkUserRole(db *gorm.DB, opts ...gen.DOOption) linkUserRole { + _linkUserRole := linkUserRole{} + + _linkUserRole.linkUserRoleDo.UseDB(db, opts...) + _linkUserRole.linkUserRoleDo.UseModel(&models.LinkUserRole{}) + + tableName := _linkUserRole.linkUserRoleDo.TableName() + _linkUserRole.ALL = field.NewAsterisk(tableName) + _linkUserRole.ID = field.NewInt32(tableName, "id") + _linkUserRole.UserID = field.NewInt32(tableName, "user_id") + _linkUserRole.RoleID = field.NewInt32(tableName, "role_id") + + _linkUserRole.fillFieldMap() + + return _linkUserRole +} + +type linkUserRole struct { + linkUserRoleDo + + ALL field.Asterisk + ID field.Int32 + UserID field.Int32 + RoleID field.Int32 + + fieldMap map[string]field.Expr +} + +func (l linkUserRole) Table(newTableName string) *linkUserRole { + l.linkUserRoleDo.UseTable(newTableName) + return l.updateTableName(newTableName) +} + +func (l linkUserRole) As(alias string) *linkUserRole { + l.linkUserRoleDo.DO = *(l.linkUserRoleDo.As(alias).(*gen.DO)) + return l.updateTableName(alias) +} + +func (l *linkUserRole) updateTableName(table string) *linkUserRole { + l.ALL = field.NewAsterisk(table) + l.ID = field.NewInt32(table, "id") + l.UserID = field.NewInt32(table, "user_id") + l.RoleID = field.NewInt32(table, "role_id") + + l.fillFieldMap() + + return l +} + +func (l *linkUserRole) GetFieldByName(fieldName string) (field.OrderExpr, bool) { + _f, ok := l.fieldMap[fieldName] + if !ok || _f == nil { + return nil, false + } + _oe, ok := _f.(field.OrderExpr) + return _oe, ok +} + +func (l *linkUserRole) fillFieldMap() { + l.fieldMap = make(map[string]field.Expr, 3) + l.fieldMap["id"] = l.ID + l.fieldMap["user_id"] = l.UserID + l.fieldMap["role_id"] = l.RoleID +} + +func (l linkUserRole) clone(db *gorm.DB) linkUserRole { + l.linkUserRoleDo.ReplaceConnPool(db.Statement.ConnPool) + return l +} + +func (l linkUserRole) replaceDB(db *gorm.DB) linkUserRole { + l.linkUserRoleDo.ReplaceDB(db) + return l +} + +type linkUserRoleDo struct{ gen.DO } + +func (l linkUserRoleDo) Debug() *linkUserRoleDo { + return l.withDO(l.DO.Debug()) +} + +func (l linkUserRoleDo) WithContext(ctx context.Context) *linkUserRoleDo { + return l.withDO(l.DO.WithContext(ctx)) +} + +func (l linkUserRoleDo) ReadDB() *linkUserRoleDo { + return l.Clauses(dbresolver.Read) +} + +func (l linkUserRoleDo) WriteDB() *linkUserRoleDo { + return l.Clauses(dbresolver.Write) +} + +func (l linkUserRoleDo) Session(config *gorm.Session) *linkUserRoleDo { + return l.withDO(l.DO.Session(config)) +} + +func (l linkUserRoleDo) Clauses(conds ...clause.Expression) *linkUserRoleDo { + return l.withDO(l.DO.Clauses(conds...)) +} + +func (l linkUserRoleDo) Returning(value interface{}, columns ...string) *linkUserRoleDo { + return l.withDO(l.DO.Returning(value, columns...)) +} + +func (l linkUserRoleDo) Not(conds ...gen.Condition) *linkUserRoleDo { + return l.withDO(l.DO.Not(conds...)) +} + +func (l linkUserRoleDo) Or(conds ...gen.Condition) *linkUserRoleDo { + return l.withDO(l.DO.Or(conds...)) +} + +func (l linkUserRoleDo) Select(conds ...field.Expr) *linkUserRoleDo { + return l.withDO(l.DO.Select(conds...)) +} + +func (l linkUserRoleDo) Where(conds ...gen.Condition) *linkUserRoleDo { + return l.withDO(l.DO.Where(conds...)) +} + +func (l linkUserRoleDo) Order(conds ...field.Expr) *linkUserRoleDo { + return l.withDO(l.DO.Order(conds...)) +} + +func (l linkUserRoleDo) Distinct(cols ...field.Expr) *linkUserRoleDo { + return l.withDO(l.DO.Distinct(cols...)) +} + +func (l linkUserRoleDo) Omit(cols ...field.Expr) *linkUserRoleDo { + return l.withDO(l.DO.Omit(cols...)) +} + +func (l linkUserRoleDo) Join(table schema.Tabler, on ...field.Expr) *linkUserRoleDo { + return l.withDO(l.DO.Join(table, on...)) +} + +func (l linkUserRoleDo) LeftJoin(table schema.Tabler, on ...field.Expr) *linkUserRoleDo { + return l.withDO(l.DO.LeftJoin(table, on...)) +} + +func (l linkUserRoleDo) RightJoin(table schema.Tabler, on ...field.Expr) *linkUserRoleDo { + return l.withDO(l.DO.RightJoin(table, on...)) +} + +func (l linkUserRoleDo) Group(cols ...field.Expr) *linkUserRoleDo { + return l.withDO(l.DO.Group(cols...)) +} + +func (l linkUserRoleDo) Having(conds ...gen.Condition) *linkUserRoleDo { + return l.withDO(l.DO.Having(conds...)) +} + +func (l linkUserRoleDo) Limit(limit int) *linkUserRoleDo { + return l.withDO(l.DO.Limit(limit)) +} + +func (l linkUserRoleDo) Offset(offset int) *linkUserRoleDo { + return l.withDO(l.DO.Offset(offset)) +} + +func (l linkUserRoleDo) Scopes(funcs ...func(gen.Dao) gen.Dao) *linkUserRoleDo { + return l.withDO(l.DO.Scopes(funcs...)) +} + +func (l linkUserRoleDo) Unscoped() *linkUserRoleDo { + return l.withDO(l.DO.Unscoped()) +} + +func (l linkUserRoleDo) Create(values ...*models.LinkUserRole) error { + if len(values) == 0 { + return nil + } + return l.DO.Create(values) +} + +func (l linkUserRoleDo) CreateInBatches(values []*models.LinkUserRole, batchSize int) error { + return l.DO.CreateInBatches(values, batchSize) +} + +// Save : !!! underlying implementation is different with GORM +// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values) +func (l linkUserRoleDo) Save(values ...*models.LinkUserRole) error { + if len(values) == 0 { + return nil + } + return l.DO.Save(values) +} + +func (l linkUserRoleDo) First() (*models.LinkUserRole, error) { + if result, err := l.DO.First(); err != nil { + return nil, err + } else { + return result.(*models.LinkUserRole), nil + } +} + +func (l linkUserRoleDo) Take() (*models.LinkUserRole, error) { + if result, err := l.DO.Take(); err != nil { + return nil, err + } else { + return result.(*models.LinkUserRole), nil + } +} + +func (l linkUserRoleDo) Last() (*models.LinkUserRole, error) { + if result, err := l.DO.Last(); err != nil { + return nil, err + } else { + return result.(*models.LinkUserRole), nil + } +} + +func (l linkUserRoleDo) Find() ([]*models.LinkUserRole, error) { + result, err := l.DO.Find() + return result.([]*models.LinkUserRole), err +} + +func (l linkUserRoleDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.LinkUserRole, err error) { + buf := make([]*models.LinkUserRole, 0, batchSize) + err = l.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error { + defer func() { results = append(results, buf...) }() + return fc(tx, batch) + }) + return results, err +} + +func (l linkUserRoleDo) FindInBatches(result *[]*models.LinkUserRole, batchSize int, fc func(tx gen.Dao, batch int) error) error { + return l.DO.FindInBatches(result, batchSize, fc) +} + +func (l linkUserRoleDo) Attrs(attrs ...field.AssignExpr) *linkUserRoleDo { + return l.withDO(l.DO.Attrs(attrs...)) +} + +func (l linkUserRoleDo) Assign(attrs ...field.AssignExpr) *linkUserRoleDo { + return l.withDO(l.DO.Assign(attrs...)) +} + +func (l linkUserRoleDo) Joins(fields ...field.RelationField) *linkUserRoleDo { + for _, _f := range fields { + l = *l.withDO(l.DO.Joins(_f)) + } + return &l +} + +func (l linkUserRoleDo) Preload(fields ...field.RelationField) *linkUserRoleDo { + for _, _f := range fields { + l = *l.withDO(l.DO.Preload(_f)) + } + return &l +} + +func (l linkUserRoleDo) FirstOrInit() (*models.LinkUserRole, error) { + if result, err := l.DO.FirstOrInit(); err != nil { + return nil, err + } else { + return result.(*models.LinkUserRole), nil + } +} + +func (l linkUserRoleDo) FirstOrCreate() (*models.LinkUserRole, error) { + if result, err := l.DO.FirstOrCreate(); err != nil { + return nil, err + } else { + return result.(*models.LinkUserRole), nil + } +} + +func (l linkUserRoleDo) FindByPage(offset int, limit int) (result []*models.LinkUserRole, count int64, err error) { + result, err = l.Offset(offset).Limit(limit).Find() + if err != nil { + return + } + + if size := len(result); 0 < limit && 0 < size && size < limit { + count = int64(size + offset) + return + } + + count, err = l.Offset(-1).Limit(-1).Count() + return +} + +func (l linkUserRoleDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) { + count, err = l.Count() + if err != nil { + return + } + + err = l.Offset(offset).Limit(limit).Scan(result) + return +} + +func (l linkUserRoleDo) Scan(result interface{}) (err error) { + return l.DO.Scan(result) +} + +func (l linkUserRoleDo) Delete(models ...*models.LinkUserRole) (result gen.ResultInfo, err error) { + return l.DO.Delete(models) +} + +func (l *linkUserRoleDo) withDO(do gen.Dao) *linkUserRoleDo { + l.DO = *do.(*gen.DO) + return l +} diff --git a/web/queries/link_user_role_permission.gen.go b/web/queries/link_user_role_permission.gen.go new file mode 100644 index 0000000..457b28c --- /dev/null +++ b/web/queries/link_user_role_permission.gen.go @@ -0,0 +1,327 @@ +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. +// Code generated by gorm.io/gen. DO NOT EDIT. + +package queries + +import ( + "context" + + "gorm.io/gorm" + "gorm.io/gorm/clause" + "gorm.io/gorm/schema" + + "gorm.io/gen" + "gorm.io/gen/field" + + "gorm.io/plugin/dbresolver" + + "platform/web/models" +) + +func newLinkUserRolePermission(db *gorm.DB, opts ...gen.DOOption) linkUserRolePermission { + _linkUserRolePermission := linkUserRolePermission{} + + _linkUserRolePermission.linkUserRolePermissionDo.UseDB(db, opts...) + _linkUserRolePermission.linkUserRolePermissionDo.UseModel(&models.LinkUserRolePermission{}) + + tableName := _linkUserRolePermission.linkUserRolePermissionDo.TableName() + _linkUserRolePermission.ALL = field.NewAsterisk(tableName) + _linkUserRolePermission.ID = field.NewInt32(tableName, "id") + _linkUserRolePermission.RoleID = field.NewInt32(tableName, "role_id") + _linkUserRolePermission.PermissionID = field.NewInt32(tableName, "permission_id") + + _linkUserRolePermission.fillFieldMap() + + return _linkUserRolePermission +} + +type linkUserRolePermission struct { + linkUserRolePermissionDo + + ALL field.Asterisk + ID field.Int32 + RoleID field.Int32 + PermissionID field.Int32 + + fieldMap map[string]field.Expr +} + +func (l linkUserRolePermission) Table(newTableName string) *linkUserRolePermission { + l.linkUserRolePermissionDo.UseTable(newTableName) + return l.updateTableName(newTableName) +} + +func (l linkUserRolePermission) As(alias string) *linkUserRolePermission { + l.linkUserRolePermissionDo.DO = *(l.linkUserRolePermissionDo.As(alias).(*gen.DO)) + return l.updateTableName(alias) +} + +func (l *linkUserRolePermission) updateTableName(table string) *linkUserRolePermission { + l.ALL = field.NewAsterisk(table) + l.ID = field.NewInt32(table, "id") + l.RoleID = field.NewInt32(table, "role_id") + l.PermissionID = field.NewInt32(table, "permission_id") + + l.fillFieldMap() + + return l +} + +func (l *linkUserRolePermission) GetFieldByName(fieldName string) (field.OrderExpr, bool) { + _f, ok := l.fieldMap[fieldName] + if !ok || _f == nil { + return nil, false + } + _oe, ok := _f.(field.OrderExpr) + return _oe, ok +} + +func (l *linkUserRolePermission) fillFieldMap() { + l.fieldMap = make(map[string]field.Expr, 3) + l.fieldMap["id"] = l.ID + l.fieldMap["role_id"] = l.RoleID + l.fieldMap["permission_id"] = l.PermissionID +} + +func (l linkUserRolePermission) clone(db *gorm.DB) linkUserRolePermission { + l.linkUserRolePermissionDo.ReplaceConnPool(db.Statement.ConnPool) + return l +} + +func (l linkUserRolePermission) replaceDB(db *gorm.DB) linkUserRolePermission { + l.linkUserRolePermissionDo.ReplaceDB(db) + return l +} + +type linkUserRolePermissionDo struct{ gen.DO } + +func (l linkUserRolePermissionDo) Debug() *linkUserRolePermissionDo { + return l.withDO(l.DO.Debug()) +} + +func (l linkUserRolePermissionDo) WithContext(ctx context.Context) *linkUserRolePermissionDo { + return l.withDO(l.DO.WithContext(ctx)) +} + +func (l linkUserRolePermissionDo) ReadDB() *linkUserRolePermissionDo { + return l.Clauses(dbresolver.Read) +} + +func (l linkUserRolePermissionDo) WriteDB() *linkUserRolePermissionDo { + return l.Clauses(dbresolver.Write) +} + +func (l linkUserRolePermissionDo) Session(config *gorm.Session) *linkUserRolePermissionDo { + return l.withDO(l.DO.Session(config)) +} + +func (l linkUserRolePermissionDo) Clauses(conds ...clause.Expression) *linkUserRolePermissionDo { + return l.withDO(l.DO.Clauses(conds...)) +} + +func (l linkUserRolePermissionDo) Returning(value interface{}, columns ...string) *linkUserRolePermissionDo { + return l.withDO(l.DO.Returning(value, columns...)) +} + +func (l linkUserRolePermissionDo) Not(conds ...gen.Condition) *linkUserRolePermissionDo { + return l.withDO(l.DO.Not(conds...)) +} + +func (l linkUserRolePermissionDo) Or(conds ...gen.Condition) *linkUserRolePermissionDo { + return l.withDO(l.DO.Or(conds...)) +} + +func (l linkUserRolePermissionDo) Select(conds ...field.Expr) *linkUserRolePermissionDo { + return l.withDO(l.DO.Select(conds...)) +} + +func (l linkUserRolePermissionDo) Where(conds ...gen.Condition) *linkUserRolePermissionDo { + return l.withDO(l.DO.Where(conds...)) +} + +func (l linkUserRolePermissionDo) Order(conds ...field.Expr) *linkUserRolePermissionDo { + return l.withDO(l.DO.Order(conds...)) +} + +func (l linkUserRolePermissionDo) Distinct(cols ...field.Expr) *linkUserRolePermissionDo { + return l.withDO(l.DO.Distinct(cols...)) +} + +func (l linkUserRolePermissionDo) Omit(cols ...field.Expr) *linkUserRolePermissionDo { + return l.withDO(l.DO.Omit(cols...)) +} + +func (l linkUserRolePermissionDo) Join(table schema.Tabler, on ...field.Expr) *linkUserRolePermissionDo { + return l.withDO(l.DO.Join(table, on...)) +} + +func (l linkUserRolePermissionDo) LeftJoin(table schema.Tabler, on ...field.Expr) *linkUserRolePermissionDo { + return l.withDO(l.DO.LeftJoin(table, on...)) +} + +func (l linkUserRolePermissionDo) RightJoin(table schema.Tabler, on ...field.Expr) *linkUserRolePermissionDo { + return l.withDO(l.DO.RightJoin(table, on...)) +} + +func (l linkUserRolePermissionDo) Group(cols ...field.Expr) *linkUserRolePermissionDo { + return l.withDO(l.DO.Group(cols...)) +} + +func (l linkUserRolePermissionDo) Having(conds ...gen.Condition) *linkUserRolePermissionDo { + return l.withDO(l.DO.Having(conds...)) +} + +func (l linkUserRolePermissionDo) Limit(limit int) *linkUserRolePermissionDo { + return l.withDO(l.DO.Limit(limit)) +} + +func (l linkUserRolePermissionDo) Offset(offset int) *linkUserRolePermissionDo { + return l.withDO(l.DO.Offset(offset)) +} + +func (l linkUserRolePermissionDo) Scopes(funcs ...func(gen.Dao) gen.Dao) *linkUserRolePermissionDo { + return l.withDO(l.DO.Scopes(funcs...)) +} + +func (l linkUserRolePermissionDo) Unscoped() *linkUserRolePermissionDo { + return l.withDO(l.DO.Unscoped()) +} + +func (l linkUserRolePermissionDo) Create(values ...*models.LinkUserRolePermission) error { + if len(values) == 0 { + return nil + } + return l.DO.Create(values) +} + +func (l linkUserRolePermissionDo) CreateInBatches(values []*models.LinkUserRolePermission, batchSize int) error { + return l.DO.CreateInBatches(values, batchSize) +} + +// Save : !!! underlying implementation is different with GORM +// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values) +func (l linkUserRolePermissionDo) Save(values ...*models.LinkUserRolePermission) error { + if len(values) == 0 { + return nil + } + return l.DO.Save(values) +} + +func (l linkUserRolePermissionDo) First() (*models.LinkUserRolePermission, error) { + if result, err := l.DO.First(); err != nil { + return nil, err + } else { + return result.(*models.LinkUserRolePermission), nil + } +} + +func (l linkUserRolePermissionDo) Take() (*models.LinkUserRolePermission, error) { + if result, err := l.DO.Take(); err != nil { + return nil, err + } else { + return result.(*models.LinkUserRolePermission), nil + } +} + +func (l linkUserRolePermissionDo) Last() (*models.LinkUserRolePermission, error) { + if result, err := l.DO.Last(); err != nil { + return nil, err + } else { + return result.(*models.LinkUserRolePermission), nil + } +} + +func (l linkUserRolePermissionDo) Find() ([]*models.LinkUserRolePermission, error) { + result, err := l.DO.Find() + return result.([]*models.LinkUserRolePermission), err +} + +func (l linkUserRolePermissionDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.LinkUserRolePermission, err error) { + buf := make([]*models.LinkUserRolePermission, 0, batchSize) + err = l.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error { + defer func() { results = append(results, buf...) }() + return fc(tx, batch) + }) + return results, err +} + +func (l linkUserRolePermissionDo) FindInBatches(result *[]*models.LinkUserRolePermission, batchSize int, fc func(tx gen.Dao, batch int) error) error { + return l.DO.FindInBatches(result, batchSize, fc) +} + +func (l linkUserRolePermissionDo) Attrs(attrs ...field.AssignExpr) *linkUserRolePermissionDo { + return l.withDO(l.DO.Attrs(attrs...)) +} + +func (l linkUserRolePermissionDo) Assign(attrs ...field.AssignExpr) *linkUserRolePermissionDo { + return l.withDO(l.DO.Assign(attrs...)) +} + +func (l linkUserRolePermissionDo) Joins(fields ...field.RelationField) *linkUserRolePermissionDo { + for _, _f := range fields { + l = *l.withDO(l.DO.Joins(_f)) + } + return &l +} + +func (l linkUserRolePermissionDo) Preload(fields ...field.RelationField) *linkUserRolePermissionDo { + for _, _f := range fields { + l = *l.withDO(l.DO.Preload(_f)) + } + return &l +} + +func (l linkUserRolePermissionDo) FirstOrInit() (*models.LinkUserRolePermission, error) { + if result, err := l.DO.FirstOrInit(); err != nil { + return nil, err + } else { + return result.(*models.LinkUserRolePermission), nil + } +} + +func (l linkUserRolePermissionDo) FirstOrCreate() (*models.LinkUserRolePermission, error) { + if result, err := l.DO.FirstOrCreate(); err != nil { + return nil, err + } else { + return result.(*models.LinkUserRolePermission), nil + } +} + +func (l linkUserRolePermissionDo) FindByPage(offset int, limit int) (result []*models.LinkUserRolePermission, count int64, err error) { + result, err = l.Offset(offset).Limit(limit).Find() + if err != nil { + return + } + + if size := len(result); 0 < limit && 0 < size && size < limit { + count = int64(size + offset) + return + } + + count, err = l.Offset(-1).Limit(-1).Count() + return +} + +func (l linkUserRolePermissionDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) { + count, err = l.Count() + if err != nil { + return + } + + err = l.Offset(offset).Limit(limit).Scan(result) + return +} + +func (l linkUserRolePermissionDo) Scan(result interface{}) (err error) { + return l.DO.Scan(result) +} + +func (l linkUserRolePermissionDo) Delete(models ...*models.LinkUserRolePermission) (result gen.ResultInfo, err error) { + return l.DO.Delete(models) +} + +func (l *linkUserRolePermissionDo) withDO(do gen.Dao) *linkUserRolePermissionDo { + l.DO = *do.(*gen.DO) + return l +} diff --git a/web/queries/logs_login.gen.go b/web/queries/logs_login.gen.go index 7822fd0..0cf8fb3 100644 --- a/web/queries/logs_login.gen.go +++ b/web/queries/logs_login.gen.go @@ -28,13 +28,23 @@ func newLogsLogin(db *gorm.DB, opts ...gen.DOOption) logsLogin { tableName := _logsLogin.logsLoginDo.TableName() _logsLogin.ALL = field.NewAsterisk(tableName) _logsLogin.ID = field.NewInt32(tableName, "id") - _logsLogin.IP = field.NewString(tableName, "ip") + _logsLogin.IP = field.NewField(tableName, "ip") _logsLogin.UA = field.NewString(tableName, "ua") _logsLogin.GrantType = field.NewString(tableName, "grant_type") - _logsLogin.PasswordGrantType = field.NewString(tableName, "password_grant_type") + _logsLogin.PasswordType = field.NewString(tableName, "password_type") _logsLogin.Success = field.NewBool(tableName, "success") _logsLogin.UserID = field.NewInt32(tableName, "user_id") - _logsLogin.Time = field.NewField(tableName, "time") + _logsLogin.Time = field.NewTime(tableName, "time") + _logsLogin.User = logsLoginBelongsToUser{ + db: db.Session(&gorm.Session{}), + + RelationField: field.NewRelation("User", "models.User"), + Admin: struct { + field.RelationField + }{ + RelationField: field.NewRelation("User.Admin", "models.Admin"), + }, + } _logsLogin.fillFieldMap() @@ -44,15 +54,16 @@ func newLogsLogin(db *gorm.DB, opts ...gen.DOOption) logsLogin { type logsLogin struct { logsLoginDo - ALL field.Asterisk - ID field.Int32 // 登录日志ID - IP field.String // IP地址 - UA field.String // 用户代理 - GrantType field.String // 授权类型:authorization_code-授权码模式,client_credentials-客户端凭证模式,refresh_token-刷新令牌模式,password-密码模式 - PasswordGrantType field.String // 密码模式子授权类型:password-账号密码,phone_code-手机验证码,email_code-邮箱验证码 - Success field.Bool // 登录是否成功 - UserID field.Int32 // 用户ID - Time field.Field // 登录时间 + ALL field.Asterisk + ID field.Int32 + IP field.Field + UA field.String + GrantType field.String + PasswordType field.String + Success field.Bool + UserID field.Int32 + Time field.Time + User logsLoginBelongsToUser fieldMap map[string]field.Expr } @@ -70,13 +81,13 @@ func (l logsLogin) As(alias string) *logsLogin { func (l *logsLogin) updateTableName(table string) *logsLogin { l.ALL = field.NewAsterisk(table) l.ID = field.NewInt32(table, "id") - l.IP = field.NewString(table, "ip") + l.IP = field.NewField(table, "ip") l.UA = field.NewString(table, "ua") l.GrantType = field.NewString(table, "grant_type") - l.PasswordGrantType = field.NewString(table, "password_grant_type") + l.PasswordType = field.NewString(table, "password_type") l.Success = field.NewBool(table, "success") l.UserID = field.NewInt32(table, "user_id") - l.Time = field.NewField(table, "time") + l.Time = field.NewTime(table, "time") l.fillFieldMap() @@ -93,27 +104,116 @@ func (l *logsLogin) GetFieldByName(fieldName string) (field.OrderExpr, bool) { } func (l *logsLogin) fillFieldMap() { - l.fieldMap = make(map[string]field.Expr, 8) + l.fieldMap = make(map[string]field.Expr, 9) l.fieldMap["id"] = l.ID l.fieldMap["ip"] = l.IP l.fieldMap["ua"] = l.UA l.fieldMap["grant_type"] = l.GrantType - l.fieldMap["password_grant_type"] = l.PasswordGrantType + l.fieldMap["password_type"] = l.PasswordType l.fieldMap["success"] = l.Success l.fieldMap["user_id"] = l.UserID l.fieldMap["time"] = l.Time + } func (l logsLogin) clone(db *gorm.DB) logsLogin { l.logsLoginDo.ReplaceConnPool(db.Statement.ConnPool) + l.User.db = db.Session(&gorm.Session{Initialized: true}) + l.User.db.Statement.ConnPool = db.Statement.ConnPool return l } func (l logsLogin) replaceDB(db *gorm.DB) logsLogin { l.logsLoginDo.ReplaceDB(db) + l.User.db = db.Session(&gorm.Session{}) return l } +type logsLoginBelongsToUser struct { + db *gorm.DB + + field.RelationField + + Admin struct { + field.RelationField + } +} + +func (a logsLoginBelongsToUser) Where(conds ...field.Expr) *logsLoginBelongsToUser { + if len(conds) == 0 { + return &a + } + + exprs := make([]clause.Expression, 0, len(conds)) + for _, cond := range conds { + exprs = append(exprs, cond.BeCond().(clause.Expression)) + } + a.db = a.db.Clauses(clause.Where{Exprs: exprs}) + return &a +} + +func (a logsLoginBelongsToUser) WithContext(ctx context.Context) *logsLoginBelongsToUser { + a.db = a.db.WithContext(ctx) + return &a +} + +func (a logsLoginBelongsToUser) Session(session *gorm.Session) *logsLoginBelongsToUser { + a.db = a.db.Session(session) + return &a +} + +func (a logsLoginBelongsToUser) Model(m *models.LogsLogin) *logsLoginBelongsToUserTx { + return &logsLoginBelongsToUserTx{a.db.Model(m).Association(a.Name())} +} + +func (a logsLoginBelongsToUser) Unscoped() *logsLoginBelongsToUser { + a.db = a.db.Unscoped() + return &a +} + +type logsLoginBelongsToUserTx struct{ tx *gorm.Association } + +func (a logsLoginBelongsToUserTx) Find() (result *models.User, err error) { + return result, a.tx.Find(&result) +} + +func (a logsLoginBelongsToUserTx) Append(values ...*models.User) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Append(targetValues...) +} + +func (a logsLoginBelongsToUserTx) Replace(values ...*models.User) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Replace(targetValues...) +} + +func (a logsLoginBelongsToUserTx) Delete(values ...*models.User) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Delete(targetValues...) +} + +func (a logsLoginBelongsToUserTx) Clear() error { + return a.tx.Clear() +} + +func (a logsLoginBelongsToUserTx) Count() int64 { + return a.tx.Count() +} + +func (a logsLoginBelongsToUserTx) Unscoped() *logsLoginBelongsToUserTx { + a.tx = a.tx.Unscoped() + return &a +} + type logsLoginDo struct{ gen.DO } func (l logsLoginDo) Debug() *logsLoginDo { diff --git a/web/queries/logs_request.gen.go b/web/queries/logs_request.gen.go index 4368b38..0d2660e 100644 --- a/web/queries/logs_request.gen.go +++ b/web/queries/logs_request.gen.go @@ -28,16 +28,32 @@ func newLogsRequest(db *gorm.DB, opts ...gen.DOOption) logsRequest { tableName := _logsRequest.logsRequestDo.TableName() _logsRequest.ALL = field.NewAsterisk(tableName) _logsRequest.ID = field.NewInt32(tableName, "id") - _logsRequest.IP = field.NewString(tableName, "ip") + _logsRequest.IP = field.NewField(tableName, "ip") _logsRequest.UA = field.NewString(tableName, "ua") _logsRequest.UserID = field.NewInt32(tableName, "user_id") _logsRequest.ClientID = field.NewInt32(tableName, "client_id") _logsRequest.Method = field.NewString(tableName, "method") _logsRequest.Path = field.NewString(tableName, "path") - _logsRequest.Status = field.NewInt32(tableName, "status") + _logsRequest.Status = field.NewInt16(tableName, "status") _logsRequest.Error = field.NewString(tableName, "error") - _logsRequest.Time = field.NewField(tableName, "time") + _logsRequest.Time = field.NewTime(tableName, "time") _logsRequest.Latency = field.NewString(tableName, "latency") + _logsRequest.Client = logsRequestHasOneClient{ + db: db.Session(&gorm.Session{}), + + RelationField: field.NewRelation("Client", "models.Client"), + } + + _logsRequest.User = logsRequestBelongsToUser{ + db: db.Session(&gorm.Session{}), + + RelationField: field.NewRelation("User", "models.User"), + Admin: struct { + field.RelationField + }{ + RelationField: field.NewRelation("User.Admin", "models.Admin"), + }, + } _logsRequest.fillFieldMap() @@ -48,17 +64,20 @@ type logsRequest struct { logsRequestDo ALL field.Asterisk - ID field.Int32 // 访问日志ID - IP field.String // IP地址 - UA field.String // 用户代理 - UserID field.Int32 // 用户ID - ClientID field.Int32 // 客户端ID - Method field.String // 请求方法 - Path field.String // 请求路径 - Status field.Int32 // 响应状态码 - Error field.String // 错误信息 - Time field.Field // 请求时间 - Latency field.String // 请求延迟 + ID field.Int32 + IP field.Field + UA field.String + UserID field.Int32 + ClientID field.Int32 + Method field.String + Path field.String + Status field.Int16 + Error field.String + Time field.Time + Latency field.String + Client logsRequestHasOneClient + + User logsRequestBelongsToUser fieldMap map[string]field.Expr } @@ -76,15 +95,15 @@ func (l logsRequest) As(alias string) *logsRequest { func (l *logsRequest) updateTableName(table string) *logsRequest { l.ALL = field.NewAsterisk(table) l.ID = field.NewInt32(table, "id") - l.IP = field.NewString(table, "ip") + l.IP = field.NewField(table, "ip") l.UA = field.NewString(table, "ua") l.UserID = field.NewInt32(table, "user_id") l.ClientID = field.NewInt32(table, "client_id") l.Method = field.NewString(table, "method") l.Path = field.NewString(table, "path") - l.Status = field.NewInt32(table, "status") + l.Status = field.NewInt16(table, "status") l.Error = field.NewString(table, "error") - l.Time = field.NewField(table, "time") + l.Time = field.NewTime(table, "time") l.Latency = field.NewString(table, "latency") l.fillFieldMap() @@ -102,7 +121,7 @@ func (l *logsRequest) GetFieldByName(fieldName string) (field.OrderExpr, bool) { } func (l *logsRequest) fillFieldMap() { - l.fieldMap = make(map[string]field.Expr, 11) + l.fieldMap = make(map[string]field.Expr, 13) l.fieldMap["id"] = l.ID l.fieldMap["ip"] = l.IP l.fieldMap["ua"] = l.UA @@ -114,18 +133,191 @@ func (l *logsRequest) fillFieldMap() { l.fieldMap["error"] = l.Error l.fieldMap["time"] = l.Time l.fieldMap["latency"] = l.Latency + } func (l logsRequest) clone(db *gorm.DB) logsRequest { l.logsRequestDo.ReplaceConnPool(db.Statement.ConnPool) + l.Client.db = db.Session(&gorm.Session{Initialized: true}) + l.Client.db.Statement.ConnPool = db.Statement.ConnPool + l.User.db = db.Session(&gorm.Session{Initialized: true}) + l.User.db.Statement.ConnPool = db.Statement.ConnPool return l } func (l logsRequest) replaceDB(db *gorm.DB) logsRequest { l.logsRequestDo.ReplaceDB(db) + l.Client.db = db.Session(&gorm.Session{}) + l.User.db = db.Session(&gorm.Session{}) return l } +type logsRequestHasOneClient struct { + db *gorm.DB + + field.RelationField +} + +func (a logsRequestHasOneClient) Where(conds ...field.Expr) *logsRequestHasOneClient { + if len(conds) == 0 { + return &a + } + + exprs := make([]clause.Expression, 0, len(conds)) + for _, cond := range conds { + exprs = append(exprs, cond.BeCond().(clause.Expression)) + } + a.db = a.db.Clauses(clause.Where{Exprs: exprs}) + return &a +} + +func (a logsRequestHasOneClient) WithContext(ctx context.Context) *logsRequestHasOneClient { + a.db = a.db.WithContext(ctx) + return &a +} + +func (a logsRequestHasOneClient) Session(session *gorm.Session) *logsRequestHasOneClient { + a.db = a.db.Session(session) + return &a +} + +func (a logsRequestHasOneClient) Model(m *models.LogsRequest) *logsRequestHasOneClientTx { + return &logsRequestHasOneClientTx{a.db.Model(m).Association(a.Name())} +} + +func (a logsRequestHasOneClient) Unscoped() *logsRequestHasOneClient { + a.db = a.db.Unscoped() + return &a +} + +type logsRequestHasOneClientTx struct{ tx *gorm.Association } + +func (a logsRequestHasOneClientTx) Find() (result *models.Client, err error) { + return result, a.tx.Find(&result) +} + +func (a logsRequestHasOneClientTx) Append(values ...*models.Client) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Append(targetValues...) +} + +func (a logsRequestHasOneClientTx) Replace(values ...*models.Client) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Replace(targetValues...) +} + +func (a logsRequestHasOneClientTx) Delete(values ...*models.Client) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Delete(targetValues...) +} + +func (a logsRequestHasOneClientTx) Clear() error { + return a.tx.Clear() +} + +func (a logsRequestHasOneClientTx) Count() int64 { + return a.tx.Count() +} + +func (a logsRequestHasOneClientTx) Unscoped() *logsRequestHasOneClientTx { + a.tx = a.tx.Unscoped() + return &a +} + +type logsRequestBelongsToUser struct { + db *gorm.DB + + field.RelationField + + Admin struct { + field.RelationField + } +} + +func (a logsRequestBelongsToUser) Where(conds ...field.Expr) *logsRequestBelongsToUser { + if len(conds) == 0 { + return &a + } + + exprs := make([]clause.Expression, 0, len(conds)) + for _, cond := range conds { + exprs = append(exprs, cond.BeCond().(clause.Expression)) + } + a.db = a.db.Clauses(clause.Where{Exprs: exprs}) + return &a +} + +func (a logsRequestBelongsToUser) WithContext(ctx context.Context) *logsRequestBelongsToUser { + a.db = a.db.WithContext(ctx) + return &a +} + +func (a logsRequestBelongsToUser) Session(session *gorm.Session) *logsRequestBelongsToUser { + a.db = a.db.Session(session) + return &a +} + +func (a logsRequestBelongsToUser) Model(m *models.LogsRequest) *logsRequestBelongsToUserTx { + return &logsRequestBelongsToUserTx{a.db.Model(m).Association(a.Name())} +} + +func (a logsRequestBelongsToUser) Unscoped() *logsRequestBelongsToUser { + a.db = a.db.Unscoped() + return &a +} + +type logsRequestBelongsToUserTx struct{ tx *gorm.Association } + +func (a logsRequestBelongsToUserTx) Find() (result *models.User, err error) { + return result, a.tx.Find(&result) +} + +func (a logsRequestBelongsToUserTx) Append(values ...*models.User) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Append(targetValues...) +} + +func (a logsRequestBelongsToUserTx) Replace(values ...*models.User) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Replace(targetValues...) +} + +func (a logsRequestBelongsToUserTx) Delete(values ...*models.User) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Delete(targetValues...) +} + +func (a logsRequestBelongsToUserTx) Clear() error { + return a.tx.Clear() +} + +func (a logsRequestBelongsToUserTx) Count() int64 { + return a.tx.Count() +} + +func (a logsRequestBelongsToUserTx) Unscoped() *logsRequestBelongsToUserTx { + a.tx = a.tx.Unscoped() + return &a +} + type logsRequestDo struct{ gen.DO } func (l logsRequestDo) Debug() *logsRequestDo { diff --git a/web/queries/logs_user_bandwidth.gen.go b/web/queries/logs_user_bandwidth.gen.go index 878a45f..34a092b 100644 --- a/web/queries/logs_user_bandwidth.gen.go +++ b/web/queries/logs_user_bandwidth.gen.go @@ -30,7 +30,7 @@ func newLogsUserBandwidth(db *gorm.DB, opts ...gen.DOOption) logsUserBandwidth { _logsUserBandwidth.ID = field.NewInt32(tableName, "id") _logsUserBandwidth.UserID = field.NewInt32(tableName, "user_id") _logsUserBandwidth.Bandwidth = field.NewInt32(tableName, "bandwidth") - _logsUserBandwidth.Time = field.NewField(tableName, "time") + _logsUserBandwidth.Time = field.NewTime(tableName, "time") _logsUserBandwidth.fillFieldMap() @@ -41,10 +41,10 @@ type logsUserBandwidth struct { logsUserBandwidthDo ALL field.Asterisk - ID field.Int32 // 日志ID - UserID field.Int32 // 用户ID - Bandwidth field.Int32 // 带宽使用量(KB) - Time field.Field // 记录时间 + ID field.Int32 + UserID field.Int32 + Bandwidth field.Int32 + Time field.Time fieldMap map[string]field.Expr } @@ -64,7 +64,7 @@ func (l *logsUserBandwidth) updateTableName(table string) *logsUserBandwidth { l.ID = field.NewInt32(table, "id") l.UserID = field.NewInt32(table, "user_id") l.Bandwidth = field.NewInt32(table, "bandwidth") - l.Time = field.NewField(table, "time") + l.Time = field.NewTime(table, "time") l.fillFieldMap() diff --git a/web/queries/logs_user_usage.gen.go b/web/queries/logs_user_usage.gen.go index ecf762f..7672e1c 100644 --- a/web/queries/logs_user_usage.gen.go +++ b/web/queries/logs_user_usage.gen.go @@ -33,9 +33,9 @@ func newLogsUserUsage(db *gorm.DB, opts ...gen.DOOption) logsUserUsage { _logsUserUsage.Count_ = field.NewInt32(tableName, "count") _logsUserUsage.Prov = field.NewString(tableName, "prov") _logsUserUsage.City = field.NewString(tableName, "city") - _logsUserUsage.Isp = field.NewString(tableName, "isp") - _logsUserUsage.IP = field.NewString(tableName, "ip") - _logsUserUsage.Time = field.NewField(tableName, "time") + _logsUserUsage.ISP = field.NewString(tableName, "isp") + _logsUserUsage.IP = field.NewField(tableName, "ip") + _logsUserUsage.Time = field.NewTime(tableName, "time") _logsUserUsage.fillFieldMap() @@ -46,15 +46,15 @@ type logsUserUsage struct { logsUserUsageDo ALL field.Asterisk - ID field.Int32 // 日志ID - UserID field.Int32 // 用户ID - ResourceID field.Int32 // 套餐ID - Count_ field.Int32 // 数量 - Prov field.String // 省份 - City field.String // 城市 - Isp field.String // 运营商 - IP field.String // IP地址 - Time field.Field // 提取时间 + ID field.Int32 + UserID field.Int32 + ResourceID field.Int32 + Count_ field.Int32 + Prov field.String + City field.String + ISP field.String + IP field.Field + Time field.Time fieldMap map[string]field.Expr } @@ -77,9 +77,9 @@ func (l *logsUserUsage) updateTableName(table string) *logsUserUsage { l.Count_ = field.NewInt32(table, "count") l.Prov = field.NewString(table, "prov") l.City = field.NewString(table, "city") - l.Isp = field.NewString(table, "isp") - l.IP = field.NewString(table, "ip") - l.Time = field.NewField(table, "time") + l.ISP = field.NewString(table, "isp") + l.IP = field.NewField(table, "ip") + l.Time = field.NewTime(table, "time") l.fillFieldMap() @@ -103,7 +103,7 @@ func (l *logsUserUsage) fillFieldMap() { l.fieldMap["count"] = l.Count_ l.fieldMap["prov"] = l.Prov l.fieldMap["city"] = l.City - l.fieldMap["isp"] = l.Isp + l.fieldMap["isp"] = l.ISP l.fieldMap["ip"] = l.IP l.fieldMap["time"] = l.Time } diff --git a/web/queries/permission.gen.go b/web/queries/permission.gen.go index 4b0f5d5..5ef9102 100644 --- a/web/queries/permission.gen.go +++ b/web/queries/permission.gen.go @@ -28,12 +28,33 @@ func newPermission(db *gorm.DB, opts ...gen.DOOption) permission { tableName := _permission.permissionDo.TableName() _permission.ALL = field.NewAsterisk(tableName) _permission.ID = field.NewInt32(tableName, "id") + _permission.CreatedAt = field.NewTime(tableName, "created_at") + _permission.UpdatedAt = field.NewTime(tableName, "updated_at") + _permission.DeletedAt = field.NewField(tableName, "deleted_at") _permission.ParentID = field.NewInt32(tableName, "parent_id") _permission.Name = field.NewString(tableName, "name") _permission.Description = field.NewString(tableName, "description") - _permission.CreatedAt = field.NewField(tableName, "created_at") - _permission.UpdatedAt = field.NewField(tableName, "updated_at") - _permission.DeletedAt = field.NewField(tableName, "deleted_at") + _permission.Children = permissionHasManyChildren{ + db: db.Session(&gorm.Session{}), + + RelationField: field.NewRelation("Children", "models.Permission"), + Parent: struct { + field.RelationField + }{ + RelationField: field.NewRelation("Children.Parent", "models.Permission"), + }, + Children: struct { + field.RelationField + }{ + RelationField: field.NewRelation("Children.Children", "models.Permission"), + }, + } + + _permission.Parent = permissionBelongsToParent{ + db: db.Session(&gorm.Session{}), + + RelationField: field.NewRelation("Parent", "models.Permission"), + } _permission.fillFieldMap() @@ -44,13 +65,16 @@ type permission struct { permissionDo ALL field.Asterisk - ID field.Int32 // 权限ID - ParentID field.Int32 // 父权限ID - Name field.String // 权限名称 - Description field.String // 权限描述 - CreatedAt field.Field // 创建时间 - UpdatedAt field.Field // 更新时间 - DeletedAt field.Field // 删除时间 + ID field.Int32 + CreatedAt field.Time + UpdatedAt field.Time + DeletedAt field.Field + ParentID field.Int32 + Name field.String + Description field.String + Children permissionHasManyChildren + + Parent permissionBelongsToParent fieldMap map[string]field.Expr } @@ -68,12 +92,12 @@ func (p permission) As(alias string) *permission { func (p *permission) updateTableName(table string) *permission { p.ALL = field.NewAsterisk(table) p.ID = field.NewInt32(table, "id") + p.CreatedAt = field.NewTime(table, "created_at") + p.UpdatedAt = field.NewTime(table, "updated_at") + p.DeletedAt = field.NewField(table, "deleted_at") p.ParentID = field.NewInt32(table, "parent_id") p.Name = field.NewString(table, "name") p.Description = field.NewString(table, "description") - p.CreatedAt = field.NewField(table, "created_at") - p.UpdatedAt = field.NewField(table, "updated_at") - p.DeletedAt = field.NewField(table, "deleted_at") p.fillFieldMap() @@ -90,26 +114,202 @@ func (p *permission) GetFieldByName(fieldName string) (field.OrderExpr, bool) { } func (p *permission) fillFieldMap() { - p.fieldMap = make(map[string]field.Expr, 7) + p.fieldMap = make(map[string]field.Expr, 9) p.fieldMap["id"] = p.ID - p.fieldMap["parent_id"] = p.ParentID - p.fieldMap["name"] = p.Name - p.fieldMap["description"] = p.Description p.fieldMap["created_at"] = p.CreatedAt p.fieldMap["updated_at"] = p.UpdatedAt p.fieldMap["deleted_at"] = p.DeletedAt + p.fieldMap["parent_id"] = p.ParentID + p.fieldMap["name"] = p.Name + p.fieldMap["description"] = p.Description + } func (p permission) clone(db *gorm.DB) permission { p.permissionDo.ReplaceConnPool(db.Statement.ConnPool) + p.Children.db = db.Session(&gorm.Session{Initialized: true}) + p.Children.db.Statement.ConnPool = db.Statement.ConnPool + p.Parent.db = db.Session(&gorm.Session{Initialized: true}) + p.Parent.db.Statement.ConnPool = db.Statement.ConnPool return p } func (p permission) replaceDB(db *gorm.DB) permission { p.permissionDo.ReplaceDB(db) + p.Children.db = db.Session(&gorm.Session{}) + p.Parent.db = db.Session(&gorm.Session{}) return p } +type permissionHasManyChildren struct { + db *gorm.DB + + field.RelationField + + Parent struct { + field.RelationField + } + Children struct { + field.RelationField + } +} + +func (a permissionHasManyChildren) Where(conds ...field.Expr) *permissionHasManyChildren { + if len(conds) == 0 { + return &a + } + + exprs := make([]clause.Expression, 0, len(conds)) + for _, cond := range conds { + exprs = append(exprs, cond.BeCond().(clause.Expression)) + } + a.db = a.db.Clauses(clause.Where{Exprs: exprs}) + return &a +} + +func (a permissionHasManyChildren) WithContext(ctx context.Context) *permissionHasManyChildren { + a.db = a.db.WithContext(ctx) + return &a +} + +func (a permissionHasManyChildren) Session(session *gorm.Session) *permissionHasManyChildren { + a.db = a.db.Session(session) + return &a +} + +func (a permissionHasManyChildren) Model(m *models.Permission) *permissionHasManyChildrenTx { + return &permissionHasManyChildrenTx{a.db.Model(m).Association(a.Name())} +} + +func (a permissionHasManyChildren) Unscoped() *permissionHasManyChildren { + a.db = a.db.Unscoped() + return &a +} + +type permissionHasManyChildrenTx struct{ tx *gorm.Association } + +func (a permissionHasManyChildrenTx) Find() (result []*models.Permission, err error) { + return result, a.tx.Find(&result) +} + +func (a permissionHasManyChildrenTx) Append(values ...*models.Permission) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Append(targetValues...) +} + +func (a permissionHasManyChildrenTx) Replace(values ...*models.Permission) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Replace(targetValues...) +} + +func (a permissionHasManyChildrenTx) Delete(values ...*models.Permission) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Delete(targetValues...) +} + +func (a permissionHasManyChildrenTx) Clear() error { + return a.tx.Clear() +} + +func (a permissionHasManyChildrenTx) Count() int64 { + return a.tx.Count() +} + +func (a permissionHasManyChildrenTx) Unscoped() *permissionHasManyChildrenTx { + a.tx = a.tx.Unscoped() + return &a +} + +type permissionBelongsToParent struct { + db *gorm.DB + + field.RelationField +} + +func (a permissionBelongsToParent) Where(conds ...field.Expr) *permissionBelongsToParent { + if len(conds) == 0 { + return &a + } + + exprs := make([]clause.Expression, 0, len(conds)) + for _, cond := range conds { + exprs = append(exprs, cond.BeCond().(clause.Expression)) + } + a.db = a.db.Clauses(clause.Where{Exprs: exprs}) + return &a +} + +func (a permissionBelongsToParent) WithContext(ctx context.Context) *permissionBelongsToParent { + a.db = a.db.WithContext(ctx) + return &a +} + +func (a permissionBelongsToParent) Session(session *gorm.Session) *permissionBelongsToParent { + a.db = a.db.Session(session) + return &a +} + +func (a permissionBelongsToParent) Model(m *models.Permission) *permissionBelongsToParentTx { + return &permissionBelongsToParentTx{a.db.Model(m).Association(a.Name())} +} + +func (a permissionBelongsToParent) Unscoped() *permissionBelongsToParent { + a.db = a.db.Unscoped() + return &a +} + +type permissionBelongsToParentTx struct{ tx *gorm.Association } + +func (a permissionBelongsToParentTx) Find() (result *models.Permission, err error) { + return result, a.tx.Find(&result) +} + +func (a permissionBelongsToParentTx) Append(values ...*models.Permission) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Append(targetValues...) +} + +func (a permissionBelongsToParentTx) Replace(values ...*models.Permission) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Replace(targetValues...) +} + +func (a permissionBelongsToParentTx) Delete(values ...*models.Permission) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Delete(targetValues...) +} + +func (a permissionBelongsToParentTx) Clear() error { + return a.tx.Clear() +} + +func (a permissionBelongsToParentTx) Count() int64 { + return a.tx.Count() +} + +func (a permissionBelongsToParentTx) Unscoped() *permissionBelongsToParentTx { + a.tx = a.tx.Unscoped() + return &a +} + type permissionDo struct{ gen.DO } func (p permissionDo) Debug() *permissionDo { diff --git a/web/queries/product.gen.go b/web/queries/product.gen.go index 101062a..bf6b1a3 100644 --- a/web/queries/product.gen.go +++ b/web/queries/product.gen.go @@ -28,14 +28,14 @@ func newProduct(db *gorm.DB, opts ...gen.DOOption) product { tableName := _product.productDo.TableName() _product.ALL = field.NewAsterisk(tableName) _product.ID = field.NewInt32(tableName, "id") + _product.CreatedAt = field.NewTime(tableName, "created_at") + _product.UpdatedAt = field.NewTime(tableName, "updated_at") + _product.DeletedAt = field.NewField(tableName, "deleted_at") _product.Code = field.NewString(tableName, "code") _product.Name = field.NewString(tableName, "name") _product.Description = field.NewString(tableName, "description") _product.Sort = field.NewInt32(tableName, "sort") - _product.Status = field.NewInt32(tableName, "status") - _product.CreatedAt = field.NewField(tableName, "created_at") - _product.UpdatedAt = field.NewField(tableName, "updated_at") - _product.DeletedAt = field.NewField(tableName, "deleted_at") + _product.Status = field.NewInt(tableName, "status") _product.fillFieldMap() @@ -46,15 +46,15 @@ type product struct { productDo ALL field.Asterisk - ID field.Int32 // 产品ID - Code field.String // 产品代码 - Name field.String // 产品名称 - Description field.String // 产品描述 - Sort field.Int32 // 排序 - Status field.Int32 // 产品状态:0-禁用,1-正常 - CreatedAt field.Field // 创建时间 - UpdatedAt field.Field // 更新时间 - DeletedAt field.Field // 删除时间 + ID field.Int32 + CreatedAt field.Time + UpdatedAt field.Time + DeletedAt field.Field + Code field.String + Name field.String + Description field.String + Sort field.Int32 + Status field.Int fieldMap map[string]field.Expr } @@ -72,14 +72,14 @@ func (p product) As(alias string) *product { func (p *product) updateTableName(table string) *product { p.ALL = field.NewAsterisk(table) p.ID = field.NewInt32(table, "id") + p.CreatedAt = field.NewTime(table, "created_at") + p.UpdatedAt = field.NewTime(table, "updated_at") + p.DeletedAt = field.NewField(table, "deleted_at") p.Code = field.NewString(table, "code") p.Name = field.NewString(table, "name") p.Description = field.NewString(table, "description") p.Sort = field.NewInt32(table, "sort") - p.Status = field.NewInt32(table, "status") - p.CreatedAt = field.NewField(table, "created_at") - p.UpdatedAt = field.NewField(table, "updated_at") - p.DeletedAt = field.NewField(table, "deleted_at") + p.Status = field.NewInt(table, "status") p.fillFieldMap() @@ -98,14 +98,14 @@ func (p *product) GetFieldByName(fieldName string) (field.OrderExpr, bool) { func (p *product) fillFieldMap() { p.fieldMap = make(map[string]field.Expr, 9) p.fieldMap["id"] = p.ID + p.fieldMap["created_at"] = p.CreatedAt + p.fieldMap["updated_at"] = p.UpdatedAt + p.fieldMap["deleted_at"] = p.DeletedAt p.fieldMap["code"] = p.Code p.fieldMap["name"] = p.Name p.fieldMap["description"] = p.Description p.fieldMap["sort"] = p.Sort p.fieldMap["status"] = p.Status - p.fieldMap["created_at"] = p.CreatedAt - p.fieldMap["updated_at"] = p.UpdatedAt - p.fieldMap["deleted_at"] = p.DeletedAt } func (p product) clone(db *gorm.DB) product { diff --git a/web/queries/proxy.gen.go b/web/queries/proxy.gen.go index 9cd4e2c..04ba4cc 100644 --- a/web/queries/proxy.gen.go +++ b/web/queries/proxy.gen.go @@ -28,19 +28,79 @@ func newProxy(db *gorm.DB, opts ...gen.DOOption) proxy { tableName := _proxy.proxyDo.TableName() _proxy.ALL = field.NewAsterisk(tableName) _proxy.ID = field.NewInt32(tableName, "id") - _proxy.Version = field.NewInt32(tableName, "version") - _proxy.Name = field.NewString(tableName, "name") - _proxy.Host = field.NewString(tableName, "host") - _proxy.Secret = field.NewString(tableName, "secret") - _proxy.Type = field.NewInt32(tableName, "type") - _proxy.Status = field.NewInt32(tableName, "status") - _proxy.CreatedAt = field.NewField(tableName, "created_at") - _proxy.UpdatedAt = field.NewField(tableName, "updated_at") + _proxy.CreatedAt = field.NewTime(tableName, "created_at") + _proxy.UpdatedAt = field.NewTime(tableName, "updated_at") _proxy.DeletedAt = field.NewField(tableName, "deleted_at") - _proxy.Edges = proxyHasManyEdges{ + _proxy.Version = field.NewInt32(tableName, "version") + _proxy.Mac = field.NewString(tableName, "mac") + _proxy.IP = field.NewField(tableName, "ip") + _proxy.Secret = field.NewString(tableName, "secret") + _proxy.Type = field.NewInt(tableName, "type") + _proxy.Status = field.NewInt(tableName, "status") + _proxy.Channels = proxyHasManyChannels{ db: db.Session(&gorm.Session{}), - RelationField: field.NewRelation("Edges", "models.Edge"), + RelationField: field.NewRelation("Channels", "models.Channel"), + User: struct { + field.RelationField + Admin struct { + field.RelationField + } + }{ + RelationField: field.NewRelation("Channels.User", "models.User"), + Admin: struct { + field.RelationField + }{ + RelationField: field.NewRelation("Channels.User.Admin", "models.Admin"), + }, + }, + Resource: struct { + field.RelationField + User struct { + field.RelationField + } + Short struct { + field.RelationField + } + Long struct { + field.RelationField + } + }{ + RelationField: field.NewRelation("Channels.Resource", "models.Resource"), + User: struct { + field.RelationField + }{ + RelationField: field.NewRelation("Channels.Resource.User", "models.User"), + }, + Short: struct { + field.RelationField + }{ + RelationField: field.NewRelation("Channels.Resource.Short", "models.ResourceShort"), + }, + Long: struct { + field.RelationField + }{ + RelationField: field.NewRelation("Channels.Resource.Long", "models.ResourceLong"), + }, + }, + Proxy: struct { + field.RelationField + Channels struct { + field.RelationField + } + }{ + RelationField: field.NewRelation("Channels.Proxy", "models.Proxy"), + Channels: struct { + field.RelationField + }{ + RelationField: field.NewRelation("Channels.Proxy.Channels", "models.Channel"), + }, + }, + Edge: struct { + field.RelationField + }{ + RelationField: field.NewRelation("Channels.Edge", "models.Edge"), + }, } _proxy.fillFieldMap() @@ -52,17 +112,17 @@ type proxy struct { proxyDo ALL field.Asterisk - ID field.Int32 // 代理服务ID - Version field.Int32 // 代理服务版本 - Name field.String // 代理服务名称 - Host field.String // 代理服务地址 - Secret field.String // 代理服务密钥 - Type field.Int32 // 代理服务类型:1-三方,2-自有 - Status field.Int32 // 代理服务状态:0-离线,1-在线 - CreatedAt field.Field // 创建时间 - UpdatedAt field.Field // 更新时间 - DeletedAt field.Field // 删除时间 - Edges proxyHasManyEdges + ID field.Int32 + CreatedAt field.Time + UpdatedAt field.Time + DeletedAt field.Field + Version field.Int32 + Mac field.String + IP field.Field + Secret field.String + Type field.Int + Status field.Int + Channels proxyHasManyChannels fieldMap map[string]field.Expr } @@ -80,15 +140,15 @@ func (p proxy) As(alias string) *proxy { func (p *proxy) updateTableName(table string) *proxy { p.ALL = field.NewAsterisk(table) p.ID = field.NewInt32(table, "id") - p.Version = field.NewInt32(table, "version") - p.Name = field.NewString(table, "name") - p.Host = field.NewString(table, "host") - p.Secret = field.NewString(table, "secret") - p.Type = field.NewInt32(table, "type") - p.Status = field.NewInt32(table, "status") - p.CreatedAt = field.NewField(table, "created_at") - p.UpdatedAt = field.NewField(table, "updated_at") + p.CreatedAt = field.NewTime(table, "created_at") + p.UpdatedAt = field.NewTime(table, "updated_at") p.DeletedAt = field.NewField(table, "deleted_at") + p.Version = field.NewInt32(table, "version") + p.Mac = field.NewString(table, "mac") + p.IP = field.NewField(table, "ip") + p.Secret = field.NewString(table, "secret") + p.Type = field.NewInt(table, "type") + p.Status = field.NewInt(table, "status") p.fillFieldMap() @@ -107,38 +167,66 @@ func (p *proxy) GetFieldByName(fieldName string) (field.OrderExpr, bool) { func (p *proxy) fillFieldMap() { p.fieldMap = make(map[string]field.Expr, 11) p.fieldMap["id"] = p.ID - p.fieldMap["version"] = p.Version - p.fieldMap["name"] = p.Name - p.fieldMap["host"] = p.Host - p.fieldMap["secret"] = p.Secret - p.fieldMap["type"] = p.Type - p.fieldMap["status"] = p.Status p.fieldMap["created_at"] = p.CreatedAt p.fieldMap["updated_at"] = p.UpdatedAt p.fieldMap["deleted_at"] = p.DeletedAt + p.fieldMap["version"] = p.Version + p.fieldMap["mac"] = p.Mac + p.fieldMap["ip"] = p.IP + p.fieldMap["secret"] = p.Secret + p.fieldMap["type"] = p.Type + p.fieldMap["status"] = p.Status } func (p proxy) clone(db *gorm.DB) proxy { p.proxyDo.ReplaceConnPool(db.Statement.ConnPool) - p.Edges.db = db.Session(&gorm.Session{Initialized: true}) - p.Edges.db.Statement.ConnPool = db.Statement.ConnPool + p.Channels.db = db.Session(&gorm.Session{Initialized: true}) + p.Channels.db.Statement.ConnPool = db.Statement.ConnPool return p } func (p proxy) replaceDB(db *gorm.DB) proxy { p.proxyDo.ReplaceDB(db) - p.Edges.db = db.Session(&gorm.Session{}) + p.Channels.db = db.Session(&gorm.Session{}) return p } -type proxyHasManyEdges struct { +type proxyHasManyChannels struct { db *gorm.DB field.RelationField + + User struct { + field.RelationField + Admin struct { + field.RelationField + } + } + Resource struct { + field.RelationField + User struct { + field.RelationField + } + Short struct { + field.RelationField + } + Long struct { + field.RelationField + } + } + Proxy struct { + field.RelationField + Channels struct { + field.RelationField + } + } + Edge struct { + field.RelationField + } } -func (a proxyHasManyEdges) Where(conds ...field.Expr) *proxyHasManyEdges { +func (a proxyHasManyChannels) Where(conds ...field.Expr) *proxyHasManyChannels { if len(conds) == 0 { return &a } @@ -151,32 +239,32 @@ func (a proxyHasManyEdges) Where(conds ...field.Expr) *proxyHasManyEdges { return &a } -func (a proxyHasManyEdges) WithContext(ctx context.Context) *proxyHasManyEdges { +func (a proxyHasManyChannels) WithContext(ctx context.Context) *proxyHasManyChannels { a.db = a.db.WithContext(ctx) return &a } -func (a proxyHasManyEdges) Session(session *gorm.Session) *proxyHasManyEdges { +func (a proxyHasManyChannels) Session(session *gorm.Session) *proxyHasManyChannels { a.db = a.db.Session(session) return &a } -func (a proxyHasManyEdges) Model(m *models.Proxy) *proxyHasManyEdgesTx { - return &proxyHasManyEdgesTx{a.db.Model(m).Association(a.Name())} +func (a proxyHasManyChannels) Model(m *models.Proxy) *proxyHasManyChannelsTx { + return &proxyHasManyChannelsTx{a.db.Model(m).Association(a.Name())} } -func (a proxyHasManyEdges) Unscoped() *proxyHasManyEdges { +func (a proxyHasManyChannels) Unscoped() *proxyHasManyChannels { a.db = a.db.Unscoped() return &a } -type proxyHasManyEdgesTx struct{ tx *gorm.Association } +type proxyHasManyChannelsTx struct{ tx *gorm.Association } -func (a proxyHasManyEdgesTx) Find() (result []*models.Edge, err error) { +func (a proxyHasManyChannelsTx) Find() (result []*models.Channel, err error) { return result, a.tx.Find(&result) } -func (a proxyHasManyEdgesTx) Append(values ...*models.Edge) (err error) { +func (a proxyHasManyChannelsTx) Append(values ...*models.Channel) (err error) { targetValues := make([]interface{}, len(values)) for i, v := range values { targetValues[i] = v @@ -184,7 +272,7 @@ func (a proxyHasManyEdgesTx) Append(values ...*models.Edge) (err error) { return a.tx.Append(targetValues...) } -func (a proxyHasManyEdgesTx) Replace(values ...*models.Edge) (err error) { +func (a proxyHasManyChannelsTx) Replace(values ...*models.Channel) (err error) { targetValues := make([]interface{}, len(values)) for i, v := range values { targetValues[i] = v @@ -192,7 +280,7 @@ func (a proxyHasManyEdgesTx) Replace(values ...*models.Edge) (err error) { return a.tx.Replace(targetValues...) } -func (a proxyHasManyEdgesTx) Delete(values ...*models.Edge) (err error) { +func (a proxyHasManyChannelsTx) Delete(values ...*models.Channel) (err error) { targetValues := make([]interface{}, len(values)) for i, v := range values { targetValues[i] = v @@ -200,15 +288,15 @@ func (a proxyHasManyEdgesTx) Delete(values ...*models.Edge) (err error) { return a.tx.Delete(targetValues...) } -func (a proxyHasManyEdgesTx) Clear() error { +func (a proxyHasManyChannelsTx) Clear() error { return a.tx.Clear() } -func (a proxyHasManyEdgesTx) Count() int64 { +func (a proxyHasManyChannelsTx) Count() int64 { return a.tx.Count() } -func (a proxyHasManyEdgesTx) Unscoped() *proxyHasManyEdgesTx { +func (a proxyHasManyChannelsTx) Unscoped() *proxyHasManyChannelsTx { a.tx = a.tx.Unscoped() return &a } diff --git a/web/queries/refund.gen.go b/web/queries/refund.gen.go index d420fb4..7ece119 100644 --- a/web/queries/refund.gen.go +++ b/web/queries/refund.gen.go @@ -28,14 +28,14 @@ func newRefund(db *gorm.DB, opts ...gen.DOOption) refund { tableName := _refund.refundDo.TableName() _refund.ALL = field.NewAsterisk(tableName) _refund.ID = field.NewInt32(tableName, "id") + _refund.CreatedAt = field.NewTime(tableName, "created_at") + _refund.UpdatedAt = field.NewTime(tableName, "updated_at") + _refund.DeletedAt = field.NewField(tableName, "deleted_at") _refund.TradeID = field.NewInt32(tableName, "trade_id") _refund.ProductID = field.NewInt32(tableName, "product_id") _refund.Amount = field.NewField(tableName, "amount") _refund.Reason = field.NewString(tableName, "reason") - _refund.Status = field.NewInt32(tableName, "status") - _refund.CreatedAt = field.NewField(tableName, "created_at") - _refund.UpdatedAt = field.NewField(tableName, "updated_at") - _refund.DeletedAt = field.NewField(tableName, "deleted_at") + _refund.Status = field.NewInt(tableName, "status") _refund.fillFieldMap() @@ -46,15 +46,15 @@ type refund struct { refundDo ALL field.Asterisk - ID field.Int32 // 退款ID - TradeID field.Int32 // 订单ID - ProductID field.Int32 // 产品ID - Amount field.Field // 退款金额 - Reason field.String // 退款原因 - Status field.Int32 // 退款状态:0-待处理,1-已退款,2-已拒绝 - CreatedAt field.Field // 创建时间 - UpdatedAt field.Field // 更新时间 - DeletedAt field.Field // 删除时间 + ID field.Int32 + CreatedAt field.Time + UpdatedAt field.Time + DeletedAt field.Field + TradeID field.Int32 + ProductID field.Int32 + Amount field.Field + Reason field.String + Status field.Int fieldMap map[string]field.Expr } @@ -72,14 +72,14 @@ func (r refund) As(alias string) *refund { func (r *refund) updateTableName(table string) *refund { r.ALL = field.NewAsterisk(table) r.ID = field.NewInt32(table, "id") + r.CreatedAt = field.NewTime(table, "created_at") + r.UpdatedAt = field.NewTime(table, "updated_at") + r.DeletedAt = field.NewField(table, "deleted_at") r.TradeID = field.NewInt32(table, "trade_id") r.ProductID = field.NewInt32(table, "product_id") r.Amount = field.NewField(table, "amount") r.Reason = field.NewString(table, "reason") - r.Status = field.NewInt32(table, "status") - r.CreatedAt = field.NewField(table, "created_at") - r.UpdatedAt = field.NewField(table, "updated_at") - r.DeletedAt = field.NewField(table, "deleted_at") + r.Status = field.NewInt(table, "status") r.fillFieldMap() @@ -98,14 +98,14 @@ func (r *refund) GetFieldByName(fieldName string) (field.OrderExpr, bool) { func (r *refund) fillFieldMap() { r.fieldMap = make(map[string]field.Expr, 9) r.fieldMap["id"] = r.ID + r.fieldMap["created_at"] = r.CreatedAt + r.fieldMap["updated_at"] = r.UpdatedAt + r.fieldMap["deleted_at"] = r.DeletedAt r.fieldMap["trade_id"] = r.TradeID r.fieldMap["product_id"] = r.ProductID r.fieldMap["amount"] = r.Amount r.fieldMap["reason"] = r.Reason r.fieldMap["status"] = r.Status - r.fieldMap["created_at"] = r.CreatedAt - r.fieldMap["updated_at"] = r.UpdatedAt - r.fieldMap["deleted_at"] = r.DeletedAt } func (r refund) clone(db *gorm.DB) refund { diff --git a/web/queries/resource.gen.go b/web/queries/resource.gen.go index e37f3a8..7885336 100644 --- a/web/queries/resource.gen.go +++ b/web/queries/resource.gen.go @@ -28,13 +28,13 @@ func newResource(db *gorm.DB, opts ...gen.DOOption) resource { tableName := _resource.resourceDo.TableName() _resource.ALL = field.NewAsterisk(tableName) _resource.ID = field.NewInt32(tableName, "id") + _resource.CreatedAt = field.NewTime(tableName, "created_at") + _resource.UpdatedAt = field.NewTime(tableName, "updated_at") + _resource.DeletedAt = field.NewField(tableName, "deleted_at") _resource.UserID = field.NewInt32(tableName, "user_id") _resource.ResourceNo = field.NewString(tableName, "resource_no") _resource.Active = field.NewBool(tableName, "active") - _resource.Type = field.NewInt32(tableName, "type") - _resource.CreatedAt = field.NewField(tableName, "created_at") - _resource.UpdatedAt = field.NewField(tableName, "updated_at") - _resource.DeletedAt = field.NewField(tableName, "deleted_at") + _resource.Type = field.NewInt(tableName, "type") _resource.Short = resourceHasOneShort{ db: db.Session(&gorm.Session{}), @@ -47,6 +47,17 @@ func newResource(db *gorm.DB, opts ...gen.DOOption) resource { RelationField: field.NewRelation("Long", "models.ResourceLong"), } + _resource.User = resourceBelongsToUser{ + db: db.Session(&gorm.Session{}), + + RelationField: field.NewRelation("User", "models.User"), + Admin: struct { + field.RelationField + }{ + RelationField: field.NewRelation("User.Admin", "models.Admin"), + }, + } + _resource.fillFieldMap() return _resource @@ -56,18 +67,20 @@ type resource struct { resourceDo ALL field.Asterisk - ID field.Int32 // 套餐ID - UserID field.Int32 // 用户ID - ResourceNo field.String // 套餐编号 - Active field.Bool // 套餐状态 - Type field.Int32 // 套餐类型:1-短效动态,2-长效动态 - CreatedAt field.Field // 创建时间 - UpdatedAt field.Field // 更新时间 - DeletedAt field.Field // 删除时间 + ID field.Int32 + CreatedAt field.Time + UpdatedAt field.Time + DeletedAt field.Field + UserID field.Int32 + ResourceNo field.String + Active field.Bool + Type field.Int Short resourceHasOneShort Long resourceHasOneLong + User resourceBelongsToUser + fieldMap map[string]field.Expr } @@ -84,13 +97,13 @@ func (r resource) As(alias string) *resource { func (r *resource) updateTableName(table string) *resource { r.ALL = field.NewAsterisk(table) r.ID = field.NewInt32(table, "id") + r.CreatedAt = field.NewTime(table, "created_at") + r.UpdatedAt = field.NewTime(table, "updated_at") + r.DeletedAt = field.NewField(table, "deleted_at") r.UserID = field.NewInt32(table, "user_id") r.ResourceNo = field.NewString(table, "resource_no") r.Active = field.NewBool(table, "active") - r.Type = field.NewInt32(table, "type") - r.CreatedAt = field.NewField(table, "created_at") - r.UpdatedAt = field.NewField(table, "updated_at") - r.DeletedAt = field.NewField(table, "deleted_at") + r.Type = field.NewInt(table, "type") r.fillFieldMap() @@ -107,15 +120,15 @@ func (r *resource) GetFieldByName(fieldName string) (field.OrderExpr, bool) { } func (r *resource) fillFieldMap() { - r.fieldMap = make(map[string]field.Expr, 10) + r.fieldMap = make(map[string]field.Expr, 11) r.fieldMap["id"] = r.ID + r.fieldMap["created_at"] = r.CreatedAt + r.fieldMap["updated_at"] = r.UpdatedAt + r.fieldMap["deleted_at"] = r.DeletedAt r.fieldMap["user_id"] = r.UserID r.fieldMap["resource_no"] = r.ResourceNo r.fieldMap["active"] = r.Active r.fieldMap["type"] = r.Type - r.fieldMap["created_at"] = r.CreatedAt - r.fieldMap["updated_at"] = r.UpdatedAt - r.fieldMap["deleted_at"] = r.DeletedAt } @@ -125,6 +138,8 @@ func (r resource) clone(db *gorm.DB) resource { r.Short.db.Statement.ConnPool = db.Statement.ConnPool r.Long.db = db.Session(&gorm.Session{Initialized: true}) r.Long.db.Statement.ConnPool = db.Statement.ConnPool + r.User.db = db.Session(&gorm.Session{Initialized: true}) + r.User.db.Statement.ConnPool = db.Statement.ConnPool return r } @@ -132,6 +147,7 @@ func (r resource) replaceDB(db *gorm.DB) resource { r.resourceDo.ReplaceDB(db) r.Short.db = db.Session(&gorm.Session{}) r.Long.db = db.Session(&gorm.Session{}) + r.User.db = db.Session(&gorm.Session{}) return r } @@ -297,6 +313,91 @@ func (a resourceHasOneLongTx) Unscoped() *resourceHasOneLongTx { return &a } +type resourceBelongsToUser struct { + db *gorm.DB + + field.RelationField + + Admin struct { + field.RelationField + } +} + +func (a resourceBelongsToUser) Where(conds ...field.Expr) *resourceBelongsToUser { + if len(conds) == 0 { + return &a + } + + exprs := make([]clause.Expression, 0, len(conds)) + for _, cond := range conds { + exprs = append(exprs, cond.BeCond().(clause.Expression)) + } + a.db = a.db.Clauses(clause.Where{Exprs: exprs}) + return &a +} + +func (a resourceBelongsToUser) WithContext(ctx context.Context) *resourceBelongsToUser { + a.db = a.db.WithContext(ctx) + return &a +} + +func (a resourceBelongsToUser) Session(session *gorm.Session) *resourceBelongsToUser { + a.db = a.db.Session(session) + return &a +} + +func (a resourceBelongsToUser) Model(m *models.Resource) *resourceBelongsToUserTx { + return &resourceBelongsToUserTx{a.db.Model(m).Association(a.Name())} +} + +func (a resourceBelongsToUser) Unscoped() *resourceBelongsToUser { + a.db = a.db.Unscoped() + return &a +} + +type resourceBelongsToUserTx struct{ tx *gorm.Association } + +func (a resourceBelongsToUserTx) Find() (result *models.User, err error) { + return result, a.tx.Find(&result) +} + +func (a resourceBelongsToUserTx) Append(values ...*models.User) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Append(targetValues...) +} + +func (a resourceBelongsToUserTx) Replace(values ...*models.User) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Replace(targetValues...) +} + +func (a resourceBelongsToUserTx) Delete(values ...*models.User) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Delete(targetValues...) +} + +func (a resourceBelongsToUserTx) Clear() error { + return a.tx.Clear() +} + +func (a resourceBelongsToUserTx) Count() int64 { + return a.tx.Count() +} + +func (a resourceBelongsToUserTx) Unscoped() *resourceBelongsToUserTx { + a.tx = a.tx.Unscoped() + return &a +} + type resourceDo struct{ gen.DO } func (r resourceDo) Debug() *resourceDo { diff --git a/web/queries/resource_long.gen.go b/web/queries/resource_long.gen.go index 5b847d8..b868327 100644 --- a/web/queries/resource_long.gen.go +++ b/web/queries/resource_long.gen.go @@ -29,14 +29,14 @@ func newResourceLong(db *gorm.DB, opts ...gen.DOOption) resourceLong { _resourceLong.ALL = field.NewAsterisk(tableName) _resourceLong.ID = field.NewInt32(tableName, "id") _resourceLong.ResourceID = field.NewInt32(tableName, "resource_id") - _resourceLong.Type = field.NewInt32(tableName, "type") + _resourceLong.Type = field.NewInt(tableName, "type") _resourceLong.Live = field.NewInt32(tableName, "live") - _resourceLong.Expire = field.NewField(tableName, "expire") + _resourceLong.Expire = field.NewTime(tableName, "expire") _resourceLong.Quota = field.NewInt32(tableName, "quota") _resourceLong.Used = field.NewInt32(tableName, "used") _resourceLong.DailyLimit = field.NewInt32(tableName, "daily_limit") _resourceLong.DailyUsed = field.NewInt32(tableName, "daily_used") - _resourceLong.DailyLast = field.NewField(tableName, "daily_last") + _resourceLong.DailyLast = field.NewTime(tableName, "daily_last") _resourceLong.fillFieldMap() @@ -47,16 +47,16 @@ type resourceLong struct { resourceLongDo ALL field.Asterisk - ID field.Int32 // ID - ResourceID field.Int32 // 套餐ID - Type field.Int32 // 套餐类型:1-包时,2-包量 - Live field.Int32 // 可用时长(天) - Expire field.Field // 过期时间 - Quota field.Int32 // 配额数量 - Used field.Int32 // 已用数量 - DailyLimit field.Int32 // 每日限制 - DailyUsed field.Int32 // 今日已用数量 - DailyLast field.Field // 今日最后使用时间 + ID field.Int32 + ResourceID field.Int32 + Type field.Int + Live field.Int32 + Expire field.Time + Quota field.Int32 + Used field.Int32 + DailyLimit field.Int32 + DailyUsed field.Int32 + DailyLast field.Time fieldMap map[string]field.Expr } @@ -75,14 +75,14 @@ func (r *resourceLong) updateTableName(table string) *resourceLong { r.ALL = field.NewAsterisk(table) r.ID = field.NewInt32(table, "id") r.ResourceID = field.NewInt32(table, "resource_id") - r.Type = field.NewInt32(table, "type") + r.Type = field.NewInt(table, "type") r.Live = field.NewInt32(table, "live") - r.Expire = field.NewField(table, "expire") + r.Expire = field.NewTime(table, "expire") r.Quota = field.NewInt32(table, "quota") r.Used = field.NewInt32(table, "used") r.DailyLimit = field.NewInt32(table, "daily_limit") r.DailyUsed = field.NewInt32(table, "daily_used") - r.DailyLast = field.NewField(table, "daily_last") + r.DailyLast = field.NewTime(table, "daily_last") r.fillFieldMap() diff --git a/web/queries/resource_short.gen.go b/web/queries/resource_short.gen.go index e88fd11..d166635 100644 --- a/web/queries/resource_short.gen.go +++ b/web/queries/resource_short.gen.go @@ -29,14 +29,14 @@ func newResourceShort(db *gorm.DB, opts ...gen.DOOption) resourceShort { _resourceShort.ALL = field.NewAsterisk(tableName) _resourceShort.ID = field.NewInt32(tableName, "id") _resourceShort.ResourceID = field.NewInt32(tableName, "resource_id") - _resourceShort.Type = field.NewInt32(tableName, "type") + _resourceShort.Type = field.NewInt(tableName, "type") _resourceShort.Live = field.NewInt32(tableName, "live") - _resourceShort.Expire = field.NewField(tableName, "expire") + _resourceShort.Expire = field.NewTime(tableName, "expire") _resourceShort.Quota = field.NewInt32(tableName, "quota") _resourceShort.Used = field.NewInt32(tableName, "used") _resourceShort.DailyLimit = field.NewInt32(tableName, "daily_limit") _resourceShort.DailyUsed = field.NewInt32(tableName, "daily_used") - _resourceShort.DailyLast = field.NewField(tableName, "daily_last") + _resourceShort.DailyLast = field.NewTime(tableName, "daily_last") _resourceShort.fillFieldMap() @@ -47,16 +47,16 @@ type resourceShort struct { resourceShortDo ALL field.Asterisk - ID field.Int32 // ID - ResourceID field.Int32 // 套餐ID - Type field.Int32 // 套餐类型:1-包时,2-包量 - Live field.Int32 // 可用时长(秒) - Expire field.Field // 过期时间 - Quota field.Int32 // 配额数量 - Used field.Int32 // 已用数量 - DailyLimit field.Int32 // 每日限制 - DailyUsed field.Int32 // 今日已用数量 - DailyLast field.Field // 今日最后使用时间 + ID field.Int32 + ResourceID field.Int32 + Type field.Int + Live field.Int32 + Expire field.Time + Quota field.Int32 + Used field.Int32 + DailyLimit field.Int32 + DailyUsed field.Int32 + DailyLast field.Time fieldMap map[string]field.Expr } @@ -75,14 +75,14 @@ func (r *resourceShort) updateTableName(table string) *resourceShort { r.ALL = field.NewAsterisk(table) r.ID = field.NewInt32(table, "id") r.ResourceID = field.NewInt32(table, "resource_id") - r.Type = field.NewInt32(table, "type") + r.Type = field.NewInt(table, "type") r.Live = field.NewInt32(table, "live") - r.Expire = field.NewField(table, "expire") + r.Expire = field.NewTime(table, "expire") r.Quota = field.NewInt32(table, "quota") r.Used = field.NewInt32(table, "used") r.DailyLimit = field.NewInt32(table, "daily_limit") r.DailyUsed = field.NewInt32(table, "daily_used") - r.DailyLast = field.NewField(table, "daily_last") + r.DailyLast = field.NewTime(table, "daily_last") r.fillFieldMap() diff --git a/web/queries/session.gen.go b/web/queries/session.gen.go index 3a135ec..502d535 100644 --- a/web/queries/session.gen.go +++ b/web/queries/session.gen.go @@ -28,23 +28,28 @@ func newSession(db *gorm.DB, opts ...gen.DOOption) session { tableName := _session.sessionDo.TableName() _session.ALL = field.NewAsterisk(tableName) _session.ID = field.NewInt32(tableName, "id") + _session.CreatedAt = field.NewTime(tableName, "created_at") + _session.UpdatedAt = field.NewTime(tableName, "updated_at") + _session.DeletedAt = field.NewField(tableName, "deleted_at") _session.UserID = field.NewInt32(tableName, "user_id") _session.AdminID = field.NewInt32(tableName, "admin_id") _session.ClientID = field.NewInt32(tableName, "client_id") - _session.IP = field.NewString(tableName, "ip") + _session.IP = field.NewField(tableName, "ip") _session.UA = field.NewString(tableName, "ua") _session.AccessToken = field.NewString(tableName, "access_token") - _session.AccessTokenExpires = field.NewField(tableName, "access_token_expires") + _session.AccessTokenExpires = field.NewTime(tableName, "access_token_expires") _session.RefreshToken = field.NewString(tableName, "refresh_token") - _session.RefreshTokenExpires = field.NewField(tableName, "refresh_token_expires") + _session.RefreshTokenExpires = field.NewTime(tableName, "refresh_token_expires") _session.Scopes_ = field.NewString(tableName, "scopes") - _session.CreatedAt = field.NewField(tableName, "created_at") - _session.UpdatedAt = field.NewField(tableName, "updated_at") - _session.DeletedAt = field.NewField(tableName, "deleted_at") _session.User = sessionBelongsToUser{ db: db.Session(&gorm.Session{}), RelationField: field.NewRelation("User", "models.User"), + Admin: struct { + field.RelationField + }{ + RelationField: field.NewRelation("User.Admin", "models.Admin"), + }, } _session.Admin = sessionBelongsToAdmin{ @@ -68,20 +73,20 @@ type session struct { sessionDo ALL field.Asterisk - ID field.Int32 // 会话ID - UserID field.Int32 // 用户ID - AdminID field.Int32 // 管理员ID - ClientID field.Int32 // 客户端ID - IP field.String // IP地址 - UA field.String // 用户代理 - AccessToken field.String // 访问令牌 - AccessTokenExpires field.Field // 访问令牌过期时间 - RefreshToken field.String // 刷新令牌 - RefreshTokenExpires field.Field // 刷新令牌过期时间 - Scopes_ field.String // 权限范围 - CreatedAt field.Field // 创建时间 - UpdatedAt field.Field // 更新时间 - DeletedAt field.Field // 删除时间 + ID field.Int32 + CreatedAt field.Time + UpdatedAt field.Time + DeletedAt field.Field + UserID field.Int32 + AdminID field.Int32 + ClientID field.Int32 + IP field.Field + UA field.String + AccessToken field.String + AccessTokenExpires field.Time + RefreshToken field.String + RefreshTokenExpires field.Time + Scopes_ field.String User sessionBelongsToUser Admin sessionBelongsToAdmin @@ -104,19 +109,19 @@ func (s session) As(alias string) *session { func (s *session) updateTableName(table string) *session { s.ALL = field.NewAsterisk(table) s.ID = field.NewInt32(table, "id") + s.CreatedAt = field.NewTime(table, "created_at") + s.UpdatedAt = field.NewTime(table, "updated_at") + s.DeletedAt = field.NewField(table, "deleted_at") s.UserID = field.NewInt32(table, "user_id") s.AdminID = field.NewInt32(table, "admin_id") s.ClientID = field.NewInt32(table, "client_id") - s.IP = field.NewString(table, "ip") + s.IP = field.NewField(table, "ip") s.UA = field.NewString(table, "ua") s.AccessToken = field.NewString(table, "access_token") - s.AccessTokenExpires = field.NewField(table, "access_token_expires") + s.AccessTokenExpires = field.NewTime(table, "access_token_expires") s.RefreshToken = field.NewString(table, "refresh_token") - s.RefreshTokenExpires = field.NewField(table, "refresh_token_expires") + s.RefreshTokenExpires = field.NewTime(table, "refresh_token_expires") s.Scopes_ = field.NewString(table, "scopes") - s.CreatedAt = field.NewField(table, "created_at") - s.UpdatedAt = field.NewField(table, "updated_at") - s.DeletedAt = field.NewField(table, "deleted_at") s.fillFieldMap() @@ -135,6 +140,9 @@ func (s *session) GetFieldByName(fieldName string) (field.OrderExpr, bool) { func (s *session) fillFieldMap() { s.fieldMap = make(map[string]field.Expr, 17) s.fieldMap["id"] = s.ID + s.fieldMap["created_at"] = s.CreatedAt + s.fieldMap["updated_at"] = s.UpdatedAt + s.fieldMap["deleted_at"] = s.DeletedAt s.fieldMap["user_id"] = s.UserID s.fieldMap["admin_id"] = s.AdminID s.fieldMap["client_id"] = s.ClientID @@ -145,9 +153,6 @@ func (s *session) fillFieldMap() { s.fieldMap["refresh_token"] = s.RefreshToken s.fieldMap["refresh_token_expires"] = s.RefreshTokenExpires s.fieldMap["scopes"] = s.Scopes_ - s.fieldMap["created_at"] = s.CreatedAt - s.fieldMap["updated_at"] = s.UpdatedAt - s.fieldMap["deleted_at"] = s.DeletedAt } @@ -174,6 +179,10 @@ type sessionBelongsToUser struct { db *gorm.DB field.RelationField + + Admin struct { + field.RelationField + } } func (a sessionBelongsToUser) Where(conds ...field.Expr) *sessionBelongsToUser { diff --git a/web/queries/trade.gen.go b/web/queries/trade.gen.go index db0ac36..a30ebef 100644 --- a/web/queries/trade.gen.go +++ b/web/queries/trade.gen.go @@ -28,25 +28,25 @@ func newTrade(db *gorm.DB, opts ...gen.DOOption) trade { tableName := _trade.tradeDo.TableName() _trade.ALL = field.NewAsterisk(tableName) _trade.ID = field.NewInt32(tableName, "id") + _trade.CreatedAt = field.NewTime(tableName, "created_at") + _trade.UpdatedAt = field.NewTime(tableName, "updated_at") + _trade.DeletedAt = field.NewField(tableName, "deleted_at") _trade.UserID = field.NewInt32(tableName, "user_id") _trade.InnerNo = field.NewString(tableName, "inner_no") _trade.OuterNo = field.NewString(tableName, "outer_no") - _trade.Type = field.NewInt32(tableName, "type") + _trade.Type = field.NewInt(tableName, "type") _trade.Subject = field.NewString(tableName, "subject") _trade.Remark = field.NewString(tableName, "remark") _trade.Amount = field.NewField(tableName, "amount") _trade.Payment = field.NewField(tableName, "payment") - _trade.Method = field.NewInt32(tableName, "method") - _trade.Platform = field.NewInt32(tableName, "platform") - _trade.Acquirer = field.NewInt32(tableName, "acquirer") - _trade.Status = field.NewInt32(tableName, "status") + _trade.Method = field.NewInt(tableName, "method") + _trade.Platform = field.NewInt(tableName, "platform") + _trade.Acquirer = field.NewInt(tableName, "acquirer") + _trade.Status = field.NewInt(tableName, "status") _trade.Refunded = field.NewBool(tableName, "refunded") _trade.PaymentURL = field.NewString(tableName, "payment_url") - _trade.CompletedAt = field.NewField(tableName, "completed_at") - _trade.CanceledAt = field.NewField(tableName, "canceled_at") - _trade.CreatedAt = field.NewField(tableName, "created_at") - _trade.UpdatedAt = field.NewField(tableName, "updated_at") - _trade.DeletedAt = field.NewField(tableName, "deleted_at") + _trade.CompletedAt = field.NewTime(tableName, "completed_at") + _trade.CanceledAt = field.NewTime(tableName, "canceled_at") _trade.fillFieldMap() @@ -57,26 +57,26 @@ type trade struct { tradeDo ALL field.Asterisk - ID field.Int32 // 订单ID - UserID field.Int32 // 用户ID - InnerNo field.String // 内部订单号 - OuterNo field.String // 外部订单号 - Type field.Int32 // 订单类型:1-购买产品,2-充值余额 - Subject field.String // 订单主题 - Remark field.String // 订单备注 - Amount field.Field // 订单总金额 - Payment field.Field // 实际支付金额 - Method field.Int32 // 支付方式:1-支付宝,2-微信,3-商福通,4-商福通渠道支付宝,5-商福通渠道微信 - Platform field.Int32 // 支付平台:1-电脑网站,2-手机网站 - Acquirer field.Int32 // 收单机构:1-支付宝,2-微信,3-银联 - Status field.Int32 // 订单状态:0-待支付,1-已支付,2-已取消 + ID field.Int32 + CreatedAt field.Time + UpdatedAt field.Time + DeletedAt field.Field + UserID field.Int32 + InnerNo field.String + OuterNo field.String + Type field.Int + Subject field.String + Remark field.String + Amount field.Field + Payment field.Field + Method field.Int + Platform field.Int + Acquirer field.Int + Status field.Int Refunded field.Bool - PaymentURL field.String // 支付链接 - CompletedAt field.Field // 支付时间 - CanceledAt field.Field // 取消时间 - CreatedAt field.Field // 创建时间 - UpdatedAt field.Field // 更新时间 - DeletedAt field.Field // 删除时间 + PaymentURL field.String + CompletedAt field.Time + CanceledAt field.Time fieldMap map[string]field.Expr } @@ -94,25 +94,25 @@ func (t trade) As(alias string) *trade { func (t *trade) updateTableName(table string) *trade { t.ALL = field.NewAsterisk(table) t.ID = field.NewInt32(table, "id") + t.CreatedAt = field.NewTime(table, "created_at") + t.UpdatedAt = field.NewTime(table, "updated_at") + t.DeletedAt = field.NewField(table, "deleted_at") t.UserID = field.NewInt32(table, "user_id") t.InnerNo = field.NewString(table, "inner_no") t.OuterNo = field.NewString(table, "outer_no") - t.Type = field.NewInt32(table, "type") + t.Type = field.NewInt(table, "type") t.Subject = field.NewString(table, "subject") t.Remark = field.NewString(table, "remark") t.Amount = field.NewField(table, "amount") t.Payment = field.NewField(table, "payment") - t.Method = field.NewInt32(table, "method") - t.Platform = field.NewInt32(table, "platform") - t.Acquirer = field.NewInt32(table, "acquirer") - t.Status = field.NewInt32(table, "status") + t.Method = field.NewInt(table, "method") + t.Platform = field.NewInt(table, "platform") + t.Acquirer = field.NewInt(table, "acquirer") + t.Status = field.NewInt(table, "status") t.Refunded = field.NewBool(table, "refunded") t.PaymentURL = field.NewString(table, "payment_url") - t.CompletedAt = field.NewField(table, "completed_at") - t.CanceledAt = field.NewField(table, "canceled_at") - t.CreatedAt = field.NewField(table, "created_at") - t.UpdatedAt = field.NewField(table, "updated_at") - t.DeletedAt = field.NewField(table, "deleted_at") + t.CompletedAt = field.NewTime(table, "completed_at") + t.CanceledAt = field.NewTime(table, "canceled_at") t.fillFieldMap() @@ -131,6 +131,9 @@ func (t *trade) GetFieldByName(fieldName string) (field.OrderExpr, bool) { func (t *trade) fillFieldMap() { t.fieldMap = make(map[string]field.Expr, 20) t.fieldMap["id"] = t.ID + t.fieldMap["created_at"] = t.CreatedAt + t.fieldMap["updated_at"] = t.UpdatedAt + t.fieldMap["deleted_at"] = t.DeletedAt t.fieldMap["user_id"] = t.UserID t.fieldMap["inner_no"] = t.InnerNo t.fieldMap["outer_no"] = t.OuterNo @@ -147,9 +150,6 @@ func (t *trade) fillFieldMap() { t.fieldMap["payment_url"] = t.PaymentURL t.fieldMap["completed_at"] = t.CompletedAt t.fieldMap["canceled_at"] = t.CanceledAt - t.fieldMap["created_at"] = t.CreatedAt - t.fieldMap["updated_at"] = t.UpdatedAt - t.fieldMap["deleted_at"] = t.DeletedAt } func (t trade) clone(db *gorm.DB) trade { diff --git a/web/queries/user.gen.go b/web/queries/user.gen.go index 6f7e3a3..90c50e0 100644 --- a/web/queries/user.gen.go +++ b/web/queries/user.gen.go @@ -28,6 +28,9 @@ func newUser(db *gorm.DB, opts ...gen.DOOption) user { tableName := _user.userDo.TableName() _user.ALL = field.NewAsterisk(tableName) _user.ID = field.NewInt32(tableName, "id") + _user.CreatedAt = field.NewTime(tableName, "created_at") + _user.UpdatedAt = field.NewTime(tableName, "updated_at") + _user.DeletedAt = field.NewField(tableName, "deleted_at") _user.AdminID = field.NewInt32(tableName, "admin_id") _user.Phone = field.NewString(tableName, "phone") _user.Username = field.NewString(tableName, "username") @@ -35,19 +38,21 @@ func newUser(db *gorm.DB, opts ...gen.DOOption) user { _user.Password = field.NewString(tableName, "password") _user.Name = field.NewString(tableName, "name") _user.Avatar = field.NewString(tableName, "avatar") - _user.Status = field.NewInt32(tableName, "status") + _user.Status = field.NewInt(tableName, "status") _user.Balance = field.NewField(tableName, "balance") - _user.IDType = field.NewInt32(tableName, "id_type") + _user.IDType = field.NewInt(tableName, "id_type") _user.IDNo = field.NewString(tableName, "id_no") _user.IDToken = field.NewString(tableName, "id_token") _user.ContactQQ = field.NewString(tableName, "contact_qq") _user.ContactWechat = field.NewString(tableName, "contact_wechat") - _user.LastLogin = field.NewField(tableName, "last_login") - _user.LastLoginHost = field.NewString(tableName, "last_login_host") - _user.LastLoginAgent = field.NewString(tableName, "last_login_agent") - _user.CreatedAt = field.NewField(tableName, "created_at") - _user.UpdatedAt = field.NewField(tableName, "updated_at") - _user.DeletedAt = field.NewField(tableName, "deleted_at") + _user.LastLogin = field.NewTime(tableName, "last_login") + _user.LastLoginIP = field.NewField(tableName, "last_login_ip") + _user.LastLoginUA = field.NewString(tableName, "last_login_ua") + _user.Admin = userBelongsToAdmin{ + db: db.Session(&gorm.Session{}), + + RelationField: field.NewRelation("Admin", "models.Admin"), + } _user.fillFieldMap() @@ -57,28 +62,29 @@ func newUser(db *gorm.DB, opts ...gen.DOOption) user { type user struct { userDo - ALL field.Asterisk - ID field.Int32 // 用户ID - AdminID field.Int32 // 管理员ID - Phone field.String // 手机号码 - Username field.String // 用户名 - Email field.String - Password field.String // 用户密码 - Name field.String // 真实姓名 - Avatar field.String // 头像URL - Status field.Int32 // 用户状态:0-禁用,1-正常 - Balance field.Field // 账户余额 - IDType field.Int32 // 认证类型:0-未认证,1-个人认证,2-企业认证 - IDNo field.String // 身份证号或营业执照号 - IDToken field.String // 身份验证标识 - ContactQQ field.String // QQ联系方式 - ContactWechat field.String // 微信联系方式 - LastLogin field.Field // 最后登录时间 - LastLoginHost field.String // 最后登录地址 - LastLoginAgent field.String // 最后登录代理 - CreatedAt field.Field // 创建时间 - UpdatedAt field.Field // 更新时间 - DeletedAt field.Field // 删除时间 + ALL field.Asterisk + ID field.Int32 + CreatedAt field.Time + UpdatedAt field.Time + DeletedAt field.Field + AdminID field.Int32 + Phone field.String + Username field.String + Email field.String + Password field.String + Name field.String + Avatar field.String + Status field.Int + Balance field.Field + IDType field.Int + IDNo field.String + IDToken field.String + ContactQQ field.String + ContactWechat field.String + LastLogin field.Time + LastLoginIP field.Field + LastLoginUA field.String + Admin userBelongsToAdmin fieldMap map[string]field.Expr } @@ -96,6 +102,9 @@ func (u user) As(alias string) *user { func (u *user) updateTableName(table string) *user { u.ALL = field.NewAsterisk(table) u.ID = field.NewInt32(table, "id") + u.CreatedAt = field.NewTime(table, "created_at") + u.UpdatedAt = field.NewTime(table, "updated_at") + u.DeletedAt = field.NewField(table, "deleted_at") u.AdminID = field.NewInt32(table, "admin_id") u.Phone = field.NewString(table, "phone") u.Username = field.NewString(table, "username") @@ -103,19 +112,16 @@ func (u *user) updateTableName(table string) *user { u.Password = field.NewString(table, "password") u.Name = field.NewString(table, "name") u.Avatar = field.NewString(table, "avatar") - u.Status = field.NewInt32(table, "status") + u.Status = field.NewInt(table, "status") u.Balance = field.NewField(table, "balance") - u.IDType = field.NewInt32(table, "id_type") + u.IDType = field.NewInt(table, "id_type") u.IDNo = field.NewString(table, "id_no") u.IDToken = field.NewString(table, "id_token") u.ContactQQ = field.NewString(table, "contact_qq") u.ContactWechat = field.NewString(table, "contact_wechat") - u.LastLogin = field.NewField(table, "last_login") - u.LastLoginHost = field.NewString(table, "last_login_host") - u.LastLoginAgent = field.NewString(table, "last_login_agent") - u.CreatedAt = field.NewField(table, "created_at") - u.UpdatedAt = field.NewField(table, "updated_at") - u.DeletedAt = field.NewField(table, "deleted_at") + u.LastLogin = field.NewTime(table, "last_login") + u.LastLoginIP = field.NewField(table, "last_login_ip") + u.LastLoginUA = field.NewString(table, "last_login_ua") u.fillFieldMap() @@ -132,8 +138,11 @@ func (u *user) GetFieldByName(fieldName string) (field.OrderExpr, bool) { } func (u *user) fillFieldMap() { - u.fieldMap = make(map[string]field.Expr, 21) + u.fieldMap = make(map[string]field.Expr, 22) u.fieldMap["id"] = u.ID + u.fieldMap["created_at"] = u.CreatedAt + u.fieldMap["updated_at"] = u.UpdatedAt + u.fieldMap["deleted_at"] = u.DeletedAt u.fieldMap["admin_id"] = u.AdminID u.fieldMap["phone"] = u.Phone u.fieldMap["username"] = u.Username @@ -149,23 +158,105 @@ func (u *user) fillFieldMap() { u.fieldMap["contact_qq"] = u.ContactQQ u.fieldMap["contact_wechat"] = u.ContactWechat u.fieldMap["last_login"] = u.LastLogin - u.fieldMap["last_login_host"] = u.LastLoginHost - u.fieldMap["last_login_agent"] = u.LastLoginAgent - u.fieldMap["created_at"] = u.CreatedAt - u.fieldMap["updated_at"] = u.UpdatedAt - u.fieldMap["deleted_at"] = u.DeletedAt + u.fieldMap["last_login_ip"] = u.LastLoginIP + u.fieldMap["last_login_ua"] = u.LastLoginUA + } func (u user) clone(db *gorm.DB) user { u.userDo.ReplaceConnPool(db.Statement.ConnPool) + u.Admin.db = db.Session(&gorm.Session{Initialized: true}) + u.Admin.db.Statement.ConnPool = db.Statement.ConnPool return u } func (u user) replaceDB(db *gorm.DB) user { u.userDo.ReplaceDB(db) + u.Admin.db = db.Session(&gorm.Session{}) return u } +type userBelongsToAdmin struct { + db *gorm.DB + + field.RelationField +} + +func (a userBelongsToAdmin) Where(conds ...field.Expr) *userBelongsToAdmin { + if len(conds) == 0 { + return &a + } + + exprs := make([]clause.Expression, 0, len(conds)) + for _, cond := range conds { + exprs = append(exprs, cond.BeCond().(clause.Expression)) + } + a.db = a.db.Clauses(clause.Where{Exprs: exprs}) + return &a +} + +func (a userBelongsToAdmin) WithContext(ctx context.Context) *userBelongsToAdmin { + a.db = a.db.WithContext(ctx) + return &a +} + +func (a userBelongsToAdmin) Session(session *gorm.Session) *userBelongsToAdmin { + a.db = a.db.Session(session) + return &a +} + +func (a userBelongsToAdmin) Model(m *models.User) *userBelongsToAdminTx { + return &userBelongsToAdminTx{a.db.Model(m).Association(a.Name())} +} + +func (a userBelongsToAdmin) Unscoped() *userBelongsToAdmin { + a.db = a.db.Unscoped() + return &a +} + +type userBelongsToAdminTx struct{ tx *gorm.Association } + +func (a userBelongsToAdminTx) Find() (result *models.Admin, err error) { + return result, a.tx.Find(&result) +} + +func (a userBelongsToAdminTx) Append(values ...*models.Admin) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Append(targetValues...) +} + +func (a userBelongsToAdminTx) Replace(values ...*models.Admin) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Replace(targetValues...) +} + +func (a userBelongsToAdminTx) Delete(values ...*models.Admin) (err error) { + targetValues := make([]interface{}, len(values)) + for i, v := range values { + targetValues[i] = v + } + return a.tx.Delete(targetValues...) +} + +func (a userBelongsToAdminTx) Clear() error { + return a.tx.Clear() +} + +func (a userBelongsToAdminTx) Count() int64 { + return a.tx.Count() +} + +func (a userBelongsToAdminTx) Unscoped() *userBelongsToAdminTx { + a.tx = a.tx.Unscoped() + return &a +} + type userDo struct{ gen.DO } func (u userDo) Debug() *userDo { diff --git a/web/queries/user_role.gen.go b/web/queries/user_role.gen.go index f0401a6..cbeaeec 100644 --- a/web/queries/user_role.gen.go +++ b/web/queries/user_role.gen.go @@ -28,13 +28,13 @@ func newUserRole(db *gorm.DB, opts ...gen.DOOption) userRole { tableName := _userRole.userRoleDo.TableName() _userRole.ALL = field.NewAsterisk(tableName) _userRole.ID = field.NewInt32(tableName, "id") + _userRole.CreatedAt = field.NewTime(tableName, "created_at") + _userRole.UpdatedAt = field.NewTime(tableName, "updated_at") + _userRole.DeletedAt = field.NewField(tableName, "deleted_at") _userRole.Name = field.NewString(tableName, "name") _userRole.Description = field.NewString(tableName, "description") _userRole.Active = field.NewBool(tableName, "active") _userRole.Sort = field.NewInt32(tableName, "sort") - _userRole.CreatedAt = field.NewField(tableName, "created_at") - _userRole.UpdatedAt = field.NewField(tableName, "updated_at") - _userRole.DeletedAt = field.NewField(tableName, "deleted_at") _userRole.fillFieldMap() @@ -45,14 +45,14 @@ type userRole struct { userRoleDo ALL field.Asterisk - ID field.Int32 // 角色ID - Name field.String // 角色名称 - Description field.String // 角色描述 - Active field.Bool // 是否激活 - Sort field.Int32 // 排序 - CreatedAt field.Field // 创建时间 - UpdatedAt field.Field // 更新时间 - DeletedAt field.Field // 删除时间 + ID field.Int32 + CreatedAt field.Time + UpdatedAt field.Time + DeletedAt field.Field + Name field.String + Description field.String + Active field.Bool + Sort field.Int32 fieldMap map[string]field.Expr } @@ -70,13 +70,13 @@ func (u userRole) As(alias string) *userRole { func (u *userRole) updateTableName(table string) *userRole { u.ALL = field.NewAsterisk(table) u.ID = field.NewInt32(table, "id") + u.CreatedAt = field.NewTime(table, "created_at") + u.UpdatedAt = field.NewTime(table, "updated_at") + u.DeletedAt = field.NewField(table, "deleted_at") u.Name = field.NewString(table, "name") u.Description = field.NewString(table, "description") u.Active = field.NewBool(table, "active") u.Sort = field.NewInt32(table, "sort") - u.CreatedAt = field.NewField(table, "created_at") - u.UpdatedAt = field.NewField(table, "updated_at") - u.DeletedAt = field.NewField(table, "deleted_at") u.fillFieldMap() @@ -95,13 +95,13 @@ func (u *userRole) GetFieldByName(fieldName string) (field.OrderExpr, bool) { func (u *userRole) fillFieldMap() { u.fieldMap = make(map[string]field.Expr, 8) u.fieldMap["id"] = u.ID + u.fieldMap["created_at"] = u.CreatedAt + u.fieldMap["updated_at"] = u.UpdatedAt + u.fieldMap["deleted_at"] = u.DeletedAt u.fieldMap["name"] = u.Name u.fieldMap["description"] = u.Description u.fieldMap["active"] = u.Active u.fieldMap["sort"] = u.Sort - u.fieldMap["created_at"] = u.CreatedAt - u.fieldMap["updated_at"] = u.UpdatedAt - u.fieldMap["deleted_at"] = u.DeletedAt } func (u userRole) clone(db *gorm.DB) userRole { diff --git a/web/queries/user_role_link.gen.go b/web/queries/user_role_link.gen.go deleted file mode 100644 index 25db08f..0000000 --- a/web/queries/user_role_link.gen.go +++ /dev/null @@ -1,339 +0,0 @@ -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. - -package queries - -import ( - "context" - - "gorm.io/gorm" - "gorm.io/gorm/clause" - "gorm.io/gorm/schema" - - "gorm.io/gen" - "gorm.io/gen/field" - - "gorm.io/plugin/dbresolver" - - "platform/web/models" -) - -func newUserRoleLink(db *gorm.DB, opts ...gen.DOOption) userRoleLink { - _userRoleLink := userRoleLink{} - - _userRoleLink.userRoleLinkDo.UseDB(db, opts...) - _userRoleLink.userRoleLinkDo.UseModel(&models.UserRoleLink{}) - - tableName := _userRoleLink.userRoleLinkDo.TableName() - _userRoleLink.ALL = field.NewAsterisk(tableName) - _userRoleLink.ID = field.NewInt32(tableName, "id") - _userRoleLink.UserID = field.NewInt32(tableName, "user_id") - _userRoleLink.RoleID = field.NewInt32(tableName, "role_id") - _userRoleLink.CreatedAt = field.NewField(tableName, "created_at") - _userRoleLink.UpdatedAt = field.NewField(tableName, "updated_at") - _userRoleLink.DeletedAt = field.NewField(tableName, "deleted_at") - - _userRoleLink.fillFieldMap() - - return _userRoleLink -} - -type userRoleLink struct { - userRoleLinkDo - - ALL field.Asterisk - ID field.Int32 // 关联ID - UserID field.Int32 // 用户ID - RoleID field.Int32 // 角色ID - CreatedAt field.Field // 创建时间 - UpdatedAt field.Field // 更新时间 - DeletedAt field.Field // 删除时间 - - fieldMap map[string]field.Expr -} - -func (u userRoleLink) Table(newTableName string) *userRoleLink { - u.userRoleLinkDo.UseTable(newTableName) - return u.updateTableName(newTableName) -} - -func (u userRoleLink) As(alias string) *userRoleLink { - u.userRoleLinkDo.DO = *(u.userRoleLinkDo.As(alias).(*gen.DO)) - return u.updateTableName(alias) -} - -func (u *userRoleLink) updateTableName(table string) *userRoleLink { - u.ALL = field.NewAsterisk(table) - u.ID = field.NewInt32(table, "id") - u.UserID = field.NewInt32(table, "user_id") - u.RoleID = field.NewInt32(table, "role_id") - u.CreatedAt = field.NewField(table, "created_at") - u.UpdatedAt = field.NewField(table, "updated_at") - u.DeletedAt = field.NewField(table, "deleted_at") - - u.fillFieldMap() - - return u -} - -func (u *userRoleLink) GetFieldByName(fieldName string) (field.OrderExpr, bool) { - _f, ok := u.fieldMap[fieldName] - if !ok || _f == nil { - return nil, false - } - _oe, ok := _f.(field.OrderExpr) - return _oe, ok -} - -func (u *userRoleLink) fillFieldMap() { - u.fieldMap = make(map[string]field.Expr, 6) - u.fieldMap["id"] = u.ID - u.fieldMap["user_id"] = u.UserID - u.fieldMap["role_id"] = u.RoleID - u.fieldMap["created_at"] = u.CreatedAt - u.fieldMap["updated_at"] = u.UpdatedAt - u.fieldMap["deleted_at"] = u.DeletedAt -} - -func (u userRoleLink) clone(db *gorm.DB) userRoleLink { - u.userRoleLinkDo.ReplaceConnPool(db.Statement.ConnPool) - return u -} - -func (u userRoleLink) replaceDB(db *gorm.DB) userRoleLink { - u.userRoleLinkDo.ReplaceDB(db) - return u -} - -type userRoleLinkDo struct{ gen.DO } - -func (u userRoleLinkDo) Debug() *userRoleLinkDo { - return u.withDO(u.DO.Debug()) -} - -func (u userRoleLinkDo) WithContext(ctx context.Context) *userRoleLinkDo { - return u.withDO(u.DO.WithContext(ctx)) -} - -func (u userRoleLinkDo) ReadDB() *userRoleLinkDo { - return u.Clauses(dbresolver.Read) -} - -func (u userRoleLinkDo) WriteDB() *userRoleLinkDo { - return u.Clauses(dbresolver.Write) -} - -func (u userRoleLinkDo) Session(config *gorm.Session) *userRoleLinkDo { - return u.withDO(u.DO.Session(config)) -} - -func (u userRoleLinkDo) Clauses(conds ...clause.Expression) *userRoleLinkDo { - return u.withDO(u.DO.Clauses(conds...)) -} - -func (u userRoleLinkDo) Returning(value interface{}, columns ...string) *userRoleLinkDo { - return u.withDO(u.DO.Returning(value, columns...)) -} - -func (u userRoleLinkDo) Not(conds ...gen.Condition) *userRoleLinkDo { - return u.withDO(u.DO.Not(conds...)) -} - -func (u userRoleLinkDo) Or(conds ...gen.Condition) *userRoleLinkDo { - return u.withDO(u.DO.Or(conds...)) -} - -func (u userRoleLinkDo) Select(conds ...field.Expr) *userRoleLinkDo { - return u.withDO(u.DO.Select(conds...)) -} - -func (u userRoleLinkDo) Where(conds ...gen.Condition) *userRoleLinkDo { - return u.withDO(u.DO.Where(conds...)) -} - -func (u userRoleLinkDo) Order(conds ...field.Expr) *userRoleLinkDo { - return u.withDO(u.DO.Order(conds...)) -} - -func (u userRoleLinkDo) Distinct(cols ...field.Expr) *userRoleLinkDo { - return u.withDO(u.DO.Distinct(cols...)) -} - -func (u userRoleLinkDo) Omit(cols ...field.Expr) *userRoleLinkDo { - return u.withDO(u.DO.Omit(cols...)) -} - -func (u userRoleLinkDo) Join(table schema.Tabler, on ...field.Expr) *userRoleLinkDo { - return u.withDO(u.DO.Join(table, on...)) -} - -func (u userRoleLinkDo) LeftJoin(table schema.Tabler, on ...field.Expr) *userRoleLinkDo { - return u.withDO(u.DO.LeftJoin(table, on...)) -} - -func (u userRoleLinkDo) RightJoin(table schema.Tabler, on ...field.Expr) *userRoleLinkDo { - return u.withDO(u.DO.RightJoin(table, on...)) -} - -func (u userRoleLinkDo) Group(cols ...field.Expr) *userRoleLinkDo { - return u.withDO(u.DO.Group(cols...)) -} - -func (u userRoleLinkDo) Having(conds ...gen.Condition) *userRoleLinkDo { - return u.withDO(u.DO.Having(conds...)) -} - -func (u userRoleLinkDo) Limit(limit int) *userRoleLinkDo { - return u.withDO(u.DO.Limit(limit)) -} - -func (u userRoleLinkDo) Offset(offset int) *userRoleLinkDo { - return u.withDO(u.DO.Offset(offset)) -} - -func (u userRoleLinkDo) Scopes(funcs ...func(gen.Dao) gen.Dao) *userRoleLinkDo { - return u.withDO(u.DO.Scopes(funcs...)) -} - -func (u userRoleLinkDo) Unscoped() *userRoleLinkDo { - return u.withDO(u.DO.Unscoped()) -} - -func (u userRoleLinkDo) Create(values ...*models.UserRoleLink) error { - if len(values) == 0 { - return nil - } - return u.DO.Create(values) -} - -func (u userRoleLinkDo) CreateInBatches(values []*models.UserRoleLink, batchSize int) error { - return u.DO.CreateInBatches(values, batchSize) -} - -// Save : !!! underlying implementation is different with GORM -// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values) -func (u userRoleLinkDo) Save(values ...*models.UserRoleLink) error { - if len(values) == 0 { - return nil - } - return u.DO.Save(values) -} - -func (u userRoleLinkDo) First() (*models.UserRoleLink, error) { - if result, err := u.DO.First(); err != nil { - return nil, err - } else { - return result.(*models.UserRoleLink), nil - } -} - -func (u userRoleLinkDo) Take() (*models.UserRoleLink, error) { - if result, err := u.DO.Take(); err != nil { - return nil, err - } else { - return result.(*models.UserRoleLink), nil - } -} - -func (u userRoleLinkDo) Last() (*models.UserRoleLink, error) { - if result, err := u.DO.Last(); err != nil { - return nil, err - } else { - return result.(*models.UserRoleLink), nil - } -} - -func (u userRoleLinkDo) Find() ([]*models.UserRoleLink, error) { - result, err := u.DO.Find() - return result.([]*models.UserRoleLink), err -} - -func (u userRoleLinkDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.UserRoleLink, err error) { - buf := make([]*models.UserRoleLink, 0, batchSize) - err = u.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error { - defer func() { results = append(results, buf...) }() - return fc(tx, batch) - }) - return results, err -} - -func (u userRoleLinkDo) FindInBatches(result *[]*models.UserRoleLink, batchSize int, fc func(tx gen.Dao, batch int) error) error { - return u.DO.FindInBatches(result, batchSize, fc) -} - -func (u userRoleLinkDo) Attrs(attrs ...field.AssignExpr) *userRoleLinkDo { - return u.withDO(u.DO.Attrs(attrs...)) -} - -func (u userRoleLinkDo) Assign(attrs ...field.AssignExpr) *userRoleLinkDo { - return u.withDO(u.DO.Assign(attrs...)) -} - -func (u userRoleLinkDo) Joins(fields ...field.RelationField) *userRoleLinkDo { - for _, _f := range fields { - u = *u.withDO(u.DO.Joins(_f)) - } - return &u -} - -func (u userRoleLinkDo) Preload(fields ...field.RelationField) *userRoleLinkDo { - for _, _f := range fields { - u = *u.withDO(u.DO.Preload(_f)) - } - return &u -} - -func (u userRoleLinkDo) FirstOrInit() (*models.UserRoleLink, error) { - if result, err := u.DO.FirstOrInit(); err != nil { - return nil, err - } else { - return result.(*models.UserRoleLink), nil - } -} - -func (u userRoleLinkDo) FirstOrCreate() (*models.UserRoleLink, error) { - if result, err := u.DO.FirstOrCreate(); err != nil { - return nil, err - } else { - return result.(*models.UserRoleLink), nil - } -} - -func (u userRoleLinkDo) FindByPage(offset int, limit int) (result []*models.UserRoleLink, count int64, err error) { - result, err = u.Offset(offset).Limit(limit).Find() - if err != nil { - return - } - - if size := len(result); 0 < limit && 0 < size && size < limit { - count = int64(size + offset) - return - } - - count, err = u.Offset(-1).Limit(-1).Count() - return -} - -func (u userRoleLinkDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) { - count, err = u.Count() - if err != nil { - return - } - - err = u.Offset(offset).Limit(limit).Scan(result) - return -} - -func (u userRoleLinkDo) Scan(result interface{}) (err error) { - return u.DO.Scan(result) -} - -func (u userRoleLinkDo) Delete(models ...*models.UserRoleLink) (result gen.ResultInfo, err error) { - return u.DO.Delete(models) -} - -func (u *userRoleLinkDo) withDO(do gen.Dao) *userRoleLinkDo { - u.DO = *do.(*gen.DO) - return u -} diff --git a/web/queries/user_role_permission_link.gen.go b/web/queries/user_role_permission_link.gen.go deleted file mode 100644 index 820cbfd..0000000 --- a/web/queries/user_role_permission_link.gen.go +++ /dev/null @@ -1,339 +0,0 @@ -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. -// Code generated by gorm.io/gen. DO NOT EDIT. - -package queries - -import ( - "context" - - "gorm.io/gorm" - "gorm.io/gorm/clause" - "gorm.io/gorm/schema" - - "gorm.io/gen" - "gorm.io/gen/field" - - "gorm.io/plugin/dbresolver" - - "platform/web/models" -) - -func newUserRolePermissionLink(db *gorm.DB, opts ...gen.DOOption) userRolePermissionLink { - _userRolePermissionLink := userRolePermissionLink{} - - _userRolePermissionLink.userRolePermissionLinkDo.UseDB(db, opts...) - _userRolePermissionLink.userRolePermissionLinkDo.UseModel(&models.UserRolePermissionLink{}) - - tableName := _userRolePermissionLink.userRolePermissionLinkDo.TableName() - _userRolePermissionLink.ALL = field.NewAsterisk(tableName) - _userRolePermissionLink.ID = field.NewInt32(tableName, "id") - _userRolePermissionLink.RoleID = field.NewInt32(tableName, "role_id") - _userRolePermissionLink.PermissionID = field.NewInt32(tableName, "permission_id") - _userRolePermissionLink.CreatedAt = field.NewField(tableName, "created_at") - _userRolePermissionLink.UpdatedAt = field.NewField(tableName, "updated_at") - _userRolePermissionLink.DeletedAt = field.NewField(tableName, "deleted_at") - - _userRolePermissionLink.fillFieldMap() - - return _userRolePermissionLink -} - -type userRolePermissionLink struct { - userRolePermissionLinkDo - - ALL field.Asterisk - ID field.Int32 // 关联ID - RoleID field.Int32 // 角色ID - PermissionID field.Int32 // 权限ID - CreatedAt field.Field // 创建时间 - UpdatedAt field.Field // 更新时间 - DeletedAt field.Field // 删除时间 - - fieldMap map[string]field.Expr -} - -func (u userRolePermissionLink) Table(newTableName string) *userRolePermissionLink { - u.userRolePermissionLinkDo.UseTable(newTableName) - return u.updateTableName(newTableName) -} - -func (u userRolePermissionLink) As(alias string) *userRolePermissionLink { - u.userRolePermissionLinkDo.DO = *(u.userRolePermissionLinkDo.As(alias).(*gen.DO)) - return u.updateTableName(alias) -} - -func (u *userRolePermissionLink) updateTableName(table string) *userRolePermissionLink { - u.ALL = field.NewAsterisk(table) - u.ID = field.NewInt32(table, "id") - u.RoleID = field.NewInt32(table, "role_id") - u.PermissionID = field.NewInt32(table, "permission_id") - u.CreatedAt = field.NewField(table, "created_at") - u.UpdatedAt = field.NewField(table, "updated_at") - u.DeletedAt = field.NewField(table, "deleted_at") - - u.fillFieldMap() - - return u -} - -func (u *userRolePermissionLink) GetFieldByName(fieldName string) (field.OrderExpr, bool) { - _f, ok := u.fieldMap[fieldName] - if !ok || _f == nil { - return nil, false - } - _oe, ok := _f.(field.OrderExpr) - return _oe, ok -} - -func (u *userRolePermissionLink) fillFieldMap() { - u.fieldMap = make(map[string]field.Expr, 6) - u.fieldMap["id"] = u.ID - u.fieldMap["role_id"] = u.RoleID - u.fieldMap["permission_id"] = u.PermissionID - u.fieldMap["created_at"] = u.CreatedAt - u.fieldMap["updated_at"] = u.UpdatedAt - u.fieldMap["deleted_at"] = u.DeletedAt -} - -func (u userRolePermissionLink) clone(db *gorm.DB) userRolePermissionLink { - u.userRolePermissionLinkDo.ReplaceConnPool(db.Statement.ConnPool) - return u -} - -func (u userRolePermissionLink) replaceDB(db *gorm.DB) userRolePermissionLink { - u.userRolePermissionLinkDo.ReplaceDB(db) - return u -} - -type userRolePermissionLinkDo struct{ gen.DO } - -func (u userRolePermissionLinkDo) Debug() *userRolePermissionLinkDo { - return u.withDO(u.DO.Debug()) -} - -func (u userRolePermissionLinkDo) WithContext(ctx context.Context) *userRolePermissionLinkDo { - return u.withDO(u.DO.WithContext(ctx)) -} - -func (u userRolePermissionLinkDo) ReadDB() *userRolePermissionLinkDo { - return u.Clauses(dbresolver.Read) -} - -func (u userRolePermissionLinkDo) WriteDB() *userRolePermissionLinkDo { - return u.Clauses(dbresolver.Write) -} - -func (u userRolePermissionLinkDo) Session(config *gorm.Session) *userRolePermissionLinkDo { - return u.withDO(u.DO.Session(config)) -} - -func (u userRolePermissionLinkDo) Clauses(conds ...clause.Expression) *userRolePermissionLinkDo { - return u.withDO(u.DO.Clauses(conds...)) -} - -func (u userRolePermissionLinkDo) Returning(value interface{}, columns ...string) *userRolePermissionLinkDo { - return u.withDO(u.DO.Returning(value, columns...)) -} - -func (u userRolePermissionLinkDo) Not(conds ...gen.Condition) *userRolePermissionLinkDo { - return u.withDO(u.DO.Not(conds...)) -} - -func (u userRolePermissionLinkDo) Or(conds ...gen.Condition) *userRolePermissionLinkDo { - return u.withDO(u.DO.Or(conds...)) -} - -func (u userRolePermissionLinkDo) Select(conds ...field.Expr) *userRolePermissionLinkDo { - return u.withDO(u.DO.Select(conds...)) -} - -func (u userRolePermissionLinkDo) Where(conds ...gen.Condition) *userRolePermissionLinkDo { - return u.withDO(u.DO.Where(conds...)) -} - -func (u userRolePermissionLinkDo) Order(conds ...field.Expr) *userRolePermissionLinkDo { - return u.withDO(u.DO.Order(conds...)) -} - -func (u userRolePermissionLinkDo) Distinct(cols ...field.Expr) *userRolePermissionLinkDo { - return u.withDO(u.DO.Distinct(cols...)) -} - -func (u userRolePermissionLinkDo) Omit(cols ...field.Expr) *userRolePermissionLinkDo { - return u.withDO(u.DO.Omit(cols...)) -} - -func (u userRolePermissionLinkDo) Join(table schema.Tabler, on ...field.Expr) *userRolePermissionLinkDo { - return u.withDO(u.DO.Join(table, on...)) -} - -func (u userRolePermissionLinkDo) LeftJoin(table schema.Tabler, on ...field.Expr) *userRolePermissionLinkDo { - return u.withDO(u.DO.LeftJoin(table, on...)) -} - -func (u userRolePermissionLinkDo) RightJoin(table schema.Tabler, on ...field.Expr) *userRolePermissionLinkDo { - return u.withDO(u.DO.RightJoin(table, on...)) -} - -func (u userRolePermissionLinkDo) Group(cols ...field.Expr) *userRolePermissionLinkDo { - return u.withDO(u.DO.Group(cols...)) -} - -func (u userRolePermissionLinkDo) Having(conds ...gen.Condition) *userRolePermissionLinkDo { - return u.withDO(u.DO.Having(conds...)) -} - -func (u userRolePermissionLinkDo) Limit(limit int) *userRolePermissionLinkDo { - return u.withDO(u.DO.Limit(limit)) -} - -func (u userRolePermissionLinkDo) Offset(offset int) *userRolePermissionLinkDo { - return u.withDO(u.DO.Offset(offset)) -} - -func (u userRolePermissionLinkDo) Scopes(funcs ...func(gen.Dao) gen.Dao) *userRolePermissionLinkDo { - return u.withDO(u.DO.Scopes(funcs...)) -} - -func (u userRolePermissionLinkDo) Unscoped() *userRolePermissionLinkDo { - return u.withDO(u.DO.Unscoped()) -} - -func (u userRolePermissionLinkDo) Create(values ...*models.UserRolePermissionLink) error { - if len(values) == 0 { - return nil - } - return u.DO.Create(values) -} - -func (u userRolePermissionLinkDo) CreateInBatches(values []*models.UserRolePermissionLink, batchSize int) error { - return u.DO.CreateInBatches(values, batchSize) -} - -// Save : !!! underlying implementation is different with GORM -// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values) -func (u userRolePermissionLinkDo) Save(values ...*models.UserRolePermissionLink) error { - if len(values) == 0 { - return nil - } - return u.DO.Save(values) -} - -func (u userRolePermissionLinkDo) First() (*models.UserRolePermissionLink, error) { - if result, err := u.DO.First(); err != nil { - return nil, err - } else { - return result.(*models.UserRolePermissionLink), nil - } -} - -func (u userRolePermissionLinkDo) Take() (*models.UserRolePermissionLink, error) { - if result, err := u.DO.Take(); err != nil { - return nil, err - } else { - return result.(*models.UserRolePermissionLink), nil - } -} - -func (u userRolePermissionLinkDo) Last() (*models.UserRolePermissionLink, error) { - if result, err := u.DO.Last(); err != nil { - return nil, err - } else { - return result.(*models.UserRolePermissionLink), nil - } -} - -func (u userRolePermissionLinkDo) Find() ([]*models.UserRolePermissionLink, error) { - result, err := u.DO.Find() - return result.([]*models.UserRolePermissionLink), err -} - -func (u userRolePermissionLinkDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.UserRolePermissionLink, err error) { - buf := make([]*models.UserRolePermissionLink, 0, batchSize) - err = u.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error { - defer func() { results = append(results, buf...) }() - return fc(tx, batch) - }) - return results, err -} - -func (u userRolePermissionLinkDo) FindInBatches(result *[]*models.UserRolePermissionLink, batchSize int, fc func(tx gen.Dao, batch int) error) error { - return u.DO.FindInBatches(result, batchSize, fc) -} - -func (u userRolePermissionLinkDo) Attrs(attrs ...field.AssignExpr) *userRolePermissionLinkDo { - return u.withDO(u.DO.Attrs(attrs...)) -} - -func (u userRolePermissionLinkDo) Assign(attrs ...field.AssignExpr) *userRolePermissionLinkDo { - return u.withDO(u.DO.Assign(attrs...)) -} - -func (u userRolePermissionLinkDo) Joins(fields ...field.RelationField) *userRolePermissionLinkDo { - for _, _f := range fields { - u = *u.withDO(u.DO.Joins(_f)) - } - return &u -} - -func (u userRolePermissionLinkDo) Preload(fields ...field.RelationField) *userRolePermissionLinkDo { - for _, _f := range fields { - u = *u.withDO(u.DO.Preload(_f)) - } - return &u -} - -func (u userRolePermissionLinkDo) FirstOrInit() (*models.UserRolePermissionLink, error) { - if result, err := u.DO.FirstOrInit(); err != nil { - return nil, err - } else { - return result.(*models.UserRolePermissionLink), nil - } -} - -func (u userRolePermissionLinkDo) FirstOrCreate() (*models.UserRolePermissionLink, error) { - if result, err := u.DO.FirstOrCreate(); err != nil { - return nil, err - } else { - return result.(*models.UserRolePermissionLink), nil - } -} - -func (u userRolePermissionLinkDo) FindByPage(offset int, limit int) (result []*models.UserRolePermissionLink, count int64, err error) { - result, err = u.Offset(offset).Limit(limit).Find() - if err != nil { - return - } - - if size := len(result); 0 < limit && 0 < size && size < limit { - count = int64(size + offset) - return - } - - count, err = u.Offset(-1).Limit(-1).Count() - return -} - -func (u userRolePermissionLinkDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) { - count, err = u.Count() - if err != nil { - return - } - - err = u.Offset(offset).Limit(limit).Scan(result) - return -} - -func (u userRolePermissionLinkDo) Scan(result interface{}) (err error) { - return u.DO.Scan(result) -} - -func (u userRolePermissionLinkDo) Delete(models ...*models.UserRolePermissionLink) (result gen.ResultInfo, err error) { - return u.DO.Delete(models) -} - -func (u *userRolePermissionLinkDo) withDO(do gen.Dao) *userRolePermissionLinkDo { - u.DO = *do.(*gen.DO) - return u -} diff --git a/web/queries/whitelist.gen.go b/web/queries/whitelist.gen.go index d5e77c3..11a8709 100644 --- a/web/queries/whitelist.gen.go +++ b/web/queries/whitelist.gen.go @@ -28,12 +28,12 @@ func newWhitelist(db *gorm.DB, opts ...gen.DOOption) whitelist { tableName := _whitelist.whitelistDo.TableName() _whitelist.ALL = field.NewAsterisk(tableName) _whitelist.ID = field.NewInt32(tableName, "id") - _whitelist.UserID = field.NewInt32(tableName, "user_id") - _whitelist.Host = field.NewString(tableName, "host") - _whitelist.Remark = field.NewString(tableName, "remark") - _whitelist.CreatedAt = field.NewField(tableName, "created_at") - _whitelist.UpdatedAt = field.NewField(tableName, "updated_at") + _whitelist.CreatedAt = field.NewTime(tableName, "created_at") + _whitelist.UpdatedAt = field.NewTime(tableName, "updated_at") _whitelist.DeletedAt = field.NewField(tableName, "deleted_at") + _whitelist.UserID = field.NewInt32(tableName, "user_id") + _whitelist.IP = field.NewField(tableName, "ip") + _whitelist.Remark = field.NewString(tableName, "remark") _whitelist.fillFieldMap() @@ -44,13 +44,13 @@ type whitelist struct { whitelistDo ALL field.Asterisk - ID field.Int32 // 白名单ID - UserID field.Int32 // 用户ID - Host field.String // IP地址 - Remark field.String // 备注 - CreatedAt field.Field // 创建时间 - UpdatedAt field.Field // 更新时间 - DeletedAt field.Field // 删除时间 + ID field.Int32 + CreatedAt field.Time + UpdatedAt field.Time + DeletedAt field.Field + UserID field.Int32 + IP field.Field + Remark field.String fieldMap map[string]field.Expr } @@ -68,12 +68,12 @@ func (w whitelist) As(alias string) *whitelist { func (w *whitelist) updateTableName(table string) *whitelist { w.ALL = field.NewAsterisk(table) w.ID = field.NewInt32(table, "id") - w.UserID = field.NewInt32(table, "user_id") - w.Host = field.NewString(table, "host") - w.Remark = field.NewString(table, "remark") - w.CreatedAt = field.NewField(table, "created_at") - w.UpdatedAt = field.NewField(table, "updated_at") + w.CreatedAt = field.NewTime(table, "created_at") + w.UpdatedAt = field.NewTime(table, "updated_at") w.DeletedAt = field.NewField(table, "deleted_at") + w.UserID = field.NewInt32(table, "user_id") + w.IP = field.NewField(table, "ip") + w.Remark = field.NewString(table, "remark") w.fillFieldMap() @@ -92,12 +92,12 @@ func (w *whitelist) GetFieldByName(fieldName string) (field.OrderExpr, bool) { func (w *whitelist) fillFieldMap() { w.fieldMap = make(map[string]field.Expr, 7) w.fieldMap["id"] = w.ID - w.fieldMap["user_id"] = w.UserID - w.fieldMap["host"] = w.Host - w.fieldMap["remark"] = w.Remark w.fieldMap["created_at"] = w.CreatedAt w.fieldMap["updated_at"] = w.UpdatedAt w.fieldMap["deleted_at"] = w.DeletedAt + w.fieldMap["user_id"] = w.UserID + w.fieldMap["ip"] = w.IP + w.fieldMap["remark"] = w.Remark } func (w whitelist) clone(db *gorm.DB) whitelist { diff --git a/web/services/bill.go b/web/services/bill.go index 5afce25..23d6bbf 100644 --- a/web/services/bill.go +++ b/web/services/bill.go @@ -1,5 +1,11 @@ package services +import ( + m "platform/web/models" + + "github.com/shopspring/decimal" +) + var Bill = &billService{} type billService struct{} @@ -7,3 +13,31 @@ type billService struct{} func (s *billService) GenNo() string { return ID.GenReadable("bil") } + +func newForRecharge(uid int32, billNo string, info string, amount decimal.Decimal, trade *m.Trade) *m.Bill { + return &m.Bill{ + UserID: uid, + BillNo: billNo, + TradeID: &trade.ID, + Type: m.BillTypeRecharge, + Info: &info, + Amount: amount, + } +} + +func newForConsume(uid int32, billNo string, info string, amount decimal.Decimal, resource *m.Resource, trade ...*m.Trade) *m.Bill { + var bill = &m.Bill{ + UserID: uid, + BillNo: billNo, + ResourceID: &resource.ID, + Type: m.BillTypeConsume, + Info: &info, + Amount: amount, + } + + if len(trade) > 0 { + bill.TradeID = &trade[0].ID + } + + return bill +} diff --git a/web/services/channel.go b/web/services/channel.go index e1dfc20..345c019 100644 --- a/web/services/channel.go +++ b/web/services/channel.go @@ -2,842 +2,34 @@ package services import ( "context" - "database/sql" - "fmt" - "log/slog" - "math" "math/rand/v2" - "platform/pkg/env" - "platform/pkg/u" + "net/netip" "platform/web/core" - channel2 "platform/web/domains/channel" - edge2 "platform/web/domains/edge" - proxy2 "platform/web/domains/proxy" - resource2 "platform/web/domains/resource" - "platform/web/events" g "platform/web/globals" - "platform/web/globals/orm" m "platform/web/models" q "platform/web/queries" - "strconv" - "strings" "time" - "github.com/gofiber/fiber/v2" - - "github.com/hibiken/asynq" "gorm.io/gen/field" - - "github.com/redis/go-redis/v9" ) -var Channel = &channelService{} +var Channel ChannelService = &channelBaiyinService{} -type channelService struct{} - -// region 删除通道 - -func (s *channelService) RemoveChannels(id []int32, userId ...int32) error { - var now = time.Now() - - err := q.Q.Transaction(func(tx *q.Query) error { - - // 查找通道 - var do = tx.Channel.Where(q.Channel.ID.In(id...)) - if len(userId) > 0 { - do.Where(q.Channel.UserID.Eq(userId[0])) - } - channels, err := tx.Channel.Where(do).Find() - if err != nil { - return core.NewBizErr("查找通道失败", err) - } - - proxyMap := make(map[int32]*m.Proxy) - proxyIds := make([]int32, 0) - resourceMap := make(map[int32]*m.Resource) - resourceIds := make([]int32, 0) - for _, channel := range channels { - if _, ok := proxyMap[channel.ProxyID]; !ok { - proxyIds = append(proxyIds, channel.ProxyID) - proxyMap[channel.ProxyID] = &m.Proxy{} - } - if _, ok := resourceMap[channel.ResourceID]; !ok { - resourceIds = append(resourceIds, channel.ResourceID) - resourceMap[channel.ResourceID] = &m.Resource{} - } - } - - // 查找资源 - resources, err := tx.Resource.Where(tx.Resource.ID.In(resourceIds...)).Find() - if err != nil { - return core.NewBizErr("查找资源失败", err) - } - for _, res := range resources { - resourceMap[res.ID] = res - } - - // 查找代理 - proxies, err := tx.Proxy.Where(q.Proxy.ID.In(proxyIds...)).Find() - if err != nil { - return core.NewBizErr("查找代理失败", err) - } - for _, proxy := range proxies { - proxyMap[proxy.ID] = proxy - } - - // 区分通道类型 - shortToRemove := make([]*m.Channel, 0) - longToRemove := make([]*m.Channel, 0) - for _, channel := range channels { - resource := resourceMap[channel.ResourceID] - switch resource2.Type(resource.Type) { - case resource2.TypeShort: - shortToRemove = append(shortToRemove, channel) - case resource2.TypeLong: - longToRemove = append(longToRemove, channel) - } - } - - // 删除指定的通道 - result, err := tx.Channel. - Where(q.Channel.ID.In(id...)). - Update(q.Channel.DeletedAt, now) - if err != nil { - return core.NewBizErr("删除通道失败", err) - } - if result.RowsAffected != int64(len(channels)) { - return core.NewBizErr("删除通道数量不匹配") - } - - // 禁用代理端口并下线用过的节点 - if env.DebugExternalChange { - var step = time.Now() - - if len(shortToRemove) > 0 { - err := removeShortChannelExternal(proxies, shortToRemove) - if err != nil { - return core.NewBizErr("提交删除通道配置失败", err) - } - } - - slog.Debug("提交删除通道配置", "step", time.Since(step)) - } - - return nil - }) - if err != nil { - return err - } - - return nil +// 通道服务 +type ChannelService interface { + CreateChannels(source netip.Addr, userId int32, resourceId int32, authWhitelist bool, authPassword bool, count int, edgeFilter ...EdgeFilter) ([]*m.Channel, error) + RemoveChannels(batch string, ids []int32) error } -func removeShortChannelExternal(proxies []*m.Proxy, channels []*m.Channel) error { - // 组织数据 - var configMap = make(map[int32][]g.PortConfigsReq, len(proxies)) - var proxyMap = make(map[int32]*m.Proxy, len(proxies)) - for _, proxy := range proxies { - configMap[proxy.ID] = make([]g.PortConfigsReq, 0) - proxyMap[proxy.ID] = proxy - } - var portMap = make(map[uint64]struct{}) - for _, channel := range channels { - var config = g.PortConfigsReq{ - Port: int(channel.ProxyPort), - Edge: &[]string{}, - AutoEdgeConfig: &g.AutoEdgeConfig{ - Count: u.P(0), - }, - Status: false, - } - configMap[channel.ProxyID] = append(configMap[channel.ProxyID], config) +// 授权方式 +type ChannelAuthType int - key := uint64(channel.ProxyID)<<32 | uint64(channel.ProxyPort) - portMap[key] = struct{}{} - } - - // 更新配置 - for proxyId, configs := range configMap { - if len(configs) == 0 { - continue - } - proxy, ok := proxyMap[proxyId] - if !ok { - return core.NewBizErr("代理不存在") - } - if proxy.Secret == nil { - return core.NewBizErr("代理未配置密钥") - } - - var secret = strings.Split(*proxy.Secret, ":") - gateway := g.NewGateway( - proxy.Host, - secret[0], - secret[1], - ) - - // 查询节点配置 - actives, err := gateway.GatewayPortActive() - if err != nil { - return core.NewBizErr("查询节点配置失败", err) - } - - // 更新节点配置 - err = gateway.GatewayPortConfigs(configs) - if err != nil { - return core.NewBizErr("提交删除通道配置失败", err) - } - - // 下线对应节点 - var edges []string - for portStr, active := range actives { - port, err := strconv.Atoi(portStr) - if err != nil { - return core.NewBizErr("端口转换失败", err) - } - key := uint64(proxyId)<<32 | uint64(port) - if _, ok := portMap[key]; ok { - edges = append(edges, active.Edge...) - } - } - if len(edges) > 0 { - _, err := g.Cloud.CloudDisconnect(g.CloudDisconnectReq{ - Uuid: proxy.Name, - Edge: edges, - }) - if err != nil { - return core.NewBizErr("下线节点失败", err) - } - } - } - - return nil -} - -// endregion - -// region 创建通道 - -func (s *channelService) CreateChannel( - c *fiber.Ctx, - userId int32, - resourceId int32, - protocol channel2.Protocol, - authType ChannelAuthType, - count int, - edgeFilter ...EdgeFilter, -) (channels []*m.Channel, err error) { - var now = time.Now() - var filter = EdgeFilter{} - if len(edgeFilter) > 0 { - filter = edgeFilter[0] - } - - var resource *ResourceInfo - err = q.Q.Transaction(func(q *q.Query) (err error) { - - // 查找套餐 - resource, err = findResource(q, resourceId, userId, count, now) - if err != nil { - return core.NewBizErr("查找套餐失败", err) - } - - // 查找白名单 - var whitelist []string - if authType == ChannelAuthTypeIp { - whitelist, err = findWhitelist(q, userId) - if err != nil { - return core.NewBizErr("查找白名单失败", err) - } - } - - // 分配节点 - var config = ChannelCreator{ - Protocol: protocol, - AuthIp: authType == ChannelAuthTypeIp, - Whitelists: whitelist, - AuthPass: authType == ChannelAuthTypePass, - } - - switch resource.Type { - case resource2.TypeShort: - config.Expiration = now.Add(time.Duration(resource.Live) * time.Second) - channels, err = assignShortChannels(q, userId, resourceId, count, config, filter, now) - case resource2.TypeLong: - config.Expiration = now.Add(time.Duration(resource.Live) * time.Hour) - channels, err = assignLongChannels(q, userId, resourceId, count, config, filter) - } - if err != nil { - return core.NewBizErr("分配通道失败", err) - } - - // 保存通道开通结果 - err = saveAssigns(q, resource, channels, now) - if err != nil { - return core.NewBizErr("保存通道失败", err) - } - - return nil - }, &sql.TxOptions{Isolation: sql.LevelRepeatableRead}) - if err != nil { - return nil, err - } - - // 定时异步删除过期通道 - var duration time.Duration - switch resource.Type { - case resource2.TypeShort: - duration = time.Duration(resource.Live) * time.Second - case resource2.TypeLong: - duration = time.Duration(resource.Live) * time.Minute - } - - var ids = make([]int32, len(channels)) - for i := range channels { - ids[i] = channels[i].ID - } - _, err = g.Asynq.Enqueue( - events.NewRemoveChannel(ids), - asynq.ProcessIn(duration), - ) - if err != nil { - return nil, core.NewBizErr("提交异步删除通道任务失败", err) - } - - // 记录通道创建日志 - slog.Info("创建通道", - slog.Int("user_id", int(userId)), - slog.Int("resource_id", int(resourceId)), - slog.Int("count", count), - slog.String("prov", filter.Prov), - slog.String("city", filter.City), - slog.String("isp", filter.Isp), - slog.String("ip", c.IP()), - slog.Time("time", now), - ) - - return channels, nil -} - -func findResource(q *q.Query, resourceId int32, userId int32, count int, now time.Time) (*ResourceInfo, error) { - - resource, err := q.Resource. - Preload( - q.Resource.Short, - q.Resource.Long, - ). - Where( - q.Resource.ID.Eq(resourceId), - q.Resource.UserID.Eq(userId), - ). - Take() - if err != nil { - return nil, ErrResourceNotExist - } - - var info = &ResourceInfo{ - Id: resource.ID, - Active: resource.Active, - Type: resource2.Type(resource.Type), - } - - switch resource2.Type(resource.Type) { - case resource2.TypeShort: - var sub = resource.Short - var dailyLast = time.Time{} - if sub.DailyLast != nil { - dailyLast = time.Time(*sub.DailyLast) - } - var expire = time.Time{} - if sub.Expire != nil { - expire = time.Time(*sub.Expire) - } - var quota int32 - if sub.Quota != nil { - quota = *sub.Quota - } - info.Mode = resource2.Mode(sub.Type) - info.Live = sub.Live - info.DailyLimit = sub.DailyLimit - info.DailyUsed = sub.DailyUsed - info.DailyLast = dailyLast - info.Expire = expire - info.Quota = quota - info.Used = sub.Used - - case resource2.TypeLong: - var sub = resource.Long - var dailyLast = time.Time{} - if sub.DailyLast != nil { - dailyLast = time.Time(*sub.DailyLast) - } - var expire = time.Time{} - if sub.Expire != nil { - expire = time.Time(*sub.Expire) - } - var quota int32 - if sub.Quota != nil { - quota = *sub.Quota - } - info.Mode = resource2.Mode(sub.Type) - info.Live = sub.Live - info.DailyLimit = sub.DailyLimit - info.DailyUsed = sub.DailyUsed - info.DailyLast = dailyLast - info.Expire = expire - info.Quota = quota - info.Used = sub.Used - } - - // 检查套餐状态 - if !info.Active { - return nil, ErrResourceInvalid - } - - // 检查套餐使用情况 - switch info.Mode { - default: - return nil, core.NewBizErr("不支持的套餐模式") - - // 包时 - case resource2.ModeTime: - // 检查过期时间 - if info.Expire.Before(now) { - return nil, ErrResourceExpired - } - // 检查每日限额 - used := 0 - if now.Format("2006-01-02") == info.DailyLast.Format("2006-01-02") { - used = int(info.DailyUsed) - } - excess := used+count > int(info.DailyLimit) - if excess { - return nil, ErrResourceDailyLimit - } - - // 包量 - case resource2.ModeCount: - // 检查可用配额 - if int(info.Quota)-int(info.Used) < count { - return nil, ErrResourceExhausted - } - } - - return info, nil -} - -func findWhitelist(q *q.Query, userId int32) ([]string, error) { - var whitelist []string - err := q.Whitelist. - Where(q.Whitelist.UserID.Eq(userId)). - Select(q.Whitelist.Host). - Scan(&whitelist) - if err != nil { - return nil, core.NewBizErr("查询白名单失败", err) - } - if len(whitelist) == 0 { - return nil, core.NewBizErr("没有配置白名单") - } - - return whitelist, nil -} - -func assignShortChannels(q *q.Query, userId int32, resourceId int32, count int, config ChannelCreator, filter EdgeFilter, now time.Time) ([]*m.Channel, error) { - - // 查找网关 - proxies, err := q.Proxy. - Where(q.Proxy.Type.Eq(int32(proxy2.TypeThirdParty))). - Find() - if err != nil { - return nil, core.NewBizErr("查找网关失败", err) - } - - // 查找已使用的节点 - var proxyIds = make([]int32, len(proxies)) - for i, proxy := range proxies { - proxyIds[i] = proxy.ID - } - allChannels, err := q.Channel. - Select( - q.Channel.ProxyID, - q.Channel.ProxyPort). - Where( - q.Channel.ProxyID.In(proxyIds...), - q.Channel.Expiration.Gt(orm.LocalDateTime(now))). - Group( - q.Channel.ProxyPort, - q.Channel.ProxyID). - Find() - if err != nil { - return nil, core.NewBizErr("查找已使用的节点失败", err) - } - - // 查询已配置的节点 - remoteConfigs, err := g.Cloud.CloudAutoQuery() - if err != nil { - return nil, core.NewBizErr("查询远端节点配置失败", err) - } - - // 统计已用节点量与端口查找表 - var proxyUses = make(map[int32]int, len(allChannels)) - var portsMap = make(map[uint64]struct{}) - for _, channel := range allChannels { - proxyUses[channel.ProxyID]++ - key := uint64(channel.ProxyID)<<32 | uint64(channel.ProxyPort) - portsMap[key] = struct{}{} - } - - // 计算分配额度 - var total = len(allChannels) + count - var avg = int(math.Ceil(float64(total) / float64(len(proxies)))) - - // 分配节点 - var newChannels = make([]*m.Channel, 0, count) - for _, proxy := range proxies { - - var prev = proxyUses[proxy.ID] - var next = int(math.Max(float64(prev), float64(int(math.Min(float64(avg), float64(total)))))) - total -= next - - var acc = next - prev - if acc <= 0 { - continue - } - - // 获取远端配置量 - var count = 0 - remoteConfig, ok := remoteConfigs[proxy.Name] - if ok { - for _, config := range remoteConfig { - if config.Isp == filter.Isp && config.City == filter.City && config.Province == filter.Prov { - count = config.Count - break - } - } - } - - // 提交节点配置 - if env.DebugExternalChange && next > count { - var step = time.Now() - - var multiple float64 = 2 // 扩张倍数 - var newConfig = g.AutoConfig{ - Province: filter.Prov, - City: filter.City, - Isp: filter.Isp, - Count: int(math.Ceil(float64(next) * multiple)), - } - - var newConfigs []g.AutoConfig - if count == 0 { - newConfigs = append(newConfigs, newConfig) - } else { - newConfigs = make([]g.AutoConfig, len(remoteConfig)) - for i, config := range remoteConfig { - if config.Isp == filter.Isp && config.City == filter.City && config.Province == filter.Prov { - count = config.Count - break - } - newConfigs[i] = config - } - } - - err := g.Cloud.CloudConnect(g.CloudConnectReq{ - Uuid: proxy.Name, - Edge: nil, - AutoConfig: newConfigs, - }) - if err != nil { - return nil, core.NewBizErr("提交节点配置失败", err) - } - - slog.Debug("提交节点配置", - slog.Duration("step", time.Since(step)), - slog.String("proxy", proxy.Name), - slog.Int("used", prev), - slog.Int("count", next), - ) - } - - // 筛选可用端口 - var portConfigs = make([]g.PortConfigsReq, 0, acc) - for port := 10000; port < 20000 && len(portConfigs) < acc; port++ { - // 跳过存在的端口 - key := uint64(proxy.ID)<<32 | uint64(port) - _, ok := portsMap[key] - if ok { - continue - } - - // 配置新端口 - var portConf = g.PortConfigsReq{ - Port: port, - Edge: nil, - Status: true, - AutoEdgeConfig: &g.AutoEdgeConfig{ - Province: filter.Prov, - City: filter.City, - Isp: filter.Isp, - Count: u.P(1), - PacketLoss: 30, - }, - } - var newChannel = &m.Channel{ - UserID: userId, - ProxyID: proxy.ID, - ResourceID: resourceId, - ProxyHost: proxy.Host, - ProxyPort: int32(port), - Protocol: u.P(int32(config.Protocol)), - Expiration: orm.LocalDateTime(config.Expiration), - } - - if config.AuthIp { - portConf.Whitelist = &config.Whitelists - newChannel.AuthIP = true - newChannel.Whitelists = u.P(strings.Join(config.Whitelists, ",")) - } - - if config.AuthPass { - username, password := genPassPair() - portConf.Userpass = u.P(fmt.Sprintf("%s:%s", username, password)) - newChannel.AuthPass = true - newChannel.Username = &username - newChannel.Password = &password - } - - portConfigs = append(portConfigs, portConf) - newChannels = append(newChannels, newChannel) - } - if len(portConfigs) < acc { - return nil, core.NewBizErr("网关端口数量到达上限,无法分配") - } - - // 提交端口配置 - if env.DebugExternalChange { - var step = time.Now() - if proxy.Secret == nil { - return nil, core.NewBizErr("代理未配置密钥") - } - var secret = strings.Split(*proxy.Secret, ":") - gateway := g.NewGateway( - proxy.Host, - secret[0], - secret[1], - ) - err = gateway.GatewayPortConfigs(portConfigs) - if err != nil { - return nil, core.NewBizErr("提交端口配置失败", err) - } - - slog.Debug("提交端口配置", "step", time.Since(step)) - } - } - - if len(newChannels) != count { - return nil, core.NewBizErr("分配节点失败") - } - - return newChannels, nil -} - -func assignLongChannels(q *q.Query, userId int32, resourceId int32, count int, config ChannelCreator, filter EdgeFilter) ([]*m.Channel, error) { - - // 查询符合条件的节点,根据 channel 统计使用次数 - var edges = make([]struct { - m.Edge - Count int - ProxyHost string - ProxySecret string - }, 0) - - do := q.Edge.Where(q.Edge.Status.Eq(1)) - if filter.Prov != "" { - do = do.Where(q.Edge.Prov.Eq(filter.Prov)) - } - if filter.City != "" { - do = do.Where(q.Edge.City.Eq(filter.City)) - } - if filter.Isp != "" { - do = do.Where(q.Edge.Isp.Eq(int32(edge2.ISPFromStr(filter.Isp)))) - } - - err := q.Edge. - LeftJoin(q.Channel, q.Channel.EdgeID.EqCol(q.Edge.ID)). - LeftJoin(q.Proxy, q.Proxy.ID.EqCol(q.Edge.ProxyID)). - Select( - q.Edge.ALL, - q.Channel.ALL.Count().As("count"), - q.Proxy.Host.As("proxy_host"), - q.Proxy.Secret.As("proxy_secret"), - ). - Group(q.Edge.ID, q.Proxy.Host, q.Proxy.Secret). - Where(do). - Order(field.NewField("", "count").Asc()). - Limit(count). - Scan(&edges) - if err != nil { - return nil, core.NewBizErr("查询符合条件的节点失败", err) - } - if len(edges) == 0 { - return nil, ErrEdgesNoAvailable - } - - // 计算分配负载(考虑去重,维护一个节点使用记录表,优先分配未使用节点,达到算法额定负载后再选择负载最少的节点) - var total = count - for _, edge := range edges { - total += edge.Count - } - var avg = int(math.Ceil(float64(total) / float64(len(edges)))) - - var channels = make([]*m.Channel, 0, count) - var proxies = make(map[int32]*m.Proxy) - var reqs = make(map[int32][]*g.ProxyPermitConfig) - for _, edge := range edges { - if edge.ProxyID == nil || edge.ProxyPort == nil { - return nil, core.NewBizErr("节点配置不完整,缺少代理信息") - } - if _, ok := proxies[*edge.ProxyID]; !ok { - proxies[*edge.ProxyID] = &m.Proxy{ - ID: *edge.ProxyID, - Host: edge.ProxyHost, - Secret: &edge.ProxySecret, - } - } - - prev := edge.Count - next := int(math.Max(float64(prev), float64(int(math.Min(float64(avg), float64(total)))))) - total -= next - - acc := next - prev - if acc <= 0 { - continue - } - - for range acc { - var channel = &m.Channel{ - UserID: userId, - ProxyID: *edge.ProxyID, - EdgeID: &edge.ID, - ResourceID: resourceId, - Protocol: u.P(int32(config.Protocol)), - AuthIP: config.AuthIp, - AuthPass: config.AuthPass, - Expiration: orm.LocalDateTime(config.Expiration), - ProxyHost: edge.ProxyHost, - ProxyPort: *edge.ProxyPort, - } - if config.AuthIp { - channel.Whitelists = u.P(strings.Join(config.Whitelists, ",")) - } - if config.AuthPass { - username, password := genPassPair() - channel.Username = &username - channel.Password = &password - } - channels = append(channels, channel) - - req := &g.ProxyPermitConfig{ - Id: *channel.EdgeID, - Expire: time.Time(channel.Expiration), - } - - if channel.AuthIP { - req.Whitelists = &config.Whitelists - } - - if channel.AuthPass { - req.Username = channel.Username - req.Password = channel.Password - } - - reqs[*edge.ProxyID] = append(reqs[*edge.ProxyID], req) - } - } - - // 发送配置到网关 - if env.DebugExternalChange { - var step = time.Now() - for id, reqs := range reqs { - proxy := proxies[id] - err := g.Proxy.Permit(proxy.Host, *proxy.Secret, reqs) - if err != nil { - return nil, core.NewBizErr("提交端口配置失败", err) - } - } - slog.Debug("提交端口配置", "step", time.Since(step)) - } - - return channels, nil -} - -func saveAssigns(q *q.Query, resource *ResourceInfo, channels []*m.Channel, now time.Time) (err error) { - if len(channels) == 0 { - return nil - } - - // 缓存通道数据 - pipe := g.Redis.TxPipeline() - - zList := make([]redis.Z, 0, len(channels)) - for _, channel := range channels { - expiration := time.Time(channel.Expiration) - zList = append(zList, redis.Z{ - Score: float64(expiration.Unix()), - Member: channel.ID, - }) - } - pipe.ZAdd(context.Background(), "tasks:channel", zList...) - - _, err = pipe.Exec(context.Background()) - if err != nil { - return core.NewBizErr("缓存通道数据失败", err) - } - - // 保存通道 - err = q.Channel. - Create(channels...) - if err != nil { - return core.NewBizErr("保存通道失败", err) - } - - // 更新套餐使用记录 - var count = len(channels) - var last = resource.DailyLast - var dailyUsed int32 - if now.Year() != last.Year() || now.Month() != last.Month() || now.Day() != last.Day() { - dailyUsed = int32(count) - } else { - dailyUsed = resource.DailyUsed + int32(count) - } - - switch resource.Type { - case resource2.TypeShort: - _, err = q.ResourceShort. - Where(q.ResourceShort.ResourceID.Eq(resource.Id)). - UpdateSimple( - q.ResourceShort.Used.Add(int32(count)), - q.ResourceShort.DailyUsed.Value(dailyUsed), - q.ResourceShort.DailyLast.Value(orm.LocalDateTime(now)), - ) - case resource2.TypeLong: - _, err = q.ResourceLong. - Where(q.ResourceLong.ResourceID.Eq(resource.Id)). - UpdateSimple( - q.ResourceLong.Used.Add(int32(count)), - q.ResourceLong.DailyUsed.Value(dailyUsed), - q.ResourceLong.DailyLast.Value(orm.LocalDateTime(now)), - ) - } - if err != nil { - return core.NewBizErr("更新套餐使用记录失败", err) - } - - return nil -} +const ( + ChannelAuthTypeIp ChannelAuthType = iota + 1 + ChannelAuthTypePass +) func genPassPair() (string, string) { - //goland:noinspection SpellCheckingInspection var alphabet = []rune("abcdefghjkmnpqrstuvwxyz") var numbers = []rune("23456789") @@ -855,29 +47,112 @@ func genPassPair() (string, string) { return string(username), string(password) } -// endregion +func findResource(q *q.Query, resourceId int32, userId int32, count int, now time.Time) (*ResourceView, error) { + resource, err := q.Resource. + Preload(field.Associations). + Where( + q.Resource.ID.Eq(resourceId), + q.Resource.UserID.Eq(userId), + q.Resource.Active.Is(true), + ). + Take() + if err != nil { + return nil, ErrResourceNotExist + } -type ChannelAuthType int + var info = &ResourceView{ + Id: resource.ID, + Active: resource.Active, + Type: resource.Type, + } -const ( - ChannelAuthTypeIp ChannelAuthType = iota + 1 - ChannelAuthTypePass -) + switch resource.Type { + case m.ResourceTypeShort: + var sub = resource.Short + var dailyLast = time.Time{} + if sub.DailyLast != nil { + dailyLast = time.Time(*sub.DailyLast) + } + var expire = time.Time{} + if sub.Expire != nil { + expire = time.Time(*sub.Expire) + } + var quota int32 + if sub.Quota != nil { + quota = *sub.Quota + } + info.Mode = sub.Type + info.Live = time.Duration(sub.Live) * time.Second + info.DailyLimit = sub.DailyLimit + info.DailyUsed = sub.DailyUsed + info.DailyLast = dailyLast + info.Expire = expire + info.Quota = quota + info.Used = sub.Used -type ChannelCreator struct { - Protocol channel2.Protocol - AuthIp bool - Whitelists []string - AuthPass bool - Expiration time.Time + case m.ResourceTypeLong: + var sub = resource.Long + var dailyLast = time.Time{} + if sub.DailyLast != nil { + dailyLast = time.Time(*sub.DailyLast) + } + var expire = time.Time{} + if sub.Expire != nil { + expire = time.Time(*sub.Expire) + } + var quota int32 + if sub.Quota != nil { + quota = *sub.Quota + } + info.Mode = sub.Type + info.Live = time.Duration(sub.Live) * time.Hour * 24 + info.DailyLimit = sub.DailyLimit + info.DailyUsed = sub.DailyUsed + info.DailyLast = dailyLast + info.Expire = expire + info.Quota = quota + info.Used = sub.Used + } + + // 检查套餐使用情况 + switch info.Mode { + default: + return nil, core.NewBizErr("不支持的套餐模式") + + // 包时 + case m.ResourceModeTime: + // 检查过期时间 + if info.Expire.Before(now) { + return nil, ErrResourceExpired + } + // 检查每日限额 + used := 0 + if now.Format("2006-01-02") == info.DailyLast.Format("2006-01-02") { + used = int(info.DailyUsed) + } + excess := used+count > int(info.DailyLimit) + if excess { + return nil, ErrResourceDailyLimit + } + + // 包量 + case m.ResourceModeQuota: + // 检查可用配额 + if int(info.Quota)-int(info.Used) < count { + return nil, ErrResourceExhausted + } + } + + return info, nil } -type ResourceInfo struct { +// ResourceView 套餐数据的简化视图,便于直接获取主要数据 +type ResourceView struct { Id int32 Active bool - Type resource2.Type - Mode resource2.Mode - Live int32 + Type m.ResourceType + Mode m.ResourceMode + Live time.Duration DailyLimit int32 DailyUsed int32 DailyLast time.Time @@ -886,6 +161,90 @@ type ResourceInfo struct { Expire time.Time } +func lockChans(batch string, count int, expire time.Time) ([]netip.AddrPort, error) { + results, err := g.Redis.Eval( + context.Background(), + RedisScriptLockChans, + []string{"channel"}, + batch, + count, + expire.Unix(), + ).Result() + if err != nil { + return nil, core.NewBizErr("获取通道失败", err) + } + + chans, ok := results.([]string) + if !ok { + return nil, core.NewServErr("转换通道数据失败") + } + + addrs := make([]netip.AddrPort, len(chans)) + for i, ch := range chans { + addr, err := netip.ParseAddrPort(ch) + if err != nil { + return nil, core.NewServErr("解析通道数据失败", err) + } + addrs[i] = addr + } + + return addrs, nil +} + +var RedisScriptLockChans = ` +local key = KEYS[1] +local batch = ARGV[1] +local count = tonumber(ARGV[2]) +local expire = tonumber(ARGV[3]) + +local chans_key = key .. ":chans" +local lease_key = key .. ":lease:" .. batch + +if redis.call("SCARD", key) < count then + return nil +end + +local ports = redis.call("SPOP", key, count) + +redis.call("SET", lease_key, cjson.encode({ + p = ports, + e = expire +})) + +return ports +` + +func freeChans(batch string, chans []string) error { + err := g.Redis.Eval( + context.Background(), + RedisScriptFreeChans, + []string{"channel"}, + batch, + chans, + ).Err() + if err != nil { + return core.NewBizErr("释放通道失败", err) + } + + return nil +} + +var RedisScriptFreeChans = ` +local key = KEYS[1] +local batch = ARGV[1] +local chans = ARGV[2] + +local chans_key = key .. ":chans" +local lease_key = key .. ":lease:" .. batch + +redis.call("SADD", chans_key, unpack(chans)) + +redis.call("DEL", lease_key) + +return chans +` + +// 错误信息 var ( ErrResourceNotExist = core.NewBizErr("套餐不存在") ErrResourceInvalid = core.NewBizErr("套餐不可用") diff --git a/web/services/channel_baiyin.go b/web/services/channel_baiyin.go new file mode 100644 index 0000000..7ae4499 --- /dev/null +++ b/web/services/channel_baiyin.go @@ -0,0 +1,308 @@ +package services + +import ( + "database/sql/driver" + "encoding/json" + "fmt" + "log/slog" + "net/netip" + "platform/pkg/env" + "platform/pkg/u" + "platform/web/core" + e "platform/web/events" + g "platform/web/globals" + "platform/web/globals/orm" + m "platform/web/models" + q "platform/web/queries" + "strings" + "time" + + "github.com/hibiken/asynq" +) + +type channelBaiyinService struct{} + +func (s *channelBaiyinService) CreateChannels(source netip.Addr, userId int32, resourceId int32, authWhitelist bool, authPassword bool, count int, edgeFilter ...EdgeFilter) ([]*m.Channel, error) { + var filter *EdgeFilter = nil + if len(edgeFilter) > 0 { + filter = &edgeFilter[0] + } + + now := time.Now() + batch := ID.GenReadable("bat") + + // 获取用户白名单并检查用户 ip 地址 + whitelists, err := q.Whitelist.Where( + q.Whitelist.UserID.Eq(userId), + ).Find() + if err != nil { + return nil, err + } + + whitelistIPs := make([]string, len(whitelists)) + pass := false + for i, item := range whitelists { + whitelistIPs[i] = item.IP.String() + if item.IP.Compare(source) != 0 { + pass = true + } + } + if !pass { + return nil, core.NewBizErr("IP 地址不在白名单内") + } + + // 获取用户套餐并检查 + resource, err := findResource(q.Q, resourceId, userId, count, now) + if err != nil { + return nil, err + } + expire := now.Add(resource.Live) + + // 获取可用通道 + chans, err := lockChans(batch, count, expire) + if err != nil { + return nil, err + } + + // 获取对应代理 + ips := make([]driver.Valuer, 0) + findProxy := make(map[orm.Inet]*m.Proxy) + for _, ch := range chans { + ip := orm.Inet{Addr: ch.Addr()} + if _, ok := findProxy[ip]; !ok { + ips = append(ips, ip) + findProxy[ip] = nil + } + } + + proxies, err := q.Proxy.Where( + q.Proxy.Type.Eq(int(m.ProxyTypeBaiYin)), + q.Proxy.Status.Eq(int(m.ProxyStatusOnline)), + q.Proxy.IP.In(ips...), + ).Find() + if err != nil { + return nil, core.NewBizErr("获取代理失败", err) + } + + groups := make(map[*m.Proxy][]*m.Channel) + for _, proxy := range proxies { + findProxy[proxy.IP] = proxy + groups[proxy] = make([]*m.Channel, 0) + } + + // 准备通道数据 + actions := make([]*m.LogsUserUsage, len(chans)) + channels := make([]*m.Channel, len(chans)) + for i, ch := range chans { + if err != nil { + return nil, core.NewBizErr("解析通道地址失败", err) + } + + // 使用记录 + actions[i] = &m.LogsUserUsage{ + UserID: userId, + ResourceID: resourceId, + Count: int32(count), + ISP: u.P(filter.Isp.String()), + Prov: filter.Prov, + City: filter.City, + } + + // 通道数据 + inet := orm.Inet{Addr: ch.Addr()} + channels[i] = &m.Channel{ + UserID: userId, + ResourceID: resourceId, + BatchNo: batch, + ProxyID: findProxy[inet].ID, + Port: ch.Port(), + FilterISP: filter.Isp, + FilterProv: filter.Prov, + FilterCity: filter.City, + ExpiredAt: expire, + } + if authWhitelist { + channels[i].Whitelists = &orm.Slice[string]{Arr: whitelistIPs} + } + if authPassword { + username, password := genPassPair() + channels[i].Username = &username + channels[i].Password = &password + } + + // 关联代理 + proxy := findProxy[inet] + groups[proxy] = append(groups[proxy], channels[i]) + } + + // 保存数据 + err = q.Q.Transaction(func(q *q.Query) error { + + // 更新套餐用量 + used := int32(count) + if u.IsSameDate(now, resource.DailyLast) { + used += resource.DailyUsed + } + + switch resource.Type { + case m.ResourceTypeShort: + _, err = q.ResourceShort. + Where( + q.ResourceShort.ResourceID.Eq(resource.Id), + q.ResourceShort.Used.Eq(resource.Used), + q.ResourceShort.DailyUsed.Eq(resource.DailyUsed), + q.ResourceShort.DailyLast.Eq(resource.DailyLast), + ). + UpdateSimple( + q.ResourceShort.Used.Add(int32(count)), + q.ResourceShort.DailyUsed.Value(used), + q.ResourceShort.DailyLast.Value(now), + ) + case m.ResourceTypeLong: + _, err = q.ResourceLong. + Where( + q.ResourceLong.ResourceID.Eq(resource.Id), + q.ResourceLong.Used.Eq(resource.Used), + q.ResourceLong.DailyUsed.Eq(resource.DailyUsed), + q.ResourceLong.DailyLast.Eq(resource.DailyLast), + ). + UpdateSimple( + q.ResourceLong.Used.Add(int32(count)), + q.ResourceLong.DailyUsed.Value(used), + q.ResourceLong.DailyLast.Value(now), + ) + } + if err != nil { + return core.NewServErr("更新套餐使用记录失败", err) + } + + // 保存通道和分配记录 + err = q.Channel.Create(channels...) + if err != nil { + return core.NewServErr("保存通道失败", err) + } + + err = q.LogsUserUsage.Create(actions...) + if err != nil { + return core.NewServErr("保存用户使用记录失败", err) + } + + return nil + }) + if err != nil { + return nil, err + } + + // 提交异步任务关闭通道 + _, err = g.Asynq.Enqueue( + e.NewRemoveChannel(e.RemoveChannelData{ + Batch: batch, + IDs: core.GetIDs(channels), + }), + asynq.ProcessAt(expire), + ) + if err != nil { + return nil, core.NewServErr("提交关闭通道任务失败", err) + } + + // 提交配置 + for proxy, chanels := range groups { + secret := strings.Split(u.Z(proxy.Secret), ":") + gateway := g.NewGateway(proxy.IP.String(), secret[0], secret[1]) + + configs := make([]g.PortConfigsReq, len(chanels)) + for i, channel := range chanels { + configs[i] = g.PortConfigsReq{ + Port: int(channel.Port), + Status: true, + AutoEdgeConfig: &g.AutoEdgeConfig{ + Isp: channel.FilterISP.String(), + Province: u.Z(channel.FilterProv), + City: u.Z(channel.FilterCity), + }, + } + if authWhitelist { + configs[i].Whitelist = &channel.Whitelists.Arr + } + if authPassword { + configs[i].Userpass = u.P(fmt.Sprintf("%s:%s", *channel.Username, *channel.Password)) + } + } + + if env.DebugExternalChange { + err := gateway.GatewayPortConfigs(configs) + if err != nil { + return nil, core.NewServErr(fmt.Sprintf("配置代理 %s 端口失败", proxy.IP.String()), err) + } + } else { + bytes, _ := json.Marshal(configs) + slog.Debug("提交代理端口配置", "config", string(bytes)) + } + } + + return channels, nil +} + +func (s *channelBaiyinService) RemoveChannels(batch string, ids []int32) error { + + // 获取连接数据 + channels, err := q.Channel.Debug(). + Preload(q.Channel.Proxy). + Where(q.Channel.ID.In(ids...)). + Find() + if err != nil { + return core.NewServErr("获取通道数据失败", err) + } + if len(channels) != len(ids) { + return core.NewServErr("获取通道数据不完整", err) + } + + proxies := make(map[string]*m.Proxy, len(channels)) + groups := make(map[string][]*m.Channel, len(channels)) + chans := make([]string, len(channels)) + for i, channel := range channels { + ip := channel.Proxy.IP.String() + groups[ip] = append(groups[ip], channel) + proxies[ip] = &channel.Proxy + chans[i] = fmt.Sprintf("%s:%d", ip, channel.Port) + } + + addrs := make([]netip.AddrPort, len(channels)) + for i, channel := range channels { + addrs[i] = netip.AddrPortFrom(channel.Proxy.IP.Addr, channel.Port) + } + + // 释放端口 + err = freeChans(batch, chans) + if err != nil { + return core.NewServErr("释放端口失败", err) + } + + // 清空配置 + for ip, channels := range groups { + proxy := proxies[ip] + secret := strings.Split(*proxy.Secret, ":") + gateway := g.NewGateway(ip, secret[0], secret[1]) + + configs := make([]g.PortConfigsReq, len(channels)) + for i, channel := range channels { + configs[i] = g.PortConfigsReq{ + Status: false, + Port: int(channel.Port), + Edge: &[]string{}, + } + } + + if env.DebugExternalChange { + err := gateway.GatewayPortConfigs(configs) + if err != nil { + return core.NewServErr(fmt.Sprintf("清空代理 %s 端口配置失败", proxy.IP.String()), err) + } + } else { + bytes, _ := json.Marshal(configs) + slog.Debug("清除代理端口配置", "config", bytes) + } + } + + return nil +} diff --git a/web/services/edge.go b/web/services/edge.go index 920cd10..ab35c2b 100644 --- a/web/services/edge.go +++ b/web/services/edge.go @@ -1,7 +1,6 @@ package services import ( - edge2 "platform/web/domains/edge" m "platform/web/models" q "platform/web/queries" ) @@ -12,14 +11,14 @@ type edgeService struct{} func (s *edgeService) AllEdges(count int, filter EdgeFilter) ([]*m.Edge, error) { do := q.Edge.Where() - if filter.Prov != "" { - do = do.Where(q.Edge.Prov.Eq(filter.Prov)) + if filter.Prov != nil { + do = do.Where(q.Edge.Prov.Eq(*filter.Prov)) } - if filter.City != "" { - do = do.Where(q.Edge.City.Eq(filter.City)) + if filter.City != nil { + do = do.Where(q.Edge.City.Eq(*filter.City)) } - if filter.Isp != "" { - do = do.Where(q.Edge.Isp.Eq(int32(edge2.ISPFromStr(filter.Isp)))) + if filter.Isp != nil { + do = do.Where(q.Edge.ISP.Eq(int(*filter.Isp))) } if count > 0 { do = do.Limit(count) @@ -33,11 +32,8 @@ func (s *edgeService) AllEdges(count int, filter EdgeFilter) ([]*m.Edge, error) return edges, nil } -type EdgeInfo struct { -} - type EdgeFilter struct { - Isp string `json:"isp"` - Prov string `json:"prov"` - City string `json:"city"` + Isp *m.EdgeISP `json:"isp"` + Prov *string `json:"prov"` + City *string `json:"city"` } diff --git a/web/services/proxy.go b/web/services/proxy.go new file mode 100644 index 0000000..de57ee5 --- /dev/null +++ b/web/services/proxy.go @@ -0,0 +1,25 @@ +package services + +import ( + m "platform/web/models" + q "platform/web/queries" + "time" +) + +var Proxy = &proxyService{} + +type proxyService struct{} + +func (s *proxyService) AllProxies(proxyType m.ProxyType, channels bool) ([]*m.Proxy, error) { + proxies, err := q.Proxy.Where( + q.Proxy.Type.Eq(int(proxyType)), + q.Proxy.Status.Eq(int(m.ProxyStatusOnline)), + ).Preload( + q.Proxy.Channels.On(q.Channel.ExpiredAt.Gte(time.Now())), + ).Find() + if err != nil { + return nil, err + } + + return proxies, nil +} diff --git a/web/services/resource.go b/web/services/resource.go index 3064621..48f4145 100644 --- a/web/services/resource.go +++ b/web/services/resource.go @@ -5,11 +5,7 @@ import ( "fmt" "platform/pkg/u" "platform/web/core" - bill2 "platform/web/domains/bill" - resource2 "platform/web/domains/resource" - trade2 "platform/web/domains/trade" g "platform/web/globals" - "platform/web/globals/orm" m "platform/web/models" q "platform/web/queries" "time" @@ -24,7 +20,7 @@ type resourceService struct{} func (s *resourceService) CreateResourceByBalance(uid int32, now time.Time, data *CreateResourceData) error { return g.Redsync.WithLock(userBalanceKey(uid), func() error { return q.Q.Transaction(func(q *q.Query) error { - // 检查用户 + // 找到用户 user, err := q.User. Where(q.User.ID.Eq(uid)). Take() @@ -38,22 +34,22 @@ func (s *resourceService) CreateResourceByBalance(uid int32, now time.Time, data return ErrBalanceNotEnough } + // 更新用户余额 + _, err = q.User. + Where(q.User.ID.Eq(uid), q.User.Balance.Eq(user.Balance)). + UpdateSimple(q.User.Balance.Value(amount)) + if err != nil { + return core.NewServErr("更新用户余额失败", err) + } + // 保存套餐 resource, err := createResource(q, uid, now, data) if err != nil { return core.NewServErr("创建套餐失败", err) } - // 更新用户余额 - _, err = q.User. - Where(q.User.ID.Eq(uid)). - UpdateSimple(q.User.Balance.Value(amount)) - if err != nil { - return core.NewServErr("更新用户余额失败", err) - } - // 生成账单 - err = q.Bill.Create(bill2.NewForConsume(uid, Bill.GenNo(), data.GetSubject(), data.GetAmount(), resource)) + err = q.Bill.Create(newForConsume(uid, Bill.GenNo(), data.GetSubject(), data.GetAmount(), resource)) if err != nil { return core.NewServErr("生成账单失败", err) } @@ -73,7 +69,7 @@ func (s *resourceService) CreateResourceByTrade(uid int32, now time.Time, data * } // 生成账单 - err = q.Bill.Create(bill2.NewForConsume(uid, Bill.GenNo(), data.GetSubject(), data.GetAmount(), resource, trade)) + err = q.Bill.Create(newForConsume(uid, Bill.GenNo(), data.GetSubject(), data.GetAmount(), resource, trade)) if err != nil { return core.NewServErr("生成账单失败", err) } @@ -89,38 +85,37 @@ func createResource(q *q.Query, uid int32, now time.Time, data *CreateResourceDa UserID: uid, ResourceNo: u.P(ID.GenReadable("res")), Active: true, + Type: data.Type, } switch data.Type { // 短效套餐 - case resource2.TypeShort: + case m.ResourceTypeShort: var short = data.Short if short == nil { return nil, core.NewBizErr("短效套餐数据不能为空") } var duration = time.Duration(short.Expire) * 24 * time.Hour - resource.Type = int32(resource2.TypeShort) resource.Short = &m.ResourceShort{ Type: short.Mode, Live: short.Live, Quota: &short.Quota, - Expire: u.P(orm.LocalDateTime(now.Add(duration))), + Expire: u.P(now.Add(duration)), DailyLimit: short.DailyLimit, } // 长效套餐 - case resource2.TypeLong: + case m.ResourceTypeLong: var long = data.Long if long == nil { return nil, core.NewBizErr("长效套餐数据不能为空") } var duration = time.Duration(long.Expire) * 24 * time.Hour - resource.Type = int32(resource2.TypeLong) resource.Long = &m.ResourceLong{ Type: long.Mode, Live: long.Live, Quota: &long.Quota, - Expire: u.P(orm.LocalDateTime(now.Add(duration))), + Expire: u.P(now.Add(duration)), DailyLimit: long.DailyLimit, } default: @@ -136,42 +131,42 @@ func createResource(q *q.Query, uid int32, now time.Time, data *CreateResourceDa } type CreateResourceData struct { - Type resource2.Type `json:"type" validate:"required"` + Type m.ResourceType `json:"type" validate:"required"` Short *CreateShortResourceData `json:"short,omitempty"` Long *CreateLongResourceData `json:"long,omitempty"` } type CreateShortResourceData struct { - Live int32 `json:"live" validate:"required,min=180"` - Mode int32 `json:"mode" validate:"required"` - Expire int32 `json:"expire"` - DailyLimit int32 `json:"daily_limit" validate:"min=2000"` - Quota int32 `json:"quota" validate:"min=10000"` + Live int32 `json:"live" validate:"required,min=180"` + Mode m.ResourceMode `json:"mode" validate:"required"` + Expire int32 `json:"expire"` + DailyLimit int32 `json:"daily_limit" validate:"min=2000"` + Quota int32 `json:"quota" validate:"min=10000"` name string price *decimal.Decimal } type CreateLongResourceData struct { - Live int32 `json:"live" validate:"required,oneof=1 4 8 12 24"` - Mode int32 `json:"mode" validate:"required,oneof=1 2"` - Expire int32 `json:"expire"` - DailyLimit int32 `json:"daily_limit" validate:"min=100"` - Quota int32 `json:"quota" validate:"min=500"` + Live int32 `json:"live" validate:"required,oneof=1 4 8 12 24"` + Mode m.ResourceMode `json:"mode" validate:"required,oneof=1 2"` + Expire int32 `json:"expire"` + DailyLimit int32 `json:"daily_limit" validate:"min=100"` + Quota int32 `json:"quota" validate:"min=500"` name string price *decimal.Decimal } -func (c *CreateResourceData) GetType() trade2.Type { - return trade2.TypePurchase +func (c *CreateResourceData) GetType() m.TradeType { + return m.TradeTypePurchase } func (c *CreateResourceData) GetSubject() string { switch c.Type { - case resource2.TypeShort: + case m.ResourceTypeShort: return c.Short.GetSubject() - case resource2.TypeLong: + case m.ResourceTypeLong: return c.Long.GetSubject() } panic("类型对应的数据为空") @@ -179,9 +174,9 @@ func (c *CreateResourceData) GetSubject() string { func (c *CreateResourceData) GetAmount() decimal.Decimal { switch c.Type { - case resource2.TypeShort: + case m.ResourceTypeShort: return c.Short.GetAmount() - case resource2.TypeLong: + case m.ResourceTypeLong: return c.Long.GetAmount() } panic("类型对应的数据为空") @@ -250,11 +245,11 @@ func (data *CreateLongResourceData) GetSubject() string { func (data *CreateLongResourceData) GetAmount() decimal.Decimal { if data.price == nil { var factor int32 = 0 - switch resource2.Mode(data.Mode) { + switch data.Mode { - case resource2.ModeTime: + case m.ResourceModeTime: factor = data.Expire * data.DailyLimit - case resource2.ModeCount: + case m.ResourceModeQuota: factor = data.Quota } @@ -283,14 +278,14 @@ func (data *CreateLongResourceData) GetAmount() decimal.Decimal { type ResourceOnTradeComplete struct{} -func (r ResourceOnTradeComplete) Check(t trade2.Type) (trade2.ProductInfo, bool) { - if t == trade2.TypePurchase { +func (r ResourceOnTradeComplete) Check(t m.TradeType) (ProductInfo, bool) { + if t == m.TradeTypePurchase { return &CreateResourceData{}, true } return nil, false } -func (r ResourceOnTradeComplete) OnTradeComplete(info trade2.ProductInfo, trade *m.Trade) error { +func (r ResourceOnTradeComplete) OnTradeComplete(info ProductInfo, trade *m.Trade) error { return Resource.CreateResourceByTrade(trade.UserID, time.Time(*trade.CompletedAt), info.(*CreateResourceData), trade) } diff --git a/web/services/trade.go b/web/services/trade.go index 09c6ecf..99006bf 100644 --- a/web/services/trade.go +++ b/web/services/trade.go @@ -10,11 +10,8 @@ import ( "platform/pkg/env" "platform/pkg/u" "platform/web/core" - coupon2 "platform/web/domains/coupon" - trade2 "platform/web/domains/trade" e "platform/web/events" g "platform/web/globals" - "platform/web/globals/orm" m "platform/web/models" q "platform/web/queries" "time" @@ -53,7 +50,7 @@ func (s *tradeService) CreateTrade(uid int32, now time.Time, data *CreateTradeDa coupon, err := q.Coupon. Where( q.Coupon.Code.Eq(*data.CouponCode), - q.Coupon.Status.Eq(int32(coupon2.StatusUnused)), + q.Coupon.Status.Eq(int(m.CouponStatusUnused)), ). Take() if err != nil { @@ -67,7 +64,7 @@ func (s *tradeService) CreateTrade(uid int32, now time.Time, data *CreateTradeDa if !expireAt.IsZero() && expireAt.Before(now) { _, err = q.Coupon. Where(q.Coupon.ID.Eq(coupon.ID)). - Update(q.Coupon.Status, coupon2.StatusExpired) + Update(q.Coupon.Status, m.CouponStatusExpired) if err != nil { return nil, err } @@ -86,7 +83,7 @@ func (s *tradeService) CreateTrade(uid int32, now time.Time, data *CreateTradeDa if expireAt.IsZero() { _, err = q.Coupon. Where(q.Coupon.ID.Eq(coupon.ID)). - Update(q.Coupon.Status, int32(coupon2.StatusUsed)) + Update(q.Coupon.Status, int(m.CouponStatusUsed)) if err != nil { return nil, err } @@ -112,7 +109,7 @@ func (s *tradeService) CreateTrade(uid int32, now time.Time, data *CreateTradeDa switch { // 支付宝 + 电脑网站 - case method == trade2.MethodAlipay && platform == trade2.PlatformDesktop: + case method == m.TradeMethodAlipay && platform == m.TradePlatformPC: resp, err := g.Alipay.TradePagePay(alipay.TradePagePay{ QRPayMode: "4", QRCodeWidth: "196", // 二维码宽度需要-4,支付宝页面布局有问题 @@ -130,7 +127,7 @@ func (s *tradeService) CreateTrade(uid int32, now time.Time, data *CreateTradeDa paymentUrl = resp.String() // 微信 + 电脑网站 - case method == trade2.MethodWeChat && platform == trade2.PlatformDesktop: + case method == m.TradeMethodWechat && platform == m.TradePlatformPC: resp, _, err := g.WechatPay.Native.Prepay(context.Background(), native.PrepayRequest{ Appid: &env.WechatPayAppId, Mchid: &env.WechatPayMchId, @@ -149,14 +146,14 @@ func (s *tradeService) CreateTrade(uid int32, now time.Time, data *CreateTradeDa // 商福通 + 电脑网站 case - method == trade2.MethodSftAlipay && platform == trade2.PlatformDesktop, - method == trade2.MethodSftWeChat && platform == trade2.PlatformDesktop: + method == m.TradeMethodSftAlipay && platform == m.TradePlatformPC, + method == m.TradeMethodSftWechat && platform == m.TradePlatformPC: var payType g.SftPayType switch method { - case trade2.MethodSftAlipay: + case m.TradeMethodSftAlipay: payType = g.SftAlipay - case trade2.MethodSftWeChat: + case m.TradeMethodSftWechat: payType = g.SftWeChat default: panic("unhandled default case") @@ -178,13 +175,13 @@ func (s *tradeService) CreateTrade(uid int32, now time.Time, data *CreateTradeDa // 商福通 + 手机网站 case - method == trade2.MethodSftAlipay && platform == trade2.PlatformMobile, - method == trade2.MethodSftWeChat && platform == trade2.PlatformMobile: + method == m.TradeMethodSftAlipay && platform == m.TradePlatformMobile, + method == m.TradeMethodSftWechat && platform == m.TradePlatformMobile: var payType g.SftPayType switch method { - case trade2.MethodSftAlipay: + case m.TradeMethodSftAlipay: payType = g.SftAlipay - case trade2.MethodSftWeChat: + case m.TradeMethodSftWechat: payType = g.SftWeChat default: panic("unhandled default case") @@ -214,11 +211,11 @@ func (s *tradeService) CreateTrade(uid int32, now time.Time, data *CreateTradeDa err = q.Trade.Create(&m.Trade{ UserID: uid, InnerNo: tradeNo, - Type: int32(tType), + Type: tType, Subject: subject, Amount: amount, - Method: int32(method), - Platform: int32(platform), + Method: method, + Platform: platform, PaymentURL: &paymentUrl, }) if err != nil { @@ -266,11 +263,11 @@ func (s *tradeService) CompleteTrade(data *ModifyTradeData) error { if err != nil { return core.NewServErr("检查订单状态失败", err) } - if result.Status != trade2.StatusSuccess { + if result.Status != m.TradeStatusSuccess { switch result.Status { - case trade2.StatusPending: + case m.TradeStatusPending: return core.NewBizErr("订单未支付") - case trade2.StatusCanceled: + case m.TradeStatusCanceled: return core.NewBizErr("订单已过期") } } @@ -331,22 +328,22 @@ func completeTrade(data *OnTradeCompletedData) (*m.Trade, error) { } // 检查交易状态 - switch trade2.Status(trade.Status) { - case trade2.StatusCanceled: + switch trade.Status { + case m.TradeStatusCanceled: return core.NewBizErr("交易已取消") - case trade2.StatusSuccess: + case m.TradeStatusSuccess: return nil // 跳过更新交易信息 - case trade2.StatusPending: + case m.TradeStatusPending: } // 更新交易信息 - trade.Status = int32(trade2.StatusSuccess) + trade.Status = m.TradeStatusSuccess trade.OuterNo = &transId trade.Payment = payment - trade.Acquirer = u.P(int32(acquirer)) - trade.CompletedAt = u.P(orm.LocalDateTime(paidAt)) + trade.Acquirer = u.P(acquirer) + trade.CompletedAt = u.P(paidAt) rs, err := q.Trade. - Where(q.Trade.InnerNo.Eq(tradeNo), q.Trade.Status.Eq(int32(trade2.StatusPending))). + Where(q.Trade.InnerNo.Eq(tradeNo), q.Trade.Status.Eq(int(m.TradeStatusPending))). Updates(trade) if rs.RowsAffected == 0 { return core.NewBizErr("交易状态已发生变化") @@ -372,13 +369,13 @@ func afterTradeComplete(trade *m.Trade) error { } // 执行资源创建 - var ComplementEvents = []trade2.CompleteEvent{ + var ComplementEvents = []CompleteEvent{ ResourceOnTradeComplete{}, UserOnTradeComplete{}, } for _, event := range ComplementEvents { - info, ok := event.Check(trade2.Type(trade.Type)) + info, ok := event.Check(trade.Type) if !ok { continue } @@ -405,7 +402,7 @@ func (s *tradeService) CancelTrade(data *ModifyTradeData, now time.Time) error { return g.Redsync.WithLock(tradeLockKey(tradeNo), func() error { switch method { - case trade2.MethodAlipay: + case m.TradeMethodAlipay: resp, err := g.Alipay.TradeCancel(context.Background(), alipay.TradeCancel{ OutTradeNo: tradeNo, }) @@ -417,7 +414,7 @@ func (s *tradeService) CancelTrade(data *ModifyTradeData, now time.Time) error { return errors.New("上游取消交易失败") } - case trade2.MethodWeChat: + case m.TradeMethodWechat: resp, err := g.WechatPay.Native.CloseOrder(context.Background(), native.CloseOrderRequest{ Mchid: &env.WechatPayMchId, OutTradeNo: &tradeNo, @@ -435,7 +432,7 @@ func (s *tradeService) CancelTrade(data *ModifyTradeData, now time.Time) error { return errors.New("上游取消交易失败") } - case trade2.MethodSft, trade2.MethodSftAlipay, trade2.MethodSftWeChat: + case m.TradeMethodSft, m.TradeMethodSftAlipay, m.TradeMethodSftWechat: _, err := g.SFTPay.OrderClose(&g.OrderCloseReq{ MchOrderNo: &tradeNo, }) @@ -468,7 +465,7 @@ func (s *tradeService) OnTradeCanceled(tradeNo string, now time.Time) error { func cancelTrade(tradeNo string, now time.Time) error { return q.Q.Transaction(func(q *q.Query) error { // 获取交易信息 - var status trade2.Status + var status m.TradeStatus err := q.Trade. Where(q.Trade.InnerNo.Eq(tradeNo)). Select(q.Trade.Status). @@ -479,19 +476,19 @@ func cancelTrade(tradeNo string, now time.Time) error { // 检查交易状态 switch status { - case trade2.StatusCanceled: + case m.TradeStatusCanceled: return core.NewBizErr("交易已取消") - case trade2.StatusSuccess: + case m.TradeStatusSuccess: return core.NewBizErr("交易已完成") - case trade2.StatusPending: + case m.TradeStatusPending: } // 更新交易状态 _, err = q.Trade. Where(q.Trade.InnerNo.Eq(tradeNo)). UpdateSimple( - q.Trade.Status.Value(int32(trade2.StatusCanceled)), - q.Trade.CanceledAt.Value(orm.LocalDateTime(now)), + q.Trade.Status.Value(int(m.TradeStatusCanceled)), + q.Trade.CanceledAt.Value(now), ) if err != nil { return core.NewServErr("更新交易状态失败", err) @@ -518,7 +515,7 @@ func (s *tradeService) CheckTrade(data *ModifyTradeData) (*CheckTradeResult, err switch method { // 支付宝 - case trade2.MethodAlipay: + case m.TradeMethodAlipay: // 查询交易状态 resp, err := g.Alipay.TradeQuery(context.Background(), alipay.TradeQuery{ @@ -537,15 +534,15 @@ func (s *tradeService) CheckTrade(data *ModifyTradeData) (*CheckTradeResult, err switch resp.TradeStatus { case alipay.TradeStatusWaitBuyerPay: - result.Status = trade2.StatusPending + result.Status = m.TradeStatusPending case alipay.TradeStatusClosed: - result.Status = trade2.StatusCanceled + result.Status = m.TradeStatusCanceled case alipay.TradeStatusSuccess, alipay.TradeStatusFinished: - result.Status = trade2.StatusSuccess + result.Status = m.TradeStatusSuccess result.Success = &TradeSuccessResult{} - result.Success.Acquirer = trade2.AcquirerAlipay + result.Success.Acquirer = m.TradeAcquirerAlipay result.Success.Payment, err = decimal.NewFromString(resp.TotalAmount) if err != nil { return nil, err @@ -557,7 +554,7 @@ func (s *tradeService) CheckTrade(data *ModifyTradeData) (*CheckTradeResult, err } // 微信 - case trade2.MethodWeChat: + case m.TradeMethodWechat: // 查询交易状态 resp, _, err := g.WechatPay.Native.QueryOrderByOutTradeNo(context.Background(), native.QueryOrderByOutTradeNoRequest{ @@ -583,15 +580,15 @@ func (s *tradeService) CheckTrade(data *ModifyTradeData) (*CheckTradeResult, err switch *resp.TradeState { case "NOTPAY": - result.Status = trade2.StatusPending + result.Status = m.TradeStatusPending case "CLOSED": - result.Status = trade2.StatusCanceled + result.Status = m.TradeStatusCanceled case "SUCCESS", "REFUND": - result.Status = trade2.StatusSuccess + result.Status = m.TradeStatusSuccess result.Success = &TradeSuccessResult{} - result.Success.Acquirer = trade2.AcquirerWeChat + result.Success.Acquirer = m.TradeAcquirerWechat result.Success.Payment = decimal.NewFromInt(*resp.Amount.PayerTotal).Div(decimal.NewFromInt(100)) result.Success.Time, err = time.Parse(time.RFC3339, *resp.SuccessTime) if err != nil { @@ -600,7 +597,7 @@ func (s *tradeService) CheckTrade(data *ModifyTradeData) (*CheckTradeResult, err } // 商福通 - case trade2.MethodSft, trade2.MethodSftAlipay, trade2.MethodSftWeChat: + case m.TradeMethodSft, m.TradeMethodSftAlipay, m.TradeMethodSftWechat: // 查询交易状态 resp, err := g.SFTPay.QueryTrade(&g.QueryTradeReq{ @@ -619,21 +616,21 @@ func (s *tradeService) CheckTrade(data *ModifyTradeData) (*CheckTradeResult, err switch resp.State { case g.SftInit, g.SftTradeAwait, g.SftTradeFail: - result.Status = trade2.StatusPending + result.Status = m.TradeStatusPending case g.SftTradeClosed, g.SftTradeCancel: - result.Status = trade2.StatusCanceled + result.Status = m.TradeStatusCanceled case g.SftTradeSuccess, g.SftTradeRefund, g.SftRefundIng: - result.Status = trade2.StatusSuccess + result.Status = m.TradeStatusSuccess result.Success = &TradeSuccessResult{} switch resp.PayType { case "WECHAT": - result.Success.Acquirer = trade2.AcquirerWeChat + result.Success.Acquirer = m.TradeAcquirerWechat case "ALIPAY": - result.Success.Acquirer = trade2.AcquirerAlipay + result.Success.Acquirer = m.TradeAcquirerAlipay case "UNIONPAY": - result.Success.Acquirer = trade2.AcquirerUnionPay + result.Success.Acquirer = m.TradeAcquirerUnionPay } result.Success.Payment = decimal.NewFromInt(resp.Amount).Div(decimal.NewFromInt(100)) result.Success.Time, err = time.Parse("2006-01-02 15:04:05", *resp.PayTime) @@ -659,10 +656,10 @@ func tradeLockKey(no string) string { } type CreateTradeData struct { - Platform trade2.Platform `json:"platform" validate:"required"` - Method trade2.Method `json:"method" validate:"required"` + Platform m.TradePlatform `json:"platform" validate:"required"` + Method m.TradeMethod `json:"method" validate:"required"` CouponCode *string `json:"coupon_code"` - Product trade2.ProductInfo + Product ProductInfo } type CreateTradeResult struct { @@ -672,17 +669,17 @@ type CreateTradeResult struct { type ModifyTradeData struct { TradeNo string `json:"trade_no" validate:"required"` - Method trade2.Method `json:"method" validate:"required"` + Method m.TradeMethod `json:"method" validate:"required"` } type CheckTradeResult struct { TransId string - Status trade2.Status + Status m.TradeStatus Success *TradeSuccessResult } type TradeSuccessResult struct { - Acquirer trade2.Acquirer + Acquirer m.TradeAcquirer Payment decimal.Decimal Time time.Time } @@ -693,6 +690,19 @@ type OnTradeCompletedData struct { *TradeSuccessResult } +type ProductInfo interface { + GetType() m.TradeType + GetSubject() string + GetAmount() decimal.Decimal + Serialize() (string, error) + Deserialize(str string) error +} + +type CompleteEvent interface { + Check(t m.TradeType) (ProductInfo, bool) + OnTradeComplete(info ProductInfo, trade *m.Trade) error +} + type TradeErr string func (e TradeErr) Error() string { diff --git a/web/services/user.go b/web/services/user.go index 3e0af39..cfef225 100644 --- a/web/services/user.go +++ b/web/services/user.go @@ -4,8 +4,6 @@ import ( "encoding/json" "fmt" "platform/web/core" - bill2 "platform/web/domains/bill" - trade2 "platform/web/domains/trade" g "platform/web/globals" m "platform/web/models" q "platform/web/queries" @@ -27,7 +25,7 @@ func (s *userService) UpdateBalanceByTrade(uid int32, info *RechargeProductInfo, } // 生成账单 - err = q.Bill.Create(bill2.NewForRecharge(uid, Bill.GenNo(), info.GetSubject(), info.GetAmount(), trade)) + err = q.Bill.Create(newForRecharge(uid, Bill.GenNo(), info.GetSubject(), info.GetAmount(), trade)) if err != nil { return core.NewServErr("生成账单失败", err) } @@ -73,8 +71,8 @@ type RechargeProductInfo struct { Amount int `json:"amount"` } -func (r *RechargeProductInfo) GetType() trade2.Type { - return trade2.TypeRecharge +func (r *RechargeProductInfo) GetType() m.TradeType { + return m.TradeTypeRecharge } func (r *RechargeProductInfo) GetSubject() string { @@ -96,13 +94,13 @@ func (r *RechargeProductInfo) Deserialize(str string) error { type UserOnTradeComplete struct{} -func (u UserOnTradeComplete) Check(t trade2.Type) (trade2.ProductInfo, bool) { - if t == trade2.TypeRecharge { +func (u UserOnTradeComplete) Check(t m.TradeType) (ProductInfo, bool) { + if t == m.TradeTypeRecharge { return &RechargeProductInfo{}, true } return nil, false } -func (u UserOnTradeComplete) OnTradeComplete(info trade2.ProductInfo, trade *m.Trade) error { +func (u UserOnTradeComplete) OnTradeComplete(info ProductInfo, trade *m.Trade) error { return User.UpdateBalanceByTrade(trade.UserID, info.(*RechargeProductInfo), trade) } diff --git a/web/tasks/task.go b/web/tasks/task.go index 2af90f6..6010915 100644 --- a/web/tasks/task.go +++ b/web/tasks/task.go @@ -4,8 +4,15 @@ import ( "context" "encoding/json" "fmt" + "log/slog" + "platform/pkg/env" + "platform/pkg/u" "platform/web/events" + e "platform/web/events" + g "platform/web/globals" + m "platform/web/models" s "platform/web/services" + "strings" "time" "github.com/hibiken/asynq" @@ -29,16 +36,93 @@ func HandleCancelTrade(_ context.Context, task *asynq.Task) (err error) { } func HandleRemoveChannel(_ context.Context, task *asynq.Task) (err error) { - data := make([]int32, 0) - err = json.Unmarshal(task.Payload(), &data) + data := new(e.RemoveChannelData) + err = json.Unmarshal(task.Payload(), data) if err != nil { return fmt.Errorf("解析任务参数失败: %w", err) } - err = s.Channel.RemoveChannels(data) + err = s.Channel.RemoveChannels(data.Batch, data.IDs) if err != nil { return fmt.Errorf("删除通道失败: %w", err) } return nil } + +func HandleFlushGateway(_ context.Context, task *asynq.Task) (err error) { + now := time.Now() + + // 获取所有网关:配置组 + proxies, err := s.Proxy.AllProxies(m.ProxyTypeBaiYin, true) + if err != nil { + return fmt.Errorf("获取网关失败: %w", err) + } + + for _, proxy := range proxies { + + // 获取当前后备配置 + locals := map[string]int{} + for _, channel := range proxy.Channels { + isp := channel.FilterISP.String() + prov := u.Z(channel.FilterProv) + city := u.Z(channel.FilterCity) + locals[fmt.Sprintf("%s:%s:%s", isp, prov, city)]++ + } + + // 获取之前的后备配置 + remotes := map[string]int{} + if proxy.Meta != nil { + meta, ok := proxy.Meta.Data().([]g.AutoConfig) + if !ok { + return fmt.Errorf("解析网关数据失败") + } + for _, m := range meta { + remotes[fmt.Sprintf("%s:%s:%s", m.Isp, m.Province, m.City)] = m.Count + } + } + + // 检查是否需要更新 + pass := true + for k, local := range locals { + remote, ok := remotes[k] + if !ok { + pass = false + } else { + local, remote := float64(local), float64(remote) + if remote < local*1.5 || remote > local*3 { + pass = false + } + } + } + if pass { + continue + } + + // 更新后备配置 + configs := make([]g.AutoConfig, 0) + for k, local := range locals { + arr := strings.Split(k, ":") + isp, prov, city := arr[0], arr[1], arr[2] + configs = append(configs, g.AutoConfig{ + Isp: isp, + Province: prov, + City: city, + Count: local * 2, + }) + } + + if env.DebugExternalChange { + g.Cloud.CloudConnect(g.CloudConnectReq{ + Uuid: proxy.Mac, + AutoConfig: configs, + }) + } else { + bytes, _ := json.Marshal(configs) + slog.Debug("更新代理后备配置", "config", string(bytes)) + } + } + + slog.Debug("更新代理后备配置", "time", time.Since(now).String()) + return nil +} diff --git a/web/web.go b/web/web.go index dae2abc..a666838 100644 --- a/web/web.go +++ b/web/web.go @@ -8,6 +8,7 @@ import ( "platform/web/events" base "platform/web/globals" "platform/web/tasks" + "time" "github.com/gofiber/fiber/v2" "github.com/hibiken/asynq" @@ -32,6 +33,10 @@ func RunApp(pCtx context.Context) error { return RunTask(ctx) }) + g.Go(func() error { + return RunSchedule(ctx) + }) + return g.Wait() } @@ -65,13 +70,35 @@ func RunWeb(ctx context.Context) error { return nil } -func RunTask(ctx context.Context) error { +func RunSchedule(ctx context.Context) error { + var scheduler = asynq.NewSchedulerFromRedisClient(base.Redis, &asynq.SchedulerOpts{ + Location: time.Local, + }) + scheduler.Register("* * * * *", events.NewFlushGateway()) + + // 停止服务 + go func() { + <-ctx.Done() + scheduler.Shutdown() + }() + + // 启动服务 + err := scheduler.Run() + if err != nil { + return fmt.Errorf("调度服务运行失败: %w", err) + } + + return nil +} + +func RunTask(ctx context.Context) error { var server = asynq.NewServerFromRedisClient(base.Redis, asynq.Config{}) var mux = asynq.NewServeMux() mux.HandleFunc(events.RemoveChannel, tasks.HandleRemoveChannel) mux.HandleFunc(events.CancelTrade, tasks.HandleCancelTrade) + mux.HandleFunc(events.FlushGateway, tasks.HandleFlushGateway) // 停止服务 go func() {