對天乙社區bbscs8實現的詳細分析九

此文爲轉載:http://www.diybl.com/course/1_web/webjs/2007113/82989.html


OK,Next RoleService,先看其BEAN先,它有四個屬性:
private Integer id;
private String roleName;
private int typeID;
private List permissions = new ArrayList();
其Role-mysql.hbm.xml:
 //自動增長!
    //用了自定義類型!

我們看下數據庫bbscs_role中的記錄,可見它也基本上是一本固定的配置表而已:
1 ???(亂碼)     1      MEMO(401,402,403,404,405,406,407,408,409,410,411,412,413,.....)
4 ???(亂碼)     0      MEMO(126,127,128,129,130)
我們看方法:
public Role saveRole(Role role) throws BbscsException;
public Role findRoleByID(int id);
public List findRolesAll();
public List findRolesByTypeID(int typeID);//根據tpyeID取得Role列表
public List findRolesInIDs(List ids);//根據指定IDs取得Role對象列表
public void removeRole(Role role) throws BbscsException;
進入其實現層,首先也用了userPermissionCache,大部分方法仍有DAO處理:
public Role saveRole(Role role) throws BbscsException {
    try {
      role = this.getRoleDAO().saveRole(role);
      this.clearPermissionCache();
      return role;
    }
    catch (Exception ex) {
      logger.error(ex);
      throw new BbscsException(ex);
    }
}
private void clearPermissionCache() {   //私有方法
    if (Constant.USE_PERMISSION_CACHE) {//public static final boolean USE_PERMISSION_CACHE = true;
      this.getUserPermissionCache().removeAll();
    }
}
對於DAO及其實現層我們不分析下去.

好,我們到了SessionService,這個接口中並沒有import任何service,bean(當然也沒有.hbm.xml),應該是完全用於session的操作的吧.我們直接看方法:
public void saveSession(String id, String key, Object value);
public void saveSession(String id, Map session);
public Map getSession(String id);
public Object getSession(String id, String key);
public void removeSession(String id);
我們在com.laoer.bbscs.serivce.config包中也發現了還有SessionConfig沒有介紹之,其實它也是個用於得到目錄的配置服務類,先注入safePath後:
public String getSessionPath(String id) {
StringBuffer sb = new StringBuffer();
sb.append(this.getSafePath());
if (!this.getSafePath().endsWith("/")) {
   sb.append("/");
}
sb.append("session/");
sb.append(BBSCSUtil.getStringHashCode(id) % 100);
sb.append("/");
String tmp = "";
if (id.length() > 5) {
   tmp = id.substring(0, 5);
} else {
   tmp = id;
}
sb.append(BBSCSUtil.getStringHashCode(tmp) % 100);
sb.append("/");
sb.append(id);
sb.append("/");
File ft = new File(sb.toString());
if (!ft.exists()) {
   ft.mkdirs();
}
return sb.toString(); //safe/session/34/23/2342342/
}
其中用到了com.laoer.bbscs.comm.*:
public static int getStringHashCode(String txt) {
int t = 0;
if (txt != null) {
   char[] chars = txt.toCharArray();
   for (int i = 0; i < chars.length; i++) {
    t = t + (int) chars[i];
   }
}
return t;
}
至於SessionService和SessionConfig的具體用處可能是在web層使用吧!有待考慮之.

我們來到SubscibeService(帖子訂閱服務):(我們不分析關於拆表的任何代碼,有關請看Friend相關類) 
        private String id;
private String userID; //用戶ID
private String userName;
        private String nickName;
private String postID;//帽子ID
private String postTitle;
private long boardID;//版區ID
private int emailinform;//Email發送標誌
private int msginform;//留言發送標誌
private String userEmail;
private Date createTime;
private String userLocale;//用戶Locale信息
 //UUID類型!!
    //時間截
    
好了,我們看SubscibeService中的服務公開方法:
public Subscibe saveSubscibe(Subscibe subscibe) throws BbscsException;
public Subscibe findSubscibeByID(String id, String userID, long bid);
public Subscibe findSubscibeByPostID(String postID, String userID, long bid);
public List findSubscibesSend(String postID, long bid);
public long getSubscibeNumByUserID(String userID, long bid);
public PageList findSubscibesByUserID(String userID, long bid, Pages pages);
public void removeSubscibe(String id, String userID, long bid) throws BbscsException;
public void removeSubscibe(Subscibe subscibe) throws BbscsException;
而其實現基本由DAO完成!
private static final String LOAD_BY_ID = "from Subscibe where id = ? and userID = ?";
private static final String LOAD_BY_POSTID = "from Subscibe where postID = ? and userID = ?";
private static final String LOADS_SEND = "from Subscibe where postID = ?";
private static final String GET_NUM_BY_USER =
      "select count(*) from Subscibe where userID = ? and boardID = ?";
