public void addFlagBit(Long flagBit) { this.flagBit |= flagBit.longValue(); } public void removeFlagBit(long flagBit) { this.flagBit &= flagBit ^ Long.MAX_VALUE; }
<update id="addMemberFlagBit" parameterType="map"> update member set flag_bit = (flag_bit + ${flagBit}) - bitand(flag_bit, ${flagBit}) where id = #{memberId} </update> <update id="clearMemberFlagBit" parameterType="map"> update member set flag_bit = bitand(flag_bit, ${flagBit}) where id = #{memberId} </update>
package com.xxx.member.common.constant; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import com.xxxpiao.common.entity.enumerated.Game; import com.xxxpiao.common.entity.enumerated.OperType; /** * 如果1个long flagBit字段不够,再增加多1/2个flagBit字段, * 64bit+64bit+64bit = 192bit,可以搞定大部分相似变化,比单一字段只表示有限单一意义的利用率高很多。 * * 这里常量和features内里由**和**来设计/增加业务,两人要管理和搭配好/分派好/互动沟通好vipuser.flagBit, * member.flagBit负责单个帐号相关的重要/基础/安全性/系统性功能/用户指定前台配置,vipuser.flagBit负责同一自然人多个帐号的处理和促销/活动功能 * vipuser.flagBit一些已过期活动占用的flagBit也可回收重复利用到别的功能和活动 * * VipUserFlagBitConstant.java 中有更多说明 * {@see com.xxx.vip.common.constant.flagbit.VipUserFlagBitConstant} * * 参考资料: * <ul> * <li>http://wiki.inzwc.com/wiki/index.php/ArchAndBiz 能否通过标识/精致数据急剧滤掉大部分IO次数和高消耗</li> * </ul> * * @author ** * */ public class MemberFlagBitConstant { // 是否加密身份证号 public static long encryptCertNo = 1; // 是否加密电话号码 public static long encryptPhone = 1 << 2; // 是否加密email public static long encryptEmail = 1 << 3; // 是否加密im通讯工具 public static long encryptIm = 1 << 4; // 是否开通手机号登录服务 public static long phoneLoginOpen = 1 << 5; /** 是否开通投注邮件通知 **/ public static long betEmailNotifyOpen = 1 << 6; /** * 已通过短信下发/客服回拨方式验证手机号是真实的 */ public static long confirmed_mobile = 1 << 7; /** * 已通过让用户上传拍照身份证方式确认身份证是真实的 */ public static long confirmed_certNo = 1 << 8; /** * 此帐户已被发现存在多个根据手机号/身份证号等确定的东西或蛛丝马迹发现有关联帐号, * 进一步信息需从vip系统或安全系统中获取 */ public static long haveMultiAccountFound = 1 << 9; /** 标识有信用卡充值 **/ public static long creditcardCharge = 1 << 10; /**是否启用了投注凭证*/ public static long enable_bet_vouch = 1 << 11; /** * 是否是北京单场大户1。vip = very important person * * 请通过IDE的索引查找到相应的规则 */ public static long gameBD_vip_1 = 1 << 12; public static long gameJZ_vip_1 = 1 << 13; public static long gameDCSF_vip_1 = 1 << 14; /*** * 新会员是否已经充值 */ public static long newMemberIsCharge = 1 << 15; /** * 验证邮箱 */ public static long validateMemberEmail=1 << 16; /** * 是否绑定手机短信投注系统(smsbet) */ public static long bindSmsbetSystem = 1 << 17; /** * 类型 */ private Long index; /** * 类型名称 */ private String name; public MemberFlagBitConstant(Long index, String name) { this.index = index; this.name = name; } /*************以下可配置在admin后台管理配置功能**************/ public final static MemberFlagBitConstant VALIDATE_MEMBER_EMAIL = new MemberFlagBitConstant(validateMemberEmail,"验证邮箱"); public final static MemberFlagBitConstant BIND_SMS_BET_SYSTEM = new MemberFlagBitConstant(bindSmsbetSystem,"是否绑定手机短信投注系统"); /** 功能对应的位标记值 **/ public static Map<Long,MemberFlagBitConstant> memberFlagBitConfigMap = new HashMap<Long,MemberFlagBitConstant>(); static{ memberFlagBitConfigMap.put(VALIDATE_MEMBER_EMAIL.getIndex(), VALIDATE_MEMBER_EMAIL); memberFlagBitConfigMap.put(BIND_SMS_BET_SYSTEM.getIndex(), BIND_SMS_BET_SYSTEM); } /** * 某会员配置的功能 * @return */ public static List<MemberFlagBitConstant> getMemberFlagBitByFlagBit(long optionConstant){ List<MemberFlagBitConstant> flagbits = new ArrayList<MemberFlagBitConstant>(); for(Long key:memberFlagBitConfigMap.keySet()){ if(MemberFlagBitConstant.isExistFlagBit(key, optionConstant)){ flagbits.add(memberFlagBitConfigMap.get(key)); } } return flagbits; } public static List<MemberFlagBitConstant> getAll(){ List<MemberFlagBitConstant> list = new ArrayList<MemberFlagBitConstant>(); for(Long key:memberFlagBitConfigMap.keySet()){ list.add(memberFlagBitConfigMap.get(key)); } return list; } public static boolean isEncryptCertNo(long optionConstant) { return (optionConstant & encryptCertNo) > 0; } public static boolean isEncryptPhone(long optionConstant) { return (optionConstant & encryptPhone) > 0; } public static boolean isEncryptEmail(long optionConstant) { return (optionConstant & encryptEmail) > 0; } public static boolean isEncryptIm(long optionConstant) { return (optionConstant & encryptIm) > 0; } public static boolean isPhoneLoginOpen(long optionConstant) { return (optionConstant & phoneLoginOpen) > 0; } public static boolean isBetEmailNotifyOpen(long optionConstant) { return (optionConstant & betEmailNotifyOpen) > 0; } public static boolean isCreditcardCharge(long optionConstant) { return (optionConstant & creditcardCharge) > 0; } public static boolean isEnableBetVouch(long optionConstant) { return (optionConstant & enable_bet_vouch) > 0; } public static boolean isGameBD_vip_1(long optionConstant) { return (optionConstant & gameBD_vip_1) > 0; } public static boolean isBind_Sms_Bet_System(long optionConstant) { return (optionConstant & bindSmsbetSystem) > 0; } public static boolean isGameJZ_vip_1(long optionConstant) { return (optionConstant & gameJZ_vip_1) > 0; } public static boolean isGameDCSF_vip_1(long optionConstant) { return (optionConstant & gameDCSF_vip_1) > 0; } public static long getGame_vip_flag(long optionConstant) { if ((optionConstant & gameBD_vip_1 ) > 0 ) { return gameBD_vip_1; }else if ((optionConstant& gameJZ_vip_1) > 0) { return gameJZ_vip_1; }else if ((optionConstant& gameDCSF_vip_1) > 0) { return gameDCSF_vip_1; } return 0; } public static boolean isNewMemberIsCharge(long optionConstant) { return (optionConstant & newMemberIsCharge) > 0; } public static boolean isValidateMemberEmail(long optionConstant){ return (optionConstant & validateMemberEmail) > 0; } /** * 验证 optionFlagbit操作标识是否已经存在memberFlagbit 中 * @param optionConstant * @return */ public static boolean isExistFlagBit(long optionFlagbit,long memberFlagbit) { return (optionFlagbit & memberFlagbit )> 0; } /** * 获取addFlagbit写日志记录map * @return */ public static Map<Long, OperType> getAddFlagBitWithSupportOperLogMap(){ Map<Long, OperType> supportLogMap = new HashMap<>(); supportLogMap.put(enable_bet_vouch, OperType.BET_VOUCH_OPEN); supportLogMap.put(betEmailNotifyOpen, OperType.OPOEN_BET_EMAIL_NOTIFY); supportLogMap.put(validateMemberEmail, OperType.EMAIL_VALID); return supportLogMap; } /** * 获取removeFlagbit写日志记录map * @return */ public static Map<Long, OperType> getRemoveFlagBitWithSupportOperLogMap(){ Map<Long, OperType> supportLogMap = new HashMap<>(); supportLogMap.put(enable_bet_vouch, OperType.BET_VOUCH_CLOSE); supportLogMap.put(betEmailNotifyOpen, OperType.CLOSE_BET_EMAIL_NOTIFY); supportLogMap.put(validateMemberEmail, OperType.CANCEL_EMAIL_VALID); return supportLogMap; } /** * vip延迟上传flag对应game的map * @return */ public static Map<Long, Game> getGameVipFlagAndParentGameMap(){ Map<Long, Game> flagGameMap = new HashMap<>(); flagGameMap.put(gameBD_vip_1, Game.JJ_BJDC); flagGameMap.put(gameDCSF_vip_1, Game.JJ_DCSF); flagGameMap.put(gameJZ_vip_1, Game.JJ_ZC); return flagGameMap; } public Long getIndex() { return index; } public void setIndex(Long index) { this.index = index; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
package com.xxxpiao.common.entity.member; import java.util.Calendar; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Enumerated; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.SequenceGenerator; import javax.persistence.Transient; import org.hibernate.annotations.Type; import com.xxx.dao.domain.ExtensionField; import com.xxx.dao.domain.HasLoadedAttach; import com.xxx.dao.util.HasLoadedAttachUtil; import com.xxx.member.common.constant.MemberHasLoadedAttachBit; import com.xxxpiao.common.entity.BaseEntity; import com.xxxpiao.common.entity.enumerated.BindBankType; import com.xxxpiao.common.entity.enumerated.CertType; import com.xxxpiao.common.entity.enumerated.MemberStatus; import com.xxxpiao.common.entity.enumerated.SellClient; import com.xxxpiao.common.entity.enumerated.Sex; import com.xxxpiao.common.entity.enumerated.ThirdType; import com.xxxpiao.common.service.vo.RegisterType; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.parser.Feature; import com.alibaba.fastjson.serializer.SerializerFeature; /** * 网站客户 * * @author yaya * */ @Entity @org.hibernate.annotations.Entity(dynamicUpdate = true) @SequenceGenerator(name = "SEQ_MEMBER", sequenceName = "SEQ_MEMBER", allocationSize = 1, initialValue = 1) public class Member extends BaseEntity implements HasLoadedAttach, ExtensionField { private static final long serialVersionUID = 6014921986862506261L; @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_MEMBER") private Long id; @Column(nullable = false, unique = true) private String account; /** 昵称(屏蔽手机号,默认跟帐户名相同) */ @Column(nullable = false) private String nickname; @Column(nullable = false) private String password; /** 联系电话 */ @Column(name = "phone") private String phone; /** 电邮地址 */ private String email; /** 用户状态 (0-正常,1-关闭) */ @Enumerated @Column(nullable = false) private MemberStatus status = MemberStatus.ENABLE; /** 注册时间 */ @Column(nullable = false) private Calendar registerTime; /** 来源客户端 */ @Enumerated @Column(nullable = false) private SellClient sellClient; /** 市场渠道 */ @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "sell_channel", nullable = false) private MemberMarketChannel sellChannel; /** 证件类型 (0-身份证,1-军官证 ,2-护照) */ @Enumerated private CertType certType; /** 证件号码 */ private String certNo; /** */ private Calendar lastLoginTime; /** */ private String name; /** */ private Calendar birthday; /** 性别 (0-男,1-女) */ @Enumerated private Sex sex; /** 用户所在地区 */ private Long areaId; /** IM */ private String im; /** 提款银行ID */ private Long bankId; /** 开户行全称 */ private String bankName; /** 银行帐号 */ private String bankCardNo; /** 消费级别 */ private int userLevel = 0; /** 头衔 */ private String title; /** 推荐人 */ private String recoMember; /** 用户资料完整度(0-快速注册,1-完整注册) */ @Column(name = "INFO_FULL_STATUS") private int infoFullStatus; @Type(type = "thirdType") private ThirdType thirdType = ThirdType.LOCAL; /** 用户在第三方系统的标识,如在支付宝的标识,一般会在共享注册时设置 */ private String thirdId; /** 用户是本站注册的,但通过第三方绑定登陆的,有这个信息*/ private MemberThirdLogin thirdLogin; /** 注册类型,暂时不保存到数据库中 */ @Transient private RegisterType registerType; /** 用户绑定类型 */ @Type(type = "bindBankType") private BindBankType bindBankType = BindBankType.NORMAL; /** 用户绑定银行卡信息 **/ private String bindBankInfo; /** 会员信息更新时间 */ private Calendar updateTime = Calendar.getInstance(); /** 用户提款手机号码绑定 */ private String getMoneyPhone; /** * 出生月日 */ private String birthdayMmdd; @Transient private long attachBit; private Long flagBit = 0L; private Integer flagVersion = 0; private JSONObject features = new JSONObject(); private Integer featuresVersion = 0; public Member() { } public Member(Long id) { this.id = id; } /** * 快速注册用户构造方法 * * @param account * @param password * @param sellClient * @param sellChannel */ public Member(String account, String password, SellClient sellClient, MemberMarketChannel sellChannel) { this.account = account; this.nickname = account; this.password = password; this.registerTime = Calendar.getInstance(); this.sellClient = sellClient; this.sellChannel = sellChannel; } public Member(String account, String password) { this.account = account; this.password = password; } @Override public Long getId() { return id; } public String getAccount() { return account; } public void setAccount(String account) { this.account = account; } public String getNickname() { return nickname; } public void setNickname(String nickname) { this.nickname = nickname; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public MemberStatus getStatus() { return status; } public void setStatus(MemberStatus status) { this.status = status; } public Calendar getRegisterTime() { return registerTime; } public void setRegisterTime(Calendar registerTime) { this.registerTime = registerTime; } public SellClient getSellClient() { return sellClient; } public void setSellClient(SellClient sellClient) { this.sellClient = sellClient; } public MemberMarketChannel getSellChannel() { return sellChannel; } public void setSellChannel(MemberMarketChannel sellChannel) { this.sellChannel = sellChannel; addAttachFlag(MemberHasLoadedAttachBit.sellChannel); } public void setSellChannelId(Long sellChannel) { this.sellChannel = new MemberMarketChannel(sellChannel); removeAttachFlag(MemberHasLoadedAttachBit.sellChannel); } public CertType getCertType() { return certType; } public void setCertType(CertType certType) { this.certType = certType; } public String getCertNo() { return certNo; } public void setCertNo(String certNo) { this.certNo = certNo; } public Calendar getLastLoginTime() { return lastLoginTime; } public void setLastLoginTime(Calendar lastLoginTime) { this.lastLoginTime = lastLoginTime; } public String getName() { return name; } public void setName(String name) { if(name!=null){ this.name = name.trim(); }else{ this.name = null; } } public Calendar getBirthday() { return birthday; } public void setBirthday(Calendar birthday) { this.birthday = birthday; } public Sex getSex() { return sex; } public void setSex(Sex sex) { this.sex = sex; } public Long getAreaId() { return areaId; } public void setAreaId(Long areaId) { this.areaId = areaId; } public String getIm() { return im; } public void setIm(String im) { this.im = im; } public Long getBankId() { return bankId; } public void setBankId(Long bankId) { this.bankId = bankId; } public String getBankName() { return bankName; } public void setBankName(String bankName) { this.bankName = bankName; } public String getBankCardNo() { return bankCardNo; } public void setBankCardNo(String bankCardNo) { this.bankCardNo = bankCardNo; } public int getUserLevel() { return userLevel; } public void setUserLevel(int userLevel) { this.userLevel = userLevel; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getRecoMember() { return recoMember; } public void setRecoMember(String recoMember) { this.recoMember = recoMember; } public int getInfoFullStatus() { if(this.name!=null && this.name.length()>0 && this.phone!=null && this.phone.length()>0 && this.certNo!=null && this.certNo.length()>0){ return 1;//完善资料 } return infoFullStatus; } public void setInfoFullStatus(int infoFullStatus) { this.infoFullStatus = infoFullStatus; } public String getThirdId() { return thirdId; } public void setThirdId(String thirdId) { this.thirdId = thirdId; } public MemberThirdLogin getThirdLogin() { return thirdLogin; } public void setThirdLogin(MemberThirdLogin thirdLogin) { this.thirdLogin = thirdLogin; this.addAttachFlag(MemberHasLoadedAttachBit.thirdLogin); } public void setId(Long id) { this.id = id; } public ThirdType getThirdType() { return thirdType; } public void setThirdType(ThirdType thirdType) { this.thirdType = thirdType; } public RegisterType getRegisterType() { return registerType; } public void setRegisterType(RegisterType registerType) { this.registerType = registerType; } public BindBankType getBindBankType() { return bindBankType; } public void setBindBankType(BindBankType bindBankType) { this.bindBankType = bindBankType; } public String getBindBankInfo() { return bindBankInfo; } public void setBindBankInfo(String bindBankInfo) { this.bindBankInfo = bindBankInfo; } public Calendar getUpdateTime() { return updateTime; } public void setUpdateTime(Calendar updateTime) { this.updateTime = updateTime; } public String getGetMoneyPhone() { return getMoneyPhone; } public void setGetMoneyPhone(String getMoneyPhone) { this.getMoneyPhone = getMoneyPhone; } @Override public boolean hasAttachLoaded(long bitForPart) { return HasLoadedAttachUtil.hasAttachLoaded(attachBit, bitForPart); } private void removeAttachFlag(long flagBit) { this.attachBit &= flagBit ^ Long.MAX_VALUE; } private void addAttachFlag(long flagBit) { this.attachBit |= flagBit; } @Override public long getFlagBit() { return this.flagBit == null ? 0 : flagBit; } @Override public int getFlagVersion() { return this.flagVersion == null ? 0 : flagVersion; } @Override public String getFeatures() { return JSON.toJSONString(features,SerializerFeature.UseISO8601DateFormat); } @Override public int getFeaturesVersion() { return this.featuresVersion == null ? 0 : featuresVersion; } @Override public void setupFeature(String columnName, String value) { features.put(columnName, value); } @Override public void setupFeature(String columnName, Object value) { features.put(columnName, value); } @Override public void removeFeature(String columnName) { features.remove(columnName); } @Override public String getFeature(String columnName) { return features.getString(columnName); } @Override public <T> T getFeature(String columnName, Class<T> clz) { return features.getObject(columnName, clz); } public void addFlagBit(Long flagBit) { this.flagBit |= flagBit.longValue(); } public void removeFlagBit(long flagBit) { this.flagBit &= flagBit ^ Long.MAX_VALUE; } public void setFlagBit(Long flagBit) { this.flagBit = flagBit == null ? 0 : flagBit; } public void setFeatures(String features) { this.features = JSONObject.parseObject(features,Feature.AllowISO8601DateFormat); } public void setFlagVersion(Integer flagVersion) { this.flagVersion = flagVersion == null ? 0 : flagVersion; } public void setFeaturesVersion(Integer featuresVersion) { this.featuresVersion = featuresVersion == null ? 0 : featuresVersion; } public String getBirthdayMmdd() { return birthdayMmdd; } public void setBirthdayMmdd(String birthdayMmdd) { this.birthdayMmdd = birthdayMmdd; } }