最近公司直播使用的是微赞平台做私域直播,我们为了方便直播数据的累计,保证能够提升单个直播间的数据,所以采用的是数据全累计,这样会导致一个问题就是无法获取单场数据,经平台确认,暂时无法统计这方面的数据,但是我们每天都要汇报这方面的数据,所以我做了这个系统。
当时使用的是chatgpt和文心一言,发现他们在理解我的表述后,无法正确完成我要的结果,虽然我的要求并不高,只需要类似下述内容即可:
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下,名称和观看时长、观看次数有了变化,我们就进行输出最新的数据,对于观看次数,直接使用的热度差。
所以我给出的提示词是:
每天都会统计直播间数据,因为每个直播间都有自己的直播主题,虽然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
// 数据库连接信息,根据实际情况填写
$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>
这里我设计了一个输入数据的表单,一个显示数据的数据表,一个复制数据的结果框。
由于数据有时效性,我只展示了最近的十条,但是计算的时候会统计所有的数据,这也是符合我们的要求的。
但是该代码无法对我们所有的数据进行计算统计,而且点击复制按钮无法进行复制。
系统给出的解决办法是:
live_id
的所有记录进行分析处理。live_id
,准确判断最新记录以及计算hot
数据增值情况,并且更新存储结构中的最新数据信息,以便后续展示和复制操作使用。copyToClipboard
)在copyToClipboard
函数中,添加了条件判断,只有当hot
数据增值大于 0(表示有变化)时,才将对应直播间的数据按照要求格式拼接进要复制的字符串result
中,这样就实现了只复制有变化的数据内容。
<?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 删除。