SpringBoot+Mybatis+Mysql+Vue+ElementUi实现一个《流浪猫狗领养救助管理系统》毕业设计(超详细教程)

哈喽,大家好!我是胡广,今天给大家带来的一个《流浪猫狗领养救助管理系统》,制作时间花费了....嗯....大概两周的时间吧,如果喜欢可以点赞、收藏、关注三连,也可以评论私信啥的哦,我看见了就会第一时间回复的。

话不多说咱们直接开整吧,冲啊!!!冲啊!!!冲啊!!!

开发技术及开发工具

开发工具采用Idea【前后端代码的编写】、Navicat Premium 15【Mysql数据库的连接】

前端采用Vue、ElementUI

后端采用SpringBoot、Mybatis

数据库采用Mysql

记得以上的技术所需要的环境都得装好哟,这里就不跟大家说怎么去装了,百度就ok了

然后这个毕业设计是没有进行前后端分离的哦

系统结构图

内置功能

1.登录功能

2.系统管理:用户管理、角色管理、菜单管理、个人信息管理

3.救助站管理:救助站信息

4.领养管理:待领养信息、领养信息

5.养宠攻略管理:攻略信息

6.交流消息管理:消息信息
7.捐赠支出管理:捐赠支出信息

PS:角色一开始分为管理员与普通用户,大家可以根据自己的喜好来添加角色和角色的权限

系统演示图

先上一个处理跨域请求的类吧,否则前端请求不到后端接口地址哦,因为是不同域、不同端口的,这里我的项目是单体的所以其实这个跨域问题也不用解决,贴出来让大家注意一下,以后做前后端分离的系统的话就要处理这些东西了

package com.user.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * 解决跨域问题
 */
@Configuration
public class CorsConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOriginPatterns("*")
                .allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS")
                .allowCredentials(true)
                .maxAge(3600)
                .allowedHeaders("*");
    }
}

附上整个项目的springboot配置文件

#控制台日志输出
logging:
    level:
        com:
            user:
                '*': debug

server:
    #设置端口号
    port: 1234
spring:
    #设置数据源mysql数据库的连接驱动、连接地址、数据库密码、数据库用户名
    datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        password: 123456
        url: jdbc:mysql://localhost:3306/animal_rescue?serverTimezone=UTC
        username: root
    #啥玩意模板,有点忘了
    thymeleaf:
        prefix: classpath:/templates/
        suffix: .html

1.登录功能(小猫猫是不是很可爱呢...嘻嘻嘻)

2.系统管理:用户管理、角色管理、菜单管理、个人信息管理

PS:用户管理本来还想通过soket来实现一个聊天的子系统,想了想这玩意也没啥就搁置了,哈哈哈,主要还是太懒了

 User的Controller展现层

CONTROLLER层

  • 控制层,实现对Get和Post的相应
  • 用于前后端交互,service层和前端通过Controller层进行数据交互

(以下只是部分代码,详情请去文尾下载完整版)

package com.user.controller;

import com.user.model.User;
import com.user.service.IUserService;
import com.user.utils.Result;
import org.apache.ibatis.annotations.Delete;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    IUserService iUserService;
    //用户登录
    @GetMapping("{fullname}/{password}")
    public Result tologin(@PathVariable String fullname,@PathVariable String password){
        return iUserService.u(fullname, password);
    }
    //查寻所有用户以及其角色信息
    @GetMapping("/info")
    public Result getUserInfo(){
        return new Result(true,iUserService.selectUserByRoleId());
    }
    //删除用户
    @DeleteMapping("{userid}")
    public Result delUser(@PathVariable String userid){
        return new Result(iUserService.delUser(userid));
    }
    //新增用户
    @PostMapping
    public Result addUser(@RequestBody User user){
        boolean flag = iUserService.addUser(user);
        return new Result(flag, flag ? "添加成功^_^" : "因已有重复账号,添加失败-_-!");
    }
    //根据编号查询用户
    @GetMapping("/selectUserById/{userid}")
    public Result selectUserById(@PathVariable(name = "userid") String userid){
        return new Result(true,iUserService.selectUserById(userid));
    }
    //修改用户
    @PutMapping
    public Result updateUserById(@RequestBody User user){
        boolean flag = iUserService.updateUserById(user);
        return new Result(flag, flag ? "修改成功^_^" : "因已有重复账号,修改失败-_-!");
    }

}

 User功能的Service接口层

SERVICE层

  • 业务逻辑层,用于完成功能设计
  • 一般用于调用dao层的接口,实现业务功能

(以下只是部分代码,详情请去文尾下载完整版)

package com.user.service;

import com.user.model.User;
import com.user.utils.Result;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.util.List;

public interface IUserService {
    //登录
    Result u(String fullname, String password);
    //查询用户与之对应的角色
    List<User> selectUserByRoleId();
    //根据id删除用户
    Boolean delUser(String userid);
    //新增用户
    Boolean addUser(User user);
    //根据id查询用户
    User selectUserById(String userid);
    //根据id修改用户信息
    Boolean updateUserById(User user);
}

 User功能的Service接口的Impl实现层

SERVICE层

  • 业务逻辑层,用于完成功能设计
  • 一般用于调用dao层的接口,实现业务功能

(以下只是部分代码,详情请去文尾下载完整版)

package com.user.service.impl;

import com.user.dao.RoleDao;
import com.user.dao.UserDao;
import com.user.model.Role;
import com.user.model.User;
import com.user.service.IUserService;
import com.user.utils.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.List;
import java.util.UUID;

@Service
public class UserServiceImpl implements IUserService {
    @Autowired
    UserDao userDao;
    @Autowired
    RoleDao roleDao;
    //登录
    @Override
    public Result u(String fullname, String password) {
        User user =userDao.u(fullname,password);

        if(StringUtils.isEmpty(user)){
            return new Result(false);
        }else {
            user.setRole(roleDao.r(user.getUserid()));
            return new Result(true,user);
        }
    }
    //查询用户与之对应的角色
    @Override
    public List<User> selectUserByRoleId() {
        List<User> user = userDao.getUser();
        for (User u: user) {
            Role r = roleDao.r(u.getUserid());
            if(!StringUtils.isEmpty(r)){
                u.setRoleName(r.getRolename());
            }
        }
        return user;
    }
    //根据id删除用户
    @Override
    public Boolean delUser(String userid) {
        userDao.delUserRole(userid);
        return userDao.delUser(userid)>0;
    }
    //新增用户
    @Override
    public Boolean addUser(User user) {
        List<User> list = userDao.getUser();
        for (User u: list) {
            if(u.getFullname().equals(user.getFullname())){
                return false;
            }
        }
        String uuid = UUID.randomUUID().toString().replaceAll("-","");
        //设置新增用户编号自增1
        user.setUserid(uuid);
        //新增用户角色
        userDao.addUserRole(user);
        return userDao.addUser(user)>0;
    }
    //根据id查询用户
    @Override
    public User selectUserById(String userid) {
        User user = userDao.selectUserById(userid);
        Role r = roleDao.r(user.getUserid());
        user.setRoleName(r.getRolename());
        user.setBackup(r.getRoleid());
        return user;
    }
    //根据id修改用户信息
    @Override
    public Boolean updateUserById(User user) {
        List<User> list = userDao.getUser();
        for (User u: list) {
            if(u.getFullname().equals(user.getFullname())){
                if(u.getFullname().equals(user.getBackup3())){
                    //如果当前用户账号等于数据库里的账号
                }else{
                    return false;
                }
            }
        }


        //修改根据角色编号修改用户角色
        roleDao.updateRoleUser(user.getBackup(),user.getUserid());
        return userDao.updateUserById(user)>0;
    }
}

 User功能的Dao数据持久化层

