经典三层模型制作学校论坛系统(BBS)

一、工具

STS,和MySQL数据库

二、系统分析:

需求概述

论坛即BBS,全称为Bulletin Board System。它是互联网上常见的一种交互性强、内容丰富的信息服务系统,每个用户都可以在上面浏览和发布信息。

早期的BBS与一般街头和校园内的公告板性质相同,只不过是用来传播或获得消息而已。普及之后,BBS的功能得到了很大的扩充。目前,通过BBS我们可以随时获取各种最新的信息,例如求职招聘、二手交易、交友娱乐等等,更可以召集亲朋好友一起高谈阔论。论坛拉近了我们的距离,使彼此素不相识的人可以在一起讨论问题、共享资源。

为了能更方便得帮助师生在课下讨论问题、共享资源,我们现在需要开发一个基于控制台的学校论坛系统。通过这个系统,学生可以很方便的提出自己在学习过程中遇到的问题,老师可以很方便的进行解答,大家还可以就学习方法进行分享和讨论

  1. 设计与思路分析
    1. 功能分析

结合上面的用例图,在这个项目中我们需要实现的功能可以分为以下两大块:

  • 管理员:登录、用户管理(查看和禁用)、版块管理(查看和增加)、主帖管理(查看和删除)、统计汇总(活跃用户和版块总贴数)。
  • 普通用户:注册、登录、发帖、回帖。

下面我们把其中一些稍微复杂的功能做进一步的说明。

  • 不管是普通用户还是管理员都需要进行登录,所以在实现登录功能时,需要注意判断对方是管理员还是普通用户,这里要求使用存储过程实现。
  • 在实现删除主帖时需要注意的是:某个主帖可能有很多回帖,这时需要先删除这个主帖的所有回帖,然后才能删除主帖。同时考虑到数据的一致性,这个地方需要使用JDBC事务进行处理。
  • 对于统计汇总功能,由于实现单独一个功能所需要的SQL语句不止一条,所以这里要求使用存储过程来实现。
  • 由于本项目是控制台程序,所以用户在使用这个程序时需要很多菜单导航来一步一步进行操作,这时我们可以单独设计一个类来实现程序中所有的菜单导航。
  • 数据库设计

根据上述需求描述和功能分析设计出以下四个表。

表11-1 用户表(user)

列名

数据类型

是否为空

说明

uId

int

用户ID,自动编号,主键

uName

varchar(20)

用户昵称

uPass

varchar(20)

用户密码

state

int

用户状态,0表示正常,1表示禁用

flag

int

用户标识,0表示管理员,1表示用户

表11-2 版块表(board)

列名

数据类型

是否为空

说明

bId

int

版块ID,自动编号,主键

bName

varchar(50)

版块名字

表11-3 主贴表(topic)

列名

数据类型

是否为空

说明

tId

int

主帖ID,自动编号,主键

title

varchar(50)

主帖标题

context

varchar(1000)

主帖内容

pTime

datetime

发帖时间

uId

int

发帖人,外键,引用user表主键

bId

int

所属版块,外键,引用board表主键

 

表11-4 回帖表(reply)

列名

数据类型

是否为空

说明

rId

int

回帖ID,自动编号,主键

title

varchar(50)

回帖标题

context

varchar(1000)

回帖内容

pTime

datetime

回帖时间

uId

int

回帖人,外键,引用user表主键

tId

int

所属主帖,外键,引用topic表主键

对于这个校园论坛系统(BBS)系统,有四个表,所以对应的就应该有四个实体类,我们先写实体类,分别是用户类User,主贴类Title,板块类Board,回帖类Reply,我们把这四个实体类放到同一个包entity(实体)中。这样分类放,方便管理

 

package com.xintouyun.bbs.entity;
//用户类User
public class User {
	private int uid;
	private String uname;
	private String upass;
	private int state;
	private int flag;
	//private UserState userState;
	
	//public UserState getUserState() {
		//return userState;
	//}
	//public void setUserState(UserState userState) {
		//this.userState = userState;
	//}
	public int getUid() {
		return uid;
	}
	public void setUid(int uid) {
		this.uid = uid;
	}
	public String getUname() {
		return uname;
	}
	public void setUname(String uname) {
		this.uname = uname;
	}
	public String getUpass() {
		return upass;
	}
	public void setUpass(String upass) {
		this.upass = upass;
	}
	public int getState() {
		return state;
	}
	public void setState(int state) {
		this.state = state;
	}
	public int getFlag() {
		return flag;
	}
	public void setFlag(int flag) {
		this.flag = flag;
	}
}
package com.xintouyun.bbs.entity;
//主贴类
public class Topic {
	private int tid;
	private String title;
	private String context;
	private String ptime;
	private int uid;
	private int bid;
	private String bname;
	private String uname;
	public String getBname() {
		return bname;
	}
	public void setBname(String bname) {
		this.bname = bname;
	}
	public String getUname() {
		return uname;
	}
	public void setUname(String uname) {
		this.uname = uname;
	}
	public int getTid() {
		return tid;
	}
	public void setTid(int tid) {
		this.tid = tid;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getContext() {
		return context;
	}
	public void setContext(String context) {
		this.context = context;
	}
	public String getPtime() {
		return ptime;
	}
	public void setPtime(String ptime) {
		this.ptime = ptime;
	}
	public int getUid() {
		return uid;
	}
	public void setUid(int uid) {
		this.uid = uid;
	}
	public int getBid() {
		return bid;
	}
	public void setBid(int bid) {
		this.bid = bid;
	}
}
package com.xintouyun.bbs.entity;
//回帖类
public class Reply {
	private int rid;
	private String title;
	private String context;
	private String ptime;
	private int uid;
	private int tid;
	public int getRid() {
		return rid;
	}
	public void setRid(int rid) {
		this.rid = rid;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getContext() {
		return context;
	}
	public void setContext(String context) {
		this.context = context;
	}
	public String getPtime() {
		return ptime;
	}
	public void setPtime(String ptime) {
		this.ptime = ptime;
	}
	public int getUid() {
		return uid;
	}
	public void setUid(int uid) {
		this.uid = uid;
	}
	public int getTid() {
		return tid;
	}
	public void setTid(int tid) {
		this.tid = tid;
	}
}

 

package com.xintouyun.bbs.entity;
//版块类
public class Board {
	private int bid;
	private String bname;
	public int getBid() {
		return bid;
	}
	public void setBid(int bid) {
		this.bid = bid;
	}
	public String getBname() {
		return bname;
	}
	public void setBname(String bname) {
		this.bname = bname;
	} 
	
}

