⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 详细分析二.txt

📁 开源论坛实现
💻 TXT
📖 第 1 页 / 共 5 页
字号:
		sb.append("from Friend");
		sb.append(BBSCSUtil.getTableID(ownId, this.getModNum()));
/**
	public static int getTableID(String userID, int num) {
		int absNum = Math.abs(userID.hashCode());
		return (int) (absNum % num); //0~~~9
	}
	public static int getTableID(long bid, int num) {
		return (int) (bid % num);
	}

*/
		sb.append(" where id = ? and userID = ?");
		Object[] o = { id, ownId };
		List l = this.getHibernateTemplate().find(sb.toString(), o);
		if (l == null || l.isEmpty()) {
			return null;
		} else {
			return (Friend) l.get(0);
		}

	}
其它方法省略之.我们来看看Friend0.java:
public class Friend0 extends Friend implements Serializable {
		private static final long serialVersionUID = 8915456842365368615L;
	public Friend0() {
		super();
	}
}
<hibernate-mapping package="com.laoer.bbscs.bean">
  <class name="Friend0" table="bbscs_friend_0">//现在没这个表了!5555
    <id name="id" column="ID" type="string" unsaved-value="null">
      <generator class="uuid"/>
    </id>
    <property column="UserID" length="40" name="userID" not-null="true" type="string"/>
    <property column="UserName" length="20" name="userName" not-null="true" type="string"/>
    <property column="FriendID" length="40" name="friendID" not-null="true" type="string"/>
    <property column="FriendName" length="20" name="friendName" not-null="true" type="string"/>
    <property column="FriendComment" length="2000" name="friendComment" type="string"/>
    <property column="IsBlack" length="1" name="isBlack" type="int"/>
  </class>
</hibernate-mapping>

接下来是LoginErrorService:
public LoginError saveLoginError(LoginError loginError) throws BbscsException;
public LoginError findLoginErrorByID(String id); 
public LoginError findLoginErrorByUserID(String userID);
public List findLoginErrorsOutTime(long atime);//取得超过指定时间的LoginError列表
public void removeLoginErrorsOutTime(long atime) throws BbscsException;//删除超过指定时间的LoginError对象
public LoginError createLoginError(String userID) throws BbscsException;//创建或取得一个已有的LoginError对象
public boolean isCanNotLogin(String userID);//15分钟之内登录错误次数超过5次,不能登录
对于bean:
  private String id;
  private String userID;
  private int errorTimes;//登录时间
  private long loginTime;//错误次数
其hbm.xml文件中:
<hibernate-mapping package="com.laoer.bbscs.bean">
  <class name="LoginError" table="bbscs_loginerror">
    <id name="id" column="ID" type="string" unsaved-value="null">
      <generator class="uuid"/>
    </id>
    <property column="UserID" length="40" name="userID" not-null="true" type="string"/>
    <property column="ErrorTimes" length="11" name="errorTimes" not-null="true" type="int"/>
    <property column="LoginTime" length="20" name="loginTime" type="long"/>//long型的时间
  </class>
</hibernate-mapping>
对于服务的实现层,主要还是由DAO去处理的,除了以下两个方法:
//创建或取得一个已有的LoginError对象
 public LoginError createLoginError(String userID) throws BbscsException {
    LoginError loginError = this.getLoginErrorDAO().findLoginErrorByUserID(userID);
    if (loginError == null) {
      loginError = new LoginError();
      loginError.setErrorTimes(1);
      loginError.setLoginTime(System.currentTimeMillis());
      loginError.setUserID(userID);
    }
    else {
      loginError.setErrorTimes(loginError.getErrorTimes() + 1);//加1
      loginError.setLoginTime(System.currentTimeMillis());
    }
    try {
      return this.getLoginErrorDAO().saveLoginError(loginError);//保存
    }
    catch (Exception ex) {
      logger.error(ex);
      throw new BbscsException(ex);
    }
  }

  /**
   * 15分钟之内登录错误次数超过5次,不能登录,也就是15分钟后进行再进行登录不会执行本方法为true值,不过,再次登录错误的话,重新计算机loginError的LoginTime和ErrorTimes值!
      */
  public boolean isCanNotLogin(String userID) {
    LoginError loginError = this.getLoginErrorDAO().findLoginErrorByUserID(userID);
    if (loginError != null) {
      if ( (System.currentTimeMillis() - loginError.getLoginTime()) <= 15 * 60000) {
        if (loginError.getErrorTimes() >= 5) {
          return true;
        }
      }
    }
    return false;
  }
而DAO提供如下方法:(应该是根据serive imp中的需要而定吧!个人意见)
public LoginError saveLoginError(LoginError loginError);
public LoginError findLoginErrorByID(String id);
public LoginError findLoginErrorByUserID(String userID);
public List findLoginErrorsOutTime(long atime);
public void removeLoginErrorsOutTime(long atime);
public void removeLoginError(LoginError loginError);
DAO实现省略(下同)

