1.引言
动物作为人类的宠物已经有几千年的历史了,尤其是猫和狗因其天性被人类所喜爱和推崇,好多的成语故事、俗语等都及它们有关。但是,近几年来由于生活节奏的加快,人们的压力增大,没有时间和空间去照顾宠物,所以弃养宠物的家庭增加,越来越多的流浪动物不仅对动物的生活甚至生存造成影响而且也对人类的生活造成影响。据北京《娱乐信报》报道,兽医专家称流浪猫狗更易传播疾病,“街头流浪的猫狗身上携带鼠疫等病毒、跳蚤等寄生虫的几率要远远高于家养宠物”。除此之外,大量的流浪猫、狗对城市环境、交通以及公共卫生安全也构成了严重的隐患,也是对生命的不尊重。同时有些家庭却因为没有找到合适的宠物而遗憾。
目前,动物的救助存在救助的区域受限制、投资较大、场地偏僻、信息更新发布困难等诸多问题。这些情况导致动物救助所的动物处于“入多出少”的情况,这种情况导致收容所的经济、场地等问题日益严峻。在网络技术飞速发展的今天,电子商务对人们的影响越来越大,小到衣物的买卖,大到房屋的交易都可以通过电子商务来进行。人们也越来越习惯足不出户,完成很多的个人事务。依赖于Internet的优势,将动物的领养助养及其相结合,开发一个基于网络的宠物领养助养系统,刻不容缓。
本论文描述了基于SSM的流浪猫狗救助系统开发的整个流程。用户通过在互联网访问该平台,用户可以根据自身需要、家庭环境、宠物的情况等因素来决定救助方式。当然考虑到动物本身和会用户本身的条件,网站管理员有权利阻止用户的救助方式也可以对动物的受救助情况进行动态管理,并依据国家法律规定确定会员是否有领养的权利;最后,领养人可以通过平台上传动物的生活照进行领养反馈。
2.开发技术
2.1 B/S框架
B/S架构是软件系统体系结构,是指 浏览器-Web服务器( Broswer-Server ), 采用三层架构,即表现层、业务逻辑层、数据访问层 。B/S架构中,用户界面完全通过浏览器实现,一部分事务逻辑在前端实现,但是主要的事务逻辑在服务器端实现,形成所谓的三成架构。在B/S体系结构系统中,用户通过浏览器向分布在网络上的许多服务器发出请求,服务器对浏览器的请求进行处理,将用户所需信息返回到浏览器。而其余如数据请求、加工、结果返回以及动态网页生成、对数据库的访问和应用程序的执行等工作全部由Web Server完成。随着Windows将浏览器技术植入操作系统内部,这种结构已经成为当今应用软件的首选结构体系。
2.2 JSP技术
JSP全称JavaServer Pages,是由Sun Microsystems公司创建的动态网页技术标准,它构建在网络服务器上,可以接收客户端发送的指令,根据指令的内容动态生成HTML等格式的网页,然后返回给请求者。JSP可根据研发人员的需要自主创建,敲出的各式语言可用其他方式运行,具有普遍性。
由于JSP动态标准,所以它较于普通的静态标准有着很多优点,例如,JSP可以在静态页面内部中嵌入代码并可随时更改,并以静态页面为模板实现部分内容的动态生成,同时它还有更为强大的交互性。它还引入了一个名为"动作"的XML标签,用来用于调用内置函数。标签库可以随平台动态使用,对于平台外有着多种环境的适应性,这些简单易用的功能受到很多开发者的喜爱。
2.3 MVC框架
MVC 全名是Model View Controller,是模型-视图-控制器的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。
2.4 MySQL
MySQL是一个中小型关系数据库管理系统,可以在支持多线程的Web服务器上处理[13],它是由ORACLE公司开发的软件的旗下软件,是目前WEB应用中最好的RDBMS应用之一。
MySQL可以将数据保存在不同的表中,这些表相当于一个个小库房,各种库房相互交织,这种“交织”的连接方式大大提高了数据的灵活性。MySQL使用SQL语言,有免费版本,可对大众开放,配合Apache可以搭建一个很好的开发环境。MySQL具有低成本、高速度、体积微小等优势。在应用方面,它还有着安全性好,开发速率快等优点,对于一些想节约成本的企业和个人用户来说,选择MySQL是一种非常不错的选择。
3.功能设计
本系统会员分为游客、用户、管理员三个角色。系统结构图所示:
管理员权限:
(1)管理员具有管理用户的权限主要是:删除违反协议、长时间不登录等用户的用户信息。
(2)管理员具有管理宠物的权限主要是发布新宠物信息、删除已死亡宠物信息、修改宠物领养助养状态信息、审核用户发布的宠物等。
(2)管理员具有管理订单的权限,包括:修改订单状态、审核订单、取消不合理订单、确认订单等
(3)管理员具有管理宠物类别的权限,包括:添加、删除、修改宠物类别信息。
(4)管理员具有管理货运类别的权限,包括:添加、删除、修改货运类别信息。
(5)管理员具有管理领养宠物的权限,主要是修改领养信息。
用户权限:
(6)用户具有浏览网站中所有的宠物信息、留言发布需要救助的宠物信息的权限。
(7)用户具有按关键字检索宠物的权限。
(8)个人信息管理:修改个人注册信息。
(9)密码管理:找回密码、修改密码。
(10)添加、查看或删除个人收藏。
(11)将选中的宠物放入宠物车。
(12)查看、增删宠物车中的宠物
(13)若领养则直接提交订单;领养提交订单并填写必要的收件信息。
(14)若直接助养则直接修改宠物助养金信息。
(15)查看包括运费在内的总金额
(16)查看助养宠物的月消费明细单。
(17)上传领养宠物的近况照片,以便管理员回访。
(18)留言信息管理:添加留言
(19)退出登录
游客权限:
(1)游客具有浏览网站中所有的宠物信息的权限,主要是查看宠物信息。
(2)游客具有按关键字检索宠物的权限。
(3)游客具有注册为会员的权限。
4.功能效果图
4.1 首页
4.2 领养中心
4.3 登录
4.4 注册
4.5 后台管理员登录
5.核心代码
@Controller
@RequestMapping("adopt")
public class AdoptAnimalController {
@Autowired
private AdoptAnimalService animalService;
@Autowired
private PetService petService;
@Autowired
private UsersService usersService;
@RequestMapping("adopts.action")
@ResponseBody
public Message getAdoptAnimals(@RequestParam(value = "pn",defaultValue = "1") Integer pn){
PageHelper.startPage(pn,4);
AdoptAnimal animal=new AdoptAnimal();
List<AdoptAnimal> adoptAnimals = animalService.findByState(1);
PageInfo page=new PageInfo(adoptAnimals,2);
return Message.success().add("pageInfo",page);
}
@RequestMapping("ByAgree.action")
@ResponseBody
public Message getAdoptStates(@RequestParam(value = "pn",defaultValue = "1") Integer pn){
PageHelper.startPage(pn,4);
int state=2;
List<AdoptAnimal> adoptAnimals = animalService.findByState(state);
PageInfo page=new PageInfo(adoptAnimals,2);
return Message.success().add("pageInfo",page);
}
@RequestMapping("ByDisAgree.action")
@ResponseBody
public Message getAdoptDisagress(@RequestParam(value = "pn",defaultValue = "1") Integer pn){
PageHelper.startPage(pn,4);
int state=0;
List<AdoptAnimal> adoptAnimals = animalService.findByState(state);
PageInfo page=new PageInfo(adoptAnimals,2);
return Message.success().add("pageInfo",page);
}
@RequestMapping("create.action")
@ResponseBody
public Message createAdopt(HttpServletRequest request){
Pet pet = (Pet)request.getSession().getAttribute("pet");
Users user = (Users)request.getSession().getAttribute("user");
pet.setState(1);
AdoptAnimal animal=new AdoptAnimal();
animal.setUser(user);
animal.setPet(pet);
animal.setState(1);
animal.setAdoptTime(new Date());
int i = animalService.addAdoptAnimal(animal);
int t=petService.updateState(pet);
if(i>0&&t>0){
return Message.success();
}else{
return Message.fail();
}
}
@RequestMapping("delete.action")
@ResponseBody
public Message deleteAdopt(Integer id){
if(animalService.deleteAdoptAnimal(id)>0){
return Message.success();
}else{
return Message.fail();
}
}
@RequestMapping("update.action")
@ResponseBody
public Message updateAdoptAnimal(AdoptAnimal animal){
if(animalService.updateAdoptAnimal(animal)>0){
return Message.success();
}else{
return Message.fail();
}
}
@RequestMapping(value = "disAgree.action", method = RequestMethod.GET)
@ResponseBody
public Message updateAdoptState(Integer id) throws MessagingException {
AdoptAnimal animal = animalService.findById(id);
animal.setState(0);
Pet pet = animal.getPet();
pet.setState(0);
int i = animalService.updateAdoptState(animal);
int t=petService.updateState(pet);
if(i>0&&t>0){
return Message.success();
}else{
return Message.fail();
}
}
@RequestMapping(value = "agree.action",method = RequestMethod.GET)
@ResponseBody
public Message updateAdoptStates(Integer id) throws MessagingException {
AdoptAnimal animal = animalService.findById(id);
animal.setState(2);
Pet pet = animal.getPet();
pet.setState(2);
int a = animalService.updateAdoptState(animal);
int b=petService.updateState(pet);
if(a>0&&b>0){
return Message.success();
}else{
return Message.fail();
}
}
@RequestMapping("findById.action")
@ResponseBody
public Message findById(Integer id){
AdoptAnimal animal = animalService.findById(id);
if(animal!=null){
return Message.success().add("animal",animal);
}else{
return Message.fail();
}
}
@RequestMapping("findByAdoptTime.action")
@ResponseBody
public Message findByAdoptTime(String adoptTime) throws ParseException {
PageHelper.startPage(1,4);
List<AdoptAnimal> adoptAnimals = animalService.findByAdoptTime(adoptTime);
if(adoptAnimals!=null){
PageInfo page=new PageInfo(adoptAnimals,3);
return Message.success().add("pageInfo",page);
}else{
return Message.fail();
}
}
@RequestMapping("findByName.action")
@ResponseBody
public Message findByName(@RequestParam(value = "pn",defaultValue = "1")Integer pn,@RequestParam(value = "userName") String userName,@RequestParam(value = "state") Integer state) throws ParseException {
PageHelper.startPage(1,4);
List<Users> users = usersService.findByName(userName);
List<AdoptAnimal> adoptAnimals = animalService.findByName(users,state);
if(adoptAnimals!=null){
PageInfo page=new PageInfo(adoptAnimals,3);
return Message.success().add("pageInfo",page);
}else{
return Message.fail();
}
}
}
@Controller
@RequestMapping("pet")
public class PetController {
@Autowired
private PetService petService;
@RequestMapping("pets.action")
@ResponseBody
public Message getPets(@RequestParam(value = "pn",defaultValue = "1")Integer pn){
PageHelper.startPage(pn,3);
List<Pet> pets = petService.getPets();
System.out.println(pets);
PageInfo page=new PageInfo(pets,2);
return Message.success().add("pageInfo",page);
}
@RequestMapping("petState.action")
@ResponseBody
public Message findByState(@RequestParam(value = "pn",defaultValue = "1")Integer pn){
PageHelper.startPage(pn,3);
int state=0;
List<Pet> pets = petService.findByState(0);
System.out.println(pets);
PageInfo page=new PageInfo(pets,2);
return Message.success().add("pageInfo",page);
}
@RequestMapping(value = "create.action")
@ResponseBody
public Message createPet(Pet pet,@RequestParam(value = "file") MultipartFile file, HttpServletRequest request){
String load = FileLoad.load(file,request);
pet.setPic(load);
if(petService.addPet(pet)>0){
return Message.success();
}else{
return Message.fail();
}
}
@RequestMapping("delete.action")
@ResponseBody
public Message deletePet(Integer id){
if(petService.deletePet(id)>0){
return Message.success();
}else {
return Message.fail();
}
}
@RequestMapping("update.action")
@ResponseBody
public Message updatePet(Pet pet){
if(petService.updatePet(pet)>0){
return Message.success();
}else{
return Message.fail();
}
}
@RequestMapping("findById.action")
@ResponseBody
public Message findById(Integer id){
Pet pet = petService.findById(id);
if(pet!=null){
return Message.success().add("pet",pet);
}else{
return Message.fail();
}
}
@RequestMapping("findByPet.action")
@ResponseBody
public Message findByPet(Integer id, HttpServletRequest request){
Pet pet = petService.findById(id);
System.out.println(pet);
String pic = pet.getPic();
String[] split = pic.split(",");
List<String> pics=new ArrayList<>();
for(int i=0;i<split.length;i++){
pics.add(split[i]);
}
request.getSession().setAttribute("pics",pic);
request.getSession().setAttribute("pet",pet);
if(pet!=null){
return Message.success().add("pet",pet);
} else{
return Message.fail();
}
}
@RequestMapping("findByPetType.action")
@ResponseBody
public Message findByName(@RequestParam(value = "pn",defaultValue = "1")Integer pn,String petType){
PageHelper.startPage(pn,4);
List<Pet> pets = petService.findByPetType(petType);
if(pets!=null){
PageInfo page=new PageInfo(pets,3);
return Message.success().add("pageInfo",page);
}else{
return Message.fail();
}
}
}
@Controller
@RequestMapping("apply")
public class ApplyController {
@Autowired
private ApplyService applyService;
@RequestMapping("applys.action")
@ResponseBody
public Message getBlog(@RequestParam(value = "pn",defaultValue = "1") Integer pn){
// 引入PageHelper分页插件
// 在查询之前只需要调用,传入页码,以及每页的大小
PageHelper.startPage(pn,3);
List<Apply> applys = applyService.getApply();
System.out.println(applys);
// startPage后面紧跟的这个查询就是一个分页查询
// 使用pageInfo包装查询后的结果,只需要将pageInfo交给页面就行了。
// 封装了详细的分页信息,包括有我们查询出来的数据,传入连续显示的页数
PageInfo page=new PageInfo(applys,2);
return Message.success().add("pageInfo",page);
}
@RequestMapping("create.action")
@ResponseBody
public Message addApply(Apply apply){
apply.setApplyTime(new Date());
apply.setState(2);
int i = applyService.addApply(apply);
if(i>0){
return Message.success();
}else{
return Message.fail();
}
}
@RequestMapping("delete.action")
@ResponseBody
public Message deleteApply(Integer id){
int i = applyService.deleteApply(id);
if(i>0){
return Message.success();
}else {
return Message.fail();
}
}
@RequestMapping("update.action")
@ResponseBody
public Message updateApply(Apply apply){
if(applyService.updateApply(apply)>0){
return Message.success();
}else{
return Message.fail();
}
}
@RequestMapping("findById.action")
@ResponseBody
public Message findById(Integer id){
Apply apply=applyService.findById(id);
if(apply!=null){
return Message.success().add("apply",apply);
}else{
return Message.fail();
}
}
@RequestMapping("findByState.action")
@ResponseBody
public Message findByTime(@RequestParam(defaultValue ="1",value = "pn") Integer pn,Integer state){
PageHelper.startPage(pn,4);
List<Apply> states = applyService.findByState(state);
if(states!=null){
PageInfo page=new PageInfo(states,3);
return Message.success().add("pageInfo",page);
}else{
return Message.fail();
}
}
}
6.参考论文
7.总结
本系统实现了基于JSP的流浪猫狗救助系统的功能。在本系统的开发过程中,本人受益匪浅。首先,本人认识到了代码规范的重要性,特别是在一些大型项目中,用到的函数可能有数百个,如果编写的代码不规范会给后期的检查带来极大的麻烦。而且完整的代码测试也非常重要,有些错误可能在很久以后才能发现。其次,本人意识到了软件设计的重要性,原来接触的项目往往是快速开发类型的,几乎不需要在软件的逻辑设计上花费太多时间,往往可以边开发边进行下一步的设计。但是这一次本人意识到做软件设计很重要,当初一个设计没注意,可能造成后来的编码大面积的返工。最后就是调试方法的重要性,系统的调试过程要比开发过程繁琐的多。每个操作、每次向服务器提交请求,其实都包括了很多小段代码的执行,如果不能够采用正确的调试方法,就很难找出程序中的错误。
该系统还有许多可扩充的功能,比如加入动物救助站的角色。来管理宠物,还有明细表的管理存在很多不足的地方,订单的管理也存在一定的缺陷等等。由于时间有限,本人暂时还无法使功能完善,但是本人想日后的努力中肯定能做出更完善的系统。
喜欢的点赞收藏加关注私信作者沟通交流