在 CentOS 系统上实现定时执行 Python 邮件发送任务

在 CentOS 系统上实现定时执行 Python 邮件发送任务
在这里插入图片描述

文章目录

在这里插入图片描述

引言

在现代化的IT运维、业务监控和自动化流程中,定期通过电子邮件发送报告、监控状态或业务数据是一项非常普遍的需求。例如,每日凌晨发送前一天的销售报表,每小时发送系统性能状态,或每周一发送项目周报。

CentOS,作为一个稳定、可靠的 Linux 发行版,是众多服务器环境的首选。Python 则因其强大的库生态(如 smtplib, email 用于发邮件,pandas, numpy 用于处理数据)和简洁的语法,成为实现这类任务的理想编程语言。

本文将系统地介绍在 CentOS 7 或 CentOS 8 系统上实现这一目标的五种方案:

  1. 经典基石:Cron 作业
  2. 灵活调度:Systemd 定时器
  3. Python 内生方案:APScheduler 库
  4. 企业级任务队列:Celery with Redis
  5. 一体化解决方案:Jenkins CI/CD 作业

方案一:经典基石 - Cron 作业

1. 原理概述

Cron 是 Linux/Unix 系统中最经典、最广泛使用的定时任务调度程序。它由一个后台守护进程 crond 和一系列配置文件(称为 “crontab”)组成。crond 进程会每分钟检查一次所有配置好的任务,判断是否有任务需要执行。

2. 详细实现步骤

步骤 1:编写 Python 邮件发送脚本
首先,我们需要一个完整的、可独立运行的 Python 脚本。假设我们将其保存为 /opt/scripts/email_report.py

#!/usr/bin/env python3# -*- coding: utf-8 -*-import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from datetime import datetime import pandas as pd # 假设需要生成报告# 邮件配置 SMTP_SERVER ="smtp.office365.com" SMTP_PORT =587 SENDER_EMAIL ="[email protected]" SENDER_PASSWORD ="your_secure_password"# 强烈建议使用应用专用密码 RECIPIENT_EMAIL ="[email protected]"defgenerate_report():"""生成邮件正文内容(示例)"""# 这里可以是任何复杂的逻辑:查询数据库、读取文件、调用API等。 report_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") report_data =f""" <h1>每日业务报告</h1> <p>生成时间: {report_time}</p> <table> <tr><th>指标</th><th>数值</th></tr> <tr><td>销售额</td><td>$15,000</td></tr> <tr><td>新用户</td><td>120</td></tr> </table> """return report_data defsend_email(subject, body):"""发送邮件函数""" msg = MIMEMultipart() msg['From']= SENDER_EMAIL msg['To']= RECIPIENT_EMAIL msg['Subject']= subject # 附加HTML内容 msg.attach(MIMEText(body,'html'))try: server = smtplib.SMTP(SMTP_SERVER, SMTP_PORT) server.starttls()# 启用加密 server.login(SENDER_EMAIL, SENDER_PASSWORD) server.sendmail(SENDER_EMAIL, RECIPIENT_EMAIL, msg.as_string())print(f"[{datetime.now()}] 邮件发送成功!")except Exception as e:print(f"[{datetime.now()}] 发送失败: {e}")finally: server.quit()if __name__ =="__main__": email_subject =f"每日报告 - {datetime.now().strftime('%Y-%m-%d')}" email_body = generate_report() send_email(email_subject, email_body)

重要安全提示:将密码直接写在脚本中是极不安全的。建议:

  1. 使用环境变量。
  2. 使用配置文件(如 config.ini.env 文件),并严格设置文件权限(如 chmod 600 config.ini)。
  3. 使用密钥管理服务(如 HashiCorp Vault、AWS Secrets Manager)。

步骤 2:确保脚本具有可执行权限

chmod +x /opt/scripts/email_report.py 

您可以通过直接运行它来测试脚本是否正确工作:

/usr/bin/python3 /opt/scripts/email_report.py 

