前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >用豆包制作一个可以统计直播数据的系统

用豆包制作一个可以统计直播数据的系统

原创
作者头像
半夜喝可乐
修改2024-12-11 18:47:19
修改2024-12-11 18:47:19
870
举报
文章被收录于专栏:小轻论坛小轻论坛

最近公司直播使用的是微赞平台做私域直播,我们为了方便直播数据的累计,保证能够提升单个直播间的数据,所以采用的是数据全累计,这样会导致一个问题就是无法获取单场数据,经平台确认,暂时无法统计这方面的数据,但是我们每天都要汇报这方面的数据,所以我做了这个系统。

当时使用的是chatgpt和文心一言,发现他们在理解我的表述后,无法正确完成我要的结果,虽然我的要求并不高,只需要类似下述内容即可:

代码语言:txt
复制
1.[直播名1],直播1小时,98人观看了568次,平均时长15.24分钟,成交0.00元。
2.[直播名2],直播16小时,82人观看了815次,平均时长7.87分钟,成交0.00元。
3.[直播名3],直播2小时,23人观看了137次,平均时长2.85分钟,成交0.00元。
4.[直播名4],直播2小时,17人观看了50次,平均时长12.56分钟,成交0.00元。

我们去统计每次的数据变化,并将今天变化的数据进行输出,比如某个直播ID下,名称和观看时长、观看次数有了变化,我们就进行输出最新的数据,对于观看次数,直接使用的热度差。

所以我给出的提示词是:

代码语言:txt
复制
每天都会统计直播间数据,因为每个直播间都有自己的直播主题,虽然id相同,但是直播间名称不同,数据直播却是累加的,我需要统计今天新增的该ID的直播间hot数据增值,然后通过点击“复制数据”按钮去复制一个统计结果,其他数据的话,就直接按照该ID的最新直播间数据正常输出即可。如直播间列表数据为
直播ID	直播名称	直播热度	人均观看时长	直播时长	收入金额	单场总计人数	登记时间
15406	直播4	6641	14.73	2	0.00	120	2024-12-04 16:00:06
19758	直播3	1988	10.19	17	0.00	54	2024-12-04 13:17:28
16483	直播2	1614	4.92	16	0.00	30	2024-12-04 13:15:34
15406	直播1	5864	14.73	2	60.00	79	2024-12-03 13:12:32
复制的结果就是:1.[直播4],直播2个小时,120人观看777次,平均时长14.73分钟,成交0元,当然,如果有其他ID数据有变化,我们就继续换行编号输出新的结果就行。

我根据要求设置好了数据库,然后豆包综合我自己写的部分代码给的建议是:

代码语言:php
复制
<?php
// 数据库连接信息,根据实际情况填写
$host = 'localhost';
$dbname = 'tongji';
$user = 'tongji';
$pass = 'tongji';

try {
    // 创建PDO实例
    $pdo = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
    // 设置错误模式为异常
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // 检查是否有POST数据
    if ($_SERVER['REQUEST_METHOD'] == 'POST') {
        $liveId = $_POST['live_id'];
        $liveName = $_POST['live_name'];
        $hot = $_POST['live_popularity'];
        $aveWatch = $_POST['average_watch_duration'];
        $totaltime = $_POST['total_time'];
        $earn = $_POST['earn'];
        $toren = $_POST['toren'];

        // 检查是否输入了直播ID
        if (!empty($liveId)) {
            // 检查是否输入了直播名称
            if (!empty($liveName)) {
                // 插入新记录
                $stmt = $pdo->prepare("INSERT INTO live_stream (live_id, live_name, hot, aveWatch, totaltime, earn, toren) VALUES (:live_id, :live_name, :hot, :aveWatch, :totaltime, :earn, :toren)");
                $stmt->execute(['live_id' => $liveId, 'live_name' => $liveName, 'hot' => $hot, 'aveWatch' => $aveWatch, 'totaltime' => $totaltime, 'earn' => $earn, 'toren' => $toren]);

                echo "<script>alert('数据提交成功');</script>";
            } else {
                echo "<script>alert('请输入直播名称。');</script>";
            }
        } else {
            echo "<script>alert('请输入直播ID。');</script>";
        }
    }

    // 修改查询语句,获取按live_id分组的多条记录(包含时间用于后续判断今天新增等情况)
    $stmt = $pdo->query("SELECT * FROM live_stream ORDER BY live_id, time DESC");
    $rawData = $stmt->fetchAll(PDO::FETCH_ASSOC);

    // 用于存储整理后的数据,格式类似:['live_id' => ['name' => '', 'hot_growth' => 0, 'latest_data' => []]]
    $processedData = [];
    foreach ($rawData as $row) {
        $liveId = $row['live_id'];
        if (!isset($processedData[$liveId])) {
            $processedData[$liveId] = [
                'name' => $row['live_name'],
                'hot_growth' => 0,
                'latest_data' => $row
            ];
        } else {
            // 判断是否是今天新增(这里简单示例,你可以根据实际时间格式更精准判断今天日期)
            if (strpos($row['time'], date('Y-m-d')) === 0) {
                $processedData[$liveId]['hot_growth'] += $row['hot'];
            }
            // 始终更新为最新数据
            $processedData[$liveId]['latest_data'] = $row;
        }
    }
    $data = array_values($processedData);
} catch (PDOException $e) {
    echo "数据库连接失败: ". $e->getMessage();
}

