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

您所在的位置:网站首页 新浪论坛是BBS吗 经典三层模型制作学校论坛系统(BBS)

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

2024-07-02 09:58| 来源: 网络整理| 查看: 265

一、工具

STS,和MySQL数据库

二、系统分析:

需求概述

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

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

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

设计与思路分析 功能分析

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

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

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

不管是普通用户还是管理员都需要进行登录,所以在实现登录功能时,需要注意判断对方是管理员还是普通用户,这里要求使用存储过程实现。在实现删除主帖时需要注意的是:某个主帖可能有很多回帖,这时需要先删除这个主帖的所有回帖,然后才能删除主帖。同时考虑到数据的一致性,这个地方需要使用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 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 listTopic(); /** * 查看指定板块下所有主贴 * @param bid * @return 对象集合 */ List 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 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 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 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 listByState(int state) { // TODO Auto-generated method stub Connection conn = null; PreparedStatement st = null; ResultSet rs = null; List list=new ArrayList(); 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 listTopic() { // TODO Auto-generated method stub Connection conn = null; PreparedStatement st = null; ResultSet rs = null; List list=new ArrayList(); 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 listTopic(int bid) { // TODO Auto-generated method stub Connection conn = null; PreparedStatement st = null; ResultSet rs = null; List list=new ArrayList(); 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 list=new ArrayList(); 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 listActiveUsers() { Connection conn = null; PreparedStatement st = null; ResultSet rs = null; List list=new ArrayList(); 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 queryReplyByTid(int tid) { // TODO Auto-generated method stub Connection conn = null; PreparedStatement st = null; ResultSet rs = null; List list=new ArrayList(); 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 listBoard() { // TODO Auto-generated method stub Connection conn = null; PreparedStatement st = null; ResultSet rs = null; List list=new ArrayList(); 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 showDisabledUsers(int state); /** * 查询正常用户 * @return 用户列表 */ List 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 showAllTopic(); /** * 查看指定板块下主贴 * @param bid * @return 主贴集合 */ List showAllTopic(int bid); /** * 根据主贴号删除主贴 * @param tid * @return 成功返回true,否则返回false */ boolean deleteTopic(int tid); /** * 查询主贴的所有回帖 * @param tid * @return 主贴的所有回帖的集合 */ List queryReplyByTid(int tid); /** * 根据主贴删除所有回帖 * @param tid 主贴号 * @return 删除成功返回true,否则返回false */ boolean deleteReplyByTid(int tid); /** * 根据版块统计主贴数目 * @param bid * @return */ int countByBid(int bid); /** * 获取所有主贴的uid * @return */ List 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 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 showDisabledUsers(int state) { List list=udi.listByState(1); return list; } @Override public List showEnabledUsers(int state) { List 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 showAllTopic() { List list=tdi.listTopic(); return list; } @Override public List showAllTopic(int bid) { List 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 queryReplyByTid(int tid) { List list=rdi.queryReplyByTid(tid); return list; } @Override public int countByBid(int bid) { int count=tdi.countByBid(bid); return count; } @Override public List countActiveUser() { List 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 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 showAllBoard() { List 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 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 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 list=usi.showDisabledUsers(1); Iterator 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 list1=new ArrayList(); list1.addAll(usi.showEnabledUsers(0)); list =usi.showEnabledUsers(0); Iterator 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 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 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 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 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(); } }

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

管理员登录

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

 

 

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

 

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

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

 



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3