当前位置:首页>python>Python 零基础100天—Day84 自动化办公工具箱

Python 零基础100天—Day84 自动化办公工具箱

  • 2026-08-19 21:32:31
Python 零基础100天—Day84 自动化办公工具箱

🐍 Python Day84:自动化办公工具箱 — 终极实战项目

🕐 预计用时:3-4 小时 | 🎯 目标:构建完整的自动化办公工具箱(Excel + 邮件 + 定时 + 日志)


📖 今日目录

  1. 项目需求
  2. 项目结构
  3. 配置管理
  4. 数据采集模块
  5. 报表生成模块
  6. 邮件发送模块
  7. 日志与异常处理
  8. 主程序入口
  9. 完整代码
  10. 今日小结

1. 项目需求

功能
说明
使用技术
数据采集
从 CSV/数据库/API 获取数据
Pandas
数据处理
清洗、统计、排名
Pandas
报表生成
生成带样式的 Excel 报表
openpyxl
图表生成
生成折线图、柱状图
Matplotlib
邮件发送
HTML 邮件 + 附件
smtplib / email
定时执行
每天自动运行
APScheduler
日志记录
记录执行过程和错误
logging
配置管理
邮箱、路径等配置
YAML / JSON

2. 项目结构

office_toolkit/
├── config.yaml          # 配置文件
├── main.py              # 主程序入口
├── modules/
│   ├── __init__.py
│   ├── collector.py     # 数据采集
│   ├── processor.py     # 数据处理
│   ├── reporter.py      # 报表生成
│   ├── mailer.py        # 邮件发送
│   └── logger.py        # 日志配置
├── templates/
│   └── report_template.html  # 邮件 HTML 模板
├── output/              # 输出目录
│   ├── reports/         # Excel 报表
│   └── charts/          # 图表图片
├── logs/                # 日志目录
└── requirements.txt
# requirements.txt
pandas>=2.0
openpyxl>=3.1
matplotlib>=3.7
seaborn>=0.12
pyyaml>=6.0
apscheduler>=3.10

3. 配置管理

# config.yaml
app:
  name: "自动化办公工具箱"
  version: "1.0"
  timezone: "Asia/Shanghai"

data:
  source_file: "data/sales_data.csv"
  encoding: "utf-8-sig"

report:
  output_dir: "output/reports"
  chart_dir: "output/charts"
  filename_pattern: "销售报表_{date}.xlsx"

mail:
  smtp_server: "smtp.qq.com"
  smtp_port: 465
  use_ssl: true
  sender: "your@qq.com"
  password: "your_auth_code"      # 授权码
  recipients:
    - "boss@company.com"
    - "team@company.com"
  subject_pattern: "📊 销售日报 {date}"

schedule:
  enabled: true
  time: "18:00"                   # 每天 18:00 执行
  timezone: "Asia/Shanghai"

logging:
  level: "INFO"
  file: "logs/app.log"
  max_bytes: 10485760             # 10MB
  backup_count: 5
# config_loader.py
import yaml
import os

def load_config(config_path='config.yaml'):
    """加载配置文件"""
    if not os.path.exists(config_path):
        raise FileNotFoundError(f'配置文件不存在: {config_path}')

    with open(config_path, 'r', encoding='utf-8') as f:
        config = yaml.safe_load(f)

    # 确保输出目录存在
    os.makedirs(config['report']['output_dir'], exist_ok=True)
    os.makedirs(config['report']['chart_dir'], exist_ok=True)
    os.makedirs(os.path.dirname(config['logging']['file']), exist_ok=True)

    return config

4. 数据采集模块

# modules/collector.py
import pandas as pd
import logging

logger = logging.getLogger(__name__)

class DataCollector:
    """数据采集器"""

    def __init__(self, config):
        self.config = config

    def collect(self):
        """采集数据"""
        source = self.config['data']['source_file']
        encoding = self.config['data'].get('encoding', 'utf-8')

        logger.info(f'开始采集数据: {source}')

        # 根据文件类型选择读取方式
        if source.endswith('.csv'):
            df = pd.read_csv(source, encoding=encoding)
        elif source.endswith('.xlsx'):
            df = pd.read_excel(source)
        elif source.endswith('.json'):
            df = pd.read_json(source)
        else:
            raise ValueError(f'不支持的文件格式: {source}')

        logger.info(f'采集完成: {len(df)} 行, {len(df.columns)} 列')

        # 基础验证
        if df.empty:
            raise ValueError('数据为空')

        return df

