基于javaweb+mysql的ssm技术论坛bbs系统(java+ssm+jsp+bootstrap+mysql)
运行环境
Java≥8、MySQL≥5.7、Tomcat≥8
开发工具
eclipse/idea/myeclipse/sts等均可配置运行
适用
课程设计,大作业,毕业设计,项目练习,学习演示等
功能说明
基于javaweb+mysql的SSM技术论坛bbs系统(java+ssm+jsp+bootstrap+mysql)
项目介绍
本项目包含前后台,前台为普通用户登录,后台为管理员登录;
管理员角色包含以下功能: 管理员登录,删除或者编辑用户的帖子,后台管理,友情链接管理,用户管理,版块管理,网站设置,用户设置,版块主题管理等功能。
用户角色包含以下功能: 用户首页,用户登录注册,发表回复,查看帖子,发帖子,个人资料管理,查看我的帖子和回复等功能。
环境需要
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.数据库:MySql 5.7版本; 6.是否Maven项目: 否;
技术栈
- 后端:Spring+SpringMVC+Mybatis 2. 前端:JSP+bootstrap+jQuery
使用说明
- 使用Navicat或者其它工具,在mysql中创建对应名称的数据库,并导入项目的sql文件; 2. 使用IDEA/Eclipse/MyEclipse导入项目,Eclipse/MyEclipse导入时,若为maven项目请选择maven; 若为maven项目,导入成功后请执行maven clean;maven install命令,然后运行; 3. 将项目中beans.xml配置文件中的数据库配置改为自己的配置; 4. 运行项目,输入localhost:8080/ 登录
}
}
package com.yuanlrc.controller.publics;
/**
* 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>();
/**
* 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异常");
tmp.put("DIR", "目录创建失败");
tmp.put("UNKNOWN", "未知错误");
}
public void upload() throws Exception {
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{
public static String replacezhuanyi(String html){
html=html.replaceAll("<script>", "<script>");
html=html.replaceAll("</script>", "</script>");
return html;
}
//ipIsValid("192.167.1.1-192.168.5.10", "192.168.3.54") 返回true和false
public static boolean ipIsValid(String ipSection, String ip) {
if (ipSection == null)
throw new NullPointerException("IP段不能为空!");
if (ip == null)
throw new NullPointerException("IP不能为空!");
ipSection = ipSection.trim();
ip = ip.trim();
final String REGX_IP = "((25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)\\.){3}(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)";
final String REGX_IPB = REGX_IP + "\\-" + REGX_IP;
if (!ipSection.matches(REGX_IPB) || !ip.matches(REGX_IP))
return false;
int idx = ipSection.indexOf('-');
String[] sips = ipSection.substring(0, idx).split("\\.");
String[] sipe = ipSection.substring(idx + 1).split("\\.");
String[] sipt = ip.split("\\.");
long ips = 0L, ipe = 0L, ipt = 0L;
for (int i = 0; i < 4; ++i) {
ips = ips << 8 | Integer.parseInt(sips[i]);
ipe = ipe << 8 | Integer.parseInt(sipe[i]);
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;
public String tooptions(HttpServletRequest request, Model model,User user){
user = userService.findbyid(user);
model.addAttribute("user", user);
return "jsp/admin/user/option";
}
/**
* 设置用户vip等级
* @param request
* @param model
* @param user
* @return
*/
@RequestMapping(value="set_vip.do",method=RequestMethod.GET)
public String setVip(Model model,User user){
user = userService.findbyid(user);
model.addAttribute("user", user);
model.addAttribute("jifenGroupList", jifenGroupService.find(null));
return "jsp/admin/user/set_vip";
}
/**
* 设置用户vip等级表单提交
* @param userId
* @param jifen
* @return
*/
@RequestMapping(value="set_vip.do",method=RequestMethod.POST)
public String setVip(Integer userId, String vipLevel){
User user = new User();
user.setId(userId);
user = userService.findbyid(user);
user.setVipLevel(vipLevel);
userService.update(user);
return "redirect:index.do";
}
}
package com.yuanlrc.controller.admin;
}
}else if(urlsplit.length==2){
//板块 /bk/29_1_0_0.html
if("bk".equals(urlsplit[0])){
String[] split=urlsplit[1].split("\\.", -1);
if(split[1].equalsIgnoreCase(PublicStatic.HTML)){
split=split[0].split("_", -1);
url="/bk/index.do?bankuaiid="+split[0]+"&pagestart="+split[1]+"&zhutiid="+split[2]+"&orderby="+split[3]+"";
}
}else if("tiezi".equals(urlsplit[0])){
//内容 /tiezi/2_1.html
String[] split=urlsplit[1].split("\\.", -1);
if(split[1].equalsIgnoreCase(PublicStatic.HTML)){
split=split[0].split("_", -1);
url="/tiezi/index.do?id="+split[0]+"&pagestart="+split[1]+"&orderby="+split[2];
}
}else if("member".equals(urlsplit[0])){
//个人资料 /member/2_1.html
String[] split=urlsplit[1].split("\\.", -1);
if(split[1].equalsIgnoreCase(PublicStatic.HTML)){
split=split[0].split("_", -1);
if(split.length==2){
url="/member/index.do?id="+split[0]+"&flag="+split[1];
}else{
url="/member/index.do?id="+split[0]+"&flag="+split[1]+"&pagestart="+split[2];
}
}
}else if("file".equals(urlsplit[0])){
System.out.println(urlsplit[0]);
}else{
String path=request.getServletPath();
Integer id=isbankuai(path);
if(id!=null){
String[] split=urlsplit[1].split("\\.", -1);
if(split[1].equalsIgnoreCase(PublicStatic.HTML)){
split=split[0].split("_", -1);
url="/bk/index.do?bankuaiid="+id+"&pagestart="+split[0]+"&zhutiid="+split[1]+"&orderby="+split[2]+"";
}
}
}
}
}
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();
// 设置通用的请求属性
connection.setRequestProperty("accept", "*/*");
connection.setRequestProperty("connection", "Keep-Alive");
}
}
}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(), "");
}
urlString=urlString.substring(1, urlString.length());
String[] urlsplit = urlString.split("/", -1);
if(urlsplit.length==1){
//首页父栏目拦截 /29.html
String[] split=urlsplit[0].split("\\.", -1);
if(split[1].equalsIgnoreCase(PublicStatic.HTML)){
if(split[0].equals("baidu_verify_VHapi6TZSQ")){
url="/baidu_verify_VHapi6TZSQ.html";
}else{
url="/index.do?parentId="+split[0];
}
}
}else if(urlsplit.length==2){
//板块 /bk/29_1_0_0.html
if("bk".equals(urlsplit[0])){
String[] split=urlsplit[1].split("\\.", -1);
if(split[1].equalsIgnoreCase(PublicStatic.HTML)){
split=split[0].split("_", -1);
url="/bk/index.do?bankuaiid="+split[0]+"&pagestart="+split[1]+"&zhutiid="+split[2]+"&orderby="+split[3]+"";
}
}else if("tiezi".equals(urlsplit[0])){
//内容 /tiezi/2_1.html
String[] split=urlsplit[1].split("\\.", -1);
if(split[1].equalsIgnoreCase(PublicStatic.HTML)){
split=split[0].split("_", -1);
url="/tiezi/index.do?id="+split[0]+"&pagestart="+split[1]+"&orderby="+split[2];
}
}else if("member".equals(urlsplit[0])){
//个人资料 /member/2_1.html
/*
* 主题的查询
*
*/
@Controller
@RequestMapping("/zhuc")
public class ZhucController {
@Autowired
UserService userService;
@Autowired
GroupService groupService;
private static Logger log = Logger.getLogger(ZhucController.class);
//跳转注册页面
@RequestMapping("index.do")
public String toindex(HttpServletRequest request,HttpServletResponse response) {
if(Tool.isstopip(request, response, 2)){
return null;
}
if(Tool.ismobile(request)){
return "jsp/mobile/zhuc";
}else{
return "jsp/index/zhuc";
}
}
//新增
bankuai.setImg("bankuai.jpg");
}
if(bankuai.getId()!=null){
bankuaiService.update(bankuai);
}else{
bankuaiService.insert(bankuai);
}
new IndexThread().start();
return "redirect:index.do ";
}
//删除
@ResponseBody
@RequestMapping("del.do")
public String del(int id) {
String result=bankuaiService.delete(id);
return result;
}
//删除
@ResponseBody
@RequestMapping("getpinyin.do")
public String getpinyin(String name) {
String getpinyin = Pinyin4j.getpinyin(name);
Bankuai bankuai=new Bankuai();
bankuai.setYuming(getpinyin);
List<Bankuai> list = bankuaiService.select(bankuai);
if(list.size()>0){
getpinyin=getpinyin+Tool.getRandom();
}
return getpinyin;
}
}
package com.yuanlrc.controller.index;
List<Bankuai> list = bankuaiService.select(bankuai);
if(list.size()>0){
getpinyin=getpinyin+Tool.getRandom();
}
return getpinyin;
}
}
package com.yuanlrc.controller.index;
/*
user=new User();
user.setLoginname(loginname);
user = userService.findbyid(user);
groupService.updategroupbyuser(user.getId(), PublicStatic.GROUPVIP);
new IndexThread().start();
}
jsonmap.put("flag", flag);
jsonmap.put("msg", msg);
return jsonmap;
}
//验证用户名
@ResponseBody
@RequestMapping("isusername.do")
public String isusername(HttpServletRequest request,User user) {
String flag=userService.isusername(user.getLoginname());
return flag;
}
}
package com.yuanlrc.controller.publics;
/*
* 上传图片
*
*/
@Controller
@RequestMapping("/upload")
return false;
}
flag=false;
for (int i = Integer.parseInt(startsplit[3]); i <= Integer.parseInt(endsplit[3]); i++) {
if(i==Integer.parseInt(targetsplit[3])){
flag=true;
break;
}
}
if(!flag){
// System.out.println("4");
return false;
}
}else{
System.out.println("传入ip错误");
return false;
}
return true;
}
//1 访问 2 注册 3登陆 4发帖 5回复
public static boolean isstopip(HttpServletRequest request,
HttpServletResponse response, int i) {
List<StopIp> stopipList = PublicStatic.stopipList;
String ip = getIp(request);
String urlString=request.getRequestURI();
if(urlString.contains("/topage/ipquanxian.do")){
return false;
}
for (StopIp stopIp : stopipList) {
String type=stopIp.getType();
if(type.contains("-"+i+",")){
if(ipisstop(stopIp.getStartip(), stopIp.getEndip(), ip)){
try {
response.sendRedirect(request.getContextPath()+"/topage/ipquanxian.do");
return true;
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
return false;
}
//判断是否手机访问
public static boolean ismobile(HttpServletRequest request){
Boolean ismobile=(Boolean) request.getSession().getAttribute("ismobile");
if(ismobile!=null){
jifen.setFenshu(PublicStatic.JIFEN_FATIE);
jifen.setUserid(sessionuser.getId());
jifen.setType("101");
jifen.setContent("您发布了帖子获得"+PublicStatic.JIFEN_FATIE+"积分");
int findnowcount = jifenService.findnowcount(jifen);
//如果发帖次数小于等于这个时间,增加积分
if(findnowcount<=PublicStatic.JIFEN_FATIE_COUNT){
jifenService.insert(jifen);
}
//启动缓存线程
new IndexThread().start();
return "redirect:/"+tiezi.getYuming()+"/";
}
//跳转编辑发帖页面
@RequestMapping("toupdate.do")
public String toupdate(HttpServletRequest request,HttpServletResponse response, Model model,PageBean<Tiezi> page,String tieziid) {
if(Tool.isstopip(request, response, 4)){
return null;
}
Tiezi tiezi=new Tiezi();
tiezi.setId(Integer.parseInt(tieziid));
tiezi = tieziService.findbytieziwhere(tiezi);
String id=tiezi.getBankuaiId()+"";
Bankuai bankuai= bankuaiService.findbyid(id);
User user=(User)request.getSession().getAttribute(PublicStatic.USER);
boolean flag=userService.isfatie(bankuai.getFatiegroup(),user);
//判断是否有编辑权限
if(Tool.isguanliyuan(user)){
if(!flag){
return "redirect:/topage/quanxian.do";
}
}
Zhuti zhuti=new Zhuti();
zhuti.setBankuaiId(Integer.parseInt(id));
List<Zhuti> zhutilist = zhutiService.find(zhuti);
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);
model.addAttribute("tiezi", tiezi);
return "jsp/index/user/updatefatie";
}
/*
* 发帖页面
*
*/
@Controller
@RequestMapping("/tz")
public class TieziContriller {
@Autowired
TieziService tieziService;
@Autowired
ZhutiService zhutiService;
@Autowired
BankuaiService bankuaiService;
@Autowired
HuifuService huifuService;
@Autowired
JifenService jifenService;
@Autowired
UserService userService;
@Autowired
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){
* @param userId
* @param jifen
* @return
*/
@RequestMapping(value="set_vip.do",method=RequestMethod.POST)
public String setVip(Integer userId, String vipLevel){
User user = new User();
user.setId(userId);
user = userService.findbyid(user);
user.setVipLevel(vipLevel);
userService.update(user);
return "redirect:index.do";
}
}
package com.yuanlrc.controller.admin;
/*
* 后台板块查询
*
*/
@Controller
@RequestMapping("/admin/stopip")
public class AdminStopIpController {
@Autowired
StopIpService stopIpService;
new IndexThread().start();
return "1";
}
}
package com.yuanlrc.controller.index;
/*
* 主题的查询
*
*/
@Controller
@RequestMapping("/zhuc")
public class ZhucController {
@Autowired
UserService userService;
@Autowired
GroupService groupService;
private static Logger log = Logger.getLogger(ZhucController.class);
//跳转注册页面
@RequestMapping("index.do")
public String toindex(HttpServletRequest request,HttpServletResponse response) {
if(Tool.isstopip(request, response, 2)){
return null;
}
if(Tool.ismobile(request)){
return "jsp/mobile/zhuc";
}else{
return "jsp/index/zhuc";
}