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

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

开发技术及开发工具

开发工具采用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 {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**").allowedOriginPatterns("*").allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS").allowCredentials(true).maxAge(3600).allowedHeaders("*");}
}

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

#控制台日志输出
logging:level:com:user:'*': debugserver:#设置端口号port: 1234
spring:#设置数据源mysql数据库的连接驱动、连接地址、数据库密码、数据库用户名datasource:driver-class-name: com.mysql.cj.jdbc.Driverpassword: 123456url: jdbc:mysql://localhost:3306/animal_rescue?serverTimezone=UTCusername: 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 {@AutowiredIUserService 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));}//新增用户@PostMappingpublic 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));}//修改用户@PutMappingpublic 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 {@AutowiredUserDao userDao;@AutowiredRoleDao roleDao;//登录@Overridepublic 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);}}//查询用户与之对应的角色@Overridepublic 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删除用户@Overridepublic Boolean delUser(String userid) {userDao.delUserRole(userid);return userDao.delUser(userid)>0;}//新增用户@Overridepublic 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("-","");//设置新增用户编号自增1user.setUserid(uuid);//新增用户角色userDao.addUserRole(user);return userDao.addUser(user)>0;}//根据id查询用户@Overridepublic 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修改用户信息@Overridepublic 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 {@AutowiredIStationService 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 {@AutowiredStationDao stationDao;//查询所有救助站信息@Overridepublic List<Station> getStationAll() {List<Station> station = stationDao.getStationAll();return station;}//根据编号查询救助站信息@Overridepublic Station getStationOne(String staId) {return stationDao.getStationOne(staId);}//根据id删除救助站@Overridepublic Boolean delStation(String staId) {return stationDao.delStation(staId)>0;}//新增救助站@Overridepublic Boolean addStation(Station station) {return stationDao.addStation(station)>0;}//模糊查询救助站@Overridepublic List<Station> selectStationByCriteria(Station station) {//名称//容量//地区//地址List<Station> sta = stationDao.selectStationByCriteria(station);return sta;}//根据编号修改救助站@Overridepublic 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 {@AutowiredIAdoptService 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));}//修改宠物领养信息@PutMappingpublic 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 {@AutowiredAdoptDao adoptDao;@AutowiredAnimalDao animalDao;//查询所有动物信息@Overridepublic List<Adopt> getAdoptAll() {List<Adopt> ado = adoptDao.getAdoptAll();return ado;}//根据编号查询动物信息@Overridepublic Adopt getAdoptOne(String adId) {return adoptDao.getAdoptOne(adId);}//根据id删除动物@Overridepublic Boolean delAdopt(String adId) {return adoptDao.delAdopt(adId)>0;}//模糊查询动物@Overridepublic List<Adopt> selectAdoptByCriteria(Adopt adopt) {List<Adopt> sta = adoptDao.selectAdoptByCriteria(adopt);return sta;}//根据编号修改动物领养信息@Overridepublic 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 {@AutowiredIStrategyService 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));}//修改攻略@PutMappingpublic 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 {@AutowiredStrategyDao strategyDao;//查询所有攻略信息@Overridepublic List<Strategy> getStrategyAll() {List<Strategy> strategy = strategyDao.getStrategyAll();return strategy;}//根据编号查询攻略信息@Overridepublic Strategy getStrategyOne(String strId) {return strategyDao.getStrategyOne(strId);}//根据id删除攻略@Overridepublic Boolean delStrategy(String strId) {return strategyDao.delStrategy(strId)>0;}//新增攻略@Overridepublic Boolean addStrategy(Strategy strategy) {strategy.setCreateTime(new Date());return strategyDao.addStrategy(strategy)>0;}//模糊查询攻略@Overridepublic List<Strategy> selectStrategyByCriteria(Strategy strategy) {List<Strategy> sta = strategyDao.selectStrategyByCriteria(strategy);return sta;}//根据编号修改攻略@Overridepublic 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 {@AutowiredIInformationService 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);}//新增消息@PostMappingpublic 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));}//修改消息信息@PutMappingpublic 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 {@AutowiredInformationDao informationDao;@AutowiredRoleDao roleDao;//查询所有消息信息@Overridepublic List<Information> getInformationAll() {List<Information> information = informationDao.getInformationAll();return information;}//根据编号查询消息信息@Overridepublic Information getInformationOne(String inId) {return informationDao.getInformationOne(inId);}//根据id删除消息@Overridepublic Boolean delInformation(String inId) {return informationDao.delInformation(inId)>0;}//新增消息@Overridepublic Boolean addInformation(Information information) {information.setCreateTime(new Date());return informationDao.addInformation(information)>0;}//模糊查询消息@Overridepublic 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;}//根据编号修改消息@Overridepublic 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 {@AutowiredIDonateService 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));}//修改捐赠支出@PutMappingpublic 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 {@AutowiredDonateDao donateDao;//查询所有捐赠/支出信息@Overridepublic List<Donate> getDonateAll() {List<Donate> Donate = donateDao.getDonateAll();return Donate;}//根据编号查询捐赠/支出信息@Overridepublic Donate getDonateOne(String doId) {return donateDao.getDonateOne(doId);}//根据id删除捐赠/支出@Overridepublic Boolean delDonate(String doId) {return donateDao.delDonate(doId)>0;}//新增捐赠/支出@Overridepublic Boolean addDonate(Donate donate) {donate.setCreateTime(new Date());donate.setAdminId("1");return donateDao.addDonate(donate)>0;}//模糊查询捐赠/支出@Overridepublic List<Donate> selectDonateByCriteria(Donate donate) {List<Donate> sta = donateDao.selectDonateByCriteria(donate);return sta;}//根据编号修改捐赠/支出@Overridepublic 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

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

