首页 > 编程语言 >基于Java的宠物领养管理系统

基于Java的宠物领养管理系统

时间:2024-07-03 13:55:29浏览次数:19  
标签:领养 Java 宠物 用户 user return Message 主键

目录

        一、 系统简介

1.需求分析

2 .编程环境与工具

二、 系统总体设计

1. 系统的功能模块图

2. 系统架构

3. 系统部署和测试步骤

4. 各功能模块简介

(1) 主页:

(2) 宠物知识:

(3) 领养中心:

(4) 团队博客:

(5) 团队展示:

(6) 注册/登录:

三、 主要业务流程

1. 用户及管理员登录流程图

2. 信息添加流程

3. 信息删除流程

四、 数据库的设计

五、 系统功能详细实现及效果图

1. 首页

2. 宠物知识:

3. 领养中心:

4. 团队博客:

5. 团队展示:

6. 注册/登录:

六、 总结

1.需求分析

随着国内经济的不断发展,人民收入水平的提高以及对于情感需求的日益增强,宠物饲养成为了一种流行趋势。宠物的增多不可避免地造成了流浪宠物的泛滥,它们大多来自被主人遗弃的动物或这些动物繁衍的后代。它们没有管束,游走在人类居住区的边缘,给人们的生活带来了不小的困扰。如今也存在由爱心人士组织的流浪动物救助站收养一些流浪狗,但有时救助站的宠物过多,难以应付以致很多宠物都只能被执行“安乐死”。为了解决当前的流浪宠物问题,传统低效的线下登记领养逐渐被取代,随之而来的是使用终端设备便可浏览访问的宠物领养系统。通过这种宠物领养系统,效率比起传统线下登记形式有了很大的提高。该系统为需要领养宠物的用户提供了一个便利的领养平台。

宠物领养系统开发的意义就是为了便于宠物的管理,减少流浪宠物的数量,增强人们对动物的爱心,满足人们的养宠需求。

2 .编程环境与工具

  1. 系统架构:采用 B/S 架构,基于 JavaWeb 技术实现。
  2. 数据库设计:使用关系型数据库,如 MySQL 或 Oracle 等。
  3. 技术框架:Servlet JDBC Java JSP spring springmvc等。

根据本系统体系结构特点和使用本系统的用户特点,编程环境与工具的配置如表1-1所示:

表1-1 开发环境

Tab. 1-1 Development environment table

类别

标准配置

开发语言

Java

开发工具

IDEA

开发环境

JDK 8.0

服务器

Tomcat 8.0

数据库

MySql 5.6

技术体系

spring springmvc

  1. 系统架构
  1.  表示层:使用 JSP 页面作为用户界面,展示宠物管理系统的各项功能和数据。
  2.  控制层:使用 Servlet 来处理用户请求,根据请求的类型调用相应的业务逻辑方法。
  3.  业务逻辑层:实现宠物管理的具体业务逻辑,包括对数据库的操作。
  4.  数据访问层:使用 JDBC 连接 MySQL 数据库,执行 SQL 语句来进行数据的增删改查操作。
  5. 系统部署和测试步骤
  6.  搭建开发环境:安装 JDK、Tomcat 服务器和 MySQL 数据库。
  7.  配置数据库连接:在 Tomcat 的配置文件中设置数据库连接的相关信息,如用户名、密码、数据库地址等。
  8.  部署系统:将开发完成的宠物管理系统部署到 Tomcat 服务器上。
  9.  进行功能测试:使用不同用户角色登录系统,测试各项功能是否正常工作。
  10.  进行性能测试:测试系统在高并发情况下的性能表现,如响应时间、吞吐量等。
  11.  进行安全测试:测试系统的安全性,如用户认证、授权等。
  12. 各功能模块简介
  13. 主页:

轮播图:在主页的顶部展示一系列图片,用于展示宠物或与宠物相关的活动。

网站简介:简要介绍宠物管理系统的目的和功能。

宠物展示:展示一些可爱的宠物图片和信息,吸引用户的兴趣。

联系方式:提供管理员或团队的联系信息,如电子邮件地址或电话号码。

  1. 宠物知识:

