流浪动物领养平台技术解析
流浪动物救助与领养一直是社会关注的重要议题,传统线下模式存在信息不对称、流程不透明、管理效率低等问题。本平台通过技术手段构建了一个完整的线上领养生态系统,将流浪动物信息数字化、领养流程标准化,为救助机构和领养人提供高效便捷的服务。
系统架构与技术栈
平台采用经典的SSH(Struts2 + Spring + Hibernate)框架组合,构建了分层清晰、耦合度低的企业级应用架构。表现层使用Struts2框架处理用户请求与页面跳转,通过配置struts.xml文件定义Action映射关系,实现请求的精准路由。
<!-- struts.xml配置示例 -->
<action name="petAction_*" class="petAction" method="{1}">
<result name="success">/pet_list.jsp</result>
<result name="input">/pet_edit.jsp</result>
</action>
业务层基于Spring框架的IoC容器实现组件管理,通过依赖注入降低各层之间的耦合度。声明式事务管理确保业务操作的数据一致性。
<!-- applicationContext.xml事务配置 -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
数据持久层采用Hibernate ORM框架,通过实体类与数据库表的映射关系,简化数据操作。HQL查询语言提供了面向对象的数据库访问方式。
// Hibernate实体映射示例
@Entity
@Table(name = "t_user")
public class User implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(name = "username", length = 255)
private String username;
@Column(name = "password", length = 255)
private String password;
// 其他字段和方法
}
数据库设计亮点分析
用户表设计优化
用户表(t_user)的设计体现了对系统安全性和扩展性的充分考虑:
CREATE TABLE `t_user` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`address` varchar(255) DEFAULT NULL COMMENT '地址',
`ctime` varchar(255) DEFAULT NULL COMMENT '创建时间',
`password` varchar(255) DEFAULT NULL COMMENT '密码',
`phone` varchar(255) DEFAULT NULL COMMENT '手机号',
`role` int(11) NOT NULL COMMENT '角色',
`truename` varchar(255) DEFAULT NULL COMMENT '真实姓名',
`userlock` int(11) NOT NULL COMMENT '用户锁定状态',
`username` varchar(255) DEFAULT NULL COMMENT '用户名',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='用户表'
设计亮点分析:
- 角色权限控制:
role字段实现了基于角色的访问控制(RBAC),支持普通用户、救助站管理员、系统管理员等多级权限管理 - 安全机制完善:
userlock字段提供账户锁定功能,防止暴力破解攻击 - 信息完整性:包含真实姓名、手机号等必要信息,确保领养流程的真实性验证
- 索引优化:主键ID自增设计提高查询效率,适合高并发场景

订单表结构设计
订单表(t_orderform)的设计支持复杂的业务场景:
CREATE TABLE `t_orderform` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`address` varchar(255) DEFAULT NULL COMMENT '收货地址',
`createtime` varchar(255) DEFAULT NULL COMMENT '创建时间',
`details` text DEFAULT NULL COMMENT '订单详情',
`name` varchar(255) DEFAULT NULL COMMENT '收货人姓名',
`orderid` varchar(255) DEFAULT NULL COMMENT '订单编号',
`payment` varchar(255) DEFAULT NULL COMMENT '支付方式',
`phone` varchar(255) DEFAULT NULL COMMENT '联系电话',
`remark` text DEFAULT NULL COMMENT '备注',
`status` varchar(255) DEFAULT NULL COMMENT '订单状态',
`total` double NOT NULL COMMENT '订单总额',
`userid` int(11) DEFAULT NULL COMMENT '用户ID',
`pids` varchar(255) DEFAULT NULL COMMENT '商品ID集合',
`psl` varchar(255) DEFAULT NULL COMMENT '商品数量集合',
PRIMARY KEY (`id`),
KEY `FK7F0556E748E361B6` (`userid`),
CONSTRAINT `FK7F0556E748E361B6` FOREIGN KEY (`userid`) REFERENCES `t_user` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='订单表'
技术特色:
- 状态管理灵活:
status字段使用varchar类型,支持多种订单状态(待审核、已通过、已完成等) - 数据冗余设计:虽然存在用户表外键关联,但仍存储收货地址、联系方式等冗余信息,确保历史订单数据的完整性
- 商品信息存储:
pids和psl字段采用集合存储方式,支持一个订单包含多个领养申请 - 外键约束:通过外键确保数据一致性,防止孤儿记录产生