private static final String LOADS_BY_USER = "from Subscibe where userID = ? and boardID = ? order by createTime desc";
private static final String REMOVE_BY_ID = "delete from Subscibe where id = ? and userID = ?";
如下爲根據ID查找訂閱信息的,其中bid沒有用上!
public Subscibe findSubscibeByID(String id, String userID, long bid) {
    Object[] o = {id, userID};
    List l = this.getHibernateTemplate().find(LOAD_BY_ID, o);
    if (l == null || l.isEmpty()) {
      return null;
    }
    else {
      return (Subscibe) l.get(0);
    }
}

下面我們繼續分析SysNumStatService,先看其Bean:(系統統計)
private String id;
private String recDate; //統計時間
private long num0;//註冊人數
private long numInc0;//註冊人數增加數
private long num1;//主題數
private long numInc1;//主題增加數
private long num2;//帖子總數
private long numInc2;//帖子總數增加數
private long num3;
private long numInc3;
private long num4;
private long numInc4;
private long num5;
private long numInc5;
private long createTime;
我們看其方法:
public SysNumStat saveSysNumStat(SysNumStat sns) throws BbscsException;
public SysNumStat saveSysNumStat(String recDate, SysNumStat sns) throws BbscsException;
public SysNumStat findSysNumStatByRecDate(String recDate);
public long getSysNumStatNum();
public PageList findSysNumStats(Pages pages);//pages由web層的action填充!
它由DAO代理完成,對於DAO自行分析...

接下來是SysStatService,以前講過,這裏在複習一次吧.它是個抽象類,並沒有什麼bean支撐(不需要與數據庫打交道),直接寫在自己的私有成員,還有公開的setter/getter方法中!
private long onlineNum = 0;
private long appearTime = 0;
private String appearTimeStr = "";
private long allUserNum = 0;
private String lastRegUser = "";
private long postMainNum = 0;
private long postNum = 0;
子類需實現的方法有:
public abstract void load();
public abstract void saveOnline(long nowonlinenum);
public abstract void saveAllUserNum(long allusernum, String lastreguser);
public abstract void savePostNum(long main, long all);
對於具體的實現請看前面的分析!

我們看UserGroupService.其bean(用戶組)如下:
private Integer id;
private String groupName;//用戶組名稱
private String groupDesc;
private int typeID;//類型
private Set roles = new HashSet();
其UserGroup-mysql.hbm.xml:
 //set 多對多關係
    
讓我們看看起初加入數據庫的數據(注意到沒有roles字段):
(1,'遊客/未註冊用戶','',0),
(2,'註冊用戶','',0),
(3,'待驗證用戶','',0),
(4,'超級版主','',0),
(5,'系統管理員','',0),
(6,'封禁用戶','',0)
我們接下來看服務類的提供的對外方法:
public UserGroup saveUserGroup(UserGroup ug) throws BbscsException;
public UserGroup updateUserGroup(UserGroup ug) throws BbscsException;
public UserGroup findUserGroupByID(int id);
public List findUserGroupsAll();
public List findUserGroupInIDs(List ids);
public void removeUserGroup(UserGroup ug) throws BbscsException;
在其實現中,首先注入了userGroupDAO,boardDAO,boardPermissionDAO,userPermissionCache,這四個方法我們都用過:
public UserGroup saveUserGroup(UserGroup ug) throws BbscsException {
    try {
      ug = this.getUserGroupDAO().saveUserGroup(ug);
下面是對版區權限的附加操作(若沒有這個用戶組的話)
      List bplist = this.getBoardPermissionDAO().findBoardPermissionsByGid(ug.getId().intValue()); //取得版區權限列表
      if (bplist.size() == 0) { //沒有版區權限列表,說明是新的用戶組,增加版區權限記錄
        List blist = this.getBoardDAO().findBoardsAll(); //獲得所有的版區
        Board b;
        for (int i = 0; i < blist.size(); i++) {
          b = (Board) blist.get(i);
          BoardPermission bp = new BoardPermission();
          bp.setBoardID(b.getId().longValue());
          bp.setGroupID(ug.getId().intValue());
          bp.setPermissions(Constant.BOARD_PERMISSION_GROUP_LIST_1);//自定義權限列表!
          this.getBoardPermissionDAO().saveBoardPermission(bp);
        }
      }
      this.clearPermissionCache();
      return ug;
    }
    catch (Exception ex) {
      logger.error(ex);
      throw new BbscsException(ex);
    } private void clearPermissionCache() {
    if (Constant.USE_PERMISSION_CACHE) {
      this.getUserPermissionCache().removeAll();
    }
}
}
我們看下DAO:
public UserGroup saveUserGroup(UserGroup ug);
public UserGroup updateUserGroup(UserGroup ug);
public UserGroup findUserGroupByID(int id);
public List findUserGroupsAll();
public List findUserGroupInIDs(List ids);
public void removeUserGroup(UserGroup ug);
看其中的一個實現:
private static final String LOADS_IN_IDS = "from UserGroup where id in (:ids)";
public List findUserGroupInIDs(final List ids) {
return getHibernateTemplate().executeFind(new HibernateCallback() {
   public Object doInHibernate(Session s) throws HibernateException, SQLException {
    Query query = s.createQuery(LOADS_IN_IDS);
    query.setParameterList("ids", ids);
    List list = query.list();
    return list;
   }
});
}