文章和指南:发布关于宠物饲养、护理、训练等方面的知识文章和指南。

  1. 领养中心:

宠物列表:展示可供领养的宠物的信息,包括照片、品种、年龄、性别等。

领养申请:提供用户填写领养申请表格的功能,以便有兴趣的人申请领养宠物。

审核和匹配:管理员可以审核领养申请,并根据申请人的条件和宠物的需求进行匹配。

  1. 团队博客:

团队动态:发布团队成员的活动、项目进展或与宠物相关的故事。

  1. 团队展示:

团队成员介绍:展示团队成员的照片和个人简介。

团队愿景和使命:阐述团队的目标和价值观。

  1. 注册/登录:

用户注册:提供用户注册功能,以便他们创建个人账户。

用户登录:允许已注册用户登录系统,以访问其他受限功能。

用表格列出表的结构及说明表中主要列的作用。

ID

名称

类型

是否主键

解释

1

id

int

不能

编号

2

adminName

varchar

不是主键

不能

管理员

3

adminPwd

varchar

不是主键

不能

密码

4

realName

varchar

不是主键

不能

密码

5

telephone

varchar

不是主键

不能

电话

6

Email

varchar

不是主键

不能

邮箱

7

birthday

date

不是主键

不能

生日

8

sex

varchar

不是主键

不能

性别

9

pic

varchar

不是主键

不能

图片

10

remark

varchar

不是主键

不能

介绍

这个表结构用于存储管理员的信息,包括编号、管理员名称、密码、真实姓名、电话号码、电子邮件地址、生日、性别、图片和介绍等。其中,主键 id 用于确保每个管理员记录的唯一性,其他列则提供了关于管理员的详细信息。通过这个表,可以管理和查询管理员的相关数据。

ID

名称

类型

是否主键

解释

1

id

int

不能

编号,用于唯一标识每个记录

2

userId

int

不是主键

不能

用户 ID,与用户表关联

3

replayId

int

不是主键

不能

回复 ID,与回复表关联

4

commentId

int

不是主键

不能

评论 ID,与评论表关联

5

answerTime

date

不是主键

不能

回答时间c

6

content

varchar

不是主键

不能

内容,用于存储回答的文本信息

这个表用于存储用户的回答信息,包括编号、用户 ID、回复 ID、评论 ID、回答时间和内容。其中,编号是主键,用于唯一标识每个回答记录。其他列提供了与用户、回复和评论的关联信息,以及回答的时间和具体内容。

ID

名称

类型

是否主键

解释

1

id

int

不能

编号,用于唯一标识每个记录

2

name

varchar

不是主键

不能

姓名

3

email

varchar

不是主键

不能

电子邮件地址

4

age

int

不是主键

不能

年龄

5

telephone

varchar

不是主键

不能

电话号码

6

message

varchar

不是主键

不能

留言信息

7

applyTime

date

不是主键

不能

申请时间

8

state

int

不是主键

不能

状态

这个表用于存储用户的申请信息,包括编号、姓名、电子邮件地址、年龄、电话号码、留言信息、申请时间和状态。其中,编号是主键,用于唯一标识每个申请记录。其他列提供了关于申请者的详细信息以及申请的时间和状态。

ID

名称

类型

是否主键

解释

1

id

int

不能

编号,用于唯一标识每个记录

2

actionTime

date

不是主键

不能

动作时间,记录事件发生的时间

3

address

varchar

不是主键

不能

地址,事件发生的地点或地址信息

4

peoples

varchar

不是主键

不能

人物,参与事件的人员或相关人物信息

5

event

varchar

不是主键

不能

事件,描述事件的具体内容或名称

6

title

varchar

不是主键

不能

标题,用于为事件提供简短的标题或描述

 

这个表用于存储宠物的相关信息,包括编号、名称、类型、性别、出生日期、照片、状态和备注。其中,编号是主键,用于唯一标识每个宠物记录。其他列提供了关于宠物的详细信息。

ID

名称

类型

是否主键

解释

1

id

int

不能

编号,用于唯一标识每个用户记录

2