DAO层

  • 数据持久层,用于存放sql语句,在SpringBoot中用注解来为每一个方法注入sql语句
  • 又称为mapper层

这一层请注意,我用的是mybatis的注解sql,并没有在mapper的xml里使用sql语句哦

(以下只是部分代码,详情请去文尾下载完整版)

package com.user.dao;

import com.user.model.User;
import org.apache.ibatis.annotations.*;
import java.util.List;

@Mapper
public interface UserDao {
    //登录验证
    @Select("select * from user where fullname = #{fullname} and password = #{password}")
    User u(String fullname,String password);
    //查询所有用户
    @Select("select * from user")
    List<User> getUser();
    //根据id删除用户
    @Delete("DELETE from user where userid=#{userid}")
    Integer delUser(String userid);
    //根据id删除用户对应的角色
    @Delete("DELETE from userrole where userid=#{userid}")
    Integer delUserRole(String userid);
    //新增用户
    @Insert("insert into user (userid,fullname,password)\n" +
            "value\n" +
            "(#{userid},#{fullname},#{password})")
    Integer addUser(User user);
    //查询所有用户
    @Select("select * from user order by userid DESC limit 1;")
    User selectUserCount();
    //新增用户角色
    @Insert("insert into userrole (roleid,userid)\n" +
            "value\n" +
            "(#{backup},#{userid})")
    Integer addUserRole(User user);
    //根据id查询用户
    @Select("select * from user where userid = #{userid}")
    User selectUserById(String userid);
    //根据id修改用户账号密码
    @Update("UPDATE user SET " +
            "fullname = #{fullname}, " +
            "password = #{password},  " +
            "username = #{username}," +
            "identity = #{identity}," +
            "sex = #{sex}," +
            "age = #{age}," +
            "area = #{area}," +
            "address = #{address}," +
            "phone = #{phone}\n" +
            "WHERE userid = #{userid}")
    Integer updateUserById(User user);
}

 User功能的Model实体层

MODEL层

  • model层,又称:数据访问层
  • 一张表对应一个实体类

这一层的类,我用的是mybatis-plus的maven插件自动生成数据库对应的字段以及表的实体类

(以下只是部分代码,详情请去文尾下载完整版)

package com.user.model;

import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

import java.io.Serializable;

/**
 * <p>
 * 
 * </p>
 *
 * @author 关爱流浪猫狗,从我做起!
 * @since 2022-02-19
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class User implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 用户编号
     */
    private String userid;

    /**
     * 用户账号
     */
    private String fullname;

    /**
     * 用户密码
     */
    private String password;

    /**
     * 用户姓名
     */
    private String username;

    /**
     * 用户身份证
     */
    private String identity;

    /**
     * 用户性别(0女,1男)
     */
    private String sex;

    /**
     * 用户年龄
     */
    private String age;

    /**
     * 用户所在地区
     */
    private String area;

    /**
     * 用户具体地址
     */
    private String address;

    /**
     * 用户手机号
     */
    private String phone;

    /**
     * 备用1
     */
    private String backup;

    /**
     * 备用2
     */
    private String backup2;

    /**
     * 备用3
     */
    private String backup3;

    /**
     * 用户_角色
     */
    private Role role;

    /**
     * 角色名称
     */
    private String roleName;
}

3.救助站管理:救助站信息

 救助站的Controller展现层

CONTROLLER层

  • 控制层,实现对Get和Post的相应
  • 用于前后端交互,service层和前端通过Controller层进行数据交互

(以下只是部分代码,详情请去文尾下载完整版)

package com.user.controller;


import com.user.model.Station;
import com.user.service.IStationService;
import com.user.utils.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * <p>
 * 救助站表 前端控制器
 * </p>
 *
 * @author 关爱流浪猫狗,从我做起!
 * @since 2022-02-19
 */
@RestController
@RequestMapping("/station")
public class StationController {
    @Autowired
    IStationService iStationService;
    //查询所有救助站信息
    @GetMapping("/list")
    public Result getStationAll(){
        return new Result(true,iStationService.getStationAll());
    }
    //根据编号查询救助站信息
    @GetMapping("/getStationOne/{staId}")
    public Result getStationOne(@PathVariable String staId){
        return new Result(true,iStationService.getStationOne(staId));
    }
    //删除救助站
    @DeleteMapping("{staId}")
    public Result delStation(@PathVariable String staId){
        String[] sta = staId.split(",");
        for (String id : sta){
            iStationService.delStation(id);
        }
        return new Result(true);
    }
    //新增救助站
    @PostMapping("/addStation")
    public Result addStation(@RequestBody Station station){
        boolean flag = iStationService.addStation(station);
        return new Result(flag, flag ? "添加成功^_^" : "添加失败-_-!");
    }
    //根据救助站名称、容量、地区、地址模糊查询
    @PostMapping("/selectStationByCriteria")
    public Result selectStationByCriteria(@RequestBody Station station){
        return new Result(true,iStationService.selectStationByCriteria(station));
    }
    //修改救助站
    @PostMapping("/udpateStation")
    public Result updateStationById(@RequestBody Station station){
        boolean flag = iStationService.updateStationById(station);
        return new Result(flag, flag ? "修改成功^_^" : "修改失败-_-!");
    }
}

救助站功能的Service接口层

SERVICE层

  • 业务逻辑层,用于完成功能设计
  • 一般用于调用dao层的接口,实现业务功能

(以下只是部分代码,详情请去文尾下载完整版)

package com.user.service;

import com.user.model.Role;
import com.user.model.Station;
import com.user.model.User;
import com.user.utils.Result;
import org.apache.ibatis.annotations.Select;

import java.util.List;

public interface IStationService {
    //查询所有救助站信息
    List<Station> getStationAll();
    //根据编号查询救助站信息
    Station getStationOne(String staId);
    //根据id删除救助站
    Boolean delStation(String staId);
    //新增救助站
    Boolean addStation(Station station);
    //模糊查询救助站
    List<Station> selectStationByCriteria(Station station);
    //根据编号修改救助站
    Boolean updateStationById(Station station);
}

救助站功能的Service接口的Impl实现层

SERVICE层

  • 业务逻辑层,用于完成功能设计
  • 一般用于调用dao层的接口,实现业务功能

(以下只是部分代码,详情请去文尾下载完整版)

package com.user.service.impl;

import com.user.dao.StationDao;
import com.user.model.Menu;
import com.user.model.Station;
import com.user.service.IStationService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Arrays;
import java.util.List;

@Service
public class StationServiceImpl implements IStationService {
    @Autowired
    StationDao stationDao;

    //查询所有救助站信息
    @Override
    public List<Station> getStationAll() {
        List<Station> station = stationDao.getStationAll();
        return station;
    }
    //根据编号查询救助站信息
    @Override
    public Station getStationOne(String staId) {
        return stationDao.getStationOne(staId);
    }
    //根据id删除救助站
    @Override
    public Boolean delStation(String staId) {
        return stationDao.delStation(staId)>0;
    }
    //新增救助站
    @Override
    public Boolean addStation(Station station) {
        return stationDao.addStation(station)>0;
    }
    //模糊查询救助站
    @Override
    public List<Station> selectStationByCriteria(Station station) {
        //名称
        //容量
        //地区
        //地址
        List<Station> sta = stationDao.selectStationByCriteria(station);
        return sta;
    }
    //根据编号修改救助站
    @Override
    public Boolean updateStationById(Station station) {
        return stationDao.updateStationById(station)>0;
    }
}

 救助站功能的Dao数据持久化层