下面是UserLevelService:
private String levelName; //級別名稱
private String id;//ID
private int levelValue;//該級別所需相應值
private int levelType;//級別類型

其初始數據請看數據庫設計表!其下有以下方法:
public UserLevel saveUserLevel(UserLevel ul) throws BbscsException;
public UserLevel findUserLevelById(String id);
public List findUserLevelsByType(int type);
public UserLevel getUserLevelByUserValue(int type, int value);
public void removeUserLevel(UserLevel ul) throws BbscsException;
其實現注入了sysListObjCache:
public UserLevel saveUserLevel(UserLevel ul) throws BbscsException {
try {
   ul = this.getUserLevelDAO().saveUserLevel(ul);
   this.getSysListObjCache().remove("UserLevel-" + ul.getLevelType());
   return ul;
} catch (Exception ex) {
   logger.error(ex);
   throw new BbscsException(ex);
}
}
按類型查找時,先從緩存中找,沒有再從DAO中找出後放入緩存中!
public List findUserLevelsByType(int type) {
List l = (List) this.getSysListObjCache().get("UserLevel-" + type);
if (l == null) {
   l = this.getUserLevelDAO().findUserLevelsByType(type);
   this.getSysListObjCache().add("UserLevel-" + type, l);
}
return l;
}
public UserLevel getUserLevelByUserValue(int type, int value) {
List l = this.getUserLevelDAO().findUserLevelsByType(type);
for (int i = 0; i < l.size(); i++) {
   UserLevel ul = (UserLevel) l.get(i);
   if (value < ul.getLevelValue()) {
    return ul;//有比type中小的話返回一個ul!
   }
}
UserLevel ul = new UserLevel(); //沒有的話!
ul.setLevelName("-");
ul.setLevelValue(0);
return ul;
}

public void removeUserLevel(UserLevel ul) throws BbscsException {
try {
   this.getSysListObjCache().remove("UserLevel-" + ul.getLevelType());//注意緩存的清理工作!
   this.getUserLevelDAO().removeUserLevel(ul);
} catch (Exception ex) {
   logger.error(ex);
   throw new BbscsException(ex);
}
}
我們看DAO實現:
private static final String LOADS_BY_TYPE = "from UserLevel where levelType = ? order by levelValue";//可見上面的this.getUserLevelDAO().findUserLevelsByType(type);是按levelValue排序的,因而得到的type最小的一個大於value的!

OK,UserOnlineService:其bean如下
private String id;
private String userID;//用戶ID
private String userName;//用戶名
private String nickName;//用戶暱稱
private long onlineTime;//在線時間
private String atPlace;//所在位置
private int userGroupID;//用戶所在組
private String validateCode;//校驗碼,用於防止重複登錄
private long boardID;//所在版區ID
private int hiddenUser;/隱身用戶標誌