// 关闭数据库连接
$pdo = null;
?>

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>直播信息管理</title>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.11/clipboard.min.js"></script>
    <style>
        body {
            font-family: Arial, sans-serif;
            margin: 20px;
        }
        form {
            margin-bottom: 20px;
        }
        label {
            display: block;
            margin-bottom: 5px;
        }
        input[type="text"], input[type="number"] {
            width: 100%;
            padding: 8px;
            margin-bottom: 10px;
            box-sizing: border-box;
        }
        input[type="submit"], button {
            padding: 10px 20px;
            background-color: #4CAF50;
            color: white;
            border: none;
            cursor: pointer;
        }
        input[type="submit"]:hover, button:hover {
            background-color: #45a049;
        }
        table {
            width: 100%;
            border-collapse: collapse;
        }
        table, th, td {
            border: 1px solid #ddd;
        }
        th, td {
            padding: 8px;
            text-align: left;
        }
        th {
            background-color: #f2f2f2;
        }
    </style>
</head>
<body>
    <h2>直播信息管理</h2>
    <form action="" method="post">
        <label for="live_id">直播ID:</label>
        <input type="text" id="live_id" name="live_id" required>

        <label for="live_name">直播名称:</label>
        <input type="text" id="live_name" name="live_name" required>

        <label for="live_popularity">直播热度:</label>
        <input type="number" id="live_popularity" name="live_popularity" min="0" required>

        <label for="average_watch_duration">人均观看时长 (分钟):</label>
        <input type="number" id="average_watch_duration" name="average_watch_duration" min="0.00" step="0.01" required>

        <label for="total_time">直播时长 (小时):</label>
        <input type="number" id="total_time" name="total_time" min="0" required>

        <label for="earn">收入金额 (元):</label>
        <input type="number" id="earn" name="earn" min="0" step="0.01" required>

        <label for="toren">单场总计人数:</label>
        <input type="number" id="toren" name="toren" min="0" required>

        <input type="submit" value="提交">
    </form>

    <?php if (!empty($data)):?>
    <h3>直播数据统计</h3>
    <button onclick="copyToClipboard()">复制数据</button>
    <br><br>
    <table>
        <tr>
            <th>直播ID</th>
            <th>直播名称</th>
            <th>直播热度增长值</th>
            <th>人均观看时长</th>
            <th>直播时长</th>
            <th>收入金额</th>
            <th>单场总计人数</th>
            <th>登记时间</th>
        </tr>
        <?php foreach ($data as $row):?>
        <tr>
            <td><?php echo htmlspecialchars($row['latest_data']['live_id']);?></td>
            <td><?php echo htmlspecialchars($row['name']);?></td>
            <td><?php echo htmlspecialchars($row['hot_growth']);?></td>
            <td><?php echo htmlspecialchars($row['latest_data']['aveWatch']);?></td>
            <td><?php echo htmlspecialchars($row['latest_data']['totaltime']);?></td>
            <td><?php echo htmlspecialchars($row['latest_data']['earn']);?></td>
            <td><?php echo htmlspecialchars($row['latest_data']['toren']);?></td>
            <td><?php echo htmlspecialchars($row['latest_data']['time']);?></td>
        </tr>
        <?php endforeach;?>
    </table>
    <?php endif;?>
    <p>注:数据进行了相应处理统计。</p>
