1. 项目背景与技术选型
民宿预约系统作为典型的Web应用,需要同时满足用户友好的前端交互和稳定的后端服务。基于这个需求,我们选择了以下技术栈:
- 前端:Vue.js框架,提供响应式组件开发
- 后端:Python Flask轻量级框架,搭配Django ORM
- 开发工具:PyCharm专业版(支持Vue开发)
- 数据库:MySQL关系型数据库
这种技术组合的优势在于:
- Vue的组件化开发模式非常适合构建复杂的预约界面
- Flask的轻量级特性让API开发更加灵活
- Django ORM提供了强大的数据模型支持
- PyCharm对全栈开发提供了完善的支持
提示:虽然项目使用了Django ORM,但并未采用完整的Django框架,这种混合架构需要特别注意两者的兼容性问题。
2. 开发环境配置
2.1 PyCharm专业版设置
-
安装Vue.js插件:
- 打开PyCharm → Preferences → Plugins
- 搜索并安装"Vue.js"插件
- 重启IDE使插件生效
-
配置Node.js环境:
bash复制# 检查Node.js版本 node -v # 推荐使用LTS版本(16.x或18.x) -
创建Vue项目:
bash复制
npm init vue@latest
2.2 Python环境搭建
-
创建虚拟环境:
bash复制python -m venv venv source venv/bin/activate # Linux/Mac venv\Scripts\activate # Windows -
安装依赖包:
python复制
pip install flask flask-sqlalchemy django mysqlclient
3. 系统架构设计
3.1 前端架构
采用Vue 3组合式API开发,主要模块包括:
- 用户认证模块(登录/注册)
- 民宿展示模块(列表/详情)
- 预约管理模块(创建/取消预约)
- 用户中心模块(个人信息/历史记录)
典型组件结构:
code复制src/
├── components/
│ ├── Header.vue
│ ├── RoomCard.vue
│ └── DatePicker.vue
├── views/
│ ├── Home.vue
│ ├── Detail.vue
│ └── User.vue
└── App.vue
3.2 后端API设计
Flask路由示例:
python复制from flask import Flask, jsonify
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://user:pass@localhost/bnb'
db = SQLAlchemy(app)
@app.route('/api/rooms', methods=['GET'])
def get_rooms():
rooms = Room.query.all()
return jsonify([r.to_dict() for r in rooms])
4. 核心功能实现
4.1 民宿列表展示
前端实现关键代码:
vue复制<script setup>
import { ref, onMounted } from 'vue'
import RoomCard from '@/components/RoomCard.vue'
const rooms = ref([])
onMounted(async () => {
const res = await fetch('/api/rooms')
rooms.value = await res.json()
})
</script>
<template>
<div class="room-list">
<RoomCard
v-for="room in rooms"
:key="room.id"
:room="room"
/>
</div>
</template>
4.2 预约功能实现
后端预约逻辑:
python复制from datetime import datetime
@app.route('/api/book', methods=['POST'])
def create_booking():
data = request.get_json()
# 检查日期冲突
existing = Booking.query.filter(
Booking.room_id == data['room_id'],
Booking.check_in <= data['check_out'],
Booking.check_out >= data['check_in']
).first()
if existing:
return jsonify({'error': '日期冲突'}), 400
booking = Booking(
user_id=data['user_id'],
room_id=data['room_id'],
check_in=datetime.strptime(data['check_in'], '%Y-%m-%d'),
check_out=datetime.strptime(data['check_out'], '%Y-%m-%d')
)
db.session.add(booking)
db.session.commit()
return jsonify({'success': True})
5. 数据库设计
使用Django ORM定义模型:
python复制from django.db import models
class Room(models.Model):
title = models.CharField(max_length=100)
price = models.DecimalField(max_digits=8, decimal_places=2)
capacity = models.PositiveIntegerField()
amenities = models.JSONField(default=list)
def __str__(self):
return self.title
class Booking(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
room = models.ForeignKey(Room, on_delete=models.CASCADE)
check_in = models.DateField()
check_out = models.DateField()
created_at = models.DateTimeField(auto_now_add=True)
class Meta:
indexes = [
models.Index(fields=['room', 'check_in', 'check_out']),
]
6. 项目调试与优化
6.1 前后端联调技巧
-
配置开发代理解决跨域:
javascript复制// vite.config.js export default defineConfig({ server: { proxy: { '/api': { target: 'http://localhost:5000', changeOrigin: true } } } }) -
使用PyCharm的HTTP客户端测试API:
code复制
GET http://localhost:5000/api/rooms Accept: application/json
6.2 性能优化建议
-
数据库查询优化:
python复制# 避免N+1查询问题 rooms = Room.query.options(joinedload('images')).all() -
前端懒加载:
vue复制<img v-for="img in room.images" :src="img.thumbnail" loading="lazy" >
7. 部署方案
7.1 生产环境配置
推荐部署架构:
- 前端:Nginx + Vite打包的静态文件
- 后端:Gunicorn + Flask
- 数据库:MySQL主从复制
部署脚本示例:
bash复制# 前端构建
npm run build
# 后端启动
gunicorn -w 4 -b 0.0.0.0:5000 app:app
7.2 持续集成配置
GitHub Actions示例:
yaml复制name: CI
on: [push]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- run: npm install
- run: npm test
- run: pip install -r requirements.txt
- run: python manage.py test
8. 常见问题解决
-
Vue组件热更新失效:
- 检查PyCharm中是否启用了"Safe Write"功能
- 确保Vite服务器配置正确
-
Flask与Django ORM冲突:
- 避免同时使用两者的session管理
- 显式指定Django的数据库连接
-
时区问题:
python复制# settings.py TIME_ZONE = 'Asia/Shanghai' USE_TZ = True
在实际开发中,我发现PyCharm的Vue模板支持对提高开发效率帮助很大,特别是代码自动补全和组件导航功能。对于复杂的预约逻辑,建议先设计好状态流转图,再实现具体代码,这样可以避免很多边界条件问题。
