基于javaweb+mysql的ssm在线bbs论坛系统(java+ssm+jsp+bootstrap+jquery+mysql)
运行环境
Java≥8、MySQL≥5.7、Tomcat≥8
开发工具
eclipse/idea/myeclipse/sts等均可配置运行
适用
课程设计,大作业,毕业设计,项目练习,学习演示等
功能说明
基于javaweb+mysql的SSM在线bbs论坛系统(java+ssm+jsp+bootstrap+jquery+mysql)
项目介绍
本系统分为前后台,前台主要功能为: 用户注册登陆、浏览帖子、发布帖子、个人信息管理、消息通知管理,积分管理,
后台管理功能有: 友情链接管理、板块管理、主题管理、用户管理、网站设置等等。本系统实现的功能非常丰富,可自由切换电脑版和手机版,访问时自动识别设备,也可按照ip来设置访问权限,已经达到了正式上线的系统水平,非常值得学习参考。本项目包含完整的源码、数据库文件。
管理员账号/密码:admin/123456 用户账号/密码: userloop/123456
环境需要
1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可 4.硬件环境:windows 7/8/10 1G内存以上;或者 Mac OS; 5.是否Maven项目: 否;查看源码目录中是否包含pom.xml;若包含,则为maven项目,否则为非maven项目 6.数据库:MySql 5.7版本;
技术栈
- 后端:Spring SpringMVC MyBatis 2. 前端:JSP+bootstrap+jQuery
使用说明
- 使用Navicat或者其它工具,在mysql中创建对应名称的数据库,并导入项目的sql文件; 2. 使用IDEA/Eclipse/MyEclipse导入项目,Eclipse/MyEclipse导入时,若为maven项目请选择maven; 若为maven项目,导入成功后请执行maven clean;maven install命令,下载所需要的jar包; 3. 将项目中beans.xml配置文件中的数据库配置改为自己的配置,主要用户名、密码; 4. 配置tomcat,然后运行运行项目,输入http://localhost:8080/ 登录
/*
* 后台板块查询
*
*/
@Controller
@RequestMapping("/admin/bankuai")
public class AdminBankuaiController {
@Autowired
BankuaiService bankuaiService;
@Autowired
JifenGroupService jifenGroupService;
private static Logger log = Logger.getLogger(AdminBankuaiController.class);
//后台页面查询
@RequestMapping("index.do")
public String findAllWhere(HttpServletRequest request, Model model,Bankuai bankuai,PageBean<Bankuai> page) {
Bankuai bankuaitmp=new Bankuai();
bankuaitmp.setParentId(0);
List<Bankuai> list = bankuaiService.select(bankuaitmp);
page = bankuaiService.findpage(bankuai,page);
model.addAttribute("list", list);
model.addAttribute("bankuai", bankuai);
model.addAttribute("page", page);
return "jsp/admin/bankuai/index";
}
//跳转到修改页面
@RequestMapping("toupdateoradd.do")
public String toupdateoradd(Bankuai bankuai, Model model) {
if(bankuai.getId()!=null){
User user = new User();
user.setId(userId);
user = userService.findbyid(user);
user.setVipLevel(vipLevel);
userService.update(user);
return "redirect:index.do";
}
}
/*
* 后台板块查询
*
*/
@Controller
@RequestMapping("/admin/stopip")
public class AdminStopIpController {
@Autowired
StopIpService stopIpService;
@Autowired
UserService userService;
private static Logger log = Logger.getLogger(AdminStopIpController.class);
//后台页面查询
@RequestMapping("index.do")
public String findAllWhere(HttpServletRequest request, Model model,StopIp stopIp,PageBean<StopIp> page) {
page = stopIpService.findpage(stopIp,page);
return flag;
}
public String login(User user,HttpServletRequest request) {
String flag="99";
List<User> list = UserDao.find(user);
if(list.size()>0){
String pwd = user.getPwd();
pwd=Tool.MD5(pwd);
if(list.get(0).getPwd().equals(pwd)){
flag=list.get(0).getFlag();
if("1".equals(flag)){
User usersession=list.get(0);
usersession.setLastlogintime(Tool.getyyyyMMddHHmmss());
usersession.setLoginip(Tool.getIp(request));
usersession.setCookieid(Tool.getUUID());
UserDao.update(usersession);
request.getSession().setAttribute(PublicStatic.USER, usersession);
}
}else{
flag="88";
}
}
return flag;
}
public User findbyuserid(int id) {
User user=new User();
user.setId(id);
List<User> list= UserDao.find(user);
if(list.size()>0){
user=list.get(0);
}
return user;
}
public boolean isfind(String findgroup, User user) {
if(findgroup.equals("")){
return true;
}else{
Map<String, Object> userjifengroup=UserDao.userjifengroup(user);
if(userjifengroup==null){
return false;
}else{
if(findgroup.contains(user.getVipLevel()+",")){
return true;
}else{
return false;
if(Tool.isstopip(request, response, 1)){
return;
}
autologin(request,response);
//判断是否需要登陆
boolean islogin = islogin(request, response, chain);
if(islogin){
return;
}
String urlString=request.getRequestURI();
int lastIndexOf = urlString.lastIndexOf(".")+1;
//静态化转换
if(PublicStatic.HTML.equals(urlString.substring(lastIndexOf, urlString.length()))){
htmlfilter(request, response, chain, urlString);
}else{
String path=request.getServletPath();
Integer id=isbankuai(path);
//板块映射成二级目录
if(id!=null){
String url="/bk/index.do?bankuaiid="+id+"&pagestart=1&zhutiid=0&orderby=0";
request.getRequestDispatcher(url).forward(request, response);
return;
}else if(path.startsWith("/file/")){
filefilter(request, response, chain, path);
}else{
chain.doFilter(request, response);
}
}
}
//拦截所有,是否登陆
private void autologin(HttpServletRequest request,
HttpServletResponse response) {
String login_flag=(String)request.getSession().getAttribute(PublicStatic.LOGIN_FLAG);
if("1".equals(login_flag) || login_flag == null){
return;
}
request.getSession().setAttribute(PublicStatic.LOGIN_FLAG, "1");
Cookie[] cookies = request.getCookies();
for(Cookie cookie : cookies){
String name=cookie.getName();
if("javaeelogin".equals(name)){
String value=cookie.getValue();
User user=new User();
user.setCookieid(value);
UserService userService=(UserService) ToolSpring.getBean("userService");
/*
* 伪静态使用
*
*/
public class CommonFilter implements Filter {
private static Logger log = Logger.getLogger(AdminBankuaiController.class);
public void destroy() {
}
/*
* 拦截所有访问
*
*/
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request=(HttpServletRequest) arg0;
HttpServletResponse response=(HttpServletResponse) arg1;
//判断是否允许ip访问
if(Tool.isstopip(request, response, 1)){
return;
}
autologin(request,response);
//判断是否需要登陆
ipt = ipt << 8 | Integer.parseInt(sipt[i]);
}
if (ips > ipe) {
long t = ips;
ips = ipe;
ipe = t;
}
return ips <= ipt && ipt <= ipe;
}
public static void main(String[] args) {
long currentTimeMillis = System.currentTimeMillis();
for (int i = 0; i <10000; i++) {
boolean ipisstop = ipisstop("10.10.1.1", "192.169.5.10", "192.169.1.0");
// System.out.println(ipisstop);
}
System.out.println(System.currentTimeMillis()-currentTimeMillis);
}
public static boolean ipisstop(String startip,String endip,String targetip){
String[] startsplit = startip.split("\\.");
String[] endsplit = endip.split("\\.");
String[] targetsplit = targetip.split("\\.");
boolean flag=false;
if(startsplit.length==4&&endsplit.length==4&&targetsplit.length==4){
for (int i = Integer.parseInt(startsplit[0]); i <= Integer.parseInt(endsplit[0]); i++) {
if(i==Integer.parseInt(targetsplit[0])){
flag=true;
break;
}
}
if(!flag){
// System.out.println("1");
return false;
}
flag=false;
for (int i = Integer.parseInt(startsplit[1]); i <= Integer.parseInt(endsplit[1]); i++) {
if(i==Integer.parseInt(targetsplit[1])){
flag=true;
break;
}
}
if(!flag){
// System.out.println("2");
return false;
}
flag=false;
for (int i = Integer.parseInt(startsplit[2]); i <= Integer.parseInt(endsplit[2]); i++) {
if(i==Integer.parseInt(targetsplit[2])){
flag=true;
break;
}
}
MessageService messageService;
@Autowired
PicService picService;
//跳转发帖页面
@RequestMapping("toft.do")
public String toft(HttpServletRequest request,HttpServletResponse response, Model model,String id,PageBean<Tiezi> page) {
if(Tool.isstopip(request, response, 4)){
return null;
}
//查询板块信息
Bankuai bankuai= bankuaiService.findbyid(id);
User user=(User)request.getSession().getAttribute(PublicStatic.USER);
boolean flag=userService.isfatie(bankuai.getFatiegroup(),user);
if(!flag){
return "redirect:/topage/quanxian.do";
}
//根据板块查询主题
Zhuti zhuti=new Zhuti();
zhuti.setBankuaiId(Integer.parseInt(id));
List<Zhuti> zhutilist = zhutiService.find(zhuti);
Tiezi tiezi=new Tiezi();
tiezi.setBankuaiId(Integer.parseInt(id));
page = tieziService.findpagebybankuanid(tiezi, page);
//今日的帖子总数
int nowcount=tieziService.findnowcount(id);
model.addAttribute("zhutilist", zhutilist);
model.addAttribute("bankuaiId", id);
model.addAttribute("bankuai", bankuai);
model.addAttribute("page", page);
model.addAttribute("nowcount", nowcount);
if(Tool.ismobile(request)){
return "jsp/mobile/user/fatie";
}else{
return "jsp/index/user/fatie";
}
}
//保存发帖数据
@RequestMapping("add.do")
public String add(HttpServletRequest request,HttpServletResponse response, Model model,Tiezi tiezi) {
if(Tool.isstopip(request, response, 4)){
return null;
}
User sessionuser=(User)request.getSession().getAttribute(PublicStatic.USER);
Bankuai bankuai=new Bankuai();
bankuai.setId(tiezi.getBankuaiId());
bankuai= bankuaiService.findbyid(bankuai);
boolean flag=userService.isfatie(bankuai.getFatiegroup(),sessionuser);
if(Tool.ismobile(request)){
return "jsp/mobile/user/user";
}else{
return "jsp/index/user/user-ziliao";
}
}
//查看个人资料
@RequestMapping("ziliao.do")
public String ziliao(HttpServletRequest request) {
if(Tool.ismobile(request)){
return "jsp/mobile/user/user-ziliao";
}else{
return "jsp/index/user/user-ziliao";
}
}
//修改用户
@RequestMapping("update.do")
public String update(HttpServletRequest request, Model model,User user) {
User sessionuser=(User)request.getSession().getAttribute(PublicStatic.USER);
user.setId(sessionuser.getId());
userService.update(user);
user=userService.findbyuserid(sessionuser.getId());
request.getSession().setAttribute(PublicStatic.USER, user);
return "redirect:/user/index.do";
}
//退出
@RequestMapping("logout.do")
public String logout(HttpServletRequest request,HttpServletResponse response) {
HttpSession session = request.getSession();
session.invalidate();
Cookie[] cookies=request.getCookies();
for(Cookie cookie: cookies){
cookie.setMaxAge(0);
cookie.setPath("/");
response.addCookie(cookie);
}
return "redirect:/";
if(innerlinkhtml!=null&&innerlinkhtml.length()>0){
if(!innerlinkhtml.startsWith("http://")||!innerlinkhtml.startsWith("http://")){
innerlinkhtml="http://"+innerlinkhtml;
innerLink.setInnerlink(innerlinkhtml);
}
}
if(innerLink.getId()!=null){
innerLinkService.update(innerLink);
}else{
innerLinkService.insert(innerLink);
}
return "redirect:index.do ";
}
//删除
@ResponseBody
@RequestMapping("del.do")
public String del(int id) {
String result=innerLinkService.delete(id);
return result;
}
//删除
@ResponseBody
@RequestMapping("updateuse.do")
public String updateuse(int id,String use) {
InnerLink innerLink=new InnerLink();
innerLink.setId(id);
innerLink.setIsuse(use);
innerLink.setCreatetime(Tool.getyyyyMMddHHmmss());
innerLinkService.update(innerLink);
new IndexThread().start();
return "1";
}
}
List<Ztree> list=new ArrayList<Ztree>();
//循环主题
for (int i = 0; i < zhutiList.size(); i++) {
Zhuti zhuti = zhutiList.get(i);
Ztree ztree=new Ztree();
//因为主题id和板块id重复 所以加10000处理,对应在228行,本类中
ztree.setId(zhuti.getId()+10000);
ztree.setpId(zhuti.getBankuaiId());
ztree.setName(zhuti.getName());
ztree.setOpen(false);
ztree.setNocheck(false);
if(zhuti.getId()==zhutiid){
ztree.setChecked(true);
}else{
ztree.setChecked(false);
}
list.add(ztree);
}
//循环子板块
for (int i = 0; i < bankuaiList.size(); i++) {
Bankuai bankuai = bankuaiList.get(i);
if(bankuai.getParentId()!=0){
Ztree ztree=new Ztree();
ztree.setId(bankuai.getId());
ztree.setpId(bankuai.getParentId());
ztree.setName(bankuai.getName());
if(bankuai.getId()==bankuaiid){
ztree.setOpen(true);
pbankuaiid=bankuai.getParentId();
}else{
ztree.setOpen(false);
}
ztree.setNocheck(true);
list.add(ztree);
}
}//循环父板块
for (int i = 0; i < bankuaiList.size(); i++) {
Bankuai bankuai = bankuaiList.get(i);
if(bankuai.getParentId()==0){
Ztree ztree=new Ztree();
ztree.setId(bankuai.getId());
ztree.setpId(bankuai.getParentId());
ztree.setName(bankuai.getName());
if(bankuai.getId()==pbankuaiid){
ztree.setOpen(true);
}else{
ztree.setOpen(false);
}
ztree.setNocheck(true);
list.add(ztree);
}
}
}else if("file".equals(flag)){
url="/download/downloadall.do?f="+parameter;
}else{
url="/download/downloadimg.do?f="+parameter;
}
request.getRequestDispatcher(url).forward(request, response);
return;
}
}
}
//判断是否登陆
public boolean islogin(HttpServletRequest request, HttpServletResponse response,FilterChain chain)throws IOException, ServletException{
String path=request.getServletPath();
// System.out.println(path);
if(request.getQueryString()!=null){
path+="?"+request.getQueryString();
}
List<String> list=new ArrayList<String>();
list.add("/tz");
list.add("/user");
list.add("/admin");
for (String string : list) {
if(path.startsWith(string)){
User user=(User) request.getSession().getAttribute(PublicStatic.USER);
if(user!=null){
if(string.equals("/admin")){
if(!user.getGroupid().equals(PublicStatic.GROUPADMIN)){
response.sendRedirect(request.getContextPath()+"/");
return true;
}
}
}else{
response.sendRedirect(request.getContextPath()+"/login/index.do?pathlocation="+request.getContextPath()+path);
return true;
}
}
}
return false;
}
//静态化页面,转化controller访问
public void htmlfilter(HttpServletRequest request, HttpServletResponse response,FilterChain chain,String urlString)throws IOException, ServletException{
String url="";
if(!"".equals(request.getContextPath())){
urlString=urlString.replaceAll(request.getContextPath(), "");
@Autowired
TieziDao tieziDao;
@Autowired
HuifuDao huifuDao;
@Autowired
PicDao picDao;
@Autowired
UserLiuyanDao userLiuyanDao;
public PageBean<User> findpage(User User,PageBean<User> page) {
page.setBean(User);
int count = UserDao.findpagecount(page);
page.setTotalRecords(count);
List<User> list = UserDao.findpage(page);
page.setList(list);
return page ;
}
public void insert(User User) {
UserDao.insert(User);
}
public String delete(Integer id) {
String result="1";
UserDao.delete(id);
return result;
}
public void update(User User) {
UserDao.update(User);
}
public User findbyid(User User) {
List<User> list= UserDao.find(User);
if(list.size()>0){
User=list.get(0);
}
return User;
}
public List<User> findbyparentId(User User) {
List<User> list= UserDao.find(User);
return list;
}
public List<User> find(User User) {
// TODO Auto-generated method stub
//保存发帖数据
@RequestMapping("add.do")
public String add(HttpServletRequest request,HttpServletResponse response, Model model,Tiezi tiezi) {
if(Tool.isstopip(request, response, 4)){
return null;
}
User sessionuser=(User)request.getSession().getAttribute(PublicStatic.USER);
Bankuai bankuai=new Bankuai();
bankuai.setId(tiezi.getBankuaiId());
bankuai= bankuaiService.findbyid(bankuai);
boolean flag=userService.isfatie(bankuai.getFatiegroup(),sessionuser);
if(!flag){
return "redirect:/topage/quanxian.do";
}
tiezi.setCreatetime(Tool.getyyyyMMddHHmmss());
tiezi.setCreateuserid(sessionuser.getId());
tiezi.setLastupdate("");
tiezi.setName(Tool.replacezhuanyi(tiezi.getName()));
tiezi.setContenthtml(Tool.replacezhuanyi(tiezi.getContenthtml()));
tieziService.insert(tiezi);
tiezi = tieziService.findbytieziwhere(tiezi);
//新增图片记录
if(tiezi.getContenthtml().contains("/file/image/")){
String[] split = tiezi.getContenthtml().split("<img");
for (int i = 0; i < split.length; i++) {
String html=split[i];
if(html.contains("/file/image/")){
int statrt =html.indexOf("/file/image/")+5;
String tmpcontent=html.substring(statrt);
int end=tmpcontent.indexOf("\"");
tmpcontent=tmpcontent.substring(0, end);
String picpath="/file"+tmpcontent;
tmpcontent=PublicStatic.FILE_PATH+tmpcontent;
System.out.println(tmpcontent);
BufferedImage bufferedImage;
try {
bufferedImage = javax.imageio.ImageIO.read(new File(tmpcontent));
int width = bufferedImage.getWidth();
int height = bufferedImage.getHeight();
System.out.println(width);
System.out.println(height);
Pic pic=new Pic();
pic.setBankuaiid(tiezi.getBankuaiId());
pic.setHeight(height);
pic.setWidth(width);
pic.setPath(picpath);
pic.setIsdel("0");
pic.setPictype("0");
pic.setCreateuserid(sessionuser.getId());
pic.setTieziid(tiezi.getId());
picService.insert(pic);
/**
* UEditor文件上传辅助类
*
*/
public class Uploader {
// 输出文件地址
private String url = "";
// 上传文件名
private String fileName = "";
// 状态
private String state = "";
// 文件类型
private String type = "";
// 原始文件名
private String originalName = "";
// 文件大小
private long size = 0;
private HttpServletRequest request = null;
private String title = "";
// 保存路径
private String savePath = "upload";
// 文件允许格式
private String[] allowFiles = { ".rar", ".doc", ".docx", ".zip", ".pdf",".txt", ".swf", ".wmv", ".gif", ".png", ".jpg", ".jpeg", ".bmp" };
// 文件大小限制,单位KB
private int maxSize = 10000;
private HashMap<String, String> errorInfo = new HashMap<String, String>();
public Uploader(HttpServletRequest request) {
this.request = request;
HashMap<String, String> tmp = this.errorInfo;
tmp.put("SUCCESS", "SUCCESS"); //默认成功
tmp.put("NOFILE", "未包含文件上传域");
tmp.put("TYPE", "不允许的文件格式");
tmp.put("SIZE", "文件大小超出限制");
tmp.put("ENTYPE", "请求类型ENTYPE错误");
tmp.put("REQUEST", "上传请求异常");
tmp.put("IO", "IO异常");
public Map<String, String> shezhijinghua(HttpServletRequest request,int id,String jinghua) {
Map<String, String> map=new HashMap<String, String>();
Tiezi tiezi=new Tiezi();
tiezi.setId(id);
tiezi.setJinghua(jinghua);
User user=(User) request.getSession().getAttribute(PublicStatic.USER);
tiezi.setLastupdate(""+user.getGroupname()+"\""+user.getLoginname()+"\"于"+Tool.getyyyyMMddHHmmss()+"将帖子设置精华"+jinghua+"</br>");
tieziService.update(tiezi);
tiezi = tieziService.findbyid(tiezi);
Jifen jifen=new Jifen();
jifen.setFenshu(PublicStatic.JIFEN_JINGHUA);
jifen.setUserid(tiezi.getCreateuserid());
jifen.setType("103");
jifen.setOperateuserid(user.getId());
jifen.setContent("您的帖子被设置为精华获得"+PublicStatic.JIFEN_JINGHUA+"积分");
jifenService.insert(jifen);
map.put("flag", "1");
return map;
}
//取消设置精华
@ResponseBody
@RequestMapping("qxshezhijinghua.do")
public Map<String, String> qxshezhijinghua(HttpServletRequest request,int id) {
Map<String, String> map=new HashMap<String, String>();
Tiezi tiezi=new Tiezi();
tiezi.setId(id);
tiezi.setJinghua("");
User user=(User) request.getSession().getAttribute(PublicStatic.USER);
tiezi.setLastupdate(""+user.getGroupname()+"\""+user.getLoginname()+"\"于"+Tool.getyyyyMMddHHmmss()+"将帖子取消精华"+"</br>");
tieziService.update(tiezi);
map.put("flag", "1");
return map;
}
//板块置顶
@ResponseBody
@RequestMapping("updatebankuaizhiding.do")
public Map<String, String> updateallzhiding(HttpServletRequest request,int id) {
Map<String, String> map=new HashMap<String, String>();
/*
* 版主的操作
*
*/
@Controller
@RequestMapping("/moderator/common")
public class ModeratorCommonController {
@Autowired
TieziService tieziService;
@Autowired
HuifuService huifuService;
@Autowired
JifenService jifenService;
@Autowired
BankuaiService bankuaiService;
@Autowired
ZhutiService zhutiService;
private static Logger log = Logger.getLogger(ModeratorCommonController.class);
//设置精华
@ResponseBody
@RequestMapping("shezhijinghua.do")
public Map<String, String> shezhijinghua(HttpServletRequest request,int id,String jinghua) {
Map<String, String> map=new HashMap<String, String>();
Tiezi tiezi=new Tiezi();
tiezi.setId(id);
tiezi.setJinghua(jinghua);
User user=(User) request.getSession().getAttribute(PublicStatic.USER);
}
return ip;
}
//获取uuid
public static String getUUID()
{
String uuid = UUID.randomUUID().toString().trim().replaceAll("-", "");
return uuid;
}
public static String MD5(String str){
return str;
// String newstr="";
// try {
// //确定计算方法
// MessageDigest md5= MessageDigest.getInstance("MD5");
// BASE64Encoder base64en = new BASE64Encoder();
// //加密后的字符串
// newstr=base64en.encode(md5.digest(str.getBytes("utf-8")));
// } catch (Exception e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// return newstr;
}
//判断是否管理员或者版主,如果是返回false,否则true
public static boolean isguanliyuan(User user){
if(user.getGroupid()==PublicStatic.GROUPBANZHU||user.getGroupid()==PublicStatic.GROUPADMIN){
return false;
}else{
return true;
}
}
public static String sendGet(String url, String param) {
String result = "";
BufferedReader in = null;
try {
String urlNameString=url;
if(param.length()>0){
urlNameString=urlNameString+"?" + param;
}
// System.out.println(urlNameString);
URL realUrl = new URL(urlNameString);
// 打开和URL之间的连接
URLConnection connection = realUrl.openConnection();