</body>
<script>
    function copyToClipboard() {
        let result = '';
        <?php if (!empty($data)):?>
            <?php foreach ($data as $index => $row):?>
                result += (<?php echo $index + 1;?>). "【<?php echo addslashes($row['name']);?>】,直播<?php echo $row['latest_data']['totaltime'];?>个小时,<?php echo $row['latest_data']['toren'];?>人观看<?php echo $row['hot_growth'];?>次,平均时长<?php echo $row['latest_data']['aveWatch'];?>分钟,成交<?php echo $row['latest_data']['earn'];?>元\n";
            <?php endforeach;?>
        <?php endif;?>
        const textarea = document.createElement('textarea');
        textarea.value = result;
        document.body.appendChild(textarea);
        textarea.select();
        document.execCommand('copy');
        document.body.removeChild(textarea);
    }
</script>
</html>

这里我设计了一个输入数据的表单,一个显示数据的数据表,一个复制数据的结果框。

由于数据有时效性,我只展示了最近的十条,但是计算的时候会统计所有的数据,这也是符合我们的要求的。

但是该代码无法对我们所有的数据进行计算统计,而且点击复制按钮无法进行复制。

系统给出的解决办法是:

数据查询与处理部分

  1. 查询所有数据: 将数据库查询语句修改为获取所有直播数据,而不是之前限制只取最新的 10 条数据,这样后续可以全面地对每个live_id的所有记录进行分析处理。
  2. 处理数据逻辑完善: 在遍历所有数据时,针对每个live_id,准确判断最新记录以及计算hot数据增值情况,并且更新存储结构中的最新数据信息,以便后续展示和复制操作使用。