步骤 3:编辑 Crontab 配置文件
Cron 任务可以通过两种方式配置:

  • 用户级:使用 crontab -e 命令编辑当前用户的定时任务。任务以该用户身份执行。
  • 系统级:编辑 /etc/crontab 文件或将在 /etc/cron.d/ 目录下创建文件。需要指定执行任务的用户。

这里我们使用用户级配置(例如,以 root 或一个专门的用户,如 automation):

crontab -e 

如果是第一次使用,会选择编辑器,选择你熟悉的(如 nano)。

步骤 4:编写 Cron 表达式
在打开的编辑器中,添加一行来定义你的任务。Cron 表达式格式如下:

* * * * * /path/to/command arg1 arg2 - - - - - | | | | | | | | | +----- 星期几 (0 - 6) (周日=0 或 7) | | | +------- 月份 (1 - 12) | | +--------- 日期 (1 - 31) | +----------- 小时 (0 - 23) +------------- 分钟 (0 - 59) 

示例

    • 30 2 * * *:每天 2:30 AM。
    • /usr/bin/python3:使用绝对路径指定 Python 解释器,避免因环境变量问题找不到命令。
    • >> /var/log/email_report.log 2>&1:将脚本的标准输出(stdout)和标准错误(stderr)重定向追加到日志文件中,便于调试和审计。确保该日志文件存在且有写入权限(sudo touch /var/log/email_report.log && sudo chmod 666 /var/log/email_report.log 或授权给特定用户)。

每 10 分钟执行一次

*/10 * * * * /usr/bin/python3 /opt/scripts/email_report.py >> /var/log/email_report.log 2>&1 

每周一早上 9:00 执行

0 9 * * 1 /usr/bin/python3 /opt/scripts/email_report.py >> /var/log/email_report.log 2>&1 

每天凌晨 2:30 执行

30 2 * * * /usr/bin/python3 /opt/scripts/email_report.py >> /var/log/email_report.log 2>&1 

保存并退出编辑器(在 nano 中是 Ctrl+X,然后按 Y,最后回车)。

步骤 5:验证与调试

  • 查看所有已配置的 Cron 任务:crontab -l
  • 查看 Cron 日志以排查问题:通常位于 /var/log/cron。使用 tail -f /var/log/cron 实时查看。
  • 检查您指定的任务日志文件:tail -f /var/log/email_report.log
3. 优缺点分析
  • 优点
    • 极其简单:配置快速,学习成本低。
    • 无处不在:所有 Linux 系统都自带,无需安装额外软件。
    • 稳定可靠crond 守护进程经过数十年考验,非常稳定。
  • 缺点
    • 无自动重试:任务如果执行失败,只能等到下一个周期。
    • 依赖环境:任务在独立的子 Shell 中运行,可能无法完全继承用户的所有环境变量(如 PATH),因此必须使用绝对路径。
    • 无任务队列:如果上一次任务执行时间过长,超过了下次任务的开始时间,Cron 会启动新的进程,可能导致资源冲突。
    • 功能单一:仅能按时间调度,无法实现基于依赖、事件或复杂逻辑的调度。
4. 适用场景
  • 简单的、周期性的、无状态的任务。
  • 对可靠性要求不是极端苛刻的场景(例如,偶尔漏发一次报告影响不大)。
  • 系统管理员希望使用最原生、最小依赖的方案。

方案二:灵活调度 - Systemd 定时器

1. 原理概述

Systemd 是现代 CentOS(7 及以后版本)的初始化系统和服务管理器。除了管理服务,它还可以替代 Cron 完成定时任务调度。它通过两种单元文件协同工作:

  • Service 单元(.service):定义要执行什么任务(即你的 Python 脚本)。
  • Timer 单元(.timer):定义何时执行该任务。
2. 详细实现步骤

步骤 1:创建 Systemd Service 文件
Service 文件定义了如何运行我们的脚本。

sudovim /etc/systemd/system/email-report.service 

内容如下:

[Unit] Description=Send daily email report via Python script [Service] Type=oneshot User=automation # 指定运行用户,增强安全性 ExecStart=/usr/bin/python3 /opt/scripts/email_report.py # 可以在这里设置环境变量,更安全 Environment="SMTP_PASSWORD=your_app_specific_password" # 定义工作目录和日志输出 WorkingDirectory=/opt/scripts StandardOutput=journal StandardError=journal 
  • Type=oneshot:表示服务执行一次就会退出,非常适合这种一次性任务。
  • User=automation:使用一个非特权用户来运行任务,遵循最小权限原则。
  • Environment:在这里注入敏感信息(如密码)比在脚本中硬编码更安全。

步骤 2:创建 Systemd Timer 文件
Timer 文件负责调度对应的 Service。

sudovim /etc/systemd/system/email-report.timer 

内容如下:

[Unit] Description=Timer for daily email report Requires=email-report.service [Timer] # 类似 Cron 的定时语法 OnCalendar=*-*-* 02:30:00 # OnCalendar=Mon *-*-* 09:00:00 # 每周一9点 # 可选:如果服务器当时关机了,开机后是否立即执行错过的任务 Persistent=true # 可选:随机延迟,避免所有定时任务同时启动(例如,在30分钟内随机时间执行) RandomizedDelaySec=1800 [Install] WantedBy=timers.target 
  • OnCalendar:使用灵活的时间定义格式。*-*-* 02:30:00 表示每天 2:30 AM。
  • Persistent=true:如果因为系统关机错过了执行时间,下次启动时会立即执行一次,非常适合每日报告这种不容错过的任务。

步骤 3:启用并启动 Timer

# 重新加载 systemd 配置,使其识别新的单元文件sudo systemctl daemon-reload # 启用 Timer,使其在系统启动时自动激活sudo systemctl enable email-report.timer # 立即启动 Timersudo systemctl start email-report.timer 

步骤 4:验证与监控

  • 查看所有活动的 Timer:systemctl list-timers
  • 查看 Timer 的状态:systemctl status email-report.timer
  • 查看 Service 的执行日志(因为输出重定向到了 journal):journalctl -u email-report.service
  • 实时跟踪日志:journalctl -u email-report.service -f
3. 优缺点分析
  • 优点
    • 与系统集成度高:享受 Systemd 的所有功能,如日志管理(journald)、依赖关系、资源控制(cgroups)等。
    • 更精确的时间控制:可以定义相对于其他事件(如启动后、活动结束后)的计时。
    • 错时补偿Persistent=true 选项可以弥补因宕机错过的任务。
    • 更高的安全性:可以方便地以特定用户和组运行,并设置环境变量。
  • 缺点
    • 配置稍复杂:需要创建两个文件,语法与 Cron 不同。
    • 系统依赖性:仅适用于使用 Systemd 的系统(CentOS 7+ 没问题)。
4. 适用场景
  • 已经广泛使用 Systemd 管理的服务器环境。
  • 需要更可靠的任务执行(错后补发)和更丰富的日志功能。
  • 需要对任务进行资源限制(CPU、内存)的情况。

方案三:Python 内生方案 - APScheduler 库

1. 原理概述

APScheduler(Advanced Python Scheduler)是一个纯 Python 库,允许你将调度逻辑直接嵌入到你的 Python 应用程序中。它就像一个“进程内的 Cron”,调度器在你的 Python 进程中运行,并在预定的时间执行你指定的函数。

2. 详细实现步骤

步骤 1:安装 APScheduler

pip3 install apscheduler 

步骤 2:编写一个常驻的 Python 程序
创建一个新的脚本,例如 /opt/scripts/email_scheduler.py。这个脚本将一直运行,并在后台负责调度。