DAO层

  • 数据持久层,用于存放sql语句,在SpringBoot中用注解来为每一个方法注入sql语句
  • 又称为mapper层

这一层请注意,我用的是mybatis的注解sql,并没有在mapper的xml里使用sql语句哦

(以下只是部分代码,详情请去文尾下载完整版)

package com.user.dao;

import com.user.model.Menu;
import com.user.model.Role;
import com.user.model.Station;
import org.apache.ibatis.annotations.*;

import java.util.List;

@Mapper
public interface StationDao {
    //查询所有救助站信息
    @Select("select * from station")
    List<Station> getStationAll();
    //根据编号查询救助站信息
    @Select("select * from station where sta_id = #{staId}")
    Station getStationOne(String staId);

    //根据id删除救助站
    @Delete("delete from station where sta_id = #{staId}")
    Integer delStation(String staId);

    //新增救助站
    @Insert("insert into `station`(sta_name,capacity,set_time,area,address,phone)\n" +
            "values" +
            "(#{staName},#{capacity},#{setTime},#{area},#{address},#{phone})")
    Integer addStation(Station station);
    //模糊查询救助站
    @Select({"<script>","select * from station\n" +
            "where 1=1",
            //判断救助站名称是否为空
            "<if test='staName!=null and staName != \"\"'>",
            "AND sta_name like '%${staName}%' \n" ,"</if>",
            //判断救助站容量是否为空
            "<if test='capacity!=null and capacity != \"\"'>",
            "AND capacity = #{capacity}\n" ,"</if>",
            //判断地区是否为空
            "<if test='area!=null and area != \"\"'>",
            "AND area like '%${area}%' \n","</if>",
            //判断地址是否为空
            "<if test='address!=null and address != \"\"'>",
            "AND address like '%${address}%' \n" ,"</if>",
            "</script>"})
    List<Station> selectStationByCriteria(Station station);
    //根据编号修改救助站
    @Update("    update station\n" +
            "    set sta_name = #{staName},\n" +
            "      capacity = #{capacity},\n" +
            "      set_time = #{setTime},\n" +
            "      area = #{area},\n" +
            "      address = #{address},\n" +
            "      phone = #{phone},\n" +
            "      backup = #{backup},\n" +
            "      backup2 = #{backup2},\n" +
            "      backup3 = #{backup3}\n" +
            "    where sta_id = #{staId}")
    Integer updateStationById(Station station);
}

 救助站功能的Model实体层

MODEL层

  • model层,又称:数据访问层
  • 一张表对应一个实体类

这一层的类,我用的是mybatis-plus的maven插件自动生成数据库对应的字段以及表的实体类

(以下只是部分代码,详情请去文尾下载完整版)

package com.user.model;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.sql.Date;
import java.time.LocalDateTime;

/**
 * <p>
 * 救助站表
 * </p>
 *
 * @author 关爱流浪猫狗,从我做起!
 * @since 2022-02-19
 */
@Data
public class Station implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 救助站编号
     */
    @TableId(value = "sta_id", type = IdType.AUTO)
    private Integer staId;

    /**
     * 救助站名称
     */
    private String staName;

    /**
     * 救助站容量
     */
    private String capacity;

    /**
     * 救助站成立时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss")
    private Date setTime;

    /**
     * 救助站所在地区
     */
    private String area;

    /**
     * 救助站具体地址
     */
    private String address;

    /**
     * 救助站联系方式
     */
    private String phone;

    /**
     * 备用列1
     */
    private String backup;

    /**
     * 备用列1
     */
    private String backup2;

    /**
     * 备用列3
     */
    private String backup3;


}

4.领养管理:待领养信息、领养信息

   领养管理Controller展现层

CONTROLLER层

  • 控制层,实现对Get和Post的相应
  • 用于前后端交互,service层和前端通过Controller层进行数据交互

(以下只是部分代码,详情请去文尾下载完整版)

package com.user.controller;


import com.user.model.Adopt;
import com.user.service.IAdoptService;
import com.user.utils.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * <p>
 * 领养信息表 前端控制器
 * </p>
 *
 * @author 关爱流浪猫狗,从我做起!
 * @since 2022-02-19
 */
@RestController
@RequestMapping("/adopt")
public class AdoptController {
    @Autowired
    IAdoptService iAdoptService;
    //查询所有宠物领养信息信息
    @GetMapping("/list")
    public Result getAdoptAll(){
        return new Result(true,iAdoptService.getAdoptAll());
    }
    //根据编号查询宠物领养信息信息
    @GetMapping("/getAdoptOne/{adId}")
    public Result getAdoptOne(@PathVariable String adId){
        return new Result(true,iAdoptService.getAdoptOne(adId));
    }
    //删除宠物领养信息
    @DeleteMapping("{adId}")
    public Result delAdopt(@PathVariable String adId){
        String[] sta = adId.split(",");
        for (String id : sta){
            iAdoptService.delAdopt(id);
        }
        return new Result(true);
    }
    //根据宠物领养信息模糊查询
    @PostMapping("/selectAdoptByCriteria")
    public Result selectAdoptByCriteria(@RequestBody Adopt adopt){
        System.out.println(adopt.getAn().getAnName());
        System.out.println(adopt.getUser().getUsername());
        return new Result(true,iAdoptService.selectAdoptByCriteria(adopt));
    }
    //修改宠物领养信息
    @PutMapping
    public Result updateAdoptById(@RequestBody Adopt adopt){
        boolean flag = iAdoptService.updateAdoptById(adopt);
        return new Result(flag, flag ? "修改成功^_^" : "修改失败-_-!");
    }
}

领养管理功能的Service接口层

SERVICE层

  • 业务逻辑层,用于完成功能设计
  • 一般用于调用dao层的接口,实现业务功能

(以下只是部分代码,详情请去文尾下载完整版)

package com.user.service;

import com.user.model.Adopt;

import java.util.List;

public interface IAdoptService {
    //查询所有宠物领养信息信息
    List<Adopt> getAdoptAll();
    //根据编号查询宠物领养信息信息
    Adopt getAdoptOne(String anId);
    //根据id删除宠物领养信息
    Boolean delAdopt(String anId);
    //模糊查询宠物领养信息
    List<Adopt> selectAdoptByCriteria(Adopt Adopt);
    //根据编号修改宠物领养信息
    Boolean updateAdoptById(Adopt Adopt);
}

 领养管理功能的Service接口的Impl实现层

SERVICE层

  • 业务逻辑层,用于完成功能设计
  • 一般用于调用dao层的接口,实现业务功能

(以下只是部分代码,详情请去文尾下载完整版)

package com.user.service.impl;

import com.user.dao.AdoptDao;
import com.user.dao.AnimalDao;
import com.user.model.Adopt;
import com.user.model.Animal;
import com.user.service.IAdoptService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class AodptServiceImpl implements IAdoptService {
    @Autowired
    AdoptDao adoptDao;
    @Autowired
    AnimalDao animalDao;

    //查询所有动物信息
    @Override
    public List<Adopt> getAdoptAll() {
        List<Adopt> ado = adoptDao.getAdoptAll();
        return ado;
    }
    //根据编号查询动物信息
    @Override
    public Adopt getAdoptOne(String adId) {
        return adoptDao.getAdoptOne(adId);
    }
    //根据id删除动物
    @Override
    public Boolean delAdopt(String adId) {
        return adoptDao.delAdopt(adId)>0;
    }
    //模糊查询动物
    @Override
    public List<Adopt> selectAdoptByCriteria(Adopt adopt) {
        List<Adopt> sta = adoptDao.selectAdoptByCriteria(adopt);
        return sta;
    }
    //根据编号修改动物领养信息
    @Override
    public Boolean updateAdoptById(Adopt adopt) {
        //如果当前状态为驳回或者为待领养那么修改宠物的状态
        if ("0".equals(adopt.getAdoptStatus())){
            Animal a = new Animal();
            a.setAnId(Integer.valueOf(adopt.getAnId()));
            a.setState("1");
            animalDao.updateAnimalStateById(a);
        }
        return adoptDao.updateAdoptById(adopt)>0;
    }
}

 领养管理功能的Dao数据持久化层