5. 数据处理模块

# modules/processor.py
import pandas as pd
import numpy as np
import logging

logger = logging.getLogger(__name__)

class DataProcessor:
    """数据处理器"""

    def process(self, df):
        """处理数据:清洗 + 统计"""
        logger.info('开始处理数据...')

        # 1. 清洗
        df = self._clean(df)

        # 2. 统计
        summary = self._summarize(df)

        logger.info('数据处理完成')
        return df, summary

    def _clean(self, df):
        """数据清洗"""
        original_len = len(df)

        # 删除重复行
        df = df.drop_duplicates()

        # 删除全空行
        df = df.dropna(how='all')

        # 填充缺失值
        numeric_cols = df.select_dtypes(include=[np.number]).columns
        df[numeric_cols] = df[numeric_cols].fillna(0)

        logger.info(f'清洗: {original_len} → {len(df)} 行 (删除 {original_len - len(df)} 行)')
        return df

    def _summarize(self, df):
        """统计汇总"""
        summary = {}

        # 总体统计
        if '金额' in df.columns:
            summary['总销售额'] = df['金额'].sum()
            summary['订单数'] = len(df)
            summary['客单价'] = df['金额'].mean()

        # 按品类统计
        if '品类' in df.columns and '金额' in df.columns:
            cat_stats = df.groupby('品类')['金额'].agg(['sum', 'count', 'mean'])
            cat_stats.columns = ['销售额', '订单数', '客单价']
            cat_stats = cat_stats.sort_values('销售额', ascending=False)
            summary['品类统计'] = cat_stats

        # 日期统计
        if '日期' in df.columns and '金额' in df.columns:
            df['日期'] = pd.to_datetime(df['日期'])
            daily = df.groupby(df['日期'].dt.date)['金额'].sum()
            summary['日销售趋势'] = daily

        logger.info(f'统计: 总销售额={summary.get("总销售额", 0):,.2f}')
        return summary

6. 报表生成模块

# modules/reporter.py
import os
from datetime import datetime
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side
from openpyxl.chart import BarChart, LineChart, Reference
from openpyxl.utils import get_column_letter
import matplotlib.pyplot as plt
import seaborn as sns
import logging

logger = logging.getLogger(__name__)

