一、工具

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{@Overridepublic User queryByUnameAndUpass(String uname, String upass) {// TODO Auto-generated method stubConnection 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;}@Overridepublic int saveUser(User user) {// TODO Auto-generated method stubConnection 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;}@Overridepublic List<User> listByState(int state) {// TODO Auto-generated method stubConnection 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;}@Overridepublic int DisableUser(int uid) {// TODO Auto-generated method stubConnection 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{@Overridepublic List<Topic> listTopic() {// TODO Auto-generated method stubConnection 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;}@Overridepublic List<Topic> listTopic(int bid) {// TODO Auto-generated method stubConnection 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;}@Overridepublic 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 blocke1.printStackTrace();}} finally {JdbcUtil.closeAll(rs, st, conn);}return affectedRow;}@Overridepublic 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;}@Overridepublic 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;}@Overridepublic 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 {@Overridepublic int saveReply(Reply reply) {// TODO Auto-generated method stubConnection 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;}@Overridepublic List<Reply> queryReplyByTid(int tid) {// TODO Auto-generated method stubConnection 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;}@Overridepublic int deleteByTid(int tid) {// TODO Auto-generated method stubConnection 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{@Overridepublic List<Board> listBoard() {// TODO Auto-generated method stubConnection 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;}@Overridepublic int saveBoard(Board board) {// TODO Auto-generated method stubConnection 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();@Overridepublic List<User> showDisabledUsers(int state) {List<User> list=udi.listByState(1);return list;}@Overridepublic List<User> showEnabledUsers(int state) {List<User> list=udi.listByState(0);return list;}@Overridepublic 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();@Overridepublic List<Topic> showAllTopic() {List<Topic> list=tdi.listTopic();return list;}@Overridepublic List<Topic> showAllTopic(int bid) {List<Topic> list=tdi.listTopic(bid);return list;}@Overridepublic boolean deleteTopic(int tid) {return tdi.deleteTopic(tid)>0;}@Overridepublic boolean deleteReplyByTid(int tid) {return rdi.deleteByTid(tid)>0;}@Overridepublic List<Reply> queryReplyByTid(int tid) {List<Reply> list=rdi.queryReplyByTid(tid);return list;}@Overridepublic int countByBid(int bid) {int count=tdi.countByBid(bid);return count;}@Overridepublic 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();@Overridepublic List<Board> showAllBoard() {List<Board> list=bdi.listBoard();return list;}@Overridepublic 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();@Overridepublic User checkLogin(String uname, String upass) {User user=udi.queryByUnameAndUpass(uname, upass);return user;}@Overridepublic boolean register(User user) {return udi.saveUser(user) > 0;}@Overridepublic boolean post(Topic topic) {return tdi.saveTopic(topic) > 0;}@Overridepublic 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. Java web编写在线论坛系统(bbs) 完整源码 附带详细的设计报告

    今天为大家分享一个java语言编写的在线论坛系统,目前系统功能已经很全面,后续会进一步完善.整个系统界面漂亮,有完整得源码,希望大家可以喜欢.喜欢的帮忙点赞和关注.一起编程.一起进步 开发环境 开发语 ...

  2. C++开发的论坛系统 - BBS

    2014.10.16更新至最新版本v1.2.1,演示地址:http://222.73.130.227:8020/bbs/index.jsp 可执行文件下载: Fetch_bbs_win32_utf8_ ...

  3. java项目——Model1与Model2以及经典三层模型比较

    个人觉得Model1和Model是java架构的最基本的.在这两种模式的基础上,我们可以继续解耦,找到适合我们个人开发的架构. Model1模型 Model1模型是以jsp为核心的开发模型,采用jsp ...

  4. java毕业设计——基于JSP+mysql的BBS论坛系统设计与实现(毕业论文+程序源码)——论坛系统

    基于JSP+mysql的BBS论坛系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于JSP+mysql的BBS论坛系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦.需要下载开 ...

  5. BBS论坛系统的需求

    小组成员:psy.zjt.xjw.kj BBS论坛系统的需求 1.不是所有人都可以发表帖子和回复帖子的,必须是以会员的身份登录到系统后,才能够发表.回复帖子.因此BBS论坛将用户划分为3类人:普通游客 ...

  6. AI:2023年6月9日北京智源大会演讲分享之基础模型前沿技术论坛—《工程化打造AI中的CPU》、《构建一个AI系统:在LLM上应用带有RLHF来推进定制》、《多模态预训练的进展回顾与展望》、《扩展大

    AI:2023年6月9日北京智源大会演讲分享之基础模型前沿技术论坛-<工程化打造AI中的CPU>.<构建一个AI系统:在LLM上应用带有RLHF来推进定制>.<多模态预训 ...

  7. 系统架构:经典三层架构

    引言 经典三层架构是分层架构中最原始最典型的分层模式,其他分层架构都是其变种或扩展,例如阿里的四层架构模式和DDD领域驱动模型.阿里的 四层架构模型在三层基础上增加了 Manager 层,从而形成变种 ...

  8. 原创+源码 基于Java Web技术开发的BBS论坛系统

    本文转自:程序员之家论坛  原文地址:http://www.phome.asia/forum/thread/20601.htm 我已把附件上传到csdn下载频道地址:http://download.c ...

  9. 基于ssm的BBS社区论坛系统

    基于ssm的BBS社区论坛系统 项目介绍 项目描述 前台部分 后台部分 项目展示 获取方式 项目介绍 该项目可以用作计算机毕业设计.Java项目学习使用. 运行环境 :idea+mysql5.7+jd ...

  10. DXBBS V8.0 BBS论坛系统 简体中文正式版 [ 开发语言:ASP.NET 2.0 (C#) ]

    DXBBS V8.0 BBS论坛系统 简体中文正式版 [ 开发语言:ASP.NET 2.0 (C#) ] 程序版本:DXBBS V8.0 ACCESS/MSSQL版 开发语言:ASP.NET 2.0 ...

最新文章

  1. 吴恩达老师深度学习视频课笔记:人脸识别
  2. python3安装setuptools步骤_setuptools、pip的安装
  3. MATLAB读取写入文本数据最佳方法 | Best Method for Loading Saving Text Data Using MATLAB
  4. centos 7 php7.4_索尼小音箱特价!【Aldi】7月7日起 特卖品 及本期特价食品
  5. 创建mat二值图 matlab,OpenCV学习之路(二)——Mat对象
  6. java常见_Java 常用类
  7. CF1548B Integers Have Friends
  8. python画有权重网络图_使用Python的networkx绘制精美网络图教程
  9. 改开源项目的一些心得
  10. 百倍性能的PL/SQL优化案例(r11笔记第13天)
  11. 《产品设计与开发(原书第5版)》——第1章 概论 1.1 成功的产品开发的特点...
  12. DIY协同办公平台(C/S)系列3之内部邮箱篇
  13. 决策树算法小结(一) ID3原理及代码实现
  14. 高等代数——大学高等代数课程创新教材(丘维声)——3.2笔记+习题
  15. 微信小程序测试二维码跳转链接
  16. 2016年世界各国gdp排名 人均gdp排名 人口排名
  17. Guava base -- Splitter
  18. CCF-20180901 卖菜
  19. Vscode Remote SSH 远程连接失败过程报错:试图写入的管道不存在
  20. 用python开发一个炸金花小游戏,注意别玩上瘾了

热门文章

  1. 挖金矿问题java课程设计_某15万吨金矿采矿方法课程设计
  2. Everything搜索_使用方法
  3. jdbc学习笔记3,blob类型数据的操作,preparedstatement的批量操作,数据库的事务,以及事务的特性,隔离权限的修改
  4. 需求分析说明书SRS
  5. Fedora 安装 WPS
  6. mse 反编译_专业Delphi反编译工具(DeDeDark)
  7. 超精华的unity2d同屏显示9千人,看完还怕学不会?
  8. 计算机应用离散数学,结合计算机应用的离散数学教学研究.pdf
  9. c#中嵌入echarts_如何利用 C# + Echarts 绘制 Bar Simple
  10. Vue + OpenLayers 配置多个地图数据源