userName

varchar

不是主键

不能

用户名,用于登录和显示用户的名称

3

password

varchar

不是主键

不能

密码,用于验证用户的身份和保护用户信息的安全

4

sex

varchar

不是主键

不能

性别,用于表示用户的性别信息(如:男、女)

5

age

int

不是主键

不能

年龄,用于记录用户的年龄信息

6

telephone

varchar

不是主键

不能

电话号码,用于联系用户或进行验证等操作

7

Email

varchar

不是主键

不能

电子邮件地址,用于与用户进行通信和发送通知等

8

address

varchar

不是主键

不能

地址,用于记录用户的居住或工作地址信息

9

pic

varchar

不是主键

不能

图片路径或 URL,用于显示用户的头像或相关图片

10

state

int

不是主键

不能

状态,用于表示用户的账户状

这个表用于存储用户的基本信息,包括编号、用户名、密码、性别、年龄、电话号码、电子邮件地址、地址、头像和账户状态。其中,编号是主键,用于唯一标识每个用户记录。其他列提供了关于用户的详细信息,用于管理和与用户进行交互。

  1. 首页

这是一个关于宠物猫和狗的生活网站的首页 HTML 代码。它包括以下几个部分:

头部区域:包含网站的 logo和导航链接(<a href="#">猫狗生活</a>)。

欢迎信息:在<div class="about">容器中,展示了一段欢迎文字和关于猫和狗的简短描述。

滑块区域:使用<div class="slider">容器和<ul class="rslides" id="slider">列表来创建一个滑块轮播效果。滑块中包含四张图片和相应的覆盖层,每张图片上都有标题和文本描述。

页脚区域:包含版权信息和一个空的链接(<a href="#">联系我们</a>)。

  1. 宠物知识:

上述文本的标题为“猫狗生活”,首先用两句话描述了人们面对可爱的猫狗时的情感。然后通过一个列表展示了猫和狗的健康、美容、食物和行为等方面的注意事项。接下来,页面提供了两个链接,一个是关于养猫注意事项的,另一个是关于养狗注意事项的。最后,页面展示了一些猫狗的图片,并通过两个模态窗口分别提供了关于猫和狗的更多信息。

  1. 领养中心:

这是一个AdoptAnimalController类的 Java 代码,它包含了用于处理宠物领养相关操作的@RequestMapping注解方法。

agree方法:通过@RequestMapping注解映射到/apply路径,接受一个字符串类型的用户名userName和两个整型参数pageNum和state。该方法内部调用adoptAnimalService的allAdoptAnimal方法,传入用户名、页码、页大小和状态,并将返回的PageInfo<AdoptAnimal>对象转换为Message对象返回。

create方法:通过@RequestMapping注解映射到/create路径,接受一个HttpSession对象。该方法从会话中获取用户和宠物的信息,创建一个AdoptAnimal对象,并调用adoptAnimalService的create方法进行宠物领养的创建操作。

adopts方法:通过@RequestMapping注解映射到/adopts路径,接受一个可选的字符串类型的领养时间adoptTime和一个可选的整型参数pageNum。该方法内部调用adoptAnimalService的all方法,传入领养时间和页码,并将返回的PageInfo<AdoptAnimal>对象转换为Message对象返回。

disAgree方法:通过@RequestMapping注解映射到/disAgree路径,接受一个整型参数id。该方法内部调用adoptAnimalService的update方法,传入指定的id,并将更新结果转换为Message对象返回。

agree方法:通过@RequestMapping注解映射到/agree路径,接受一个整型参数id。该方法内部调用adoptAnimalService的update方法,传入指定的id,并将更新结果转换为Message对象返回。

这些方法主要涉及宠物领养的申请、创建、查询和同意/拒绝操作,通过与adoptAnimalService交互来实现相应的业务逻辑。返回的Message对象用于向用户反馈操作结果

  1. 团队博客:

这是一个BlogServiceImpl的实现类,实现了BlogService接口的方法。

findAllBlog方法根据传入的动作时间、当前页号和每页大小查询博客列表,并返回一个包含博客信息的PageInfo对象。

