项目编号:BS-XX-212
一,环境介绍
语言环境:Java: jdk1.8
数据库:Mysql: mysql5.7
应用服务器:Tomcat: tomcat8.5.31
开发工具:IDEA或eclipse
开发技术:Springboot+Vue
二,项目简介
本项目基于Springboot+Vue开发实现一套社区志愿者平台管理系统。用户有平台管理员和前端用户两类。平台管理员主要实现:管理员管理、用户管理、公告管理、轮播图管理、风采展示管理、活动信息管理、志愿者申请审核、参加活动管理、评论过滤管理等相关功能。前端用户主要有注册登陆、查看活动信息、查看公告 信息、查看活动历往的风采展示、信息评论、志愿者评价等操作功能。系统功能完整,界面友好大方,适合做毕业设计使用。
系统表结构如下:
【管理员】模块,表名:admins |
||
字段名 |
字段类型 |
名称 |
id |
int |
(主键) |
username |
varchar(50) |
帐号 |
pwd |
varchar(50) |
密码 |
【轮播图】模块,表名:lunbotu |
||
字段名 |
字段类型 |
名称 |
id |
int |
(主键) |
title |
varchar(50) |
标题 |
image |
varchar(255) |
图片 |
url |
varchar(255) |
连接地址 |
【用户】模块,表名:yonghu |
||
字段名 |
字段类型 |
名称 |
id |
int |
(主键) |
cx |
varchar(50) |
权限 |
yonghuming |
varchar(50) |
用户名 |
mima |
varchar(50) |
密码 |
xingming |
varchar(50) |
姓名 |
xingbie |
varchar(10) |
性别 |
shouji |
varchar(50) |
手机 |
youxiang |
varchar(50) |
邮箱 |
jifen |
int |
积分 |
shenfenzheng |
varchar(50) |
身份证 |
touxiang |
varchar(255) |
头像 |
【风采展示】模块,表名:fengcaizhanshi |
||
字段名 |
字段类型 |
名称 |
id |
int |
(主键) |
suoluetu |
varchar(255) |
缩略图 |
tuji |
text |
图集 |
biaoti |
varchar(255) |
标题 |
suoshushequ |
int |
所属社区 |
xiangqing |
longtext |
详情 |
faburen |
varchar(50) |
发布人 |
addtime |
timestamp |
添加时间 |
设置索引, 字段:suoshushequ , 关联表【shequ】中的id 字段 |
【评论】模块,表名:pinglun |
||
字段名 |
字段类型 |
名称 |
id |
int |
(主键) |
biao |
varchar(50) |
表 |
biaoid |
int |
表id |
biaoti |
varchar(255) |
标题 |
pingfen |
varchar(255) |
评分 |
pinglunneirong |
text |
评论内容 |
pinglunren |
varchar(50) |
评论人 |
addtime |
timestamp |
评论时间 |
【社区】模块,表名:shequ |
||
字段名 |
字段类型 |
名称 |
id |
int |
(主键) |
shequmingcheng |
varchar(255) |
社区名称 |
【活动信息】模块,表名:huodongxinxi |
||
字段名 |
字段类型 |
名称 |
id |
int |
(主键) |
huodongbianhao |
varchar(50) |
活动编号 |
tupian |
varchar(255) |
图片 |
huodongbiaoti |
varchar(255) |
活动标题 |
suoshushequ |
int |
所属社区 |
zhaomurenshu |
int |
招募人数 |
yibaomingrenshu |
int |
已报名人数 |
zhuangtai |
varchar(50) |
状态 |
kehuodejifen |
int |
可获得积分 |
huodongxiangqing |
longtext |
活动详情 |
faburen |
varchar(50) |
发布人 |
addtime |
timestamp |
添加时间 |
设置索引, 字段:suoshushequ , 关联表【shequ】中的id 字段 |
【申请志愿者】模块,表名:shenqingzhiyuanzhe |
||
字段名 |
字段类型 |
名称 |
id |
int |
(主键) |
shenqingbianhao |
varchar(50) |
申请编号 |
biaoti |
varchar(50) |
标题 |
shenqingyonghu |
varchar(50) |
申请用户 |
zhenshixingming |
varchar(50) |
真实姓名 |
xingbie |
varchar(10) |
性别 |
shenfenzhenghao |
varchar(50) |
身份证号 |
lianxidianhua |
varchar(50) |
联系电话 |
gongzuodanwei |
varchar(50) |
工作单位 |
xianjuzhudizhi |
varchar(255) |
现居住地址 |
hujidizhi |
varchar(255) |
户籍地址 |
shenqingmiaoshu |
text |
申请描述 |
shenqingzhuangtai |
varchar(50) |
申请状态 |
addtime |
timestamp |
申请时间 |
【申请审核】模块,表名:shenqingshenhe |
||
字段名 |
字段类型 |
名称 |
id |
int |
(主键) |
shenqingzhiyuanzheid |
int |
申请志愿者id |
shenqingbianhao |
varchar(50) |
申请编号 |
biaoti |
varchar(50) |
标题 |
shenqingyonghu |
varchar(50) |
申请用户 |
zhenshixingming |
varchar(50) |
真实姓名 |
shenhe |
varchar(50) |
审核 |
beizhu |
text |
备注 |
shenheren |
varchar(50) |
审核人 |
addtime |
timestamp |
添加时间 |
设置索引, 字段:shenqingzhiyuanzheid , 关联表【shenqingzhiyuanzhe】中字段id |
【邀请成为志愿者】模块,表名:yaoqingchengweizhiyuanzhe |
||
字段名 |
字段类型 |
名称 |
id |
int |
(主键) |
yonghuid |
int |
用户id |
yonghuming |
varchar(50) |
用户名 |
xingming |
varchar(50) |
姓名 |
biaoti |
varchar(50) |
标题 |
neirong |
longtext |
内容 |
yaoqingren |
varchar(50) |
邀请人 |
addtime |
timestamp |
添加时间 |
设置索引, 字段:yonghuid , 关联表【yonghu】中字段id |
【公告】模块,表名:gonggao |
||
字段名 |
字段类型 |
名称 |
id |
int |
(主键) |
biaoti |
varchar(50) |
标题 |
neirong |
longtext |
内容 |
faburen |
varchar(50) |
发布人 |
addtime |
timestamp |
添加时间 |
【报名活动】模块,表名:baominghuodong |
||
字段名 |
字段类型 |
名称 |
id |
int |
(主键) |
baomingbianhao |
varchar(50) |
报名编号 |
huodongxinxiid |
int |
活动信息id |
huodongbianhao |
varchar(50) |
活动编号 |
huodongbiaoti |
varchar(255) |
活动标题 |
suoshushequ |
int |
所属社区 |
kehuodejifen |
int |
可获得积分 |
faburen |
varchar(50) |
发布人 |
shenhezhuangtai |
varchar(50) |
审核状态 |
baomingshuoming |
text |
报名说明 |
baomingren |
varchar(50) |
报名人 |
addtime |
timestamp |
报名时间 |
设置索引, 字段:huodongxinxiid , 关联表【huodongxinxi】中字段id |
||
设置索引, 字段:suoshushequ , 关联表【shequ】中的id 字段 |
【报名审核】模块,表名:baomingshenhe |
||
字段名 |
字段类型 |
名称 |
id |
int |
(主键) |
baominghuodongid |
int |
报名活动id |
baomingbianhao |
varchar(50) |
报名编号 |
huodongbianhao |
varchar(50) |
活动编号 |
huodongbiaoti |
varchar(255) |
活动标题 |
suoshushequ |
int |
所属社区 |
kehuodejifen |
int |
可获得积分 |
baomingren |
varchar(50) |
报名人 |
shenhe |
varchar(50) |
审核 |
beizhu |
text |
备注 |
shenheren |
varchar(50) |
审核人 |
addtime |
timestamp |
添加时间 |
设置索引, 字段:baominghuodongid , 关联表【baominghuodong】中字段id |
||
设置索引, 字段:suoshushequ , 关联表【shequ】中的id 字段 |
【志愿者评价】模块,表名:zhiyuanzhepingjia |
||
字段名 |
字段类型 |
名称 |
id |
int |
(主键) |
huodongxinxiid |
int |
活动信息id |
huodongbianhao |
varchar(50) |
活动编号 |
huodongbiaoti |
varchar(255) |
活动标题 |
suoshushequ |
int |
所属社区 |
faburen |
varchar(50) |
发布人 |
zhiyuanzhe |
varchar(50) |
志愿者 |
pingfen |
varchar(50) |
评分 |
shifouniming |
varchar(50) |
是否匿名 |
pingjiaren |
varchar(50) |
评价人 |
pingjianeirong |
longtext |
评价内容 |
addtime |
timestamp |
添加时间 |
设置索引, 字段:huodongxinxiid , 关联表【huodongxinxi】中字段id |
||
设置索引, 字段:suoshushequ , 关联表【shequ】中的id 字段 |
三,系统展示
志愿者活动
活动评价
志愿者评价
活动风采展示
系统公告
用户注册
志愿者个人中心
个人资料管理
志愿者申请管理
活动报名查询
评论评价管理
管理员登录
管理员管理
轮播图和公告管理
活动风采展示
社区管理和活动信息管理
志愿者审核管理
活动报名审核
过滤词管理
四,核心代码展示
package com.spring.controller; import com.jntoo.db.*; import com.jntoo.db.utils.*; import com.spring.dao.*; import com.spring.entity.*; import com.spring.service.*; import com.spring.util.*; import com.spring.util.Info; import java.util.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import tk.mybatis.mapper.entity.Example; /** * 管理员 */ @Controller public class AdminsController extends BaseController { @Autowired private AdminsMapper dao; @Autowired private AdminsService service; /** * 后台列表页 * */ @RequestMapping("/admins_list") public String list() { // 检测是否有登录,没登录则跳转到登录页面 if (!checkLogin()) { return showError("尚未登录", "./login.do"); } String order = Request.get("order", "id"); // 获取前台提交的URL参数 order 如果没有则设置为id String sort = Request.get("sort", "desc"); // 获取前台提交的URL参数 sort 如果没有则设置为desc int pagesize = Request.getInt("pagesize", 12); // 获取前台一页多少行数据 Example example = new Example(Admins.class); // 创建一个扩展搜索类 Example.Criteria criteria = example.createCriteria(); // 创建一个扩展搜索条件类 String where = " 1=1 "; // 创建初始条件为:1=1 where += getWhere(); // 从方法中获取url 上的参数,并写成 sql条件语句 criteria.andCondition(where); // 将条件写进上面的扩展条件类中 if (sort.equals("desc")) { // 判断前台提交的sort 参数是否等于 desc倒序 是则使用倒序,否则使用正序 example.orderBy(order).desc(); // 把sql 语句设置成倒序 } else { example.orderBy(order).asc(); // 把 sql 设置成正序 } int page = request.getParameter("page") == null ? 1 : Integer.valueOf(request.getParameter("page")); // 获取前台提交的URL参数 page 如果没有则设置为1 page = Math.max(1, page); // 取两个数的最大值,防止page 小于1 List<Admins> list = service.selectPageExample(example, page, pagesize); // 获取当前页的行数 // 将列表写给界面使用 assign("totalCount", request.getAttribute("totalCount")); assign("list", list); assign("orderby", order); // 把当前排序结果写进前台 assign("sort", sort); // 把当前排序结果写进前台 return json(); // 将数据写给前端 } public String getWhere() { _var = new LinkedHashMap(); // 重置数据 String where = " "; // 以下也是一样的操作,判断是否符合条件,符合则写入sql 语句 if (!Request.get("username").equals("")) { where += " AND username LIKE '%" + Request.get("username") + "%' "; } return where; } @RequestMapping("/admins_add") public String add() { _var = new LinkedHashMap(); // 重置数据 return json(); // 将数据写给前端 } @RequestMapping("/admins_updt") public String updt() { _var = new LinkedHashMap(); // 重置数据 int id = Request.getInt("id"); // 获取行数据,并赋值给前台jsp页面 Admins mmm = service.find(id); assign("mmm", mmm); assign("updtself", 0); return json(); // 将数据写给前端 } @RequestMapping("/admins_updtself") public String updtself() { _var = new LinkedHashMap(); // 重置数据 // 更新个人资料 int id = (int) request.getSession().getAttribute("id"); Admins mmm = service.find(id); assign("mmm", mmm); assign("updtself", 1); return json(); // 将数据写给前端 } /** * 添加内容 * @return */ @RequestMapping("/adminsinsert") public String insert() { _var = new LinkedHashMap(); // 重置数据 String tmp = ""; Admins post = new Admins(); // 创建实体类 // 设置前台提交上来的数据到实体类中 post.setUsername(Request.get("username")); post.setPwd(Request.get("pwd")); service.insert(post); // 插入数据 int charuid = post.getId().intValue(); if (isAjax()) { return jsonResult(post); } return showSuccess("保存成功", Request.get("referer").equals("") ? request.getHeader("referer") : Request.get("referer")); } /** * 更新内容 * @return */ @RequestMapping("/adminsupdate") public String update() { _var = new LinkedHashMap(); // 重置数据 // 创建实体类 Admins post = new Admins(); // 将前台表单数据填充到实体类 if (!Request.get("username").equals("")) post.setUsername(Request.get("username")); if (!Request.get("pwd").equals("")) post.setPwd(Request.get("pwd")); post.setId(Request.getInt("id")); service.update(post); // 更新数据 int charuid = post.getId().intValue(); if (isAjax()) { return jsonResult(post); } if (Request.getInt("updtself") == 1) { return showSuccess("保存成功", "admins_updtself.do"); } return showSuccess("保存成功", Request.get("referer")); // 弹出保存成功,并跳转到前台提交的 referer 页面 } /** * 删除 */ @RequestMapping("/admins_delete") public String delete() { _var = new LinkedHashMap(); // 重置数据 if (!checkLogin()) { return showError("尚未登录"); } int id = Request.getInt("id"); // 根据id 删除某行数据 Map map = Query.make("admins").find(id); service.delete(id); // 根据id 删除某行数据 return showSuccess("删除成功", request.getHeader("referer")); //弹出删除成功,并跳回上一页 } }
package com.spring.controller; import com.alibaba.fastjson.JSON; import com.spring.util.JsonResult; import java.io.IOException; import java.io.OutputStream; import java.util.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.servlet.ModelAndView; /** * 控制器基类 */ public abstract class BaseController { @Autowired protected HttpServletRequest request; // 注入 @Autowired protected HttpServletResponse response; // 注入 @Autowired protected HttpSession session; // 注入 protected ModelAndView mView; protected Map<Object, Object> _var; /** * 控制器 */ public BaseController() { //request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); //response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse(); mView = new ModelAndView(); _var = new LinkedHashMap(); } /** * 往模板中写入数据 * @param name * @param value */ protected void assign(String name, Object value) { request.setAttribute(name, value); _var.put(name, value); } /** * 弹出框 * @param message * @param code * @param jumpUrl * @param jumpTime * @return */ protected String showMessage(String message, int code, Object data, String jumpUrl, int jumpTime) { if (isAjax()) { JsonResult jsonResult = new JsonResult(code, message, data); return renderString(response, JSON.toJSONString(jsonResult)); } assign("message", message == null ? data : message); assign("code", code); assign("jumpUrl", jumpUrl); assign("jumpTime", jumpTime); return "message"; } /** * 将写入json写到前端 * @return */ public String json() { return jsonResult(_var); } public String jsonReturn(String message, int code, Object data) { JsonResult result = new JsonResult(code, message, data); return renderString(response, JSON.toJSONString(result)); } public String jsonResult(Object data) { return jsonReturn(null, 0, data); } public String jsonError(String msg) { return jsonReturn(msg, 1, null); } public Object getRequestAttributeMap() { //Map<Object,Object> map = new LinkedHashMap(); Enumeration<String> names = request.getAttributeNames(); while (names.hasMoreElements()) { String key = names.nextElement(); if (!_var.containsKey(key)) { // 没有,则写入 _var.put(key, request.getAttribute(key)); } } return _var; } public String getJson() { Map<Object, Object> map = new LinkedHashMap(); Enumeration<String> names = request.getAttributeNames(); while (names.hasMoreElements()) { String key = names.nextElement(); Object value = request.getAttribute(key); map.put(key, value); } return renderString(response, JSON.toJSONString(map)); } /** * 将字符串渲染到客户端 * * @param response 渲染对象 * @param string 待渲染的字符串 * @return null */ public String renderString(HttpServletResponse response, String string) { try { request.getSession(); OutputStream stream = response.getOutputStream(); response.setContentType("application/json"); response.setCharacterEncoding("utf-8"); stream.write(string.getBytes()); stream.flush(); } catch (IOException e) { e.printStackTrace(); } return "success"; } protected boolean isAjax() { String accept = request.getHeader("accept"); if (accept != null && accept.indexOf("application/json") != -1) { return true; } String xRequestedWith = request.getHeader("X-Requested-With"); if (xRequestedWith != null && xRequestedWith.indexOf("XMLHttpRequest") != -1) { return true; } String ajax = request.getParameter("format"); if ("json".equalsIgnoreCase(ajax)) { return true; } return false; } /** * 检测是否登录 * @return */ protected boolean checkLogin() { if (request.getSession().getAttribute("username") == null || "".equals(request.getSession().getAttribute("username"))) { return false; } return true; } /** * 弹出错误信息 * @param message * @return */ protected String showError(String message) { return showMessage(message, 1, null, "javascript:history(-1);", 2250); } /** * 弹出错误信息 * @param message * @param code * @return */ protected String showError(String message, int code) { return showMessage(message, code, null, "javascript:history(-1);", 2250); } /** * 弹出错误信息 * @param message * @param url * @return */ protected String showError(String message, String url) { return showMessage(message, 1, null, url, 2250); } /** * 弹出成功信息 * @param data * @return */ protected String showSuccess(Object data) { return showMessage(null, 0, data, request.getHeader("referer"), 2250); } /** * 弹出成功信息 * @param data * @param url * @return */ protected String showSuccess(String data, String url) { return showMessage(null, 0, data, url, 2250); } }
五,相关作品展示
基于Java开发、Python开发、PHP开发、C#开发等相关语言开发的实战项目
基于Nodejs、Vue等前端技术开发的前端实战项目
基于微信小程序和安卓APP应用开发的相关作品
基于51单片机等嵌入式物联网开发应用
基于各类算法实现的AI智能应用
基于大数据实现的各类数据管理和推荐系统