#!/usr/bin/env python3from apscheduler.schedulers.blocking import BlockingScheduler from datetime import datetime import logging # 导入你自己写好的发送邮件函数# 假设 email_report.py 中有一个 main() 函数from email_report import main as send_report_job # 配置日志,方便查看调度情况 logging.basicConfig() logging.getLogger('apscheduler').setLevel(logging.DEBUG)# 创建调度器实例 scheduler = BlockingScheduler()# 添加定时任务@scheduler.scheduled_job('cron', hour=2, minute=30)defscheduled_email_job():print(f"[{datetime.now()}] 定时任务被触发,开始执行发送邮件...")try: send_report_job()# 调用你写好的函数print(f"[{datetime.now()}] 任务执行完成")except Exception as e:print(f"[{datetime.now()}] 任务执行出错: {e}")# 也可以这样添加,效果一样# scheduler.add_job(send_report_job, 'cron', hour=2, minute=30)if __name__ =='__main__':print(f"[{datetime.now()}] 邮件调度服务启动...")try: scheduler.start()# 这是一个阻塞调用,会一直运行直到程序被终止except(KeyboardInterrupt, SystemExit):print(f"[{datetime.now()}] 邮件调度服务被手动终止。")# 可以在这里做一些清理工作 scheduler.shutdown()

步骤 3:让程序在后台持续运行
直接运行 python3 email_scheduler.py 会占用一个终端。我们需要让它作为守护进程运行。

专业方法:使用 Systemd Service(推荐)
创建一个 Systemd Service 文件来管理这个常驻的 Python 程序,这样它可以随系统启动、自动重启、集中日志。

sudovim /etc/systemd/system/email-scheduler.service 
[Unit] Description=Email Scheduler Service with APScheduler [Service] Type=simple User=automation ExecStart=/usr/bin/python3 /opt/scripts/email_scheduler.py WorkingDirectory=/opt/scripts Restart=always # 如果程序意外退出,自动重启 RestartSec=10 StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target 

然后启用并启动它:

sudo systemctl daemon-reload sudo systemctl enable email-scheduler.service sudo systemctl start email-scheduler.service 

使用 journalctl -u email-scheduler.service -f 查看日志。

简单方法:使用 nohup

nohup python3 /opt/scripts/email_scheduler.py > /var/log/email_scheduler.log 2>&1&
3. 优缺点分析
  • 优点
    • 极致灵活:调度逻辑是代码的一部分,可以实现极其复杂的调度规则(例如,根据前一个任务的结果决定下一个任务的执行时间)。
    • 跨平台:不依赖操作系统本身的调度器,可以在 Windows 等系统上以相同方式工作。
    • 任务协同:所有任务在同一个进程内,可以轻松共享状态和数据。
  • 缺点
    • 单点故障:如果这个 Python 进程崩溃,所有定时任务都会停止,除非配置了 Systemd 的 Restart=always
    • 需要常驻内存:会一直占用一个进程和内存。
    • 增加复杂性:需要编写额外的“包装”代码和管理进程的生命周期。
4. 适用场景
  • 你的应用本身就是一个需要长时间运行的 Python 进程(如 Web 应用使用 Flask/ Django),并希望在应用中集成定时功能。
  • 调度逻辑非常复杂,需要基于代码中的动态状态来决定。
  • 希望获得平台无关的调度解决方案。

方案四:企业级任务队列 - Celery with Redis

1. 原理概述

对于大型、分布式、需要高可靠性的应用,专业的任务队列是首选方案。Celery 是 Python 生态中最著名的分布式任务队列。它由以下几部分组成:

  • Celery Worker:执行任务的“工人”。我们的发送邮件任务就是一个 Celery “任务”。
  • 消息代理(Broker):Worker 和任务派发者之间的中介,负责传递消息。常用 Redis 或 RabbitMQ。
  • 任务派发者(Client):你的程序,调用任务函数,将任务放入 Broker。
  • 后端(Backend):存储任务执行的结果(可选)。

在这个方案中,我们使用 Celery Beat 作为调度器,它定期将任务发送到 Broker,然后由 Worker 取走并执行。

2. 详细实现步骤

步骤 1:安装 Celery 和 Redis

pip3 install celery redis # 安装 Redis 服务器sudo yum install epel-release sudo yum install redis sudo systemctl start redis sudo systemctl enable redis 

步骤 2:编写 Celery 应用和任务
创建 celery_app.py