add方法用于添加一个博客,将博客对象插入数据库。

findById方法根据博客 ID 查询一个博客对象。

updateBlog方法用于更新一个博客的信息。

del方法根据博客 ID 删除一个博客。

blogs方法查询所有博客,并返回一个包含博客信息的PageInfo对象。

这个类中还使用了PageHelper类来进行分页操作,以及EntityWrapper类来构建查询条件。同时,它通过@Resource注解注入了BlogMapper,用于与数据库进行交互。

  1. 团队展示:


这是一个AdminServiceImpl的实现类,实现了AdminService接口的方法。

adminPage方法用于根据管理员姓名、当前页号和每页大小查询管理员列表,并返回一个包含管理员信息的PageInfo对象。

login方法用于根据管理员姓名和密码进行登录验证,如果验证通过,则返回对应的管理员对象,否则返回null。

allAdmin方法用于查询所有管理员,但其实现返回null,可能需要根据实际需求进行修改。

add方法用于添加一个管理员,将管理员对象插入数据库。

update方法用于更新一个管理员的信息。

findById方法用于根据管理员 ID 查询一个管理员对象。

del方法用于根据管理员 ID 删除一个管理员。

这个类中还使用了PageHelper类来进行分页操作,以及EntityWrapper类来构建查询条件。同时,它通过@Resource注解注入了AdminMapper,用于与数据库进行交互。

  1. 注册/登录:

这是一个UserController的 Java 类,其中包含了多个@RequestMapping注解方法,用于处理用户相关的操作,包括创建用户、登录、注销、查询用户列表、查询单个用户、删除用户等。每个方法都会返回一个Message对象,表示操作的结果,其中包含了一个success或fail的状态以及可能的附加数据。

以下是每个方法的简要描述:

add方法:用于创建新用户,将用户对象传递给userService进行添加操作。根据添加的结果返回相应的Message对象。

loginuser方法:用于用户登录,接受用户名和密码作为参数,调用userService的登录方法进行验证。根据登录结果返回相应的Message对象。

logout方法:用于用户注销,调用session.invalidate()方法使当前会话失效。返回一个成功的Message对象。

users方法:用于查询用户列表,接受用户名作为参数(可选),调用userService的方法获取用户列表。返回一个包含用户列表信息的Message对象。

findById方法:用于根据用户 ID 查询单个用户,调用userService的方法获取用户对象。返回一个包含用户信息的Message对象。

del方法:用于删除用户,接受用户 ID 作为参数,调用userService的方法进行删除操作。根据删除的结果返回相应的Message对象。

about方法:用于显示关于页面,返回user/about的视图路径。

error方法:用于显示错误页面,返回user/error的视图路径。

index方法:用于显示索引页面,返回user/index的视图路径。

personalInfo方法:用于显示个人信息页面,返回user/personal-info的视图路径。

service方法:用于显示服务页面,返回user/service的视图路径。

这些方法通过与userService交互来实现相应的用户操作,并使用Message对象返回操作结果。方法的入参和返回类型在注解中有详细说明。

系统设计:在项目开始之前需要对系统进行详细的设计,包括数据库设计、接口设计以及前端设计等,这样可以避免在后期开发中频繁地进行修改和优化。编写代码时,应当遵守一系列严格的规范,例如命名规范、注释规范等,这些规范有助于提升程序的可读性和可保护,从而大大提高程序效能。

异常处理:在进行接口开发时要注意异常处理,保证系统的健壮性和稳定性。

安全性:考虑到系统中可能涉及到用户隐私信息,需要重视系统的安全性,包括账户密码的加密存储、数据传输的加密、防止SQL注入等。

团队协作:在团队协作中要加强沟通和协调,明确任务分工,合理安排时间,确保项目能够按时交付。

测试与部署:在项目开发结束后需要进行充分测试和部署,确保系统可以正常工作,并且能够满足用户的需求。

通过对上述结论的总结,我们可以更好地掌握项目开发的方法和技巧,提高项目的质量和效率。该系统具有良好的可扩展性和适应性,可以根据用户需求和反馈进行改进和升级。同时,系统具有良好的安全性和稳定性,可以保证用户数据的安全和保密。