下个是NoteService:(先看bean和hbm.xml)
        private String id;
	private String fromID;
	private String fromUserName;
	private String fromNickName;
	private String toID;
	private String toUserName;
	private String toNickName;
	private int noteType;//留言类型
	private String noteContext;
	private Date createTime;//`CreateTime` datetime NOT NULL default '0000-00-00 00:00:00', 创建时间
	private int isNew;//`IsNew` tinyint(1) default '1', 已读标志
	private int needRe; //需要回执
	private String noteTitle;
        private int isRe;//回复标志
	private int sysMsg; //系统留言标志
注意它用实现了Serializable接品,在bean包中也有许多Note0...Note9及Note0.hbm.xml...Note9.hbm.xml --->  <class name="Note9" table="bbscs_note_9">
在service层也有NoteFactory,在serivce imp层NoteFactoryImp和NotesFactoryImp两种不同的实例化Note对象的同步方法,在DAO实现层也有NotesHibernateDAO用于对相应table(如:bbscs_note_9)的操作,这些与Friend类似,而Subscibe类也差不多如此,因此省略之..
OK,我们继续看Note.hbm.xml:
<hibernate-mapping package="com.laoer.bbscs.bean">
  <class name="Note" table="bbscs_note">
    <id name="id" column="ID" type="string" unsaved-value="null">
      <generator class="uuid"/>
    </id>
    <property column="FromID" length="40" name="fromID" not-null="true" type="string"/>
    <property column="FromUserName" length="20" name="fromUserName" not-null="true" type="string"/>
    <property column="FromNickName" length="60" name="fromNickName" not-null="true" type="string"/>
    <property column="ToID" length="40" name="toID" not-null="true" type="string"/>
    <property column="ToUserName" length="20" name="toUserName" not-null="true" type="string"/>
    <property column="ToNickName" length="60" name="toNickName" not-null="true" type="string"/>
    <property column="NoteType" length="1" name="noteType" not-null="true" type="int"/>
    <property column="NoteTitle" length="150" name="noteTitle" not-null="true" type="string"/>
    <property column="NoteContext" name="noteContext" not-null="true" type="text"/>//直接text类型,OK!
    <property column="CreateTime" name="createTime" not-null="true" type="timestamp"/>//timstamp类型
    <property column="IsNew" length="1" name="isNew" type="int"/>
    <property column="NeedRe" length="1" name="needRe" type="int"/>
    <property column="IsRe" length="1" name="isRe" type="int"/>
    <property column="SysMsg" length="1" name="sysMsg" type="int"/>
  </class>
</hibernate-mapping>
我们继续看NoteService中的公开方法:
public Note saveNote(Note note) throws BbscsException;
public Note[] createNote(Note inbodNote, Note outboxNote) throws BbscsException;//创建纸条
public Note findNoteByIDFromID(String id, String fromID);
public Note findNoteByIDToID(String id, String toID);
public long getNoteAllNumOutBox(String fromID);//取得发件箱纸条数量
public PageList findNotesOutBox(final String fromId, Pages pages);
public long getNoteAllNumInBox(String toID);//取得收件箱纸条数量
public PageList findNotesInBox(final String toID, Pages pages);
public long getNoteNumInBoxByIsNew(String toID, int isNew);
public List findNotesInIDsOutBox(final String fromId, final List values);//取得发件箱中指定ID的Note列表
public List findNotesInIDsOutBox(final String fromId, final List values);
public List findNotesInIDsInBox(final String toId, final List values);
public void removeNote(Note note) throws BbscsException;
public void removeAllOutBox(String fromID) throws BbscsException;
public void removeAllInBox(String toID) throws BbscsException;
public void removeByIDFromID(String id, String fromID) throws BbscsException;//根据ID和发送者ID删除Note对象
public void removeByIDToID(String id, String toID) throws BbscsException;
public void removeInIDsFromID(List values, String fromID) throws BbscsException;
public void removeInIDsToID(List values, String toID) throws BbscsException;
我们看实现层,createNote创建纸条,返回一个Note数组:
public Note[] createNote(Note inbodNote, Note outboxNote) throws BbscsException {
    try {
      inbodNote = this.getNoteDAO().saveNote(inbodNote);
      outboxNote = this.getNoteDAO().saveNote(outboxNote);
      Note[] note = {inbodNote, outboxNote};
      return note;
    }
    catch (Exception ex) {
      logger.error(ex);
      throw new BbscsException(ex);
    }
  }
