对天乙社区bbscs8实现的详细分析十

此文为转载:http://www.diybl.com/course/1_web/webjs/2007113/82989.html


接下来,我们看个复杂的业务对象:UserService,它这里与三个BEAN有关,一个是UserInfo,一个是UserInfoSimple,还有一个来自web.servlet包的UserSession,下面从UserInfo(implements Serializable)开始分析:
private String id;
private String userName; //用户名
private String nickName;//昵称
private String passwd;//密码(没有MD5,失败)
private String rePasswd;
private String email;
private String question;
private String answer;
private Date regTime;//注册时间
private Date loginTime;//登录时间
private String loginIP;//登录IP
private int loginTimes;//登录次数
private Date lastLoginTime;//最后登录时间
private String lastLoginIP;//最后登录IP
private int articleNum;//发帖数
private long stayTime;//在线时间
        private int articleEliteNum;//精华帖子数
private int lifeForce;//生命值
private int userTitle;//用户头衔
private int literary;//文采值
private int experience;//经验值
private int userKnow;//人缘值
private String signName0;//签名名称1
private String signDetail0;//签名内容1
private String signName1; //2
private String signDetail1;//2
private String signName2; //3
private String signDetail2;// 3
private int havePic;//有头像标志
private String picFileName;//头像文件名
private int forumPerNum;//每页主题数
private int postPerNum;//每页帖子数
private String userFrom;//来自
private String timeZone;//时区
private int birthYear;//出生年
private int birthMonth;//月
private int birthDay;//日
private int receiveNote;//是否接受留言
        private int acceptFriend;//是否接受好友请求
private int forumViewMode;//论坛浏览模式
private UserDetail userDetail;
private int validated;//是否通过验证
private int groupID;//用户组ID
private int coin;//财富值
private int hiddenLogin;//隐身登录标志
private int editType;//编辑器类型
private String userLocale;//用户本地化信息
private String validateCode;//验证码
对于UserInfo.hbm.xml--->"bbscs_userinfo"我们这里省略之,而特殊之处在于:

 
 //lazy="no-proxy"当前对象的单值相关对象在它的实体变量被访问的时候就被加载。
而其中包含了个UserDetail的userDetail属性:
private String id;
private String height;
private String weight;
private String interest;
private String graduate;
private String favourPeople;
private String dreamJob;
private String favourArt;
        private String favourMusic;
private String favourPlace;
private String favourMovie;
private String favourChat;
private String favourBook;
private String dreamLover;
private String favourTeam;
private String homePage;
        private String oicqNo;
private String icqNo;
private int sex;
private String brief;
private String msn;
private String yahoo;
private UserInfo userInfo;
注意:UserDetail.hbm.xml--->bbscs_userdetail

 
 
      
  
  
   
   //ID生成方式foreign!
        
   
   userInfo 
      
  
  

 
 
而最后加入一句:

 
 
我们看下UserInfo的简化版:UserInfoSimple,还给了一些初始值呢..对了,它没有hbm.xml,可见它应该是一个传递数据的javabean.
private String id = "";
private long regTime = System.currentTimeMillis();
private long loginTime = System.currentTimeMillis();
private int articleNum = 0;
private int articleEliteNum = 0;
private int userTitle = 0;
private int lifeForce = 0;
private int coin = 0;
private int literary = 0;
private int userKnow = 0;
private int experience = 0;
private int havePic = 0;
private String picFileName = "-";
private String userFrom = "-";
我们回到方法中来:
public UserInfo saveUserInfo(UserInfo userInfo) throws BbscsException;
public UserInfo findUserInfoById(String id);
public UserInfo findUserInfoByUserName(String userName);
public UserInfo findUserInfoByEmail(String email);
public long getAllUserNum();//取得所有用户数量
public PageList findUserInfoList(String orderby, String ascordesc, Pages pages);//取得用户分页列表
public Map[] getUserPermission(UserInfo userInfo);
public Map[] getUserPermission(int groupID);//根据组ID取得权限
public UserInfo saveAtLogin(UserInfo userInfo) throws BbscsException;
public void writeUserFile(UserInfo userInfo);
public UserInfoSimple getUserInfoSimple(String userID);
public void createUserFacePic(UserInfo ui, String distFileName, InputStream stream) throws
      BbscsException;//保存用户上传头像
