首页 > 代码库 > OA项目之论坛模块管理

OA项目之论坛模块管理

1.做下论坛的笔记

2.效果如下:





3.我们从最简单的开始做,也就是模块管理,他跟Role管理相似,只是多了上移和下移的功能

4.首先分析多少个请求,前面写过CRUD一共6个请求,所以需要6个方法,再加上上移下移所以ForumAction应该有8个方法

5.设计实体Forum先不考虑和其他表的关联,他自身的属性,代码如下:(此处给出整个论坛设计的UML图)



Forum(上移和下移功能,设计思想是这样的,创建一个int的用于交换位置的position,上移下移其实就是将数据库表的一行记录交换下位置,但是必须考虑的是position的值如何赋予?下面再说)

package com.icss.oa.domain;

public class Forum {
	
	private Long id;
	private String name;
	private String description;
	private int position;
	
	
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getDescription() {
		return description;
	}
	public void setDescription(String description) {
		this.description = description;
	}
	public int getPosition() {
		return position;
	}
	public void setPosition(int position) {
		this.position = position;
	}
	
	
	

}
6.根据实体类写出对应的hbm文件,记得在hibernate文件中加上映射

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.icss.oa.domain">

    <class name="Forum" table="t_forum">

        <id name="id" >
            
            <generator class="native" />
        </id>
        
        <property name="name" >
            <column name="forum_name" />
        </property>
        
         <property name="description" >
            <column name="forum_description" />
        </property>
        
        <property name="position" >
            <column name="forum_position" />
        </property>
	

    </class>
</hibernate-mapping>


7.设计Action中的方法(记得在BaseAction中加入ForumService并且在Action加上注解)

package com.icss.oa.view.action;

import java.util.List;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import com.icss.oa.base.BaseAction;
import com.icss.oa.domain.Forum;
import com.icss.oa.domain.Role;
import com.opensymphony.xwork2.ActionContext;

@SuppressWarnings("serial")
@Controller
@Scope("prototype")
public class ForumManageAction extends BaseAction<Forum> {

	//列表方法
    public String list() throws Exception {
	   List<Forum> forumList=forumService.findAll();
	   ActionContext.getContext().put("forumList", forumList);
	    return "list";
    }

    //删除方法
	public String delete() throws Exception {
		
		forumService.delete(model.getId());
		return "toList";
	}
	
	//增加页面方法
	public String addUI() throws Exception {
		
		return "saveUI";
	}
	
	//增加方法
	public String add() throws Exception {
		forumService.save(model);
		return "toList";
	}
	
	//修改页面方法
	public String editUI() throws Exception {
		//回显数据
		Forum forum=forumService.getById(model.getId());
		ActionContext.getContext().getValueStack().push(forum);
		return "saveUI";
	}
	
	//修改方法
	public String edit() throws Exception {
		//从数据库中拿出原有的对象
		Forum forum=forumService.getById(model.getId());
		//修改属性
		forum.setName(model.getName());
		forum.setDescription(model.getDescription());
		//保存
		forumService.save(forum);
		return "toList";
	}
	
	
	//向上移动方法
    public String moveUp() throws Exception {
			forumService.moveUp(model.getId());
			return "toList";
    }
    
    //向下移动方法
    public String moveDown() throws Exception {
			forumService.moveDown(model.getId());
			return "toList";
    }


}
8.方法都差不多所有的回显都加上了功能齐全,记得在struts2.xml中加入jsp回显的结果,下移和上移功能是自己的特殊方法,在ForumServiceImpl文件中实现代码如下:

很多很多的注意点:①  这里需要重写findAll()和save()方法,因为查询需要根据position的value来排序

                                                       ②  如何为position赋值,利用数据库各自生成主键的策略,每生成一条记录就将forum的id值赋给position,因为id不会重复,而且是自增的每一                                                             次都能保证position的值是最大的

                                                       ③  注意SQL语句的优化,如下图:这下面2条效果都是取出当前position的上一条记录,效率相差很大,尽量少用子查询


int position
                 要求:
                      显示时按position升序排序。
                      position的值不能重复,在添加时要指定一个位置号,要是当前最大值再加1。
                     上移下移就是与上面或下面的Forum交换position的值。

package com.icss.oa.service.impl;

import java.util.List;
import org.springframework.stereotype.Service;
import com.icss.oa.base.BaseDaoImpl;
import com.icss.oa.domain.Forum;
import com.icss.oa.service.ForumService;

@Service
@SuppressWarnings("unchecked")
public class ForumServiceImpl extends BaseDaoImpl<Forum> implements ForumService  {
    
	

	@Override
	public List<Forum> findAll() {
		return getSession().createQuery(//
				"FROM Forum f ORDER BY f.position ASC")//
				.list();
	}

