修复bug
@ -106,6 +106,7 @@ class ResourcesController extends BaseController
|
|||||||
'url' => input('post.url'),
|
'url' => input('post.url'),
|
||||||
'fileurl' => input('post.fileurl'),
|
'fileurl' => input('post.fileurl'),
|
||||||
'code' => input('post.code'),
|
'code' => input('post.code'),
|
||||||
|
'zipcode' => input('post.zipcode'),
|
||||||
'uploader' => input('post.uploader'),
|
'uploader' => input('post.uploader'),
|
||||||
'desc' => input('post.desc'),
|
'desc' => input('post.desc'),
|
||||||
'content' => input('post.content'),
|
'content' => input('post.content'),
|
||||||
@ -155,6 +156,7 @@ class ResourcesController extends BaseController
|
|||||||
'fileurl' => $data['fileurl'],
|
'fileurl' => $data['fileurl'],
|
||||||
'url' => $data['url'],
|
'url' => $data['url'],
|
||||||
'code' => $data['code'],
|
'code' => $data['code'],
|
||||||
|
'zipcode' => $data['zipcode'],
|
||||||
'sort' => $data['sort'],
|
'sort' => $data['sort'],
|
||||||
'number' => $data['number'],
|
'number' => $data['number'],
|
||||||
'content' => $data['content'],
|
'content' => $data['content'],
|
||||||
|
|||||||
@ -112,6 +112,14 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="layui-form-item">
|
||||||
|
<label class="layui-form-label">解压密码</label>
|
||||||
|
<div class="layui-input-block">
|
||||||
|
<input type="text" name="zipcode" required placeholder="请输入解压密码" autocomplete="off"
|
||||||
|
class="layui-input" lay-affix="clear">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="layui-form-item">
|
<div class="layui-form-item">
|
||||||
<label class="layui-form-label">排序</label>
|
<label class="layui-form-label">排序</label>
|
||||||
<div class="layui-input-block">
|
<div class="layui-input-block">
|
||||||
|
|||||||
@ -113,6 +113,14 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="layui-form-item">
|
||||||
|
<label class="layui-form-label">解压密码</label>
|
||||||
|
<div class="layui-input-block">
|
||||||
|
<input type="text" name="zipcode" required placeholder="请输入解压密码" autocomplete="off"
|
||||||
|
class="layui-input" value="{$resource.zipcode|default=''}" lay-affix="clear">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="layui-form-item">
|
<div class="layui-form-item">
|
||||||
<label class="layui-form-label">排序</label>
|
<label class="layui-form-label">排序</label>
|
||||||
<div class="layui-input-block">
|
<div class="layui-input-block">
|
||||||
|
|||||||
@ -1 +0,0 @@
|
|||||||
|
|
||||||
@ -17,9 +17,9 @@
|
|||||||
<h1 class="game-title"><?php echo $game['title']; ?></h1>
|
<h1 class="game-title"><?php echo $game['title']; ?></h1>
|
||||||
<div class="game-meta">
|
<div class="game-meta">
|
||||||
<span class="game-category"><?php echo $cateName; ?></span>
|
<span class="game-category"><?php echo $cateName; ?></span>
|
||||||
<span class="game-views"><i class="fa-solid fa-eye"></i> <?php echo $game['views']; ?> 次浏览</span>
|
<span class="game-views"><i class="fa-solid fa-eye"></i> <?php echo $game['views']; ?> </span>
|
||||||
<span class="game-downloads"><i class="fa-solid fa-download"></i> <span
|
<span class="game-downloads"><i class="fa-solid fa-download"></i> <span
|
||||||
id="gameDownloads"><?php echo $game['downloads']; ?></span> 次下载</span>
|
id="gameDownloads"><?php echo $game['downloads']; ?></span> </span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="game-content">
|
<div class="game-content">
|
||||||
@ -43,6 +43,13 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="game-navigation">
|
||||||
|
<div class="prev-game" id="prevGame">
|
||||||
|
</div>
|
||||||
|
<div class="next-game" id="nextGame">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<!-- 相关游戏 -->
|
<!-- 相关游戏 -->
|
||||||
<?php if (!empty($relatedGames)): ?>
|
<?php if (!empty($relatedGames)): ?>
|
||||||
<div class="related-games">
|
<div class="related-games">
|
||||||
@ -56,7 +63,7 @@
|
|||||||
alt="<?php echo $related['title']; ?>">
|
alt="<?php echo $related['title']; ?>">
|
||||||
</div>
|
</div>
|
||||||
<div class="game-info">
|
<div class="game-info">
|
||||||
<h4 class="game-title"><?php echo $related['title']; ?></h4>
|
<h4 class="game-title-1"><?php echo $related['title']; ?></h4>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
@ -83,6 +90,44 @@
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 获取游戏详情
|
||||||
|
fetch('/index/game/detail?id=' + gameId, {
|
||||||
|
headers: {
|
||||||
|
'X-Requested-With': 'XMLHttpRequest'
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.then(response => response.json())
|
||||||
|
.then(result => {
|
||||||
|
if (result.code === 1) {
|
||||||
|
// 渲染上一篇
|
||||||
|
const prevGame = document.getElementById('prevGame');
|
||||||
|
if (result.data.prevGame) {
|
||||||
|
prevGame.innerHTML = `
|
||||||
|
<a href="/index/game/detail?id=${result.data.prevGame.id}">
|
||||||
|
<i class="fa fa-arrow-left"></i> 上一篇:${result.data.prevGame.title}
|
||||||
|
</a>
|
||||||
|
`;
|
||||||
|
} else {
|
||||||
|
prevGame.innerHTML = '<span class="disabled"><i class="fa fa-arrow-left"></i> 没有上一篇了</span>';
|
||||||
|
}
|
||||||
|
|
||||||
|
// 渲染下一篇
|
||||||
|
const nextGame = document.getElementById('nextGame');
|
||||||
|
if (result.data.nextGame) {
|
||||||
|
nextGame.innerHTML = `
|
||||||
|
<a href="/index/game/detail?id=${result.data.nextGame.id}">
|
||||||
|
下一篇:${result.data.nextGame.title} <i class="fa fa-arrow-right"></i>
|
||||||
|
</a>
|
||||||
|
`;
|
||||||
|
} else {
|
||||||
|
nextGame.innerHTML = '<span class="disabled">没有下一篇了 <i class="fa fa-arrow-right"></i></span>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(error => {
|
||||||
|
console.error('获取游戏详情失败:', error);
|
||||||
|
});
|
||||||
|
|
||||||
// 更新访问次数
|
// 更新访问次数
|
||||||
updateGameViews(gameId);
|
updateGameViews(gameId);
|
||||||
|
|
||||||
@ -105,7 +150,7 @@
|
|||||||
|
|
||||||
// 直接使用返回的URL
|
// 直接使用返回的URL
|
||||||
if (data.data && data.data.url) {
|
if (data.data && data.data.url) {
|
||||||
window.location.href = data.data.url;
|
window.open(data.data.url, '_blank');
|
||||||
} else {
|
} else {
|
||||||
alert('下载地址不存在');
|
alert('下载地址不存在');
|
||||||
}
|
}
|
||||||
@ -124,7 +169,7 @@
|
|||||||
const codeBtn = document.getElementById('codeBtn');
|
const codeBtn = document.getElementById('codeBtn');
|
||||||
if (codeBtn) {
|
if (codeBtn) {
|
||||||
codeBtn.addEventListener('click', function() {
|
codeBtn.addEventListener('click', function() {
|
||||||
const code = '{$game.code}';
|
const code = '<?php echo $game['code']; ?>';
|
||||||
if (code) {
|
if (code) {
|
||||||
// 创建一个临时输入框
|
// 创建一个临时输入框
|
||||||
const tempInput = document.createElement('input');
|
const tempInput = document.createElement('input');
|
||||||
@ -185,7 +230,7 @@
|
|||||||
if (result.code === 1) {
|
if (result.code === 1) {
|
||||||
const viewsElement = document.querySelector('.game-views');
|
const viewsElement = document.querySelector('.game-views');
|
||||||
if (viewsElement) {
|
if (viewsElement) {
|
||||||
viewsElement.innerHTML = `<i class="fa-solid fa-eye"></i> ${result.data.views} 次浏览`;
|
viewsElement.innerHTML = `<i class="fa-solid fa-eye"></i> ${result.data.views}`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@ -217,11 +262,27 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.game-title {
|
.game-title {
|
||||||
font-size: 28px;
|
font-size: 30px;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
color: #333;
|
color: #333;
|
||||||
margin-bottom: 15px;
|
margin-bottom: 15px;
|
||||||
line-height: 1.4;
|
line-height: 1.4;
|
||||||
|
display: -webkit-box;
|
||||||
|
-webkit-line-clamp: 2;
|
||||||
|
-webkit-box-orient: vertical;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.game-title-1 {
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: 700;
|
||||||
|
color: #333;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
line-height: 1.4;
|
||||||
|
display: -webkit-box;
|
||||||
|
-webkit-line-clamp: 2;
|
||||||
|
-webkit-box-orient: vertical;
|
||||||
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
.game-meta {
|
.game-meta {
|
||||||
@ -273,6 +334,29 @@
|
|||||||
border-bottom: 1px solid #eee;
|
border-bottom: 1px solid #eee;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.game-navigation {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
margin: 30px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.prev-game,
|
||||||
|
.next-game {
|
||||||
|
max-width: 45%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.prev-game a,
|
||||||
|
.next-game a {
|
||||||
|
color: #333 !important;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.prev-game a:hover,
|
||||||
|
.next-game a:hover {
|
||||||
|
color: #f57005 !important;
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
.btn {
|
.btn {
|
||||||
/* background: #f57005; */
|
/* background: #f57005; */
|
||||||
color: #fff;
|
color: #fff;
|
||||||
@ -305,6 +389,14 @@
|
|||||||
margin: 40px 0;
|
margin: 40px 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.related-games h3{
|
||||||
|
font-size: 20px;
|
||||||
|
font-weight: 600;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
padding-bottom: 10px;
|
||||||
|
border-bottom: 1px solid #eee;
|
||||||
|
}
|
||||||
|
|
||||||
.related-title {
|
.related-title {
|
||||||
font-size: 20px;
|
font-size: 20px;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
@ -345,16 +437,6 @@
|
|||||||
padding: 10px;
|
padding: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.game-title {
|
|
||||||
font-size: 16px;
|
|
||||||
font-weight: 600;
|
|
||||||
margin-bottom: 5px;
|
|
||||||
color: #333;
|
|
||||||
overflow: hidden;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
|
|
||||||
.go-to-top {
|
.go-to-top {
|
||||||
position: fixed;
|
position: fixed;
|
||||||
right: 30px;
|
right: 30px;
|
||||||
|
|||||||
@ -17,9 +17,8 @@
|
|||||||
<div class="program-meta">
|
<div class="program-meta">
|
||||||
<span class="program-author"><i class="fa fa-user"></i> <span id="programAuthor"></span></span>
|
<span class="program-author"><i class="fa fa-user"></i> <span id="programAuthor"></span></span>
|
||||||
<span class="program-date"><i class="fa fa-calendar"></i> <span id="programDate"></span></span>
|
<span class="program-date"><i class="fa fa-calendar"></i> <span id="programDate"></span></span>
|
||||||
<span class="program-views"><i class="fa-solid fa-eye"></i> <span id="programViews"></span> 浏览</span>
|
<span class="program-views"><i class="fa-solid fa-eye"></i> <span id="programViews"></span></span>
|
||||||
<span class="program-downloads"><i class="fa-solid fa-download"></i> <span id="programDownloads"></span>
|
<span class="program-downloads"><i class="fa-solid fa-download"></i> <span id="programDownloads"></span></span>
|
||||||
下载</span>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
|
After Width: | Height: | Size: 583 KiB |
|
After Width: | Height: | Size: 68 KiB |
|
After Width: | Height: | Size: 64 KiB |
|
After Width: | Height: | Size: 74 KiB |
|
After Width: | Height: | Size: 58 KiB |
|
After Width: | Height: | Size: 63 KiB |
|
After Width: | Height: | Size: 56 KiB |
|
After Width: | Height: | Size: 64 KiB |
|
After Width: | Height: | Size: 32 KiB |
|
After Width: | Height: | Size: 49 KiB |
|
After Width: | Height: | Size: 40 KiB |
|
After Width: | Height: | Size: 54 KiB |
|
After Width: | Height: | Size: 59 KiB |
|
After Width: | Height: | Size: 65 KiB |
|
After Width: | Height: | Size: 31 KiB |
|
After Width: | Height: | Size: 54 KiB |
|
After Width: | Height: | Size: 55 KiB |
|
After Width: | Height: | Size: 78 KiB |
|
After Width: | Height: | Size: 56 KiB |
|
After Width: | Height: | Size: 54 KiB |
|
After Width: | Height: | Size: 36 KiB |
|
After Width: | Height: | Size: 392 KiB |
|
After Width: | Height: | Size: 60 KiB |
|
After Width: | Height: | Size: 45 KiB |
|
After Width: | Height: | Size: 45 KiB |
|
After Width: | Height: | Size: 34 KiB |
|
After Width: | Height: | Size: 110 KiB |
|
After Width: | Height: | Size: 66 KiB |
|
After Width: | Height: | Size: 139 KiB |
|
After Width: | Height: | Size: 39 KiB |
|
After Width: | Height: | Size: 71 KiB |
|
After Width: | Height: | Size: 382 KiB |
|
After Width: | Height: | Size: 36 KiB |
|
After Width: | Height: | Size: 400 KiB |
|
After Width: | Height: | Size: 88 KiB |
|
After Width: | Height: | Size: 36 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 60 KiB |
|
After Width: | Height: | Size: 38 KiB |
|
After Width: | Height: | Size: 412 KiB |
|
After Width: | Height: | Size: 353 KiB |
|
After Width: | Height: | Size: 347 KiB |
|
After Width: | Height: | Size: 360 KiB |
|
After Width: | Height: | Size: 330 KiB |
|
After Width: | Height: | Size: 47 KiB |
|
After Width: | Height: | Size: 422 KiB |
|
After Width: | Height: | Size: 46 KiB |
|
After Width: | Height: | Size: 603 KiB |
|
After Width: | Height: | Size: 43 KiB |
|
After Width: | Height: | Size: 139 KiB |
|
After Width: | Height: | Size: 73 KiB |
|
After Width: | Height: | Size: 61 KiB |
|
After Width: | Height: | Size: 43 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 42 KiB |
|
After Width: | Height: | Size: 80 KiB |
|
After Width: | Height: | Size: 32 KiB |
|
After Width: | Height: | Size: 53 KiB |
|
After Width: | Height: | Size: 65 KiB |
|
After Width: | Height: | Size: 72 KiB |
|
After Width: | Height: | Size: 32 KiB |
|
After Width: | Height: | Size: 32 KiB |
|
After Width: | Height: | Size: 28 KiB |
|
After Width: | Height: | Size: 60 KiB |
|
After Width: | Height: | Size: 272 KiB |
|
After Width: | Height: | Size: 52 KiB |
|
After Width: | Height: | Size: 51 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 42 KiB |
|
After Width: | Height: | Size: 49 KiB |
|
After Width: | Height: | Size: 386 KiB |
|
After Width: | Height: | Size: 81 KiB |
|
After Width: | Height: | Size: 272 KiB |
|
After Width: | Height: | Size: 84 KiB |
|
After Width: | Height: | Size: 120 KiB |
|
After Width: | Height: | Size: 40 KiB |
|
After Width: | Height: | Size: 35 KiB |
|
After Width: | Height: | Size: 381 KiB |
@ -1,4 +1,4 @@
|
|||||||
<?php /*a:2:{s:52:"E:\Demo\PHP\yunzer\app\admin\view\resources\edit.php";i:1747747200;s:51:"E:\Demo\PHP\yunzer\app\admin\view\public\header.php";i:1746890051;}*/ ?>
|
<?php /*a:2:{s:52:"E:\Demo\PHP\yunzer\app\admin\view\resources\edit.php";i:1747755572;s:51:"E:\Demo\PHP\yunzer\app\admin\view\public\header.php";i:1746890051;}*/ ?>
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
@ -207,6 +207,14 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="layui-form-item">
|
||||||
|
<label class="layui-form-label">解压密码</label>
|
||||||
|
<div class="layui-input-block">
|
||||||
|
<input type="text" name="zipcode" required placeholder="请输入解压密码" autocomplete="off"
|
||||||
|
class="layui-input" value="<?php echo htmlentities((string) (isset($resource['zipcode']) && ($resource['zipcode'] !== '')?$resource['zipcode']:'')); ?>" lay-affix="clear">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="layui-form-item">
|
<div class="layui-form-item">
|
||||||
<label class="layui-form-label">排序</label>
|
<label class="layui-form-label">排序</label>
|
||||||
<div class="layui-input-block">
|
<div class="layui-input-block">
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
<?php /*a:2:{s:51:"E:\Demo\PHP\yunzer\app\admin\view\resources\add.php";i:1747744873;s:51:"E:\Demo\PHP\yunzer\app\admin\view\public\header.php";i:1746890051;}*/ ?>
|
<?php /*a:2:{s:51:"E:\Demo\PHP\yunzer\app\admin\view\resources\add.php";i:1747755547;s:51:"E:\Demo\PHP\yunzer\app\admin\view\public\header.php";i:1746890051;}*/ ?>
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
@ -206,6 +206,14 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="layui-form-item">
|
||||||
|
<label class="layui-form-label">解压密码</label>
|
||||||
|
<div class="layui-input-block">
|
||||||
|
<input type="text" name="zipcode" required placeholder="请输入解压密码" autocomplete="off"
|
||||||
|
class="layui-input" lay-affix="clear">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="layui-form-item">
|
<div class="layui-form-item">
|
||||||
<label class="layui-form-label">排序</label>
|
<label class="layui-form-label">排序</label>
|
||||||
<div class="layui-input-block">
|
<div class="layui-input-block">
|
||||||
@ -349,27 +357,58 @@
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 查找选中的分类信息
|
// 递归查找分类信息的函数
|
||||||
var parentCategory = null;
|
function findCategory(categories, targetId) {
|
||||||
var childCategory = null;
|
for (let category of categories) {
|
||||||
|
// 检查当前分类
|
||||||
window.categoryData.forEach(function(parent) {
|
if (category.id == targetId) {
|
||||||
if (parent.children) {
|
return {
|
||||||
parent.children.forEach(function(child) {
|
parent: null,
|
||||||
if (child.id == selectedId) {
|
current: category,
|
||||||
parentCategory = parent;
|
total: category.total || 0
|
||||||
childCategory = child;
|
};
|
||||||
|
}
|
||||||
|
// 检查子分类
|
||||||
|
if (category.children && category.children.length > 0) {
|
||||||
|
for (let child of category.children) {
|
||||||
|
if (child.id == targetId) {
|
||||||
|
return {
|
||||||
|
parent: category,
|
||||||
|
current: child,
|
||||||
|
total: child.total || 0
|
||||||
|
};
|
||||||
|
}
|
||||||
|
// 递归检查更深层级的子分类
|
||||||
|
if (child.children && child.children.length > 0) {
|
||||||
|
const result = findCategory([child], targetId);
|
||||||
|
if (result) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
}
|
}
|
||||||
});
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
if (parentCategory && childCategory) {
|
// 查找选中的分类信息
|
||||||
|
const categoryInfo = findCategory(window.categoryData, selectedId);
|
||||||
|
|
||||||
|
if (categoryInfo) {
|
||||||
// 生成资源编号
|
// 生成资源编号
|
||||||
var total = childCategory.total || 0;
|
var nextNumber = categoryInfo.total + 1;
|
||||||
var nextNumber = total + 1;
|
|
||||||
var numberStr = nextNumber.toString().padStart(5, '0');
|
var numberStr = nextNumber.toString().padStart(5, '0');
|
||||||
var resourceNumber = parentCategory.number + childCategory.number + numberStr;
|
var resourceNumber = '';
|
||||||
|
|
||||||
|
// 构建编号前缀
|
||||||
|
if (categoryInfo.parent) {
|
||||||
|
resourceNumber = categoryInfo.parent.number + categoryInfo.current.number;
|
||||||
|
} else {
|
||||||
|
resourceNumber = categoryInfo.current.number;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 添加序号
|
||||||
|
resourceNumber += numberStr;
|
||||||
|
|
||||||
// 设置资源编号
|
// 设置资源编号
|
||||||
$('input[name="number"]').val(resourceNumber);
|
$('input[name="number"]').val(resourceNumber);
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
<?php /*a:2:{s:53:"E:\Demo\PHP\yunzer\app\admin\view\resources\lists.php";i:1747747324;s:51:"E:\Demo\PHP\yunzer\app\admin\view\public\header.php";i:1746890051;}*/ ?>
|
<?php /*a:2:{s:53:"E:\Demo\PHP\yunzer\app\admin\view\resources\lists.php";i:1747755163;s:51:"E:\Demo\PHP\yunzer\app\admin\view\public\header.php";i:1746890051;}*/ ?>
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
<?php /*a:5:{s:53:"E:\Demo\PHP\yunzer\app\index\view\articles\detail.php";i:1747649140;s:52:"E:\Demo\PHP\yunzer\app\index\view\component\head.php";i:1747649140;s:61:"E:\Demo\PHP\yunzer\app\index\view\component\header-simple.php";i:1747415782;s:54:"E:\Demo\PHP\yunzer\app\index\view\component\footer.php";i:1747649140;s:52:"E:\Demo\PHP\yunzer\app\index\view\component\foot.php";i:1746808046;}*/ ?>
|
<?php /*a:5:{s:53:"E:\Demo\PHP\yunzer\app\index\view\articles\detail.php";i:1747754938;s:52:"E:\Demo\PHP\yunzer\app\index\view\component\head.php";i:1747649140;s:61:"E:\Demo\PHP\yunzer\app\index\view\component\header-simple.php";i:1747754938;s:54:"E:\Demo\PHP\yunzer\app\index\view\component\footer.php";i:1747649140;s:52:"E:\Demo\PHP\yunzer\app\index\view\component\foot.php";i:1746808046;}*/ ?>
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
|
|
||||||
@ -48,7 +48,7 @@
|
|||||||
<div class="main-menu">
|
<div class="main-menu">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="main-menu__logo">
|
<div class="main-menu__logo">
|
||||||
<a href="index.html"><img src="/static/images/logo.png" width="186" alt="Logo"></a>
|
<a href="index.html"><img src="/static/images/logo1.png" width="186" alt="Logo"></a>
|
||||||
</div>
|
</div>
|
||||||
<div class="main-menu__nav">
|
<div class="main-menu__nav">
|
||||||
<ul class="main-menu__list">
|
<ul class="main-menu__list">
|
||||||
@ -90,7 +90,7 @@
|
|||||||
<div class="sticky-nav" style="display: none;">
|
<div class="sticky-nav" style="display: none;">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="sticky-nav__logo">
|
<div class="sticky-nav__logo">
|
||||||
<a href="index.html"><img src="/static/images/logo.png" width="150" alt="Logo"></a>
|
<a href="index.html"><img src="/static/images/logo1.png" width="150" alt="Logo"></a>
|
||||||
</div>
|
</div>
|
||||||
<div class="sticky-nav__menu">
|
<div class="sticky-nav__menu">
|
||||||
<ul>
|
<ul>
|
||||||
@ -475,12 +475,12 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="article-actions">
|
<div class="article-actions">
|
||||||
<div class="action-item like-btn">
|
<div class="action-item like-btn" id="likeBtn">
|
||||||
<i class="fa fa-thumbs-up"></i>
|
<i class="fa fa-thumbs-up"></i>
|
||||||
<span class="action-text">点赞</span>
|
<span class="action-text">点赞</span>
|
||||||
<span class="action-count" id="articleLikes">0</span>
|
<span class="action-count" id="articleLikes">0</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="action-item share-btn">
|
<div class="action-item share-btn" id="shareBtn">
|
||||||
<i class="fa fa-share-alt"></i>
|
<i class="fa fa-share-alt"></i>
|
||||||
<span class="action-text">分享</span>
|
<span class="action-text">分享</span>
|
||||||
</div>
|
</div>
|
||||||
@ -932,31 +932,31 @@
|
|||||||
function renderArticleDetail(data) {
|
function renderArticleDetail(data) {
|
||||||
// 渲染分类链接
|
// 渲染分类链接
|
||||||
document.getElementById('cateLink').textContent = data.cateName;
|
document.getElementById('cateLink').textContent = data.cateName;
|
||||||
|
|
||||||
// 渲染文章标题
|
// 渲染文章标题
|
||||||
document.getElementById('articleTitle').textContent = data.article.title;
|
document.getElementById('articleTitle').textContent = data.article.title;
|
||||||
|
|
||||||
// 渲染文章元信息
|
// 渲染文章元信息
|
||||||
document.getElementById('articleAuthor').textContent = data.article.author;
|
document.getElementById('articleAuthor').textContent = data.article.author;
|
||||||
document.getElementById('articleDate').textContent = formatDate(data.article.create_time);
|
document.getElementById('articleDate').textContent = formatDate(data.article.create_time);
|
||||||
document.getElementById('articleViews').textContent = data.article.views;
|
document.getElementById('articleViews').textContent = data.article.views;
|
||||||
|
|
||||||
// 渲染文章内容
|
// 渲染文章内容
|
||||||
document.getElementById('articleContent').innerHTML = data.article.content;
|
document.getElementById('articleContent').innerHTML = data.article.content;
|
||||||
|
|
||||||
// 渲染标签
|
// 渲染标签
|
||||||
const tagsContainer = document.getElementById('articleTags');
|
const tagsContainer = document.getElementById('articleTags');
|
||||||
if (data.article.tags && data.article.tags.length > 0) {
|
if (data.article.tags && data.article.tags.length > 0) {
|
||||||
tagsContainer.innerHTML = data.article.tags.map(tag =>
|
tagsContainer.innerHTML = data.article.tags.map(tag =>
|
||||||
`<span class="tag-item">${tag}</span>`
|
`<span class="tag-item">${tag}</span>`
|
||||||
).join('');
|
).join('');
|
||||||
} else {
|
} else {
|
||||||
tagsContainer.innerHTML = '<span class="no-tags">暂无标签</span>';
|
tagsContainer.innerHTML = '<span class="no-tags">暂无标签</span>';
|
||||||
}
|
}
|
||||||
|
|
||||||
// 渲染点赞数
|
// 渲染点赞数
|
||||||
document.getElementById('articleLikes').textContent = data.article.likes || 0;
|
document.getElementById('articleLikes').textContent = data.article.likes || 0;
|
||||||
|
|
||||||
// 渲染上一篇
|
// 渲染上一篇
|
||||||
const prevArticle = document.getElementById('prevArticle');
|
const prevArticle = document.getElementById('prevArticle');
|
||||||
if (data.prevArticle) {
|
if (data.prevArticle) {
|
||||||
@ -968,7 +968,7 @@
|
|||||||
} else {
|
} else {
|
||||||
prevArticle.innerHTML = '<span class="disabled"><i class="fa fa-arrow-left"></i> 没有上一篇了</span>';
|
prevArticle.innerHTML = '<span class="disabled"><i class="fa fa-arrow-left"></i> 没有上一篇了</span>';
|
||||||
}
|
}
|
||||||
|
|
||||||
// 渲染下一篇
|
// 渲染下一篇
|
||||||
const nextArticle = document.getElementById('nextArticle');
|
const nextArticle = document.getElementById('nextArticle');
|
||||||
if (data.nextArticle) {
|
if (data.nextArticle) {
|
||||||
@ -980,7 +980,7 @@
|
|||||||
} else {
|
} else {
|
||||||
nextArticle.innerHTML = '<span class="disabled">没有下一篇了 <i class="fa fa-arrow-right"></i></span>';
|
nextArticle.innerHTML = '<span class="disabled">没有下一篇了 <i class="fa fa-arrow-right"></i></span>';
|
||||||
}
|
}
|
||||||
|
|
||||||
// 渲染相关文章
|
// 渲染相关文章
|
||||||
const relatedArticles = document.getElementById('relatedArticles');
|
const relatedArticles = document.getElementById('relatedArticles');
|
||||||
if (data.relatedArticles && data.relatedArticles.length > 0) {
|
if (data.relatedArticles && data.relatedArticles.length > 0) {
|
||||||
@ -1003,7 +1003,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 页面加载完成后执行
|
// 页面加载完成后执行
|
||||||
document.addEventListener('DOMContentLoaded', function() {
|
document.addEventListener('DOMContentLoaded', function () {
|
||||||
// 获取文章ID
|
// 获取文章ID
|
||||||
const articleId = new URLSearchParams(window.location.search).get('id');
|
const articleId = new URLSearchParams(window.location.search).get('id');
|
||||||
if (!articleId) {
|
if (!articleId) {
|
||||||
@ -1018,12 +1018,12 @@
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
.then(response => {
|
.then(response => {
|
||||||
console.log('Response status:', response.status);
|
// console.log('Response status:', response.status);
|
||||||
console.log('Response headers:', response.headers);
|
// console.log('Response headers:', response.headers);
|
||||||
return response.json();
|
return response.json();
|
||||||
})
|
})
|
||||||
.then(result => {
|
.then(result => {
|
||||||
console.log('API response:', result);
|
// console.log('API response:', result);
|
||||||
if (result.code === 1) {
|
if (result.code === 1) {
|
||||||
renderArticleDetail(result.data);
|
renderArticleDetail(result.data);
|
||||||
// 更新访问次数
|
// 更新访问次数
|
||||||
@ -1043,44 +1043,69 @@
|
|||||||
});
|
});
|
||||||
|
|
||||||
// 点赞功能
|
// 点赞功能
|
||||||
const likeBtn = document.querySelector('.like-btn');
|
const likeBtn = document.getElementById('likeBtn');
|
||||||
if (likeBtn) {
|
if (likeBtn) {
|
||||||
likeBtn.addEventListener('click', function() {
|
// 检查是否已经点赞
|
||||||
|
if (likeBtn.classList.contains('liked')) {
|
||||||
|
likeBtn.style.pointerEvents = 'none'; // 禁用点击
|
||||||
|
likeBtn.style.cursor = 'default'; // 改变鼠标样式
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
likeBtn.addEventListener('click', function () {
|
||||||
|
// 立即禁用按钮,防止重复点击
|
||||||
|
likeBtn.style.pointerEvents = 'none';
|
||||||
|
likeBtn.style.cursor = 'default';
|
||||||
|
|
||||||
fetch('/index/articles/like?id=' + articleId, {
|
fetch('/index/articles/like?id=' + articleId, {
|
||||||
method: 'POST'
|
method: 'POST',
|
||||||
})
|
headers: {
|
||||||
.then(response => response.json())
|
'X-Requested-With': 'XMLHttpRequest'
|
||||||
.then(data => {
|
|
||||||
if (data.code === 1) {
|
|
||||||
const countElement = this.querySelector('.action-count');
|
|
||||||
let count = parseInt(countElement.textContent);
|
|
||||||
countElement.textContent = count + 1;
|
|
||||||
this.classList.add('liked');
|
|
||||||
this.style.color = '#f57005';
|
|
||||||
} else {
|
|
||||||
alert('点赞失败:' + data.msg);
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.catch(error => {
|
.then(response => response.json())
|
||||||
console.error('点赞请求失败:', error);
|
.then(data => {
|
||||||
});
|
if (data.code === 1) {
|
||||||
|
const countElement = document.getElementById('articlesLikes');
|
||||||
|
if (countElement) {
|
||||||
|
let count = parseInt(countElement.textContent) || 0;
|
||||||
|
countElement.textContent = count + 1;
|
||||||
|
}
|
||||||
|
// 添加点赞状态
|
||||||
|
likeBtn.classList.add('liked');
|
||||||
|
likeBtn.querySelector('i').style.color = '#f57005';
|
||||||
|
layer.msg('点赞成功', {icon: 1});
|
||||||
|
} else {
|
||||||
|
// 如果请求失败,恢复按钮状态
|
||||||
|
likeBtn.style.pointerEvents = 'auto';
|
||||||
|
likeBtn.style.cursor = 'pointer';
|
||||||
|
layer.msg('点赞失败:' + data.msg, {icon: 2});
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(error => {
|
||||||
|
// 如果请求失败,恢复按钮状态
|
||||||
|
likeBtn.style.pointerEvents = 'auto';
|
||||||
|
likeBtn.style.cursor = 'pointer';
|
||||||
|
console.error('点赞请求失败:', error);
|
||||||
|
layer.msg('点赞失败,请稍后重试', {icon: 2});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// 返回顶部功能
|
// 返回顶部功能
|
||||||
const goToTop = document.getElementById('goToTop');
|
const goToTop = document.getElementById('goToTop');
|
||||||
|
|
||||||
// 监听滚动事件
|
// 监听滚动事件
|
||||||
window.addEventListener('scroll', function() {
|
window.addEventListener('scroll', function () {
|
||||||
if (window.pageYOffset > 300) {
|
if (window.pageYOffset > 300) {
|
||||||
goToTop.classList.add('show');
|
goToTop.classList.add('show');
|
||||||
} else {
|
} else {
|
||||||
goToTop.classList.remove('show');
|
goToTop.classList.remove('show');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// 点击返回顶部
|
// 点击返回顶部
|
||||||
goToTop.addEventListener('click', function() {
|
goToTop.addEventListener('click', function () {
|
||||||
window.scrollTo({
|
window.scrollTo({
|
||||||
top: 0,
|
top: 0,
|
||||||
behavior: 'smooth'
|
behavior: 'smooth'
|
||||||
@ -1099,18 +1124,42 @@
|
|||||||
id: articleId
|
id: articleId
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
.then(response => response.json())
|
.then(response => response.json())
|
||||||
.then(result => {
|
.then(result => {
|
||||||
if (result.code === 1) {
|
if (result.code === 1) {
|
||||||
// 更新成功,更新页面上的访问次数显示
|
// 更新成功,更新页面上的访问次数显示
|
||||||
const viewsElement = document.getElementById('articleViews');
|
const viewsElement = document.getElementById('articleViews');
|
||||||
if (viewsElement) {
|
if (viewsElement) {
|
||||||
viewsElement.textContent = result.data.views;
|
viewsElement.textContent = result.data.views;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
})
|
||||||
})
|
.catch(error => {
|
||||||
.catch(error => {
|
console.error('更新访问次数失败:', error);
|
||||||
console.error('更新访问次数失败:', error);
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// 分享功能
|
||||||
|
const shareBtn = document.getElementById('shareBtn');
|
||||||
|
if (shareBtn) {
|
||||||
|
shareBtn.addEventListener('click', function () {
|
||||||
|
// 获取当前页面URL
|
||||||
|
const currentUrl = window.location.href;
|
||||||
|
|
||||||
|
// 创建临时输入框
|
||||||
|
const tempInput = document.createElement('input');
|
||||||
|
tempInput.value = currentUrl;
|
||||||
|
document.body.appendChild(tempInput);
|
||||||
|
|
||||||
|
// 选择并复制文本
|
||||||
|
tempInput.select();
|
||||||
|
document.execCommand('copy');
|
||||||
|
|
||||||
|
// 移除临时输入框
|
||||||
|
document.body.removeChild(tempInput);
|
||||||
|
|
||||||
|
// 提示用户复制成功
|
||||||
|
alert('链接已复制到剪贴板');
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
<?php /*a:5:{s:52:"E:\Demo\PHP\yunzer\app\index\view\program\detail.php";i:1747417109;s:52:"E:\Demo\PHP\yunzer\app\index\view\component\head.php";i:1747649140;s:61:"E:\Demo\PHP\yunzer\app\index\view\component\header-simple.php";i:1747415782;s:54:"E:\Demo\PHP\yunzer\app\index\view\component\footer.php";i:1747649140;s:52:"E:\Demo\PHP\yunzer\app\index\view\component\foot.php";i:1746808046;}*/ ?>
|
<?php /*a:5:{s:52:"E:\Demo\PHP\yunzer\app\index\view\program\detail.php";i:1747755857;s:52:"E:\Demo\PHP\yunzer\app\index\view\component\head.php";i:1747649140;s:61:"E:\Demo\PHP\yunzer\app\index\view\component\header-simple.php";i:1747754938;s:54:"E:\Demo\PHP\yunzer\app\index\view\component\footer.php";i:1747649140;s:52:"E:\Demo\PHP\yunzer\app\index\view\component\foot.php";i:1746808046;}*/ ?>
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
|
|
||||||
@ -48,7 +48,7 @@
|
|||||||
<div class="main-menu">
|
<div class="main-menu">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="main-menu__logo">
|
<div class="main-menu__logo">
|
||||||
<a href="index.html"><img src="/static/images/logo.png" width="186" alt="Logo"></a>
|
<a href="index.html"><img src="/static/images/logo1.png" width="186" alt="Logo"></a>
|
||||||
</div>
|
</div>
|
||||||
<div class="main-menu__nav">
|
<div class="main-menu__nav">
|
||||||
<ul class="main-menu__list">
|
<ul class="main-menu__list">
|
||||||
@ -90,7 +90,7 @@
|
|||||||
<div class="sticky-nav" style="display: none;">
|
<div class="sticky-nav" style="display: none;">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="sticky-nav__logo">
|
<div class="sticky-nav__logo">
|
||||||
<a href="index.html"><img src="/static/images/logo.png" width="150" alt="Logo"></a>
|
<a href="index.html"><img src="/static/images/logo1.png" width="150" alt="Logo"></a>
|
||||||
</div>
|
</div>
|
||||||
<div class="sticky-nav__menu">
|
<div class="sticky-nav__menu">
|
||||||
<ul>
|
<ul>
|
||||||
@ -462,8 +462,8 @@
|
|||||||
<div class="program-meta">
|
<div class="program-meta">
|
||||||
<span class="program-author"><i class="fa fa-user"></i> <span id="programAuthor"></span></span>
|
<span class="program-author"><i class="fa fa-user"></i> <span id="programAuthor"></span></span>
|
||||||
<span class="program-date"><i class="fa fa-calendar"></i> <span id="programDate"></span></span>
|
<span class="program-date"><i class="fa fa-calendar"></i> <span id="programDate"></span></span>
|
||||||
<span class="program-views"><i class="fa-solid fa-eye"></i> <span id="programViews"></span> 浏览</span>
|
<span class="program-views"><i class="fa-solid fa-eye"></i> <span id="programViews"></span></span>
|
||||||
<span class="program-downloads"><i class="fa-solid fa-download"></i> <span id="programDownloads"></span> 下载</span>
|
<span class="program-downloads"><i class="fa-solid fa-download"></i> <span id="programDownloads"></span></span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -489,12 +489,16 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="program-content">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="program-actions">
|
<div class="program-actions">
|
||||||
<div class="action-item download-btn" id="downloadBtn">
|
<div class="action-item download-btn" id="downloadBtn">
|
||||||
<i class="fa fa-download"></i>
|
<i class="fa fa-download"></i>
|
||||||
<span class="action-text">立即下载</span>
|
<span class="action-text">立即下载</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="action-item share-btn">
|
<div class="action-item share-btn" id="shareBtn">
|
||||||
<i class="fa fa-share-alt"></i>
|
<i class="fa fa-share-alt"></i>
|
||||||
<span class="action-text">分享</span>
|
<span class="action-text">分享</span>
|
||||||
</div>
|
</div>
|
||||||
@ -703,6 +707,11 @@
|
|||||||
margin: 30px 0;
|
margin: 30px 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.program-navigation a {
|
||||||
|
color: #333;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
.prev-program,
|
.prev-program,
|
||||||
.next-program {
|
.next-program {
|
||||||
max-width: 45%;
|
max-width: 45%;
|
||||||
@ -858,25 +867,25 @@
|
|||||||
function renderProgramDetail(data) {
|
function renderProgramDetail(data) {
|
||||||
// 渲染分类链接
|
// 渲染分类链接
|
||||||
document.getElementById('cateLink').textContent = data.cateName;
|
document.getElementById('cateLink').textContent = data.cateName;
|
||||||
|
|
||||||
// 渲染程序标题
|
// 渲染程序标题
|
||||||
document.getElementById('programTitle').textContent = data.program.title;
|
document.getElementById('programTitle').textContent = data.program.title;
|
||||||
|
|
||||||
// 渲染程序元信息
|
// 渲染程序元信息
|
||||||
document.getElementById('programAuthor').textContent = data.program.author;
|
document.getElementById('programAuthor').textContent = data.program.author;
|
||||||
document.getElementById('programDate').textContent = formatDate(data.program.create_time);
|
document.getElementById('programDate').textContent = formatDate(data.program.create_time);
|
||||||
document.getElementById('programViews').textContent = data.program.views;
|
document.getElementById('programViews').textContent = data.program.views;
|
||||||
document.getElementById('programDownloads').textContent = data.program.downloads;
|
document.getElementById('programDownloads').textContent = data.program.downloads;
|
||||||
|
|
||||||
// 渲染程序内容
|
// 渲染程序内容
|
||||||
document.getElementById('programContent').innerHTML = data.program.content;
|
document.getElementById('programContent').innerHTML = data.program.content;
|
||||||
|
|
||||||
// 渲染程序信息
|
// 渲染程序信息
|
||||||
document.getElementById('programSize').textContent = data.program.size || '未知';
|
document.getElementById('programSize').textContent = data.program.size || '未知';
|
||||||
document.getElementById('programEnvironment').textContent = data.program.environment || '通用';
|
document.getElementById('programEnvironment').textContent = data.program.environment || '通用';
|
||||||
document.getElementById('programUpdateTime').textContent = formatDate(data.program.update_time);
|
document.getElementById('programUpdateTime').textContent = formatDate(data.program.update_time);
|
||||||
document.getElementById('programVersion').textContent = data.program.version || '1.0.0';
|
document.getElementById('programVersion').textContent = data.program.version || '1.0.0';
|
||||||
|
|
||||||
// 渲染上一个程序
|
// 渲染上一个程序
|
||||||
const prevProgram = document.getElementById('prevProgram');
|
const prevProgram = document.getElementById('prevProgram');
|
||||||
if (data.prevProgram) {
|
if (data.prevProgram) {
|
||||||
@ -888,7 +897,7 @@
|
|||||||
} else {
|
} else {
|
||||||
prevProgram.innerHTML = '<span class="disabled"><i class="fa fa-arrow-left"></i> 没有上一个了</span>';
|
prevProgram.innerHTML = '<span class="disabled"><i class="fa fa-arrow-left"></i> 没有上一个了</span>';
|
||||||
}
|
}
|
||||||
|
|
||||||
// 渲染下一个程序
|
// 渲染下一个程序
|
||||||
const nextProgram = document.getElementById('nextProgram');
|
const nextProgram = document.getElementById('nextProgram');
|
||||||
if (data.nextProgram) {
|
if (data.nextProgram) {
|
||||||
@ -900,7 +909,7 @@
|
|||||||
} else {
|
} else {
|
||||||
nextProgram.innerHTML = '<span class="disabled">没有下一个了 <i class="fa fa-arrow-right"></i></span>';
|
nextProgram.innerHTML = '<span class="disabled">没有下一个了 <i class="fa fa-arrow-right"></i></span>';
|
||||||
}
|
}
|
||||||
|
|
||||||
// 渲染相关程序
|
// 渲染相关程序
|
||||||
const relatedPrograms = document.getElementById('relatedPrograms');
|
const relatedPrograms = document.getElementById('relatedPrograms');
|
||||||
if (data.relatedPrograms && data.relatedPrograms.length > 0) {
|
if (data.relatedPrograms && data.relatedPrograms.length > 0) {
|
||||||
@ -923,7 +932,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 页面加载完成后执行
|
// 页面加载完成后执行
|
||||||
document.addEventListener('DOMContentLoaded', function() {
|
document.addEventListener('DOMContentLoaded', function () {
|
||||||
// 获取程序ID
|
// 获取程序ID
|
||||||
const programId = new URLSearchParams(window.location.search).get('id');
|
const programId = new URLSearchParams(window.location.search).get('id');
|
||||||
if (!programId) {
|
if (!programId) {
|
||||||
@ -937,72 +946,63 @@
|
|||||||
'X-Requested-With': 'XMLHttpRequest'
|
'X-Requested-With': 'XMLHttpRequest'
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.then(response => response.json())
|
.then(response => response.json())
|
||||||
.then(result => {
|
.then(result => {
|
||||||
if (result.code === 1) {
|
if (result.code === 1) {
|
||||||
renderProgramDetail(result.data);
|
renderProgramDetail(result.data);
|
||||||
// 更新访问次数
|
// 更新访问次数
|
||||||
updateProgramViews(programId);
|
updateProgramViews(programId);
|
||||||
} else {
|
// 初始化分享功能
|
||||||
alert(result.msg || '获取程序详情失败');
|
initShareFunction();
|
||||||
}
|
} else {
|
||||||
})
|
alert(result.msg || '获取程序详情失败');
|
||||||
.catch(error => {
|
}
|
||||||
console.error('获取程序详情失败:', error);
|
})
|
||||||
alert('获取程序详情失败,请检查网络连接或刷新页面重试');
|
.catch(error => {
|
||||||
});
|
console.error('获取程序详情失败:', error);
|
||||||
|
alert('获取程序详情失败,请检查网络连接或刷新页面重试');
|
||||||
|
});
|
||||||
|
|
||||||
// 下载功能
|
// 下载功能
|
||||||
const downloadBtn = document.getElementById('downloadBtn');
|
const downloadBtn = document.getElementById('downloadBtn');
|
||||||
if (downloadBtn) {
|
if (downloadBtn) {
|
||||||
downloadBtn.addEventListener('click', function() {
|
downloadBtn.addEventListener('click', function () {
|
||||||
fetch('/index/program/download?id=' + programId, {
|
fetch('/index/program/download?id=' + programId, {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
headers: {
|
headers: {
|
||||||
'X-Requested-With': 'XMLHttpRequest'
|
'X-Requested-With': 'XMLHttpRequest'
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.then(response => response.json())
|
.then(response => response.json())
|
||||||
.then(data => {
|
.then(data => {
|
||||||
if (data.code === 1) {
|
if (data.code === 1 && data.data && data.data.fileurl) {
|
||||||
const downloadsElement = document.getElementById('programDownloads');
|
const downloadUrl = window.location.origin + data.data.fileurl;
|
||||||
let downloads = parseInt(downloadsElement.textContent);
|
|
||||||
downloadsElement.textContent = downloads + 1;
|
|
||||||
|
|
||||||
// 获取当前域名
|
|
||||||
const domain = window.location.origin;
|
|
||||||
// 拼接完整的下载地址
|
|
||||||
if (data.data && data.data.fileurl) {
|
|
||||||
const downloadUrl = domain + data.data.fileurl;
|
|
||||||
window.location.href = downloadUrl;
|
window.location.href = downloadUrl;
|
||||||
} else {
|
} else {
|
||||||
alert('下载地址不存在');
|
alert('下载地址不存在');
|
||||||
}
|
}
|
||||||
} else {
|
})
|
||||||
alert('下载失败:' + data.msg);
|
.catch(error => {
|
||||||
}
|
console.error('下载请求失败:', error);
|
||||||
})
|
alert('下载请求失败,请稍后重试');
|
||||||
.catch(error => {
|
});
|
||||||
console.error('下载请求失败:', error);
|
|
||||||
alert('下载请求失败,请稍后重试');
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// 返回顶部功能
|
// 返回顶部功能
|
||||||
const goToTop = document.getElementById('goToTop');
|
const goToTop = document.getElementById('goToTop');
|
||||||
|
|
||||||
// 监听滚动事件
|
// 监听滚动事件
|
||||||
window.addEventListener('scroll', function() {
|
window.addEventListener('scroll', function () {
|
||||||
if (window.pageYOffset > 300) {
|
if (window.pageYOffset > 300) {
|
||||||
goToTop.classList.add('show');
|
goToTop.classList.add('show');
|
||||||
} else {
|
} else {
|
||||||
goToTop.classList.remove('show');
|
goToTop.classList.remove('show');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// 点击返回顶部
|
// 点击返回顶部
|
||||||
goToTop.addEventListener('click', function() {
|
goToTop.addEventListener('click', function () {
|
||||||
window.scrollTo({
|
window.scrollTo({
|
||||||
top: 0,
|
top: 0,
|
||||||
behavior: 'smooth'
|
behavior: 'smooth'
|
||||||
@ -1022,19 +1022,45 @@
|
|||||||
id: programId
|
id: programId
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
.then(response => response.json())
|
.then(response => response.json())
|
||||||
.then(result => {
|
.then(result => {
|
||||||
if (result.code === 1) {
|
if (result.code === 1) {
|
||||||
// 更新成功,更新页面上的访问次数显示
|
// 更新成功,更新页面上的访问次数显示
|
||||||
const viewsElement = document.getElementById('programViews');
|
const viewsElement = document.getElementById('programViews');
|
||||||
if (viewsElement) {
|
if (viewsElement) {
|
||||||
viewsElement.textContent = result.data.views;
|
viewsElement.textContent = result.data.views;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
})
|
||||||
})
|
.catch(error => {
|
||||||
.catch(error => {
|
console.error('更新访问次数失败:', error);
|
||||||
console.error('更新访问次数失败:', error);
|
});
|
||||||
});
|
}
|
||||||
|
|
||||||
|
// 初始化分享功能
|
||||||
|
function initShareFunction() {
|
||||||
|
const shareBtn = document.getElementById('shareBtn');
|
||||||
|
if (shareBtn) {
|
||||||
|
shareBtn.addEventListener('click', function () {
|
||||||
|
// 获取当前页面URL
|
||||||
|
const currentUrl = window.location.href;
|
||||||
|
|
||||||
|
// 创建临时输入框
|
||||||
|
const tempInput = document.createElement('input');
|
||||||
|
tempInput.value = currentUrl;
|
||||||
|
document.body.appendChild(tempInput);
|
||||||
|
|
||||||
|
// 选择并复制文本
|
||||||
|
tempInput.select();
|
||||||
|
document.execCommand('copy');
|
||||||
|
|
||||||
|
// 移除临时输入框
|
||||||
|
document.body.removeChild(tempInput);
|
||||||
|
|
||||||
|
// 提示用户复制成功
|
||||||
|
layer.msg('链接已复制到剪贴板');
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
<?php /*a:5:{s:49:"E:\Demo\PHP\yunzer\app\index\view\game\detail.php";i:1747754891;s:52:"E:\Demo\PHP\yunzer\app\index\view\component\head.php";i:1747649140;s:61:"E:\Demo\PHP\yunzer\app\index\view\component\header-simple.php";i:1747415782;s:54:"E:\Demo\PHP\yunzer\app\index\view\component\footer.php";i:1747649140;s:52:"E:\Demo\PHP\yunzer\app\index\view\component\foot.php";i:1746808046;}*/ ?>
|
<?php /*a:5:{s:49:"E:\Demo\PHP\yunzer\app\index\view\game\detail.php";i:1747757578;s:52:"E:\Demo\PHP\yunzer\app\index\view\component\head.php";i:1747649140;s:61:"E:\Demo\PHP\yunzer\app\index\view\component\header-simple.php";i:1747754938;s:54:"E:\Demo\PHP\yunzer\app\index\view\component\footer.php";i:1747649140;s:52:"E:\Demo\PHP\yunzer\app\index\view\component\foot.php";i:1746808046;}*/ ?>
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
|
|
||||||
@ -48,7 +48,7 @@
|
|||||||
<div class="main-menu">
|
<div class="main-menu">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="main-menu__logo">
|
<div class="main-menu__logo">
|
||||||
<a href="index.html"><img src="/static/images/logo.png" width="186" alt="Logo"></a>
|
<a href="index.html"><img src="/static/images/logo1.png" width="186" alt="Logo"></a>
|
||||||
</div>
|
</div>
|
||||||
<div class="main-menu__nav">
|
<div class="main-menu__nav">
|
||||||
<ul class="main-menu__list">
|
<ul class="main-menu__list">
|
||||||
@ -90,7 +90,7 @@
|
|||||||
<div class="sticky-nav" style="display: none;">
|
<div class="sticky-nav" style="display: none;">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="sticky-nav__logo">
|
<div class="sticky-nav__logo">
|
||||||
<a href="index.html"><img src="/static/images/logo.png" width="150" alt="Logo"></a>
|
<a href="index.html"><img src="/static/images/logo1.png" width="150" alt="Logo"></a>
|
||||||
</div>
|
</div>
|
||||||
<div class="sticky-nav__menu">
|
<div class="sticky-nav__menu">
|
||||||
<ul>
|
<ul>
|
||||||
@ -462,9 +462,9 @@
|
|||||||
<h1 class="game-title"><?php echo $game['title']; ?></h1>
|
<h1 class="game-title"><?php echo $game['title']; ?></h1>
|
||||||
<div class="game-meta">
|
<div class="game-meta">
|
||||||
<span class="game-category"><?php echo $cateName; ?></span>
|
<span class="game-category"><?php echo $cateName; ?></span>
|
||||||
<span class="game-views"><i class="fa-solid fa-eye"></i> <?php echo $game['views']; ?> 次浏览</span>
|
<span class="game-views"><i class="fa-solid fa-eye"></i> <?php echo $game['views']; ?> </span>
|
||||||
<span class="game-downloads"><i class="fa-solid fa-download"></i> <span
|
<span class="game-downloads"><i class="fa-solid fa-download"></i> <span
|
||||||
id="gameDownloads"><?php echo $game['downloads']; ?></span> 次下载</span>
|
id="gameDownloads"><?php echo $game['downloads']; ?></span> </span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="game-content">
|
<div class="game-content">
|
||||||
@ -488,6 +488,13 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="game-navigation">
|
||||||
|
<div class="prev-game" id="prevGame">
|
||||||
|
</div>
|
||||||
|
<div class="next-game" id="nextGame">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<!-- 相关游戏 -->
|
<!-- 相关游戏 -->
|
||||||
<?php if (!empty($relatedGames)): ?>
|
<?php if (!empty($relatedGames)): ?>
|
||||||
<div class="related-games">
|
<div class="related-games">
|
||||||
@ -501,7 +508,7 @@
|
|||||||
alt="<?php echo $related['title']; ?>">
|
alt="<?php echo $related['title']; ?>">
|
||||||
</div>
|
</div>
|
||||||
<div class="game-info">
|
<div class="game-info">
|
||||||
<h4 class="game-title"><?php echo $related['title']; ?></h4>
|
<h4 class="game-title-1"><?php echo $related['title']; ?></h4>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
@ -583,6 +590,44 @@
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 获取游戏详情
|
||||||
|
fetch('/index/game/detail?id=' + gameId, {
|
||||||
|
headers: {
|
||||||
|
'X-Requested-With': 'XMLHttpRequest'
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.then(response => response.json())
|
||||||
|
.then(result => {
|
||||||
|
if (result.code === 1) {
|
||||||
|
// 渲染上一篇
|
||||||
|
const prevGame = document.getElementById('prevGame');
|
||||||
|
if (result.data.prevGame) {
|
||||||
|
prevGame.innerHTML = `
|
||||||
|
<a href="/index/game/detail?id=${result.data.prevGame.id}">
|
||||||
|
<i class="fa fa-arrow-left"></i> 上一篇:${result.data.prevGame.title}
|
||||||
|
</a>
|
||||||
|
`;
|
||||||
|
} else {
|
||||||
|
prevGame.innerHTML = '<span class="disabled"><i class="fa fa-arrow-left"></i> 没有上一篇了</span>';
|
||||||
|
}
|
||||||
|
|
||||||
|
// 渲染下一篇
|
||||||
|
const nextGame = document.getElementById('nextGame');
|
||||||
|
if (result.data.nextGame) {
|
||||||
|
nextGame.innerHTML = `
|
||||||
|
<a href="/index/game/detail?id=${result.data.nextGame.id}">
|
||||||
|
下一篇:${result.data.nextGame.title} <i class="fa fa-arrow-right"></i>
|
||||||
|
</a>
|
||||||
|
`;
|
||||||
|
} else {
|
||||||
|
nextGame.innerHTML = '<span class="disabled">没有下一篇了 <i class="fa fa-arrow-right"></i></span>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(error => {
|
||||||
|
console.error('获取游戏详情失败:', error);
|
||||||
|
});
|
||||||
|
|
||||||
// 更新访问次数
|
// 更新访问次数
|
||||||
updateGameViews(gameId);
|
updateGameViews(gameId);
|
||||||
|
|
||||||
@ -605,7 +650,7 @@
|
|||||||
|
|
||||||
// 直接使用返回的URL
|
// 直接使用返回的URL
|
||||||
if (data.data && data.data.url) {
|
if (data.data && data.data.url) {
|
||||||
window.location.href = data.data.url;
|
window.open(data.data.url, '_blank');
|
||||||
} else {
|
} else {
|
||||||
alert('下载地址不存在');
|
alert('下载地址不存在');
|
||||||
}
|
}
|
||||||
@ -624,7 +669,7 @@
|
|||||||
const codeBtn = document.getElementById('codeBtn');
|
const codeBtn = document.getElementById('codeBtn');
|
||||||
if (codeBtn) {
|
if (codeBtn) {
|
||||||
codeBtn.addEventListener('click', function() {
|
codeBtn.addEventListener('click', function() {
|
||||||
const code = '<?php echo htmlentities((string) $game['code']); ?>';
|
const code = '<?php echo $game['code']; ?>';
|
||||||
if (code) {
|
if (code) {
|
||||||
// 创建一个临时输入框
|
// 创建一个临时输入框
|
||||||
const tempInput = document.createElement('input');
|
const tempInput = document.createElement('input');
|
||||||
@ -685,7 +730,7 @@
|
|||||||
if (result.code === 1) {
|
if (result.code === 1) {
|
||||||
const viewsElement = document.querySelector('.game-views');
|
const viewsElement = document.querySelector('.game-views');
|
||||||
if (viewsElement) {
|
if (viewsElement) {
|
||||||
viewsElement.innerHTML = `<i class="fa-solid fa-eye"></i> ${result.data.views} 次浏览`;
|
viewsElement.innerHTML = `<i class="fa-solid fa-eye"></i> ${result.data.views}`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@ -717,11 +762,27 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.game-title {
|
.game-title {
|
||||||
font-size: 28px;
|
font-size: 30px;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
color: #333;
|
color: #333;
|
||||||
margin-bottom: 15px;
|
margin-bottom: 15px;
|
||||||
line-height: 1.4;
|
line-height: 1.4;
|
||||||
|
display: -webkit-box;
|
||||||
|
-webkit-line-clamp: 2;
|
||||||
|
-webkit-box-orient: vertical;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.game-title-1 {
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: 700;
|
||||||
|
color: #333;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
line-height: 1.4;
|
||||||
|
display: -webkit-box;
|
||||||
|
-webkit-line-clamp: 2;
|
||||||
|
-webkit-box-orient: vertical;
|
||||||
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
.game-meta {
|
.game-meta {
|
||||||
@ -773,6 +834,29 @@
|
|||||||
border-bottom: 1px solid #eee;
|
border-bottom: 1px solid #eee;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.game-navigation {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
margin: 30px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.prev-game,
|
||||||
|
.next-game {
|
||||||
|
max-width: 45%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.prev-game a,
|
||||||
|
.next-game a {
|
||||||
|
color: #333 !important;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.prev-game a:hover,
|
||||||
|
.next-game a:hover {
|
||||||
|
color: #f57005 !important;
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
.btn {
|
.btn {
|
||||||
/* background: #f57005; */
|
/* background: #f57005; */
|
||||||
color: #fff;
|
color: #fff;
|
||||||
@ -805,6 +889,14 @@
|
|||||||
margin: 40px 0;
|
margin: 40px 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.related-games h3{
|
||||||
|
font-size: 20px;
|
||||||
|
font-weight: 600;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
padding-bottom: 10px;
|
||||||
|
border-bottom: 1px solid #eee;
|
||||||
|
}
|
||||||
|
|
||||||
.related-title {
|
.related-title {
|
||||||
font-size: 20px;
|
font-size: 20px;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
@ -845,16 +937,6 @@
|
|||||||
padding: 10px;
|
padding: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.game-title {
|
|
||||||
font-size: 16px;
|
|
||||||
font-weight: 600;
|
|
||||||
margin-bottom: 5px;
|
|
||||||
color: #333;
|
|
||||||
overflow: hidden;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
|
|
||||||
.go-to-top {
|
.go-to-top {
|
||||||
position: fixed;
|
position: fixed;
|
||||||
right: 30px;
|
right: 30px;
|
||||||
|
|||||||