DAO层

  • 数据持久层,用于存放sql语句,在SpringBoot中用注解来为每一个方法注入sql语句
  • 又称为mapper层

这一层请注意,我用的是mybatis的注解sql,并没有在mapper的xml里使用sql语句哦

(以下只是部分代码,详情请去文尾下载完整版)

package com.user.dao;

import com.user.model.Adopt;
import com.user.model.Animal;
import org.apache.ibatis.annotations.*;

import java.util.List;

@Mapper
public interface AdoptDao {
    //查询所有领养宠物信息
    @Select("select * from adopt")
    List<Adopt> getAdoptAll();
    //根据编号查询领养宠物信息
    @Select("select a.ad_id,a.remarks,a.adopt_time,a.adopt_status,\n" +
            "adopt_status as adoptStatus,a.an_id,\n" +
            "b.an_id as banId,an_name as anName,\n" +
            "c.userid as cuserId,fullname\n" +
            "from adopt as a \n" +
            "INNER JOIN animal as b on a.an_id = b.an_id \n" +
            "INNER JOIN `user` as c on a.userid = c.userid\n" +
            "where ad_id = #{adId}")
    @ResultMap(value = "adoptMap")
    Adopt getAdoptOne(String adId);

    //根据id删除领养宠物
    @Delete("delete from adopt where ad_id = #{adId}")
    Integer delAdopt(String adId);

    //模糊查询领养宠物
    @Select({"<script>","select a.ad_id,a.remarks,a.adopt_time,a.adopt_status,\n" +
            "adopt_status as adoptStatus,a.an_id,\n" +
            "b.an_id as banId,an_name as anName,\n" +
            "c.userid as cuserId,fullname\n" +
            "from adopt as a \n" +
            "INNER JOIN animal as b on a.an_id = b.an_id \n" +
            "INNER JOIN `user` as c on a.userid = c.userid\n" +
            "where 1=1",
            //判断领养人编号是否为空
            "<if test='user.username!=null and user.username != \"\"'>",
            "AND username like '%${user.username}%' \n" ,"</if>",
            //判断领养宠物领养状态是否为空
            "<if test='adoptStatus!=null and adoptStatus != \"\"'>",
            "AND adopt_status = #{adoptStatus}\n" ,"</if>",
            //判断领养宠物名称是否为空
            "<if test='an.anName!=null and an.anName != \"\"'>" +
            "AND an_name like '%${an.anName}%' \n","</if>",
            "</script>"})
    @Results(id="adoptMap",value={
            @Result(id=true,column = "ad_id",property = "adId"),
            @Result(column = "remarks",property = "remarks"),
            @Result(column = "adopt_time",property = "adoptTime"),
            @Result(column = "adoptStatus",property = "adoptStatus"),
            @Result(column = "banId",property = "anId"),
            @Result(column = "cuserId",property = "userid"),
            @Result(column = "anName",property = "backup"),
            //宠物信息
            @Result(column = "banId",property = "an.anId"),
            @Result(column = "anName",property = "an.anName"),
            //用户信息
            @Result(column = "cuserId",property = "user.userid"),
            @Result(column = "fullname",property = "user.username")
    })
    List<Adopt> selectAdoptByCriteria(Adopt Adopt);

    //新增宠物领养信息
    @Insert("insert into `adopt`(userid,an_id,adopt_time,remarks,adopt_status)\n" +
            "values\n" +
            "(#{userid},#{anId},#{adoptTime},#{remarks},'2')")
    Integer addAdopt(Adopt Adopt);

    //根据编号修改领养宠物
    @Update("    update adopt\n" +
            "    set userid = #{userid},\n" +
            "      an_id = #{anId},\n" +
            "      adopt_time = #{adoptTime},\n" +
            "      remarks = #{remarks},\n" +
            "      adopt_status = #{adoptStatus},\n" +
            "      backup = #{backup},\n" +
            "      backup2 = #{backup2},\n" +
            "      backup3 = #{backup3}\n" +
            "    where ad_id = #{adId}")
    Integer updateAdoptById(Adopt Adopt);
}

  领养管理功能的Model实体层

MODEL层

  • model层,又称:数据访问层
  • 一张表对应一个实体类

这一层的类,我用的是mybatis-plus的maven插件自动生成数据库对应的字段以及表的实体类

(以下只是部分代码,详情请去文尾下载完整版)

package com.user.model;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;

/**
 * <p>
 * 领养信息表
 * </p>
 *
 * @author 关爱流浪猫狗,从我做起!
 * @since 2022-02-19
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class Adopt implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 动物编号
     */
    @TableId(value = "ad_id", type = IdType.AUTO)
    private Integer adId;

    /**
     * 领养人编号
     */
    private String userid;

    /**
     * 被领养猫狗编号
     */
    private String anId;

    /**
     * 领养时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss")
    private Date adoptTime;

    /**
     * 物种(0猫,1狗)
     */
    private String remarks;

    /**
     * 审核状态(0驳回,1通过,2待审核)
     */
    private String adoptStatus;

    /**
     * 备用列1
     */
    private String backup;

    /**
     * 备用列1
     */
    private String backup2;

    /**
     * 备用列3
     */
    private String backup3;


    /**
     * 宠物信息
     */
    private Animal an;

    /**
     * 用户信息
     */
    private User user;
}

5.养宠攻略管理:攻略信息

 养宠攻略管理Controller展现层

CONTROLLER层

  • 控制层,实现对Get和Post的相应
  • 用于前后端交互,service层和前端通过Controller层进行数据交互

(以下只是部分代码,详情请去文尾下载完整版)

package com.user.controller;


import com.user.model.Strategy;
import com.user.service.IStrategyService;
import com.user.utils.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * <p>
 * 攻略表 前端控制器
 * </p>
 *
 * @author 关爱流浪猫狗,从我做起!
 * @since 2022-02-19
 */
@RestController
@RequestMapping("/strategy")
public class StrategyController {
    @Autowired
    IStrategyService iStrategyService;
    //查询所有攻略信息
    @GetMapping("/list")
    public Result getStrategyAll(){
        return new Result(true,iStrategyService.getStrategyAll());
    }
    //根据编号查询攻略信息
    @GetMapping("/getStrategyOne/{strId}")
    public Result getStrategyOne(@PathVariable String strId){
        return new Result(true,iStrategyService.getStrategyOne(strId));
    }
    //删除攻略
    @DeleteMapping("{strId}")
    public Result delStrategy(@PathVariable String strId){
        String[] sta = strId.split(",");
        for (String id : sta){
            iStrategyService.delStrategy(id);
        }
        return new Result(true);
    }
    //新增攻略
    @PostMapping("/addStrategy")
    public Result addStrategy(@RequestBody Strategy strategy){
        boolean flag = iStrategyService.addStrategy(strategy);
        return new Result(flag, flag ? "添加成功^_^" : "添加失败-_-!");
    }
    //根据攻略模糊查询
    @PostMapping("/selectStrategyByCriteria")
    public Result selectStrategyByCriteria(@RequestBody Strategy strategy){
        return new Result(true,iStrategyService.selectStrategyByCriteria(strategy));
    }
    //修改攻略
    @PutMapping
    public Result updateStrategyById(@RequestBody Strategy strategy){
        boolean flag = iStrategyService.updateStrategyById(strategy);
        return new Result(flag, flag ? "修改成功^_^" : "修改失败-_-!");
    }
}

