package qualityowner import ( "encoding/json" "errors" "strings" "time" ) const ( ConfigKey = "quality_owner.rules" StatusNone = "none" StatusActive = "active" DepositSourcePaid = "paid" DepositSourceManual = "manual" defaultDepositCent = int64(20_000) defaultInsuranceBps = 800 defaultPremiumRateBps = 400 defaultAgreementReadSeconds = 15 defaultAgreementTitle = "优质号主服务协议" MaxAgreementReadSeconds = 300 ) var ErrInvalidRules = errors.New("invalid quality owner rules") type Rules struct { DepositAmountCent int64 `json:"deposit_amount_cent"` InsuranceFeeBps int `json:"insurance_fee_bps"` PremiumInsuranceFeeBps int `json:"premium_insurance_fee_bps"` AgreementTitle string `json:"agreement_title"` AgreementContent string `json:"agreement_content"` AgreementReadSeconds int `json:"agreement_read_seconds"` } func DefaultRules() Rules { return Rules{ DepositAmountCent: defaultDepositCent, InsuranceFeeBps: defaultInsuranceBps, PremiumInsuranceFeeBps: defaultPremiumRateBps, AgreementTitle: defaultAgreementTitle, AgreementReadSeconds: defaultAgreementReadSeconds, AgreementContent: `本协议由大锤商行平台(以下简称“平台”)与申请成为“优质号主”的用户(以下简称“号主”)共同签署,自号主勾选同意并完成信用保证金冻结之日起生效。 一、总则 1.1 为保障平台账号租赁交易的秩序与安全,平台推出「优质号主」认证计划,旨在筛选信誉良好、服务高效的号主,为其提供专属权益与曝光资源,包括将账号发布至「极品专区」并享有专项收益比例等。 1.2 号主自愿申请成为优质号主,并承诺遵守本协议全部条款。 二、定义 | 术语 | 定义 | |---|---| | 优质号主 | 通过平台认证、完成200元信用保证金冻结并遵守本协议的高信誉号主 | | 《极品专区》 | 优质号主可选择发布的专属渠道,仅限大锤商行至尊SVIP用户租用;优质号主在该渠道发布账号可享有专项收益比例及专属标识 | | 《大锤商行》 | 优质号主可选择发布的公开渠道,面向全平台注册用户租用 | | 信用保证金(押金) | 号主为获得优质号主发布资格而授权平台冻结的200元信用保证金,仅冻结、不扣除 | | 大锤商行至尊SVIP | 平台最高等级VIP用户,须同时满足租客免押资格方可租用《极品专区》渠道账号 | 三、成为优质号主的条件 3.1 信用保证金标准 本计划仅设一个信用保证金档位,所有申请者统一适用: | 申请类型 | 信用保证金 | 备注 | |---|---:|---| | 所有申请者 | 200元 | 仅冻结,不扣除;不设其他金额档位或免押档位 | 3.2 强制前置条件 所有申请者须强制阅读《账号出租号主须知》满15秒,方可继续申请流程。 3.3 信用保证金特别约定 3.3.1 保证金性质:200元为信用保证金,仅用于信用展示及发布资格核验,不属于租赁费用、平台服务收入、违约金或处罚金。平台不扣除、不没收该保证金。 3.3.2 冻结方式:号主申请成为优质号主时,授权平台冻结200元信用保证金。冻结期间,该保证金不参与扣罚。 3.3.3 解冻条件:号主在无正在进行中的订单且无未解决的纠纷时,可随时向平台申请解冻全部信用保证金。平台审核通过后,按原支付路径或平台规则允许的方式解冻退还。 3.3.4 校验机制:每次发布账号时,系统自动核验信用保证金是否足额冻结: - 已足额冻结 → 可正常发布; - 未冻结或冻结不足 → 不可发布,系统弹窗提示“请先冻结200元信用保证金”。 3.3.5 违规处理与保证金:号主单方面违规的,平台有权依据本协议及平台规则采取警告、下架账号、限制发布、取消优质号主资格等措施,但信用保证金不扣除。如存在未完成订单或未解决纠纷,信用保证金可继续冻结至相关事项处理完毕。 四、优质号主的权利 成功成为优质号主后,享有以下权益: | 序号 | 权益内容 | 具体说明 | |---|---|---| | 4.1 | 专项收益比例 | 优质号主将账号发布至「极品专区」的,享有专项收益比例:号主到手金额比例较普通渠道上浮1个百分点(即平台服务费比例相应下调1个百分点,具体以发布页面公示为准);该权益可与VIP权益及优惠券叠加使用 | | 4.2 | 发布渠道选择 | 发布时可自由选择投放至「极品专区」或「大锤商行」(详见第五条) | | 4.3 | 特殊曝光标识 | 优质号主发布的账号显示“优质号主”专属标识;发布至「极品专区」的账号同时展示“极品专区”专属标签 | | 4.4 | 包赔手续费减半 | 购买全额包赔服务,手续费由8%降至4% | | 4.5 | 平台兜底保障 | 非因号主明显过错导致的问题(如租客恶意损坏账号等),由平台按规则负责兜底赔偿 | 五、发布渠道规则 优质号主在每次发布账号时,必须从以下两个渠道中二选一: 5.1 渠道对比 | 对比项 | 《极品专区》 | 《大锤商行》 | |---|---|---| | 租用资格 | 仅限大锤商行至尊SVIP,且须具备租客免押资格 | 全平台注册用户 | | 租客筛选标准 | 累计消费≥1万元 + 无纠纷记录 + 无封禁记录 | 无特殊限制 | | 适用场景 | 高客单价、极致安全、专项收益比例 | 高曝光、快速出单 | 5.2 关于《极品专区》渠道 5.2.1 选择该渠道的账号,将展示“极品专区”专属标签。 5.2.2 非大锤商行至尊SVIP用户,或虽为大锤商行至尊SVIP但无租客免押资格的,不可查看及租用该渠道账号。 5.2.3 该渠道租客均为平台严选的优质租客,号主可享受“基本绝对安全”的出租体验。 5.2.4 优质号主在该渠道发布账号,可按本协议第4.1款享有专项收益比例。 5.3 关于《大锤商行》渠道 5.3.1 选择该渠道的账号,面向全体平台注册用户开放租用。 5.3.2 号主仍享有平台兜底保障权益(详见第4.5款)。 六、号主的义务与违规处理 6.1 号主的基本义务 优质号主在交易中应当: 6.1.1 按照约定时间交付账号,不得无故毁约、爽约; 6.1.2 在租客使用过程中,及时配合上号验证; 6.1.3 在需要时,积极配合完成人脸识别解除等操作; 6.1.4 不得在出租期间擅自顶号、修改密码或通过其他方式收回账号; 6.1.5 与租客保持友善沟通,不得出现辱骂、威胁等不文明行为。 6.2 违规行为与处罚 平台对违规行为采取警告、下架、限制发布、取消资格等措施;信用保证金不扣除。 | 违规行为 | 处理措施 | |---|---| | 顶号 | 警告、立即下架、限制发布;情节严重者取消优质号主资格 | | 毁约不出租 | 警告、下架、限制发布;情节严重者取消优质号主资格 | | 无法及时配合上号 | 警告、限制发布;多次违规者取消资格 | | 无法配合解除人脸 | 警告、下架、限制发布;情节严重者取消资格 | | 其他违反平台规则的行为 | 依据平台规则处理 | 上述处理均不扣除信用保证金;如存在未完成订单或未解决纠纷,信用保证金可继续冻结至相关事项处理完毕。 七、收益与结算 7.1 号主通过本平台获得的租赁收入,平台将按对应渠道的结算规则进行结算。 7.2 优质号主将账号发布至「极品专区」的,按本协议第4.1款享有专项收益比例;该权益可与VIP权益及优惠券叠加使用。 7.3 平台将在租客确认收货后将收益划转至号主账户余额,号主可随时申请提现。 八、免责条款 8.1 因不可抗力(包括但不限于自然灾害、战争、罢工、政府行为、网络故障、系统维护等)导致协议无法履行的,双方互不承担责任。 8.2 平台有权根据法律法规变化或业务运营需要,对本协议进行修订,修订后的协议将在平台公示。如号主继续使用优质号主服务,视为接受修订内容。 九、协议终止 9.1 号主可随时申请退出优质号主计划。满足信用保证金解冻条件的,200元信用保证金予以解冻退还,优质号主资格即时取消。 9.2 号主严重违反本协议或平台规则的,平台有权单方面取消其优质号主资格。信用保证金不扣除;如存在未完成订单或未解决纠纷,可继续冻结至相关事项处理完毕。 9.3 优质号主资格取消后,对应的权益(特殊曝光、包赔手续费减半、发布渠道选择、极品专区专项收益比例等)同步终止。 十、附则 10.1 本协议的解释权归大锤商行平台所有。 10.2 本协议自号主勾选同意并完成200元信用保证金冻结之日起生效。 10.3 如本协议与平台其他规则存在冲突,以本协议为准。 本人已详细阅读并充分理解本协议全部内容,同意遵守上述条款。`, } } func DefaultConfigValue() string { raw, _ := json.Marshal(DefaultRules()) return string(raw) } func ParseConfigValue(value string) (Rules, error) { rules := DefaultRules() if value == "" { return rules, nil } if err := json.Unmarshal([]byte(value), &rules); err != nil { return Rules{}, ErrInvalidRules } if rules.DepositAmountCent <= 0 || rules.DepositAmountCent > 10_000_000 { return Rules{}, ErrInvalidRules } if rules.InsuranceFeeBps < 0 || rules.InsuranceFeeBps > 10_000 { return Rules{}, ErrInvalidRules } if rules.PremiumInsuranceFeeBps < 0 || rules.PremiumInsuranceFeeBps > rules.InsuranceFeeBps { return Rules{}, ErrInvalidRules } rules.AgreementTitle = strings.TrimSpace(rules.AgreementTitle) rules.AgreementContent = strings.TrimSpace(rules.AgreementContent) if rules.AgreementTitle == "" || rules.AgreementContent == "" { return Rules{}, ErrInvalidRules } if rules.AgreementReadSeconds < defaultAgreementReadSeconds || rules.AgreementReadSeconds > MaxAgreementReadSeconds { return Rules{}, ErrInvalidRules } return rules, nil } func MarshalConfig(rules Rules) (string, error) { raw, err := json.Marshal(rules) if err != nil { return "", err } return string(raw), nil } type StatusDTO struct { UserID uint64 `json:"user_id"` Active bool `json:"active"` Status string `json:"status"` CanCancel bool `json:"can_cancel"` ActivePremiumListings int64 `json:"active_premium_listing_count"` DepositAmountCent int64 `json:"deposit_amount_cent"` DepositSource string `json:"deposit_source"` ActivatedAt *time.Time `json:"activated_at"` AvailableBalanceCent int64 `json:"available_balance_cent"` RequiredDepositCent int64 `json:"required_deposit_cent"` InsuranceFeeBps int `json:"insurance_fee_bps"` PremiumInsuranceFeeBps int `json:"premium_insurance_fee_bps"` AgreementTitle string `json:"agreement_title"` AgreementContent string `json:"agreement_content"` AgreementReadSeconds int `json:"agreement_read_seconds"` } type AdminSetRequest struct { Enabled bool `json:"enabled"` Reason string `json:"reason" binding:"required"` }