复制功能部分(JavaScript 函数 copyToClipboard

copyToClipboard函数中,添加了条件判断,只有当hot数据增值大于 0(表示有变化)时,才将对应直播间的数据按照要求格式拼接进要复制的字符串result中,这样就实现了只复制有变化的数据内容。

代码语言:php
复制
<?php
// 数据库连接信息,根据实际情况填写
$host = 'localhost';
$dbname = 'tongji';
$user = 'tongji';
$pass = 'tongji';

try {
    // 创建PDO实例
    $pdo = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
    // 设置错误模式为异常
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    // 检查是否有POST数据
    if ($_SERVER['REQUEST_METHOD'] == 'POST') {
        $liveId = $_POST['live_id'];
        $liveName = $_POST['live_name'];
        $hot = $_POST['live_popularity'];
        $aveWatch = $_POST['average_watch_duration'];
        $totaltime = $_POST['total_time'];
        $earn = $_POST['earn'];
        $toren = $_POST['toren'];
    
        // 检查是否输入了直播ID
        if (!empty($liveId)) {
            // 检查是否输入了直播名称
            if (!empty($liveName)) {
                // 插入新记录
                $stmt = $pdo->prepare("INSERT INTO live_stream (live_id, live_name, hot, aveWatch, totaltime, earn, toren) VALUES (:live_id, :live_name, :hot, :aveWatch, :totaltime, :earn, :toren)");
                $stmt->execute(['live_id' => $liveId, 'live_name' => $liveName, 'hot' => $hot, 'aveWatch' => $aveWatch, 'totaltime' => $totaltime, 'earn' => $earn, 'toren' => $toren]);

                header('Location: index.php');
                exit;
            } else {
                echo "<script>alert('请输入直播名称。');</script>";
            }
        } else {
            echo "<script>alert('请输入直播ID。');</script>";
        }
    }


    // 获取最新的十条数据
    $stmt = $pdo->query("SELECT * FROM live_stream ORDER BY id DESC LIMIT 10");
    $data = $stmt->fetchAll(PDO::FETCH_ASSOC);

    // 用于记录已经处理过的live_id
    $processedLiveIds = [];
    // 获取今天的日期(假设数据库中日期格式为 Y-m-d,可根据实际调整)
    $today = date('Y-m-d');
    // 用于存储最终要输出的统计结果数据(有热度变化的今天的数据)
    $statisticsData = [];

    // 遍历最新的数据,检查每个live_id是否有多条记录,并计算热度差值等信息
    foreach ($data as $row) {
        $liveId = $row['live_id'];
        $time = date('Y-m-d', strtotime($row['time'])); // 提取记录中的日期部分(同样假设格式为 Y-m-d,按需调整)

        // 如果该live_id已经处理过或者不是今天的记录,则跳过本次循环
        if (in_array($liveId, $processedLiveIds) || $time!= $today) {
            continue;
        }

        // 获取当前live_id的所有记录
        $stmt = $pdo->prepare("SELECT * FROM live_stream WHERE live_id = :live_id ORDER BY time DESC");
        $stmt->execute(['live_id' => $liveId]);
        $records = $stmt->fetchAll(PDO::FETCH_ASSOC);

        // 如果有两条或以上的记录,则计算热度差值并整理相关数据到统计结果数组中
        if (count($records) > 1) {
            $latest = $records[0]; // 最新记录
            $previous = $records[1]; // 前一条记录
            $hotDiff = $latest['hot'] - $previous['hot']; // 热度差值

            // 将当前live_id添加到已处理数组中
            $processedLiveIds[] = $liveId;

            // 整理当前记录的统计信息到数组,方便后续统一输出等操作
            $statistic = [
                'count' => count($statisticsData) + 1,
                'live_name' => $latest['live_name'],
                'hotDiff' => $hotDiff,
                'aveWatch' => $latest['aveWatch'],
                'totaltime' => $latest['totaltime'],
                'earn' => $latest['earn'],
                'toren' => $latest['toren']
            ];
            $statisticsData[] = $statistic;
        }
    }
} catch (PDOException $e) {
    echo "数据库连接失败: ". $e->getMessage();
}

// 关闭数据库连接
$pdo = null;
?>

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>直播信息管理 by:可乐</title>
    <link rel="stylesheet" href="bootstrap/css/bootstrap.min.css">
    <script src="bootstrap/js/bootstrap.bundle.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.11/clipboard.min.js"></script>
    <style>
        button.copy-all-btn {
            margin-top: 10px;
            cursor: pointer;
            opacity: 0.8;
        }
    </style>
</head>
<body>
    <div class="container">
        <h2 class="mb-4 mt-5 text-center p-2">直播信息管理</h2><hr />

        <div class="row">
            <div class="col-md-6">
                <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-bell-fill" viewBox="0 0 16 16">
  <path d="M8 16a2 2 0 0 0 2-2H6a2 2 0 0 0 2 2zm.995-14.901a1 1 0 1 0-1.99 0A5.002 5.002 0 0 0 3 6c0 1.098-.5 6-2 7h14c-1.5-1-2-5.902-2-7 0-2.42-1.72-4.44-4.005-4.901z"/>
</svg> <span>注:请务必在当天直播结束后统计数据!</span>
                <form action="" method="post" class="my-4">
                    <div class="row">
                        <div class="col-md-4 mb-3">
                            <label for="live_id" class="form-label">直播ID:</label>
                            <input type="text" id="live_id" name="live_id" class="form-control" required>
                        </div>
                        <div class="col-md-8 mb-3">
                            <label for="live_name" class="form-label">直播名称:</label>
                            <input type="text" id="live_name" name="live_name" class="form-control" required>
                        </div>
                    </div>
                    <div class="row">
                        <div class="col-4 mb-3">
                            <label for="live_popularity" class="form-label">直播热度:</label>
                            <input type="number" id="live_popularity" name="live_popularity" class="form-control" min="0" required>
                        </div>
                        <div class="col-4 mb-3">
                            <label for="average_watch_duration" class="form-label">人均(分钟):</label>
                            <input type="number" id="average_watch_duration" name="average_watch_duration" class="form-control" min="0.00" step="0.01" required>
                        </div>
                        <div class="col-4 mb-3">
                            <label for="total_time" class="form-label">总时(小时):</label>
                            <input type="number" id="total_time" name="total_time" class="form-control" min="0" required>
                        </div>
                    </div>
                    <div class="row">
                        <div class="col-md-4 col-6 mb-3">
                            <label for="toren" class="form-label">单场总计(人):</label>
                            <input type="number" id="toren" name="toren" class="form-control" min="0" required>
                        </div>
                        <div class="col-md-4 col-6 mb-3">
                            <label for="earn" class="form-label">收入(元):</label>
                            <input type="number" id="earn" name="earn" class="form-control" min="0" step="0.01" required>
                        </div>
                    </div>
                    <div class="row">
                        <div class="col-md-12 mb-3">
                            <button type="submit" class="btn btn-primary w-100">提交</button>
                        </div>
                    </div>
                </form>
            </div>
            <div class="col-md-6">
                <h3 class="mb-3 text-center p-2">直播数据统计</h3>
                <?php if (!empty($statisticsData)):?>
                <div class="card mb-3">
                    <div class="card-header">今日直播数据统计</div>
                    <div class="card-body">
                        <div id="all-statistics-content">
                            <?php foreach ($statisticsData as $statistic):?>
                            <div class="row border-bottom py-2">
                                <div class="col">
                                    <?php echo $statistic['count'];?>.[<?php echo htmlspecialchars($statistic['live_name']);?>],直播<?php echo $statistic['totaltime'];?>小时,<?php echo $statistic['toren'];?>人观看了<?php echo $statistic['hotDiff'];?>次,平均时长<?php echo $statistic['aveWatch'];?>分钟,成交<?php echo $statistic['earn'];?>元。
                                </div>
                            </div>
                            <?php endforeach;?>
                        </div>
                        <button class="mt-2 btn btn-sm btn-outline-secondary copy-all-btn" data-clipboard-target="#all-statistics-content" data-bs-toggle="tooltip" data-bs-placement="top" title="点击复制全部数据">
                            <i class="bi bi-clipboard"></i> 复制全部
                        </button>
                    </div>
                </div>
                <?php else:?>
                <div class="card mb-3">
                    <div class="card-body text-center">
                        <p class="text-muted">今日暂无直播数据统计信息。</p>
                    </div>
                </div>
                <?php endif;?>
            </div>
    
            <script>
                document.addEventListener("DOMContentLoaded", function () {
                    // 实例化 ClipboardJS,传入所有具有 copy-all-btn 类的按钮元素
                    var clipboard = new ClipboardJS('.copy-all-btn');
    
                    clipboard.on('success', function (e) {
                        // 复制成功时显示提示信息(可以使用 Bootstrap 的 toast 组件等进行更美观的提示,此处简单 alert)
                        alert('已复制全部数据到剪贴板');
                        e.clearSelection();
                    });
    
                    clipboard.on('error', function (e) {
                        // 复制失败时显示提示信息
                        alert('复制全部数据失败,请手动复制');
                    });
    
                    // 初始化 Bootstrap 的 Tooltips(用于按钮上提示信息的显示)
                    var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'));
                    var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) {
                        return new bootstrap.Tooltip(tooltipTriggerEl);
                    });
                });
            </script>
        </div>

        <?php if (!empty($data)):?>
        <h3 class="mb-3">直播数据列表</h3>