 连接数据库的过程有过多重复代码,我们可以吧他封装成一个工具类JdbcUtil(我这里连接的是本地的mysql数据库,本文使用的数据库名字叫bbs,里面有四个表user,topic,board,reply)

package com.xintouyun.bbs.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public final class JdbcUtil {
	private static String DRIVER_CLASS = "com.mysql.jdbc.Driver";
	private static String URL="jdbc:mysql:///bbs";//连接本地mysql数据库,然后连接bbs数据库
	private static String USER = "root";
	private static String PASSWORD = "123456";
	//封装加载驱动
	static {
		try {
			Class.forName(DRIVER_CLASS);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
        //封装连接数据库
	public static Connection getConnection()  {
		
		try {
			return DriverManager.getConnection(URL, USER, PASSWORD);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		 
		return null;
	}
    //封装关闭数据库连接
	public static void closeAll(ResultSet rs, Statement st, Connection conn) {
		try {
			if (rs != null)
				rs.close();
			if (st != null)
				st.close();
			if (conn != null)
				conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		} 
	}
	
	
	}
	
}

二、系统大致分层

1.Dao层:对数据库中内容进行存取操作

首先是Dao层的接口,我们可以先把要实现的功能给列出来,然后通过接口把这些方法声明出来。为什么要用接口而不直接写实现类呢,这就涉及到了面型接口编程,在实际开发中我们可能没有过多的时间去写实现方法,所以可以先通过接口把方法的名称,参数,返回值类型定义出来,这样其他人就可以通过写的接口帮你写实现类,这样写出来可以保证我们的代码是可以互相拿来用的。另外接口也可以使我们的程序具有良好的可扩展性,一个接口可以通过不同的实现方法来实现,这样利于我们后期的维护。

package com.xintouyun.bbs.dao;

import java.util.List;

import com.xintouyun.bbs.entity.User;

public interface UserDao {
	/**
	 * 根据用户名和密码查询
	 * @param uname
	 * @param upass
	 * @return 数据表中有一条记录返回一个user对象,否则返回null
	 */
	User queryByUnameAndUpass(String uname,String upass);
	/**
	 * 保存一个用户对象
	 * @param user
	 * @return 返回受影响行数
	 */
	int saveUser(User user);
	/**
	 * 根据用户状态筛选
	 * @param state
	 * @return 返回符合条件的对象集合
	 */
	List <User> listByState(int state);
	/**
	 * 修改用户状态,禁用用户
	 * @param uid
	 * @return 返回受影响行数
	 */
	int DisableUser(int uid);
}
package com.xintouyun.bbs.dao;

import java.util.List;

import com.xintouyun.bbs.entity.Reply;
import com.xintouyun.bbs.entity.Topic;

public interface TopicDao {
	/**
	 * 查看所有主贴
	 * @return 对象集合
	 */
	List <Topic> listTopic();
	/**
	 * 查看指定板块下所有主贴
	 * @param bid
	 * @return 对象集合
	 */
	List <Topic> listTopic(int bid);
	/**
	 * 添加一个主贴
	 * @param topic
	 * @return 返回受影响行数
	 */
	int saveTopic(Topic topic);
	/**
	 * 根据主贴id删除
	 * @param tid
	 * @return 返回受影响行数
	 */
	int deleteTopic(int tid);
	
	/**
	 * 根据板块编号统计主贴条数
	 * @param bid 板块编号
	 * @return 主贴条数
	 */
	int countByBid(int bid);
	/**
	 * 显示最近发帖活跃的用户
	 * @return
	 */
	List<String> listActiveUsers();
	/**
	 * 根据回帖查看主贴是否存在
	 * @param reply
	 * @return
	 */
	boolean findTopicByTid(int tid);
}
package com.xintouyun.bbs.dao;

import java.util.List;

import com.xintouyun.bbs.entity.Reply;

public interface ReplyDao {
	/**
	 * 添加回帖对象
	 * @param reply
	 * @return 返回受影响行数
	 */
	int saveReply(Reply reply);
	/**
	 * 根据主贴号列出其所有回帖
	 * @param tid
	 * @return
	 */
	List <Reply> queryReplyByTid(int tid);
	/**
	 * 根据主贴号删除回帖
	 * @param tid
	 * @return 返回受影响行数
	 */
	int deleteByTid(int tid);
}
package com.xintouyun.bbs.dao;

import java.util.List;

import com.xintouyun.bbs.entity.Board;

public interface BoardDao {
	/**
	 * 列出所有版块
	 * @return 对象集合
	 */
	List <Board> listBoard();
	/**
	 * 保存一个版块对象
	 * @param board
	 * @return 返回受影响行数
	 */
	int saveBoard(Board board);
}

 然后我们写实现类来实现这些功能

package com.xintouyun.bbs.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import com.xintouyun.bbs.dao.UserDao;
import com.xintouyun.bbs.entity.User;
import com.xintouyun.bbs.entity.UserState;
import com.xintouyun.bbs.util.JdbcUtil;

public class UserDaoImpl implements UserDao{

	@Override
	public User queryByUnameAndUpass(String uname, String upass) {
		// TODO Auto-generated method stub
		Connection conn = null;
		PreparedStatement st = null;
		ResultSet rs = null;
		User user=null;
		try {
			conn = JdbcUtil.getConnection();
			st = conn.prepareStatement("select * from user where uname=? and upass=? and state=0" );	
			st.setString(1, uname);
			st.setString(2, upass);
			rs=st.executeQuery();
			while(rs.next()) {
				user=new User();
				user.setUid(rs.getInt("uid"));
				user.setUname(rs.getString("uname"));
				user.setUpass(rs.getString("upass"));
				user.setState(rs.getInt("state"));
				user.setFlag(rs.getInt("flag"));
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JdbcUtil.closeAll(rs, st, conn);
		}
		return user;
	}

	@Override
	public int saveUser(User user) {
		// TODO Auto-generated method stub
		Connection conn = null;
		PreparedStatement st = null;
		ResultSet rs = null;
		int affectedRow = 0;
		try {
			conn = JdbcUtil.getConnection();
			st = conn.prepareStatement("insert into user(uname,upass,state,flag) values(?,?,0,1)");
			st.setString(1, user.getUname());
			st.setString(2, user.getUpass());
			/*st.setInt(3, user.getState());
			st.setInt(4, user.getFlag());*/
			affectedRow = st.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JdbcUtil.closeAll(rs, st, conn);
		}
		return affectedRow;
	}

	@Override
	public List<User> listByState(int state) {
		// TODO Auto-generated method stub
		Connection conn = null;
		PreparedStatement st = null;
		ResultSet rs = null;
		List<User> list=new ArrayList<User>();
		User user=null;
		//UserState userstate=null;
		try {
			conn = JdbcUtil.getConnection();
			st=conn.prepareStatement("select * from user u,userstate us where u.state=us.id and u.state=?");
			//st = conn.prepareStatement("select * from user where state=?");
			st.setInt(1, state);
			rs=st.executeQuery();
			while(rs.next()) {
				user=new User();
				user.setUid(rs.getInt("uid"));
				user.setUname(rs.getString("uname"));
				user.setUpass(rs.getString("upass"));
				user.setState(rs.getInt("state"));
				user.setFlag(rs.getInt("flag"));
				//
				UserState userState = new UserState();
				userState.setName(rs.getString("name"));
				userState.setId(rs.getInt("id"));
				user.setUserState(userState);

			list.add(user);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JdbcUtil.closeAll(rs, st, conn);
		}
		return list;
	}

	@Override
	public int DisableUser(int uid) {
		// TODO Auto-generated method stub
		Connection conn = null;
		PreparedStatement st = null;
		ResultSet rs = null;
		int affectedRow = 0;
		try {
			conn = JdbcUtil.getConnection();
			st = conn.prepareStatement("update user set state=1 where uid=?");
			st.setInt(1, uid);
			st.executeUpdate();		
			affectedRow = st.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JdbcUtil.closeAll(rs, st, conn);
		}
		return affectedRow;
	}

}

 

package com.xintouyun.bbs.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.xintouyun.bbs.dao.TopicDao;
import com.xintouyun.bbs.entity.Reply;
import com.xintouyun.bbs.entity.Topic;
import com.xintouyun.bbs.util.JdbcUtil;

public class TopicDaoImpl implements TopicDao{

	@Override
	public List<Topic> listTopic() {
		// TODO Auto-generated method stub
		Connection conn = null;
		PreparedStatement st = null;
		ResultSet rs = null;
		List <Topic> list=new ArrayList<Topic>();
		Topic topic=null;
		try {
			conn = JdbcUtil.getConnection();
			//st = conn.prepareStatement("select * from topic");
			st=conn.prepareStatement("select b.bid,b.bname,t.tid,t.title,t.context,t.ptime,u.uid,u.uname from board b,topic t,user u where u.uid=t.uid and b.bid=t.bid");
			rs=st.executeQuery();
			while(rs.next()) {
				topic=new Topic();
				topic.setBid(rs.getInt("bid"));
				topic.setTitle(rs.getString("title"));
				topic.setContext(rs.getString("context"));
				topic.setPtime(rs.getString("ptime"));
				topic.setUid(rs.getInt("uid"));
				topic.setTid(rs.getInt("tid"));
				topic.setBname(rs.getString("bname"));
				topic.setUname(rs.getString("uname"));
				list.add(topic);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JdbcUtil.closeAll(rs, st, conn);
		}	
		return list;
	}

	@Override
	public List<Topic> listTopic(int bid) {
		// TODO Auto-generated method stub
		Connection conn = null;
		PreparedStatement st = null;
		ResultSet rs = null;
		List <Topic> list=new ArrayList<Topic>();
		Topic topic=null;
		try {
			conn = JdbcUtil.getConnection();
			st = conn.prepareStatement("select b.bid,b.bname,t.tid,t.title,t.context,t.ptime,u.uid,u.uname from board b,topic t,user u where u.uid=t.uid and b.bid=t.bid group by b.bid having b.bid=?" );
			st.setInt(1, bid);
			rs=st.executeQuery();
			while(rs.next()) {
				topic=new Topic();
				topic.setBid(rs.getInt("bid"));
				topic.setTitle(rs.getString("title"));
				topic.setContext(rs.getString("context"));
				topic.setPtime(rs.getString("ptime"));
				topic.setUid(rs.getInt("uid"));
				topic.setTid(rs.getInt("tid"));
				topic.setBname(rs.getString("bname"));
				topic.setUname(rs.getString("uname"));
				list.add(topic);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JdbcUtil.closeAll(rs, st, conn);
		}	
		return list;
	}

	@Override
	public int saveTopic(Topic topic) {
		Connection conn = null;
		PreparedStatement st = null;
		ResultSet rs = null;
		int affectedRow = 0;
		try {
			conn = JdbcUtil.getConnection();
			st = conn.prepareStatement("insert into topic(title,context,ptime,uid,bid) values(?,?,now(),?,?)");
			st.setString(1, topic.getTitle());
			st.setString(2, topic.getContext());
			st.setInt(3, topic.getUid());
			st.setInt(4, topic.getBid());
			affectedRow=st.executeUpdate();	
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JdbcUtil.closeAll(rs, st, conn);
		}
		return affectedRow;
	}

	@SuppressWarnings("resource")
	public int deleteTopic(int tid) {
		Connection conn = null;
		PreparedStatement st = null;
		ResultSet rs = null;
		Reply reply=null;
		List <Reply> list=new ArrayList<Reply>();
		int affectedRow = 0;
		try {
			conn = JdbcUtil.getConnection();
			conn.setAutoCommit(false);
			st = conn.prepareStatement("select * from reply where tid=?");
			st.setInt(1, tid);
			rs=st.executeQuery();
			while(rs.next()) {
				reply=new Reply();
				reply.setTitle(rs.getString("title"));
				reply.setContext(rs.getString("context"));
				reply.setPtime(rs.getString("ptime"));
				reply.setUid(rs.getInt("uid"));
				reply.setTid(rs.getInt("tid"));				
				list.add(reply);
			}	
			st = conn.prepareStatement("delete from reply where tid=?");
			st.setInt(1, tid);	
			st.executeUpdate();
			//int i=5/0;*/
			st = conn.prepareStatement("delete from topic where tid=?");
			st.setInt(1, tid);	
			affectedRow=st.executeUpdate();
			conn.commit();

		} catch (Exception e) {
			e.printStackTrace();
			try {
				conn.rollback();
			} catch (SQLException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}

		} finally {
			JdbcUtil.closeAll(rs, st, conn);
		}
		return affectedRow;
	}

	@Override
	public int countByBid(int bid) {
		Connection conn = null;
		PreparedStatement st = null;
		ResultSet rs = null;
		int affectedRow = 0;
		try {
			conn = JdbcUtil.getConnection();
			st = conn.prepareStatement("select count(*) from topic where bid=?");
			st.setInt(1, bid);
		rs=st.executeQuery();
		while(rs.next()) {
			affectedRow=rs.getInt("count(*)");
		}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JdbcUtil.closeAll(rs, st, conn);
		}
		return affectedRow;
	}

	@Override
	public List<String> listActiveUsers() {
		Connection conn = null;
		PreparedStatement st = null;
		ResultSet rs = null;
		List <String> list=new ArrayList<String>();
		try {
			conn = JdbcUtil.getConnection();
			st = conn.prepareStatement("select uid from topic");
			rs=st.executeQuery();
			while(rs.next()) {
				String uid=rs.getString("uid");
				list.add(uid);
			}
	} catch (Exception e) {
		e.printStackTrace();
	} finally {
		JdbcUtil.closeAll(rs, st, conn);
	}	
	return list;
	}

	@Override
	public boolean findTopicByTid(int tid) {
		Connection conn = null;
		PreparedStatement st = null;
		ResultSet rs = null;
		boolean flag=false;
		try {
			conn = JdbcUtil.getConnection();
			st = conn.prepareStatement("select * from topic where tid=?");
			st.setInt(1, tid);
			rs=st.executeQuery();
			while(rs.next()) {
				flag=true;
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JdbcUtil.closeAll(rs, st, conn);
		}	
		return flag;
	}
	
}

 

package com.xintouyun.bbs.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import com.xintouyun.bbs.dao.ReplyDao;
import com.xintouyun.bbs.entity.Reply;
import com.xintouyun.bbs.util.JdbcUtil;

public class ReplyDaoImpl implements ReplyDao {

	@Override
	public int saveReply(Reply reply) {
		// TODO Auto-generated method stub
		Connection conn = null;
		PreparedStatement st = null;
		ResultSet rs = null;
		int affectedRow = 0;
		try {
			conn = JdbcUtil.getConnection();
			st = conn.prepareStatement("insert into reply(title,context,ptime,uid,tid) values(?,?,now(),?,?) ");
			st.setString(1, reply.getTitle());
			st.setString(2, reply.getContext());
			st.setInt(3, reply.getUid());
			st.setInt(4, reply.getTid());
			affectedRow=st.executeUpdate();	
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JdbcUtil.closeAll(rs, st, conn);
		}
		return affectedRow;
	}

	@Override
	public List<Reply> queryReplyByTid(int tid) {
		// TODO Auto-generated method stub
		Connection conn = null;
		PreparedStatement st = null;
		ResultSet rs = null;
		List <Reply> list=new ArrayList<Reply>();
		Reply reply=null;
		try {
			conn = JdbcUtil.getConnection();
			st = conn.prepareStatement("select * from reply where tid=?");
			st.setInt(1, tid);
			rs=st.executeQuery();
			while(rs.next()) {
				reply=new Reply();
				reply.setTitle(rs.getString("title"));
				reply.setContext(rs.getString("context"));
				reply.setPtime(rs.getString("ptime"));
				reply.setUid(rs.getInt("uid"));
				reply.setTid(rs.getInt("tid"));				
				list.add(reply);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JdbcUtil.closeAll(rs, st, conn);
		}	
		return list;
	}

	@Override
	public int deleteByTid(int tid) {
		// TODO Auto-generated method stub
		Connection conn = null;
		PreparedStatement st = null;
		ResultSet rs = null;
		int affectedRow = 0;
		try {
			conn = JdbcUtil.getConnection();
			st = conn.prepareStatement("delete from reply where tid=?");
			st.setInt(1, tid);	
			affectedRow=st.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JdbcUtil.closeAll(rs, st, conn);
		}
		return affectedRow;
	}

}

 

package com.xintouyun.bbs.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import com.xintouyun.bbs.dao.BoardDao;
import com.xintouyun.bbs.entity.Board;
import com.xintouyun.bbs.util.JdbcUtil;

public class BoardDaoImpl implements BoardDao{

	@Override
	public List<Board> listBoard() {
		// TODO Auto-generated method stub
		Connection conn = null;
		PreparedStatement st = null;
		ResultSet rs = null;
		List <Board> list=new ArrayList<Board>();
		Board board=null;
		try {
			conn = JdbcUtil.getConnection();
			st = conn.prepareStatement("select * from board");
			rs=st.executeQuery();
			while(rs.next()) {
				board=new Board();
				board.setBid(rs.getInt("bid"));
				board.setBname(rs.getString("bname"));
				list.add(board);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JdbcUtil.closeAll(rs, st, conn);
		}	
		return list;
	}

	@Override
	public int saveBoard(Board board) {
		// TODO Auto-generated method stub
		Connection conn = null;
		PreparedStatement st = null;
		ResultSet rs = null;
		int affectedRow = 0;
		try {
			conn = JdbcUtil.getConnection();
			st = conn.prepareStatement("insert into board(bname) values(?)");
			st.setString(1, board.getBname());
			affectedRow=st.executeUpdate();	
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JdbcUtil.closeAll(rs, st, conn);
		}
		return affectedRow;
	}

}

2.业务层:制作相应的函数,实现相应的业务需求

同样业务层我们也是先写接口来定义这些业务的方法:

package com.xintouyun.bbs.service;

import java.util.List;

import com.xintouyun.bbs.entity.User;

public interface UserService {
	/**
	 * 查询禁用用户
	 * @return 用户列表
	 */
	List<User> showDisabledUsers(int state);
	
	/**
	 * 查询正常用户
	 * @return 用户列表
	 */
	List<User> showEnabledUsers(int state);
	/**
	 * 禁用指定用户
	 * @param uid 用户编号
	 * @return true成功,false失败
	 */
	boolean disableUser(int uid);
}
package com.xintouyun.bbs.service;

import java.util.List;

import com.xintouyun.bbs.entity.Reply;
import com.xintouyun.bbs.entity.Topic;

public interface TopicService {
	/**
	 * 查看所有主贴
	 * @return 主贴集合
	 */
	List<Topic> showAllTopic();
	/**
	 * 查看指定板块下主贴
	 * @param bid
	 * @return 主贴集合
	 */
	List<Topic> showAllTopic(int bid);
	/**
	 * 根据主贴号删除主贴
	 * @param tid
	 * @return 成功返回true,否则返回false
	 */
	boolean deleteTopic(int tid);
	/**
	 * 查询主贴的所有回帖
	 * @param tid
	 * @return 主贴的所有回帖的集合
	 */
	List<Reply> queryReplyByTid(int tid);
	/**
	 * 根据主贴删除所有回帖
	 * @param tid 主贴号
	 * @return 删除成功返回true,否则返回false
	 */
	boolean deleteReplyByTid(int tid);
	/**
	 * 根据版块统计主贴数目
	 * @param bid
	 * @return
	 */
	int countByBid(int bid);
	/**
	 * 获取所有主贴的uid
	 * @return 
	 */
	List<String> countActiveUser();
	
}

 

package com.xintouyun.bbs.service;

public interface CountService {
	/**
	 * 统计某个版块帖子总数
	 * @param bid 版块号
	 * @return 帖子总数
	 */
	int countAllTopicNum(int bid);
}

 

package com.xintouyun.bbs.service;

import java.util.List;

import com.xintouyun.bbs.entity.Board;

public interface Boardservice {
	/**
	 * 查询版块
	 * @return 返回版块对象集合
	 */
	List<Board> showAllBoard();
	/**
	 * 添加版块
	 * @param board
	 * @return 添加成功返回true,添加失败返回false
	 */
	boolean addBoard(Board board);
}
package com.xintouyun.bbs.service;

import com.xintouyun.bbs.entity.Reply;
import com.xintouyun.bbs.entity.Topic;
import com.xintouyun.bbs.entity.User;

public interface BaseService {
	/**
	 * 登录
	 * @param uname 用户名
	 * @param upass 密码
	 * @return 成功返回User,失败返回null
	 */
	User checkLogin(String uname,String upass) ;
	/**
	 * 注册用户
	 * @param user 用户对象
	 * @return 成功返回true,失败返回false
	 */
	boolean register(User user);
	/**
	 * 发帖
	 * @param topic
	 * @return 成功返回true,失败返回false
	 */
	boolean post(Topic topic);
	/**
	 * 回復帖子
	 * @param reply
	 * @return 成功返回true,失败返回false
	 */
	boolean rePost(Reply reply,int tid);
}

 接口写完我们来写一下实现类:

package com.xintouyun.bbs.service.impl;
import java.util.List;

import com.xintouyun.bbs.dao.impl.UserDaoImpl;
import com.xintouyun.bbs.entity.User;
import com.xintouyun.bbs.service.UserService;

public class UserServiceImpl implements UserService{
	UserDaoImpl udi=new UserDaoImpl();
	@Override
	public List<User> showDisabledUsers(int state) {
		List<User> list=udi.listByState(1);
		return list;
	}
	@Override
	public List<User> showEnabledUsers(int state) {
		List<User> list=udi.listByState(0);
		return list;
	}
	@Override
	public boolean disableUser(int uid) {
		return udi.DisableUser(uid)>0;
	}
}
package com.xintouyun.bbs.service.impl;
import java.util.List;

import com.xintouyun.bbs.dao.impl.ReplyDaoImpl;
import com.xintouyun.bbs.dao.impl.TopicDaoImpl;
import com.xintouyun.bbs.entity.Reply;
import com.xintouyun.bbs.entity.Topic;
import com.xintouyun.bbs.service.TopicService;

public class TopicServiceImpl implements TopicService {
	TopicDaoImpl tdi=new TopicDaoImpl();
	ReplyDaoImpl rdi=new ReplyDaoImpl();
	@Override
	public List<Topic> showAllTopic() {
		List<Topic> list=tdi.listTopic();
		return list;
	}

	@Override
	public List<Topic> showAllTopic(int bid) {
		List<Topic> list=tdi.listTopic(bid);
		return list;
	}

	@Override
	public boolean deleteTopic(int tid) {
		return tdi.deleteTopic(tid)>0;
	}

	@Override
	public boolean deleteReplyByTid(int tid) {
		return rdi.deleteByTid(tid)>0;
	}

	@Override
	public List<Reply> queryReplyByTid(int tid) {
		List<Reply> list=rdi.queryReplyByTid(tid);
		return list;
	}

	@Override
	public int countByBid(int bid) {
		int count=tdi.countByBid(bid);
		return count;
	}

	@Override
	public List<String> countActiveUser() {
		List<String> list=tdi.listActiveUsers();
		return list;
	}

}

 

package com.xintouyun.bbs.service.impl;

import java.util.List;

import com.xintouyun.bbs.dao.impl.TopicDaoImpl;
import com.xintouyun.bbs.entity.User;
import com.xintouyun.bbs.service.CountService;
public class CountServiceImpl implements CountService {
	TopicDaoImpl tdi=new TopicDaoImpl();
	@Override
	//查询某个版块中的主贴数
	public int countAllTopicNum(int bid) {
		int i=tdi.countByBid(bid);
		return i;
	}
	//查询最近三个月最活跃用户前三名
	public List<User> countActiveUser(){	
		return null;
		
	}
}

 

package com.xintouyun.bbs.service.impl;
import java.util.List;

import com.xintouyun.bbs.dao.impl.BoardDaoImpl;
import com.xintouyun.bbs.entity.Board;
import com.xintouyun.bbs.service.Boardservice;

public class BoardServiceImpl implements Boardservice {
	BoardDaoImpl bdi=new BoardDaoImpl();
	@Override
	public List<Board> showAllBoard() {
		List<Board> list=bdi.listBoard();
		return list;
	}
	@Override
	public boolean addBoard(Board board) {
		return bdi.saveBoard(board)>0;
	}

}

 

package com.xintouyun.bbs.service.impl;

import com.xintouyun.bbs.dao.impl.ReplyDaoImpl;
import com.xintouyun.bbs.dao.impl.TopicDaoImpl;
import com.xintouyun.bbs.dao.impl.UserDaoImpl;
import com.xintouyun.bbs.entity.Reply;
import com.xintouyun.bbs.entity.Topic;
import com.xintouyun.bbs.entity.User;
import com.xintouyun.bbs.service.BaseService;

public class BaseServiceImpl implements BaseService {
	 
	 TopicDaoImpl tdi=new TopicDaoImpl();
	 UserDaoImpl udi=new UserDaoImpl();
	 ReplyDaoImpl rdi=new ReplyDaoImpl();
	@Override
	public User checkLogin(String uname, String upass) {
		User user=udi.queryByUnameAndUpass(uname, upass);
		return user;
	}

	@Override
	public boolean register(User user) {
		return udi.saveUser(user) > 0;
	}

	@Override
	public boolean post(Topic topic) {
		return tdi.saveTopic(topic) > 0;
	}

	@Override
	public boolean rePost(Reply reply,int tid) {
		boolean i=false;
		if(!tdi.findTopicByTid(tid)) {
		i=false;
		}else {
			rdi.saveReply(reply);
			i=true;
		}
		return i;
	}

}

业务方法写好之后我们就可以通过客户端来调用这些方法。

3.客户端:有层次的调用业务层相应的方法,制作成一个客户端系统

因为层次较多所以我们可以把这些菜单写到一个类中:

package com.xintouyun.bbs.util;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;

import com.xintouyun.bbs.entity.Board;
import com.xintouyun.bbs.entity.Reply;
import com.xintouyun.bbs.entity.Topic;
import com.xintouyun.bbs.entity.User;
import com.xintouyun.bbs.service.BaseService;
import com.xintouyun.bbs.service.Boardservice;
import com.xintouyun.bbs.service.CountService;
import com.xintouyun.bbs.service.TopicService;
import com.xintouyun.bbs.service.UserService;
import com.xintouyun.bbs.service.impl.BaseServiceImpl;
import com.xintouyun.bbs.service.impl.BoardServiceImpl;
import com.xintouyun.bbs.service.impl.CountServiceImpl;
import com.xintouyun.bbs.service.impl.TopicServiceImpl;
import com.xintouyun.bbs.service.impl.UserServiceImpl;

public class MenuFactoryNew {
	static Scanner sc = new Scanner(System.in);
	static int cursor = 0;
	static User user = null;
	// 程序主菜单
	public static void showBBSMenu() {
		System.out.println("------------欢迎来到校园论坛-------------");
		System.out.println("1.管理员登录2.普通用户登录3.注册");
		while (true) {
			try {
				cursor = sc.nextInt();
				break;
			} catch (Exception e) {
				System.out.println("请输入正确选择:1:管理员登录2:普通房用户登录3:注册");
				sc = new Scanner(System.in);
			}
		}
		switch (cursor) {
		case 1:
			user = showcheckLogMenu();
			if (user.getFlag() == 0) { // 验证管理员登陆
				showAdminMenu();// 验证通过进入管理员菜单
			} else {
				System.out.println("登录失败请重新输入");
				showBBSMenu();// 验证失败返回主菜单
			}
			break;
		case 2:
			user = showcheckLogMenu();
			if (user.getFlag() == 1) {// 验证普通用户登陆
				showUserMenu();// 验证通过进入普通用户菜单
			} else {
				System.out.println("登录失败请重新输入");
				showBBSMenu();// 验证失败返回主菜单
			}
			break;
		case 3:
			boolean i = RegMenu();
			if (i) {
				System.out.println("注册成功");
				showBBSMenu();// 注册结束返回主菜单
			} else {
				System.out.println("注册失败");// 注册失败返回主菜单
				showBBSMenu();
			}
			break;
		default:
			System.out.println("输入错误,请重新输入");
			showBBSMenu();
			break;
		}
	}

	// 管理员主菜单
	public static void showAdminMenu() {
		System.out.println("1.用户管理2.版块管理3.主贴管理4.统计汇总5.退出登录");
		while (true) {
			try {
				cursor = sc.nextInt();
				break;
			} catch (Exception e) {
				System.out.println("请重新输入正确选项:1.用户管理2.版块管理3.主贴管理4.统计汇总5.退出登录");
				sc = new Scanner(System.in);
			}
		}
		switch (cursor) {
		case 1:
			showuserManager();// 用户管理
			break;
		case 2:
			showBoardManager();// 版块管理
			break;
		case 3:
			showTopicManager();// 主题管理
			break;
		case 4:
			showCountManager();// 统计汇总
			break;
		case 5:
			showBBSMenu();// 退出登录
			break;
		default:
			System.out.println("输入无效,提示输入值为1-5之间的整数,请重新输入");
			showAdminMenu();
			break;
		}
	}

	// 普通用户主菜单
	public static void showUserMenu() {
		TopicService tsi = new TopicServiceImpl();
		System.out.println("1.发帖2.回帖3.查看主贴4.查看回帖5.退出登录");
		while (true) {
			try {
				cursor = sc.nextInt();
				break;
			} catch (Exception e) {
				System.out.println("请重新输入正确选项:1.发帖2.回帖3.查看主贴4.查看回帖5.退出登录");
				sc = new Scanner(System.in);
			}
		}
		switch (cursor) {
		case 1:
			boolean i = UserUtil.Post();
			if (i) {
				System.out.println("发帖成功");
				showUserMenu();
			} else {
				System.out.println("发帖失败");
				showUserMenu();
			}
			break;
		case 2:			
			boolean j= UserUtil.RePost();	//用户回帖			
			if (j) {
				System.out.println("回帖成功");
				showUserMenu();
			} else {
				System.out.println("回帖失败");
				showUserMenu();
			}
			break;
		case 3:
			List <Topic> lists= tsi.showAllTopic();
			System.out.println("所在版块号\t"+"主贴号\t"+"主贴标题\t"+"主贴内容\t"+"创建时间\t"+"发帖人id");
			for (Topic topic:lists) {
				System.out.println(topic.getBid()+"\t"+topic.getTid()+"\t"+topic.getTitle()+"\t"+topic.getContext()+"\t"+topic.getPtime()+"\t"+topic.getUid());
			}
			showUserMenu();
		case 4:
			System.out.println("请输入要查看的主贴号");
			int tid = sc.nextInt();
			List <Reply> lists1=tsi.queryReplyByTid(tid);
			System.out.println("回帖编号\t"+" 回帖标题\t"+" 回帖内容\t"+" 回帖时间 \t"+"回帖人编号\t"+" 主贴编号");
			for(Reply reply:lists1) {
				System.out.println(reply.getRid()+"\t"+reply.getTitle()+"\t"+reply.getContext()+"\t"+reply.getPtime()+"\t"+reply.getUid()+"\t"+reply.getTid());
			}
			showUserMenu();
		case 5:
			showBBSMenu();// 退出登录
			break;
		default:
			System.out.println("输入无效,提示1-5,请重新输入");
			showUserMenu();
			break;
		}
	}

	// 用户登录
	public static User showcheckLogMenu() {
		BaseService bsi = new BaseServiceImpl();
		User user = null;
		System.out.println("请输入账号名字");
		String uname = sc.next();
		System.out.println("请输入密码");
		String upass = sc.next();
		while (true) {
			try {
				user = bsi.checkLogin(uname, upass);
				if (user == null) {
					System.out.println("您输入的账号不存在");
					showBBSMenu();
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
			return user;
		}
	}

	// 用户注册
	public static boolean RegMenu() {
		BaseService bsi = new BaseServiceImpl();
		System.out.println("请输入账号名字");
		String uname = sc.next();
		System.out.println("请输入密码");
		String upass = sc.next();
		User user = new User();
		user.setUname(uname);
		user.setUpass(upass);
		boolean result = bsi.register(user);
		return result;
	}

	// 用户管理菜单
	public static void showuserManager() {
		UserService usi = new UserServiceImpl();
		System.out.println("1.查询禁用用戶2.查询正常用戶3.禁用用戶4.返回管理员菜单");
		while (true) {
			try {
				cursor = sc.nextInt();
				break;
			} catch (Exception e) {
				System.out.println("请重新输入正确选项:1.查询禁用用戶2.查询正常用戶3.禁用用戶4.返回管理员菜单");
				sc = new Scanner(System.in);
			}
		}
		switch (cursor) {
		case 1:
			List <User> list=usi.showDisabledUsers(1);
			Iterator<User> it=list.iterator();
			System.out.println("用户号\t"+"用户名字\t"+"用户状态");
			while(it.hasNext()) {
				User user=it.next();
				//String state=UserUtil.userStateChange(user.getState());
				System.out.println(user.getUid()+"\t"+user.getUname()+"\t"+user.getUserState().getName());
			}
			showuserManager();
			break;
		case 2:
			List <User> list1=new ArrayList<User>();
			list1.addAll(usi.showEnabledUsers(0));
			list =usi.showEnabledUsers(0);
			Iterator<User> it1=list.iterator();
			System.out.println("用户号\t"+"用户名字\t"+"用户状态");
			while(it1.hasNext()) {
				User user=it1.next();
				//String state=UserUtil.userStateChange(user.getState());
				System.out.println(user.getUid()+"\t"+user.getUname()+"\t"+user.getUserState().getName());
			}
			showuserManager();
			break;
		case 3:
			System.out.println("请输入要禁用的用户id");
			int uid = sc.nextInt();
			boolean j = usi.disableUser(uid);
			if (j) {
				System.out.println("禁用成功");
				showuserManager();
			} else {
				System.out.println("禁用失败");
				showuserManager();
			}
			break;
		case 4:
			showAdminMenu();
			break;
		default:
			System.out.println("输入无效,提示1/2/3/4");
			showuserManager();
			break;
		}
	}

	// 版块管理菜单
	public static void showBoardManager() {
	Boardservice bosi = new BoardServiceImpl();
		System.out.println("1.查詢所有版块2.添加版块3.返回管理员菜单");
		while (true) {
			try {
				cursor = sc.nextInt();
				break;
			} catch (Exception e) {
				System.out.println("请重新输入正确选项:1.查詢所有版块2.添加版块3.返回管理员菜单");
				sc = new Scanner(System.in);
			}
		}
		switch (cursor) {
		case 1:
			List <Board> lists= bosi.showAllBoard();
				System.out.println("版块号\t"+"板块名");
			for (Board board:lists) {
				System.out.println(board.getBid()+"\t"+board.getBname());
			}
			showBoardManager();
		case 2:
			Board board = new Board();
			System.out.println("请输入要添加的版块名字");
			board.setBname(sc.next());
			boolean i=bosi.addBoard(board);
			if (i) {
				System.out.println("添加成功");
				showBoardManager();
			} else {
				System.out.println("添加失败");
				showBoardManager();
			}
		case 3:
			showAdminMenu();
			break;
		default:
			System.out.println("输入无效,提示1/2");
			showBoardManager();
			break;
		}
	}

	// 主贴管理菜单
	public static void showTopicManager() {
		TopicService tsi = new TopicServiceImpl();
		System.out.println("1.显示所有主贴2.显示指定版块主贴3.刪除主贴4.返回管理员菜单");
		while (true) {
			try {
				cursor = sc.nextInt();
				break;
			} catch (Exception e) {
				System.out.println("请重新输入正确选项:1.显示所有主贴2.显示指定版块主贴3.刪除主贴4.返回管理员菜单");
				sc = new Scanner(System.in);
			}
		}
		switch (cursor) {
		case 1:
			List <Topic> lists= tsi.showAllTopic();
			System.out.println("所在版块号\t"+"所在版块\t"+"主贴号\t"+"主贴标题\t"+"主贴内容\t"+"创建时间\t"+"发帖人id\t"+"发帖人名字");
			for (Topic topic:lists) {
				System.out.println(topic.getBid()+"\t"+topic.getBname()+"\t"+topic.getTid()+"\t"+topic.getTitle()+"\t"+topic.getContext()+"\t"+topic.getPtime()+"\t"+topic.getUid()+"\t"+topic.getUname());
			}
			showTopicManager();
		case 2:
			System.out.println("请输入要显示版块的id");
			int bid = sc.nextInt();
			List <Topic> lists1= tsi.showAllTopic(bid);
			System.out.println("所在版块号\t"+"所在版块\t"+"主贴号\t"+"主贴标题\t"+"主贴内容\t"+"创建时间\t"+"发帖人id\t"+"发帖人名字");
			for (Topic topic:lists1) {
				System.out.println(topic.getBid()+"\t"+topic.getBname()+"\t"+topic.getTid()+"\t"+topic.getTitle()+"\t"+topic.getContext()+"\t"+topic.getPtime()+"\t"+topic.getUid()+"\t"+topic.getUname());
			}
			showTopicManager();
		case 3:
			System.out.println("请输入要删除主贴的id");
			int tid = sc.nextInt();
			boolean i=tsi.deleteTopic(tid);
			if (i) {
				System.out.println("删除成功");
				showTopicManager();
			} else {
				System.out.println("删除失败");
				showTopicManager();
			}
		case 4:
			showAdminMenu();
			break;
		default:
			System.out.println("输入无效,提示1/2/3");
			showTopicManager();
			break;
		}
	}

	// 统计汇总菜单
	public static void showCountManager() {
		CountService csi = new CountServiceImpl();
		TopicService tsi = new TopicServiceImpl();
		System.out.println("1.查询某个版块所有主贴数2.查询最近活跃用戶id 3.返回管理员菜单");
		while (true) {
			try {
				cursor = sc.nextInt();
				break;
			} catch (Exception e) {
				System.out.println("请重新输入正确选项:1.查询某个版块所有主贴数2.查询最近活跃用戶id 3.返回管理员菜单");
				sc = new Scanner(System.in);
			}
		}
		switch (cursor) {
		case 1:
			System.out.println("请输入你要查询的版块号");
			int bid = sc.nextInt();
			int count=csi.countAllTopicNum(bid);
			System.out.println("板块中主贴数为:" + count);
			showCountManager();
			break;
		case 2:
			System.out.println("最近活跃用户为:");
			List <String > list=tsi.countActiveUser();
			System.out.println("发帖人id");
			for(String uid:list) {
				System.out.println(uid);
			}
			showCountManager();
			break;
		case 3:
			showAdminMenu();
			break;
		default:
			System.out.println("输入无效,提示1/2");
			showCountManager();
			break;
		}
	}
}

我当时写的时候把发帖回帖单独写出来了

package com.xintouyun.bbs.util;
import com.xintouyun.bbs.entity.Reply;
import com.xintouyun.bbs.entity.Topic;
import com.xintouyun.bbs.service.impl.BaseServiceImpl;

public class UserUtil extends MenuFactoryNew{
	static BaseServiceImpl bsi=new BaseServiceImpl();	
	//发帖
		public static boolean Post() {
			System.out.println("请输入主贴标题");
			String title=sc.next();
			System.out.println("请输入內容");
			String context=sc.next();
			int uid=user.getUid();
			System.out.println("请输入主贴所在的版块号");
			int bid=sc.nextInt();
			Topic topic=new Topic();
			topic.setTitle(title);
			topic.setContext(context);
			topic.setUid(uid);
			topic.setBid(bid);
			boolean result=bsi.post(topic);
			return result;
			
		}
		//回帖
		public static boolean RePost() {
			System.out.println("请输入标题");
			String title=sc.next();
			System.out.println("请输入內容");
			String context=sc.next();
			int uid=user.getUid();
			System.out.println("請輸入所在主貼號");
			int tid=sc.nextInt();
			Reply reply=new Reply();
			reply.setTitle(title);
			reply.setContext(context);
			reply.setUid(uid);
			reply.setTid(tid);
			boolean result=bsi.rePost(reply,tid);
			return result;
			
		}
}

最后写一个测试类:

package com.xintouyun.bbs.test;

import com.xintouyun.bbs.util.MenuFactoryNew;

public class ClientNew1 {
	static MenuFactoryNew mfn=new MenuFactoryNew();
	public static void main(String[] args) {
		MenuFactoryNew.showBBSMenu();
	}
}

好了,系统做好了,我们来看一下运行效果:

管理员登录

 用户管理:查询被禁用用户,查询正常用户,禁用用户

 

 

 版块管理:查询所有版块,添加版块

 

 主贴管理:显示所有主贴,显示指定版块主贴,删除主贴

 返回主菜单,切换到用户登录

 

校园bbs管理系统的分析与设计 主要包含了以下内容 1.系统简要需求分析 2.校园BBS论坛管理系统的需求分析 3.系统的UML基本模型 包含了系统用例图,时序图,活动图,协作图 4.系统中的 包含了系统中应有的,及之间的关系 ------------------------------------------------------ 校园BBS论坛管理系统 1.系统简要需求分析: 该系统的使用人员主要包括收学生、教师、网站管理员。功能主要包括会员注册,登陆,管理,文章发布,查询,浏览。帖子的回复,帖子的管理,论坛分管理,帖子分管理等。 2.校园BBS论坛管理系统的需求分析 “校园BBS论坛管理系统”的功能需求主要包含以下几个方面:   游客对帖子的查询、浏览   会员对帖子的查询、浏览、发表、回复   版主对帖子的查询、浏览、发表、回复,以及对所在模块的帖子的管理   管理员对用户的管理,含增、删、改、查,及对会员权限的管理   管理员对所有模块的帖子的管理,含浏览、删除、发表、回复、将帖子置顶和设为精华帖   管理员对论坛分的管理,含增、删、改、查论坛分 管理员对帖子分的管理,含增、删、改、查帖子分 可以分为一下几个模块: 会员基本操作模块 会员管理模块 论坛分管理模块 帖子分管理模块 帖子管理模块 ………………
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值