package com.izouma.nineth.domain; import com.alibaba.excel.annotation.ExcelIgnore; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonView; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.izouma.nineth.annotations.Searchable; import com.izouma.nineth.enums.AuthStatus; import com.izouma.nineth.enums.InviteType; import com.izouma.nineth.enums.SearchMode; import com.izouma.nineth.security.Authority; import com.izouma.nineth.utils.UserAuthoritySerializer; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import org.hibernate.annotations.BatchSize; import org.hibernate.annotations.DynamicUpdate; import javax.persistence.*; import javax.validation.constraints.Size; import java.io.Serializable; import java.math.BigDecimal; import java.util.HashSet; import java.util.Set; @Data @Entity @Table(indexes = { @Index(columnList = "phone", unique = true, name = "user_index_phone"), @Index(columnList = "collectionId"), @Index(columnList = "collectionInvitor"), @Index(columnList = "admin"), @Index(columnList = "minter"), @Index(columnList = "company"), @Index(columnList = "createdAt"), @Index(columnList = "settleAccountId"), @Index(columnList = "nickname"), @Index(columnList = "del"), }) @AllArgsConstructor @NoArgsConstructor @Builder @ApiModel(value = "用户", description = "用户") @DynamicUpdate public class User extends UserBaseEntity implements Serializable { public interface View { interface Basic { } interface Detail { } } // @Pattern(regexp = Constants.Regex.USERNAME) @Size(min = 1, max = 50) @Column(nullable = false, unique = true) @Searchable(mode = SearchMode.EXACT) private String username; @Searchable(mode = SearchMode.EXACT) private String nickname; private String avatar; @JsonView(View.Detail.class) private String password; private boolean del = false; @ManyToMany(fetch = FetchType.EAGER, cascade = {CascadeType.DETACH}) @JoinTable( name = "user_authority", joinColumns = {@JoinColumn(name = "user_id", referencedColumnName = "id", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))}, inverseJoinColumns = {@JoinColumn(name = "authority_name", referencedColumnName = "name", foreignKey = @ForeignKey(name = "none", value = ConstraintMode.NO_CONSTRAINT))}) @BatchSize(size = 20) @ExcelIgnore @JsonSerialize(using = UserAuthoritySerializer.class, as = HashSet.class) @JsonView(View.Detail.class) private Set authorities = new HashSet<>(); private String openId; private String sex; private String language; private String city; private String province; private String country; @Searchable(mode = SearchMode.EXACT) private String phone; private String email; @ApiModelProperty("关注数量") private int follows; @ApiModelProperty("粉丝数量") private int followers; private int sales; @Column(columnDefinition = "TEXT") private String intro; private String bg; private Long authId; @ApiModelProperty("实名审核状态") @Enumerated(EnumType.STRING) private AuthStatus authStatus; private String nftAccount; @JsonIgnore private String kmsId; @JsonIgnore private String publicKey; @JsonIgnore private String tradeCode; @Column(columnDefinition = "tinyint unsigned") private boolean admin; @ApiModelProperty("分成比例") @Column(precision = 10, scale = 2) private BigDecimal shareRatio; private String memberId; private String settleAccountId; private String invitorName; private String invitorPhone; private String inviteCode; @ApiModelProperty("分享藏品邀请者") private Long collectionInvitor; @ApiModelProperty("藏品Id") private Long collectionId; @ApiModelProperty("勋章等级") private int level; @ApiModelProperty("优先购买") private int vipPurchase; @Column(columnDefinition = "tinyint unsigned") private boolean minter; /** * 0 无光 1 绿光 2 金光 */ @ApiModelProperty("使用藏品图片") @Column(columnDefinition = "tinyint unsigned default 0") private boolean useCollectionPic; @Column(columnDefinition = "int(11) default 0") @ApiModelProperty("白名单积分") private int vipPoint = 0; @ApiModelProperty(value = "风险提示") private Boolean riskWarning; @Column(columnDefinition = "tinyint unsigned default 0") private boolean canSale = false; @Column(columnDefinition = "tinyint unsigned default 0") private boolean company = false; @Column(columnDefinition = "tinyint unsigned default 0") private boolean walletEnabled = false; private String hcChainAddress; @Column(columnDefinition = "int(11) default 0") @ApiModelProperty("销毁积分") private int destroyPoint = 0; @Column(columnDefinition = "tinyint unsigned default 1") @ApiModelProperty("主页是否展示") private Boolean isPublicShow = Boolean.TRUE; private Long companyId; @ApiModelProperty("是否关注") @Transient private boolean follow; @Enumerated(EnumType.STRING) private InviteType inviteType; @Transient private String metaCompany; }