相关代码

public class UserController {

    @Resource

    private UserService userService;



    @RequestMapping("/create")

    @ResponseBody

    public Message add(User user){

        int add = userService.add(user);

        if(add>0){

            return Message.success();

        }else{

            return Message.fail();

        }

    }



    @RequestMapping("/login")

    @ResponseBody

    public Message loginuser(HttpSession session, String userName, String password){

        User user = userService.loginuser(userName, password);

        if (user != null){

            session.setAttribute("user",user);

            return Message.success().add("user",user);

        }else{

            return Message.fail();

        }

    }

    @RequestMapping("/logout")

    @ResponseBody

    public Message logout(HttpSession session){

        session.invalidate();

        return Message.success();

    }



    @RequestMapping("/users")

    @ResponseBody

    public Message users(@RequestParam(required = false) String userName, @RequestParam("pn")Integer pageNum){

        Integer pageSize = 4;

        PageInfo<User> users = userService.allUser(userName,pageNum,pageSize);

        return Message.success().add("pageInfo",users);

    }



    @RequestMapping("findById")

    @ResponseBody

    public Message findById(Integer id){

        User byId = userService.findById(id);

        return Message.success().add("user",byId);

    }



    @RequestMapping("/delete")

    @ResponseBody

    public Message del(Integer id){

        int del = userService.del(id);

        if(del>0){

            return Message.success();

        }else {

            return Message.fail();

        }

    }



    @RequestMapping("/about")

    public String about(){

        return "user/about";

    }



    @RequestMapping("/error")

    public String error(){

        return "user/error";

    }



    @RequestMapping("/index")

    public String index(){

        return "user/index";

    }



    @RequestMapping("/personal-info")

    public String personalInfo(){

        return "user/personal-info";

    }



    @RequestMapping("/service")

    public String service(){

        return "user/service";

    }



    @RequestMapping("/show")

    public String show(){

        return "user/show";

    }



    @RequestMapping("/team")

    public String team(){

        return "user/team";

    }



    @RequestMapping("/teamBlog")

    public String teamBlog(){

        return "user/teamBlog";

    }



    @RequestMapping("/update")

    @ResponseBody

    public Message update(User user){

        Integer update = userService.update(user);

        if(update > 0){

            return Message.success();

        }else {

            return Message.fail();

        }

    }



    @RequestMapping("/updatePic")

    @ResponseBody

    public Message updatePic(HttpSession session, MultipartFile file){

        String fileName = FileLoad.uploadUserPic(file);

        User user = (User) session.getAttribute("user");

        user.setPic(fileName);

        Integer update = userService.update(user);

        if (update > 0){

            return Message.success();

        }else {

            return Message.fail();

        }

    }

}
public class AdminServiceImpl implements AdminService {

    @Resource

    private AdminMapper adminMapper;

    @Override

    public PageInfo<Admins> adminPage(String adminName, Integer pageNum, Integer pageSize) {

        PageHelper.startPage(pageNum,pageSize);

        EntityWrapper wrapper = new EntityWrapper();

        if(adminName != null && !"".equals(adminName)){

            wrapper.like("adminName",adminName);

        }

        List list = adminMapper.selectList(wrapper);

        PageInfo<Admins> pageInfo = new PageInfo<>(list);

        return pageInfo;

    }



    @Override

    public Admins login(String adminName, String adminPwd) {

        Admins a = new Admins();

        a.setAdminName(adminName);

        Admins admin = adminMapper.selectOne(a);

        if (admin != null && admin.getAdminPwd().equals(adminPwd)){

            return admin;

        }

        return null;

    }



    @Override

    public PageInfo<Admins> allAdmin(String adminName, int pageNum, int pageSize) {

        return null;

    }



    @Override

    public int add(Admins admins) {

        return adminMapper.insert(admins);

    }



    @Override

    public int update(Admins admins) {

        return adminMapper.updateById(admins);

    }



    @Override

    public Admins findById(Integer id) {

        return adminMapper.selectById(id);

    }



    @Override

