失物招领|基于Web的校园失物招领系统的设计与实现
Posted 编程千纸鹤
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了失物招领|基于Web的校园失物招领系统的设计与实现相关的知识,希望对你有一定的参考价值。
作者主页:编程千纸鹤
作者简介:Java、前端、Pythone开发多年,做过高程,项目经理,架构师
主要内容:Java项目开发、毕业设计开发、面试技术整理、最新技术分享
收藏点赞不迷路 关注作者有好处
项目编号:BS-XX-158
引言:
随着互联网的飞速发展,学校也进入了信息化时代。校园中大学生丢失物品的现象较为普遍,但是由于没有一个良好的信息交流平台,使得失主不能及时甚至找不到失物,给生活带来了极大的不便。通过互联网为在校师生搭建一个发布信息的平台,可以有效帮助他们找回失物。
校园失物招领系统基于Web技术进行开发,采用mysql数据库存储数据,主要包括用户和管理员两大模块:用户模块具有注册、登录、发布寻物信息、发布招领信息、浏览、留言板、个人信息管理等功能;管理员模块可以对用户信息、寻物信息、招领信息、个人信息和管理员信息进行管理。
一,项目简介
传统的校园失物招领系统都是通过纸笔记录信息,经过一段时间后,累积的数据达到一定程度,再次查询的效率就会非常低,并且很容易造成数据的损坏和丢失。随着社会的进步,绿色环保成为一种主流,越来越多的公司已经放弃了使用纸笔记录信息,开始通过互联网发送并存储各种信息[1]。这样做不仅大大节约了成本,还省出了更多的时间和精力去做其他的工作。通过设计校园失物招领系统,用户可以使用互联网进入系统,在系统内发布或查看各种物品的信息。这样,通过各个用户之间的信息交流,可以方便快捷的找到丢失物品,并且还可以节省人力资源,也符合现代绿色环保的理念。因此,设计校园失物招领系统势在必行。
通过对系统的功能进行需求分析,应具备以下功能:
(1)游客在使用本系统之前,必须注册一个账号才能进入本系统。
(2)管理员可以使用相应的权限对普通用户进行管理。
(3)实现对失物和拾物两个模块的管理功能。
(4)能够实现用户对失物进行的搜索查找功能。
(5)实现用户对留言板这块的管理功能。
(6)对于个人信息可以及时完成修改或更新。
(7)实现在登录时,能够出现登录成功或失败的界面。
(8)实现用户的退出功能。
(9)管理员对于系统能够简单维护,方便用户实现操作的功能。
任何系统在设计的时候都需要构建数据库,并且在构建的时候,需要根据系统的需求,明确目的,最后在数据库内进行合理的设计,使其各个功能能够一一对应,这样才能有效的对数据进行存储,保证系统的正常运行。
基于Web的校园失物招领系统使用的是MySQL数据库,其中包括个人信息表、失物表、拾物表、留言表和分类表。这五张表具体如下所示。
(1)分类表主要是记录了各类物品的存放信息,如表3-1所示。
表3-1 分类表结构
序列号 | 字段名称 | 字段类型 | 长度 | 是否主键 | 说明 |
1 | classify_id | int | 11 | 是 | id自增 |
2 | Classify_name | varchar | 255 | 否 | 分类名称 |
(2)个人信息表主要记录了用户相关的个人信息,如表3-2所示。
表3-2 个人信息表结构
序列号 | 字段名称 | 字段类型 | 长度 | 是否主键 | 说明 |
1 | userId | int | 11 | 是 | id自增 |
2 | user_name | varchar | 255 | 否 | 用户名 |
3 | user_password | varchar | 255 | 否 | 密码 |
4 | user_real_name | varchar | 255 | 否 | 真实姓名 |
5 | | varchar | 255 | 否 | 邮箱 |
6 | tel | int | 11 | 否 | 电话 |
7 | role | int | 11 | 否 | 用户身份 |
8 | academy | varchar | 255 | 否 | 院系 |
(3)失物表主要记录了用户丢失的物品的相关信息,如表3-3所示。
表3-3 失物表结构
序列号 | 字段名称 | 字段类型 | 长度 | 是否主键 | 说明 |
1 | lost_id | int | 11 | 是 | id自增 |
2 | lost_name | varchar | 255 | 否 | 物品名称 |
3 | lost_time | varchar | 255 | 否 | 时间 |
4 | describe | varchar | 255 | 否 | 描述 |
5 | place | varchar | 255 | 否 | 地点 |
6 | sort | int | 11 | 否 | 物品分类 |
7 | user_id | int | 11 | 否 | 用户 |
(4)拾物表主要记录了各种被捡到的物品的相关信息,如表3-4所示。
表3-4 拾物表结构
序列号 | 字段名称 | 字段类型 | 长度 | 是否主键 | 说明 |
1 | found_id | int | 11 | 是 | id自增 |
2 | found_goods_name | varchar | 255 | 否 | 物品名称 |
3 | time | varchar | 255 | 否 | 时间 |
4 | describe | varchar | 255 | 否 | 描述 |
5 | place | varchar | 255 | 否 | 地点 |
6 | sort | int | 11 | 否 | 物品分类 |
7 | user_id | int | 11 | 否 | 用户 |
(5)留言表主要记录了用户的各种留言信息,如表3-5所示。
表3-5 留言表结构
序列号 | 字段名称 | 字段类型 | 长度 | 是否主键 | 说明 |
1 | id | int | 11 | 是 | Id自增 |
2 | user_id | varchar | 255 | 否 | 用户 |
3 | content | varchar | 255 | 否 | 内容 |
二,环境介绍
语言环境:Java: jdk1.8
数据库:Mysql: mysql5.7
应用服务器:Tomcat: tomcat8.5.31
开发工具:IDEA或eclipse
后台开发技术:SSM框架
前台开发技术:JSP+JQUERY+CSS+JS
三,系统展示
4.1 前台功能模块设计实现
4.1.1 用户注册模块
用户来到系统界面,点击注册按钮,便会跳转到注册界面,在注册的时候需要输入真实姓名、登录密码、手机号、用户名、邮箱、院校等一些基本信息,其中手机号必须是11位,邮箱格式必须正确,将这些信息输入完成后,点击注册便会注册成功,然后跳转到登录界面进行登录。用户在进行注册时的注册界面如图4-1所示。
图4-1 用户注册
4.1.2 用户登录模块
用户来到登录界面后,可以根据注册的用户名和密码进行登录操作,并且需要输入正确的验证码才能登录成功,若验证码复杂不容易识别,可以直接点击图片更换新的验证码。在登录成功后,系统会根据登录的账号自动识别用户或管理员的身份,从而可以进入到不同的界面。
用户在进行登录时的界面如图4-2所示。
图4-2 用户登录界面
4.1.3 浏览模块
4.1.3.1 寻物信息浏览
用户进入首页后,点击“浏览”按钮,选择“寻物信息浏览”,会出现各种物品的丢失信息,包括物品的类别、物品名称、丢失时间、丢失地点、丢失人信息和物品的描述,其中如果用户之前发布过寻物信息,也会显示在上面,并且点击“编辑”按钮后可以跳转到添加寻物信息界面完成寻物信息的更新,点击“更新寻物”按钮就可以完成寻物信息的更新,对于过期的信息,也可以自行删除。
用于浏览物品丢失信息的界面如图4-3所示。
图4-3 丢失信息浏览界面
更新寻物信息的界面如图4-4所示。
图4-4 更新寻物信息界面
4.1.3.2 招领信息浏览
用户进入首页后,点击“浏览”按钮,选择“招领信息浏览”,会出现各种物品的招领信息,包括物品的类别、招领物品、发现时间、发现的地点、发现的用户和物品的描述,如果用户之前捡到过失物,并且在上面发布了招领信息,也会出现在上面,如果失主找回了自己的失物,在删除失物信息之后,招领的信息便会清除。也可以在首页上方的搜索框输入失物的关键字对物品进行搜索,如果有该物品,则会显示该物品的信息,如果没有,则不会显示。
用于浏览招领信息的界面如图4-5所示。
图4-5 招领信息浏览界面
使用搜索功能的搜索结果界面如图4-6所示。
图4-6 搜索结果界面
4.1.4 发布寻物信息模块
用户可以在首页点击“发布寻物信息”按钮,进入到添加寻物信息界面,可以在此添加丢失物品的信息,包括选择物品的类别、添加丢失时间、丢失的物品描述、物品的名称以及丢失物品的地点,完成这些信息的填写后,点击“添加丢失”按钮便可以成功添加失物信息,如图4-7所示。
图4-7 添加寻物信息界面
4.1.5 发布招领信息模块
用户在首页通过点击“发布招领信息”按钮,进入到添加招领信息界面,可以在此添加捡到的物品信息,包括选择物品的类型、物品的名称、发现时间、发现地点以及物品描述,完成之后点击“添加招领”按钮便可以成功添加招领信息,其他用户在使用系统的时候也能看到这些信息,如图4-8所示。
图4-8 添加招领信息界面
4.1.6 留言板模块
用户在首页可以点击“留言板”按钮,进入到留言板模块,在这里用户可以随时发表自己的留言信息。用户只需要在留言框内输入留言内容,点击“发送”按钮,保存的留言信息便会显示在该界面,并且所有的用户都可以看到,如果感觉留言的内容不合适,可以在操作一栏点击“删除”按钮,不合适的留言内容就会被清除,如图4-9所示。
图4-9 用户留言界面
4.1.7 个人信息模块
用户在首页可以通过点击“个人信息”按钮,进入到个人信息修改界面,用户在该界面可以对自己的个人信息进行修改,包括修改用户登录名、用户密码、用户真实姓名、手机号码、邮箱以及所属院校,完成修改后,点击下方的“修改”按钮便可以完成修改,如图4-10所示。
图4-10 个人信息修改界面
4.2 管理员功能模块设计实现
4.2.1 用户信息管理模块
4.2.1.1 用户列表
管理员使用管理员账号可以进入后台管理系统,并且可以在系统的左侧点击用户信息管理,选择用户列表,可以进入用户信息概况界面,在该界面可以对用户信息进行查看和删除,对于一些利用系统来宣传不正当信息的用户,可以执行删除操作,点击“删除”按钮便可完成操作,如图4-11所示。
图4-11 用户信息界面
4.2.1.2 添加用户信息
管理员可以在后台管理系统选择用户信息管理,点击“添加用户信息”按钮便会跳转到管理员添加用户界面,在该界面管理员可以帮助用户添加信息,需要添加的用户信息包括用户登录名、用户密码、用户真实姓名、手机号码、邮箱和所属院校,所有信息写完后,点击“添加”按钮,就可以完成用户的添加,如图4-12所示。
图4-12 管理员添加用户界面
4.2.2 招领信息管理模块
4.2.2.1 招领列表
管理员可以在后台用户管理系统选择招领信息管理,点击“招领列表”按钮便可以跳转到招领信息界面,该界面包括了招领物品的类别、名称、发现的时间、物品的描述、发现的地点和发现的用户相关信息,点击操作栏中的“编辑”按钮便可以跳转到更新界面进行编辑,也可以进行删除,如图4-13所示。
图4-13 招领信息界面
4.2.2.2 添加招领信息
管理员可以在后台管理系统选择招领信息管理,点击“添加招领信息”按钮就会跳转到添加招领信息界面,在该界面可以选择添加招领物品的类别、物品的名称、发现时间、发现地点以及物品描述,完成这些信息的填写之后,点击下方的“添加招领”按钮,就可以将招领信息保存到招领列表,如图4-14所示。
图4-14 添加招领信息界面
4.2.3 寻物信息管理模块
4.2.3.1 寻物列表
管理员可以在后台管理系统选择寻物信息管理,点击“寻物列表”按钮,就会跳转到丢失信息界面,包括丢失物品的类别、物品名称、丢失时间、丢失的地点、丢失人信息和物品的描述,在操作列可以选择对物品进行编辑或删除,点击“编辑”按钮后会跳转到添加寻物信息界面,可以对物品的信息进行更新操作,如图4-15所示。
图4-15 丢失信息界面
4.2.3.2 添加寻物信息
管理员可以在后台管理系统选择寻物信息管理,点击“添加寻物信息按钮”就会跳转到添加寻物信息界面,包括选择添加物品的类型、物品名称、丢失时间、丢失地点和丢失物品的描述,所有信息填写完后点击“添加寻物”按钮就可以进行保存,如图4-16所示。
图4-16 添加寻物信息界面
4.2.4 个人信息管理模块
4.2.4.1 个人信息修改
管理员可以在后台管理系统选择个人信息管理,点击“个人信息修改”按钮,就会跳转到个人信息修改界面,包括修改用户登录名、用户密码、用户真实姓名、手机号码、邮箱和所属院校,完成修改后,点击“修改”按钮便可以将修改后的个人信息保存,如图4-17所示。
图4-17 个人信息修改界面
4.2.4.2 添加管理员
管理员在后台管理系统可以选择个人信息管理,点击“添加管理员”按钮,可以添加用户登录名、用户密码、用户真实姓名、手机号码、邮箱和所属院校,将所有的信息填写保存之后,便可以添加一位新的管理员,并且拥有管理员的所有权限,如图4-18所示。
图4-18 添加管理员界面
四,核心代码展示
package com.czmec.action;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.czmec.bean.FoundGoodsBean;
import com.czmec.bean.GoodsByNameBean;
import com.czmec.bean.LostGoodsBean;
import com.czmec.bean.UserBean;
import com.czmec.service.AdminService;
import com.czmec.service.FoundService;
import com.czmec.service.LostService;
import com.czmec.service.UserService;
//管理员操作
@Controller
@RequestMapping("AdminAction")
public class AdminAction
@Resource(name = "adminService")
AdminService admiservice;
@Resource(name = "lostService")
LostService lostservice;
@Resource(name = "foundService")
FoundService foundservice;
@Resource(name = "userService")
private UserService userservice;
@RequestMapping("adminindex")
public String Adminindex(HttpServletRequest req)
List<UserBean> list = admiservice.SelectUser();
req.setAttribute("listUser", list);
return "/admin/UserList";
@RequestMapping("test")
public String test()
return "/admin/test";
// 获取寻物信息列表
/*@RequestMapping("lostlist")
@ResponseBody
public List<LostGoodsBean> LostList()
List<LostGoodsBean> list = lostservice.SelectLostGoods();
return list;
*/
// 管理员添加用户
@RequestMapping("AddUser")
public String AddUser()
return "/admin/AddUser";
// 管理员添加用户具体实现
@RequestMapping("AddUserImpl")
public String AddUserImpl(UserBean user, HttpServletRequest req)
user.setRole(1);
int i = userservice.AddUser(user);
if (i > 0)
req.setAttribute("message", "添加成功");
else
req.setAttribute("message", "添加失败");
List<UserBean> list = admiservice.SelectUser();
req.setAttribute("listUser", list);
return "/admin/UserList";
// 管理员添加管理具体实现
@RequestMapping("AddAdminImpl")
public String AddAdminImpl(UserBean user, HttpServletRequest req)
user.setRole(0);
int i = userservice.AddUser(user);
if (i > 0)
req.setAttribute("message", "添加成功");
else
req.setAttribute("message", "添加失败");
List<UserBean> list = admiservice.SelectUser();
req.setAttribute("listUser", list);
return "/admin/UserList";
// 管理员添加招领
@RequestMapping("AddFound")
public String AddFound()
return "/admin/AddFound";
// 添加拾物列表
@RequestMapping("AddFoundImpl")
public String AddFoundImpl(FoundGoodsBean foundgoodsbean, HttpServletRequest req)
int i = foundservice.AddFoundGoods(foundgoodsbean);
if (i > 0)
req.setAttribute("message", "添加成功");
else
req.setAttribute("message", "添加失败");
List<FoundGoodsBean> list = foundservice.SelectFoundGoods();
req.setAttribute("foundList", list);
return "/admin/FoundList";
// 添加一条丢物信息
@RequestMapping("AddLost")
public String AddLost()
return "/admin/AddLost";
// 添加丢物列表
@RequestMapping("AddLostImpl")
public String AddLostImpl(LostGoodsBean losetgoodsbean, HttpServletRequest req)
int i = lostservice.AddLostGoods(losetgoodsbean);
if (i > 0)
req.setAttribute("message", "添加成功");
else
req.setAttribute("message", "添加失败");
List<LostGoodsBean> list = lostservice.SelectLostGoods();
req.setAttribute("lostlist", list);
return "/admin/LostList";
// 管理员链接到招领列表
@RequestMapping("FoundList")
public String FoundList(HttpServletRequest req)
List<FoundGoodsBean> list = foundservice.SelectFoundGoods();
req.setAttribute("foundList", list);
return "/admin/FoundList";
// 管理员链接到寻物列表
@RequestMapping("LostList")
public String LostList(HttpServletRequest req)
List<LostGoodsBean> list = lostservice.SelectLostGoods();
req.setAttribute("lostlist", list);
return "/admin/LostList";
// 个人信息修改
@RequestMapping("UpdatUser")
public String UpdatUser(HttpSession session)
if (((UserBean)session.getAttribute("user")).getRole()==0)
return "/admin/UpdatUser";
else
return "UpdatUser";
// 个人信息修改
@RequestMapping("UpdatUserImpl")
public String UpdatUserImpl(UserBean user,HttpServletRequest req)
int i=userservice.UpdateUser(user);
if (i > 0)
req.setAttribute("message", "修改成功");
else
req.setAttribute("message", "修改失败");
return "/admin/UpdatUser";
// 添加管理员
@RequestMapping("AddAdmin")
public String AddAdmin()
return "/admin/AddAdmin";
//删除用户
@RequestMapping("DelUser")
public String DelUser(UserBean user,HttpServletRequest req)
int i=userservice.DelUser(user);
if (i > 0)
req.setAttribute("Dmessage", "删除成功");
else
req.setAttribute("Dmessage", "删除失败");
List<UserBean> list = admiservice.SelectUser();
req.setAttribute("listUser", list);
return "/admin/UserList";
//删除招领信息
@RequestMapping("DelFoundGoods")
public String DelFoundGoods(FoundGoodsBean foundgoodsbean,HttpServletRequest req)
int i=foundservice.DelFoundGoods(foundgoodsbean);
if (i > 0)
req.setAttribute("Dmessage", "删除成功");
else
req.setAttribute("Dmessage", "删除失败");
List<FoundGoodsBean> list = foundservice.SelectFoundGoods();
req.setAttribute("foundList", list);
return "/admin/FoundList";
//删除寻物信息
@RequestMapping("DelLostGoods")
public String DelLostGoods(LostGoodsBean lostgoodsbean,HttpServletRequest req)
int i=lostservice.DelLostGoods(lostgoodsbean);
if (i > 0)
req.setAttribute("Dmessage", "删除成功");
else
req.setAttribute("Dmessage", "删除失败");
List<LostGoodsBean> list = lostservice.SelectLostGoods();
req.setAttribute("lostlist", list);
return "/admin/LostList";
//根据物品名字模糊查询
@RequestMapping("SelectFoundGoodsByName")
public String SelectFoundGoodsByName(@Param("foundName")String foundName,HttpServletRequest request) throws UnsupportedEncodingException
foundName = java.net.URLDecoder.decode(foundName,"UTF-8");
GoodsByNameBean goodsbyNameBean=new GoodsByNameBean();
goodsbyNameBean.setFoundName(foundName);
List<GoodsByNameBean> list=foundservice.SelectFoundGoodsByName(goodsbyNameBean);
request.setAttribute("goodsByName", list);
return "admin/SelectByNameList";
//根据ID查询个人信息
@RequestMapping("selectUserById")
public String selectUserById(UserBean user,HttpServletRequest request)
List<UserBean> list=admiservice.SelectUserById(user);
request.setAttribute("geren",list);
return "admin/IdUser";
//更新一条招领记录
@RequestMapping("updatafound")
public String UpdataFoundList(@Param("foundId")int foundId,HttpServletRequest request)
FoundGoodsBean fBean=foundservice.SelectFoundById(foundId);
request.setAttribute("fBean", fBean);
return "admin/AddFound";
//更新一条招领记录实现
@RequestMapping("updatafoundImpl")
public String updtafoundImpl(FoundGoodsBean foundgoodsbean,HttpServletRequest req)
foundservice.UpdateFoundGoods(foundgoodsbean);
List<FoundGoodsBean> list = foundservice.SelectFoundGoods();
req.setAttribute("foundList", list);
return "/admin/FoundList";
//更新一条寻物记录
@RequestMapping("updatalost")
public String UpdataLostList(@Param("lostId")int lostId,HttpServletRequest request)
LostGoodsBean lBean=lostservice.SelectLostById(lostId);
request.setAttribute("lBean", lBean);
return "admin/AddLost";
//更新一条寻物实现
@RequestMapping("updatalostImpl")
public String updtalostImpl(LostGoodsBean lostGoodsBean,HttpServletRequest req)
lostservice.UpdateLostGoods(lostGoodsBean);
List<LostGoodsBean> list = lostservice.SelectLostGoods();
req.setAttribute("lostlist", list);
return "/admin/LostList";
package com.czmec.action;
import java.util.List;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.czmec.bean.WordsBean;
import com.czmec.service.WordsService;
//用户操作
@Controller
@RequestMapping("userAction")
public class UserAction
@Resource
WordsService wordsservice;
//主页面
@RequestMapping("main")
public String UserMain()
return "main";
//感恩
@RequestMapping("WordsList")
public String WordsList(HttpServletRequest request)
List<WordsBean> list= wordsservice.SelectAllWords();
System.out.println(list);
request.setAttribute("wordslist",list);
return "WordsList";
//添加一条感恩信
@RequestMapping("addWords")
public String AddWords(WordsBean wBean,HttpServletRequest request)
wordsservice.AddWords(wBean);
List<WordsBean> list= wordsservice.SelectAllWords();
System.out.println(list);
request.setAttribute("wordslist",list);
return "WordsList";
//删除一条感恩信
@RequestMapping("DelWords")
public String DelWords(WordsBean wBean,HttpServletRequest request)
wordsservice.DelWords(wBean);
List<WordsBean> list= wordsservice.SelectAllWords();
System.out.println(list);
request.setAttribute("wordslist",list);
return "WordsList";
package com.czmec.action;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.List;
import java.util.Random;
import javax.annotation.Resource;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.czmec.bean.UserBean;
import com.czmec.service.AdminService;
import com.czmec.service.UserService;
/*
* 用户登录action
*/
@Controller
@RequestMapping("user")
public class UserLogin
@Resource(name="adminService")
AdminService admiservice;
@Resource(name="userService")
private UserService userservice;
@RequestMapping("login")
public String login()
return "login";
@RequestMapping("checkLogin")
public String checkLogin(UserBean user,@Param("checkcode")String checkcode,HttpSession session,HttpServletRequest request)
String piccode=(String) request.getSession().getAttribute("piccode");
checkcode=checkcode.toUpperCase();//全部改成大写
if(checkcode.equals(piccode))
UserBean user1=userservice.login(user);
if(user1!=null)
if(user1.getRole()==0)
session.setAttribute("countfound", admiservice.SelectCountFoundGoods());
session.setAttribute("countlost",admiservice.SelectCountLostGoods());
session.setAttribute("countuser", admiservice.SelectCountUser());
session.setAttribute("user", user1);
List<UserBean> list= admiservice.SelectUser();
session.setAttribute("listUser", list);
return "/admin/index";
else
session.setAttribute("user", user1);
return "index";
else
session.setAttribute("error", "用户名或密码错误");
return "Error";
else
request.setAttribute("image", "验证码不正确");
return "login";
@RequestMapping("error")
public String Error()
return "Error";
//用户注册界面
@RequestMapping("register")
public String register()
return "register";
//用户注册界面功能
@RequestMapping("registerAction")
public String registerAction(UserBean user,HttpServletRequest req)
user.setRole(1);
int i= userservice.AddUser(user);
if (i>0)
req.setAttribute("message", "注册成功");
else
req.setAttribute("message", "注册失败");
return "login";
//用户退出系统
@RequestMapping("out")
public String out()
return "login";
//发布寻物信息
@RequestMapping("AddLost")
public String Addlost()
return "AddLost";
//验证码的实现
@RequestMapping("image")
public void Image(HttpServletRequest request,HttpServletResponse response) throws IOException
BufferedImage bi=new BufferedImage(68,22,BufferedImage.TYPE_INT_RGB);
Graphics g=bi.getGraphics();
Color c=new Color(200,150,255);
g.setColor(c);
//背景
g.fillRect(0, 0, 68, 22);
char[] ch="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".toCharArray();
//随机获取4个字符
Random r=new Random();
//范围数组,随机的位置
int len=ch.length,index;
StringBuffer sb=new StringBuffer();
for(int i=0;i<4;i++)
//获取随机数
index=r.nextInt(len);//获得一个随机的位置,一个字符
//放在图片上
g.setColor(new Color(r.nextInt(88),r.nextInt(188),r.nextInt(255)));//给个颜色
//字符画在图片上,及位置
g.drawString(ch[index]+"", (i*15)+3, 18);
//字符保存StringBuffer
sb.append(ch[index]);
request.getSession().setAttribute("piccode", sb.toString());
//输出
ImageIO.write(bi, "JPG", response.getOutputStream());
五,项目总结
校园失物招领系统使得用户更加方便、有效的找回丢失物品,也使得管理者在工作的时候更加简单、轻松,通过合理的分配人力、物力资源,提高校园失物招领工作的效率和质量。
主要特点为:
①界面简洁美观,容易上手。
②硬件要求低,容易维护。
基于Java+SpringMVC+vue+element实现前后端分离校园失物招领系统详细设计
博主介绍:✌公司项目主程、全网粉丝10W+,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,CSDN博客之星TOP100、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业设计✌
公众号:java奥斯卡 简历模板、学习资料、面试题库等都给你💪
🍅文末获取源码联系🍅
前言介绍:
随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。
校园失物招领系统,主要的模块包括首页、个人中心、公告信息管理、用户管理、物品类别管理、失物信息管理、招领信息管理、留言板管理、交流论坛、系统管理等功能。系统中管理员主要是为了安全有效地存储和管理各类信息,还可以对系统进行管理与更新维护等操作,并且对后台有相应的操作权限。
要想实现校园失物招领系统的各项功能,需要后台数据库的大力支持。管理员验证注册信息,收集的信息,并由此分析得出的关联信息等大量的数据都由数据库管理。本文中数据库服务器端采用了Mysql作为后台数据库,使Web与数据库紧密联系起来。在设计过程中,充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点。
本系统的开发使获取校园失物招领系统信息能够更加方便快捷,同时也使校园失物招领系统管理信息变的更加系统化、有序化。系统界面较友好,易于操作。
系统设计:
主要功能设计: 首页、个人中心、公告信息管理、用户管理、物品类别管理、失物信息管理、招领信息管理、留言板管理、交流论坛、系统管理等相应操作管理
系统架构图属于系统设计阶段,系统架构图只是这个阶段一个产物,系统的总体架构决定了整个系统的模式,是系统的基础。校园失物招领系统的整体结构设计如图所示。
功能截图:
系统前台模块:
用户登录:在用户注册页面通过填写用户名、密码、姓名、手机等信息完成用户注册
系统前端首页:校园失物招领系统,在系统的首页可以查看首页、公告信息、失物信息、招领信息、交流论坛、留言反馈、个人中心、后台管理等信息进行详细操作
公告信息:在公告信息页面中可以查看公告标题、类型、发布日期、内容、图片等信息,并进行评论、收藏等操作
失物信息:失物信息,在失物信息页面中可以查看物品名称、图片、物品类别、丢失地点、丢失时间、用户名、姓名、手机、详细描述等信息,并进行评论操作
招领信息:招领信息,在招领信息页面中可以查看物品名称
招领详情页面:查看物品名称、图片、物品类别、捡拾地点、捡拾时间、用户名、姓名、手机、详细描述等信息,并进行评论操作
交流论坛信息:交流论坛,在交流论坛页面通过填写标题、类型、内容等信息进行发布帖子或重置操作
评论交流
留言反馈:在留言反馈页面输入留言内容并立即提交或重置操作
个人中心:在个人中心页面通过填写用户名、密码、姓名、性别、上传图片、手机等信息进行个人信息修改操作,根据需要对我的发布、我的收藏等进行相应操作
普通用户后台管理:用户登录进入系统可以查看首页、个人中心、失物信息管理、招领信息管理、我的收藏管理等信息进行详细操作
管理员后台管理:
管理员登录进入系统之后,就可以对所有的信息进行查看,可以查看到首页、个人中心、公告信息管理、用户管理、物品类别管理、失物信息管理、招领信息管理、留言板管理、交流论坛、系统管理等,并且还可以对其进行相应的操作管理
公告管理:在公告信息管理页面中可以对索引、公告标题、类型、图片、发布日期等信息进行详情,查看评论,修改或删除等操作
内容详情:
用户管理:在用户管理页面中可以对索引、用户名、密码、姓名、性别、头像、手机等信息进行详情,修改或删除等操作
物品类型管理:
失物信息管理:失物信息管理,在失物信息管理页面中可以对索引、物品名称、图片、物品类别、丢失地点、丢失时间、用户名、姓名、手机等信息进行详情,修改或删除等操作
招领信息管理:在招领信息管理页面中可以对索引、物品名称、图片、物品类别、捡拾地点、捡拾时间、用户名、姓名、手机等信息进行详情,修改或删除等操作
留言板管理:在留言板管理页面中可以对索引、用户名、留言内容、回复内容等信息进行详情,回复,修改或删除等操作
交流论坛管理:在交流论坛页面中可以对索引、帖子标题、用户名、状态等信息进行详情,修改或删除等操作
系统轮播管理: 在轮播图管理页面中可以对索引、名称、值等信息进行详情,修改或删除等操作
数据设计:
失物信息实体属性图,如图所示:
招领信息实体属性图,如图所示:
交流论坛实体属性图如图所示。
将数据库概念设计的E-R图转换为关系数据库。在关系数据库中,数据关系由数据表组成,但是表的结构表现在表的字段上。
表4-1:收藏表
字段名称 | 类型 | 长度 | 字段说明 |
id | bigint | 主键 | |
addtime | timestamp | 创建时间 | |
userid | bigint | 用户id | |
refid | bigint | 收藏id | |
tablename | varchar | 200 | 表名 |
name | varchar | 200 | 收藏名称 |
picture | varchar | 200 | 收藏图片 |
type | varchar | 200 | 类型(1:收藏,21:赞,22:踩) |
inteltype | varchar | 200 | 推荐类型 |
表4-2:失物信息
字段名称 | 类型 | 长度 | 字段说明 |
id | bigint | 主键 | |
addtime | timestamp | 创建时间 | |
wupinmingcheng | varchar | 200 | 物品名称 |
tupian | varchar | 200 | 图片 |
wupinleibie | varchar | 200 | 物品类别 |
diushididian | varchar | 200 | 丢失地点 |
diushishijian | datetime | 丢失时间 | |
xiangximiaoshu | longtext | 4294967295 | 详细描述 |
yonghuming | varchar | 200 | 用户名 |
xingming | varchar | 200 | 姓名 |
shouji | varchar | 200 | 手机 |
表4-3:留言板
字段名称 | 类型 | 长度 | 字段说明 |
id | bigint | 主键 | |
addtime | timestamp | 创建时间 | |
userid | bigint | 留言人id | |
username | varchar | 200 | 用户名 |
content | longtext | 4294967295 | 留言内容 |
cpicture | varchar | 200 | 留言图片 |
reply | longtext | 4294967295 | 回复内容 |
rpicture | varchar | 200 | 回复图片 |
表4-4:公告信息
字段名称 | 类型 | 长度 | 字段说明 |
id | bigint | 主键 | |
addtime | timestamp | 创建时间 | |
gonggaobiaoti | varchar | 200 | 公告标题 |
leixing | varchar | 200 | 类型 |
tupian | varchar | 200 | 图片 |
neirong | longtext | 4294967295 | 内容 |
faburiqi | date | 发布日期 |
表4-5:招领信息
字段名称 | 类型 | 长度 | 字段说明 |
id | bigint | 主键 | |
addtime | timestamp | 创建时间 | |
wupinmingcheng | varchar | 200 | 物品名称 |
tupian | varchar | 200 | 图片 |
wupinleibie | varchar | 200 | 物品类别 |
jianshididian | varchar | 200 | 捡拾地点 |
jianshishijian | datetime | 捡拾时间 | |
xiangximiaoshu | longtext | 4294967295 | 详细描述 |
yonghuming | varchar | 200 | 用户名 |
xingming | varchar | 200 | 姓名 |
shouji | varchar | 200 | 手机 |
表4-6:用户
字段名称 | 类型 | 长度 | 字段说明 |
id | bigint | 主键 | |
addtime | timestamp | 创建时间 | |
yonghuming | varchar | 200 | 用户名 |
mima | varchar | 200 | 密码 |
xingming | varchar | 200 | 姓名 |
xingbie | varchar | 200 | 性别 |
touxiang | varchar | 200 | 头像 |
shouji | varchar | 200 | 手机 |
表4-7:物品类别
字段名称 | 类型 | 长度 | 字段说明 |
id | bigint | 主键 | |
addtime | timestamp | 创建时间 | |
wupinleibie | varchar | 200 | 物品类别 |
表4-8:用户表
字段名称 | 类型 | 长度 | 字段说明 |
id | bigint | 主键 | |
username | varchar | 100 | 用户名 |
password | varchar | 100 | 密码 |
role | varchar | 100 | 角色 |
addtime | timestamp | 新增时间 |
表4-9:token表
字段名称 | 类型 | 长度 | 字段说明 |
id | bigint | 主键 | |
userid | bigint | 用户id | |
username | varchar | 100 | 用户名 |
tablename | varchar | 100 | 表名 |
role | varchar | 100 | 角色 |
token | varchar | 200 | 密码 |
addtime | timestamp | 新增时间 | |
expiratedtime | timestamp | 过期时间 |
表4-10:交流论坛
字段名称 | 类型 | 长度 | 字段说明 |
id | bigint | 主键 | |
addtime | timestamp | 创建时间 | |
title | varchar | 200 | 帖子标题 |
content | longtext | 4294967295 | 帖子内容 |
parentid | bigint | 父节点id | |
userid | bigint | 用户id | |
username | varchar | 200 | 用户名 |
isdone | varchar | 200 | 状态 |
表4-11:招领信息评论表
字段名称 | 类型 | 长度 | 字段说明 |
id | bigint | 主键 | |
addtime | timestamp | 创建时间 | |
refid | bigint | 关联表id | |
userid | bigint | 用户id | |
nickname | varchar | 200 | 用户名 |
content | longtext | 4294967295 | 评论内容 |
reply | longtext | 4294967295 | 回复内容 |
代码实现:
/**
* 上传文件映射表
*/
@RestController
@RequestMapping("file")
@SuppressWarnings("unchecked","rawtypes")
public class FileController
@Autowired
private ConfigService configService;
/**
* 下载文件
*/
@IgnoreAuth
@RequestMapping("/download")
public void download(@RequestParam String fileName, HttpServletRequest request, HttpServletResponse response)
try
File file = new File(request.getSession().getServletContext().getRealPath("/upload")+"/"+fileName);
if (file.exists())
response.reset();
response.setHeader("Content-Disposition", "attachment; filename=\\"" + fileName+"\\"");
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setContentType("application/octet-stream; charset=UTF-8");
IOUtils.write(FileUtils.readFileToByteArray(file), response.getOutputStream());
catch (IOException e)
e.printStackTrace();
/**
* 上传文件
*/
@RequestMapping("/upload")
public R upload(@RequestParam("file") MultipartFile file, String type,HttpServletRequest request) throws Exception
if (file.isEmpty())
throw new EIException("上传文件不能为空");
String fileExt = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")+1);
String fileName = new Date().getTime()+"."+fileExt;
File dest = new File(request.getSession().getServletContext().getRealPath("/upload")+"/"+fileName);
file.transferTo(dest);
if(StringUtils.isNotBlank(type) && type.equals("1"))
ConfigEntity configEntity = configService.selectOne(new EntityWrapper<ConfigEntity>().eq("name", "faceFile"));
if(configEntity==null)
configEntity = new ConfigEntity();
configEntity.setName("faceFile");
configEntity.setValue(fileName);
else
configEntity.setValue(fileName);
configService.insertOrUpdate(configEntity);
return R.ok().put("file", fileName);
/**
* 失物信息
* 后端接口
* @author
* @email
* @date 2022-03-06 13:11:28
*/
@RestController
@RequestMapping("/shiwuxinxi")
public class ShiwuxinxiController
@Autowired
private ShiwuxinxiService shiwuxinxiService;
/**
* 后端列表
*/
@RequestMapping("/page")
public R page(@RequestParam Map<String, Object> params,ShiwuxinxiEntity shiwuxinxi, HttpServletRequest request)
String tableName = request.getSession().getAttribute("tableName").toString();
if(tableName.equals("yonghu"))
shiwuxinxi.setYonghuming((String)request.getSession().getAttribute("username"));
EntityWrapper<ShiwuxinxiEntity> ew = new EntityWrapper<ShiwuxinxiEntity>();
PageUtils page = shiwuxinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, shiwuxinxi), params), params));
return R.ok().put("data", page);
/**
* 前端列表
*/
@IgnoreAuth
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params,ShiwuxinxiEntity shiwuxinxi, HttpServletRequest request)
EntityWrapper<ShiwuxinxiEntity> ew = new EntityWrapper<ShiwuxinxiEntity>();
PageUtils page = shiwuxinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, shiwuxinxi), params), params));
return R.ok().put("data", page);
/**
* 列表
*/
@RequestMapping("/lists")
public R list( ShiwuxinxiEntity shiwuxinxi)
EntityWrapper<ShiwuxinxiEntity> ew = new EntityWrapper<ShiwuxinxiEntity>();
ew.allEq(MPUtil.allEQMapPre( shiwuxinxi, "shiwuxinxi"));
return R.ok().put("data", shiwuxinxiService.selectListView(ew));
/**
* 查询
*/
@RequestMapping("/query")
public R query(ShiwuxinxiEntity shiwuxinxi)
EntityWrapper< ShiwuxinxiEntity> ew = new EntityWrapper< ShiwuxinxiEntity>();
ew.allEq(MPUtil.allEQMapPre( shiwuxinxi, "shiwuxinxi"));
ShiwuxinxiView shiwuxinxiView = shiwuxinxiService.selectView(ew);
return R.ok("查询失物信息成功").put("data", shiwuxinxiView);
/**
* 后端详情
*/
@RequestMapping("/info/id")
public R info(@PathVariable("id") Long id)
ShiwuxinxiEntity shiwuxinxi = shiwuxinxiService.selectById(id);
return R.ok().put("data", shiwuxinxi);
/**
* 前端详情
*/
@IgnoreAuth
@RequestMapping("/detail/id")
public R detail(@PathVariable("id") Long id)
ShiwuxinxiEntity shiwuxinxi = shiwuxinxiService.selectById(id);
return R.ok().put("data", shiwuxinxi);
/**
* 后端保存
*/
@RequestMapping("/save")
public R save(@RequestBody ShiwuxinxiEntity shiwuxinxi, HttpServletRequest request)
shiwuxinxi.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
//ValidatorUtils.validateEntity(shiwuxinxi);
shiwuxinxiService.insert(shiwuxinxi);
return R.ok();
/**
* 前端保存
*/
@RequestMapping("/add")
public R add(@RequestBody ShiwuxinxiEntity shiwuxinxi, HttpServletRequest request)
shiwuxinxi.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
//ValidatorUtils.validateEntity(shiwuxinxi);
shiwuxinxiService.insert(shiwuxinxi);
return R.ok();
/**
* 修改
*/
@RequestMapping("/update")
public R update(@RequestBody ShiwuxinxiEntity shiwuxinxi, HttpServletRequest request)
//ValidatorUtils.validateEntity(shiwuxinxi);
shiwuxinxiService.updateById(shiwuxinxi);//全部更新
return R.ok();
/**
* 删除
*/
@RequestMapping("/delete")
public R delete(@RequestBody Long[] ids)
shiwuxinxiService.deleteBatchIds(Arrays.asList(ids));
return R.ok();
/**
* 提醒接口
*/
@RequestMapping("/remind/columnName/type")
public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request,
@PathVariable("type") String type,@RequestParam Map<String, Object> map)
map.put("column", columnName);
map.put("type", type);
if(type.equals("2"))
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar c = Calendar.getInstance();
Date remindStartDate = null;
Date remindEndDate = null;
if(map.get("remindstart")!=null)
Integer remindStart = Integer.parseInt(map.get("remindstart").toString());
c.setTime(new Date());
c.add(Calendar.DAY_OF_MONTH,remindStart);
remindStartDate = c.getTime();
map.put("remindstart", sdf.format(remindStartDate));
if(map.get("remindend")!=null)
Integer remindEnd = Integer.parseInt(map.get("remindend").toString());
c.setTime(new Date());
c.add(Calendar.DAY_OF_MONTH,remindEnd);
remindEndDate = c.getTime();
map.put("remindend", sdf.format(remindEndDate));
Wrapper<ShiwuxinxiEntity> wrapper = new EntityWrapper<ShiwuxinxiEntity>();
if(map.get("remindstart")!=null)
wrapper.ge(columnName, map.get("remindstart"));
if(map.get("remindend")!=null)
wrapper.le(columnName, map.get("remindend"));
String tableName = request.getSession().getAttribute("tableName").toString();
if(tableName.equals("yonghu"))
wrapper.eq("yonghuming", (String)request.getSession().getAttribute("username"));
int count = shiwuxinxiService.selectCount(wrapper);
return R.ok().put("count", count);
论文参考:
源码获取:
大家点赞、收藏、关注、评论啦 、查看👇🏻👇🏻👇🏻微信公众号获取联系方式👇🏻👇🏻👇🏻
打卡 文章 更新 255/ 365天
精彩专栏推荐订阅:在下方专栏👇🏻👇🏻👇🏻👇🏻
以上是关于失物招领|基于Web的校园失物招领系统的设计与实现的主要内容,如果未能解决你的问题,请参考以下文章