养宠攻略管理功能的Service接口层

SERVICE层

  • 业务逻辑层,用于完成功能设计
  • 一般用于调用dao层的接口,实现业务功能

(以下只是部分代码,详情请去文尾下载完整版)

package com.user.service;

import com.user.model.Strategy;

import java.util.List;

public interface IStrategyService {
    //查询所有攻略信息
    List<Strategy> getStrategyAll();
    //根据编号查询攻略信息
    Strategy getStrategyOne(String str_id);
    //根据id删除攻略
    Boolean delStrategy(String str_id);
    //新增攻略
    Boolean addStrategy(Strategy strategy);
    //模糊查询攻略
    List<Strategy> selectStrategyByCriteria(Strategy strategy);
    //根据编号修改攻略
    Boolean updateStrategyById(Strategy strategy);
}

养宠攻略管理功能的Service接口的Impl实现层

SERVICE层

  • 业务逻辑层,用于完成功能设计
  • 一般用于调用dao层的接口,实现业务功能

(以下只是部分代码,详情请去文尾下载完整版)

package com.user.service.impl;

import com.user.dao.StrategyDao;
import com.user.model.Strategy;
import com.user.service.IStrategyService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;

@Service
public class StrategyServiceImpl implements IStrategyService {
    @Autowired
    StrategyDao strategyDao;

    //查询所有攻略信息
    @Override
    public List<Strategy> getStrategyAll() {
        List<Strategy> strategy = strategyDao.getStrategyAll();
        return strategy;
    }
    //根据编号查询攻略信息
    @Override
    public Strategy getStrategyOne(String strId) {
        return strategyDao.getStrategyOne(strId);
    }
    //根据id删除攻略
    @Override
    public Boolean delStrategy(String strId) {
        return strategyDao.delStrategy(strId)>0;
    }
    //新增攻略
    @Override
    public Boolean addStrategy(Strategy strategy) {
        strategy.setCreateTime(new Date());
        return strategyDao.addStrategy(strategy)>0;
    }
    //模糊查询攻略
    @Override
    public List<Strategy> selectStrategyByCriteria(Strategy strategy) {
        List<Strategy> sta = strategyDao.selectStrategyByCriteria(strategy);
        return sta;
    }
    //根据编号修改攻略
    @Override
    public Boolean updateStrategyById(Strategy strategy) {
        return strategyDao.updateStrategyById(strategy)>0;
    }
}

养宠攻略管理功能的Dao数据持久化层

DAO层

  • 数据持久层,用于存放sql语句,在SpringBoot中用注解来为每一个方法注入sql语句
  • 又称为mapper层

这一层请注意,我用的是mybatis的注解sql,并没有在mapper的xml里使用sql语句哦

(以下只是部分代码,详情请去文尾下载完整版)

package com.user.dao;

import com.user.model.Strategy;
import org.apache.ibatis.annotations.*;

import java.util.List;

@Mapper
public interface StrategyDao {
    //查询所有攻略信息
    @Select("select * from strategy")
    List<Strategy> getStrategyAll();
    //根据编号查询攻略信息
    @Select("select str_id,title,content,createTime,b.userid as buserid,username\n" +
            "from `strategy` as a\n" +
            "inner join `user` as b on a.userid = b.userid\n" +
            " where str_id = #{strId}")
    @ResultMap(value = "strategyMap")
    Strategy getStrategyOne(String strId);

    //根据id删除攻略
    @Delete("delete from strategy where str_id = #{strId}")
    Integer delStrategy(String strId);

    //新增攻略
    @Insert("    insert into strategy (str_id, userid, createTime, \n" +
            "      title, content, backup, \n" +
            "      backup2, backup3)\n" +
            "    values (#{strId}, #{userid}, #{createTime}, \n" +
            "      #{title}, #{content}, #{backup}, \n" +
            "      #{backup2}, #{backup3})")
    Integer addStrategy(Strategy strategy);
    //模糊查询攻略
    @Select({"<script>","select str_id,title,content,createTime,b.userid as buserid,fullname\n" +
            "from `strategy` as a\n" +
            "inner join `user` as b on a.userid = b.userid\n" +
            "where 1=1",
            //判断攻略发布人编号是否为空
            "<if test='userid!=null and userid != \"\"'>",
            "AND a.userid = #{userid} \n" ,"</if>",
            //判断攻略标题是否为空
            "<if test='title!=null and title != \"\"'>",
            "AND title like '%${title}%' \n" ,"</if>",
            //判断攻略内容是否为空
            "<if test='content!=null and content != \"\"'>",
            "AND content like '%${content}%' \n","</if>",
            "</script>"})
    @Results(id="strategyMap",value={
            @Result(id=true,column = "str_id",property = "strId"),
            @Result(column = "title",property = "title"),
            @Result(column = "content",property = "content"),
            @Result(column = "createTime",property = "createTime"),
            //用户信息
            @Result(column = "buserid",property = "user.userid"),
            @Result(column = "fullname",property = "user.username")
    })
    List<Strategy> selectStrategyByCriteria(Strategy strategy);
    //根据编号修改攻略
    @Update(" update strategy\n" +
            "    set userid = #{userid},\n" +
            "      createTime = #{createTime},\n" +
            "      title = #{title},\n" +
            "      content = #{content},\n" +
            "      backup = #{backup},\n" +
            "      backup2 = #{backup2},\n" +
            "      backup3 = #{backup3}\n" +
            "    where str_id = #{strId}")
    Integer updateStrategyById(Strategy strategy);
}

养宠攻略管理功能的Model实体层

MODEL层

  • model层,又称:数据访问层
  • 一张表对应一个实体类

这一层的类,我用的是mybatis-plus的maven插件自动生成数据库对应的字段以及表的实体类

(以下只是部分代码,详情请去文尾下载完整版)

package com.user.model;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;

/**
 * <p>
 * 攻略表
 * </p>
 *
 * @author 关爱流浪猫狗,从我做起!
 * @since 2022-02-19
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class Strategy implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 攻略编号
     */
    @TableId(value = "str_id", type = IdType.AUTO)
    private Integer strId;

    /**
     * 发布人编号
     */
    private String userid;

    /**
     * 发布时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss")
    private Date createTime;

    /**
     * 标题
     */
    private String title;

    /**
     * 内容
     */
    private String content;

    /**
     * 备用列1
     */
    private String backup;

    /**
     * 备用列1
     */
    private String backup2;

    /**
     * 备用列3
     */
    private String backup3;

    //用户信息
    private User user;

}

6.交流消息管理:消息信息

交流消息管理Controller展现层

CONTROLLER层

  • 控制层,实现对Get和Post的相应
  • 用于前后端交互,service层和前端通过Controller层进行数据交互

(以下只是部分代码,详情请去文尾下载完整版)

package com.user.controller;


import com.user.model.Information;
import com.user.service.IInformationService;
import com.user.utils.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * <p>
 * 交流信息表 前端控制器
 * </p>
 *
 * @author 关爱流浪猫狗,从我做起!
 * @since 2022-02-19
 */