public void removeUserFacePic(UserInfo ui) throws BbscsException;
public int getUserTitleValue(UserInfo ui);
public int getUserTitleValue(UserInfoSimple uis);
public String getUserTitle(UserInfo ui);
public String getUserTitle(UserInfoSimple uis);
public void createTopFile() throws BbscsException;
public long getUserNumByGroupID(int groupID);
public PageList findUserInfosByGroupID(int groupID, String orderby, int ascOrDesc, Pages pages);
public PageList findUserInfosByGroupID(int groupID, Pages pages);
public UserSession getUserSession(String userName);
public UserSession getUserSession(UserInfo ui);
好,我们看其实现,首先注入了userInfoDAO,userInfoFileIO,userGroupDAO,permissionDAO,userPermissionCache,userLevelService等对象.这些对象大多我们已经讲过,这里就不再重复了.
public void createUserFacePic(UserInfo ui, String distFileName, InputStream stream) throws BbscsException {
if (ui.getHavePic() == 1) { //有的话,先删除之
   this.getUserInfoFileIO().delUserPicFile(ui);
}
try {
   this.getUserInfoFileIO().saveUserUpFile(ui, distFileName, stream);//创建文件(两个)
   ui.setHavePic(1);
   ui.setPicFileName(distFileName);
   ui = this.getUserInfoDAO().saveUserInfo(ui);//写入数据库
   this.getUserInfoFileIO().writeUserFile(ui);//写入用户信息文件
} catch (Exception e) {
   logger.error(e);
   throw new BbscsException(e);
}
}
再看个分页列表显示的!
   public PageList findUserInfosByGroupID(int groupID, String orderby, int ascOrDesc, Pages pages) {
PageList pl = new PageList();

if (pages.getTotalNum() == -1) {
   pages.setTotalNum(this.getUserInfoDAO().getUserNumByGroupID(groupID));
}
pages.executeCount();

List l = this.getUserInfoDAO().findUserInfosByGroupID(groupID, orderby, ascOrDesc, pages.getSpage(),
    pages.getPerPageNum());

pl.setObjectList(l);
pl.setPages(pages);
return pl;
}
另外:
public UserInfoSimple getUserInfoSimple(String userID) {
return this.getUserInfoFileIO().getUserInfoSimple(userID);//从文件得到!
}
从缓存中先取:
public Map[] getUserPermission(int groupID) {
if (Constant.USE_PERMISSION_CACHE) {
   Map[] userPermission = (Map[]) this.getUserPermissionCache().get("U_" + String.valueOf(groupID));
   if (userPermission == null) {
    userPermission = this.getPermissionMaps(groupID);
    this.getUserPermissionCache().add("U_" + String.valueOf(groupID), userPermission);
   }
   return userPermission;
} else {
   return this.getPermissionMaps(groupID);
}
}
而没有找到的话,用了private的getPermissionMaps(groupID)方法,从DAO取:
@SuppressWarnings("unchecked")
private Map[] getPermissionMaps(int groupID) {
Map[] userPermission = { new HashMap(), new HashMap() };
UserGroup ug = this.getUserGroupDAO().findUserGroupByID(groupID); // 取得用户属组
if (ug != null) {
   Iterator it = ug.getRoles().iterator(); // 取得角色列表
   while (it.hasNext()) {
    Role role = (Role) it.next();
    List permissions = role.getPermissions(); // 取得角色的权限ID列表
    if (permissions != null && !permissions.isEmpty()) {
     List permissionList = this.getPermissionDAO().findPermissionnIDs(permissions); // 取得权限列表
     for (int i = 0; i < permissionList.size(); i++) {
      Permission permission = (Permission) permissionList.get(i);
      if (permission.getTypeID() == 0) {
       userPermission[0].put(permission.getResource() + "," + permission.getAction(), permission); //放入左边的HashMap
      } else {
       userPermission[1].put(permission.getId(), permission);//放入右边的HashMap
      }
     }
    }
   }
}
return userPermission;
}
它是一个从UserGroup-->getRoles()-->Permissions-->PermissionDAO().findPermissionnIDs-->构造一个userPermission Map[]= { new HashMap(), new HashMap() };
下面是一个获得头衔的方法:
public String getUserTitle(UserInfo ui) {
int type = 0;
List ull = null;
if (ui == null) {
   ull = this.getUserLevelService().findUserLevelsByType(type);//用了前面讲过的UserLevelService服务类!
   return this.getUserLevelByUserValue(ull, 0).getLevelName();//返回未注册的,应该是-500所对应的LevelName吧!(不过用的不是UserLevelSerivce哦)
} else {
   type = ui.getUserTitle();
   ull = this.getUserLevelService().findUserLevelsByType(type);
   if (ull != null) {
    return this.getUserLevelByUserValue(ull, this.getUserTitleValue(ui)).getLevelName();
/**
public int getUserTitleValue(UserInfo ui) {
switch (ui.getUserTitle()) {
case 0:
   return ui.getExperience();
case 1:
   return ui.getLiterary();
case 2:
   return ui.getUserKnow();
case 3:
   return ui.getCoin();
default:
   return ui.getExperience(); //default:经验值
}
}
*/
   } else {
    return "-";
   }
}
}
下面是对登录用户的保存,登录时的时间比最后登录时间有一定积累时可累加登录次数和经验值:
public UserInfo saveAtLogin(UserInfo userInfo) throws BbscsException {
try {
   if ((System.currentTimeMillis() - userInfo.getLastLoginTime().getTime()) > 30 * 60000) {
    userInfo.setLoginTimes(userInfo.getLoginTimes() + 1);
    userInfo.setExperience(userInfo.getExperience() + 1);
   }
   userInfo = this.getUserInfoDAO().saveUserInfo(userInfo);
   this.getUserInfoFileIO().writeUserFile(userInfo);
   return userInfo;
} catch (Exception ex) {
   logger.error(ex);
   throw new BbscsException(ex);
}
}
最后两个是关于UserSession的方法,它们返回一个user的UserSession:
public UserSession getUserSession(String userName) {
if (!userName.startsWith(Constant.GUEST_USERNAME)) {
//public static final String GUEST_USERNAME = "GUEST@";说明不是访客访问
   UserInfo ui = this.getUserInfoDAO().findUserInfoByUserName(userName);
   if (ui != null) {//找到用户信息
    return this.getUserSession(ui);
   }
}
long now = System.currentTimeMillis(); //访客的Session:
UserSession us = new UserSession();
us.setGroupID(Constant.USER_GROUP_GUEST);
us.setId(Constant.GUEST_USERID + now);
us.setNickName("Guest");
us.setUserName(Constant.GUEST_USERNAME + now);
Map[] permissionMap = this.getUserPermission(Constant.USER_GROUP_GUEST);
us.setUserPermissionArray(permissionMap);
return us;
}

