1. 项目概述
校园周边美食探索及分享平台是一个典型的Web应用系统,采用前后端分离架构,前端使用Vue3框架,后端基于SpringBoot+MyBatis技术栈,数据库采用MySQL。这个系统主要面向高校学生群体,帮助他们发现、评价和分享校园周边的美食信息。
作为一个全栈项目,它涵盖了从数据库设计到前端展示的完整开发流程。系统需要处理用户认证、美食信息管理、评价互动等核心功能模块,同时要考虑移动端适配和性能优化问题。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术选型解析
2.1 后端技术栈
SpringBoot作为后端框架的选择主要基于以下几个考虑:
- 快速开发:自动配置和起步依赖大大减少了样板代码
- 微服务友好:便于后期扩展为微服务架构
- 丰富的生态系统:与MyBatis、Spring Security等组件无缝集成
MyBatis作为ORM框架的优势在于:
- 灵活的SQL编写能力,适合复杂查询场景
- 动态SQL支持,便于构建条件查询
- 与SpringBoot集成简单,通过MyBatis-Spring-Boot-Starter即可快速配置
2.2 前端技术栈
Vue3作为前端框架的选择理由:
- Composition API提供了更好的代码组织和复用
- 性能优化:更快的虚拟DOM和更小的包体积
- TypeScript支持完善,适合中大型项目开发
- 丰富的生态系统(Vue Router、Pinia等)
2.3 数据库选型
MySQL作为关系型数据库的考虑因素:
- 高校场景下数据关系明确(用户-店铺-评价)
- 事务支持完善,保证数据一致性
- 成熟的索引机制,适合读多写少的场景
- 社区活跃,问题解决方案丰富
3. 系统架构设计
3.1 整体架构
系统采用经典的三层架构:
- 表现层:Vue3前端应用
- 业务逻辑层:SpringBoot后端服务
- 数据访问层:MyBatis+MySQL
前后端通过RESTful API进行通信,使用JSON作为数据交换格式。
3.2 数据库设计
核心表结构包括:
- 用户表(user):存储用户基本信息
- 美食店铺表(shop):记录店铺信息
- 评价表(review):用户对店铺的评价
- 收藏表(favorite):用户的收藏记录
sql复制CREATE TABLE `user` (
`id` bigint NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL,
`password` varchar(100) NOT NULL,
`avatar` varchar(255) DEFAULT NULL,
`create_time` datetime NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `shop` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL,
`address` varchar(255) NOT NULL,
`phone` varchar(20) DEFAULT NULL,
`business_hours` varchar(100) DEFAULT NULL,
`description` text,
`cover_image` varchar(255) DEFAULT NULL,
`avg_rating` decimal(3,1) DEFAULT '0.0',
`create_time` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3.3 API设计规范
遵循RESTful设计原则:
- 使用HTTP动词表示操作类型
- 资源使用复数名词
- 状态码规范使用
- 统一的响应格式
示例API设计:
code复制GET /api/shops - 获取店铺列表
POST /api/shops - 创建新店铺
GET /api/shops/{id} - 获取特定店铺详情
PUT /api/shops/{id} - 更新店铺信息
DELETE /api/shops/{id} - 删除店铺
GET /api/shops/{id}/reviews - 获取店铺评价
4. 核心功能实现
4.1 用户认证模块
采用JWT(JSON Web Token)实现无状态认证:
- 用户登录成功后生成Token
- Token包含用户基本信息
- 前端存储Token并在后续请求中携带
- 后端验证Token有效性
Spring Security配置示例:
java复制@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.antMatchers("/api/auth/**").permitAll()
.anyRequest().authenticated()
.and()
.addFilter(new JwtAuthenticationFilter(authenticationManager()))
.addFilter(new JwtAuthorizationFilter(authenticationManager()))
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS);
}
}
4.2 美食店铺管理
店铺CRUD实现要点:
- 分页查询:使用MyBatis-PageHelper插件
- 条件查询:动态SQL构建
- 图片上传:使用阿里云OSS或本地存储
- 平均评分计算:触发器或定时任务
MyBatis动态SQL示例:
xml复制<select id="selectShopsByCondition" resultType="Shop">
SELECT * FROM shop
<where>
<if test="name != null and name != ''">
AND name LIKE CONCAT('%',#{name},'%')
</if>
<if test="minRating != null">
AND avg_rating >= #{minRating}
</if>
</where>
ORDER BY avg_rating DESC
</select>
4.3 评价与互动功能
评价系统实现细节:
- 评价提交:表单验证、敏感词过滤
- 评价展示:分页加载、排序选项
- 点赞功能:Redis缓存优化
- 举报机制:内容审核流程
Vue3评价组件示例:
vue复制<template>
<div class="review-form">
<h3>发表评价</h3>
<el-rate v-model="form.rating" />
<el-input
type="textarea"
v-model="form.content"
:rows="4"
placeholder="分享你的用餐体验..."
/>
<el-button type="primary" @click="submitReview">提交评价</el-button>
</div>
</template>
<script setup>
import { ref } from 'vue'
import { ElMessage } from 'element-plus'
import { postReview } from '@/api/review'
const form = ref({
shopId: props.shopId,
rating: 5,
content: ''
})
const submitReview = async () => {
try {
await postReview(form.value)
ElMessage.success('评价提交成功')
emit('submitted')
} catch (error) {
ElMessage.error('评价提交失败')
}
}
</script>
5. 性能优化实践
5.1 数据库优化
- 索引优化:为常用查询字段添加索引
- 查询优化:避免SELECT *,使用覆盖索引
- 连接池配置:合理设置HikariCP参数
- 慢查询监控:开启慢查询日志
5.2 缓存策略
- Redis缓存热点数据:店铺详情、热门评价
- 本地缓存:配置信息、静态数据
- 缓存失效策略:合理设置TTL
- 缓存穿透防护:布隆过滤器或空值缓存
Spring Cache配置示例:
java复制@Configuration
@EnableCaching
public class CacheConfig {
@Bean
public RedisCacheManager cacheManager(RedisConnectionFactory factory) {
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofHours(1))
.disableCachingNullValues()
.serializeValuesWith(RedisSerializationContext.SerializationPair
.fromSerializer(new GenericJackson2JsonRedisSerializer()));
return RedisCacheManager.builder(factory)
.cacheDefaults(config)
.transactionAware()
.build();
}
}
5.3 前端性能优化
- 代码分割:按需加载路由组件
- 图片懒加载:Intersection Observer API
- 资源压缩:Gzip/Brotli压缩
- CDN加速:静态资源分发
Vue3懒加载示例:
javascript复制const routes = [
{
path: '/shops',
component: () => import('@/views/ShopList.vue')
},
{
path: '/shops/:id',
component: () => import('@/views/ShopDetail.vue')
}
]
6. 部署与运维
6.1 后端部署
- 打包:使用SpringBoot Maven插件生成可执行JAR
- 配置:外部化application.properties
- 启动:nohup或systemd服务管理
- 监控:Spring Boot Actuator+Prometheus
6.2 前端部署
- 构建:Vue CLI生产环境构建
- 部署:Nginx静态文件服务
- 配置:反向代理API请求
- HTTPS:Let's Encrypt证书
Nginx配置示例:
nginx复制server {
listen 80;
server_name foodie.example.com;
location / {
root /var/www/foodie;
try_files $uri $uri/ /index.html;
}
location /api {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
6.3 数据库维护
- 备份策略:定时全量+增量备份
- 监控:慢查询、连接数监控
- 优化:定期执行ANALYZE TABLE
- 扩容:读写分离或分库分表方案
7. 常见问题与解决方案
7.1 跨域问题
解决方案:
- 后端配置CORS
- Nginx反向代理
- 开发环境配置代理
SpringBoot CORS配置:
java复制@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowedHeaders("*")
.maxAge(3600);
}
}
7.2 图片上传与访问
常见问题:
- 文件大小限制
- 文件类型校验
- 存储空间管理
- 访问权限控制
解决方案:
- SpringBoot配置multipart参数
- 前端文件类型校验
- 使用云存储服务
- 签名URL访问控制
7.3 并发冲突处理
场景:
- 评价点赞计数
- 店铺信息更新
- 用户数据修改
解决方案:
- 乐观锁机制
- Redis原子操作
- 数据库事务隔离
乐观锁实现示例:
java复制@Update("UPDATE shop SET name=#{name}, version=version+1 WHERE id=#{id} AND version=#{version}")
int updateWithVersion(Shop shop);
8. 项目扩展方向
8.1 移动端适配
- 开发微信小程序版本
- 响应式设计优化
- PWA支持
- 原生App封装
8.2 推荐系统
- 基于用户行为的协同过滤
- 基于内容的推荐
- 热门榜单
- 地理位置推荐
8.3 社交功能增强
- 用户关注关系
- 美食打卡
- 话题讨论
- 活动组织
8.4 商业化探索
- 商家入驻
- 优惠券系统
- 外卖对接
- 广告系统
在实际开发中,这个项目最耗时的部分往往是细节打磨和性能调优。比如评价系统的实时更新、图片加载的流畅体验、搜索功能的响应速度等,都需要反复测试和优化。一个实用的建议是尽早建立自动化测试体系,包括单元测试、集成测试和端到端测试,这能显著提高开发效率和系统稳定性。