@RestController
@RequestMapping("/information")
public class InformationController {
    @Autowired
    IInformationService iInformationService;
    //查询所有消息信息
    @GetMapping("/list")
    public Result getInformationAll(){
        return new Result(true,iInformationService.getInformationAll());
    }
    //根据编号查询消息信息
    @GetMapping("/getInformationOne/{inId}")
    public Result getInformationOne(@PathVariable String inId){
        return new Result(true,iInformationService.getInformationOne(inId));
    }
    //删除消息
    @DeleteMapping("{inId}")
    public Result delInformation(@PathVariable String inId){
        String[] sta = inId.split(",");
        for (String id : sta){
            iInformationService.delInformation(id);
        }
        return new Result(true);
    }
    //新增消息
    @PostMapping
    public Result addInformation(@RequestBody Information information){
        boolean flag = iInformationService.addInformation(information);
        return new Result(flag, flag ? "添加成功^_^" : "添加失败-_-!");
    }
    //根据消息模糊查询
    @PostMapping("/selectInformationByCriteria")
    public Result selectInformationByCriteria(@RequestBody Information information){
        return new Result(true,iInformationService.selectInformationByCriteria(information));
    }
    //修改消息信息
    @PutMapping
    public Result updateInformationById(@RequestBody Information information){
        boolean flag = iInformationService.updateInformationById(information);
        return new Result(flag, flag ? "修改成功^_^" : "修改失败-_-!");
    }
}

交流消息管理功能的Service接口层

SERVICE层

  • 业务逻辑层,用于完成功能设计
  • 一般用于调用dao层的接口,实现业务功能

(以下只是部分代码,详情请去文尾下载完整版)

package com.user.service;

import com.user.model.Information;

import java.util.List;

public interface IInformationService {
    //查询所有消息信息
    List<Information> getInformationAll();
    //根据编号查询消息信息
    Information getInformationOne(String in_id);
    //根据id删除消息
    Boolean delInformation(String in_id);
    //新增消息
    Boolean addInformation(Information information);
    //模糊查询消息
    List<Information> selectInformationByCriteria(Information information);
    //根据编号修改消息
    Boolean updateInformationById(Information information);
}

交流消息管理功能的Service接口的Impl实现层

SERVICE层

  • 业务逻辑层,用于完成功能设计
  • 一般用于调用dao层的接口,实现业务功能

(以下只是部分代码,详情请去文尾下载完整版)

package com.user.service.impl;

import com.user.dao.InformationDao;
import com.user.dao.RoleDao;
import com.user.model.Information;
import com.user.model.Role;
import com.user.service.IInformationService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Service
public class InformationServiceImpl implements IInformationService {
    @Autowired
    InformationDao informationDao;
    @Autowired
    RoleDao roleDao;

    //查询所有消息信息
    @Override
    public List<Information> getInformationAll() {
        List<Information> information = informationDao.getInformationAll();
        return information;
    }
    //根据编号查询消息信息
    @Override
    public Information getInformationOne(String inId) {
        return informationDao.getInformationOne(inId);
    }
    //根据id删除消息
    @Override
    public Boolean delInformation(String inId) {
        return informationDao.delInformation(inId)>0;
    }
    //新增消息
    @Override
    public Boolean addInformation(Information information) {
        information.setCreateTime(new Date());
        return informationDao.addInformation(information)>0;
    }
    //模糊查询消息
    @Override
    public List<Information> selectInformationByCriteria(Information information) {
        //根据用户编号查询用户角色信息
        Role r = roleDao.r(information.getBackup());
        List<Information> sta = new ArrayList<Information>();
        //判断此用户不是管理员(查询接收者固定为当前用户)
        if (!"1".equals(r.getRoleid())){
            //其它用户
            System.out.println("当前用户的编号"+information.getBackup());
            System.out.println("发送人编号"+information.getPublishUserid());
            System.out.println("接收人编号"+information.getAddresseeUserid());
            if(null == information.getAddresseeUserid() || "".equals(information.getAddresseeUserid()) && null == information.getContent() || "".equals(information.getContent()) ){
                information.setBackup2("都为空");
            }
            sta=informationDao.selectInformationById(information);
        }else{
            //管理员
            sta = informationDao.selectInformationByCriteria(information);
        }
        return sta;
    }

    //根据编号修改消息
    @Override
    public Boolean updateInformationById(Information information) {
        return informationDao.updateInformationById(information)>0;
    }
}

交流消息管理功能的Dao数据持久化层

DAO层

  • 数据持久层,用于存放sql语句,在SpringBoot中用注解来为每一个方法注入sql语句
  • 又称为mapper层

这一层请注意,我用的是mybatis的注解sql,并没有在mapper的xml里使用sql语句哦

(以下只是部分代码,详情请去文尾下载完整版)

package com.user.dao;

import com.user.model.Information;
import org.apache.ibatis.annotations.*;

import java.util.List;

@Mapper
public interface InformationDao {
    //查询所有消息信息
    @Select("select * from information")
    List<Information> getInformationAll();
    //根据编号查询消息信息
    @Select("select a.fullname as publishUser,a.userid as publishUserId," +
            "b.fullname as addresseeUser,b.userid as addresseeUserId,i.*\n" +
            "from information as i\n" +
            "inner join `user` as a on a.userid=i.publish_userid\n" +
            "inner join `user` as b on b.userid=i.addressee_userid\n" +
            " where in_id = #{inId}")
    @ResultMap(value = "informationMap")
    Information getInformationOne(String inId);

    //根据id删除消息
    @Delete("delete from information where in_id = #{inId}")
    Integer delInformation(String inId);

    //新增消息
    @Insert("    insert into information (in_id, publish_userid, addressee_userid, \n" +
            "      create_time, content, backup, \n" +
            "      backup2, backup3)\n" +
            "    values (#{inId}, #{publishUserid}, #{addresseeUserid}, \n" +
            "      #{createTime}, #{content}, #{backup}, \n" +
            "      #{backup2}, #{backup3})")
    Integer addInformation(Information information);
    //模糊查询消息
    @Select({"<script>","select a.fullname as publishUser,a.userid as publishUserId," +
            "b.fullname as addresseeUser,b.userid as addresseeUserId,i.*\n" +
            "from information as i\n" +
            "inner join `user` as a on a.userid=i.publish_userid\n" +
            "inner join `user` as b on b.userid=i.addressee_userid\n" +
            "where 1=1",
            //判断消息内容是否为空
            "<if test='content!=null and content != \"\"'>",
            "AND content like '%${content}%' \n","</if>",
            //判断发送人是否为空
            "<if test='publishUserid!=null and publishUserid != \"\"'>",
            "AND publish_userid = #{publishUserid} \n","</if>",

            //判断接收人是否为空
            "<if test='addresseeUserid!=null and addresseeUserid != \"\"'>",
            "and addressee_userid = #{addresseeUserid} \n","</if>",


            "</script>"})
    @Results(id="informationMap",value={
            @Result(id=true,column = "in_id",property = "inId"),
            @Result(column = "create_time",property = "createTime"),
            @Result(column = "content",property = "content"),
            //发送者信息
            @Result(column = "publishUserId",property = "user.userid"),
            @Result(column = "publishUser",property = "user.username"),
            //接收者信息
            @Result(column = "addresseeUserId",property = "user2.userid"),
            @Result(column = "addresseeUser",property = "user2.username")
    })
    List<Information> selectInformationByCriteria(Information information);