public UserSession getUserSession(UserInfo ui) { //由ui构造一个UserSession
UserSession us = new UserSession();
us.setEmail(ui.getEmail());
us.setGroupID(ui.getGroupID());
us.setId(ui.getId());
us.setNickName(ui.getNickName());
String[] signDetail = new String[3];
signDetail[0] = ui.getSignDetail0() == null ? "" : ui.getSignDetail0();
signDetail[1] = ui.getSignDetail1() == null ? "" : ui.getSignDetail1();
signDetail[2] = ui.getSignDetail2() == null ? "" : ui.getSignDetail2();
us.setSignDetail(signDetail);//一个数组啊!
us.setUserName(ui.getUserName());
us.setLastActiveTime(System.currentTimeMillis());
Map[] permissionMap = this.getUserPermission(ui);//同上所述map[]
us.setUserPermissionArray(permissionMap);
return us;
}
对于UserSession,让我们先看看先吧,它在com.laoer.bbscs.web.servlet中,实现了Serializable接口,有以下几个属性:
private String userName = "";
private String id = "";
private String nickName = "";
private String email = "";
private long lastActiveTime = 0;
private Map userPermission = new HashMap();
private Map boardPermission = new HashMap();
private Map specialPermission = new HashMap(); 
private Map boardSpecialPermission = new HashMap();
private long bid = 0;
private int groupID = 0;
private long addedOnlineTime = 0;
private long addedOnlineHour = 0;
private String validateCode = "";
private String[] signDetail = { "", "", "" };
private String boardPass = "";
private int initStatus = 0;
这里我们有到了setUserPermissionArray(Map[] permissionMap),其它是简单的set方法:
public void setUserPermissionArray(Map[] permissionMap) {
setSpecialPermission(permissionMap[1]);//写入set中!这个是特殊权限
Set pset = permissionMap[0].entrySet();
Iterator it = pset.iterator();
while (it.hasNext()) {
   Map.Entry p = (Map.Entry) it.next();
/**
if (permission.getTypeID() == 0) {
       userPermission[0].put(permission.getResource() + "," + permission.getAction(), permission);
      } else {
       userPermission[1].put(permission.getId(), permission);
      }
*/
   Permission permission = (Permission) p.getValue();//map.value
   String[] actions = permission.getAction().split(",");//map.value.getAction()-->action可能有多个
   for (int i = 0; i < actions.length; i++) {
    String[] resources = ((String) p.getKey()).split(",");//一个是permission.getResource()一个是permission.getAction()
    this.getUserPermission().put(resources[0] + "?action=" + actions[i], p.getValue());//只取resource[0],for-->得到用户一个权限对应可的URL访问资源
   }
}//while得到用户所有的权限,及其所有对应可访问的URL资源

}
OK,就这样把信息写入到UserSession中了!现在,我们来看看相关的DAO:UserInfoDAO:
public UserInfo saveUserInfo(UserInfo userInfo);//保存或更新UserInfo对象
public UserInfo findUserInfoById(String id);//根据主键查找UserInfo对象
public UserInfo findUserInfoByUserName(String userName);
public UserInfo findUserInfoByEmail(String email);
public List findUserInfoList(String orderby, String ascordesc,
   int firstResult, int maxResults);//取得UserInfo分页列表