class ReportGenerator:
    """报表生成器"""

    def __init__(self, config):
        self.config = config
        self.output_dir = config['report']['output_dir']
        self.chart_dir = config['report']['chart_dir']

        plt.rcParams['font.sans-serif'] = ['SimHei', 'DejaVu Sans']
        plt.rcParams['axes.unicode_minus'] = False

    def generate(self, df, summary):
        """生成完整报表"""
        date_str = datetime.now().strftime('%Y%m%d')

        # 1. 生成 Excel 报表
        excel_file = self._generate_excel(df, summary, date_str)

        # 2. 生成图表
        chart_file = self._generate_chart(df, summary, date_str)

        logger.info(f'报表生成完成: {excel_file}')
        return excel_file, chart_file

    def _generate_excel(self, df, summary, date_str):
        """生成 Excel 报表"""
        filename = f'销售报表_{date_str}.xlsx'
        filepath = os.path.join(self.output_dir, filename)

        wb = Workbook()

        # --- Sheet1: 概览 ---
        ws_overview = wb.active
        ws_overview.title = '概览'

        # 样式
        header_font = Font(name='微软雅黑', size=12, bold=True, color='FFFFFF')
        header_fill = PatternFill(start_color='07C160', fill_type='solid')
        center = Alignment(horizontal='center', vertical='center')
        border = Border(
            left=Side(style='thin'), right=Side(style='thin'),
            top=Side(style='thin'), bottom=Side(style='thin')
        )

        # 写入 KPI
        kpis = [
            ('指标', '数值'),
            ('总销售额', f'¥{summary.get("总销售额", 0):,.2f}'),
            ('总订单数', f'{summary.get("订单数", 0):,}'),
            ('客单价', f'¥{summary.get("客单价", 0):,.2f}'),
            ('报表日期', datetime.now().strftime('%Y-%m-%d')),
        ]

        for row_idx, (label, value) in enumerate(kpis, 1):
            for col_idx, text in enumerate([label, value], 1):
                cell = ws_overview.cell(row=row_idx, column=col_idx, value=text)
                if row_idx == 1:
                    cell.font = header_font
                    cell.fill = header_fill
                cell.alignment = center
                cell.border = border

        ws_overview.column_dimensions['A'].width = 20
        ws_overview.column_dimensions['B'].width = 25

        # --- Sheet2: 品类统计 ---
        if '品类统计' in summary:
            ws_cat = wb.create_sheet('品类统计')
            cat_stats = summary['品类统计']

            # 表头
            headers = ['品类'] + list(cat_stats.columns)
            for col_idx, header in enumerate(headers, 1):
                cell = ws_cat.cell(row=1, column=col_idx, value=header)
                cell.font = header_font
                cell.fill = header_fill
                cell.alignment = center
                cell.border = border

            # 数据
            for row_idx, (cat, row) in enumerate(cat_stats.iterrows(), 2):
                ws_cat.cell(row=row_idx, column=1, value=cat).border = border
                for col_idx, val in enumerate(row, 2):
                    cell = ws_cat.cell(row=row_idx, column=col_idx, value=round(val, 2))
                    cell.border = border
                    cell.alignment = center

            # 列宽
            for col in range(1, len(headers) + 1):
                ws_cat.column_dimensions[get_column_letter(col)].width = 15

            # 添加柱状图
            chart = BarChart()
            chart.title = '品类销售额'
            chart.y_axis.title = '销售额'
            chart.x_axis.title = '品类'
            data_ref = Reference(ws_cat, min_col=2, min_row=1, max_row=len(cat_stats) + 1)
            cats_ref = Reference(ws_cat, min_col=1, min_row=2, max_row=len(cat_stats) + 1)
            chart.add_data(data_ref, titles_from_data=True)
            chart.set_categories(cats_ref)
            chart.width = 18
            chart.height = 10
            ws_cat.add_chart(chart, 'F2')

        # --- Sheet3: 原始数据 ---
        ws_data = wb.create_sheet('原始数据')
        # 表头
        for col_idx, col_name in enumerate(df.columns, 1):
            cell = ws_data.cell(row=1, column=col_idx, value=col_name)
            cell.font = header_font
            cell.fill = header_fill
            cell.alignment = center
            cell.border = border
        # 数据
        for row_idx, row in enumerate(df.values, 2):
            for col_idx, val in enumerate(row, 1):
                cell = ws_data.cell(row=row_idx, column=col_idx, value=val)
                cell.border = border

        wb.save(filepath)
        wb.close()

        return filepath

    def _generate_chart(self, df, summary, date_str):
        """生成分析图表"""
        chart_path = os.path.join(self.chart_dir, f'chart_{date_str}.png')

        fig, axes = plt.subplots(1, 2, figsize=(16, 6))

        # 图1:品类柱状图
        if '品类统计' in summary:
            cat_stats = summary['品类统计']
            axes[0].bar(cat_stats.index, cat_stats['销售额'], color='
#07c160', alpha=0.8)
            axes[0].set_title('品类销售额排名', fontsize=14)
            axes[0].set_ylabel('销售额')
            axes[0].tick_params(axis='x', rotation=45)

        # 图2:日销售趋势
        if '日销售趋势' in summary:
            daily = summary['日销售趋势']
            axes[1].plot(daily.index, daily.values, color='#4d96ff', linewidth=2, marker='o', markersize=4)
            axes[1].set_title('日销售趋势', fontsize=14)
            axes[1].set_ylabel('销售额')
            axes[1].tick_params(axis='x', rotation=45)

        plt.tight_layout()
        plt.savefig(chart_path, dpi=150, bbox_inches='tight')
        plt.close()

        return chart_path

7. 邮件发送模块

# modules/mailer.py
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email.mime.image import MIMEImage
from email import encoders
from email.header import Header
from datetime import datetime
import os
import logging

logger = logging.getLogger(__name__)

class Mailer:
    """邮件发送器"""

    def __init__(self, config):
        self.smtp_server = config['mail']['smtp_server']
        self.smtp_port = config['mail']['smtp_port']
        self.use_ssl = config['mail'].get('use_ssl', True)
        self.sender = config['mail']['sender']
        self.password = config['mail']['password']
        self.recipients = config['mail']['recipients']

    def send_report(self, summary, excel_path, chart_path):
        """发送报表邮件"""
        date_str = datetime.now().strftime('%Y-%m-%d')

        # 构造 HTML 正文
        html = self._build_html(summary, date_str)

        # 构造邮件
        msg = MIMEMultipart('mixed')
        msg['From'] = self.sender
        msg['To'] = ', '.join(self.recipients)
        msg['Subject'] = Header(f'📊 销售日报 {date_str}', 'utf-8')

        # HTML 正文
        html_part = MIMEText(html, 'html', 'utf-8')
        msg.attach(html_part)

        # 内嵌图表
        if chart_path and os.path.exists(chart_path):
            with open(chart_path, 'rb') as f:
                img = MIMEImage(f.read())
                img.add_header('Content-ID', '')
                msg.attach(img)

        # Excel 附件
        if excel_path and os.path.exists(excel_path):
            with open(excel_path, 'rb') as f:
                attachment = MIMEBase('application', 'octet-stream')
                attachment.set_payload(f.read())
                encoders.encode_base64(attachment)
                filename = os.path.basename(excel_path)
                attachment.add_header('Content-Disposition', 'attachment',
                                     filename=('utf-8', '', filename))
                msg.attach(attachment)

        # 发送
        server = None
        try:
            if self.use_ssl:
                server = smtplib.SMTP_SSL(self.smtp_server, self.smtp_port)
            else:
                server = smtplib.SMTP(self.smtp_server, self.smtp_port)
                server.starttls()

            server.login(self.sender, self.password)
            server.sendmail(self.sender, self.recipients, msg.as_string())
            logger.info(f'邮件发送成功: {self.recipients}')
            return True
        except Exception as e:
            logger.error(f'邮件发送失败: {e}')
            return False
        finally:
            if server:
                try:
                    server.quit()
                except Exception:
                    pass

    def _build_html(self, summary, date_str):
        """构造 HTML 邮件正文"""
        total_sales = summary.get('总销售额', 0)
        order_count = summary.get('订单数', 0)
        avg_order = summary.get('客单价', 0)

        # 品类排名表
        cat_rows = ''
        if '品类统计' in summary:
            for i, (cat, row) in enumerate(summary['品类统计'].iterrows(), 1):
                cat_rows += f'''

                    {i}
                    {cat}
                    ¥{row["销售额"]:,.2f}
                    {int(row["订单数"])}
                    ¥{row["客单价"]:,.2f}
                '''

        html = f'''


📊 销售日报

{date_str}



📈 今日概览


¥{total_sales:,.0f}


总销售额


{order_count:,}


订单数


¥{avg_order:,.0f}


客单价

🏆 品类排名



                    {cat_rows}

排名
品类
销售额
订单数
客单价

📊 趋势图




                本报告由 Python 自动生成 | 完整数据见附件 Excel




        '''
        return html

8. 主程序入口

# main.py
import sys
import os
from datetime import datetime
from config_loader import load_config
from modules.collector import DataCollector
from modules.processor import DataProcessor
from modules.reporter import ReportGenerator
from modules.mailer import Mailer
import logging

def setup_logging(config):
    """配置日志"""
    log_config = config['logging']
    log_file = log_config['file']
    os.makedirs(os.path.dirname(log_file), exist_ok=True)

    logging.basicConfig(
        level=getattr(logging, log_config['level']),
        format='%(asctime)s [%(levelname)s] %(name)s: %(message)s',
        datefmt='%Y-%m-%d %H:%M:%S',
        handlers=[
            logging.FileHandler(log_file, encoding='utf-8'),
            logging.StreamHandler(sys.stdout),
        ]
    )

def run_pipeline(config):
    """执行完整流水线"""
    logger = logging.getLogger('pipeline')
    start_time = datetime.now()

    logger.info('=' * 50)
    logger.info('自动化办公流水线开始执行')
    logger.info('=' * 50)

    try:
        # 1. 数据采集
        logger.info('步骤 1/4: 数据采集...')
        collector = DataCollector(config)
        df = collector.collect()

        # 2. 数据处理
        logger.info('步骤 2/4: 数据处理...')
        processor = DataProcessor()
        df, summary = processor.process(df)

        # 3. 生成报表
        logger.info('步骤 3/4: 生成报表...')
        reporter = ReportGenerator(config)
        excel_path, chart_path = reporter.generate(df, summary)

        # 4. 发送邮件
        if config['mail'].get('enabled', True):
            logger.info('步骤 4/4: 发送邮件...')
            mailer = Mailer(config)
            mailer.send_report(summary, excel_path, chart_path)
        else:
            logger.info('步骤 4/4: 邮件发送已禁用,跳过')

        # 完成
        elapsed = (datetime.now() - start_time).total_seconds()
        logger.info(f'流水线执行完成 ✅ (耗时 {elapsed:.1f} 秒)')

        return True

    except Exception as e:
        elapsed = (datetime.now() - start_time).total_seconds()
        logger.error(f'流水线执行失败 ❌ (耗时 {elapsed:.1f} 秒)')
        logger.error(f'错误: {e}')
        import traceback
        logger.error(traceback.format_exc())
        return False

def main():
    """主函数"""
    config = load_config()
    setup_logging(config)

    # 检查命令行参数
    if len(sys.argv) > 1 and sys.argv[1] == '--schedule':
        # 定时模式
        from apscheduler.schedulers.blocking import BlockingScheduler
        from apscheduler.triggers.cron import CronTrigger

        scheduler = BlockingScheduler()
        schedule_config = config['schedule']

        time_parts = schedule_config['time'].split(':')
        hour = int(time_parts[0])
        minute = int(time_parts[1]) if len(time_parts) > 1 else 0

        scheduler.add_job(
            run_pipeline,
            CronTrigger(hour=hour, minute=minute),
            args=[config],
            id='daily_report',
        )

        logging.getLogger('main').info(f'定时模式: 每天 {schedule_config["time"]} 执行')
        scheduler.start()
    else:
        # 立即执行一次
        run_pipeline(config)

if __name__ == '__main__':
    main()

9. 完整使用方法

# 1. 安装依赖
pip install pandas openpyxl matplotlib seaborn pyyaml apscheduler

# 2. 准备配置文件 config.yaml(修改邮箱、路径等)

# 3. 准备数据文件 data/sales_data.csv

# 4. 立即执行一次
python main.py

# 5. 定时模式(每天 18:00 自动执行)
python main.py --schedule

# 6. 后台运行(Linux)
nohup python main.py --schedule > /dev/null 2>&1 &

# 7. 查看日志
tail -f logs/app.log

10. 今日小结

模块
功能
核心库
配置管理
YAML 配置文件
pyyaml
数据采集
读取 CSV/Excel/JSON
pandas
数据处理
清洗 + 统计 + 汇总
pandas / numpy
报表生成
Excel 报表 + 图表
openpyxl / matplotlib
邮件发送
HTML 邮件 + 附件 + 内嵌图片
smtplib / email
定时执行
每天自动运行
APScheduler
日志记录
执行过程和错误日志
logging

🎉 自动化办公阶段完结!

Day 81-84 你掌握了完整的自动化办公技能栈:
✅ Excel 自动化(openpyxl)· 邮件自动化(smtplib)
✅ 定时任务(APScheduler / crontab)· 综合实战项目

接下来进入机器学习入门(Day 85-88)—— Scikit-learn、模型训练、预测。Python 在 AI 领域的核心能力即将解锁!

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-08-21 14:35:52 HTTP/2.0 GET : https://f.mffb.com.cn/a/511301.html
  2. 运行时间 : 0.258398s [ 吞吐率:3.87req/s ] 内存消耗:4,851.57kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=9e576eb9e88408770eb6702772433e8f
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.001079s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001560s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000772s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000715s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001468s ]
  6. SELECT * FROM `set` [ RunTime:0.000660s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001480s ]
  8. SELECT * FROM `article` WHERE `id` = 511301 LIMIT 1 [ RunTime:0.003815s ]
  9. UPDATE `article` SET `lasttime` = 1787294152 WHERE `id` = 511301 [ RunTime:0.017904s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.000622s ]
  11. SELECT * FROM `article` WHERE `id` < 511301 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001138s ]
  12. SELECT * FROM `article` WHERE `id` > 511301 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001081s ]
  13. SELECT * FROM `article` WHERE `id` < 511301 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.010155s ]
  14. SELECT * FROM `article` WHERE `id` < 511301 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.012406s ]
  15. SELECT * FROM `article` WHERE `id` < 511301 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.033889s ]
0.262182s