from celery import Celery from datetime import datetime # 导入你的发送函数from email_report import main as send_report_function # 创建 Celery 实例,指定 Broker 和 Backend(这里都用 Redis) app = Celery('email_tasks', broker='redis://localhost:6379/0', backend='redis://localhost:6379/0')# 定义一个任务@app.taskdefsend_report_task():print(f"[{datetime.now()}] Celery 任务开始执行")try: send_report_function()return"邮件发送成功"except Exception as e:returnf"邮件发送失败: {e}"

步骤 3:配置周期性调度(Beat)
celery_app.py 同一目录下创建 celeryconfig.py

from datetime import timedelta from celery.schedules import crontab # 启用 Beat 调度器 beat_schedule ={'send-daily-report':{'task':'celery_app.send_report_task',# 任务的完整路径'schedule': crontab(hour=2, minute=30),# 每天2:30# 'schedule': timedelta(minutes=10), # 每10分钟},}

步骤 4:启动 Worker 和 Beat
需要启动两个进程:

启动 Beat Scheduler(在另一个终端中):

cd /opt/scripts celery -A celery_app beat --loglevel=info 

启动 Worker(在一个终端中):

cd /opt/scripts celery -A celery_app worker --loglevel=info 

步骤 5:使用 Systemd 管理 Celery(生产环境必须)
为 Celery Worker 和 Beat 分别创建 Systemd service 文件,以便管理和守护化。这是生产环境的标准做法。配置稍复杂,需参考官方文档。

3. 优缺点分析
  • 优点
    • 高可靠性与分布式:Worker 可以分布在多台机器上,Broker 和 Backend 保证了任务不丢失。
    • 高性能与可扩展:可以轻松增加 Worker 数量来处理大量任务。
    • 功能丰富:支持任务重试、速率限制、工作流(链、组)等高级功能。
    • 监控性好:有丰富的工具(如 Flower)来监控任务状态。
  • 缺点
    • 架构最复杂:需要维护额外的组件(Redis/RabbitMQ, Worker, Beat)。
    • 资源消耗大:相比其他方案,占用更多内存和 CPU。
    • 学习曲线陡峭:配置和理解整个系统需要更多时间。
4. 适用场景
  • 大型、复杂的应用系统,已经或计划使用任务队列。
  • 需要执行大量不同类型的异步或定时任务。
  • 需要任务的高可用性、可扩展性和强大的监控能力。

方案五:一体化解决方案 - Jenkins CI/CD 作业

1. 原理概述

Jenkins 虽然是一个主要的 CI/CD(持续集成/持续部署)工具,但其强大的定时构建功能和丰富的插件生态(如 Email Extension Plugin),使其完全可以作为一个通用的任务调度器来使用。

2. 详细实现步骤

步骤 1:安装和配置 Jenkins

# 安装 Javasudo yum install java-11-openjdk-devel # 添加 Jenkins 仓库并安装sudowget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo sudorpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key sudo yum install jenkins sudo systemctl start jenkins sudo systemctl enable jenkins 

安装完成后,通过浏览器访问 http://<your-server-ip>:8080,完成初始设置。

步骤 2:安装必要插件
在 Jenkins 管理界面中,安装 “Email Extension Plugin”,它提供了更强大的邮件发送功能。

步骤 3:创建 Pipeline 项目

  1. 点击“新建任务”,输入任务名(如 Daily-Email-Report),选择“Pipeline”,点击“确定”。

在“Pipeline”部分,定义可以是“Pipeline script”,直接写入以下内容:

pipeline { agent any triggers {cron('30 2 * * *')// 每天 UTC 时间 2:30。注意 Jenkins 使用 UTC 时区!} stages {stage('Send Report'){ steps { script {// 这里可以直接调用系统上的 Python 脚本 sh ''' # 激活虚拟环境(如果有) source /path/to/venv/bin/activate # 执行脚本 python3 /opt/scripts/email_report.py '''}}}} post { always {// 使用 Jenkins 的邮件功能发送构建结果,这和你脚本发的邮件是两回事 emailext ( subject:"Jenkins Job '${JOB_NAME}' - 构建结果: ${currentBuild.result?:'SUCCESS'}", body:"""项目:${JOB_NAME}\n构建编号:${BUILD_NUMBER}\n构建状态:${currentBuild.result?:'SUCCESS'}\n详情:${BUILD_URL}""", to:"[email protected]")}}}

你也可以选择“Pipeline script from SCM”,将 Pipeline 配置和你的脚本代码一起存入 Git 仓库,实现配置的版本管理。

步骤 4:配置系统邮件(SMTP)
在“系统管理” -> “系统配置”中,找到“邮件通知”或“Extended E-mail Notification”部分,配置你的 SMTP 服务器信息。

3. 优缺点分析
  • 优点
    • 强大的 Web UI:提供非常友好的图形化界面来配置、触发和查看任务历史。
    • 完整的审计日志:每次执行都有详细的日志记录和构建状态。
    • 丰富的生态:无数插件可以集成各种通知、凭证管理(可以安全地存储密码)、权限控制等。
    • 易于手动触发:可以很方便地通过点击按钮来手动运行一次任务。
  • 缺点
    • 重量级:为了发个邮件,需要部署一整个 Jenkins,资源消耗最大。
    • 时区陷阱:Jenkins 默认使用 UTC 时区,配置 Cron 时需要特别注意转换。
    • 概念复杂:需要理解 Jenkins 的 Job、Pipeline、Stage 等概念。
4. 适用场景
  • 团队中已经在使用 Jenkins 作为 CI/CD 工具。
  • 希望获得极佳的任务执行可视化和历史记录。
  • 任务需要复杂的权限控制(如只允许特定用户触发)或与其他 CI/CD 流程集成。

总结与选择建议

方案复杂度可靠性功能丰富度资源开销最佳适用场景
1. Cron极低简单、独立、周期固定的系统级脚本任务。
2. Systemd Timer需要与系统服务集成、要求错时补发、资源控制的定时任务。
3. APScheduler中(需守护)调度逻辑复杂、需要嵌入到现有 Python 应用中的任务。
4. Celery极高极高企业级、分布式、高吞吐量、需要高级功能(重试、工作流)的任务系统。
5. Jenkins高(UI/审计)极高已有 Jenkins 环境,需要强大UI、审计日志和手动触发能力的任务。

最终决策指南

  • 如果你是系统管理员,只想安静地发个邮件:从 Cron 开始,它简单有效。如果担心服务器重启错过任务,升级到 Systemd Timer
  • 如果你是 Python 开发者,任务逻辑很复杂或与应用状态相关:选择 APScheduler
  • 如果你在构建一个大型平台或微服务:投资 Celery,它是专业且面向未来的选择。
  • 如果你的团队是 Jenkins 的重度用户:用 Jenkins 来统一管理各种自动化任务,包括发邮件,是一个合理的选择。

Read more

【C++】 —— 笔试刷题day_28

【C++】 —— 笔试刷题day_28

一、游游的重组偶数 题目解析 这道题,有q组数据,每一次输入一个正整数x,让我们将这个数进行重排,变成一个偶数,然后返回(如果x本身就是一个偶数那可以直接返回x); 如果不存在合法解,就是x通过重排后,无法变成一个偶数,就输出-1; 算法思路 这道题,总体来说还是比较简单的; 对于正整数x,我们可以把它当作一个字符串进行输入;(如果按照整数输入,我们还要将这个数x的每一位变换成对应数组) 我们知道,如果一个数是偶数,那最低位一定是一个偶数,这样我们只需判断字符串的最后一位即可知道这个数是否是偶数;如果这个数是偶数,那就直接输出即可;如果最后一位不是偶数,那就从第一位开始向后找,找到一位是偶数,然后把它交换到最后一位;然后输出即可;如果遍历完这个字符串,还没找到一位是偶数的,那就表示这个数x通过重拍无法变成偶数,输出-1即可。 题目解析 #include<iostream>usingnamespace std; string func(){ string str; cin >>

By Ne0inhk
C++ 多线程同步之互斥锁(mutex)实战

C++ 多线程同步之互斥锁(mutex)实战

C++ 多线程同步之互斥锁(mutex)实战 💡 学习目标:掌握 C++ 标准库中互斥锁的基本用法,理解多线程同步的核心原理,能够解决多线程环境下的资源竞争问题。 💡 学习重点:std::mutex 与 std::lock_guard 的使用、死锁的产生原因及规避方法、实际场景中的同步案例实现。 48.1 多线程同步的必要性 在多线程编程中,当多个线程同时访问共享资源时,会出现资源竞争问题。 例如两个线程同时对同一个变量进行读写操作,会导致最终结果与预期不符。 这种问题被称为线程安全问题,而解决该问题的核心就是线程同步。 ⚠️ 注意事项:线程不同步会引发数据竞争,造成程序运行结果不可预测,甚至导致程序崩溃。 举个简单的反例,两个线程同时对全局变量 count 进行自增操作: #include<iostream>#include<thread>usingnamespace std;int count

By Ne0inhk
(最新原创毕设)Java上门帮厨管理系统/03.01白嫖源码+演示录像)|可做计算机毕设Java、Python、PHP、小程序APP、C#、爬虫大数据、单片机、文案

(最新原创毕设)Java上门帮厨管理系统/03.01白嫖源码+演示录像)|可做计算机毕设Java、Python、PHP、小程序APP、C#、爬虫大数据、单片机、文案

