1. 项目概述
城市垃圾分类管理系统是一个基于SpringBoot+Vue+MySQL技术栈开发的毕业设计项目,旨在解决当前城市垃圾分类管理中的痛点问题。作为一名参与过多个校园信息化项目开发的研究生,我发现传统垃圾分类管理存在数据采集困难、分类标准不统一、居民参与度低等实际问题。这个系统通过信息化手段,实现了从垃圾投放到处理的全流程数字化管理。
系统最核心的价值在于:一方面为居民提供便捷的分类查询和记录功能,另一方面为管理者提供数据支持和决策依据。在实际开发过程中,我们特别注重系统的实用性和易用性,避免了很多毕业设计项目"纸上谈兵"的问题。系统采用前后端分离架构,后端使用SpringBoot提供RESTful API,前端使用Vue.js构建响应式界面,数据库选用稳定可靠的MySQL。
2. 系统设计与技术选型
2.1 技术栈选择考量
选择SpringBoot作为后端框架主要基于以下几点考虑:
- 快速开发:SpringBoot的自动配置和起步依赖大大简化了项目搭建过程
- 生态丰富:可以方便地集成MyBatis、Spring Security等常用组件
- 易于部署:内嵌Tomcat,打包成jar即可运行,非常适合毕业设计演示
前端选择Vue.js而非React或Angular,主要因为:
- 学习曲线平缓,适合学生团队快速上手
- 组件化开发模式与ElementUI配合良好
- 响应式特性完美适配移动端访问需求
数据库选用MySQL 8.0版本,因其:
- 开源免费,适合学生项目
- 事务支持完善,数据一致性有保障
- 与SpringBoot生态集成度高
2.2 系统架构设计
系统采用经典的三层架构:
- 表现层:Vue.js + ElementUI
- 业务逻辑层:SpringBoot + Spring Security
- 数据访问层:MyBatis + MySQL
这种分层设计使得各层职责清晰,便于团队协作开发和后期维护。特别值得一提的是,我们在架构设计中加入了JWT认证机制,既保证了安全性,又避免了传统Session认证的服务器资源占用问题。
提示:在开发环境搭建时,建议使用Docker容器化MySQL数据库,可以避免本地安装带来的环境配置问题。具体命令:docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:8.0
3. 数据库设计与实现
3.1 核心数据表结构
3.1.1 用户信息表(user_info)
sql复制CREATE TABLE `user_info` (
`user_id` bigint NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL,
`password_hash` varchar(100) NOT NULL,
`role_type` varchar(20) NOT NULL DEFAULT 'USER',
`register_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`last_login` datetime DEFAULT NULL,
PRIMARY KEY (`user_id`),
UNIQUE KEY `username_UNIQUE` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
密码存储采用BCrypt加密算法,这是目前最推荐的方式,相比MD5和SHA更加安全。在Spring Security中可以通过PasswordEncoder接口轻松实现。
3.1.2 垃圾分类表(garbage_category)
sql复制CREATE TABLE `garbage_category` (
`garbage_id` bigint NOT NULL AUTO_INCREMENT,
`garbage_name` varchar(50) NOT NULL,
`category` varchar(20) NOT NULL,
`disposal_method` varchar(100) DEFAULT NULL,
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`garbage_id`),
KEY `idx_category` (`category`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
为提高查询效率,我们在category字段上建立了索引。垃圾分类采用四分类法:可回收物、有害垃圾、厨余垃圾和其他垃圾。
3.2 数据库优化实践
在实际开发中,我们发现投放记录表(disposal_record)在数据量增大后查询变慢,通过以下措施进行了优化:
- 添加复合索引:针对常用的查询条件组合(user_id + drop_time)建立索引
- 数据分区:按月份对记录表进行分区,提高大数据量下的查询效率
- 引入缓存:对频繁访问但不常变的垃圾分类数据使用Redis缓存
sql复制ALTER TABLE `disposal_record` ADD INDEX `idx_user_drop` (`user_id`, `drop_time`);
4. 核心功能实现细节
4.1 垃圾分类查询功能
前端实现采用了Vue的组件化开发模式,主要包含:
- 搜索框组件:支持模糊搜索和分类筛选
- 结果列表组件:展示垃圾名称、分类和处理方式
- 详情弹窗组件:显示更详细的处理建议和注意事项
后端接口设计遵循RESTful规范:
code复制GET /api/garbage?keyword=电池&category=有害
响应数据结构示例:
json复制{
"code": 200,
"data": [
{
"garbageId": 102,
"garbageName": "锂电池",
"category": "有害垃圾",
"disposalMethod": "应投放至红色有害垃圾箱,避免短路和高温"
}
]
}
4.2 垃圾投放记录功能
这是系统的核心功能之一,实现要点包括:
- 前端表单验证:确保必填项完整,重量为有效数字
- 位置获取:集成高德地图API获取精确定位
- 数据提交:使用axios发送POST请求,处理可能的网络错误
后端关键代码片段:
java复制@PostMapping("/api/disposal")
public Result logDisposal(@RequestBody DisposalRecord record,
@RequestHeader("Authorization") String token) {
Long userId = JwtUtil.parseToken(token);
record.setUserId(userId);
record.setDropTime(new Date());
disposalService.saveRecord(record);
return Result.success("记录成功");
}
5. 权限管理与安全控制
5.1 基于角色的访问控制
系统区分两种角色:
- 普通用户:可以查询分类、记录投放、查看个人数据
- 管理员:可以管理用户、查看所有数据、生成报表
权限控制通过Spring Security实现,主要配置类如下:
java复制@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.antMatchers("/api/admin/**").hasRole("ADMIN")
.antMatchers("/api/**").authenticated()
.anyRequest().permitAll()
.and()
.addFilter(new JwtAuthenticationFilter(authenticationManager()))
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
}
}
5.2 JWT认证实现
JWT(JSON Web Token)认证流程:
- 用户登录成功后生成包含用户ID和角色的token
- 客户端将token存储在localStorage中
- 每次请求在Authorization头中携带token
- 服务端通过JwtFilter验证token有效性
生成token的关键代码:
java复制public class JwtUtil {
private static final String SECRET = "your-secret-key";
private static final long EXPIRATION = 86400000; // 24小时
public static String generateToken(Long userId, String role) {
return Jwts.builder()
.setSubject(userId.toString())
.claim("role", role)
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + EXPIRATION))
.signWith(SignatureAlgorithm.HS512, SECRET)
.compact();
}
}
6. 典型问题与解决方案
6.1 跨域问题处理
在前后端分离开发中,跨域是常见问题。我们的解决方案:
- 后端配置CORS:
java复制@Bean
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
config.addAllowedOrigin("*");
config.addAllowedHeader("*");
config.addAllowedMethod("*");
source.registerCorsConfiguration("/**", config);
return new CorsFilter(source);
}
- 前端axios配置:
javascript复制axios.defaults.baseURL = 'http://localhost:8080';
axios.defaults.headers.common['Authorization'] = localStorage.getItem('token');
6.2 文件上传大小限制
在实现数据导入功能时,遇到SpringBoot默认文件大小限制(1MB),解决方案:
在application.properties中添加:
code复制spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
6.3 日期时间处理
前后端日期格式不一致是常见痛点,我们采用的解决方案:
- 后端统一返回时间戳:
java复制@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date dropTime;
- 前端使用moment.js格式化显示:
javascript复制import moment from 'moment';
moment(record.dropTime).format('YYYY-MM-DD HH:mm:ss')
7. 项目部署实践
7.1 后端部署
推荐使用Docker容器化部署,Dockerfile示例:
dockerfile复制FROM openjdk:8-jdk-alpine
VOLUME /tmp
COPY target/classify-system-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
构建和运行命令:
bash复制docker build -t classify-system .
docker run -d -p 8080:8080 --name classify-app classify-system
7.2 前端部署
使用Nginx作为静态资源服务器,配置示例:
nginx复制server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
location /api {
proxy_pass http://backend:8080;
}
}
注意:在正式环境部署时,务必修改默认的数据库密码和JWT密钥,不要使用示例中的值。同时建议启用HTTPS以保证数据传输安全。
8. 项目扩展方向
在实际开发过程中,我们发现系统还可以进一步扩展:
- 智能识别:集成图像识别API,通过拍照自动识别垃圾类别
- 积分系统:建立垃圾分类积分奖励机制,提高用户参与度
- 大数据分析:使用Python对投放数据进行挖掘,生成可视化报表
- 小程序端:开发微信小程序版本,提高用户便捷性
以积分系统为例,可以在数据库中添加积分表:
sql复制CREATE TABLE `credit_record` (
`id` bigint NOT NULL AUTO_INCREMENT,
`user_id` bigint NOT NULL,
`change_value` int NOT NULL,
`change_reason` varchar(100) NOT NULL,
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_user` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
这个毕业设计项目从技术选型到功能实现都充分考虑到了实用性和扩展性,采用的主流技术栈也让学生能够学到企业级的开发经验。在开发过程中,我们特别注重代码规范和项目文档的完整性,确保项目易于理解和维护。