最后附上

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

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

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

  1. Java程序员周末时间搞锭银行信息管理系统毕业设计(java+springboot+mybatis+mysql+vue+elementui)等实现 免费源码+论文答辩资料获取

    Java程序员周末时间搞锭银行信息管理系统毕业设计(java+springboot+mybatis+mysql+vue+elementui)等实现 前言介绍: 在社会快速发展的影响下,银行继续发展,大 ...

  2. java+ssm流浪猫狗领养救助网站367hp

    流浪猫狗领养救助网站采用Spring.SpringMVC和MyBatis作为主体框架,系统设计遵循界面层.业务逻辑层和数据访问层的Web开发三层架构.采用B/S结构,使得系统更加容易维护.流浪猫狗领养 ...

  3. Java+spring 基于ssm的社区流浪猫狗动物救助网站#毕业设计

    *文末获取源码 开发环境 项目编号:Java+spring ssm290社区流浪猫狗动物救助网站#毕业设计 开发语言:Java 开发工具:IDEA /Eclipse 数据库:MYSQL5.7 应用服务 ...

  4. Java程序员周末时间搞锭银行信息管理系统毕业设计(java+springboot+mybatis+mysql+vue+elementui)等实现

     博主介绍:✌公司项目主程.全网粉丝10W+,csdn特邀作者.博客专家.CSDN新星计划导师.java领域优质创作者,CSDN博客之星TOP100.掘金/华为云/阿里云/InfoQ等平台优质作者.专 ...

  5. 基于Springboot+Mybatis+mysql+vue技术交流博客论坛系统

    基于Springboot+Mybatis+mysql+vue技术交流博客论坛系统 一.系统介绍 二.功能展示 1.主页(普通用户) 2.登陆.注册(普通用户) 3.博客(普通用户) 4.文章详情(点赞 ...

  6. 基于springboot+mybatis+mysql+vue中学生成绩管理系统

    基于springboot+mybatis+mysql+vue中学生成绩管理系统 一.系统介绍 二.功能展示 1.登陆 2.用户管理(管理员) 3.班主任信息管理(管理员) 4.教师信息管理(管理员.班 ...

  7. 基于springboot+mybatis+mysql+vue运动会报名管理系统

    基于springboot+mybatis+mysql+vue运动会报名管理系统 一.系统介绍 二.功能展示 1.用户登陆 2.报名详情(运行员) 3.比赛报名(运动员) 4.个人参赛项目(运动员) 5 ...

  8. 基于Springboot+Mybatis+mysql+vue考研规划与交流平台

    基于Springboot+Mybatis+mysql+vue考研规划与交流平台 一.系统介绍 二.功能展示 1.主页(普通用户) 2.登陆.注册(普通用户) 3.复习规划制定(普通用户) 4.经验分享 ...

  9. 基于Springboot+Mybatis+mysql+vue宠物领养网站1.0

    基于Springboot+Mybatis+mysql+vue宠物领养网站 一.系统介绍 二.功能展示 1.主页(普通用户) 2.登陆.注册(普通用户) 3.宠物大全(普通用户) 4.宠物详情(申请领养 ...

最新文章

  1. OC对象 vs CF对象
  2. WP8.1学习系列(第二十五章)——控件样式
  3. 微信APP支付(Java后台生成签名具体步骤)
  4. 如何通过 macOS 恢复功能重新安装 macOS
  5. antd 嵌套子表格_大型前端项目架构优化探索之路腾讯文档表格
  6. 《avascript 高级程序设计(第三版)》 ---第三章 基本概念
  7. c语言求闰年平年的计算方法,C语言平年闰年问题
  8. 手机窃取PC信息,APT基础。
  9. linux b权限开头的文件夹,linux文件权限与目录配置
  10. ArcGIS 实验理论基础二十二 空间插值
  11. opencv GPU加速 多GPU卡指定GPU索引方法
  12. LiveZilla管理员密码忘记了如何恢复?How can I change the administrator password
  13. oracle的floor用法,oracle ceil floor 函数的用法
  14. 数论基础题(1) 费马引理+卡特兰数+Lucas定理+同余方程+扩欧
  15. Mysql原子性,持久性实现原理
  16. 点触科技安全验证新模式与逐浪CMS3.9.3新功能预览
  17. 4.2w起步的软件公司创业历程
  18. 参观计算机实验室后的感想,参观实验室心得体会.doc
  19. 信号与系统——零输入与零状态响应之间的比较
  20. 计算机科学报数学竞赛,(word)首届全校数学竞赛.doc

热门文章

  1. Java多线程基础(一)
  2. web前端开发入门(一)
  3. SAR ADC系列11:分段式CDAC
  4. [影评]电影《喜剧之王》评论两篇(1、喜剧之王:永不退缩的人生 2、努力!奋斗!——再看《喜剧之王》)
  5. 中国企业家如何立太子
  6. 【文献阅读】Model-based Reinforcement Learning for Predictions and Control for Limit Order Books
  7. 王者荣耀自动化获取金币/经验周上限 教程
  8. 征信报告产生“不良记录”的主要原因?
  9. 微信小程序-B站:wxml和wxss文件
  10. python入门学习之列表list