    //模糊查询消息
    @Select({"<script>","select a.fullname as publishUser,a.userid as publishUserId," +
            "b.fullname as addresseeUser,b.userid as addresseeUserId,i.*\n" +
            "from information as i\n" +
            "inner join `user` as a on a.userid=i.publish_userid\n" +
            "inner join `user` as b on b.userid=i.addressee_userid\n" +
            "where 1=1",
            //判断发送人是否为空

            //判断接收人和消息内容是否都为空

            //接收人、内容都不为空
            "<if test='addresseeUserid!=null and addresseeUserid != \"\" and content!=null and content != \"\"'>",
            " and content like '%${content}%' and publish_userid = #{backup} or addressee_userid = #{addresseeUserid} \n","</if>" +

            //接收人、内容都为空
            "<if test=\"backup2=='都为空'\">",
            " and publish_userid = #{backup}  or addressee_userid = #{backup} \n","</if>" +

            //接收人、内容有一个不为空
            "<if test='addresseeUserid!=null and addresseeUserid != \"\" or content!=null and content != \"\"'>",
                //接收人不为空
                "<if test='addresseeUserid!=null and addresseeUserid != \"\"'>"+
                "and publish_userid = #{backup} and addressee_userid = #{addresseeUserid} \n","</if>" +
                //消息内容不为空
                "<if test='content!=null and content != \"\"'>",
                "and content like '%${content}%'\n","</if>" +
            "</if>" +


            //判断接收人固定为自己

            " \n",
            "</script>"})
    @Results(id="informationMapById",value={
            @Result(id=true,column = "in_id",property = "inId"),
            @Result(column = "create_time",property = "createTime"),
            @Result(column = "content",property = "content"),
            //发送者信息
            @Result(column = "publishUserId",property = "user.userid"),
            @Result(column = "publishUser",property = "user.username"),
            //接收者信息
            @Result(column = "addresseeUserId",property = "user2.userid"),
            @Result(column = "addresseeUser",property = "user2.username")
    })
    List<Information> selectInformationById(Information information);


    //根据编号修改消息
    @Update("    update information\n" +
            "    set publish_userid = #{publishUserid},\n" +
            "      addressee_userid = #{addresseeUserid},\n" +
            "      create_time = #{createTime},\n" +
            "      content = #{content},\n" +
            "      backup = #{backup},\n" +
            "      backup2 = #{backup2},\n" +
            "      backup3 = #{backup3}\n" +
            "    where in_id = #{inId}")
    Integer updateInformationById(Information information);
}

交流消息管理功能的Model实体层

MODEL层

  • model层,又称:数据访问层
  • 一张表对应一个实体类

这一层的类,我用的是mybatis-plus的maven插件自动生成数据库对应的字段以及表的实体类

(以下只是部分代码,详情请去文尾下载完整版)

package com.user.model;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;

/**
 * <p>
 * 交流信息表
 * </p>
 *
 * @author 关爱流浪猫狗,从我做起!
 * @since 2022-02-19
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class Information implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 消息编号
     */
    @TableId(value = "in_id", type = IdType.AUTO)
    private Integer inId;

    /**
     * 发送人编号
     */
    private String publishUserid;

    /**
     * 收信人编号
     */
    private String addresseeUserid;

    /**
     * 发送时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss")
    private Date createTime;

    /**
     * 消息内容
     */
    private String content;

    /**
     * 备用列1
     */
    private String backup;

    /**
     * 备用列1
     */
    private String backup2;

    /**
     * 备用列3
     */
    private String backup3;


    /**
     * 接收者
     */
    private User user;


    /**
     * 发送者
     */
    private User user2;

}

7.捐赠支出管理:捐赠支出信息

捐赠支出管理Controller展现层

CONTROLLER层

  • 控制层,实现对Get和Post的相应
  • 用于前后端交互,service层和前端通过Controller层进行数据交互

(以下只是部分代码,详情请去文尾下载完整版)

package com.user.controller;


import com.user.model.Donate;
import com.user.service.IDonateService;
import com.user.utils.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * <p>
 * 捐赠支出信息表 前端控制器
 * </p>
 *
 * @author 关爱流浪猫狗,从我做起!
 * @since 2022-02-19
 */
@RestController
@RequestMapping("/donate")
public class DonateController {
    @Autowired
    IDonateService iDonateService;
    //查询所有捐赠支出信息
    @GetMapping("/list")
    public Result getDonateAll(){
        return new Result(true,iDonateService.getDonateAll());
    }
    //根据编号查询捐赠支出信息
    @GetMapping("/getDonateOne/{doId}")
    public Result getDonateOne(@PathVariable String doId){
        return new Result(true,iDonateService.getDonateOne(doId));
    }
    //删除捐赠支出
    @DeleteMapping("{doId}")
    public Result delDonate(@PathVariable String doId){
        String[] sta = doId.split(",");
        for (String id : sta){
            iDonateService.delDonate(id);
        }
        return new Result(true);
    }
    //新增捐赠支出
    @PostMapping("/addDonate")
    public Result addDonate(@RequestBody Donate Donate){
        boolean flag = iDonateService.addDonate(Donate);
        return new Result(flag, flag ? "添加成功^_^" : "添加失败-_-!");
    }
    //根据捐赠支出模糊查询
    @PostMapping("/selectDonateByCriteria")
    public Result selectDonateByCriteria(@RequestBody Donate donate){
        return new Result(true,iDonateService.selectDonateByCriteria(donate));
    }
    //修改捐赠支出
    @PutMapping
    public Result updateDonateById(@RequestBody Donate donate){
        boolean flag = iDonateService.updateDonateById(donate);
        return new Result(flag, flag ? "修改成功^_^" : "修改失败-_-!");
    }
}

捐赠支出管理功能的Service接口层

SERVICE层

  • 业务逻辑层,用于完成功能设计
  • 一般用于调用dao层的接口,实现业务功能

(以下只是部分代码,详情请去文尾下载完整版)

package com.user.service;

import com.user.model.Donate;
import com.user.model.Strategy;

import java.util.List;

public interface IDonateService {
    //查询所有捐赠/支出信息
    List<Donate> getDonateAll();
    //根据编号查询捐赠/支出信息
    Donate getDonateOne(String doId);
    //根据id删除捐赠/支出
    Boolean delDonate(String doId);
    //新增捐赠/支出
    Boolean addDonate(Donate donate);
    //模糊查询捐赠/支出
    List<Donate> selectDonateByCriteria(Donate donate);
    //根据编号修改捐赠/支出
    Boolean updateDonateById(Donate donate);
}

捐赠支出管理功能的Service接口的Impl实现层

SERVICE层

  • 业务逻辑层,用于完成功能设计
  • 一般用于调用dao层的接口,实现业务功能

(以下只是部分代码,详情请去文尾下载完整版)

package com.user.service.impl;

import com.user.dao.DonateDao;
import com.user.model.Donate;
import com.user.service.IDonateService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;

@Service
public class DonateServiceImpl implements IDonateService {
    @Autowired
    DonateDao donateDao;

    //查询所有捐赠/支出信息
    @Override
    public List<Donate> getDonateAll() {
        List<Donate> Donate = donateDao.getDonateAll();
        return Donate;
    }
    //根据编号查询捐赠/支出信息
    @Override
    public Donate getDonateOne(String doId) {
        return donateDao.getDonateOne(doId);
    }
    //根据id删除捐赠/支出
    @Override
    public Boolean delDonate(String doId) {
        return donateDao.delDonate(doId)>0;
    }
    //新增捐赠/支出
    @Override
    public Boolean addDonate(Donate donate) {
        donate.setCreateTime(new Date());
        donate.setAdminId("1");
        return donateDao.addDonate(donate)>0;
    }
    //模糊查询捐赠/支出
    @Override
    public List<Donate> selectDonateByCriteria(Donate donate) {
        List<Donate> sta = donateDao.selectDonateByCriteria(donate);
        return sta;
    }

