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="${pageContext.request.contextPath}script/jquery.js"></script>
    <script language="javascript" src="${pageContext.request.contextPath}script/pageCommon.js" charset="utf-8"></script>
    <script language="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">
    <table cellspacing="0" cellpadding="0" class="TableStyle">

        <!-- 表头-->
        <thead>
            <tr align="CENTER" valign="MIDDLE" id="TableTitle">
            	<td width="250px">版块名称</td>
                <td width="300px">版块说明</td>
                <td>相关操作</td>
            </tr>
        </thead>

		<!--显示数据列表-->
        <tbody id="TableData" class="dataContainer" datakey="forumList">

        <s:iterator value="#forumList">
			<tr class="TableDetail1 template">
				<td>${name} </td>
				<td>${description} </td>
				<td><s:a action="forumManageAction_delete?id=%{id}" onClick="return delConfirm()" >删除</s:a>
					<s:a action="forumManageAction_editUI?id=%{id}" >修改</s:a>
					<s:a action="forumManageAction_moveUp?id=%{id}" >上移</s:a>
					<s:a action="forumManageAction_moveDown?id=%{id}" >下移</s:a>
				</td>
			</tr>

			</s:iterator>
        </tbody>
    </table>

    <!-- 其他功能超链接 -->
    <div id="TableTail">
        <div id="TableTail_inside">
            <s:a action="forumManageAction_addUI}" ><img src="${pageContext.request.contextPath}style/images/createNew.png" /></s:a>
        </div>
    </div>
</div>

<div class="Description">
	说明:<br />
	1,显示的列表按其sortOrder值升序排列。<br />
	2,可以通过上移与下移功能调整顺序。最上面的不能上移,最下面的不能下移。<br />
</div>

</body>
</html>

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>
时间: 2024-10-12 09:13:05

OA项目之论坛模块管理的相关文章

OA项目14:权限管理功能分析

首注:本学习教程为传智播客汤阳光讲师所公布的免费OA项目视频我的文字版实践笔记,本人用此来加强巩固自己开发知识,如有网友转载,请注明.谢谢. 一 权限管理分析: 1.权限的含义: 即控制管理功能的使用.比如登陆,需要登陆才能看到首页.用户根据自身权限显示其可管理的功能,如用户没有权限,便不会在页面显示. 2.web应用的权限: 每个功能都有相应的一个或多个URL地址,控制用户的URL就可以控制其权限. 3.权限方案: 用户通过角色授权: 用户     --->   角色    --->   权

OA项目15:权限管理实体设计及映射

首注:本学习教程为传智播客汤阳光讲师所公布的免费OA项目视频我的文字版实践笔记,本人用此来加强巩固自己开发知识,如有网友转载,请注明.谢谢. 一 实体设计: 1.权限实体设计: 1)属性设计: 主键:id 关联属性:Set<Role> roles,Set<Privilege> privileges,Privilege parent,Set<Privilege> children 一般属性:name,url 特殊属性:暂无 2)涉及到3个实体:User(用户),Role(

ongl表达式中得到对象,调用对象方法(OA项目权限显示模块)

在用户是否拥有某项权限的问题  是这样解决的: 用户登录之后  登录信息是保存在session域中的  通过el表达式可得到登录的对象信息  那么怎样判断用户是否拥有某项权限呢 ?如果没有上图中的判断 那么登录或者不登录  访问首页的时候 就会显示所有的权限列表(即操作菜单) 这些权限信息是在服务器启动的时候  检索并且保存在了application中的(可以看上一篇博客总结)  所以在遍历的时候 如果不加判断  默认显示的是所有的权限信息  即操作菜单 首先理清思路  user用户 中存在ro

OA项目13:系统模块之用户管理密码加密等

首注:本学习教程为传智播客汤阳光讲师所公布的免费OA项目视频我的文字版实践笔记,本人用此来加强巩固自己开发知识,如有网友转载,请注明.谢谢. 一 上节遗留了一个错误,在用户管理list.jsp页面显示岗位时这句<s:iterator value="#roles">是无法将岗位显示的,必须将#去掉便OK了. 二 密码MD5加密: 引入包:commons-codec.jar 在userAction中涉及到密码的add()方法和initPassword()方法中将设置密码的代码改

论坛模块_版块管理_增删改查&amp;实现上下移动

论坛模块_版块管理1_增删改查 设计实体Forum.java 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 getNam

OA项目12:系统管理之用户管理

首注:本学习教程为传智播客汤阳光讲师所公布的免费OA项目视频我的文字版实践笔记,本人用此来加强巩固自己开发知识,如有网友转载,请注明.谢谢. 一 之前在第8节时已经将User实体及映射文件建立好了,所以设计实体已经完成了,下面来做功能了. 二 我们对照静态页面看用户管理页面分析发现,增删改查功能跟之前一样,多了一个初始化密码的请求.当然,这不是问题,下面开始做功能吧! 三 开发: 1.写action及struts2映射,具体如下: 1)UserAction.java: 1 package cn.

OA项目5:系统管理之岗位管理

首注:本学习教程为传智播客汤阳光讲师所公布的免费OA项目视频的文字版,本人用此来加强巩固自己开发知识,如有网友转载,请注明.谢谢. 一 设计实体和表 1.建立javabean,建立角色类Role.java,具体如下: 1 package cn.clear.oa.domain; 2 3 public class Role { 4 5 private Long id; 6 private String name; 7 private String description; 8 public Long

OA项目7:系统管理之部门管理

首注:本学习教程为传智播客汤阳光讲师所公布的免费OA项目视频的文字版,本人用此来加强巩固自己开发知识,如有网友转载,请注明.谢谢. 一 根据需求,根据前台页面功能设计实体,创建javabean.Department.java,内容如下(先不处理上下级部门): 1 package cn.clear.oa.domain; 2 3 public class Department { 4 5 private Long id; 6 private String name; 7 private String

OA项目9:部门管理的上下级部门的功能实现

首注:本学习教程为传智播客汤阳光讲师所公布的免费OA项目视频我的文字版实践笔记,本人用此来加强巩固自己开发知识,如有网友转载,请注明.谢谢. 一 功能分析: 1,列表页面只显示一层的(同级的)部门数据,默认显示最顶级的部门列表. 2,点击部门名称,可以查看此部门相应的下级部门列表. 3,删除部门时,同时删除此部门的所有下级部门. 4,上级部门的列表是有层次结构的(树形). 5,如果是修改:上级部门列表中不能显示当前修改的部门及其子孙部门.因为不能选择自已或自已的子部门作为上级部门. 二 首先,将