public long getAllUserNum();
public long getUserNumByGroupID(int groupID);
public List findUserInfosByGroupID(int groupID, String orderby,
   int ascOrDesc, int firstResult, int maxResults);
我们看其中的一个实现方法吧:
public List findUserInfosByGroupID(final int groupID, final String orderby,
   final int ascOrDesc, final int firstResult, final int maxResults) {
return getHibernateTemplate().executeFind(new HibernateCallback() {
   public Object doInHibernate(Session s) throws HibernateException {
    Criteria c = s.createCriteria(UserInfo.class);
    if (groupID != 0) {
     c.add(Restrictions.eq("groupID", new Integer(groupID)));
    }

    if (StringUtils.isNotBlank(orderby)) {
     if (ascOrDesc == Constant.ORDER_ASC) {
      c.addOrder(Order.asc(orderby));
     }
     if (ascOrDesc == Constant.ORDER_DESC) {
      c.addOrder(Order.desc(orderby));
     }
    }
    c.setFirstResult(firstResult);
    c.setMaxResults(maxResults);
    return c.list();
   }
});
}

下面我们接着看UserTopService:(用户统计信息)
它只有一个一个接口方法: public void createUserTopFile() throws BbscsException;先看其bean:
        private String id;//主键
private String userID;//用户ID
private String userName;//用户名
private String nickName;
private int valueType;//统计种类
private int userValue;//用户值
private int valueInc;//值增长

 
 

  
  
    
   
   
      
    
    
    
   
   
    
   
   
    
   
   
    
   
   
    
   
   
    
   
   
    
   
   

  
  

 
 