核心功能实现解析
宠物信息管理系统
宠物管理模块采用MVC模式实现,Action层处理业务逻辑,Service层实现数据操作,DAO层负责持久化。
// PetAction.java - 宠物相关请求处理
public class PetAction extends ActionSupport {
private PetService petService;
private List<Pet> petList;
private Pet pet;
private Integer petId;
// 获取宠物列表
public String list() {
petList = petService.findAllPets();
return SUCCESS;
}
// 根据ID查询宠物详情
public String detail() {
pet = petService.findPetById(petId);
return SUCCESS;
}
// 添加新宠物
public String add() {
try {
petService.savePet(pet);
addActionMessage("宠物信息添加成功!");
} catch (Exception e) {
addActionError("添加失败:" + e.getMessage());
return INPUT;
}
return SUCCESS;
}
// Getter和Setter方法
public PetService getPetService() { return petService; }
public void setPetService(PetService petService) {
this.petService = petService;
}
// 其他getter/setter...
}
// PetServiceImpl.java - 宠物业务逻辑实现
@Service("petService")
@Transactional
public class PetServiceImpl implements PetService {
@Autowired
private PetDAO petDAO;
@Override
@Transactional(readOnly = true)
public List<Pet> findAllPets() {
return petDAO.findAll();
}
@Override
@Transactional(readOnly = true)
public Pet findPetById(Integer id) {
return petDAO.findById(id);
}
@Override
public void savePet(Pet pet) {
petDAO.save(pet);
}
@Override
public void updatePet(Pet pet) {
petDAO.update(pet);
}
@Override
public void deletePet(Integer id) {
Pet pet = petDAO.findById(id);
if (pet != null) {
petDAO.delete(pet);
}
}
}

购物车与订单流程
购物车模块实现商品暂存、数量调整、价格计算等功能,通过Session管理用户购物车状态。
// CartAction.java - 购物车功能实现
public class CartAction extends ActionSupport {
private CartService cartService;
private User user;
private Integer productId;
private Integer quantity;
private Double totalAmount;
// 添加商品到购物车
public String addToCart() {
User currentUser = (User) ActionContext.getContext()
.getSession().get("currentUser");
if (currentUser == null) {
addActionError("请先登录!");
return LOGIN;
}
try {
cartService.addItemToCart(currentUser.getId(),
productId, quantity);
addActionMessage("商品已成功添加到购物车!");
} catch (Exception e) {
addActionError("添加失败:" + e.getMessage());
return ERROR;
}
return SUCCESS;
}
// 更新购物车商品数量
public String updateCart() {
User currentUser = (User) ActionContext.getContext()
.getSession().get("currentUser");
cartService.updateCartItem(currentUser.getId(),
productId, quantity);
return SUCCESS;
}
// 计算购物车总价
public String calculateTotal() {
User currentUser = (User) ActionContext.getContext()
.getSession().get("currentUser");
totalAmount = cartService.calculateTotal(currentUser.getId());
return SUCCESS;
}
}
// OrderService.java - 订单业务逻辑
@Service("orderService")
@Transactional
public class OrderServiceImpl implements OrderService {
@Autowired
private OrderDAO orderDAO;
@Autowired
private CartService cartService;
@Override
public String createOrder(Integer userId, String address,
String payment) {
// 获取用户购物车信息
List<Cart> cartItems = cartService.getCartByUserId(userId);
if (cartItems.isEmpty()) {
throw new RuntimeException("购物车为空,无法创建订单");
}
// 计算订单总价
Double total = calculateOrderTotal(cartItems);
// 生成订单号
String orderId = generateOrderId();
// 创建订单对象
Order order = new Order();
order.setOrderid(orderId);
order.setUserid(userId);
order.setAddress(address);
order.setPayment(payment);
order.setTotal(total);
order.setCreatetime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
.format(new Date()));
order.setStatus("待处理");
// 保存订单
orderDAO.save(order);
// 清空购物车
cartService.clearCart(userId);
return orderId;
}
private Double calculateOrderTotal(List<Cart> cartItems) {
return cartItems.stream()
.mapToDouble(item -> item.getTotal() * item.getZhekou())
.sum();
}
private String generateOrderId() {
return "ORD" + System.currentTimeMillis() +
String.valueOf((int)(Math.random() * 1000));
}
}