我們看看其服務接口層提供的方法:
public UserOnline saveUserOnline(UserOnline userOnline) throws BbscsException;
public UserOnline createUserOnline(UserOnline userOnline) throws BbscsException;
public UserOnline findUserOnlineByID(String id);
public UserOnline findUserOnlineByUserName(String userName);
public List findUserOnlinesAllInTime(long atime);
public List findUserOnlinesByBoardIDInTime(long boradID, long atime);
public List findUserOnlineByGroupIDInTime(int groupID, long atime);
public long getUserOnlineNum(long atime);
public List findUserOnlines(long atime, long boradID, int hiddenUser, List groups);
public long getUserOnlineNum(long atime, long boradID, int hiddenUser, List groups);
public long getUserOnlineNumInIds(long atime, List ids);
public List findUserOnlinesInIds(long atime, List ids);
public long getUserOnlineNumInIds(long atime, List ids, long boradID, int hiddenUser, List groups);
public List findUserOnlinesInIds(long atime, List ids, long boradID, int hiddenUser, List groups);
public void removeUserOnline(UserOnline userOnline) throws BbscsException;
public void removeUserOnlineOutTime(long atime) throws BbscsException;
它其實現層:
public UserOnline createUserOnline(UserOnline userOnline) throws BbscsException {
    try {
      UserOnline uo = this.getUserOnlineDAO().findUserOnlineByUserID(userOnline.getUserID());//先看看有沒有,是否存在先.
      if (uo == null) {
        return this.getUserOnlineDAO().saveUserOnline(userOnline);//沒有的話
      }
      else {
        uo.setAtPlace(userOnline.getAtPlace());
        uo.setBoardID(userOnline.getBoardID());
        uo.setNickName(userOnline.getNickName());
        uo.setOnlineTime(userOnline.getOnlineTime());
        uo.setUserGroupID(userOnline.getUserGroupID());
        uo.setValidateCode(userOnline.getValidateCode());
        uo.setHiddenUser(userOnline.getHiddenUser());//有的話,userOnline--->uo
        return this.getUserOnlineDAO().saveUserOnline(uo);//更新之
      }
    }
    catch (Exception ex) {
      logger.error(ex);
      throw new BbscsException(ex);
    }
}
對於其它實現方法,大多由DAO去完成.我們看其DAO實現,首先是HQL語句:
private static final String LOAD_BY_USERID = "from UserOnline where userID = ?";
private static final String LOAD_BY_USERNAME = "from UserOnline where userName = ?";
private static final String LOADS_ALL_INTIME = "from UserOnline where onlineTime >= ?";//在線時間大於多少的就是在線的用戶!
private static final String LOADS_BY_BOARDID_INTIME =
      "from UserOnline where boardID = ? and onlineTime >= ?";
private static final String LOADS_BY_GROUPID_INTIME =
      "from UserOnline where userGroupID = ? and onlineTime >= ?";
private static final String REMOVE_ALL_OUTTIME = "delete from UserOnline where onlineTime < ?";
private static final String GET_NUM_INTIME =
      "select count(*) from UserOnline where onlineTime >= ?";
private static final String LOADS_IN_IDS =
      "from UserOnline where userID in (:ids) and onlineTime >= :atime";
private static final String GET_NUM_IN_IDS =
      "select count(*) from UserOnline where userID in (:ids) and onlineTime >= :atime";
保存或更新UserOnline對象:
public UserOnline saveUserOnline(UserOnline userOnline) {
    this.getHibernateTemplate().saveOrUpdate(userOnline);
    return userOnline;
}
public List findUserOnlines(final long atime, final long boardID, final int hiddenUser,
                              final List groups) {
    return getHibernateTemplate().executeFind(new HibernateCallback() {
      public Object doInHibernate(Session s) throws HibernateException {
        Criteria c = s.createCriteria(UserOnline.class);
        c.add(Restrictions.ge("onlineTime", new Long(atime)));
        if (boardID != 0) {
          c.add(Restrictions.eq("boardID", new Long(boardID)));
        }
        if (hiddenUser != -1) {
          c.add(Restrictions.eq("hiddenUser", new Integer(hiddenUser)));
        }
        if (groups != null && !groups.isEmpty()) {
          c.add(Restrictions.in("userGroupID", groups));
        }
        return c.list();
      }
    });
}
而getUserOnlineNum卻增加了一句:
c.setProjection(Projections.count("id"));
並且在返回結果後進行判斷:
List l = getHibernateTemplate().executeFind(new HibernateCallback() {...}
if (l == null || l.isEmpty()) {
      return 0;
    }
    else {
      return ( (Integer) l.get(0)).longValue();
    }
發佈了76 篇原創文章 · 獲贊 4 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章