对于具体的东西见运行的结果:
积分排行[周增加] 
Laoer 108 
yyjn12 41 
mtx808 21 
星星的金币 16 
longge 10 
lijia8135 8 
chenlineng 7 
wujunhua2000 6 
sech 4 
pthbz 3 
我们看其中的一部分实现:
List utl = this.getUserTopDAO().findUserTopsByType(1); //1代表积分排行,得到前周的
      Map
 
 
  
   utm = new HashMap
  
  
   
   ();
      for (int i = 0; i < utl.size(); i++) {
        UserTop ut = (UserTop) utl.get(i);
        utm.put(ut.getUserName(), ut);
      }
      this.getUserTopDAO().removeUserTopByType(1);
      List l = this.getUserInfoDAO().findUserInfoList("experience", "desc", 0, 100);//获得前100名的积分头头!100是个需要考虑的问题哦...
      for (int i = 0; i < l.size(); i++) {
        UserInfo ui = (UserInfo) l.get(i);
        UserTop ut = (UserTop) utm.get(ui.getUserName());
        UserTop utnew = new UserTop();
        utnew.setNickName(ui.getNickName());
        utnew.setUserID(ui.getId());
        utnew.setUserName(ui.getUserName());
        utnew.setUserValue(ui.getExperience());//积分
        utnew.setValueType(1);//类型
        if (ut != null) { //上次有的话
          utnew.setValueInc(ui.getExperience() - ut.getUserValue());//周增长值
        }
        else {
          utnew.setValueInc(ui.getExperience());
        }
        this.getUserTopDAO().saveUserTop(utnew);//重新生成Usertop
      }
      utl = null;
      utm = null;
      List utlist = this.getUserTopDAO().findUserTopsByType(1, 0, 10);//注意是从UserTop表中取出类型为1的前10名,写入文件中!
      StringBuffer sb = new StringBuffer();
      for (int i = 0; i < utlist.size(); i++) {
        UserTop ut = (UserTop) utlist.get(i);
        sb.append("");
        sb.append("");
        sb.append("
   
   ");
        sb.append(ut.getNickName());
        sb.append("");
        sb.append("");
        sb.append("");
        sb.append(ut.getValueInc());
        sb.append("");
        sb.append("");
      }
      File topFile = new File(BBSCSUtil.getIncludePath() + "UserExp.html");
      FileUtils.writeStringToFile(topFile, sb.toString(), Constant.CHARSET);
      utlist = null;
      topFile = null;
      sb = null;
其它类似,只不过把1换成2和3..,其中2代表文采排行[周增加],3代表人缘排行[周增加]..
我们看DAO,它有四个方法:
public UserTop saveUserTop(UserTop ut);
public List findUserTopsByType(int type);
public List findUserTopsByType(int type, int firstResult, int maxResults);
public void removeUserTopByType(int type);
我们看实现:
private static final String LOADS_BY_TYPE = "from UserTop where valueType = ? order by valueInc desc";
public List findUserTopsByType(final int type, final int firstResult, final int maxResults) {
    return getHibernateTemplate().executeFind(new HibernateCallback() {
   public Object doInHibernate(Session s) throws HibernateException, SQLException {
        Query query = s.createQuery(LOADS_BY_TYPE);
        query.setInteger(0, type);
        query.setFirstResult(firstResult);
        query.setMaxResults(maxResults);

        List list = query.list();
        return list;
      }
    });

}

接下来,是VoteItemService:(投票项信息)
private String id;
private String voteID;//投票ID
private String item;//投票项 
private int itemValue;//投票数量
我们看下VoteItem.hbm.xml:

   
   

    
    
    
     
     
      
      
      //uuid生成算法
    
     
     
    
     
     
    
     
     
    
     
     

    
    

   
   
对于其方法,主要有:
public VoteItem saveVoteItem(VoteItem voteItem) throws BbscsException;
public VoteItem findVoteItemByID(String id);
public List findVoteItemsByVoteID(String voteID);
public void createVoteItemAdd(String userId, String voteId, List ids) throws BbscsException;
我们看第四个方法的实现:
public void createVoteItemAdd(String userId, String voteId, List ids) throws BbscsException {
List vis = this.getVoteItemDAO().findVoteItemsInIds(ids);//对ids相关的投票单项进入ItemValue增长1...
try {
   for (int i = 0; i < vis.size(); i++) {
    VoteItem vi = (VoteItem) vis.get(i);
    vi.setItemValue(vi.getItemValue() + 1);
    this.getVoteItemDAO().saveVoteItem(vi);
   }
   VoteUser vu = new VoteUser();
   vu.setVoteID(voteId);//投票项
   vu.setVoteTime(System.currentTimeMillis());
   vu.setVoteUserID(userId);
   this.getVoteUserDAO().saveVoteUser(vu);//注入了VoteUserDAO,更新用户投票项
} catch (Exception ex) {
   logger.error(ex);
   throw new BbscsException(ex);
}
}

我们看VoteService:(投票信息),其相应的Vote bean和hbm.xml文件如下:
private String id;//主键
private String title;//投票名称
private int isM;//复选、单选标志
        private long deadLine;//有效期

   
   

    
    
    
     
     
      
      
      
    
     
     
    
     
     
    
     
     
    
     
     

    
    

   
   
它有两个方法:
public Vote saveVote(Vote vote) throws BbscsException;
public Vote findVoteByID(String id);
完全由DAO(实际由VoteHibernateDAO)去完成之.

最后,我们看这last业务逻辑VoteUserService,用于投票用户记录.首先看bean及hbm.xml:
private String id;//主键
private String voteID;//投票ID
private String voteUserID;//投票用户ID
private long voteTime;//投票时间

   
   

    
    
    
     
     
      
      
      
    
     
     
    
     
     
    
     
     
    
     
     

    
    

   
   
我们看service层的方法:
public VoteUser saveVoteUser(VoteUser voteUser) throws BbscsException;
public VoteUser findVoteUserByVoteIDUserID(String voteID, String userID);
public void removeOutTime(long atime) throws BbscsException;
它也是完全是DAO去实现的,我们直接进入DAO实现层(com.laoer.bbscs.dao.hibernate)中的VoteUserHibernateDAO这个类:
private static final String LOAD_BY_VID_UID = "from VoteUser where voteID = ? and voteUserID = ?";
private static final String REMOVE_OUT_TIME = "delete from VoteUser where voteTime < ?";//小于某个时间值,说明相对现在已经过时了..outtime!!
public void removeOutTime(final long atime) {
    getHibernateTemplate().execute(new HibernateCallback() {
      public Object doInHibernate(Session s) throws HibernateException, SQLException {
        Query query = s.createQuery(REMOVE_OUT_TIME);
        query.setLong(0, atime);
        query.executeUpdate();
        return null;
      }

 

  
  
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值