<div class="table-responsive">
    <table class="table table-bordered table-striped">
        <thead>
            <tr>
                <th>直播ID</th>
                <th>直播名称</th>
                <th>直播热度</th>
                <th>人均时长(min)</th>
                <th>直播时长(h)</th>
                <th>收入(元)</th>
                <th>单场总计(人)</th>
                <th>登记时间</th>
            </tr>
        </thead>
        <tbody>
            <?php foreach ($data as $row):?>
            <tr>
                <td><?php echo htmlspecialchars($row['live_id']);?></td>
                <td><?php echo htmlspecialchars($row['live_name']);?></td>
                <td><?php echo htmlspecialchars($row['hot']);?></td>
                <td><?php echo htmlspecialchars($row['aveWatch']);?></td>
                <td><?php echo htmlspecialchars($row['totaltime']);?></td>
                <td><?php echo htmlspecialchars($row['earn']);?></td>
                <td><?php echo htmlspecialchars($row['toren']);?></td>
                <td><?php echo htmlspecialchars($row['time']);?></td>
            </tr>
            <?php endforeach;?>
        </tbody>
    </table>
</div>
        <?php endif;?>
        <p class="text-muted">注:只获取了最新的十条信息。</p>
    </div>
</body>
</html>

然后我们的问题得到了完美的解决:

当然,我们可以使用腾讯云AI代码助手尝试制作这样的系统,相信也会有不错的效果!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 数据查询与处理部分
  • 复制功能部分(JavaScript 函数 copyToClipboard)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档