diff --git a/server/api/admin/imconfiginternal/im_config.go b/server/api/admin/imconfiginternal/im_config.go index d36b5b5..2c495a3 100644 --- a/server/api/admin/imconfiginternal/im_config.go +++ b/server/api/admin/imconfiginternal/im_config.go @@ -99,14 +99,24 @@ type SecurityPolicyReq struct { } type SecurityPolicyRes struct { - TenantID int64 `json:"tenant_id"` - TenantCode string `json:"tenant_code"` - PolicyVersion uint `json:"policy_version"` - GlobalFriendEnabled bool `json:"global_friend_enabled"` - FriendDisabledPolicy map[string]interface{} `json:"friend_disabled_policy"` - MessageCurfewEnabled bool `json:"message_curfew_enabled"` + TenantID int64 `json:"tenant_id"` + TenantCode string `json:"tenant_code"` + PolicyVersion uint `json:"policy_version"` + GlobalFriendEnabled bool `json:"global_friend_enabled"` + FriendDisabledPolicy map[string]interface{} `json:"friend_disabled_policy"` + MessageCurfewEnabled bool `json:"message_curfew_enabled"` LoginRateLimit *SecurityLoginRateLimitRes `json:"login_rate_limit"` - CurfewRules []*SecurityCurfewRuleRes `json:"curfew_rules"` + CurfewRules []*SecurityCurfewRuleRes `json:"curfew_rules"` +} + +type RealnamePolicyReq struct { + g.Meta `path:"/internal/im-config/tenants/by-id/{id}/realname-policy" method:"get" tags:"IM内部配置" summary:"获取租户实名认证策略"` + Id int64 `json:"id" in:"path" dc:"租户ID"` +} + +type RealnamePolicyRes struct { + TenantID int64 `json:"tenant_id"` + RealnameReviewPolicy int `json:"realname_review_policy"` } type SecurityLoginRateLimitRes struct { diff --git a/server/internal/controller/internalapi/imconfig/im_config.go b/server/internal/controller/internalapi/imconfig/im_config.go index c6e0618..d218fa9 100644 --- a/server/internal/controller/internalapi/imconfig/im_config.go +++ b/server/internal/controller/internalapi/imconfig/im_config.go @@ -302,6 +302,29 @@ func (c *cConfig) SecurityPolicy(ctx context.Context, req *api.SecurityPolicyReq return res, nil } +func (c *cConfig) RealnamePolicy(ctx context.Context, req *api.RealnamePolicyReq) (res *api.RealnamePolicyRes, err error) { + tenant, err := getTenant(ctx, dao.ImTenant.Columns().Id, req.Id) + if err != nil { + return nil, err + } + res = defaultRealnamePolicy(tenant.Id) + var row *struct { + RealnameReviewPolicy int `json:"realname_review_policy"` + } + if err = imtenant.RegistryDB().Model(dao.ImTenantConfig.Table()).Safe().Ctx(ctx). + Fields("realname_review_policy"). + Where(dao.ImTenantConfig.Columns().TenantId, tenant.Id).Scan(&row); err != nil { + return nil, gerror.Wrap(err, "获取租户实名认证策略失败") + } + if row == nil { + return res, nil + } + if row.RealnameReviewPolicy == 1 { + res.RealnameReviewPolicy = 1 + } + return res, nil +} + func parseStringArray(raw string) []string { values := []string{} if strings.TrimSpace(raw) == "" { @@ -366,6 +389,13 @@ func defaultModerationPolicy(tenant *entity.ImTenant) *api.ModerationPolicyRes { BlockMessage: "内容不符合平台规范,请修改后重试"} } +func defaultRealnamePolicy(tenantID int64) *api.RealnamePolicyRes { + return &api.RealnamePolicyRes{ + TenantID: tenantID, + RealnameReviewPolicy: 0, + } +} + func cloneBoolMap(src map[string]bool) map[string]bool { dst := make(map[string]bool, len(src)) for k, v := range src { diff --git a/server/internal/logic/sys/im_tenant.go b/server/internal/logic/sys/im_tenant.go index f43db62..aa3bc19 100644 --- a/server/internal/logic/sys/im_tenant.go +++ b/server/internal/logic/sys/im_tenant.go @@ -28,16 +28,18 @@ type sSysImTenant struct{} const ( tenantConfigAliyunModerationEnabled = "aliyun_moderation_enabled" tenantConfigLocalModerationEnabled = "local_moderation_enabled" + tenantConfigRealnameReviewPolicy = "realname_review_policy" ) type imTenantConfigModeration struct { - Id int64 `json:"id"` - TenantId int64 `json:"tenant_id"` - MaxUsers uint64 `json:"max_users"` - MaxGroups uint64 `json:"max_groups"` - MaxGroupMembers uint `json:"max_group_members"` - AliyunModerationEnabled int `json:"aliyun_moderation_enabled"` - LocalModerationEnabled int `json:"local_moderation_enabled"` + Id int64 `json:"id" orm:"id"` + TenantId int64 `json:"tenant_id" orm:"tenant_id"` + MaxUsers uint64 `json:"max_users" orm:"max_users"` + MaxGroups uint64 `json:"max_groups" orm:"max_groups"` + MaxGroupMembers uint `json:"max_group_members" orm:"max_group_members"` + AliyunModerationEnabled int `json:"aliyun_moderation_enabled" orm:"aliyun_moderation_enabled"` + LocalModerationEnabled int `json:"local_moderation_enabled" orm:"local_moderation_enabled"` + RealnameReviewPolicy int `json:"realname_review_policy" orm:"realname_review_policy"` } func NewSysImTenant() *sSysImTenant { @@ -157,6 +159,7 @@ func (s *sSysImTenant) fillListConfig(ctx context.Context, list []*sysin.ImTenan item.MaxGroupMembers = conf.MaxGroupMembers item.AliyunModerationEnabled = conf.AliyunModerationEnabled item.LocalModerationEnabled = conf.LocalModerationEnabled + item.RealnameReviewPolicy = conf.RealnameReviewPolicy } item.DbDsnConfigured = dsnMap[item.Id] != "" } @@ -210,7 +213,7 @@ func (s *sSysImTenant) saveTenant(ctx context.Context, in *sysin.ImTenantEditInp WherePri(in.Id).Data(in).Update(); err != nil { return gerror.Wrap(err, "修改IM租户失败,请稍后重试!") } - return s.saveConfig(ctx, in.Id, in.MaxUsers, in.MaxGroups, in.MaxGroupMembers, in.AliyunModerationEnabled, in.LocalModerationEnabled, userId) + return s.saveConfig(ctx, in, userId) } in.CreatedBy = userId @@ -222,7 +225,8 @@ func (s *sSysImTenant) saveTenant(ctx context.Context, in *sysin.ImTenantEditInp return gerror.Wrap(err, "新增IM租户失败,请稍后重试!") } tenantID = id - return s.saveConfig(ctx, id, in.MaxUsers, in.MaxGroups, in.MaxGroupMembers, in.AliyunModerationEnabled, in.LocalModerationEnabled, userId) + in.Id = id + return s.saveConfig(ctx, in, userId) }) if err != nil { return err @@ -246,20 +250,21 @@ func (s *sSysImTenant) checkCodeUnique(ctx context.Context, id int64, code strin return } -func (s *sSysImTenant) saveConfig(ctx context.Context, tenantId int64, maxUsers uint64, maxGroups uint64, maxGroupMembers uint, aliyunModerationEnabled, localModerationEnabled int, userId int64) (err error) { +func (s *sSysImTenant) saveConfig(ctx context.Context, in *sysin.ImTenantEditInp, userId int64) (err error) { var conf *entity.ImTenantConfig if err = s.configModel(ctx). - Where(dao.ImTenantConfig.Columns().TenantId, tenantId). + Where(dao.ImTenantConfig.Columns().TenantId, in.Id). Scan(&conf); err != nil { return gerror.Wrap(err, "获取IM租户配置失败,请稍后重试!") } data := g.Map{ - dao.ImTenantConfig.Columns().MaxUsers: maxUsers, - dao.ImTenantConfig.Columns().MaxGroups: maxGroups, - dao.ImTenantConfig.Columns().MaxGroupMembers: maxGroupMembers, - tenantConfigAliyunModerationEnabled: aliyunModerationEnabled, - tenantConfigLocalModerationEnabled: localModerationEnabled, + dao.ImTenantConfig.Columns().MaxUsers: in.MaxUsers, + dao.ImTenantConfig.Columns().MaxGroups: in.MaxGroups, + dao.ImTenantConfig.Columns().MaxGroupMembers: in.MaxGroupMembers, + tenantConfigAliyunModerationEnabled: in.AliyunModerationEnabled, + tenantConfigLocalModerationEnabled: in.LocalModerationEnabled, + tenantConfigRealnameReviewPolicy: in.RealnameReviewPolicy, } if conf != nil && conf.Id > 0 { data[dao.ImTenantConfig.Columns().UpdatedBy] = userId @@ -270,6 +275,7 @@ func (s *sSysImTenant) saveConfig(ctx context.Context, tenantId int64, maxUsers dao.ImTenantConfig.Columns().MaxGroupMembers, tenantConfigAliyunModerationEnabled, tenantConfigLocalModerationEnabled, + tenantConfigRealnameReviewPolicy, dao.ImTenantConfig.Columns().UpdatedBy, ). WherePri(conf.Id).Data(data).Update(); err != nil { @@ -278,7 +284,7 @@ func (s *sSysImTenant) saveConfig(ctx context.Context, tenantId int64, maxUsers return } - data[dao.ImTenantConfig.Columns().TenantId] = tenantId + data[dao.ImTenantConfig.Columns().TenantId] = in.Id data[dao.ImTenantConfig.Columns().CreatedBy] = userId data[dao.ImTenantConfig.Columns().UpdatedBy] = userId if _, err = s.configModel(ctx). @@ -289,6 +295,7 @@ func (s *sSysImTenant) saveConfig(ctx context.Context, tenantId int64, maxUsers dao.ImTenantConfig.Columns().MaxGroupMembers, tenantConfigAliyunModerationEnabled, tenantConfigLocalModerationEnabled, + tenantConfigRealnameReviewPolicy, dao.ImTenantConfig.Columns().CreatedBy, dao.ImTenantConfig.Columns().UpdatedBy, ). @@ -324,6 +331,7 @@ func (s *sSysImTenant) View(ctx context.Context, in *sysin.ImTenantViewInp) (res res.MaxGroupMembers = conf.MaxGroupMembers res.AliyunModerationEnabled = conf.AliyunModerationEnabled res.LocalModerationEnabled = conf.LocalModerationEnabled + res.RealnameReviewPolicy = conf.RealnameReviewPolicy } res.DbDsnConfigured = res.DbDsn != "" return diff --git a/server/internal/model/input/sysin/im_tenant.go b/server/internal/model/input/sysin/im_tenant.go index 274be13..69a350c 100644 --- a/server/internal/model/input/sysin/im_tenant.go +++ b/server/internal/model/input/sysin/im_tenant.go @@ -48,6 +48,7 @@ type ImTenantConfigUpdateFields struct { MaxGroupMembers uint `json:"maxGroupMembers" dc:"最大群成员数"` AliyunModerationEnabled int `json:"aliyunModerationEnabled" dc:"是否启用阿里云内容审核"` LocalModerationEnabled int `json:"localModerationEnabled" dc:"是否启用本地内容审核"` + RealnameReviewPolicy int `json:"realnameReviewPolicy" dc:"实名审核策略"` UpdatedBy int64 `json:"updatedBy" dc:"更新者"` } @@ -59,6 +60,7 @@ type ImTenantConfigInsertFields struct { MaxGroupMembers uint `json:"maxGroupMembers" dc:"最大群成员数"` AliyunModerationEnabled int `json:"aliyunModerationEnabled" dc:"是否启用阿里云内容审核"` LocalModerationEnabled int `json:"localModerationEnabled" dc:"是否启用本地内容审核"` + RealnameReviewPolicy int `json:"realnameReviewPolicy" dc:"实名审核策略"` CreatedBy int64 `json:"createdBy" dc:"创建者"` } @@ -70,6 +72,7 @@ type ImTenantEditInp struct { MaxGroupMembers uint `json:"maxGroupMembers" dc:"最大群成员数"` AliyunModerationEnabled int `json:"aliyunModerationEnabled" dc:"是否启用阿里云内容审核"` LocalModerationEnabled int `json:"localModerationEnabled" dc:"是否启用本地内容审核"` + RealnameReviewPolicy int `json:"realnameReviewPolicy" dc:"实名审核策略"` } func (in *ImTenantEditInp) Filter(ctx context.Context) (err error) { @@ -89,6 +92,9 @@ func (in *ImTenantEditInp) Filter(ctx context.Context) (err error) { (in.LocalModerationEnabled != 0 && in.LocalModerationEnabled != 1) { return gerror.New("内容审核开关值不正确") } + if in.RealnameReviewPolicy != 0 && in.RealnameReviewPolicy != 1 { + return gerror.New("实名审核策略不正确") + } return } @@ -110,6 +116,7 @@ type ImTenantViewModel struct { MaxGroupMembers uint `json:"maxGroupMembers" dc:"最大群成员数"` AliyunModerationEnabled int `json:"aliyunModerationEnabled" dc:"是否启用阿里云内容审核"` LocalModerationEnabled int `json:"localModerationEnabled" dc:"是否启用本地内容审核"` + RealnameReviewPolicy int `json:"realnameReviewPolicy" dc:"实名审核策略"` CreatedBySumma *hook.MemberSumma `json:"createdBySumma" dc:"创建者摘要信息"` UpdatedBySumma *hook.MemberSumma `json:"updatedBySumma" dc:"更新者摘要信息"` DbDsnConfigured bool `json:"dbDsnConfigured" dc:"是否配置独立连接串"` @@ -144,6 +151,7 @@ type ImTenantListModel struct { MaxGroupMembers uint `json:"maxGroupMembers" dc:"最大群成员数"` AliyunModerationEnabled int `json:"aliyunModerationEnabled" dc:"是否启用阿里云内容审核"` LocalModerationEnabled int `json:"localModerationEnabled" dc:"是否启用本地内容审核"` + RealnameReviewPolicy int `json:"realnameReviewPolicy" dc:"实名审核策略"` DbDsnConfigured bool `json:"dbDsnConfigured" dc:"是否配置独立连接串"` CreatedBy int64 `json:"createdBy" dc:"创建者"` CreatedBySumma *hook.MemberSumma `json:"createdBySumma" dc:"创建者摘要信息"` diff --git a/web/src/views/imTenant/edit.vue b/web/src/views/imTenant/edit.vue index d83018f..280502e 100644 --- a/web/src/views/imTenant/edit.vue +++ b/web/src/views/imTenant/edit.vue @@ -100,6 +100,15 @@ /> + + + + + (row.realnameReviewPolicy === 1 ? '自动审核' : '人工审核') } + ); + }, + }, { title: '创建者', key: 'createdBy',