用户权限管理系统
系统实现基于角色的权限控制,不同角色拥有不同的操作权限。
// 用户登录验证
public class LoginAction extends ActionSupport {
private String username;
private String password;
private UserService userService;
public String execute() {
try {
User user = userService.authenticate(username, password);
if (user != null) {
if (user.getUserlock() == 1) {
addActionError("账户已被锁定,请联系管理员");
return ERROR;
}
// 将用户信息存入Session
ActionContext.getContext().getSession()
.put("currentUser", user);
// 根据角色跳转到不同页面
if (user.getRole() == 0) {
return "user";
} else if (user.getRole() == 1) {
return "admin";
} else {
return "rescue";
}
} else {
addActionError("用户名或密码错误");
return ERROR;
}
} catch (Exception e) {
addActionError("登录失败:" + e.getMessage());
return ERROR;
}
}
}
<!-- 权限拦截器配置 -->
<interceptors>
<interceptor name="authInterceptor"
class="com.example.interceptor.AuthInterceptor"/>
<interceptor-stack name="authStack">
<interceptor-ref name="authInterceptor"/>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>
<action name="admin_*" class="adminAction" method="{1}">
<interceptor-ref name="authStack"/>
<result name="success">/admin/{1}.jsp</result>
<result name="login">/login.jsp</result>
</action>
图片管理系统
图片表设计支持多用途图片存储,包括宠物照片、救助站环境图等。
CREATE TABLE `t_pic` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`href` varchar(255) DEFAULT NULL COMMENT '链接地址',
`info` varchar(255) DEFAULT NULL COMMENT '图片信息',
`path` varchar(255) DEFAULT NULL COMMENT '图片路径',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='图片表'
// 图片上传处理
public class FileUploadAction extends ActionSupport {
private File upload;
private String uploadFileName;
private String uploadContentType;
private PicService picService;
public String upload() {
try {
if (upload != null) {
// 生成唯一文件名
String extension = uploadFileName.substring(
uploadFileName.lastIndexOf("."));
String newFileName = UUID.randomUUID() + extension;
// 保存文件到服务器
String savePath = ServletActionContext.getServletContext()
.getRealPath("/uploads");
File destFile = new File(savePath, newFileName);
FileUtils.copyFile(upload, destFile);
// 保存图片信息到数据库
Pic pic = new Pic();
pic.setPath("/uploads/" + newFileName);
pic.setInfo("上传的宠物图片");
picService.save(pic);
addActionMessage("图片上传成功!");
}
} catch (Exception e) {
addActionError("上传失败:" + e.getMessage());
return ERROR;
}
return SUCCESS;
}
}

实体模型设计
系统采用面向对象的设计思想,通过Hibernate实现对象关系映射。核心实体包括用户、宠物、订单、购物车等,它们之间通过关联关系构建完整的业务模型。
// 宠物实体类
@Entity
@Table(name = "t_product")
public class Pet implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(name = "pet_name")
private String petName;
@Column(name = "category")
private String category;
@Column(name = "age")
private Integer age;
@Column(name = "health_status")
private String healthStatus;
@Column(name = "description", length = 1000)
private String description;
@Column(name = "adoption_status")
private String adoptionStatus;
@ManyToOne
@JoinColumn(name = "rescue_station_id")
private RescueStation rescueStation;
@OneToMany(mappedBy = "pet", cascade = CascadeType.ALL)
private Set<AdoptionApplication> applications;
// 构造方法、getter、setter等
}
// 领养申请实体类
@Entity
@Table(name = "t_adoption_application")
public class AdoptionApplication implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@ManyToOne
@JoinColumn(name = "user_id")
private User applicant;
@ManyToOne
@JoinColumn(name = "pet_id")
private Pet pet;
@Column(name = "apply_time")
private Date applyTime;
@Column(name = "status")
private String status; // 待审核、已通过、已拒绝
@Column(name = "application_reason", length = 500)
private String applicationReason;
@Column(name = "family_environment", length = 500)
private String familyEnvironment;
// 其他字段和方法
}
功能展望与优化方向
1. 引入Redis缓存提升性能
当前系统在处理高并发查询时可能存在性能瓶颈。未来可以引入Redis作为缓存层,存储热点数据如宠物列表、用户信息等。
// Redis缓存配置示例
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
return template;
}
}
// 使用缓存注解
@Service
public class PetServiceImpl implements PetService {
@Cacheable(value = "pets", key = "#category")
public List<Pet> findPetsByCategory(String category) {
// 数据库查询逻辑
return petDAO.findByCategory(category);
}
@CacheEvict(value = "pets", allEntries = true)
public void updatePet(Pet pet) {
petDAO.update(pet);
}
}