feat: 用户注册部分开发

This commit is contained in:
sugarBecomer
2025-09-23 21:17:19 +08:00
parent 080ebb2bb6
commit c78d5057b0
41 changed files with 2526 additions and 119 deletions
+4 -3
View File
@@ -10,6 +10,7 @@ port = 8090
url = "https://devocr.likedream.xyz"
openapiPath= "/api.json"
swaggerPath= "/swagger"
emailConfirmBaseUrl = "https://dev.likedream.xyz/confirm/"
[env]
# 可选值: dev, prod
@@ -22,11 +23,11 @@ url = "redis://:jhkdjhkjdhsIUTYURTU_pEGmFP@database.out:56379"
[email]
# SMTP服务器配置
smtpHost = "smtp.qq.com"
smtpHost = "smtp-mail.outlook.com"
smtpPort = 587
# 发件人邮箱和密码(需要使用授权码,不是登录密码)
smtpUsername = ""
smtpPassword = ""
smtpUsername = "demo@likedream.xyz"
smtpPassword = "T#740951958979uh"
# 发件人邮箱和显示名称
fromEmail = ""
fromName = "今日校园系统"
+2 -2
View File
@@ -15,15 +15,15 @@ import (
_ "github.com/gogf/gf/contrib/nosql/redis/v2"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
"github.com/gogf/gf/v2/os/gctx"
"github.com/samber/oops"
)
func StartServer(ctx context.Context) {
s := g.Server()
// 设置端口
port, err := g.Cfg().Get(gctx.New(), cst.ConfigServerPort)
port, err := g.Cfg().Get(ctx, cst.ConfigServerPort)
utils.OkOrPanic(err)
s.SetNameToUriType(3)
// 设置中间件
s.Use(
middleware.ExceptionHandler,
+5
View File
@@ -2,3 +2,8 @@ package v1
type CommonReq struct {
}
type CommonPageReq struct {
Page int `json:"page" d:"1"`
Size int `json:"Size" d:"10"`
}
+17
View File
@@ -0,0 +1,17 @@
package v1
import (
"github.com/gogf/gf/v2/frame/g"
)
type ResetPasswordReq struct {
g.Meta `path:"/resetPassword" method:"POST" tags:"UserInfo" summary:"重置密码"`
OldPassword string `json:"OldPassword"`
NewPassword string `json:"newPassword"`
ConfirmPassword string `json:"confirmPassword"`
}
type CardRechargeReq struct {
g.Meta `path:"/card/recharge" method:"POST" tags:"UserInfo" summary:"卡密充值"`
Card string `json:"card"`
}
+17
View File
@@ -1,5 +1,7 @@
package v1
import "github.com/shopspring/decimal"
type UserMenuRes struct {
ID int64 `json:"id"`
Label string `json:"label"`
@@ -19,3 +21,18 @@ type UserPermissionRes struct {
Menus []*UserMenuRes `json:"menus"`
Permissions []string `json:"permissions"`
}
type UserProfileRes struct {
ID int64 `json:"id"`
Username string `json:"username"`
Email string `json:"email"`
Avatar string `json:"avatar"`
ParentUsername string `json:"parent_username"`
ParentEmail string `json:"parent_email"`
Level int `json:"level"`
Rate decimal.Decimal `json:"rate"`
Balance decimal.Decimal `json:"balance"`
InviteCode string `json:"invite_code"`
InviteCount int `json:"invite_count"`
InviteCashback decimal.Decimal `json:"invite_cashback"`
}
+13 -6
View File
@@ -1,8 +1,9 @@
package v1
import (
"github.com/gogf/gf/v2/frame/g"
"likedream-goframe/internal/framework/captcha"
"github.com/gogf/gf/v2/frame/g"
)
type CaptchaReq struct {
@@ -18,9 +19,15 @@ type UserLoginReq struct {
}
type UserRegisterReq struct {
g.Meta `path:"/user/register" method:"POST" tags:"UserLogin" summary:"用户注册"`
Username string `json:"username"`
Password string `json:"password"`
Email string `json:"email"`
InviteCode string `json:"inviteCode"`
g.Meta `path:"/user/register" method:"POST" tags:"UserLogin" summary:"用户注册"`
Email string `json:"email" v:"required|email|regex:^.*@qq\\.com$#邮箱不能为空|邮箱格式不正确|必须是QQ邮箱"`
Username string `json:"username" v:"required|length:2,20#用户名不能为空|用户名长度应在2-20之间" `
Password string `json:"password" v:"required|length:6,20#密码不能为空|密码长度应在6-20之间" `
ConfirmPassword string `json:"confirmPassword" v:"required|same:password#确认密码不能为空|两次输入的密码不一致"`
InviteCode string `json:"inviteCode"`
}
type UserConfirmReq struct {
g.Meta `path:"/user/confirm" method:"POST" tags:"UserLogin" summary:"用户确认"`
Token string `json:"token" v:"required"`
}
@@ -7,6 +7,13 @@ import (
"likedream-goframe/internal/utils"
)
type AgentCtrlV1 struct {
}
func NewV1() IAgentCtrl {
return &AgentCtrlV1{}
}
// List 获取代理列表
func (a AgentCtrlV1) List(ctx context.Context, req *v1.AgentListReq) (res *utils.Response[[]v1.AgentListRes], err error) {
defer utils.Pass(&err)
-8
View File
@@ -1,8 +0,0 @@
package agent
type AgentCtrlV1 struct {
}
func NewV1() IAgentCtrl {
return &AgentCtrlV1{}
}
@@ -3,10 +3,20 @@ package user_login
import (
"context"
v1 "likedream-goframe/internal/api/v1"
"likedream-goframe/internal/ent"
"likedream-goframe/internal/utils"
)
type IUserInfoV1 interface {
PermissionList(ctx context.Context, _ *v1.CommonReq) (*utils.Response[*v1.UserPermissionRes], error)
//用户基础信息
UserInfo(ctx context.Context, _ *v1.CommonReq) (*utils.Response[any], error)
// 个人中心
Profile(ctx context.Context, req *v1.CommonReq) (*utils.Response[any], error)
// 重置密码
ResetPassword(ctx context.Context, req *v1.ResetPasswordReq) (*utils.Response[any], error)
// 已使用卡密记录
UsedCardList(ctx context.Context, req *v1.CommonPageReq) (*utils.Response[[]*ent.SysCard], error)
// 卡密充值
CardRecharge(ctx context.Context, req *v1.CardRechargeReq) (*utils.Response[any], error)
}
@@ -12,4 +12,5 @@ type IUserLoginV1 interface {
Captcha(ctx context.Context, req *v1.CaptchaReq) (*utils.Response[captcha.SlideCaptchaResp], error)
Login(ctx context.Context, req *v1.UserLoginReq) (*utils.Response[any], error)
Register(ctx context.Context, req *v1.UserRegisterReq) (*utils.Response[any], error)
Confirm(ctx context.Context, req *v1.UserConfirmReq) (*utils.Response[any], error)
}
@@ -3,6 +3,7 @@ package user_login
import (
"context"
v1 "likedream-goframe/internal/api/v1"
"likedream-goframe/internal/ent"
"likedream-goframe/internal/service"
"likedream-goframe/internal/utils"
)
@@ -25,3 +26,25 @@ func (c *UserInfoV1) UserInfo(ctx context.Context, _ *v1.CommonReq) (res *utils.
defer utils.Pass(&err)
return service.Global.UserInfo.UserInfo(ctx), nil
}
// 获取用户详细信息(个人中心)
func (c *UserInfoV1) Profile(ctx context.Context, req *v1.CommonReq) (res *utils.Response[any], err error) {
defer utils.Pass(&err)
return service.Global.UserInfo.Profile(ctx, req), nil
}
// 重置密码(个人中心)
func (c *UserInfoV1) ResetPassword(ctx context.Context, req *v1.ResetPasswordReq) (res *utils.Response[any], err error) {
defer utils.Pass(&err)
return service.Global.UserInfo.ResetPassword(ctx, req), nil
}
func (c *UserInfoV1) UsedCardList(ctx context.Context, req *v1.CommonPageReq) (res *utils.Response[[]*ent.SysCard], err error) {
defer utils.Pass(&err)
return service.Global.UserInfo.UsedCardList(ctx, req), nil
}
func (c *UserInfoV1) CardRecharge(ctx context.Context, req *v1.CardRechargeReq) (res *utils.Response[any], err error) {
defer utils.Pass(&err)
return service.Global.UserInfo.CardRecharge(ctx, req), nil
}
@@ -51,3 +51,8 @@ func (c *UserLoginV1) Register(ctx context.Context, req *v1.UserRegisterReq) (re
defer utils.Pass(&err)
return service.Global.UserLogin.Register(ctx, req), nil
}
func (c *UserLoginV1) Confirm(ctx context.Context, req *v1.UserConfirmReq) (*utils.Response[any], error) {
//TODO implement me
panic("implement me")
}
+1
View File
@@ -8,6 +8,7 @@ const (
ConfigDatabaseType = "database.type"
ConfigDatabaseDsn = "database.dsn"
ConfigServerPort = "server.port"
ConfigEmailConfirmBaseUrl = "server.emailConfirmBaseUrl"
ConfigAuthorizationKey = "server.authorization"
ConfigJwtKey = "server.jwt"
ConfigRuoliCaptchaBaseUrl = "ruoliCaptcha.baseUrl"
+4 -2
View File
@@ -1,9 +1,11 @@
package cst
const (
RedisUserInfo = "userinfo:"
RedisUserInfo = "userinfo:"
RedisVerifyCode = "verifycode:"
)
var (
RedisUserInfoExpire = int64(86400)
RedisUserInfoExpire = int64(86400)
RedisVerifyCodeExpire = int64(86400)
)
+213 -8
View File
@@ -16,6 +16,7 @@ import (
"likedream-goframe/internal/ent/cptasklog"
"likedream-goframe/internal/ent/cpuser"
"likedream-goframe/internal/ent/sysagent"
"likedream-goframe/internal/ent/syscard"
"likedream-goframe/internal/ent/sysmenu"
"likedream-goframe/internal/ent/sysrole"
"likedream-goframe/internal/ent/sysuser"
@@ -42,6 +43,8 @@ type Client struct {
CpUser *CpUserClient
// SysAgent is the client for interacting with the SysAgent builders.
SysAgent *SysAgentClient
// SysCard is the client for interacting with the SysCard builders.
SysCard *SysCardClient
// SysMenu is the client for interacting with the SysMenu builders.
SysMenu *SysMenuClient
// SysRole is the client for interacting with the SysRole builders.
@@ -66,6 +69,7 @@ func (c *Client) init() {
c.CpTaskLog = NewCpTaskLogClient(c.config)
c.CpUser = NewCpUserClient(c.config)
c.SysAgent = NewSysAgentClient(c.config)
c.SysCard = NewSysCardClient(c.config)
c.SysMenu = NewSysMenuClient(c.config)
c.SysRole = NewSysRoleClient(c.config)
c.SysUser = NewSysUserClient(c.config)
@@ -167,6 +171,7 @@ func (c *Client) Tx(ctx context.Context) (*Tx, error) {
CpTaskLog: NewCpTaskLogClient(cfg),
CpUser: NewCpUserClient(cfg),
SysAgent: NewSysAgentClient(cfg),
SysCard: NewSysCardClient(cfg),
SysMenu: NewSysMenuClient(cfg),
SysRole: NewSysRoleClient(cfg),
SysUser: NewSysUserClient(cfg),
@@ -195,6 +200,7 @@ func (c *Client) BeginTx(ctx context.Context, opts *sql.TxOptions) (*Tx, error)
CpTaskLog: NewCpTaskLogClient(cfg),
CpUser: NewCpUserClient(cfg),
SysAgent: NewSysAgentClient(cfg),
SysCard: NewSysCardClient(cfg),
SysMenu: NewSysMenuClient(cfg),
SysRole: NewSysRoleClient(cfg),
SysUser: NewSysUserClient(cfg),
@@ -228,8 +234,8 @@ func (c *Client) Close() error {
// In order to add hooks to a specific client, call: `client.Node.Use(...)`.
func (c *Client) Use(hooks ...Hook) {
for _, n := range []interface{ Use(...Hook) }{
c.CpImage, c.CpTask, c.CpTaskLog, c.CpUser, c.SysAgent, c.SysMenu, c.SysRole,
c.SysUser, c.SysUserLog,
c.CpImage, c.CpTask, c.CpTaskLog, c.CpUser, c.SysAgent, c.SysCard, c.SysMenu,
c.SysRole, c.SysUser, c.SysUserLog,
} {
n.Use(hooks...)
}
@@ -239,8 +245,8 @@ func (c *Client) Use(hooks ...Hook) {
// In order to add interceptors to a specific client, call: `client.Node.Intercept(...)`.
func (c *Client) Intercept(interceptors ...Interceptor) {
for _, n := range []interface{ Intercept(...Interceptor) }{
c.CpImage, c.CpTask, c.CpTaskLog, c.CpUser, c.SysAgent, c.SysMenu, c.SysRole,
c.SysUser, c.SysUserLog,
c.CpImage, c.CpTask, c.CpTaskLog, c.CpUser, c.SysAgent, c.SysCard, c.SysMenu,
c.SysRole, c.SysUser, c.SysUserLog,
} {
n.Intercept(interceptors...)
}
@@ -259,6 +265,8 @@ func (c *Client) Mutate(ctx context.Context, m Mutation) (Value, error) {
return c.CpUser.mutate(ctx, m)
case *SysAgentMutation:
return c.SysAgent.mutate(ctx, m)
case *SysCardMutation:
return c.SysCard.mutate(ctx, m)
case *SysMenuMutation:
return c.SysMenu.mutate(ctx, m)
case *SysRoleMutation:
@@ -1099,6 +1107,171 @@ func (c *SysAgentClient) mutate(ctx context.Context, m *SysAgentMutation) (Value
}
}
// SysCardClient is a client for the SysCard schema.
type SysCardClient struct {
config
}
// NewSysCardClient returns a client for the SysCard from the given config.
func NewSysCardClient(c config) *SysCardClient {
return &SysCardClient{config: c}
}
// Use adds a list of mutation hooks to the hooks stack.
// A call to `Use(f, g, h)` equals to `syscard.Hooks(f(g(h())))`.
func (c *SysCardClient) Use(hooks ...Hook) {
c.hooks.SysCard = append(c.hooks.SysCard, hooks...)
}
// Intercept adds a list of query interceptors to the interceptors stack.
// A call to `Intercept(f, g, h)` equals to `syscard.Intercept(f(g(h())))`.
func (c *SysCardClient) Intercept(interceptors ...Interceptor) {
c.inters.SysCard = append(c.inters.SysCard, interceptors...)
}
// Create returns a builder for creating a SysCard entity.
func (c *SysCardClient) Create() *SysCardCreate {
mutation := newSysCardMutation(c.config, OpCreate)
return &SysCardCreate{config: c.config, hooks: c.Hooks(), mutation: mutation}
}
// CreateBulk returns a builder for creating a bulk of SysCard entities.
func (c *SysCardClient) CreateBulk(builders ...*SysCardCreate) *SysCardCreateBulk {
return &SysCardCreateBulk{config: c.config, builders: builders}
}
// MapCreateBulk creates a bulk creation builder from the given slice. For each item in the slice, the function creates
// a builder and applies setFunc on it.
func (c *SysCardClient) MapCreateBulk(slice any, setFunc func(*SysCardCreate, int)) *SysCardCreateBulk {
rv := reflect.ValueOf(slice)
if rv.Kind() != reflect.Slice {
return &SysCardCreateBulk{err: fmt.Errorf("calling to SysCardClient.MapCreateBulk with wrong type %T, need slice", slice)}
}
builders := make([]*SysCardCreate, rv.Len())
for i := 0; i < rv.Len(); i++ {
builders[i] = c.Create()
setFunc(builders[i], i)
}
return &SysCardCreateBulk{config: c.config, builders: builders}
}
// Update returns an update builder for SysCard.
func (c *SysCardClient) Update() *SysCardUpdate {
mutation := newSysCardMutation(c.config, OpUpdate)
return &SysCardUpdate{config: c.config, hooks: c.Hooks(), mutation: mutation}
}
// UpdateOne returns an update builder for the given entity.
func (c *SysCardClient) UpdateOne(_m *SysCard) *SysCardUpdateOne {
mutation := newSysCardMutation(c.config, OpUpdateOne, withSysCard(_m))
return &SysCardUpdateOne{config: c.config, hooks: c.Hooks(), mutation: mutation}
}
// UpdateOneID returns an update builder for the given id.
func (c *SysCardClient) UpdateOneID(id int64) *SysCardUpdateOne {
mutation := newSysCardMutation(c.config, OpUpdateOne, withSysCardID(id))
return &SysCardUpdateOne{config: c.config, hooks: c.Hooks(), mutation: mutation}
}
// Delete returns a delete builder for SysCard.
func (c *SysCardClient) Delete() *SysCardDelete {
mutation := newSysCardMutation(c.config, OpDelete)
return &SysCardDelete{config: c.config, hooks: c.Hooks(), mutation: mutation}
}
// DeleteOne returns a builder for deleting the given entity.
func (c *SysCardClient) DeleteOne(_m *SysCard) *SysCardDeleteOne {
return c.DeleteOneID(_m.ID)
}
// DeleteOneID returns a builder for deleting the given entity by its id.
func (c *SysCardClient) DeleteOneID(id int64) *SysCardDeleteOne {
builder := c.Delete().Where(syscard.ID(id))
builder.mutation.id = &id
builder.mutation.op = OpDeleteOne
return &SysCardDeleteOne{builder}
}
// Query returns a query builder for SysCard.
func (c *SysCardClient) Query() *SysCardQuery {
return &SysCardQuery{
config: c.config,
ctx: &QueryContext{Type: TypeSysCard},
inters: c.Interceptors(),
}
}
// Get returns a SysCard entity by its id.
func (c *SysCardClient) Get(ctx context.Context, id int64) (*SysCard, error) {
return c.Query().Where(syscard.ID(id)).Only(ctx)
}
// GetX is like Get, but panics if an error occurs.
func (c *SysCardClient) GetX(ctx context.Context, id int64) *SysCard {
obj, err := c.Get(ctx, id)
if err != nil {
panic(err)
}
return obj
}
// QueryCreator queries the creator edge of a SysCard.
func (c *SysCardClient) QueryCreator(_m *SysCard) *SysUserQuery {
query := (&SysUserClient{config: c.config}).Query()
query.path = func(context.Context) (fromV *sql.Selector, _ error) {
id := _m.ID
step := sqlgraph.NewStep(
sqlgraph.From(syscard.Table, syscard.FieldID, id),
sqlgraph.To(sysuser.Table, sysuser.FieldID),
sqlgraph.Edge(sqlgraph.M2O, true, syscard.CreatorTable, syscard.CreatorColumn),
)
fromV = sqlgraph.Neighbors(_m.driver.Dialect(), step)
return fromV, nil
}
return query
}
// QueryUser queries the user edge of a SysCard.
func (c *SysCardClient) QueryUser(_m *SysCard) *SysUserQuery {
query := (&SysUserClient{config: c.config}).Query()
query.path = func(context.Context) (fromV *sql.Selector, _ error) {
id := _m.ID
step := sqlgraph.NewStep(
sqlgraph.From(syscard.Table, syscard.FieldID, id),
sqlgraph.To(sysuser.Table, sysuser.FieldID),
sqlgraph.Edge(sqlgraph.M2O, true, syscard.UserTable, syscard.UserColumn),
)
fromV = sqlgraph.Neighbors(_m.driver.Dialect(), step)
return fromV, nil
}
return query
}
// Hooks returns the client hooks.
func (c *SysCardClient) Hooks() []Hook {
return c.hooks.SysCard
}
// Interceptors returns the client interceptors.
func (c *SysCardClient) Interceptors() []Interceptor {
return c.inters.SysCard
}
func (c *SysCardClient) mutate(ctx context.Context, m *SysCardMutation) (Value, error) {
switch m.Op() {
case OpCreate:
return (&SysCardCreate{config: c.config, hooks: c.Hooks(), mutation: m}).Save(ctx)
case OpUpdate:
return (&SysCardUpdate{config: c.config, hooks: c.Hooks(), mutation: m}).Save(ctx)
case OpUpdateOne:
return (&SysCardUpdateOne{config: c.config, hooks: c.Hooks(), mutation: m}).Save(ctx)
case OpDelete, OpDeleteOne:
return (&SysCardDelete{config: c.config, hooks: c.Hooks(), mutation: m}).Exec(ctx)
default:
return nil, fmt.Errorf("ent: unknown SysCard mutation op: %q", m.Op())
}
}
// SysMenuClient is a client for the SysMenu schema.
type SysMenuClient struct {
config
@@ -1667,6 +1840,38 @@ func (c *SysUserClient) QueryCpTaskLogs(_m *SysUser) *CpTaskLogQuery {
return query
}
// QueryCreatedCards queries the created_cards edge of a SysUser.
func (c *SysUserClient) QueryCreatedCards(_m *SysUser) *SysCardQuery {
query := (&SysCardClient{config: c.config}).Query()
query.path = func(context.Context) (fromV *sql.Selector, _ error) {
id := _m.ID
step := sqlgraph.NewStep(
sqlgraph.From(sysuser.Table, sysuser.FieldID, id),
sqlgraph.To(syscard.Table, syscard.FieldID),
sqlgraph.Edge(sqlgraph.O2M, false, sysuser.CreatedCardsTable, sysuser.CreatedCardsColumn),
)
fromV = sqlgraph.Neighbors(_m.driver.Dialect(), step)
return fromV, nil
}
return query
}
// QueryUsedCards queries the used_cards edge of a SysUser.
func (c *SysUserClient) QueryUsedCards(_m *SysUser) *SysCardQuery {
query := (&SysCardClient{config: c.config}).Query()
query.path = func(context.Context) (fromV *sql.Selector, _ error) {
id := _m.ID
step := sqlgraph.NewStep(
sqlgraph.From(sysuser.Table, sysuser.FieldID, id),
sqlgraph.To(syscard.Table, syscard.FieldID),
sqlgraph.Edge(sqlgraph.O2M, false, sysuser.UsedCardsTable, sysuser.UsedCardsColumn),
)
fromV = sqlgraph.Neighbors(_m.driver.Dialect(), step)
return fromV, nil
}
return query
}
// Hooks returns the client hooks.
func (c *SysUserClient) Hooks() []Hook {
hooks := c.hooks.SysUser
@@ -1829,11 +2034,11 @@ func (c *SysUserLogClient) mutate(ctx context.Context, m *SysUserLogMutation) (V
// hooks and interceptors per client, for fast access.
type (
hooks struct {
CpImage, CpTask, CpTaskLog, CpUser, SysAgent, SysMenu, SysRole, SysUser,
SysUserLog []ent.Hook
CpImage, CpTask, CpTaskLog, CpUser, SysAgent, SysCard, SysMenu, SysRole,
SysUser, SysUserLog []ent.Hook
}
inters struct {
CpImage, CpTask, CpTaskLog, CpUser, SysAgent, SysMenu, SysRole, SysUser,
SysUserLog []ent.Interceptor
CpImage, CpTask, CpTaskLog, CpUser, SysAgent, SysCard, SysMenu, SysRole,
SysUser, SysUserLog []ent.Interceptor
}
)
+2
View File
@@ -11,6 +11,7 @@ import (
"likedream-goframe/internal/ent/cptasklog"
"likedream-goframe/internal/ent/cpuser"
"likedream-goframe/internal/ent/sysagent"
"likedream-goframe/internal/ent/syscard"
"likedream-goframe/internal/ent/sysmenu"
"likedream-goframe/internal/ent/sysrole"
"likedream-goframe/internal/ent/sysuser"
@@ -86,6 +87,7 @@ func checkColumn(t, c string) error {
cptasklog.Table: cptasklog.ValidColumn,
cpuser.Table: cpuser.ValidColumn,
sysagent.Table: sysagent.ValidColumn,
syscard.Table: syscard.ValidColumn,
sysmenu.Table: sysmenu.ValidColumn,
sysrole.Table: sysrole.ValidColumn,
sysuser.Table: sysuser.ValidColumn,
+12
View File
@@ -68,6 +68,18 @@ func (f SysAgentFunc) Mutate(ctx context.Context, m ent.Mutation) (ent.Value, er
return nil, fmt.Errorf("unexpected mutation type %T. expect *ent.SysAgentMutation", m)
}
// The SysCardFunc type is an adapter to allow the use of ordinary
// function as SysCard mutator.
type SysCardFunc func(context.Context, *ent.SysCardMutation) (ent.Value, error)
// Mutate calls f(ctx, m).
func (f SysCardFunc) Mutate(ctx context.Context, m ent.Mutation) (ent.Value, error) {
if mv, ok := m.(*ent.SysCardMutation); ok {
return f(ctx, mv)
}
return nil, fmt.Errorf("unexpected mutation type %T. expect *ent.SysCardMutation", m)
}
// The SysMenuFunc type is an adapter to allow the use of ordinary
// function as SysMenu mutator.
type SysMenuFunc func(context.Context, *ent.SysMenuMutation) (ent.Value, error)
+37 -1
View File
@@ -150,6 +150,35 @@ var (
},
},
}
// SysCardColumns holds the columns for the "sys_card" table.
SysCardColumns = []*schema.Column{
{Name: "id", Type: field.TypeInt64, Increment: true},
{Name: "content", Type: field.TypeString, Unique: true},
{Name: "status", Type: field.TypeInt, Default: 1},
{Name: "value", Type: field.TypeUint64},
{Name: "creator_id", Type: field.TypeInt64},
{Name: "used_id", Type: field.TypeInt64, Nullable: true},
}
// SysCardTable holds the schema information for the "sys_card" table.
SysCardTable = &schema.Table{
Name: "sys_card",
Columns: SysCardColumns,
PrimaryKey: []*schema.Column{SysCardColumns[0]},
ForeignKeys: []*schema.ForeignKey{
{
Symbol: "sys_card_sys_user_created_cards",
Columns: []*schema.Column{SysCardColumns[4]},
RefColumns: []*schema.Column{SysUserColumns[0]},
OnDelete: schema.NoAction,
},
{
Symbol: "sys_card_sys_user_used_cards",
Columns: []*schema.Column{SysCardColumns[5]},
RefColumns: []*schema.Column{SysUserColumns[0]},
OnDelete: schema.SetNull,
},
},
}
// SysMenuColumns holds the columns for the "sys_menu" table.
SysMenuColumns = []*schema.Column{
{Name: "id", Type: field.TypeInt64, Increment: true},
@@ -209,6 +238,7 @@ var (
{Name: "balance", Type: field.TypeString, SchemaType: map[string]string{"mysql": "decimal(10,2)", "postgres": "numeric(10,2)"}},
{Name: "block", Type: field.TypeBool, Default: false},
{Name: "verify", Type: field.TypeBool, Default: false},
{Name: "invite_cashback", Type: field.TypeString, SchemaType: map[string]string{"mysql": "decimal(10,2)", "postgres": "numeric(10,2)"}},
{Name: "sys_user_children", Type: field.TypeInt64, Nullable: true},
}
// SysUserTable holds the schema information for the "sys_user" table.
@@ -219,7 +249,7 @@ var (
ForeignKeys: []*schema.ForeignKey{
{
Symbol: "sys_user_sys_user_children",
Columns: []*schema.Column{SysUserColumns[10]},
Columns: []*schema.Column{SysUserColumns[11]},
RefColumns: []*schema.Column{SysUserColumns[0]},
OnDelete: schema.SetNull,
},
@@ -292,6 +322,7 @@ var (
CpTaskLogsTable,
CpUsersTable,
SysAgentTable,
SysCardTable,
SysMenuTable,
SysRoleTable,
SysUserTable,
@@ -315,6 +346,11 @@ func init() {
SysAgentTable.Annotation = &entsql.Annotation{
Table: "sys_agent",
}
SysCardTable.ForeignKeys[0].RefTable = SysUserTable
SysCardTable.ForeignKeys[1].RefTable = SysUserTable
SysCardTable.Annotation = &entsql.Annotation{
Table: "sys_card",
}
SysMenuTable.ForeignKeys[0].RefTable = SysMenuTable
SysMenuTable.Annotation = &entsql.Annotation{
Table: "sys_menu",
+1007 -39
View File
File diff suppressed because it is too large Load Diff
+3
View File
@@ -21,6 +21,9 @@ type CpUser func(*sql.Selector)
// SysAgent is the predicate function for sysagent builders.
type SysAgent func(*sql.Selector)
// SysCard is the predicate function for syscard builders.
type SysCard func(*sql.Selector)
// SysMenu is the predicate function for sysmenu builders.
type SysMenu func(*sql.Selector)
+11
View File
@@ -8,6 +8,7 @@ import (
"likedream-goframe/internal/ent/cpuser"
"likedream-goframe/internal/ent/schema"
"likedream-goframe/internal/ent/sysagent"
"likedream-goframe/internal/ent/syscard"
"likedream-goframe/internal/ent/sysmenu"
"likedream-goframe/internal/ent/sysrole"
"likedream-goframe/internal/ent/sysuser"
@@ -90,6 +91,12 @@ func init() {
sysagentDescUpdateTime := sysagentMixinFields0[1].Descriptor()
// sysagent.DefaultUpdateTime holds the default value on creation for the update_time field.
sysagent.DefaultUpdateTime = sysagentDescUpdateTime.Default.(func() *ent2.CustomTime)
syscardFields := schema.SysCard{}.Fields()
_ = syscardFields
// syscardDescStatus is the schema descriptor for status field.
syscardDescStatus := syscardFields[1].Descriptor()
// syscard.DefaultStatus holds the default value on creation for the status field.
syscard.DefaultStatus = syscardDescStatus.Default.(int)
sysmenuMixin := schema.SysMenu{}.Mixin()
sysmenuMixinHooks0 := sysmenuMixin[0].Hooks()
sysmenu.Hooks[0] = sysmenuMixinHooks0[0]
@@ -155,6 +162,10 @@ func init() {
sysuserDescVerify := sysuserFields[6].Descriptor()
// sysuser.DefaultVerify holds the default value on creation for the verify field.
sysuser.DefaultVerify = sysuserDescVerify.Default.(bool)
// sysuserDescInviteCashback is the schema descriptor for invite_cashback field.
sysuserDescInviteCashback := sysuserFields[7].Descriptor()
// sysuser.DefaultInviteCashback holds the default value on creation for the invite_cashback field.
sysuser.DefaultInviteCashback = sysuserDescInviteCashback.Default.(func() decimal.Decimal)
}
const (
@@ -1,6 +1,8 @@
package schema
import (
"likedream-goframe/internal/ent/schema/mix"
"entgo.io/ent"
"entgo.io/ent/dialect"
"entgo.io/ent/dialect/entsql"
@@ -8,7 +10,6 @@ import (
"entgo.io/ent/schema/edge"
"entgo.io/ent/schema/field"
"github.com/shopspring/decimal"
"likedream-goframe/internal/ent/schema/mix"
)
// SysAgent holds the schema definition for the SysAgent entity.
+37
View File
@@ -0,0 +1,37 @@
package schema
import (
"entgo.io/ent"
"entgo.io/ent/dialect/entsql"
"entgo.io/ent/schema"
"entgo.io/ent/schema/edge"
"entgo.io/ent/schema/field"
)
// SysCard holds the schema definition for the SysCard entity.
type SysCard struct {
ent.Schema
}
func (SysCard) Fields() []ent.Field {
return []ent.Field{
field.String("content").Unique(), // 充值卡密
field.Int("status").Default(1), //1:未使用 2:使用 3:禁用
field.Uint64("value"), // 充值金额
field.Int64("creator_id"),
field.Int64("used_id").Optional(),
}
}
func (SysCard) Edges() []ent.Edge {
return []ent.Edge{
edge.From("creator", SysUser.Type).Ref("created_cards").Field("creator_id").Unique().Required(), // 创建人
edge.From("user", SysUser.Type).Ref("used_cards").Field("used_id").Unique(), // 使用人
}
}
func (SysCard) Annotations() []schema.Annotation {
return []schema.Annotation{
entsql.Annotation{Table: "sys_card"},
}
}
@@ -23,7 +23,7 @@ type SysUser struct {
func (SysUser) Fields() []ent.Field {
return []ent.Field{
field.String("username").Unique(),
field.String("password"),
field.String("password").Sensitive(),
field.String("email").Unique().Match(regexp.MustCompile("@qq.com$")),
field.String("invite_code").Unique().Optional(),
field.String("balance").GoType(decimal.Decimal{}).SchemaType(map[string]string{
@@ -32,6 +32,11 @@ func (SysUser) Fields() []ent.Field {
}).DefaultFunc(ent2.DecimalDefaultFunc),
field.Bool("block").Default(false),
field.Bool("verify").Default(false),
// 邀请返现字段
field.String("invite_cashback").GoType(decimal.Decimal{}).SchemaType(map[string]string{
dialect.MySQL: "decimal(10,2)",
dialect.Postgres: "numeric(10,2)",
}).DefaultFunc(ent2.DecimalDefaultFunc),
}
}
@@ -46,6 +51,8 @@ func (SysUser) Edges() []ent.Edge {
edge.To("images", CpImage.Type), // 用户拥有的图片
edge.To("cpuser", CpUser.Type), // 用户拥有的cp用户
edge.To("cp_task_logs", CpTaskLog.Type), // 用户拥有的cp任务日志
edge.To("created_cards", SysCard.Type), // 用户创建的卡
edge.To("used_cards", SysCard.Type), // 用户使用的卡
}
}
+47 -5
View File
@@ -26,7 +26,7 @@ type SysUser struct {
// Username holds the value of the "username" field.
Username string `json:"username,omitempty"`
// Password holds the value of the "password" field.
Password string `json:"password,omitempty"`
Password string `json:"-"`
// Email holds the value of the "email" field.
Email string `json:"email,omitempty"`
// InviteCode holds the value of the "invite_code" field.
@@ -37,6 +37,8 @@ type SysUser struct {
Block bool `json:"block,omitempty"`
// Verify holds the value of the "verify" field.
Verify bool `json:"verify,omitempty"`
// InviteCashback holds the value of the "invite_cashback" field.
InviteCashback decimal.Decimal `json:"invite_cashback,omitempty"`
// Edges holds the relations/edges for other nodes in the graph.
// The values are being populated by the SysUserQuery when eager-loading is set.
Edges SysUserEdges `json:"edges"`
@@ -60,9 +62,13 @@ type SysUserEdges struct {
Cpuser []*CpUser `json:"cpuser,omitempty"`
// CpTaskLogs holds the value of the cp_task_logs edge.
CpTaskLogs []*CpTaskLog `json:"cp_task_logs,omitempty"`
// CreatedCards holds the value of the created_cards edge.
CreatedCards []*SysCard `json:"created_cards,omitempty"`
// UsedCards holds the value of the used_cards edge.
UsedCards []*SysCard `json:"used_cards,omitempty"`
// loadedTypes holds the information for reporting if a
// type was loaded (or requested) in eager-loading or not.
loadedTypes [7]bool
loadedTypes [9]bool
}
// ParentOrErr returns the Parent value or an error if the edge
@@ -132,12 +138,30 @@ func (e SysUserEdges) CpTaskLogsOrErr() ([]*CpTaskLog, error) {
return nil, &NotLoadedError{edge: "cp_task_logs"}
}
// CreatedCardsOrErr returns the CreatedCards value or an error if the edge
// was not loaded in eager-loading.
func (e SysUserEdges) CreatedCardsOrErr() ([]*SysCard, error) {
if e.loadedTypes[7] {
return e.CreatedCards, nil
}
return nil, &NotLoadedError{edge: "created_cards"}
}
// UsedCardsOrErr returns the UsedCards value or an error if the edge
// was not loaded in eager-loading.
func (e SysUserEdges) UsedCardsOrErr() ([]*SysCard, error) {
if e.loadedTypes[8] {
return e.UsedCards, nil
}
return nil, &NotLoadedError{edge: "used_cards"}
}
// scanValues returns the types for scanning values from sql.Rows.
func (*SysUser) scanValues(columns []string) ([]any, error) {
values := make([]any, len(columns))
for i := range columns {
switch columns[i] {
case sysuser.FieldBalance:
case sysuser.FieldBalance, sysuser.FieldInviteCashback:
values[i] = new(decimal.Decimal)
case sysuser.FieldCreateTime, sysuser.FieldUpdateTime:
values[i] = new(ent2.CustomTime)
@@ -224,6 +248,12 @@ func (_m *SysUser) assignValues(columns []string, values []any) error {
} else if value.Valid {
_m.Verify = value.Bool
}
case sysuser.FieldInviteCashback:
if value, ok := values[i].(*decimal.Decimal); !ok {
return fmt.Errorf("unexpected type %T for field invite_cashback", values[i])
} else if value != nil {
_m.InviteCashback = *value
}
case sysuser.ForeignKeys[0]:
if value, ok := values[i].(*sql.NullInt64); !ok {
return fmt.Errorf("unexpected type %T for edge-field sys_user_children", value)
@@ -279,6 +309,16 @@ func (_m *SysUser) QueryCpTaskLogs() *CpTaskLogQuery {
return NewSysUserClient(_m.config).QueryCpTaskLogs(_m)
}
// QueryCreatedCards queries the "created_cards" edge of the SysUser entity.
func (_m *SysUser) QueryCreatedCards() *SysCardQuery {
return NewSysUserClient(_m.config).QueryCreatedCards(_m)
}
// QueryUsedCards queries the "used_cards" edge of the SysUser entity.
func (_m *SysUser) QueryUsedCards() *SysCardQuery {
return NewSysUserClient(_m.config).QueryUsedCards(_m)
}
// Update returns a builder for updating this SysUser.
// Note that you need to call SysUser.Unwrap() before calling this method if this SysUser
// was returned from a transaction, and the transaction was committed or rolled back.
@@ -311,8 +351,7 @@ func (_m *SysUser) String() string {
builder.WriteString("username=")
builder.WriteString(_m.Username)
builder.WriteString(", ")
builder.WriteString("password=")
builder.WriteString(_m.Password)
builder.WriteString("password=<sensitive>")
builder.WriteString(", ")
builder.WriteString("email=")
builder.WriteString(_m.Email)
@@ -328,6 +367,9 @@ func (_m *SysUser) String() string {
builder.WriteString(", ")
builder.WriteString("verify=")
builder.WriteString(fmt.Sprintf("%v", _m.Verify))
builder.WriteString(", ")
builder.WriteString("invite_cashback=")
builder.WriteString(fmt.Sprintf("%v", _m.InviteCashback))
builder.WriteByte(')')
return builder.String()
}
+70
View File
@@ -34,6 +34,8 @@ const (
FieldBlock = "block"
// FieldVerify holds the string denoting the verify field in the database.
FieldVerify = "verify"
// FieldInviteCashback holds the string denoting the invite_cashback field in the database.
FieldInviteCashback = "invite_cashback"
// EdgeParent holds the string denoting the parent edge name in mutations.
EdgeParent = "parent"
// EdgeChildren holds the string denoting the children edge name in mutations.
@@ -48,6 +50,10 @@ const (
EdgeCpuser = "cpuser"
// EdgeCpTaskLogs holds the string denoting the cp_task_logs edge name in mutations.
EdgeCpTaskLogs = "cp_task_logs"
// EdgeCreatedCards holds the string denoting the created_cards edge name in mutations.
EdgeCreatedCards = "created_cards"
// EdgeUsedCards holds the string denoting the used_cards edge name in mutations.
EdgeUsedCards = "used_cards"
// Table holds the table name of the sysuser in the database.
Table = "sys_user"
// ParentTable is the table that holds the parent relation/edge.
@@ -91,6 +97,20 @@ const (
CpTaskLogsInverseTable = "cp_task_logs"
// CpTaskLogsColumn is the table column denoting the cp_task_logs relation/edge.
CpTaskLogsColumn = "system_user_id"
// CreatedCardsTable is the table that holds the created_cards relation/edge.
CreatedCardsTable = "sys_card"
// CreatedCardsInverseTable is the table name for the SysCard entity.
// It exists in this package in order to avoid circular dependency with the "syscard" package.
CreatedCardsInverseTable = "sys_card"
// CreatedCardsColumn is the table column denoting the created_cards relation/edge.
CreatedCardsColumn = "creator_id"
// UsedCardsTable is the table that holds the used_cards relation/edge.
UsedCardsTable = "sys_card"
// UsedCardsInverseTable is the table name for the SysCard entity.
// It exists in this package in order to avoid circular dependency with the "syscard" package.
UsedCardsInverseTable = "sys_card"
// UsedCardsColumn is the table column denoting the used_cards relation/edge.
UsedCardsColumn = "used_id"
)
// Columns holds all SQL columns for sysuser fields.
@@ -105,6 +125,7 @@ var Columns = []string{
FieldBalance,
FieldBlock,
FieldVerify,
FieldInviteCashback,
}
// ForeignKeys holds the SQL foreign-keys that are owned by the "sys_user"
@@ -153,6 +174,8 @@ var (
DefaultBlock bool
// DefaultVerify holds the default value on creation for the "verify" field.
DefaultVerify bool
// DefaultInviteCashback holds the default value on creation for the "invite_cashback" field.
DefaultInviteCashback func() decimal.Decimal
)
// OrderOption defines the ordering options for the SysUser queries.
@@ -208,6 +231,11 @@ func ByVerify(opts ...sql.OrderTermOption) OrderOption {
return sql.OrderByField(FieldVerify, opts...).ToFunc()
}
// ByInviteCashback orders the results by the invite_cashback field.
func ByInviteCashback(opts ...sql.OrderTermOption) OrderOption {
return sql.OrderByField(FieldInviteCashback, opts...).ToFunc()
}
// ByParentField orders the results by parent field.
func ByParentField(field string, opts ...sql.OrderTermOption) OrderOption {
return func(s *sql.Selector) {
@@ -291,6 +319,34 @@ func ByCpTaskLogs(term sql.OrderTerm, terms ...sql.OrderTerm) OrderOption {
sqlgraph.OrderByNeighborTerms(s, newCpTaskLogsStep(), append([]sql.OrderTerm{term}, terms...)...)
}
}
// ByCreatedCardsCount orders the results by created_cards count.
func ByCreatedCardsCount(opts ...sql.OrderTermOption) OrderOption {
return func(s *sql.Selector) {
sqlgraph.OrderByNeighborsCount(s, newCreatedCardsStep(), opts...)
}
}
// ByCreatedCards orders the results by created_cards terms.
func ByCreatedCards(term sql.OrderTerm, terms ...sql.OrderTerm) OrderOption {
return func(s *sql.Selector) {
sqlgraph.OrderByNeighborTerms(s, newCreatedCardsStep(), append([]sql.OrderTerm{term}, terms...)...)
}
}
// ByUsedCardsCount orders the results by used_cards count.
func ByUsedCardsCount(opts ...sql.OrderTermOption) OrderOption {
return func(s *sql.Selector) {
sqlgraph.OrderByNeighborsCount(s, newUsedCardsStep(), opts...)
}
}
// ByUsedCards orders the results by used_cards terms.
func ByUsedCards(term sql.OrderTerm, terms ...sql.OrderTerm) OrderOption {
return func(s *sql.Selector) {
sqlgraph.OrderByNeighborTerms(s, newUsedCardsStep(), append([]sql.OrderTerm{term}, terms...)...)
}
}
func newParentStep() *sqlgraph.Step {
return sqlgraph.NewStep(
sqlgraph.From(Table, FieldID),
@@ -340,3 +396,17 @@ func newCpTaskLogsStep() *sqlgraph.Step {
sqlgraph.Edge(sqlgraph.O2M, false, CpTaskLogsTable, CpTaskLogsColumn),
)
}
func newCreatedCardsStep() *sqlgraph.Step {
return sqlgraph.NewStep(
sqlgraph.From(Table, FieldID),
sqlgraph.To(CreatedCardsInverseTable, FieldID),
sqlgraph.Edge(sqlgraph.O2M, false, CreatedCardsTable, CreatedCardsColumn),
)
}
func newUsedCardsStep() *sqlgraph.Step {
return sqlgraph.NewStep(
sqlgraph.From(Table, FieldID),
sqlgraph.To(UsedCardsInverseTable, FieldID),
sqlgraph.Edge(sqlgraph.O2M, false, UsedCardsTable, UsedCardsColumn),
)
}
+121
View File
@@ -101,6 +101,11 @@ func Verify(v bool) predicate.SysUser {
return predicate.SysUser(sql.FieldEQ(FieldVerify, v))
}
// InviteCashback applies equality check predicate on the "invite_cashback" field. It's identical to InviteCashbackEQ.
func InviteCashback(v decimal.Decimal) predicate.SysUser {
return predicate.SysUser(sql.FieldEQ(FieldInviteCashback, v))
}
// CreateTimeEQ applies the EQ predicate on the "create_time" field.
func CreateTimeEQ(v *ent2.CustomTime) predicate.SysUser {
return predicate.SysUser(sql.FieldEQ(FieldCreateTime, v))
@@ -601,6 +606,76 @@ func VerifyNEQ(v bool) predicate.SysUser {
return predicate.SysUser(sql.FieldNEQ(FieldVerify, v))
}
// InviteCashbackEQ applies the EQ predicate on the "invite_cashback" field.
func InviteCashbackEQ(v decimal.Decimal) predicate.SysUser {
return predicate.SysUser(sql.FieldEQ(FieldInviteCashback, v))
}
// InviteCashbackNEQ applies the NEQ predicate on the "invite_cashback" field.
func InviteCashbackNEQ(v decimal.Decimal) predicate.SysUser {
return predicate.SysUser(sql.FieldNEQ(FieldInviteCashback, v))
}
// InviteCashbackIn applies the In predicate on the "invite_cashback" field.
func InviteCashbackIn(vs ...decimal.Decimal) predicate.SysUser {
return predicate.SysUser(sql.FieldIn(FieldInviteCashback, vs...))
}
// InviteCashbackNotIn applies the NotIn predicate on the "invite_cashback" field.
func InviteCashbackNotIn(vs ...decimal.Decimal) predicate.SysUser {
return predicate.SysUser(sql.FieldNotIn(FieldInviteCashback, vs...))
}
// InviteCashbackGT applies the GT predicate on the "invite_cashback" field.
func InviteCashbackGT(v decimal.Decimal) predicate.SysUser {
return predicate.SysUser(sql.FieldGT(FieldInviteCashback, v))
}
// InviteCashbackGTE applies the GTE predicate on the "invite_cashback" field.
func InviteCashbackGTE(v decimal.Decimal) predicate.SysUser {
return predicate.SysUser(sql.FieldGTE(FieldInviteCashback, v))
}
// InviteCashbackLT applies the LT predicate on the "invite_cashback" field.
func InviteCashbackLT(v decimal.Decimal) predicate.SysUser {
return predicate.SysUser(sql.FieldLT(FieldInviteCashback, v))
}
// InviteCashbackLTE applies the LTE predicate on the "invite_cashback" field.
func InviteCashbackLTE(v decimal.Decimal) predicate.SysUser {
return predicate.SysUser(sql.FieldLTE(FieldInviteCashback, v))
}
// InviteCashbackContains applies the Contains predicate on the "invite_cashback" field.
func InviteCashbackContains(v decimal.Decimal) predicate.SysUser {
vc := v.String()
return predicate.SysUser(sql.FieldContains(FieldInviteCashback, vc))
}
// InviteCashbackHasPrefix applies the HasPrefix predicate on the "invite_cashback" field.
func InviteCashbackHasPrefix(v decimal.Decimal) predicate.SysUser {
vc := v.String()
return predicate.SysUser(sql.FieldHasPrefix(FieldInviteCashback, vc))
}
// InviteCashbackHasSuffix applies the HasSuffix predicate on the "invite_cashback" field.
func InviteCashbackHasSuffix(v decimal.Decimal) predicate.SysUser {
vc := v.String()
return predicate.SysUser(sql.FieldHasSuffix(FieldInviteCashback, vc))
}
// InviteCashbackEqualFold applies the EqualFold predicate on the "invite_cashback" field.
func InviteCashbackEqualFold(v decimal.Decimal) predicate.SysUser {
vc := v.String()
return predicate.SysUser(sql.FieldEqualFold(FieldInviteCashback, vc))
}
// InviteCashbackContainsFold applies the ContainsFold predicate on the "invite_cashback" field.
func InviteCashbackContainsFold(v decimal.Decimal) predicate.SysUser {
vc := v.String()
return predicate.SysUser(sql.FieldContainsFold(FieldInviteCashback, vc))
}
// HasParent applies the HasEdge predicate on the "parent" edge.
func HasParent() predicate.SysUser {
return predicate.SysUser(func(s *sql.Selector) {
@@ -762,6 +837,52 @@ func HasCpTaskLogsWith(preds ...predicate.CpTaskLog) predicate.SysUser {
})
}
// HasCreatedCards applies the HasEdge predicate on the "created_cards" edge.
func HasCreatedCards() predicate.SysUser {
return predicate.SysUser(func(s *sql.Selector) {
step := sqlgraph.NewStep(
sqlgraph.From(Table, FieldID),
sqlgraph.Edge(sqlgraph.O2M, false, CreatedCardsTable, CreatedCardsColumn),
)
sqlgraph.HasNeighbors(s, step)
})
}
// HasCreatedCardsWith applies the HasEdge predicate on the "created_cards" edge with a given conditions (other predicates).
func HasCreatedCardsWith(preds ...predicate.SysCard) predicate.SysUser {
return predicate.SysUser(func(s *sql.Selector) {
step := newCreatedCardsStep()
sqlgraph.HasNeighborsWith(s, step, func(s *sql.Selector) {
for _, p := range preds {
p(s)
}
})
})
}
// HasUsedCards applies the HasEdge predicate on the "used_cards" edge.
func HasUsedCards() predicate.SysUser {
return predicate.SysUser(func(s *sql.Selector) {
step := sqlgraph.NewStep(
sqlgraph.From(Table, FieldID),
sqlgraph.Edge(sqlgraph.O2M, false, UsedCardsTable, UsedCardsColumn),
)
sqlgraph.HasNeighbors(s, step)
})
}
// HasUsedCardsWith applies the HasEdge predicate on the "used_cards" edge with a given conditions (other predicates).
func HasUsedCardsWith(preds ...predicate.SysCard) predicate.SysUser {
return predicate.SysUser(func(s *sql.Selector) {
step := newUsedCardsStep()
sqlgraph.HasNeighborsWith(s, step, func(s *sql.Selector) {
for _, p := range preds {
p(s)
}
})
})
}
// And groups predicates with the AND operator between them.
func And(predicates ...predicate.SysUser) predicate.SysUser {
return predicate.SysUser(sql.AndPredicates(predicates...))
+131
View File
@@ -10,6 +10,7 @@ import (
"likedream-goframe/internal/ent/cptasklog"
"likedream-goframe/internal/ent/cpuser"
"likedream-goframe/internal/ent/sysagent"
"likedream-goframe/internal/ent/syscard"
"likedream-goframe/internal/ent/sysrole"
"likedream-goframe/internal/ent/sysuser"
"likedream-goframe/internal/framework/ent2"
@@ -114,6 +115,20 @@ func (_c *SysUserCreate) SetNillableVerify(v *bool) *SysUserCreate {
return _c
}
// SetInviteCashback sets the "invite_cashback" field.
func (_c *SysUserCreate) SetInviteCashback(v decimal.Decimal) *SysUserCreate {
_c.mutation.SetInviteCashback(v)
return _c
}
// SetNillableInviteCashback sets the "invite_cashback" field if the given value is not nil.
func (_c *SysUserCreate) SetNillableInviteCashback(v *decimal.Decimal) *SysUserCreate {
if v != nil {
_c.SetInviteCashback(*v)
}
return _c
}
// SetParentID sets the "parent" edge to the SysUser entity by ID.
func (_c *SysUserCreate) SetParentID(id int64) *SysUserCreate {
_c.mutation.SetParentID(id)
@@ -227,6 +242,36 @@ func (_c *SysUserCreate) AddCpTaskLogs(v ...*CpTaskLog) *SysUserCreate {
return _c.AddCpTaskLogIDs(ids...)
}
// AddCreatedCardIDs adds the "created_cards" edge to the SysCard entity by IDs.
func (_c *SysUserCreate) AddCreatedCardIDs(ids ...int64) *SysUserCreate {
_c.mutation.AddCreatedCardIDs(ids...)
return _c
}
// AddCreatedCards adds the "created_cards" edges to the SysCard entity.
func (_c *SysUserCreate) AddCreatedCards(v ...*SysCard) *SysUserCreate {
ids := make([]int64, len(v))
for i := range v {
ids[i] = v[i].ID
}
return _c.AddCreatedCardIDs(ids...)
}
// AddUsedCardIDs adds the "used_cards" edge to the SysCard entity by IDs.
func (_c *SysUserCreate) AddUsedCardIDs(ids ...int64) *SysUserCreate {
_c.mutation.AddUsedCardIDs(ids...)
return _c
}
// AddUsedCards adds the "used_cards" edges to the SysCard entity.
func (_c *SysUserCreate) AddUsedCards(v ...*SysCard) *SysUserCreate {
ids := make([]int64, len(v))
for i := range v {
ids[i] = v[i].ID
}
return _c.AddUsedCardIDs(ids...)
}
// Mutation returns the SysUserMutation object of the builder.
func (_c *SysUserCreate) Mutation() *SysUserMutation {
return _c.mutation
@@ -293,6 +338,13 @@ func (_c *SysUserCreate) defaults() error {
v := sysuser.DefaultVerify
_c.mutation.SetVerify(v)
}
if _, ok := _c.mutation.InviteCashback(); !ok {
if sysuser.DefaultInviteCashback == nil {
return fmt.Errorf("ent: uninitialized sysuser.DefaultInviteCashback (forgotten import ent/runtime?)")
}
v := sysuser.DefaultInviteCashback()
_c.mutation.SetInviteCashback(v)
}
return nil
}
@@ -327,6 +379,9 @@ func (_c *SysUserCreate) check() error {
if _, ok := _c.mutation.Verify(); !ok {
return &ValidationError{Name: "verify", err: errors.New(`ent: missing required field "SysUser.verify"`)}
}
if _, ok := _c.mutation.InviteCashback(); !ok {
return &ValidationError{Name: "invite_cashback", err: errors.New(`ent: missing required field "SysUser.invite_cashback"`)}
}
return nil
}
@@ -390,6 +445,10 @@ func (_c *SysUserCreate) createSpec() (*SysUser, *sqlgraph.CreateSpec) {
_spec.SetField(sysuser.FieldVerify, field.TypeBool, value)
_node.Verify = value
}
if value, ok := _c.mutation.InviteCashback(); ok {
_spec.SetField(sysuser.FieldInviteCashback, field.TypeString, value)
_node.InviteCashback = value
}
if nodes := _c.mutation.ParentIDs(); len(nodes) > 0 {
edge := &sqlgraph.EdgeSpec{
Rel: sqlgraph.M2O,
@@ -503,6 +562,38 @@ func (_c *SysUserCreate) createSpec() (*SysUser, *sqlgraph.CreateSpec) {
}
_spec.Edges = append(_spec.Edges, edge)
}
if nodes := _c.mutation.CreatedCardsIDs(); len(nodes) > 0 {
edge := &sqlgraph.EdgeSpec{
Rel: sqlgraph.O2M,
Inverse: false,
Table: sysuser.CreatedCardsTable,
Columns: []string{sysuser.CreatedCardsColumn},
Bidi: false,
Target: &sqlgraph.EdgeTarget{
IDSpec: sqlgraph.NewFieldSpec(syscard.FieldID, field.TypeInt64),
},
}
for _, k := range nodes {
edge.Target.Nodes = append(edge.Target.Nodes, k)
}
_spec.Edges = append(_spec.Edges, edge)
}
if nodes := _c.mutation.UsedCardsIDs(); len(nodes) > 0 {
edge := &sqlgraph.EdgeSpec{
Rel: sqlgraph.O2M,
Inverse: false,
Table: sysuser.UsedCardsTable,
Columns: []string{sysuser.UsedCardsColumn},
Bidi: false,
Target: &sqlgraph.EdgeTarget{
IDSpec: sqlgraph.NewFieldSpec(syscard.FieldID, field.TypeInt64),
},
}
for _, k := range nodes {
edge.Target.Nodes = append(edge.Target.Nodes, k)
}
_spec.Edges = append(_spec.Edges, edge)
}
return _node, _spec
}
@@ -657,6 +748,18 @@ func (u *SysUserUpsert) UpdateVerify() *SysUserUpsert {
return u
}
// SetInviteCashback sets the "invite_cashback" field.
func (u *SysUserUpsert) SetInviteCashback(v decimal.Decimal) *SysUserUpsert {
u.Set(sysuser.FieldInviteCashback, v)
return u
}
// UpdateInviteCashback sets the "invite_cashback" field to the value that was provided on create.
func (u *SysUserUpsert) UpdateInviteCashback() *SysUserUpsert {
u.SetExcluded(sysuser.FieldInviteCashback)
return u
}
// UpdateNewValues updates the mutable fields using the new values that were set on create.
// Using this option is equivalent to using:
//
@@ -821,6 +924,20 @@ func (u *SysUserUpsertOne) UpdateVerify() *SysUserUpsertOne {
})
}
// SetInviteCashback sets the "invite_cashback" field.
func (u *SysUserUpsertOne) SetInviteCashback(v decimal.Decimal) *SysUserUpsertOne {
return u.Update(func(s *SysUserUpsert) {
s.SetInviteCashback(v)
})
}
// UpdateInviteCashback sets the "invite_cashback" field to the value that was provided on create.
func (u *SysUserUpsertOne) UpdateInviteCashback() *SysUserUpsertOne {
return u.Update(func(s *SysUserUpsert) {
s.UpdateInviteCashback()
})
}
// Exec executes the query.
func (u *SysUserUpsertOne) Exec(ctx context.Context) error {
if len(u.create.conflict) == 0 {
@@ -1151,6 +1268,20 @@ func (u *SysUserUpsertBulk) UpdateVerify() *SysUserUpsertBulk {
})
}
// SetInviteCashback sets the "invite_cashback" field.
func (u *SysUserUpsertBulk) SetInviteCashback(v decimal.Decimal) *SysUserUpsertBulk {
return u.Update(func(s *SysUserUpsert) {
s.SetInviteCashback(v)
})
}
// UpdateInviteCashback sets the "invite_cashback" field to the value that was provided on create.
func (u *SysUserUpsertBulk) UpdateInviteCashback() *SysUserUpsertBulk {
return u.Update(func(s *SysUserUpsert) {
s.UpdateInviteCashback()
})
}
// Exec executes the query.
func (u *SysUserUpsertBulk) Exec(ctx context.Context) error {
if u.create.err != nil {
+172 -25
View File
@@ -11,6 +11,7 @@ import (
"likedream-goframe/internal/ent/cpuser"
"likedream-goframe/internal/ent/predicate"
"likedream-goframe/internal/ent/sysagent"
"likedream-goframe/internal/ent/syscard"
"likedream-goframe/internal/ent/sysrole"
"likedream-goframe/internal/ent/sysuser"
"math"
@@ -24,18 +25,20 @@ import (
// SysUserQuery is the builder for querying SysUser entities.
type SysUserQuery struct {
config
ctx *QueryContext
order []sysuser.OrderOption
inters []Interceptor
predicates []predicate.SysUser
withParent *SysUserQuery
withChildren *SysUserQuery
withRoles *SysRoleQuery
withAgent *SysAgentQuery
withImages *CpImageQuery
withCpuser *CpUserQuery
withCpTaskLogs *CpTaskLogQuery
withFKs bool
ctx *QueryContext
order []sysuser.OrderOption
inters []Interceptor
predicates []predicate.SysUser
withParent *SysUserQuery
withChildren *SysUserQuery
withRoles *SysRoleQuery
withAgent *SysAgentQuery
withImages *CpImageQuery
withCpuser *CpUserQuery
withCpTaskLogs *CpTaskLogQuery
withCreatedCards *SysCardQuery
withUsedCards *SysCardQuery
withFKs bool
// intermediate query (i.e. traversal path).
sql *sql.Selector
path func(context.Context) (*sql.Selector, error)
@@ -226,6 +229,50 @@ func (_q *SysUserQuery) QueryCpTaskLogs() *CpTaskLogQuery {
return query
}
// QueryCreatedCards chains the current query on the "created_cards" edge.
func (_q *SysUserQuery) QueryCreatedCards() *SysCardQuery {
query := (&SysCardClient{config: _q.config}).Query()
query.path = func(ctx context.Context) (fromU *sql.Selector, err error) {
if err := _q.prepareQuery(ctx); err != nil {
return nil, err
}
selector := _q.sqlQuery(ctx)
if err := selector.Err(); err != nil {
return nil, err
}
step := sqlgraph.NewStep(
sqlgraph.From(sysuser.Table, sysuser.FieldID, selector),
sqlgraph.To(syscard.Table, syscard.FieldID),
sqlgraph.Edge(sqlgraph.O2M, false, sysuser.CreatedCardsTable, sysuser.CreatedCardsColumn),
)
fromU = sqlgraph.SetNeighbors(_q.driver.Dialect(), step)
return fromU, nil
}
return query
}
// QueryUsedCards chains the current query on the "used_cards" edge.
func (_q *SysUserQuery) QueryUsedCards() *SysCardQuery {
query := (&SysCardClient{config: _q.config}).Query()
query.path = func(ctx context.Context) (fromU *sql.Selector, err error) {
if err := _q.prepareQuery(ctx); err != nil {
return nil, err
}
selector := _q.sqlQuery(ctx)
if err := selector.Err(); err != nil {
return nil, err
}
step := sqlgraph.NewStep(
sqlgraph.From(sysuser.Table, sysuser.FieldID, selector),
sqlgraph.To(syscard.Table, syscard.FieldID),
sqlgraph.Edge(sqlgraph.O2M, false, sysuser.UsedCardsTable, sysuser.UsedCardsColumn),
)
fromU = sqlgraph.SetNeighbors(_q.driver.Dialect(), step)
return fromU, nil
}
return query
}
// First returns the first SysUser entity from the query.
// Returns a *NotFoundError when no SysUser was found.
func (_q *SysUserQuery) First(ctx context.Context) (*SysUser, error) {
@@ -413,18 +460,20 @@ func (_q *SysUserQuery) Clone() *SysUserQuery {
return nil
}
return &SysUserQuery{
config: _q.config,
ctx: _q.ctx.Clone(),
order: append([]sysuser.OrderOption{}, _q.order...),
inters: append([]Interceptor{}, _q.inters...),
predicates: append([]predicate.SysUser{}, _q.predicates...),
withParent: _q.withParent.Clone(),
withChildren: _q.withChildren.Clone(),
withRoles: _q.withRoles.Clone(),
withAgent: _q.withAgent.Clone(),
withImages: _q.withImages.Clone(),
withCpuser: _q.withCpuser.Clone(),
withCpTaskLogs: _q.withCpTaskLogs.Clone(),
config: _q.config,
ctx: _q.ctx.Clone(),
order: append([]sysuser.OrderOption{}, _q.order...),
inters: append([]Interceptor{}, _q.inters...),
predicates: append([]predicate.SysUser{}, _q.predicates...),
withParent: _q.withParent.Clone(),
withChildren: _q.withChildren.Clone(),
withRoles: _q.withRoles.Clone(),
withAgent: _q.withAgent.Clone(),
withImages: _q.withImages.Clone(),
withCpuser: _q.withCpuser.Clone(),
withCpTaskLogs: _q.withCpTaskLogs.Clone(),
withCreatedCards: _q.withCreatedCards.Clone(),
withUsedCards: _q.withUsedCards.Clone(),
// clone intermediate query.
sql: _q.sql.Clone(),
path: _q.path,
@@ -508,6 +557,28 @@ func (_q *SysUserQuery) WithCpTaskLogs(opts ...func(*CpTaskLogQuery)) *SysUserQu
return _q
}
// WithCreatedCards tells the query-builder to eager-load the nodes that are connected to
// the "created_cards" edge. The optional arguments are used to configure the query builder of the edge.
func (_q *SysUserQuery) WithCreatedCards(opts ...func(*SysCardQuery)) *SysUserQuery {
query := (&SysCardClient{config: _q.config}).Query()
for _, opt := range opts {
opt(query)
}
_q.withCreatedCards = query
return _q
}
// WithUsedCards tells the query-builder to eager-load the nodes that are connected to
// the "used_cards" edge. The optional arguments are used to configure the query builder of the edge.
func (_q *SysUserQuery) WithUsedCards(opts ...func(*SysCardQuery)) *SysUserQuery {
query := (&SysCardClient{config: _q.config}).Query()
for _, opt := range opts {
opt(query)
}
_q.withUsedCards = query
return _q
}
// GroupBy is used to group vertices by one or more fields/columns.
// It is often used with aggregate functions, like: count, max, mean, min, sum.
//
@@ -587,7 +658,7 @@ func (_q *SysUserQuery) sqlAll(ctx context.Context, hooks ...queryHook) ([]*SysU
nodes = []*SysUser{}
withFKs = _q.withFKs
_spec = _q.querySpec()
loadedTypes = [7]bool{
loadedTypes = [9]bool{
_q.withParent != nil,
_q.withChildren != nil,
_q.withRoles != nil,
@@ -595,6 +666,8 @@ func (_q *SysUserQuery) sqlAll(ctx context.Context, hooks ...queryHook) ([]*SysU
_q.withImages != nil,
_q.withCpuser != nil,
_q.withCpTaskLogs != nil,
_q.withCreatedCards != nil,
_q.withUsedCards != nil,
}
)
if _q.withParent != nil {
@@ -668,6 +741,20 @@ func (_q *SysUserQuery) sqlAll(ctx context.Context, hooks ...queryHook) ([]*SysU
return nil, err
}
}
if query := _q.withCreatedCards; query != nil {
if err := _q.loadCreatedCards(ctx, query, nodes,
func(n *SysUser) { n.Edges.CreatedCards = []*SysCard{} },
func(n *SysUser, e *SysCard) { n.Edges.CreatedCards = append(n.Edges.CreatedCards, e) }); err != nil {
return nil, err
}
}
if query := _q.withUsedCards; query != nil {
if err := _q.loadUsedCards(ctx, query, nodes,
func(n *SysUser) { n.Edges.UsedCards = []*SysCard{} },
func(n *SysUser, e *SysCard) { n.Edges.UsedCards = append(n.Edges.UsedCards, e) }); err != nil {
return nil, err
}
}
return nodes, nil
}
@@ -913,6 +1000,66 @@ func (_q *SysUserQuery) loadCpTaskLogs(ctx context.Context, query *CpTaskLogQuer
}
return nil
}
func (_q *SysUserQuery) loadCreatedCards(ctx context.Context, query *SysCardQuery, nodes []*SysUser, init func(*SysUser), assign func(*SysUser, *SysCard)) error {
fks := make([]driver.Value, 0, len(nodes))
nodeids := make(map[int64]*SysUser)
for i := range nodes {
fks = append(fks, nodes[i].ID)
nodeids[nodes[i].ID] = nodes[i]
if init != nil {
init(nodes[i])
}
}
if len(query.ctx.Fields) > 0 {
query.ctx.AppendFieldOnce(syscard.FieldCreatorID)
}
query.Where(predicate.SysCard(func(s *sql.Selector) {
s.Where(sql.InValues(s.C(sysuser.CreatedCardsColumn), fks...))
}))
neighbors, err := query.All(ctx)
if err != nil {
return err
}
for _, n := range neighbors {
fk := n.CreatorID
node, ok := nodeids[fk]
if !ok {
return fmt.Errorf(`unexpected referenced foreign-key "creator_id" returned %v for node %v`, fk, n.ID)
}
assign(node, n)
}
return nil
}
func (_q *SysUserQuery) loadUsedCards(ctx context.Context, query *SysCardQuery, nodes []*SysUser, init func(*SysUser), assign func(*SysUser, *SysCard)) error {
fks := make([]driver.Value, 0, len(nodes))
nodeids := make(map[int64]*SysUser)
for i := range nodes {
fks = append(fks, nodes[i].ID)
nodeids[nodes[i].ID] = nodes[i]
if init != nil {
init(nodes[i])
}
}
if len(query.ctx.Fields) > 0 {
query.ctx.AppendFieldOnce(syscard.FieldUsedID)
}
query.Where(predicate.SysCard(func(s *sql.Selector) {
s.Where(sql.InValues(s.C(sysuser.UsedCardsColumn), fks...))
}))
neighbors, err := query.All(ctx)
if err != nil {
return err
}
for _, n := range neighbors {
fk := n.UsedID
node, ok := nodeids[fk]
if !ok {
return fmt.Errorf(`unexpected referenced foreign-key "used_id" returned %v for node %v`, fk, n.ID)
}
assign(node, n)
}
return nil
}
func (_q *SysUserQuery) sqlCount(ctx context.Context) (int, error) {
_spec := _q.querySpec()
+359
View File
@@ -11,6 +11,7 @@ import (
"likedream-goframe/internal/ent/cpuser"
"likedream-goframe/internal/ent/predicate"
"likedream-goframe/internal/ent/sysagent"
"likedream-goframe/internal/ent/syscard"
"likedream-goframe/internal/ent/sysrole"
"likedream-goframe/internal/ent/sysuser"
"likedream-goframe/internal/framework/ent2"
@@ -144,6 +145,20 @@ func (_u *SysUserUpdate) SetNillableVerify(v *bool) *SysUserUpdate {
return _u
}
// SetInviteCashback sets the "invite_cashback" field.
func (_u *SysUserUpdate) SetInviteCashback(v decimal.Decimal) *SysUserUpdate {
_u.mutation.SetInviteCashback(v)
return _u
}
// SetNillableInviteCashback sets the "invite_cashback" field if the given value is not nil.
func (_u *SysUserUpdate) SetNillableInviteCashback(v *decimal.Decimal) *SysUserUpdate {
if v != nil {
_u.SetInviteCashback(*v)
}
return _u
}
// SetParentID sets the "parent" edge to the SysUser entity by ID.
func (_u *SysUserUpdate) SetParentID(id int64) *SysUserUpdate {
_u.mutation.SetParentID(id)
@@ -257,6 +272,36 @@ func (_u *SysUserUpdate) AddCpTaskLogs(v ...*CpTaskLog) *SysUserUpdate {
return _u.AddCpTaskLogIDs(ids...)
}
// AddCreatedCardIDs adds the "created_cards" edge to the SysCard entity by IDs.
func (_u *SysUserUpdate) AddCreatedCardIDs(ids ...int64) *SysUserUpdate {
_u.mutation.AddCreatedCardIDs(ids...)
return _u
}
// AddCreatedCards adds the "created_cards" edges to the SysCard entity.
func (_u *SysUserUpdate) AddCreatedCards(v ...*SysCard) *SysUserUpdate {
ids := make([]int64, len(v))
for i := range v {
ids[i] = v[i].ID
}
return _u.AddCreatedCardIDs(ids...)
}
// AddUsedCardIDs adds the "used_cards" edge to the SysCard entity by IDs.
func (_u *SysUserUpdate) AddUsedCardIDs(ids ...int64) *SysUserUpdate {
_u.mutation.AddUsedCardIDs(ids...)
return _u
}
// AddUsedCards adds the "used_cards" edges to the SysCard entity.
func (_u *SysUserUpdate) AddUsedCards(v ...*SysCard) *SysUserUpdate {
ids := make([]int64, len(v))
for i := range v {
ids[i] = v[i].ID
}
return _u.AddUsedCardIDs(ids...)
}
// Mutation returns the SysUserMutation object of the builder.
func (_u *SysUserUpdate) Mutation() *SysUserMutation {
return _u.mutation
@@ -379,6 +424,48 @@ func (_u *SysUserUpdate) RemoveCpTaskLogs(v ...*CpTaskLog) *SysUserUpdate {
return _u.RemoveCpTaskLogIDs(ids...)
}
// ClearCreatedCards clears all "created_cards" edges to the SysCard entity.
func (_u *SysUserUpdate) ClearCreatedCards() *SysUserUpdate {
_u.mutation.ClearCreatedCards()
return _u
}
// RemoveCreatedCardIDs removes the "created_cards" edge to SysCard entities by IDs.
func (_u *SysUserUpdate) RemoveCreatedCardIDs(ids ...int64) *SysUserUpdate {
_u.mutation.RemoveCreatedCardIDs(ids...)
return _u
}
// RemoveCreatedCards removes "created_cards" edges to SysCard entities.
func (_u *SysUserUpdate) RemoveCreatedCards(v ...*SysCard) *SysUserUpdate {
ids := make([]int64, len(v))
for i := range v {
ids[i] = v[i].ID
}
return _u.RemoveCreatedCardIDs(ids...)
}
// ClearUsedCards clears all "used_cards" edges to the SysCard entity.
func (_u *SysUserUpdate) ClearUsedCards() *SysUserUpdate {
_u.mutation.ClearUsedCards()
return _u
}
// RemoveUsedCardIDs removes the "used_cards" edge to SysCard entities by IDs.
func (_u *SysUserUpdate) RemoveUsedCardIDs(ids ...int64) *SysUserUpdate {
_u.mutation.RemoveUsedCardIDs(ids...)
return _u
}
// RemoveUsedCards removes "used_cards" edges to SysCard entities.
func (_u *SysUserUpdate) RemoveUsedCards(v ...*SysCard) *SysUserUpdate {
ids := make([]int64, len(v))
for i := range v {
ids[i] = v[i].ID
}
return _u.RemoveUsedCardIDs(ids...)
}
// Save executes the query and returns the number of nodes affected by the update operation.
func (_u *SysUserUpdate) Save(ctx context.Context) (int, error) {
return withHooks(ctx, _u.sqlSave, _u.mutation, _u.hooks)
@@ -455,6 +542,9 @@ func (_u *SysUserUpdate) sqlSave(ctx context.Context) (_node int, err error) {
if value, ok := _u.mutation.Verify(); ok {
_spec.SetField(sysuser.FieldVerify, field.TypeBool, value)
}
if value, ok := _u.mutation.InviteCashback(); ok {
_spec.SetField(sysuser.FieldInviteCashback, field.TypeString, value)
}
if _u.mutation.ParentCleared() {
edge := &sqlgraph.EdgeSpec{
Rel: sqlgraph.M2O,
@@ -738,6 +828,96 @@ func (_u *SysUserUpdate) sqlSave(ctx context.Context) (_node int, err error) {
}
_spec.Edges.Add = append(_spec.Edges.Add, edge)
}
if _u.mutation.CreatedCardsCleared() {
edge := &sqlgraph.EdgeSpec{
Rel: sqlgraph.O2M,
Inverse: false,
Table: sysuser.CreatedCardsTable,
Columns: []string{sysuser.CreatedCardsColumn},
Bidi: false,
Target: &sqlgraph.EdgeTarget{
IDSpec: sqlgraph.NewFieldSpec(syscard.FieldID, field.TypeInt64),
},
}
_spec.Edges.Clear = append(_spec.Edges.Clear, edge)
}
if nodes := _u.mutation.RemovedCreatedCardsIDs(); len(nodes) > 0 && !_u.mutation.CreatedCardsCleared() {
edge := &sqlgraph.EdgeSpec{
Rel: sqlgraph.O2M,
Inverse: false,
Table: sysuser.CreatedCardsTable,
Columns: []string{sysuser.CreatedCardsColumn},
Bidi: false,
Target: &sqlgraph.EdgeTarget{
IDSpec: sqlgraph.NewFieldSpec(syscard.FieldID, field.TypeInt64),
},
}
for _, k := range nodes {
edge.Target.Nodes = append(edge.Target.Nodes, k)
}
_spec.Edges.Clear = append(_spec.Edges.Clear, edge)
}
if nodes := _u.mutation.CreatedCardsIDs(); len(nodes) > 0 {
edge := &sqlgraph.EdgeSpec{
Rel: sqlgraph.O2M,
Inverse: false,
Table: sysuser.CreatedCardsTable,
Columns: []string{sysuser.CreatedCardsColumn},
Bidi: false,
Target: &sqlgraph.EdgeTarget{
IDSpec: sqlgraph.NewFieldSpec(syscard.FieldID, field.TypeInt64),
},
}
for _, k := range nodes {
edge.Target.Nodes = append(edge.Target.Nodes, k)
}
_spec.Edges.Add = append(_spec.Edges.Add, edge)
}
if _u.mutation.UsedCardsCleared() {
edge := &sqlgraph.EdgeSpec{
Rel: sqlgraph.O2M,
Inverse: false,
Table: sysuser.UsedCardsTable,
Columns: []string{sysuser.UsedCardsColumn},
Bidi: false,
Target: &sqlgraph.EdgeTarget{
IDSpec: sqlgraph.NewFieldSpec(syscard.FieldID, field.TypeInt64),
},
}
_spec.Edges.Clear = append(_spec.Edges.Clear, edge)
}
if nodes := _u.mutation.RemovedUsedCardsIDs(); len(nodes) > 0 && !_u.mutation.UsedCardsCleared() {
edge := &sqlgraph.EdgeSpec{
Rel: sqlgraph.O2M,
Inverse: false,
Table: sysuser.UsedCardsTable,
Columns: []string{sysuser.UsedCardsColumn},
Bidi: false,
Target: &sqlgraph.EdgeTarget{
IDSpec: sqlgraph.NewFieldSpec(syscard.FieldID, field.TypeInt64),
},
}
for _, k := range nodes {
edge.Target.Nodes = append(edge.Target.Nodes, k)
}
_spec.Edges.Clear = append(_spec.Edges.Clear, edge)
}
if nodes := _u.mutation.UsedCardsIDs(); len(nodes) > 0 {
edge := &sqlgraph.EdgeSpec{
Rel: sqlgraph.O2M,
Inverse: false,
Table: sysuser.UsedCardsTable,
Columns: []string{sysuser.UsedCardsColumn},
Bidi: false,
Target: &sqlgraph.EdgeTarget{
IDSpec: sqlgraph.NewFieldSpec(syscard.FieldID, field.TypeInt64),
},
}
for _, k := range nodes {
edge.Target.Nodes = append(edge.Target.Nodes, k)
}
_spec.Edges.Add = append(_spec.Edges.Add, edge)
}
if _node, err = sqlgraph.UpdateNodes(ctx, _u.driver, _spec); err != nil {
if _, ok := err.(*sqlgraph.NotFoundError); ok {
err = &NotFoundError{sysuser.Label}
@@ -868,6 +1048,20 @@ func (_u *SysUserUpdateOne) SetNillableVerify(v *bool) *SysUserUpdateOne {
return _u
}
// SetInviteCashback sets the "invite_cashback" field.
func (_u *SysUserUpdateOne) SetInviteCashback(v decimal.Decimal) *SysUserUpdateOne {
_u.mutation.SetInviteCashback(v)
return _u
}
// SetNillableInviteCashback sets the "invite_cashback" field if the given value is not nil.
func (_u *SysUserUpdateOne) SetNillableInviteCashback(v *decimal.Decimal) *SysUserUpdateOne {
if v != nil {
_u.SetInviteCashback(*v)
}
return _u
}
// SetParentID sets the "parent" edge to the SysUser entity by ID.
func (_u *SysUserUpdateOne) SetParentID(id int64) *SysUserUpdateOne {
_u.mutation.SetParentID(id)
@@ -981,6 +1175,36 @@ func (_u *SysUserUpdateOne) AddCpTaskLogs(v ...*CpTaskLog) *SysUserUpdateOne {
return _u.AddCpTaskLogIDs(ids...)
}
// AddCreatedCardIDs adds the "created_cards" edge to the SysCard entity by IDs.
func (_u *SysUserUpdateOne) AddCreatedCardIDs(ids ...int64) *SysUserUpdateOne {
_u.mutation.AddCreatedCardIDs(ids...)
return _u
}
// AddCreatedCards adds the "created_cards" edges to the SysCard entity.
func (_u *SysUserUpdateOne) AddCreatedCards(v ...*SysCard) *SysUserUpdateOne {
ids := make([]int64, len(v))
for i := range v {
ids[i] = v[i].ID
}
return _u.AddCreatedCardIDs(ids...)
}
// AddUsedCardIDs adds the "used_cards" edge to the SysCard entity by IDs.
func (_u *SysUserUpdateOne) AddUsedCardIDs(ids ...int64) *SysUserUpdateOne {
_u.mutation.AddUsedCardIDs(ids...)
return _u
}
// AddUsedCards adds the "used_cards" edges to the SysCard entity.
func (_u *SysUserUpdateOne) AddUsedCards(v ...*SysCard) *SysUserUpdateOne {
ids := make([]int64, len(v))
for i := range v {
ids[i] = v[i].ID
}
return _u.AddUsedCardIDs(ids...)
}
// Mutation returns the SysUserMutation object of the builder.
func (_u *SysUserUpdateOne) Mutation() *SysUserMutation {
return _u.mutation
@@ -1103,6 +1327,48 @@ func (_u *SysUserUpdateOne) RemoveCpTaskLogs(v ...*CpTaskLog) *SysUserUpdateOne
return _u.RemoveCpTaskLogIDs(ids...)
}
// ClearCreatedCards clears all "created_cards" edges to the SysCard entity.
func (_u *SysUserUpdateOne) ClearCreatedCards() *SysUserUpdateOne {
_u.mutation.ClearCreatedCards()
return _u
}
// RemoveCreatedCardIDs removes the "created_cards" edge to SysCard entities by IDs.
func (_u *SysUserUpdateOne) RemoveCreatedCardIDs(ids ...int64) *SysUserUpdateOne {
_u.mutation.RemoveCreatedCardIDs(ids...)
return _u
}
// RemoveCreatedCards removes "created_cards" edges to SysCard entities.
func (_u *SysUserUpdateOne) RemoveCreatedCards(v ...*SysCard) *SysUserUpdateOne {
ids := make([]int64, len(v))
for i := range v {
ids[i] = v[i].ID
}
return _u.RemoveCreatedCardIDs(ids...)
}
// ClearUsedCards clears all "used_cards" edges to the SysCard entity.
func (_u *SysUserUpdateOne) ClearUsedCards() *SysUserUpdateOne {
_u.mutation.ClearUsedCards()
return _u
}
// RemoveUsedCardIDs removes the "used_cards" edge to SysCard entities by IDs.
func (_u *SysUserUpdateOne) RemoveUsedCardIDs(ids ...int64) *SysUserUpdateOne {
_u.mutation.RemoveUsedCardIDs(ids...)
return _u
}
// RemoveUsedCards removes "used_cards" edges to SysCard entities.
func (_u *SysUserUpdateOne) RemoveUsedCards(v ...*SysCard) *SysUserUpdateOne {
ids := make([]int64, len(v))
for i := range v {
ids[i] = v[i].ID
}
return _u.RemoveUsedCardIDs(ids...)
}
// Where appends a list predicates to the SysUserUpdate builder.
func (_u *SysUserUpdateOne) Where(ps ...predicate.SysUser) *SysUserUpdateOne {
_u.mutation.Where(ps...)
@@ -1209,6 +1475,9 @@ func (_u *SysUserUpdateOne) sqlSave(ctx context.Context) (_node *SysUser, err er
if value, ok := _u.mutation.Verify(); ok {
_spec.SetField(sysuser.FieldVerify, field.TypeBool, value)
}
if value, ok := _u.mutation.InviteCashback(); ok {
_spec.SetField(sysuser.FieldInviteCashback, field.TypeString, value)
}
if _u.mutation.ParentCleared() {
edge := &sqlgraph.EdgeSpec{
Rel: sqlgraph.M2O,
@@ -1492,6 +1761,96 @@ func (_u *SysUserUpdateOne) sqlSave(ctx context.Context) (_node *SysUser, err er
}
_spec.Edges.Add = append(_spec.Edges.Add, edge)
}
if _u.mutation.CreatedCardsCleared() {
edge := &sqlgraph.EdgeSpec{
Rel: sqlgraph.O2M,
Inverse: false,
Table: sysuser.CreatedCardsTable,
Columns: []string{sysuser.CreatedCardsColumn},
Bidi: false,
Target: &sqlgraph.EdgeTarget{
IDSpec: sqlgraph.NewFieldSpec(syscard.FieldID, field.TypeInt64),
},
}
_spec.Edges.Clear = append(_spec.Edges.Clear, edge)
}
if nodes := _u.mutation.RemovedCreatedCardsIDs(); len(nodes) > 0 && !_u.mutation.CreatedCardsCleared() {
edge := &sqlgraph.EdgeSpec{
Rel: sqlgraph.O2M,
Inverse: false,
Table: sysuser.CreatedCardsTable,
Columns: []string{sysuser.CreatedCardsColumn},
Bidi: false,
Target: &sqlgraph.EdgeTarget{
IDSpec: sqlgraph.NewFieldSpec(syscard.FieldID, field.TypeInt64),
},
}
for _, k := range nodes {
edge.Target.Nodes = append(edge.Target.Nodes, k)
}
_spec.Edges.Clear = append(_spec.Edges.Clear, edge)
}
if nodes := _u.mutation.CreatedCardsIDs(); len(nodes) > 0 {
edge := &sqlgraph.EdgeSpec{
Rel: sqlgraph.O2M,
Inverse: false,
Table: sysuser.CreatedCardsTable,
Columns: []string{sysuser.CreatedCardsColumn},
Bidi: false,
Target: &sqlgraph.EdgeTarget{
IDSpec: sqlgraph.NewFieldSpec(syscard.FieldID, field.TypeInt64),
},
}
for _, k := range nodes {
edge.Target.Nodes = append(edge.Target.Nodes, k)
}
_spec.Edges.Add = append(_spec.Edges.Add, edge)
}
if _u.mutation.UsedCardsCleared() {
edge := &sqlgraph.EdgeSpec{
Rel: sqlgraph.O2M,
Inverse: false,
Table: sysuser.UsedCardsTable,
Columns: []string{sysuser.UsedCardsColumn},
Bidi: false,
Target: &sqlgraph.EdgeTarget{
IDSpec: sqlgraph.NewFieldSpec(syscard.FieldID, field.TypeInt64),
},
}
_spec.Edges.Clear = append(_spec.Edges.Clear, edge)
}
if nodes := _u.mutation.RemovedUsedCardsIDs(); len(nodes) > 0 && !_u.mutation.UsedCardsCleared() {
edge := &sqlgraph.EdgeSpec{
Rel: sqlgraph.O2M,
Inverse: false,
Table: sysuser.UsedCardsTable,
Columns: []string{sysuser.UsedCardsColumn},
Bidi: false,
Target: &sqlgraph.EdgeTarget{
IDSpec: sqlgraph.NewFieldSpec(syscard.FieldID, field.TypeInt64),
},
}
for _, k := range nodes {
edge.Target.Nodes = append(edge.Target.Nodes, k)
}
_spec.Edges.Clear = append(_spec.Edges.Clear, edge)
}
if nodes := _u.mutation.UsedCardsIDs(); len(nodes) > 0 {
edge := &sqlgraph.EdgeSpec{
Rel: sqlgraph.O2M,
Inverse: false,
Table: sysuser.UsedCardsTable,
Columns: []string{sysuser.UsedCardsColumn},
Bidi: false,
Target: &sqlgraph.EdgeTarget{
IDSpec: sqlgraph.NewFieldSpec(syscard.FieldID, field.TypeInt64),
},
}
for _, k := range nodes {
edge.Target.Nodes = append(edge.Target.Nodes, k)
}
_spec.Edges.Add = append(_spec.Edges.Add, edge)
}
_node = &SysUser{config: _u.config}
_spec.Assign = _node.assignValues
_spec.ScanValues = _node.scanValues
+3
View File
@@ -22,6 +22,8 @@ type Tx struct {
CpUser *CpUserClient
// SysAgent is the client for interacting with the SysAgent builders.
SysAgent *SysAgentClient
// SysCard is the client for interacting with the SysCard builders.
SysCard *SysCardClient
// SysMenu is the client for interacting with the SysMenu builders.
SysMenu *SysMenuClient
// SysRole is the client for interacting with the SysRole builders.
@@ -166,6 +168,7 @@ func (tx *Tx) init() {
tx.CpTaskLog = NewCpTaskLogClient(tx.config)
tx.CpUser = NewCpUserClient(tx.config)
tx.SysAgent = NewSysAgentClient(tx.config)
tx.SysCard = NewSysCardClient(tx.config)
tx.SysMenu = NewSysMenuClient(tx.config)
tx.SysRole = NewSysRoleClient(tx.config)
tx.SysUser = NewSysUserClient(tx.config)
+13 -6
View File
@@ -8,6 +8,7 @@ import (
"fmt"
"html/template"
"likedream-goframe/internal/cst"
"likedream-goframe/internal/framework/logger"
"likedream-goframe/internal/model/email"
"likedream-goframe/internal/queue"
"likedream-goframe/internal/utils"
@@ -57,19 +58,22 @@ func NewV1() *EmailServiceV1 {
}
// SendSignupEmail 发送注册成功邮件
func (s *EmailServiceV1) SendSignupEmail(ctx context.Context, toEmail, username string) *utils.Response[any] {
func (s *EmailServiceV1) SendSignupEmail(ctx context.Context, toEmail, username string, token string) *utils.Response[any] {
if s.config.SMTPUsername == "" || s.config.SMTPPassword == "" {
logger.Logger.Error("邮件服务未配置")
return utils.FailBusiness("邮件服务未配置")
}
subject := fmt.Sprintf("欢迎注册%s", cst.AppName)
body, err := s.renderSignupEmailTemplate(username)
body, err := s.renderSignupEmailTemplate(username, token)
if err != nil {
logger.Logger.Error("邮件模板渲染失败")
return utils.FailBusiness(fmt.Sprintf("邮件模板渲染失败: %v", err))
}
err = s.sendEmail(ctx, toEmail, subject, body)
if err != nil {
logger.Logger.Error("邮件发送失败")
return utils.FailBusiness(fmt.Sprintf("邮件发送失败: %v", err))
}
@@ -145,16 +149,19 @@ func (s *EmailServiceV1) getTemplates() (*template.Template, error) {
}
// renderSignupEmailTemplate 渲染注册邮件模板
func (s *EmailServiceV1) renderSignupEmailTemplate(username string) (string, error) {
func (s *EmailServiceV1) renderSignupEmailTemplate(username string, token string) (string, error) {
tmpl, err := s.getTemplates()
if err != nil {
return "", err
}
data := NewSignupTemplateData(username, cst.AppName, cst.AppCopyright)
get, err := g.Cfg().Get(gctx.New(), cst.ConfigEmailConfirmBaseUrl)
if err != nil {
return "", err
}
data := NewSignupTemplateData(username, cst.AppName, cst.AppCopyright, get.String()+token)
var buf bytes.Buffer
err = tmpl.ExecuteTemplate(&buf, "signup.gohtml", data)
err = tmpl.ExecuteTemplate(&buf, "signup_confirm.gohtml", data)
if err != nil {
return "", fmt.Errorf("渲染注册邮件模板失败: %v", err)
}
+1 -1
View File
@@ -12,7 +12,7 @@ func TestEmailTemplates(t *testing.T) {
// 测试注册邮件模板
t.Run("signup_email_template", func(t *testing.T) {
body, err := service.renderSignupEmailTemplate("测试用户")
body, err := service.renderSignupEmailTemplate("测试用户", "")
if err != nil {
t.Fatalf("渲染注册邮件模板失败: %v", err)
}
+8 -4
View File
@@ -1,6 +1,8 @@
package email
import "likedream-goframe/internal/model/email"
import (
"likedream-goframe/internal/model/email"
)
// BaseTemplateData 基础模板数据
type BaseTemplateData struct {
@@ -15,11 +17,12 @@ type BaseTemplateData struct {
// SignupTemplateData 注册邮件模板数据
type SignupTemplateData struct {
BaseTemplateData
Username string `json:"username"` // 用户名
Username string `json:"username"` // 用户名
VerificationURL string `json:"verification_url"`
}
// NewSignupTemplateData 创建注册邮件模板数据
func NewSignupTemplateData(username, appName, copyright string) *SignupTemplateData {
func NewSignupTemplateData(username, appName, copyright string, verificationURL string) *SignupTemplateData {
return &SignupTemplateData{
BaseTemplateData: BaseTemplateData{
Title: "欢迎注册" + appName,
@@ -29,7 +32,8 @@ func NewSignupTemplateData(username, appName, copyright string) *SignupTemplateD
AppName: appName,
AppCopyright: copyright,
},
Username: username,
Username: username,
VerificationURL: verificationURL,
}
}
@@ -0,0 +1,57 @@
{{template "layout" .}}
{{define "extra-styles"}}
<style>
.feature-list {
background: linear-gradient(135deg, #f8faff 0%, #f1f5f9 100%);
border-radius: 12px;
padding: 25px;
margin: 25px 0;
border-left: 4px solid #667eea;
}
.feature-list ul {
list-style: none;
padding: 0;
}
.feature-list li {
padding: 8px 0;
position: relative;
padding-left: 30px;
font-size: 15px;
}
.feature-list li::before {
content: '✓';
position: absolute;
left: 0;
top: 8px;
color: #667eea;
font-weight: bold;
font-size: 16px;
}
</style>
{{end}}
{{define "content"}}
<h2>亲爱的 <span class="highlight-text">{{.Username}}</span>,您好!</h2>
<p>感谢您注册<strong>{{.AppName}}</strong>账户!请点击下面的链接完成邮箱验证:</p>
<div style="text-align: center; margin: 30px 0;">
<a href="{{.VerificationURL}}"
style="background-color: #007bff; color: white; padding: 12px 24px;
text-decoration: none; border-radius: 4px; display: inline-block;">
验证邮箱地址
</a>
</div>
<p>如果按钮无法点击,请复制以下链接到浏览器地址栏:</p>
<p style="word-break: break-all; color: #666;">{{.VerificationURL}}</p>
<p><strong>链接有效期:24小时</strong></p>
<hr>
<p>如果您在使用过程中遇到任何问题,请随时联系我们的技术支持团队。我们将竭诚为您服务!</p>
<p><strong>祝您使用愉快!</strong> 🌟</p>
{{end}}
@@ -32,7 +32,7 @@
background: #f8faff;
border-radius: 12px;
padding: 20px;
border-left: 3px solid {{.StatusColor}};
{{/*border-left: 3px solid {{.StatusColor}};*/}}
}
.details-list ul {
+1
View File
@@ -77,6 +77,7 @@ func (s *MenuServiceV1) Update(ctx context.Context, req *v1.MenuUpdateReq) *util
SetType(req.Type).
SetLink(req.Link).
SetPermission(req.Permission).
SetComponent(req.Component).
SetRoute(req.Route).
SetHidden(req.Hidden).
SetIcon(req.Icon).
@@ -2,13 +2,19 @@ package user_login
import (
"context"
"fmt"
v1 "likedream-goframe/internal/api/v1"
"likedream-goframe/internal/db"
"likedream-goframe/internal/ent"
"likedream-goframe/internal/ent/syscard"
"likedream-goframe/internal/ent/sysmenu"
"likedream-goframe/internal/ent/sysrole"
"likedream-goframe/internal/ent/sysuser"
"likedream-goframe/internal/utils"
"strings"
"github.com/samber/oops"
"github.com/shopspring/decimal"
)
// UserInfoServiceV1 用户登录实现service
@@ -50,6 +56,83 @@ func (s *UserInfoServiceV1) UserInfo(ctx context.Context) *utils.Response[any] {
return utils.SuccessWithData[any](userInfo)
}
func (s *UserInfoServiceV1) Profile(ctx context.Context, req *v1.CommonReq) *utils.Response[any] {
user := utils.GetUserInfoFromCtx(ctx)
userInfo := db.Global.SysUser.Query().Where(sysuser.ID(user.ID)).WithParent().WithAgent().WithRoles().FirstX(ctx)
inviteCount := db.Global.SysUser.Query().Where(sysuser.HasParentWith(sysuser.ID(user.ID))).CountX(ctx)
profileInfo := &v1.UserProfileRes{
ID: userInfo.ID,
Username: userInfo.Username,
Email: userInfo.Email,
Avatar: fmt.Sprintf("https://q1.qlogo.cn/g?b=qq&nk=%s&s=100", strings.Split(userInfo.Email, "@qq.com")[0]),
InviteCode: userInfo.InviteCode,
InviteCount: inviteCount,
InviteCashback: userInfo.InviteCashback,
Balance: userInfo.Balance,
}
if userInfo.Edges.Parent != nil {
profileInfo.ParentUsername = userInfo.Edges.Parent.Username
profileInfo.ParentEmail = userInfo.Edges.Parent.Email
}
if userInfo.Edges.Agent != nil {
profileInfo.Rate = userInfo.Edges.Agent.Rate
profileInfo.Level = userInfo.Edges.Agent.Level
}
return utils.SuccessWithData[any](profileInfo)
}
func (s *UserInfoServiceV1) ResetPassword(ctx context.Context, req *v1.ResetPasswordReq) *utils.Response[any] {
user := utils.GetUserInfoFromCtx(ctx)
var pwd []string
db.Global.SysUser.Query().Where(sysuser.ID(user.ID)).Select(sysuser.FieldPassword).ScanX(ctx, &pwd)
if utils.PasswordCompare(req.OldPassword, pwd[0]) {
if req.OldPassword == pwd[0] {
return utils.FailParam("新密码不能与旧密码相同")
}
if req.ConfirmPassword == req.NewPassword {
db.Global.SysUser.UpdateOneID(user.ID).SetPassword(utils.PasswordBcryptHash(req.NewPassword)).ExecX(ctx)
return utils.SuccessWithMsg("密码修改成功")
}
return utils.FailParam("两次密码不一致")
}
return utils.FailParam("密码错误")
}
func (s *UserInfoServiceV1) UsedCardList(ctx context.Context, req *v1.CommonPageReq) *utils.Response[[]*ent.SysCard] {
user := utils.GetUserInfoFromCtx(ctx)
query := db.Global.SysCard.Query().Where(syscard.UsedID(user.ID))
//查询总数
total := query.CountX(ctx)
query.Limit(req.Size).Offset(req.Page * req.Size)
list := query.AllX(ctx)
return utils.SuccessWithTotal[[]*ent.SysCard](list, total)
}
func (s *UserInfoServiceV1) CardRecharge(ctx context.Context, req *v1.CardRechargeReq) *utils.Response[any] {
user := utils.GetUserInfoFromCtx(ctx)
card, err := db.Global.SysCard.Query().Where(syscard.Content(req.Card)).First(ctx)
if ent.IsNotFound(err) {
return utils.FailParam("卡密错误")
}
if card.Status != 1 {
return utils.FailParam("卡密错误")
}
tx, err := db.Global.Tx(ctx)
utils.OkOrPanic(err)
tx.SysCard.UpdateOneID(card.ID).SetStatus(2).SetUsedID(user.ID).ExecX(ctx)
tx.SysUser.UpdateOneID(user.ID).SetBalance(user.Balance.Add(decimal.NewFromUint64(card.Value))).ExecX(ctx)
err = tx.Commit()
utils.OkOrPanic(err, func(err error) error {
return oops.
WithContext(ctx).
With("更新用户余额失败").
Wrap(err)
})
return utils.SuccessWithMsg("充值成功")
}
func buildTreeMenu(list []*ent.SysMenu, parentId int64) []*v1.UserMenuRes {
var menuList []*v1.UserMenuRes
for _, menu := range list {
@@ -2,14 +2,18 @@ package user_login
import (
"context"
"crypto/rand"
"encoding/base64"
"likedream-goframe/internal/api/v1"
"likedream-goframe/internal/cst"
"likedream-goframe/internal/db"
"likedream-goframe/internal/ent"
"likedream-goframe/internal/ent/sysrole"
"likedream-goframe/internal/ent/sysuser"
"likedream-goframe/internal/redis"
"likedream-goframe/internal/service/email"
"likedream-goframe/internal/utils"
"time"
"github.com/gogf/gf/v2/net/ghttp"
"github.com/samber/oops"
@@ -32,7 +36,10 @@ func (s *UserLoginServiceV1) Login(ctx context.Context, req *v1.UserLoginReq) *u
return utils.FailParam("用户名或密码错误")
}
if !user.Verify {
return utils.FailParam("用户未激活")
return utils.FailParam("当前用户未验证")
}
if user.Block {
return utils.FailParam("当前用户被封禁")
}
r := ghttp.RequestFromCtx(ctx)
r.Response.Header().Set(cst.AuthorizationKey, utils.GenerateToken(user.ID))
@@ -41,6 +48,10 @@ func (s *UserLoginServiceV1) Login(ctx context.Context, req *v1.UserLoginReq) *u
func (s *UserLoginServiceV1) Register(ctx context.Context, req *v1.UserRegisterReq) *utils.Response[any] {
//邀请码查询
var parent *ent.SysUser
if req.InviteCode != "" {
parent = db.Global.SysUser.Query().Where(sysuser.InviteCodeEQ(req.InviteCode)).OnlyX(ctx)
}
tx, err := db.Global.Tx(ctx)
utils.OkOrPanic(err, func(err error) error {
return oops.
@@ -48,10 +59,6 @@ func (s *UserLoginServiceV1) Register(ctx context.Context, req *v1.UserRegisterR
With("创建事务失败").
Wrap(err)
})
var parent *ent.SysUser
if req.InviteCode != "" {
parent = tx.SysUser.Query().Where(sysuser.InviteCodeEQ(req.InviteCode)).OnlyX(ctx)
}
// 查询用户名或邮箱是否存在
if tx.SysUser.Query().Where(sysuser.Or(sysuser.UsernameEQ(req.Username), sysuser.EmailEQ(req.Email))).ExistX(ctx) {
return utils.FailParam("用户名或邮箱已存在")
@@ -77,10 +84,14 @@ func (s *UserLoginServiceV1) Register(ctx context.Context, req *v1.UserRegisterR
// 注册成功后发送欢迎邮件(异步发送,不影响注册结果)
go func() {
token := make([]byte, 32)
_, _ = rand.Read(token)
tokenStr := base64.URLEncoding.EncodeToString(token)
redis.GetClient().Set(ctx, cst.RedisVerifyCode+tokenStr, req.Email, time.Duration(cst.RedisVerifyCodeExpire))
// 创建新的context避免原context被取消
emailCtx := context.Background()
emailService := email.NewV1()
emailService.SendSignupEmail(emailCtx, req.Email, req.Username)
emailService.SendSignupEmail(emailCtx, req.Email, req.Username, tokenStr)
}()
return utils.SuccessWithMsg("注册成功")
+1
View File
@@ -8,6 +8,7 @@ func PasswordBcryptHash(password string) string {
return string(hash)
}
// hash比较密码 相同为true不同为false
func PasswordCompare(password, hash string) bool {
return bcrypt.CompareHashAndPassword([]byte(hash), []byte(password)) == nil
}