    //根据编号修改捐赠/支出
    @Override
    public Boolean updateDonateById(Donate donate) {
        return donateDao.updateDonateById(donate)>0;
    }
}

捐赠支出管理功能的Dao数据持久化层

DAO层

  • 数据持久层,用于存放sql语句,在SpringBoot中用注解来为每一个方法注入sql语句
  • 又称为mapper层

这一层请注意,我用的是mybatis的注解sql,并没有在mapper的xml里使用sql语句哦

(以下只是部分代码,详情请去文尾下载完整版)

package com.user.dao;

import com.user.model.Donate;
import org.apache.ibatis.annotations.*;

import java.util.List;

@Mapper
public interface DonateDao {
    //查询所有捐赠/支出信息
    @Select("select * from donate")
    List<Donate> getDonateAll();
    //根据编号查询捐赠/支出信息
    @Select("select do_id,personName,`specific`,create_time,admin_id,\n" +
            "case behavior when '0' then '捐赠' else '支出' end as behavior,\n" +
            "b.sta_id as staId,sta_name,\n" +
            "c.userid as cuserId,username\n" +
            "from donate as a \n" +
            "INNER JOIN station as b on a.sta_id = b.sta_id\n" +
            "INNER JOIN `user` as c on a.admin_id = c.userid\n" +
            " where do_id = #{doId}")
    @ResultMap(value = "DonateMap")
    Donate getDonateOne(String doId);

    //根据id删除捐赠/支出
    @Delete("delete from donate where do_id = #{doId}")
    Integer delDonate(String doId);

    //新增捐赠/支出
    @Insert("insert into donate (sta_id, personName, \n" +
            "      behavior, `specific`, create_time, \n" +
            "      admin_id, backup, backup2, \n" +
            "      backup3)\n" +
            "    values ( #{staId}, #{personName}, \n" +
            "      #{behavior}, #{specific}, #{createTime}, \n" +
            "      #{adminId}, #{backup}, #{backup2}, \n" +
            "      #{backup3})")
    Integer addDonate(Donate donate);
    //模糊查询捐赠/支出
    @Select({"<script>","select do_id,personName,`specific`,create_time,admin_id,\n" +
            "case behavior when '0' then '捐赠' else '支出' end as behavior,\n" +
            "b.sta_id as staId,sta_name,\n" +
            "c.userid as cuserId,fullname\n" +
            "from donate as a \n" +
            "INNER JOIN station as b on a.sta_id = b.sta_id\n" +
            "INNER JOIN `user` as c on a.admin_id = c.userid\n" +
            "where 1=1",
            //判断负责人名称是否为空
            "<if test='personName!=null and personName != \"\"'>",
            "AND personName like '%${personName}%' \n" ,"</if>",
            //判断捐赠/支出救助站编号是否为空
            "<if test='staId!=null and staId != \"\"'>",
            "AND a.sta_id = #{staId}\n" ,"</if>",
            //判断捐赠/支出行为是否为空
            "<if test='behavior!=null and behavior != \"\"'>",
            "AND behavior = #{behavior} \n","</if>",
            "</script>"})
    @Results(id="DonateMap",value={
            @Result(id=true,column = "do_id",property = "doId"),
            @Result(column = "personName",property = "personName"),
            @Result(column = "specific",property = "specific"),
            @Result(column = "behavior",property = "behavior"),
            @Result(column = "create_time",property = "createTime"),
            @Result(column = "admin_id",property = "adminId"),
            //救助站信息
            @Result(column = "a.sta_id",property = "sta.staId"),
            @Result(column = "sta_name",property = "sta.staName"),
            //用户信息
            @Result(column = "cuserId",property = "user.userid"),
            @Result(column = "fullname",property = "user.fullname")
    })
    List<Donate> selectDonateByCriteria(Donate donate);
    //根据编号修改捐赠/支出
    @Update(" update donate\n" +
            "    set sta_id = #{staId},\n" +
            "      personName = #{personName},\n" +
            "      behavior = #{behavior},\n" +
            "      `specific` = #{specific},\n" +
            "      create_time = #{createTime},\n" +
            "      admin_id = #{adminId},\n" +
            "      backup = #{backup},\n" +
            "      backup2 = #{backup2},\n" +
            "      backup3 = #{backup3}\n" +
            "    where do_id = #{doId}")
    Integer updateDonateById(Donate donate);
}

捐赠支出管理功能的Model实体层

MODEL层

  • model层,又称:数据访问层
  • 一张表对应一个实体类

这一层的类,我用的是mybatis-plus的maven插件自动生成数据库对应的字段以及表的实体类

(以下只是部分代码,详情请去文尾下载完整版)

package com.user.model;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;

/**
 * <p>
 * 捐赠信息表
 * </p>
 *
 * @author 关爱流浪猫狗,从我做起!
 * @since 2022-02-19
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class Donate implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 捐赠支出编号
     */
    @TableId(value = "do_id", type = IdType.AUTO)
    private Integer doId;

    /**
     * 救助站编号
     */
    private String staId;

    /**
     * 负责人名称
     */
    @TableField("personName")
    private String personName;

    /**
     * 行为(0捐赠,1支出)
     */
    private String behavior;

    /**
     * 具体行为
     */
    private String specific;

    /**
     * 发布时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss")
    private Date createTime;

    /**
     * 发布记录的管理员编号
     */
    private String adminId;

    /**
     * 备用列1
     */
    private String backup;

    /**
     * 备用列1
     */
    private String backup2;

    /**
     * 备用列3
     */
    private String backup3;

    /**
     * 救助站对象
     */
    private Station sta;

    /**
     * 用户对象
     */
    private User user;
}

啊,对了还有数据库的sql文件也放在了项目resouce文件夹下了

 数据库表详解

adopt:领养记录表
animal:宠物表
donate:救助站捐赠信息表
information:消息记录表
menu:菜单表
menurole:菜单角色中间表
role:角色表
station:救助站表
strategy:养宠攻略表
user:用户表
userrole:用户角色表

源码+项目部署

 源码地址:

https://pan.baidu.com/s/1WN-jDY8H4v5D1K-KkWlNUw
提取码:mcod

嗯嗯嗯......终于到了激动人心的时候了,我来帮你搞定一切,帝王般的服务你值得拥有,免费的哟,记得备注下:曹家的小仙女 / 小哥哥,微信:BitPlanet

最后附上

一寸光阴一寸金,寸金难买寸光阴。请珍惜现在美好的青春,咱们一起努力奋斗,创造美好未来

拜托拜托!!!拜托拜托!!!拜托拜托!!!

  • 72
    点赞
  • 190
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 47
    评论
很抱歉,根据提供的引用内容,没有提到该流浪救助领养管理系统是基于Spring Boot框架开发的信息。然而,根据提供的引用内容,该系统是基于SSM框架(Spring+Spring MVC+MyBatis)开发的。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [基于SSM的流浪救助领养平台管理系统源码+数据库,基于SSM框架开发的流浪救助网站源码+数据库](https://download.csdn.net/download/shiyunzhe2021/87704192)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [基于SSM的流浪救助领养网站的设计与实现项目源码(本科毕业设计+数据库).zip](https://download.csdn.net/download/weixin_55305220/85612019)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [基于SSM框架的流浪领养救助平台管理系统.zip](https://download.csdn.net/download/weixin_47367099/85280063)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 47
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胡广毕业设计

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值