1. 项目概述与核心需求
宠物领养网站是一个连接爱心人士与待领养宠物的在线平台。作为开发者,我们需要构建一个功能完善、安全可靠的系统,让用户可以方便地浏览待领养宠物信息,提交领养申请,同时为管理员提供高效的管理工具。
这个项目采用SSM(Spring+SpringMVC+MyBatis)框架组合开发,前端使用Bootstrap+jQuery构建响应式界面。系统需要实现以下核心功能:
- 用户注册、登录和个人信息管理
- 宠物信息展示与多条件筛选
- 在线领养申请与状态跟踪
- 后台管理功能(宠物信息管理、申请审核等)
2. 技术栈选型与架构设计
2.1 后端技术选型
我们选择SSM框架组合作为后端基础,具体版本如下:
- Spring 5.3.18:提供IoC容器和AOP支持
- Spring MVC 5.3.18:处理Web请求和响应
- MyBatis 3.5.9:数据库持久层框架
选择SSM框架的主要考虑:
- 成熟稳定:SSM是Java Web开发的经典组合,社区支持完善
- 分层清晰:各层职责分明,便于维护和扩展
- 灵活性:MyBatis可以灵活编写SQL,适合复杂查询场景
2.2 前端技术选型
前端采用以下技术组合:
- Bootstrap 5:响应式布局和基础UI组件
- jQuery 3.6:DOM操作和AJAX请求
- JSP:视图层模板技术
- LayUI:部分管理后台UI组件
这种组合的优势在于:
- 开发效率高,组件丰富
- 兼容性好,适配各种设备
- 学习成本低,适合团队协作
2.3 系统架构设计
系统采用典型的三层架构:
- 表现层:JSP+前端框架处理用户交互
- 业务逻辑层:Spring MVC控制器处理业务逻辑
- 数据访问层:MyBatis实现数据库操作
架构图如下:
code复制[用户浏览器]
→ [Nginx]
→ [Tomcat]
→ [Spring MVC]
→ [MyBatis]
→ [MySQL]
3. 数据库设计与实现
3.1 数据库表设计
核心表结构设计如下:
- 用户表(user)
sql复制CREATE TABLE `user` (
`user_id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL,
`password_hash` varchar(100) NOT NULL,
`real_name` varchar(50) DEFAULT NULL,
`phone` varchar(20) DEFAULT NULL,
`email` varchar(100) DEFAULT NULL,
`address` varchar(200) DEFAULT NULL,
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`user_id`),
UNIQUE KEY `idx_username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
- 宠物表(pet)
sql复制CREATE TABLE `pet` (
`pet_id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`breed` varchar(50) NOT NULL,
`age` int(11) DEFAULT NULL,
`gender` tinyint(1) DEFAULT NULL COMMENT '0-雌性 1-雄性',
`description` text,
`health_status` varchar(50) DEFAULT NULL,
`vaccination` varchar(200) DEFAULT NULL,
`status` tinyint(1) DEFAULT '0' COMMENT '0-待领养 1-已领养 2-已预约',
`cover_image` varchar(255) DEFAULT NULL,
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`pet_id`),
KEY `idx_status` (`status`),
KEY `idx_breed` (`breed`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
- 领养记录表(adoption)
sql复制CREATE TABLE `adoption` (
`adoption_id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`pet_id` int(11) NOT NULL,
`apply_time` datetime DEFAULT CURRENT_TIMESTAMP,
`status` tinyint(1) DEFAULT '0' COMMENT '0-待审核 1-已通过 2-已拒绝',
`remark` varchar(500) DEFAULT NULL,
`admin_id` int(11) DEFAULT NULL,
`audit_time` datetime DEFAULT NULL,
PRIMARY KEY (`adoption_id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_pet_id` (`pet_id`),
CONSTRAINT `fk_adoption_pet` FOREIGN KEY (`pet_id`) REFERENCES `pet` (`pet_id`),
CONSTRAINT `fk_adoption_user` FOREIGN KEY (`user_id`) REFERENCES `user` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3.2 数据库优化策略
-
索引优化:
- 为常用查询字段创建索引
- 联合索引遵循最左前缀原则
- 避免过度索引影响写入性能
-
查询优化:
- 使用EXPLAIN分析慢查询
- 避免SELECT *,只查询必要字段
- 合理使用JOIN,避免笛卡尔积
-
分表分库考虑:
- 单表数据量超过500万考虑分表
- 按业务维度考虑分库
4. 核心功能实现
4.1 用户模块实现
4.1.1 用户注册与登录
用户注册流程:
- 前端表单验证基础信息
- 后端校验用户名唯一性
- 密码使用BCrypt加密存储
- 发送激活邮件(可选)
关键代码示例:
java复制// 用户服务层
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Autowired
private PasswordEncoder passwordEncoder;
@Override
public Result register(UserRegisterDTO dto) {
// 检查用户名是否已存在
if(userMapper.findByUsername(dto.getUsername()) != null) {
return Result.fail("用户名已存在");
}
// 密码加密
User user = new User();
user.setUsername(dto.getUsername());
user.setPasswordHash(passwordEncoder.encode(dto.getPassword()));
user.setEmail(dto.getEmail());
// 保存用户
userMapper.insert(user);
return Result.success("注册成功");
}
}
4.1.2 密码安全策略
- 使用BCryptPasswordEncoder加密密码
- 密码强度要求:
- 长度至少8位
- 包含字母和数字
- 可选特殊字符
- 定期提示修改密码
- 登录失败次数限制
4.2 宠物模块实现
4.2.1 宠物信息展示
实现功能:
- 分页列表展示
- 多条件筛选(品种、年龄、性别等)
- 详情页展示
- 图片懒加载
MyBatis映射示例:
xml复制<!-- 宠物分页查询 -->
<select id="selectPetsByCondition" resultType="Pet">
SELECT * FROM pet
WHERE status = 'AVAILABLE'
<if test="breed != null">AND breed = #{breed}</if>
<if test="minAge != null">AND age >= #{minAge}</if>
<if test="maxAge != null">AND age <= #{maxAge}</if>
<if test="gender != null">AND gender = #{gender}</if>
ORDER BY create_time DESC
LIMIT #{offset}, #{pageSize}
</select>
4.2.2 图片上传处理
- 使用Apache Commons FileUpload处理文件上传
- 图片存储策略:
- 本地存储(开发环境)
- 云存储(生产环境)
- 图片处理:
- 生成缩略图
- 限制文件类型和大小
- 重命名防止冲突
4.3 领养模块实现
4.3.1 领养申请流程
- 用户浏览宠物详情
- 点击"申请领养"按钮
- 填写申请表(联系方式、居住环境等)
- 提交申请
- 管理员审核
- 用户查看申请状态
状态机设计:
code复制待提交 → 待审核 → (通过/拒绝)
↓
已完成
4.3.2 申请审核实现
管理员后台功能:
- 查看待审核申请列表
- 查看申请详情
- 审核通过/拒绝
- 填写审核意见
- 通知申请人
关键代码:
java复制@Controller
@RequestMapping("/admin/adoption")
public class AdminAdoptionController {
@Autowired
private AdoptionService adoptionService;
@PostMapping("/audit")
@ResponseBody
public Result audit(@RequestParam Long adoptionId,
@RequestParam Integer status,
@RequestParam(required = false) String remark) {
// 获取当前管理员ID
Integer adminId = getCurrentAdminId();
// 执行审核
adoptionService.audit(adoptionId, status, remark, adminId);
return Result.success("操作成功");
}
}
5. 安全与性能优化
5.1 安全防护措施
-
认证与授权:
- 使用Spring Security框架
- 基于角色的访问控制(RBAC)
- 防止越权访问
-
数据安全:
- 敏感信息加密存储
- 接口参数校验
- XSS和SQL注入防护
-
会话安全:
- 使用HTTPS传输
- CSRF防护
- 会话超时设置
5.2 性能优化策略
-
缓存策略:
- Redis缓存热门宠物数据
- MyBatis二级缓存
- 页面静态化
-
数据库优化:
- 读写分离(主从复制)
- 慢查询监控
- 连接池配置
-
前端优化:
- 资源合并与压缩
- CDN加速
- 懒加载
6. 测试与部署
6.1 测试策略
-
单元测试:
- 使用JUnit+Mockito
- 覆盖率目标80%以上
- 重点测试业务逻辑
-
接口测试:
- 使用Postman
- 自动化测试脚本
- 边界值测试
-
压力测试:
- 使用JMeter模拟并发
- 测试系统瓶颈
- 优化建议
6.2 部署方案
生产环境部署架构:
code复制[Nginx] → [Tomcat集群] → [MySQL主从] → [Redis]
部署步骤:
-
环境准备:
- JDK 1.8+
- Tomcat 9.x
- MySQL 8.0
- Redis 6.x
-
应用部署:
bash复制# 打包应用 mvn clean package -DskipTests # 上传war包到Tomcat scp target/pet-adoption.war user@server:/opt/tomcat/webapps/ # 启动Tomcat /opt/tomcat/bin/startup.sh -
Nginx配置:
nginx复制upstream tomcat_cluster { server 127.0.0.1:8080 weight=1; server 192.168.1.2:8080 weight=1; } server { listen 80; server_name petadoption.com; location / { proxy_pass http://tomcat_cluster; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } location ~* \.(jpg|png|css|js)$ { root /opt/static; expires 30d; } }
7. 开发经验与注意事项
7.1 开发中的常见问题
-
MyBatis映射问题:
- 属性名与列名不一致
- 复杂结果集映射
- 动态SQL语法错误
-
事务管理:
- 事务传播行为设置不当
- 异常处理导致事务不回滚
- 长事务问题
-
性能陷阱:
- N+1查询问题
- 大对象序列化
- 循环依赖
7.2 实用技巧分享
-
开发效率提升:
- 使用MyBatis Generator生成基础代码
- 配置热部署(spring-boot-devtools)
- 合理使用IDE模板
-
调试技巧:
- 使用Arthas进行线上诊断
- 日志级别动态调整
- 接口Mock测试
-
团队协作:
- 统一的代码风格
- 清晰的接口文档
- 定期代码评审
7.3 项目扩展方向
-
功能扩展:
- 宠物健康档案
- 领养后跟踪
- 社区互动功能
-
技术升级:
- 微服务架构改造
- 前后端分离
- 大数据分析
-
运营支持:
- 数据统计报表
- 营销活动支持
- 多端适配