摘  要 随着现代生活节奏的加快和人们对便捷、高质量餐饮服务需求的增加,上门帮厨作为一种新兴的服务模式逐渐受到欢迎。然而,传统的上门帮厨管理方式依赖于电话预约和手工记录,不仅效率低下,而且难以满足用户对服务质量透明度和个性化的需求。为此,本文提出了一个基于Spring Boot框架的临沂上门帮厨管理系统。该系统旨在通过信息化手段优化厨师与用户之间的互动流程,提高服务效率,增强用户体验,并为管理者提供有效的运营支持。 基于Spring Boot的临沂上门帮厨管理系统集成了多种功能模块,以满足不同用户群体的需求。普通用户可以通过注册登录进入系统,浏览首页展示的轮播图、菜品资讯、菜品信息推荐等信息,并进行相关操作。系统提供了菜品资讯的查看、点赞、收藏和评论功能,以及菜品信息的详情查看、评分、预约等功能。用户还可以在线提交问题反馈,查看个人账户信息并进行修改。 厨师用户可以查看订单详情,进行订单审核和回复,提交佣金提现申请,并查看提现记录。这些功能模块的设计充分考虑了厨师的实际需求,旨在帮助他们更好地管理和提升自己的服务水平。 管理员负责整个系统的运维工作,包括新注册用户的审核、菜品信

By Ne0inhk
C++ 多态:面向对象的动态行为核心机制

C++ 多态:面向对象的动态行为核心机制

C++ 多态:面向对象的动态行为核心机制 💡 学习目标:掌握多态的概念与分类,理解虚函数的作用原理,能够熟练使用多态实现程序的动态行为扩展。 💡 学习重点:静态多态与动态多态的区别、虚函数的定义与使用、纯虚函数与抽象类、多态的实战应用场景。 一、多态的概念与分类 ✅ 结论:多态是 C++ 面向对象三大特性之一,指同一行为在不同对象上表现出不同的形态,核心是“一个接口,多种实现”。 多态主要分为两大类,二者的实现原理和触发时机截然不同: 1. 静态多态:编译阶段确定调用关系,也叫编译时多态,实现方式包括函数重载和运算符重载 2. 动态多态:运行阶段确定调用关系,也叫运行时多态,实现方式是虚函数 + 基类指针/引用 生活中的多态示例:同样是“动物叫”这个行为,猫的叫声是“喵喵喵”,狗的叫声是“汪汪汪”,不同动物对象表现出不同的行为形态。 二、静态多态:编译时确定的多态性 💡 静态多态的调用关系在编译阶段就已确定,编译器会根据参数列表的差异匹配对应的函数。

By Ne0inhk