	@Override
	public void save(Forum forum) {
		// 保存到DB,会生成Id的值
		getSession().save(forum);

		// 指定position的值为最大 // SELECT MAX(f.position) FROM Forum f
		forum.setPosition(forum.getId().intValue());

		// 因为是持久化状态,所以不需要调用update()方法。
	}

	public void moveUp(Long id) {
		// 获取要交换的两个Forum
		Forum forum = getById(id); // 当前操作的Forum
		Forum other = (Forum) getSession().createQuery(// 我上面的那个Forum
				"FROM Forum f WHERE f.position<? ORDER BY f.position DESC")//
				.setParameter(0, forum.getPosition())//
				.setFirstResult(0)//
				.setMaxResults(1)//
				.uniqueResult();

		// 最上面的不能上移
		if (other == null) {
			return;
		}

		// 交换position的值
		int temp = forum.getPosition();
		forum.setPosition(other.getPosition());
		other.setPosition(temp);

		// 更新到数据库中
		// 因为是持久化状态,所以不需要调用update()方法。
	}

	public void moveDown(Long id) {
		// 获取要交换的两个Forum
		Forum forum = getById(id); // 当前操作的Forum
		Forum other = (Forum) getSession().createQuery(// 我下面的那个Forum
				"FROM Forum f WHERE f.position>? ORDER BY f.position ASC")//
				.setParameter(0, forum.getPosition())//
				.setFirstResult(0)//
				.setMaxResults(1)//
				.uniqueResult();

		// 最下面的不能下移
		if (other == null) {
			return;
		}

		// 交换position的值
		int temp = forum.getPosition();
		forum.setPosition(other.getPosition());
		other.setPosition(temp);

		// 更新到数据库中
		// 因为是持久化状态,所以不需要调用update()方法。
	}

	
}

9.至此论坛模块管理功能全部实现。

10.还记得写好jsp页面,都差不多就是在静态页面上改下标签,迭代取值等等操作,代码如下:

list.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ include file="/WEB-INF/jsp/public/common.jspf" %>
<html>
<head>
    <title>版块列表</title>
    <%@ include file="/WEB-INF/jsp/public/common.jspf" %>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <script language="javascript" src=http://www.mamicode.com/"${pageContext.request.contextPath}script/jquery.js"></script>>
saveUi.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ include file="/WEB-INF/jsp/public/common.jspf" %>
<html>
<head>
	<title>版块设置</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<script type="text/javascript" src="${pageContext.request.contextPath}script/jquery.js"></script>
    <script type="text/javascript" src="${pageContext.request.contextPath}script/pageCommon.js" charset="utf-8"></script>
    <script type="text/javascript" src="${pageContext.request.contextPath}script/PageUtils.js" charset="utf-8"></script>
   
    <link type="text/css" rel="stylesheet" href="${pageContext.request.contextPath}style/blue/pageCommon.css" />
    <script type="text/javascript">
    </script>
</head>
<body>

<!-- 标题显示 -->
<div id="Title_bar">
    <div id="Title_bar_Head">
        <div id="Title_Head"></div>
        <div id="Title"><!--页面标题-->
            <img border="0" width="13" height="13" src="${pageContext.request.contextPath}style/images/title_arrow.gif"/> 版块设置
        </div>
        <div id="Title_End"></div>
    </div>
</div>

<!--显示表单内容-->
<div id="MainArea">
    
    <s:form action="forumManageAction_%{id == null ? 'add' : 'edit'}">
    <s:hidden name="id"></s:hidden>
        <div class="ItemBlock_Title1"><!-- 信息说明<DIV CLASS="ItemBlock_Title1">
        	<IMG BORDER="0" WIDTH="4" HEIGHT="7" SRC="${pageContext.request.contextPath}style/blue/images/item_point.gif" /> 版块信息 </DIV>  -->
        </div>
        
        <!-- 表单内容显示 -->
        <div class="ItemBlockBorder">
            <div class="ItemBlock">
                <table cellpadding="0" cellspacing="0" class="mainForm">
                    <tr>
                        <td width="100">版块名称</td>
                        <td><s:textfield name="name" cssClass="InputStyle" /> *</td>
                    </tr>
                    <tr>
                        <td>版块说明</td>
                        <td><s:textarea name="description" cssClass="TextareaStyle"></s:textarea></td>
                    </tr>
                </table>
            </div>
        </div>
        
        <!-- 表单操作 -->
        <div id="InputDetailBar">
            <input type="image" src="${pageContext.request.contextPath}style/images/save.png"/>
            <a href="javascript:history.go(-1);"><img src="${pageContext.request.contextPath}style/images/goBack.png"/></a>
        </div>
    </s:form>
</div>

<div class="Description">
	说明:<br />
	1,新添加的版块默认显示在最下面。<br />
</div>

</body>
</html>






OA项目之论坛模块管理