    public int del(Integer id) {

        return adminMapper.deleteById(id);

    }

}

标签:领养,Java,宠物,用户,user,return,Message,主键
From: https://blog.csdn.net/weixin_45506061/article/details/140149728

相关文章

  • 【Java完整版 面试必备】Leetcode Top100题目和答案-矩阵篇
    目录以下摘自leetcodeTop100精选题目-矩阵篇​矩阵置零螺旋矩阵旋转图像搜索二维矩阵II以下摘自leetcodeTop100精选题目-矩阵篇矩阵置零给定一个 mxn 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。示例:输入:matrix......
  • JAVA妇产科专科电子病历系统源码,前端框架:Vue,ElementUI
    JAVA妇产科专科电子病历系统源码,前端框架:Vue,ElementUI孕产妇健康管理信息管理系统是一种将孕产妇健康管理信息进行集中管理和存储的系统。通过建立该系统,有助于提高孕产妇健康管理的效率和质量,减少医疗事故发生的可能性,管理医疗资源,保证孕产妇得到及时、准确的医疗服务。该系......
  • java的常用技术
    1、java集合(Iterable、List、Set、Map,JUC安全性集合)2、hashmap(原理,延申)、ConcurrentHashMap(锁:1.8是synchronized+node,1.7是segment)3、乐观锁(比较/交换)AtomicInteger是Java中的一个原子类4、悲观锁synchronized5、线程池运行状态运行过程其他......
  • Java中semaphore的具体解释产生原因和使用场景
    Semaphore(信号量)信号量(Semaphore)是一种用于控制多个线程对共享资源访问的同步机制。它实质上是一个计数器,可以用来限制能够访问某些资源的线程数量。信号量可以是二进制的(只允许一个线程访问)或计数的(允许多个线程访问,具体数目由信号量的值决定)。信号量产生的原因信号量最......
  • Java基础——常用类库
    在Java编程的世界里,掌握并熟练使用类库是提高开发效率和代码质量的关键。本文将深入探讨几个常用的Java类库,包括它们的功能、应用场景以及如何有效利用它们来优化你的项目。1. CollectionsFramework简介:Java的集合框架(CollectionsFramework)提供了实现数据结构如列表、集......
  • Java基础——线程
    在当今的软件开发中,多线程技术是提升程序性能、实现并发处理的关键所在。Java作为一款广泛应用的编程语言,其内置的多线程支持为开发者提供了强大的工具箱。本文将深入探讨Java中的线程概念,包括线程的创建、生命周期、同步机制以及一些常见的问题和解决方案。1.线程的基本概念......
  • Java基础——日期操作类
    在Java中,处理日期和时间一直是一个复杂但又至关重要的任务。从早期的java.util.Date和java.util.Calendar,到Java8引入的java.time包,我们见证了日期和时间API的显著改进。本文将带你深入了解这些变化,并重点介绍如何使用java.time包中的类进行高效、准确的日期操作。1.回顾过......
  • redis - [05] Java & Redis
    题记部分 一、准备工作下载jedis.jar或者在maven配置文件中配置jar包依赖 二、连接redisimportredis.clients.jedis.Jedis;publicclassRedisJava{publicstaticvoidmain(String[]args){//连接本地的Redis服务Jedisjedis=newJed......
  • 55、Flink 中使用 Java Lambda 表达式详解
    1)概述1.注意Flink支持对JavaAPI的所有算子使用Lambda表达式,但是,当Lambda表达式使用Java泛型时,需要显式地声明类型信息。2.示例和限制示例:map()函数使用Lambda表达式计算输入值的平方。不需要声明map()函数的输入i和输出参数的数据类型,因为Java编......
  • 【文档+源码+调试讲解】jspm宠物论坛设计网站
    摘 要宠物论坛设计网站采用B/S模式,促进了宠物论坛设计网站的安全、高效、快捷的发展。传统的管理模式还处于手工处理阶段,管理效率极低,随着用户的不断增多,传统基于手工管理模式已经无法满足当前用户需求,随着信息化时代的到来,使得宠物论坛设计网站的开发成了必然。本网站系......