由于大部分方法直接给DAO层去完成,我们直接看DAO实现层:(NoteHibernateDAO)
首先是查询HQL定义
private static final String LOAD_BY_ID_FROMID = "from Note where id = ? and fromID = ?";
 private static final String LOAD_BY_ID_TOID = "from Note where id = ? and toID = ?";
 private static final String GET_ALL_NUM_OUTBOX =
     "select count(*) from Note where fromID = ? and noteType = ?";
  private static final String LOADS_OUTBOX =
      "from Note where fromID = ? and noteType = ? order by createTime desc";
  private static final String GET_ALL_NUM_INBOX =
      "select count(*) from Note where toID = ? and noteType = ?";
  private static final String LOADS_INBOX =
      "from Note where toID = ? and noteType = ? order by createTime desc";
  private static final String GET_NUM_INBOX_BY_ISNEW =
      "select count(*) from Note where toID = ? and noteType = ? and isNew = ?";
  private static final String LODAS_INIDS_OUTBOX =
      "from Note where id in (:ids) and fromID = :fromId";
  private static final String LODAS_INIDS_INBOX = "from Note where id in (:ids) and toID = :toId";
  private static final String REMOVE_ALL_OUTBOX =
      "delete from Note where fromID = ? and noteType = ?";
  private static final String REMOVE_ALL_INBOX = "delete from Note where toID = ? and noteType = ?";
  private static final String REMOVE_BY_ID_FROMID = "delete from Note where id = ? and fromID = ?";
  private static final String REMOVE_BY_ID_TOID = "delete from Note where id = ? and toID = ?";
  private static final String REMOVE_INIDS_FROMID =
      "delete from Note where id in (:ids) and fromID = :fromId";
  private static final String REMOVE_INIDS_TOID =
      "delete from Note where id in (:ids) and toID = :toId";
下面是取得发件箱纸条数量的方法:
 public long getNoteAllNumOutBox(String fromID) {
    Object[] o = {fromID, new Integer(0)}; //noteType=0
    List l = this.getHibernateTemplate().find(GET_ALL_NUM_OUTBOX, o);
    if (l == null || l.isEmpty()) {
      return 0;
    }
    else {
      return ( (Long) l.get(0)).longValue();
    }
  }
取得发件箱Note分页列表:
public List findNotesOutBox(final String fromId, final int firstResult, final int maxResults) {
    return getHibernateTemplate().executeFind(new HibernateCallback() {
      public Object doInHibernate(Session s) throws HibernateException, SQLException {
        Query query = s.createQuery(LOADS_OUTBOX);
        query.setString(0, fromId);
        query.setInteger(1, 0);
        query.setFirstResult(firstResult);
        query.setMaxResults(maxResults);

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

我们看PermissionService,先进入BEAN(权限信息),它有五个属性:
	private Long id;// default '0'
	private String permissionName; //权限名称 default ''
	private String resource;//权限资源(URI)default NULL
	private String action;//动作,Action default NULL
	private int typeID;//权限类型,default `0`
这里我发现在这个系统的数据库表设计中它尽量的提供了default值!!!(不过也可能是导出时工具生成的)
<hibernate-mapping package="com.laoer.bbscs.bean">
  <class name="Permission" table="bbscs_permission">
    <id name="id" column="ID" type="long" unsaved-value="undefined">
      <generator class="assigned"/> //自动增加键!
    </id>
    <property column="PermissionName" length="255" name="permissionName" not-null="true" type="string"/>
    <property column="PermissionResource" length="255" name="resource" type="string"/>
    <property column="Action" length="255" name="action" type="string"/>
    <property column="TypeID" length="2" name="typeID" not-null="true" type="int"/>
  </class>
</hibernate-mapping>
这次我们来看看数据库表Permission,发现它是一个基本固定不变的定义表,注意:  
权限类型有4种,普通权限(0) 特殊权限(1) 版区普通权限(2) 版区特殊权限(3),这里都为0 
122  XXXX(PermissionName)     /amdinUOTimeSet  *                       0
209  XXXX(由于我本地乱码)     /userFace        index,uppage,up,delme   0
OK!看方法:
  public Permission savePermission(Permission permission) throws BbscsException;
  public Permission updatePermission(Permission permission) throws BbscsException;
  public Permission findPermissionByID(long id);
  public List findPermissionsAll();
  public List findPermissionsByTypeID(int typeID);
  public List findPermissionnIDs(List ids);
PermissionServiceImp实现之,首先引入了userPermissionCache,以便在保存和更新后清理缓存数据!
我们直接进入PermissionHibernateDAO:
private static final String LOADS_ALL = "from Permission order by id";
  private static final String LOADS_BY_TYPEID = "from Permission where typeID = ? order by id";
  private static final String LOADS_IN_IDS = "from Permission where id in (:ids)";
我们只看一个方法:
public List findPermissionnIDs(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;
      }
    });
  }

OK,Next  RoleService,先看其BEAN先,它有四个属性:
	private Integer id;
	private String roleName;
	private int typeID;
	private List permissions = new ArrayList();
其Role-mysql.hbm.xml:
<hibernate-mapping package="com.laoer.bbscs.bean">
  <class name="Role" table="bbscs_role">
    <id name="id" column="ID" type="int" unsaved-value="null">
      <generator class="identity"/> //自动增长!

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -