# WhatToEat **Repository Path**: binaryPhilosopher/what-to-eat ## Basic Information - **Project Name**: WhatToEat - **Description**: 今天吃什么系统是一个基于Django开发的Web应用,旨在帮助用户解决"今天吃什么"的选择困难问题。系统提供随机推荐、美食列表、美食分享等功能,让用户能够轻松找到自己喜欢的美食,解决日常就餐选择难题。 - **Primary Language**: Python - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-01-24 - **Last Updated**: 2026-01-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: Python, Django, JavaScript, HTML, CSS ## README # 今天吃什么系统 ## 项目简介 今天吃什么系统是一个基于Django开发的Web应用,旨在帮助用户解决"今天吃什么"的选择困难问题。系统提供随机推荐、美食列表、美食分享等功能,让用户能够轻松找到自己喜欢的美食,解决日常就餐选择难题。 ## 系统亮点 1. **解决选择困难**:专注于帮助用户快速决定"今天吃什么",提供随机推荐功能 2. **响应式设计**:适配各种设备尺寸,包括电脑、平板和手机 3. **智能图片处理**:自动修复EXIF旋转,优化图片显示比例和大小 4. **安全可靠**:多重安全防护机制,防止SQL注入、XSS攻击等 5. **用户友好**:简洁直观的界面设计,操作流畅 6. **功能完备**:涵盖随机推荐、美食列表、美食分享、分享记录、Bug反馈等功能 7. **易于扩展**:基于Django框架,代码结构清晰,便于后续功能扩展 8. **管理便捷**:提供完善的后台管理功能,方便管理员维护系统 ## 系统功能详细描述 ### 用户功能 #### 1. 随机推荐 - **功能描述**:系统核心功能,每次刷新页面或点击"再换一个"按钮,系统会从数据库中随机选择一道已审核通过的美食进行推荐 - **访问方式**:系统默认跳转到该页面,或通过首页直接访问 - **设计理念**:解决用户"今天吃什么"的选择困难问题,提供快速、便捷的美食推荐 #### 2. 美食列表 - **功能描述**:展示所有已审核通过的美食,支持按分类筛选和关键词搜索 - **筛选功能**:可按美食分类(如中餐、西餐、甜点等)进行筛选 - **搜索功能**:支持通过美食名称、地点等关键词进行搜索 - **展示方式**:以卡片形式展示美食信息,包括图片、标题、分类、地点等 #### 3. 美食分享 - **功能描述**:登录用户可以分享自己喜欢的美食,包括标题、分类、地点、详细描述和图片 - **分享流程**: - 填写美食基本信息(标题、分类、地点) - 上传美食图片(支持多种图片格式) - 填写详细描述(推荐理由、口味特点等) - 提交审核 - **审核机制**:分享的美食需要经过管理员审核后才能在系统中展示 #### 4. 分享记录 - **功能描述**:登录用户可以查看自己分享的所有美食,包括审核状态 - **状态显示**:显示每个分享的美食当前状态(待审核、已通过、已拒绝) - **操作权限**:用户可以查看自己分享的美食详情 #### 5. Bug反馈 - **功能描述**:登录用户可以提交系统Bug或建议,帮助改进系统 - **反馈内容**:支持填写Bug描述、复现步骤、期望结果等 - **处理流程**:管理员会定期查看并处理用户反馈 #### 6. 响应式设计 - **适配范围**:适配不同尺寸屏幕,包括电脑、平板和手机 - **设计原则**:在不同设备上保持良好的用户体验和界面美观 - **实现方式**:使用CSS媒体查询和flex布局实现响应式设计 ### 图片处理功能 #### 1. EXIF旋转修复 - **功能描述**:自动检测并修复上传图片的EXIF旋转信息,确保图片在各种设备上正确显示 - **技术实现**:使用Pillow库读取图片EXIF信息,根据旋转角度进行自动调整 - **用户体验**:用户无需手动调整图片方向,上传后系统自动处理 #### 2. 响应式图片比例 - **功能描述**:使用CSS aspect-ratio属性确保不同尺寸和比例的图片都能良好展示 - **设计原则**:保持图片原始比例,避免拉伸变形 - **适配效果**:在不同屏幕尺寸下,图片宽度自适应,高度按比例调整 #### 3. 图片大小优化 - **功能描述**:自动调整图片显示大小,确保整体界面美观协调 - **优化策略**:根据屏幕尺寸和设备类型,动态调整图片显示尺寸 - **性能考虑**:优化图片加载速度,提高系统响应性能 ### 管理员功能 #### 1. 美食管理 - **功能描述**:管理员可以审核、编辑、删除用户分享的美食 - **审核功能**:查看待审核美食,选择通过或拒绝 - **编辑功能**:修改美食信息,包括标题、分类、地点、描述等 - **删除功能**:删除违规或不适宜的美食 #### 2. 用户管理 - **功能描述**:管理系统用户,包括查看用户列表、修改用户信息、删除用户等 - **批量创建**:支持使用自定义命令批量创建用户 - **权限管理**:设置用户权限,分配不同角色 #### 3. 分类管理 - **功能描述**:管理美食分类,包括添加、编辑、删除分类 - **分类层级**:支持多级分类管理 - **分类应用**:分类信息用于美食筛选和展示 #### 4. 登录限制 - **功能描述**:防止恶意登录尝试,保护系统安全 - **实现方式**:使用django-axes库记录登录尝试,达到一定次数后限制登录 - **安全策略**:可配置登录尝试次数、锁定时间等参数 ## 技术栈 - **后端框架**:Django 4.2 - **编程语言**:Python 3.9 - **数据库**:SQLite(开发环境) - **前端技术**:HTML, CSS, JavaScript - **第三方库**: - django-ratelimit:防止频繁请求 - django-axes:登录尝试限制 - Pillow:图片处理 ## 系统截图 系统截图展示了系统的主要功能和界面设计,便于用户直观了解系统的使用方式。 ### 截图存放位置 截图文件存放在项目的 `screenshots` 目录下,命名规则如下: ``` screenshots/ ├── home_page.png # 首页/随机推荐页面 ├── food_list.png # 美食列表页面 ├── food_share.png # 美食分享页面 ├── share_record.png # 分享记录页面 ├── bug_feedback.png # Bug反馈页面 ├── admin_login.png # 管理员登录页面 ├── admin_food_manage.png # 美食管理页面 └── user_login.png # 用户登录页面 ``` ### 截图说明 #### 1. 首页/随机推荐页面 - **功能描述**:展示系统的核心功能,随机推荐一道美食 - **截图**: ![首页/随机推荐页面](screenshots/home_page.png) #### 2. 美食列表页面 - **功能描述**:展示所有已审核通过的美食,支持筛选和搜索 - **截图**: ![美食列表页面](screenshots/food_list.png) #### 3. 美食分享页面 - **功能描述**:用户分享美食的表单页面 - **截图**: ![美食分享页面](screenshots/food_share.png) #### 4. 分享记录页面 - **功能描述**:用户查看自己分享的美食记录 - **截图**: ![分享记录页面](screenshots/share_record.png) #### 5. Bug反馈页面 - **功能描述**:用户提交Bug或建议的表单页面 - **截图**: ![Bug反馈页面](screenshots/bug_feedback.png) #### 6. 管理员登录页面 - **功能描述**:管理员登录系统的页面 - **截图**: ![管理员登录页面](screenshots/admin_login.png) #### 7. 美食管理页面 - **功能描述**:管理员审核、编辑、删除美食的页面 - **截图**: ![美食管理页面](screenshots/admin_food_manage.png) #### 8. 用户登录页面 - **功能描述**:用户登录系统的页面 - **截图**: ![用户登录页面](screenshots/user_login.png) ## 安装步骤 ### 1. 克隆项目 ```bash git clone <项目地址> cd food_system ``` ### 2. 创建虚拟环境 ```bash # Windows python -m venv venv venv\Scripts\activate # Linux/Mac python3 -m venv venv source venv/bin/activate ``` ### 3. 安装依赖 ```bash pip install -r requirements.txt ``` ### 4. 数据库迁移 ```bash cd food_system python manage.py migrate ``` ### 5. 创建超级用户 ```bash python manage.py createsuperuser ``` ### 6. 启动开发服务器 ```bash python manage.py runserver ``` ## 运行方式 ### 开发环境 ```bash cd food_system python manage.py runserver ``` 访问地址:http://127.0.0.1:8000 ### 生产环境 1. 配置生产环境设置 2. 收集静态文件 3. 配置Web服务器(如Nginx, Apache) 4. 使用WSGI服务器(如Gunicorn, uWSGI) ## 项目结构 ``` food_system/ ├── food_system/ # 项目配置目录 │ ├── __init__.py │ ├── asgi.py │ ├── settings.py # 项目设置 │ ├── urls.py # 主URL配置 │ └── wsgi.py ├── food/ # 美食应用 │ ├── __init__.py │ ├── admin.py # 后台管理配置 │ ├── apps.py │ ├── forms.py # 表单定义 │ ├── management/ # 自定义管理命令 │ │ └── commands/ │ ├── migrations/ # 数据库迁移文件 │ ├── models.py # 数据模型 │ ├── templates/ # 模板文件 │ │ └── food/ │ ├── tests.py # 测试文件 │ ├── urls.py # 应用URL配置 │ └── views.py # 视图函数 ├── system/ # 系统应用 │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── forms.py │ ├── migrations/ │ ├── models.py │ ├── templates/ # 模板文件 │ │ └── system/ │ ├── tests.py │ ├── urls.py │ └── views.py ├── media/ # 媒体文件存储 │ └── food_images/ # 美食图片 ├── templates/ # 根模板目录 │ ├── 403.html # 403错误页面 │ └── 404.html # 404错误页面 ├── db.sqlite3 # SQLite数据库文件 ├── manage.py # Django管理脚本 └── requirements.txt # 项目依赖 ``` ## 使用说明 ### 普通用户 1. **浏览美食**:访问首页查看随机推荐的美食 2. **查看列表**:点击"查看所有美食"按钮,浏览完整的美食列表 3. **分享美食**:登录后点击"我要分享"按钮,填写美食信息并上传图片 4. **查看记录**:登录后点击"分享记录"查看自己分享的美食 5. **反馈Bug**:登录后点击"Bug反馈"提交系统问题或建议 ### 管理员 1. **登录后台**:访问http://127.0.0.1:8000/admin,使用超级用户账号登录 2. **管理美食**:在"Food"栏目下管理美食,包括审核、编辑和删除 3. **管理分类**:在"Food"栏目下管理美食分类 4. **管理用户**:在"认证和授权"栏目下管理系统用户 5. **批量创建用户**:使用自定义命令`python manage.py batch_create_users`批量创建用户 ## 系统安全防护措施 本系统采用了多层次、全方位的安全防护机制,从输入验证到输出过滤,从认证授权到会话管理,从请求限流到敏感信息保护,确保系统在各种攻击场景下都能保持安全稳定运行。以下是详细的安全防护措施: ### 1. 输入验证与注入防护 #### SQL注入防护 - **防护目标**:防止攻击者通过构造恶意SQL语句注入到应用程序的数据库查询中 - **实现方式**:使用Django ORM进行数据库操作,避免直接拼接SQL语句 - **技术原理**:Django ORM会自动对输入参数进行转义处理,将SQL语句与参数分离,确保参数不会被解释为SQL指令 - **配置细节**:完全依赖Django ORM,不使用原始SQL查询,所有数据库操作都通过模型类的方法或QuerySet API实现 #### 跨站脚本(XSS)防护 - **防护目标**:防止攻击者在网页中注入恶意脚本,当其他用户浏览该页面时执行恶意代码 - **实现方式**: - 启用浏览器XSS过滤:配置`SECURE_BROWSER_XSS_FILTER = True` - 模板自动转义:Django模板默认对所有变量进行HTML转义 - 内容安全策略:设置合理的Content-Security-Policy头 - **技术原理**: - 浏览器XSS过滤会检测并阻止明显的XSS攻击 - 模板自动转义将特殊字符(如`<`、`>`、`"`、`'`等)转换为HTML实体 - 内容安全策略限制资源加载来源,防止执行内联脚本 ### 2. 认证与授权安全 #### 登录尝试限制 - **防护目标**:防止暴力破解和字典攻击,保护用户账号安全 - **实现方式**:使用`django-axes`库实现登录尝试限制 - **配置细节**: ```python AXES_FAILURE_LIMIT = 5 # 连续登录失败5次锁定 AXES_COOLOFF_TIME = 1 # 锁定时间1小时 AXES_LOCK_OUT_BY_IP = True # 按IP锁定 AXES_LOCK_OUT_BY_USER = True # 按用户名锁定 AXES_RESET_ON_SUCCESS = True # 成功登录后重置失败计数 ``` - **技术原理**:记录每个IP和用户名的登录尝试次数,达到阈值后进行锁定,冷却时间结束后自动解锁 #### 密码安全策略 - **防护目标**:确保用户设置强密码,提高账号安全性 - **实现方式**:Django内置的密码验证器 - **配置细节**: ```python AUTH_PASSWORD_VALIDATORS = [ {'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator'}, {'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 'OPTIONS': {'min_length': 8}}, {'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator'}, {'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator'}, ] ``` - **技术原理**:通过多个验证器组合,确保密码: - 与用户属性(如用户名、邮箱)不相似 - 长度至少8位 - 不是常见密码 - 不是纯数字 ### 3. 会话管理安全 #### 安全的Cookie配置 - **防护目标**:防止会话劫持和会话固定攻击 - **实现方式**:配置安全的Cookie参数 - **配置细节**: ```python SESSION_COOKIE_AGE = 1800 # 会话过期时间30分钟 SESSION_SAVE_EVERY_REQUEST = True # 每次请求刷新会话过期时间 SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 浏览器关闭不立即过期 SESSION_COOKIE_SECURE = False # 生产环境应设为True,仅HTTPS传输 SESSION_COOKIE_HTTPONLY = True # 防止JavaScript访问Cookie SESSION_COOKIE_SAMESITE = 'Lax' # 防止跨站请求伪造 ``` - **技术原理**: - `SESSION_COOKIE_SECURE`确保Cookie仅通过HTTPS传输,防止窃听 - `SESSION_COOKIE_HTTPONLY`防止XSS攻击窃取Cookie - `SESSION_COOKIE_SAMESITE`限制Cookie在跨站请求中的发送 #### 安全的CSRF防护 - **防护目标**:防止跨站请求伪造攻击,保护用户会话安全 - **实现方式**:Django内置的CSRF防护机制 - **配置细节**: ```python CSRF_COOKIE_SECURE = False # 生产环境设为True CSRF_COOKIE_HTTPONLY = True # 防止JavaScript访问CSRF Token CSRF_COOKIE_SAMESITE = 'Lax' # 限制跨站请求 ``` - **技术原理**: - 为每个表单生成唯一的CSRF Token - 验证请求中的CSRF Token与用户会话中的Token是否匹配 - 确保请求来自合法页面,防止第三方网站伪造请求 ### 4. 请求安全与限流 #### 请求速率限制 - **防护目标**:防止DoS攻击和API滥用,保护系统资源 - **实现方式**:使用`django-ratelimit`库实现请求速率限制 - **配置细节**: ```python RATELIMIT_KEY_FUNCTION = 'django_ratelimit.utils.get_ip' # 按IP限制 RATELIMIT_RATE = '10/m' # 默认每分钟10次请求 RATELIMIT_BLOCK = True # 超过限制时阻止请求 ``` - **技术原理**: - 基于IP地址或用户ID限制请求频率 - 使用缓存记录请求次数,超过阈值时返回429状态码 - 支持不同视图设置不同的速率限制 #### 请求合法性验证 - **防护目标**:验证请求的合法性,防止非法访问 - **实现方式**:自定义安全中间件`food.middleware.SecurityMiddleware` - **验证内容**: - 验证请求的Referer头,确保请求来自合法来源 - 验证Host头,防止主机头攻击 - 检查请求参数的合法性,防止恶意构造请求 - **技术原理**:在请求到达视图前进行拦截验证,对非法请求返回403 Forbidden #### 地址栏防护 - **防护目标**:防止通过地址栏获取敏感信息,防止目录遍历攻击 - **实现方式**:自定义安全中间件实现 - **防护机制**: - 检查URL路径的合法性,防止访问敏感目录 - 隐藏服务器版本信息,防止信息泄露 - 防止通过地址栏注入恶意参数 - **技术原理**:中间件拦截所有请求,验证URL路径和参数,对可疑请求进行拦截 ### 5. 敏感信息保护 #### 服务器信息隐藏 - **防护目标**:防止泄露服务器版本信息,减少攻击面 - **实现方式**:配置自定义服务器头 - **配置细节**: ```python SERVER_HEADER = 'Web Server' # 自定义服务器头,隐藏Django版本 ``` - **技术原理**:替换默认的Django服务器头,防止攻击者获取服务器类型和版本信息 #### 安全的HTTP头设置 - **防护目标**:设置安全的HTTP响应头,增强浏览器安全 - **实现方式**:Django安全中间件配置 - **配置细节**: ```python X_FRAME_OPTIONS = 'DENY' # 防止点击劫持 SECURE_REFERRER_POLICY = 'strict-origin-when-cross-origin' # 控制Referer头 SECURE_CONTENT_TYPE_NOSNIFF = True # 防止MIME类型嗅探 ``` - **技术原理**: - `X_FRAME_OPTIONS = 'DENY'`禁止页面在iframe中显示,防止点击劫持 - `SECURE_REFERRER_POLICY`控制Referer头的发送,保护用户隐私 - `SECURE_CONTENT_TYPE_NOSNIFF`防止浏览器猜测MIME类型,减少XSS风险 #### HSTS配置 - **防护目标**:强制使用HTTPS,防止中间人攻击 - **实现方式**:HTTP Strict Transport Security配置 - **配置细节**: ```python SECURE_HSTS_SECONDS = 31536000 # 1年 SECURE_HSTS_INCLUDE_SUBDOMAINS = True # 包含所有子域名 SECURE_HSTS_PRELOAD = True # 允许加入HSTS预加载列表 ``` - **技术原理**:通知浏览器在指定时间内只使用HTTPS访问网站,防止HTTP降级攻击 ### 6. 文件上传安全 #### 上传文件验证 - **防护目标**:防止上传恶意文件,保护服务器安全 - **实现方式**:Django表单验证和文件存储配置 - **验证内容**: - 文件类型验证:只允许上传图片文件(jpg, jpeg, png, gif等) - 文件大小限制:设置合理的文件大小上限 - 文件内容验证:检查文件是否为真实的图片文件 - **技术原理**: - 通过表单验证限制文件类型和大小 - 使用Pillow库检查文件内容,验证文件格式 - 存储在安全目录,设置正确的文件权限 ### 7. 安全日志与监控 #### 安全日志记录 - **防护目标**:记录安全相关事件,便于审计和溯源 - **实现方式**:Django日志系统配置 - **配置细节**: ```python LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'file': { 'level': 'ERROR', 'class': 'logging.FileHandler', 'filename': BASE_DIR / 'django_error.log', }, }, 'loggers': { 'django': { 'handlers': ['file'], 'level': 'ERROR', 'propagate': True, }, }, } ``` - **技术原理**:记录系统错误和异常,便于管理员及时发现和处理安全问题 ### 8. 其他安全措施 #### 点击劫持防护 - **防护目标**:防止攻击者通过iframe嵌入网站,诱导用户点击恶意链接 - **实现方式**:配置`X_FRAME_OPTIONS`头 - **配置细节**: ```python X_FRAME_OPTIONS = 'DENY' # 禁止所有iframe嵌入 ``` - **技术原理**:浏览器会根据`X_FRAME_OPTIONS`头决定是否允许页面在iframe中显示,`DENY`值完全禁止嵌入 #### 跨域资源共享(CORS)保护 - **防护目标**:控制跨域请求,防止未授权的跨域资源访问 - **实现方式**:Django默认不允许跨域请求,如需支持CORS可使用`django-cors-headers`库 - **技术原理**:通过设置`Access-Control-Allow-Origin`等头控制哪些域名可以访问资源 ### 9. 安全开发实践 #### 代码安全 - **防护目标**:确保代码本身的安全性,减少安全漏洞 - **实现方式**: - 遵循Django安全最佳实践 - 定期进行代码审查 - 使用静态代码分析工具 - 及时更新依赖库,修复已知漏洞 #### 部署安全 - **防护目标**:确保部署环境的安全性 - **实现方式**: - 使用HTTPS协议传输数据 - 配置防火墙,限制访问端口 - 定期备份数据,确保数据安全 - 最小权限原则:运行应用的用户只拥有必要的权限 ### 安全防护措施总结 本系统采用了多层次、全方位的安全防护机制,从输入验证到输出过滤,从认证授权到会话管理,从请求限流到敏感信息保护,全面覆盖了Web应用的主要安全风险点。通过结合Django内置的安全机制和第三方安全库,实现了高效、可靠的安全防护。 系统安全是一个持续的过程,我们将定期更新安全策略,修复已知漏洞,适应新的安全威胁,确保系统始终保持高安全性。 ## 开发指南 ### 数据库迁移 ```bash # 创建迁移文件 python manage.py makemigrations # 执行迁移 python manage.py migrate ``` ### 运行测试 ```bash python manage.py test ``` ### 添加新应用 ```bash python manage.py startapp ``` ## 系统部署说明 ### 1. 环境准备 #### 1.1 Python安装 ##### Windows 1. 访问 [Python官方网站](https://www.python.org/downloads/windows/) 下载Python 3.9安装包 2. 运行安装程序,勾选"Add Python 3.9 to PATH" 3. 选择"Customize installation",确保勾选所有可选功能 4. 选择安装路径,点击"Install"完成安装 5. 打开命令提示符,输入 `python --version` 验证安装成功 ##### Linux **Ubuntu/Debian** ```bash # 更新包列表 sudo apt update # 安装Python 3.9 sudo apt install python3.9 python3.9-venv python3.9-dev # 验证安装 python3.9 --version ``` **CentOS/RHEL** ```bash # 安装EPEL仓库 sudo yum install epel-release # 安装Python 3.9 sudo yum install python39 python39-devel python39-venv # 验证安装 python3.9 --version ``` #### 1.2 安装依赖工具 ##### Windows ```cmd # 安装pip python -m ensurepip --upgrade # 安装Git(可选,用于克隆项目) # 访问 https://git-scm.com/download/win 下载并安装Git ``` ##### Linux ```bash # 安装pip sudo apt install python3-pip # Ubuntu/Debian sudo yum install python3-pip # CentOS/RHEL # 安装Git sudo apt install git # Ubuntu/Debian sudo yum install git # CentOS/RHEL # 安装其他依赖 # Ubuntu/Debian sudo apt install build-essential libsqlite3-dev # CentOS/RHEL sudo yum install gcc gcc-c++ sqlite-devel ``` ### 2. 项目获取与配置 #### 2.1 获取项目代码 ```bash # 克隆项目(如果使用Git) git clone <项目地址> cd food_system # 或直接下载压缩包解压 # 解压后进入项目目录 ``` #### 2.2 创建虚拟环境 ##### Windows ```cmd # 在项目根目录创建虚拟环境 python -m venv venv # 激活虚拟环境 venv\Scripts\activate ``` ##### Linux ```bash # 在项目根目录创建虚拟环境 python3.9 -m venv venv # 激活虚拟环境 source venv/bin/activate ``` #### 2.3 安装项目依赖 ```bash # 升级pip pip install --upgrade pip # 安装依赖 pip install -r requirements.txt ``` #### 2.4 配置生产环境 1. **创建生产环境配置文件** ```bash # 在food_system/food_system目录下创建production_settings.py cd food_system/food_system touch production_settings.py # Linux ``` 2. **编辑生产环境配置** ```python # production_settings.py from .settings import * # 基本配置 DEBUG = False ALLOWED_HOSTS = ['your-domain.com', 'www.your-domain.com', '127.0.0.1'] # 安全配置 SECRET_KEY = 'your-secure-secret-key' # 生成一个新的密钥 # 数据库配置(推荐使用PostgreSQL或MySQL) # PostgreSQL示例 # DATABASES = { # 'default': { # 'ENGINE': 'django.db.backends.postgresql_psycopg2', # 'NAME': 'food_system', # 'USER': 'food_user', # 'PASSWORD': 'your-password', # 'HOST': 'localhost', # 'PORT': '5432', # } # } # MySQL示例 # DATABASES = { # 'default': { # 'ENGINE': 'django.db.backends.mysql', # 'NAME': 'food_system', # 'USER': 'food_user', # 'PASSWORD': 'your-password', # 'HOST': 'localhost', # 'PORT': '3306', # 'OPTIONS': { # 'charset': 'utf8mb4', # 'sql_mode': 'STRICT_TRANS_TABLES', # } # } # } # 静态文件配置 STATIC_ROOT = BASE_DIR / 'staticfiles' STATIC_URL = '/static/' # 媒体文件配置 MEDIA_ROOT = BASE_DIR / 'media' MEDIA_URL = '/media/' # 安全头配置 SECURE_HSTS_SECONDS = 31536000 # 1年 SECURE_HSTS_INCLUDE_SUBDOMAINS = True SECURE_HSTS_PRELOAD = True # HTTPS配置 SECURE_SSL_REDIRECT = True SESSION_COOKIE_SECURE = True CSRF_COOKIE_SECURE = True # 日志配置 LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'file': { 'level': 'ERROR', 'class': 'logging.FileHandler', 'filename': BASE_DIR / 'django_error.log', }, }, 'loggers': { 'django': { 'handlers': ['file'], 'level': 'ERROR', 'propagate': True, }, }, } ``` 3. **生成新的SECRET_KEY** ```bash python -c "from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())" ``` 将生成的密钥替换到`production_settings.py`中的`SECRET_KEY`字段。 ### 3. 数据库配置 #### 3.1 使用SQLite(开发/小型部署) ```bash # 在生产环境配置中保留SQLite配置即可 # 执行数据库迁移 python manage.py migrate --settings=food_system.production_settings ``` #### 3.2 使用PostgreSQL(推荐) ##### Windows 1. 下载并安装PostgreSQL:[PostgreSQL官网](https://www.postgresql.org/download/windows/) 2. 安装时创建数据库和用户 3. 修改`production_settings.py`中的数据库配置 4. 安装PostgreSQL驱动:`pip install psycopg2-binary` 5. 执行数据库迁移 ##### Linux **Ubuntu/Debian** ```bash # 安装PostgreSQL sudo apt install postgresql postgresql-contrib # 进入PostgreSQL命令行 sudo -u postgres psql # 创建数据库和用户 CREATE DATABASE food_system; CREATE USER food_user WITH PASSWORD 'your-password'; ALTER ROLE food_user SET client_encoding TO 'utf8'; ALTER ROLE food_user SET default_transaction_isolation TO 'read committed'; ALTER ROLE food_user SET timezone TO 'UTC'; GRANT ALL PRIVILEGES ON DATABASE food_system TO food_user; # 退出PostgreSQL命令行 \q ``` **CentOS/RHEL** ```bash # 安装PostgreSQL sudo yum install postgresql-server postgresql-contrib # 初始化PostgreSQL sudo postgresql-setup initdb # 启动并设置开机自启 sudo systemctl start postgresql sudo systemctl enable postgresql # 进入PostgreSQL命令行 sudo -u postgres psql # 创建数据库和用户(同上) ``` ### 4. 静态文件处理 ```bash # 收集静态文件 python manage.py collectstatic --noinput --settings=food_system.production_settings ``` ### 5. 创建超级用户 ```bash python manage.py createsuperuser --settings=food_system.production_settings ``` ### 6. 部署方式 #### 6.1 Windows部署(IIS + WSGI) 1. **安装IIS** - 打开"控制面板" → "程序" → "启用或关闭Windows功能" - 勾选"Internet Information Services"下的所有选项 - 点击"确定"安装 2. **安装URL Rewrite模块** - 访问 [IIS URL Rewrite](https://www.iis.net/downloads/microsoft/url-rewrite) 下载并安装 3. **安装Python WSGI模块** - 安装wfastcgi:`pip install wfastcgi` - 启用wfastcgi:`wfastcgi-enable` - 记录输出的Python路径和wfastcgi路径 4. **配置IIS网站** - 打开"Internet Information Services (IIS)管理器" - 右键"网站" → "添加网站" - 填写网站名称、物理路径(项目根目录)、端口号 - 点击"确定" 5. **配置web.config** 在项目根目录创建`web.config`文件: ```xml ``` 6. **设置文件权限** - 右键网站物理路径 → "属性" → "安全" - 添加IIS_IUSRS用户,赋予读取和执行权限 - 添加IUSR用户,赋予读取和执行权限 7. **启动网站** - 在IIS管理器中,右键创建的网站 → "启动" - 访问 http://localhost:端口 测试 #### 6.2 Linux部署(Nginx + Gunicorn) 1. **安装Nginx** ```bash # Ubuntu/Debian sudo apt install nginx # CentOS/RHEL sudo yum install nginx # 启动并设置开机自启 sudo systemctl start nginx sudo systemctl enable nginx ``` 2. **安装Gunicorn** ```bash pip install gunicorn ``` 3. **创建Gunicorn启动脚本** ```bash # 在项目根目录创建gunicorn_start.sh touch gunicorn_start.sh chmod +x gunicorn_start.sh ``` 编辑`gunicorn_start.sh`: ```bash #!/bin/bash # 项目路径 PROJECT_DIR="/path/to/food_system/food_system" VENV_DIR="/path/to/food_system/venv" # 激活虚拟环境 source $VENV_DIR/bin/activate # 设置环境变量 export DJANGO_SETTINGS_MODULE=food_system.production_settings export PYTHONPATH=$PROJECT_DIR # 启动Gunicorn gunicorn --workers 3 --bind 127.0.0.1:8000 food_system.wsgi:application ``` 4. **配置Nginx** ```bash # 创建Nginx配置文件 sudo touch /etc/nginx/sites-available/food_system sudo ln -s /etc/nginx/sites-available/food_system /etc/nginx/sites-enabled/ ``` 编辑`/etc/nginx/sites-available/food_system`: ```nginx server { listen 80; server_name your-domain.com www.your-domain.com; # 静态文件 location /static/ { alias /path/to/food_system/food_system/staticfiles/; expires 30d; } # 媒体文件 location /media/ { alias /path/to/food_system/food_system/media/; expires 30d; } # 主应用 location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } ``` 5. **测试Nginx配置** ```bash sudo nginx -t sudo systemctl reload nginx ``` 6. **使用systemd管理Gunicorn** ```bash # 创建systemd服务文件 sudo touch /etc/systemd/system/food_system.service ``` 编辑`/etc/systemd/system/food_system.service`: ```ini [Unit] Description=Gunicorn instance to serve food_system After=network.target [Service] User=www-data Group=www-data WorkingDirectory=/path/to/food_system/food_system ExecStart=/path/to/food_system/venv/bin/gunicorn --workers 3 --bind 127.0.0.1:8000 food_system.wsgi:application Environment="DJANGO_SETTINGS_MODULE=food_system.production_settings" [Install] WantedBy=multi-user.target ``` 7. **启动并设置开机自启** ```bash sudo systemctl daemon-reload sudo systemctl start food_system sudo systemctl enable food_system sudo systemctl status food_system ``` 8. **配置防火墙** ```bash # Ubuntu/Debian sudo ufw allow 80 sudo ufw allow 443 # CentOS/RHEL sudo firewall-cmd --permanent --add-service=http sudo firewall-cmd --permanent --add-service=https sudo firewall-cmd --reload ``` #### 6.3 Docker部署(跨平台) 1. **安装Docker** - 访问 [Docker官网](https://www.docker.com/) 下载并安装Docker Desktop - 或按照Linux发行版的指南安装Docker 2. **创建Dockerfile** 在项目根目录创建`Dockerfile`: ```dockerfile FROM python:3.9 # 设置工作目录 WORKDIR /app # 安装依赖 COPY requirements.txt . RUN pip install --upgrade pip && pip install -r requirements.txt # 复制项目代码 COPY . . # 设置环境变量 ENV DJANGO_SETTINGS_MODULE=food_system.production_settings # 收集静态文件 RUN python food_system/manage.py collectstatic --noinput # 暴露端口 EXPOSE 8000 # 启动应用 CMD ["gunicorn", "--bind", "0.0.0.0:8000", "food_system.wsgi:application"] ``` 3. **创建docker-compose.yml** 在项目根目录创建`docker-compose.yml`: ```yaml version: '3.8' services: web: build: . ports: - "8000:8000" volumes: - ./food_system/media:/app/food_system/media environment: - DJANGO_SETTINGS_MODULE=food_system.production_settings depends_on: - db db: image: postgres:13 environment: - POSTGRES_DB=food_system - POSTGRES_USER=food_user - POSTGRES_PASSWORD=your-password volumes: - postgres_data:/var/lib/postgresql/data/ volumes: postgres_data: ``` 4. **构建并启动容器** ```bash # 构建镜像 docker-compose build # 启动容器 docker-compose up -d ``` 5. **创建超级用户** ```bash docker-compose exec web python food_system/manage.py createsuperuser ``` ### 7. 部署后维护 #### 7.1 日志管理 **Linux** ```bash # 查看Gunicorn日志 sudo journalctl -u food_system # 查看Nginx访问日志 sudo cat /var/log/nginx/access.log # 查看Nginx错误日志 sudo cat /var/log/nginx/error.log # 查看Django错误日志 cat /path/to/food_system/food_system/django_error.log ``` **Windows** - IIS日志:`C:\inetpub\logs\LogFiles` - Django日志:根据`production_settings.py`中的配置查看 #### 7.2 定期备份 **数据库备份** ```bash # SQLite cp /path/to/food_system/food_system/db.sqlite3 /path/to/backup/db_$(date +%Y%m%d).sqlite3 # PostgreSQL pg_dump -U food_user food_system > /path/to/backup/db_$(date +%Y%m%d).sql # MySQL mysqldump -u food_user -p food_system > /path/to/backup/db_$(date +%Y%m%d).sql ``` **媒体文件备份** ```bash tar -czf /path/to/backup/media_$(date +%Y%m%d).tar.gz /path/to/food_system/food_system/media ``` #### 7.3 性能监控 **Linux** - 使用`top`或`htop`监控系统资源 - 使用`tail -f`实时查看日志 - 使用Prometheus + Grafana进行高级监控 **Windows** - 使用"任务管理器"监控系统资源 - 使用"性能监视器"进行详细监控 ### 8. 常见问题处理 1. **静态文件404** - 检查`STATIC_ROOT`和`STATIC_URL`配置 - 确保执行了`collectstatic`命令 - 检查Web服务器的静态文件配置 2. **数据库连接错误** - 检查数据库配置是否正确 - 确保数据库服务正在运行 - 检查数据库用户权限 3. **500内部服务器错误** - 查看Django错误日志 - 检查Python依赖是否完整 - 检查文件权限 4. **CSRF验证失败** - 检查`CSRF_COOKIE_SECURE`配置 - 确保浏览器支持cookies - 检查Nginx配置中的`proxy_set_header` 5. **Gunicorn启动失败** - 检查Gunicorn配置文件 - 查看Gunicorn日志 - 检查Python环境变量 ### 9. HTTPS配置 #### 9.1 使用Let's Encrypt获取免费SSL证书 **Linux** ```bash # 安装Certbot # Ubuntu/Debian sudo apt install certbot python3-certbot-nginx # CentOS/RHEL sudo yum install certbot python3-certbot-nginx # 获取证书 sudo certbot --nginx -d your-domain.com -d www.your-domain.com # 自动续期 sudo crontab -e # 添加以下行 0 3 * * * /usr/bin/certbot renew --quiet ``` **Windows** - 访问 [Certbot官网](https://certbot.eff.org/) 下载Windows版本 - 按照官方指南获取和配置SSL证书 #### 9.2 配置HTTPS **Nginx** - Certbot会自动修改Nginx配置,启用HTTPS - 验证配置:`sudo nginx -t` - 重启Nginx:`sudo systemctl reload nginx` **IIS** - 打开IIS管理器 - 右键网站 → "编辑绑定" - 添加HTTPS绑定,选择获取的SSL证书 - 点击"确定" ## 改进方向 ### 功能增强 1. **个性化推荐**:基于用户的浏览历史和偏好,提供个性化的美食推荐 2. **评分和评论功能**:允许用户对美食进行评分和评论,增加互动性 3. **收藏功能**:用户可以收藏自己喜欢的美食,方便后续查看 4. **分享到社交媒体**:支持将美食分享到微信、微博等社交媒体平台 5. **地图集成**:显示美食地点的地图位置,方便用户查找 6. **美食攻略功能**:允许用户创建和分享美食攻略,包括路线规划、推荐顺序等 7. **通知功能**:系统通知用户分享的美食审核结果、新的推荐等 ### 技术优化 1. **数据库优化**:针对大数据量场景,优化数据库查询和索引 2. **图片处理优化**:添加图片压缩和CDN加速,提高图片加载速度 3. **缓存机制**:添加缓存层,提高系统响应速度 4. **异步处理**:使用Celery处理耗时任务,如图片处理、邮件发送等 5. **前后端分离**:考虑将前端与后端分离,提高系统的可扩展性 6. **API接口开发**:提供RESTful API接口,支持移动端应用开发 7. **性能监控**:添加性能监控工具,实时监控系统运行状态 ### 用户体验改进 1. **界面美化**:进一步优化界面设计,提升视觉效果 2. **交互优化**:改进用户交互流程,提高操作便捷性 3. **搜索功能增强**:添加模糊搜索、自动补全、搜索历史等功能 4. **多语言支持**:支持中英文等多种语言,扩大用户范围 5. **夜间模式**:添加夜间模式,适应不同使用场景 ### 安全增强 1. **双因素认证**:添加双因素认证功能,提高账户安全性 2. **数据加密**:对敏感数据进行加密存储,如用户密码、个人信息等 3. **安全审计**:添加安全审计日志,记录系统操作和访问记录 4. **API权限控制**:细化API接口的权限控制,防止未授权访问 5. **定期安全扫描**:定期进行安全扫描,发现和修复安全漏洞 ## 许可证 本项目采用MIT许可证,详见LICENSE文件。 ## 贡献指南 1. Fork本仓库 2. 创建feature分支(`git checkout -b feature/AmazingFeature`) 3. 提交更改(`git commit -m 'Add some AmazingFeature'`) 4. 推送到分支(`git push origin feature/AmazingFeature`) 5. 打开Pull Request ## 联系方式 如有问题或建议,欢迎通过以下方式联系: - 提交Issue - 发送邮件至: --- 感谢使用今天吃什么系统!🍔🍕🍜