tp/public/themes/default/index.php
2026-03-20 09:12:57 +08:00

1024 lines
37 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
// 引入 ThinkPHP 应用
require_once __DIR__ . '/../../../vendor/autoload.php';
use think\facade\Db;
use think\App;
use app\model\Tenant\TenantDomain;
use app\model\Tenant\Tenant;
use app\model\Cms\Banner;
use app\model\Cms\Articles;
use app\model\Cms\ArticlesCategory;
// 初始化应用
$app = new App(__DIR__ . '/../../../');
$app->initialize();
// 获取当前域名
$baseUrl = $_SERVER['HTTP_HOST'];
// 查询域名对应的租户ID
$tenantDomain = TenantDomain::where('full_domain', $baseUrl)
->where('status', 1)
->whereNull('delete_time')
->find();
$tid = $tenantDomain ? (int) $tenantDomain['tid'] : 0;
// 获取 Banner 数据
$banners = [];
if ($tid > 0) {
$banners = Banner::where('tid', $tid)
->whereNull('delete_time')
->order('sort', 'asc')
->order('id', 'desc')
->select()
->toArray();
// 处理图片路径
foreach ($banners as &$banner) {
if (!empty($banner['image'])) {
if (!preg_match('/^https?:\/\//', $banner['image'])) {
$scheme = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https' : 'http';
$banner['image'] = $scheme . '://' . $baseUrl .
(strpos($banner['image'], '/') === 0 ? '' : '/') . $banner['image'];
}
}
}
}
// 获取新闻数据
$articles = [];
if ($tid > 0) {
$articles = Articles::where('tid', $tid)
->where('delete_time', null)
->where('status', 2)
->order('publish_date', 'desc')
->limit(8)
->select()
->toArray();
// 处理图片如果文章image为空则取分类的image
foreach ($articles as &$article) {
if (empty($article['image']) && !empty($article['cate'])) {
$category = ArticlesCategory::where('id', $article['cate'])
->where('delete_time', null)
->find();
if ($category && !empty($category['image'])) {
$article['image'] = $category['image'];
}
}
// 处理图片路径
if (!empty($article['image']) && !preg_match('/^https?:\/\//', $article['image'])) {
$scheme = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https' : 'http';
$article['image'] = $scheme . '://' . $baseUrl .
(strpos($article['image'], '/') === 0 ? '' : '/') . $article['image'];
}
if (!empty($article['thumb']) && !preg_match('/^https?:\/\//', $article['thumb'])) {
$scheme = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https' : 'http';
$article['thumb'] = $scheme . '://' . $baseUrl .
(strpos($article['thumb'], '/') === 0 ? '' : '/') . $article['thumb'];
}
}
}
// 获取企业联系信息和站点设置
$companyInfo = [];
if ($tid > 0) {
// 获取租户信息
$tenant = Tenant::where('id', $tid)
->where('delete_time', null)
->field('contact_phone, contact_email, address, worktime')
->find();
// 获取站点设置
$siteSetting = \app\model\System\SystemSiteSetting::where('tid', $tid)
->where('delete_time', null)
->find();
$companyInfo = array_merge(
$tenant ? $tenant->toArray() : [],
$siteSetting ? $siteSetting->toArray() : []
);
} else {
$companyInfo = [
'sitename' => '',
'logo' => '',
'logow' => '',
'ico' => '',
'description' => '',
'contact_phone' => '-',
'contact_email' => '-',
'address' => '-',
'worktime' => '-'
];
}
// 处理图片路径
if (!empty($companyInfo['logo']) && !preg_match('/^https?:\/\//', $companyInfo['logo'])) {
$scheme = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https' : 'http';
$companyInfo['logo'] = $scheme . '://' . $baseUrl .
(strpos($companyInfo['logo'], '/') === 0 ? '' : '/') . $companyInfo['logo'];
}
if (!empty($companyInfo['logow']) && !preg_match('/^https?:\/\//', $companyInfo['logow'])) {
$scheme = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https' : 'http';
$companyInfo['logow'] = $scheme . '://' . $baseUrl .
(strpos($companyInfo['logow'], '/') === 0 ? '' : '/') . $companyInfo['logow'];
}
if (!empty($companyInfo['ico']) && !preg_match('/^https?:\/\//', $companyInfo['ico'])) {
$scheme = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https' : 'http';
$companyInfo['ico'] = $scheme . '://' . $baseUrl .
(strpos($companyInfo['ico'], '/') === 0 ? '' : '/') . $companyInfo['ico'];
}
// 辅助函数:去除 HTML 标签
function stripHtml($html)
{
if (empty($html))
return '';
$text = preg_replace('/<[^>]+>/', ' ', $html);
$text = preg_replace('/\s+/', ' ', $text);
return trim($text);
}
?>
<!DOCTYPE html>
<html class="no-js" lang="">
<head>
<meta charset="utf-8" />
<meta http-equiv="x-ua-compatible" content="ie=edge" />
<title><?php echo !empty($companyInfo['sitename']) ? $companyInfo['sitename'] : '实例 - 云泽网模板'; ?></title>
<?php if (!empty($companyInfo['ico'])): ?>
<link rel="icon" href="<?php echo $companyInfo['ico']; ?>" type="image/x-icon" />
<?php endif; ?>
<meta name="description" content="<?php echo !empty($companyInfo['description']) ? $companyInfo['description'] : ''; ?>" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="stylesheet" href="assets/css/bootstrap-5.0.0-beta1.min.css" />
<link rel="stylesheet" href="assets/css/LineIcons.2.0.css" />
<link rel="stylesheet" href="assets/css/tiny-slider.css" />
<link rel="stylesheet" href="assets/css/animate.css" />
<link rel="stylesheet" href="assets/css/lindy-uikit.css" />
<link rel="stylesheet" href="assets/css/all.min.css" />
<!-- Swiper CSS -->
<link rel="stylesheet" href="assets/css/swiper-bundle.min.css" />
</head>
<body>
<!--[if lte IE 9]>
<p class="browserupgrade">
You are using an <strong>outdated</strong> browser. Please
<a href="https://browsehappy.com/">upgrade your browser</a> to improve
your experience and security.
</p>
<![endif]-->
<div class="preloader">
<div class="loader">
<div class="spinner">
<div class="spinner-container">
<div class="spinner-rotator">
<div class="spinner-left">
<div class="spinner-circle"></div>
</div>
<div class="spinner-right">
<div class="spinner-circle"></div>
</div>
</div>
</div>
</div>
</div>
</div>
<section id="home" class="hero-section-wrapper-5">
<header class="header header-6">
<div class="navbar-area">
<div class="container">
<div class="row align-items-center">
<div class="col-lg-12">
<nav class="navbar navbar-expand-lg">
<a class="navbar-brand" href="index.php">
<img src="<?php echo !empty($companyInfo['logo']) ? $companyInfo['logo'] : 'assets/img/logo/logo.svg'; ?>" alt="Logo" />
</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse"
data-bs-target="#navbarSupportedContent6" aria-controls="navbarSupportedContent6"
aria-expanded="false" aria-label="Toggle navigation">
<span class="toggler-icon"></span>
<span class="toggler-icon"></span>
<span class="toggler-icon"></span>
</button>
<div class="collapse navbar-collapse sub-menu-bar" id="navbarSupportedContent6">
<ul id="nav6" class="navbar-nav ms-auto">
<li class="nav-item">
<a class="page-scroll active" href="#home">主页</a>
</li>
<li class="nav-item">
<a class="page-scroll" href="#newsCenter">新闻中心</a>
</li>
<li class="nav-item">
<a class="page-scroll" href="#aboutUs">关于我们</a>
</li>
<li class="nav-item">
<a class="page-scroll" href="#services">特色业务</a>
</li>
<li class="nav-item">
<a class="page-scroll" href="#contactUs">联系我们</a>
</li>
</ul>
</div>
</nav>
</div>
</div>
</div>
</div>
</header>
<!-- Banner 轮播图 -->
<div class="swiper banner-swiper">
<div class="swiper-wrapper" id="banner-container">
<!-- Banner 将通过 JavaScript 动态加载 -->
</div>
<div class="swiper-pagination"></div>
<div class="swiper-button-next"></div>
<div class="swiper-button-prev"></div>
</div>
</section>
<section id="newsCenter" class="feature-section feature-style-5">
<div class="container">
<div class="row justify-content-center">
<div class="col-xxl-5 col-xl-5 col-lg-7 col-md-8">
<div class="section-title text-center mb-60" style="display: flex;align-items: center;justify-content: center;">
<h3 class="mb-15 wow fadeInUp" data-wow-delay=".2s">新闻中心</h3>
<a href="/news/index.php" target="_blank">
<span style="font-size: 14px;margin-left: 50px;">Read More</span>
</a>
</div>
</div>
</div>
<div class="row" id="news-container">
<!-- 卡片将通过 JavaScript 动态加载 -->
</div>
</div>
</section>
<section id="aboutUs" class="about-section about-style-4">
<div class="container">
<div class="row align-items-center">
<div class="col-xl-5 col-lg-6">
<div class="about-content-wrapper">
<div class="section-title mb-30">
<h3 class="mb-25 wow fadeInUp" data-wow-delay=".2s">关于我们</h3>
<p class="wow fadeInUp" data-wow-delay=".3s">
<?php echo !empty($companyInfo['companyintroduction']) ? $companyInfo['companyintroduction'] : ''; ?>
</p>
</div>
<!-- <a href="#0" class="button button-lg radius-10 wow fadeInUp" data-wow-delay=".5s">Learn More</a> -->
</div>
</div>
<div class="col-xl-7 col-lg-6">
<div class="about-image text-lg-right wow fadeInUp" data-wow-delay=".5s">
<img src="assets/img/about/about-4/about-img.svg" alt="">
</div>
</div>
</div>
</div>
</section>
<section id="services" class="pricing-section pricing-style-4 bg-light">
<div class="container">
<div class="row align-items-center">
<div class="col-xl-5 col-lg-6">
<div class="section-title mb-60">
<h3 class="mb-15 wow fadeInUp" data-wow-delay=".2s">特色业务</h3>
<p class="wow fadeInUp" data-wow-delay=".4s">
我们始终以专业、高效、创新为核心,深耕行业多年,形成了独具优势的特色业务体系。凭借成熟的服务流程、过硬的技术实力与丰富的实战经验,为客户提供一站式、定制化解决方案。</p>
</div>
</div>
<div class="col-xl-7 col-lg-6">
<div class="pricing-active-wrapper wow fadeInUp" data-wow-delay=".4s">
<div class="pricing-active">
<div class="single-pricing-wrapper">
<div class="single-pricing">
<h6>Basic Design</h6>
<h4>Web Design</h4>
<h3>$ 29.00</h3>
<ul>
<li>Carefully crafted components</li>
<li>Amazing page examples</li>
<li>Super friendly support team</li>
<li>Awesome Support</li>
</ul>
<a href="#0" class="button radius-30">Get Started</a>
</div>
</div>
<div class="single-pricing-wrapper">
<div class="single-pricing">
<h6>Standard Design</h6>
<h4>Web Development</h4>
<h3>$ 89.00</h3>
<ul>
<li>Carefully crafted components</li>
<li>Amazing page examples</li>
<li>Super friendly support team</li>
<li>Awesome Support</li>
</ul>
<a href="#0" class="button radius-30">Get Started</a>
</div>
</div>
<div class="single-pricing-wrapper">
<div class="single-pricing">
<h6>Pro Design</h6>
<h4>Design & Develop</h4>
<h3>$ 199.00</h3>
<ul>
<li>Carefully crafted components</li>
<li>Amazing page examples</li>
<li>Super friendly support team</li>
<li>Awesome Support</li>
</ul>
<a href="#0" class="button radius-30">Get Started</a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<section id="contactUs" class="contact-section contact-style-3">
<div class="container">
<div class="row justify-content-center">
<div class="col-xxl-5 col-xl-5 col-lg-7 col-md-10">
<div class="section-title text-center mb-50">
<h3 class="mb-15">联系我们</h3>
<p>如果您有任何需求,欢迎联系我们!</p>
</div>
</div>
</div>
<div class="row">
<div class="col-lg-8">
<div class="contact-form-wrapper">
<form id="requirementForm" action="" method="">
<div class="row">
<div class="col-md-6">
<div class="single-input">
<input type="text" id="applicant" name="applicant" class="form-input" placeholder="姓名">
<i class="lni lni-user"></i>
</div>
</div>
<div class="col-md-6">
<div class="single-input">
<input type="email" id="email" name="email" class="form-input" placeholder="邮箱">
<i class="lni lni-envelope"></i>
</div>
</div>
<div class="col-md-6">
<div class="single-input">
<input type="text" id="phone" name="phone" class="form-input" placeholder="手机号">
<i class="lni lni-phone"></i>
</div>
</div>
<div class="col-md-6">
<div class="single-input">
<input type="text" id="title" name="title" class="form-input" placeholder="您的标题" required>
<i class="lni lni-text-format"></i>
</div>
</div>
<div class="col-md-12">
<div class="single-input">
<textarea name="desc" id="desc" class="form-input" placeholder="您的需求" rows="6" required></textarea>
<i class="lni lni-comments-alt"></i>
</div>
</div>
<div class="col-md-12">
<div class="form-button">
<button type="submit" class="button" id="submitBtn"> <i class="lni lni-telegram-original"></i>
提交</button>
</div>
</div>
</div>
</form>
</div>
<!-- 需求提交脚本 -->
<script>
document.getElementById('requirementForm').addEventListener('submit', function(e) {
e.preventDefault();
const submitBtn = document.getElementById('submitBtn');
submitBtn.disabled = true;
submitBtn.innerHTML = '<i class="lni lni-spinner"></i> 提交中...';
const data = {
title: document.getElementById('title').value,
desc: document.getElementById('desc').value,
applicant: document.getElementById('applicant').value,
phone: document.getElementById('phone').value
};
fetch('/index/requirement', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(data)
})
.then(res => res.json())
.then(result => {
if (result.code === 200) {
alert('提交成功!我们会尽快与您联系。');
document.getElementById('requirementForm').reset();
} else {
alert(result.msg || '提交失败,请稍后重试');
}
})
.catch(err => {
console.error('提交失败:', err);
alert('提交失败,请稍后重试');
})
.finally(() => {
submitBtn.disabled = false;
submitBtn.innerHTML = '<i class="lni lni-telegram-original"></i> 提交';
});
});
</script>
</div>
<div class="col-lg-4">
<div class="left-wrapper">
<div class="row">
<?php if (!empty($companyInfo['contact_phone'])): ?>
<div class="col-lg-12 col-md-6">
<div class="single-item">
<div class="icon">
<i class="lni lni-phone"></i>
</div>
<div class="text">
<p>+86 <?php echo htmlspecialchars($companyInfo['contact_phone']); ?></p>
</div>
</div>
</div>
<?php endif; ?>
<?php if (!empty($companyInfo['contact_email'])): ?>
<div class="col-lg-12 col-md-6">
<div class="single-item">
<div class="icon">
<i class="lni lni-envelope"></i>
</div>
<div class="text">
<p><?php echo htmlspecialchars($companyInfo['contact_email']); ?></p>
</div>
</div>
</div>
<?php endif; ?>
<?php if (!empty($companyInfo['address'])): ?>
<div class="col-lg-12 col-md-6">
<div class="single-item">
<div class="icon">
<i class="lni lni-map-marker"></i>
</div>
<div class="text">
<p><?php echo htmlspecialchars($companyInfo['address']); ?></p>
</div>
</div>
</div>
<?php endif; ?>
<?php if (!empty($companyInfo['worktime'])): ?>
<div class="col-lg-12 col-md-6">
<div class="single-item">
<div class="icon">
<i class="lni lni-timer"></i>
</div>
<div class="text">
<p><?php echo htmlspecialchars($companyInfo['worktime']); ?></p>
</div>
</div>
</div>
<?php endif; ?>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- 友情链接 -->
<section class="clients-logo-section pt-100 pb-100">
<div class="container">
<div class="row">
<div class="col-lg-12">
<div class="section-title text-center mb-50">
<h3 class="wow fadeInUp" data-wow-delay=".2s">友情链接</h3>
</div>
</div>
</div>
<div class="row" id="friendlink-container">
<!-- 友情链接将通过 JavaScript 动态加载 -->
</div>
</div>
</section>
<footer class="footer footer-style-4">
<div class="container">
<div class="widget-wrapper">
<div class="row">
<div class="col-xl-3 col-lg-4 col-md-6">
<div class="footer-widget wow fadeInUp" data-wow-delay=".2s">
<div class="logo">
<a href="#0"> <img src="<?php echo !empty($companyInfo['logow']) ? $companyInfo['logow'] : 'assets/img/logo/logo.svg'; ?>" alt=""> </a>
</div>
<p class="desc">
<?php echo !empty($companyInfo['description']) ? $companyInfo['description'] : ''; ?>
</p>
<ul class="socials">
<li> <a href="#0"> <i class="fa-brands fa-qq"></i> </a> </li>
<li> <a href="#0"> <i class="fa-brands fa-weixin"></i> </a> </li>
<li> <a href="#0"> <i class="fa-brands fa-weibo"></i> </a> </li>
</ul>
</div>
</div>
<div class="col-xl-2 offset-xl-1 col-lg-2 col-md-6 col-sm-6">
<div class="footer-widget wow fadeInUp" data-wow-delay=".3s">
<h6>快捷链接</h6>
<ul class="links">
<li> <a href="#home">主页</a> </li>
<li> <a href="#newsCenter">新闻中心</a> </li>
<li> <a href="#aboutUs">关于我们</a> </li>
<li> <a href="#services">特色业务</a> </li>
<li> <a href="#contactUs">联系我们</a> </li>
</ul>
</div>
</div>
<div class="col-xl-3 col-lg-3 col-md-6 col-sm-6">
<div class="footer-widget wow fadeInUp" data-wow-delay=".4s">
<h6>服务</h6>
<ul class="links">
<li> <a href="#0">Web Design</a> </li>
<li> <a href="#0">Web Development</a> </li>
<li> <a href="#0">Seo Optimization</a> </li>
<li> <a href="#0">Blog Writing</a> </li>
</ul>
</div>
</div>
<div class="col-xl-3 col-lg-3 col-md-6">
<div class="footer-widget wow fadeInUp" data-wow-delay=".5s">
<h6>软件下载</h6>
<ul class="download-app">
<li>
<a href="#0">
<span class="icon"><i class="lni lni-apple"></i></span>
<span class="text">Download on the <b>App Store</b> </span>
</a>
</li>
<li>
<a href="#0">
<span class="icon"><i class="lni lni-play-store"></i></span>
<span class="text">GET IT ON <b>Play Store</b> </span>
</a>
</li>
</ul>
</div>
</div>
</div>
</div>
<div class="copyright-wrapper wow fadeInUp" data-wow-delay=".2s">
<p>Design and Developed by <a href="https://www.yunzer.cn" rel="nofollow" target="_blank">云泽网</a></p>
</div>
</div>
</footer>
<a href="#" class="scroll-top"> <i class="lni lni-chevron-up"></i> </a>
<script src="assets/js/bootstrap-5.0.0-beta1.min.js"></script>
<script src="assets/js/tiny-slider.js"></script>
<script src="assets/js/wow.min.js"></script>
<script src="assets/js/main.js"></script>
<script src="assets/js/all.min.js"></script>
<!-- Swiper JS -->
<script src="assets/js/swiper-bundle.min.js"></script>
<!-- 加载新闻数据 -->
<script>
// API 接口地址配置
const API_BASE_URL = 'https://api.yunzer.cn';
// 主题 URL 前缀:优先从当前脚本路径推断;若脚本被路由到 /news 等,则回退到 /themes/default
const THEME_BASE_PATH = <?php
$scriptName = str_replace('\\', '/', $_SERVER['SCRIPT_NAME'] ?? '');
if ($scriptName && strpos($scriptName, '/themes/') !== false) {
$basePath = rtrim(dirname($scriptName), '/');
} else {
$basePath = '/themes/default';
}
echo json_encode($basePath);
?>;
// 加载 Banner 轮播图
function loadBanners() {
const bannerContainer = document.getElementById('banner-container');
if (!bannerContainer) return;
fetch(API_BASE_URL + '/getBanners?baseUrl=' + window.location.hostname)
.then(res => res.json())
.then(result => {
if (result.code !== 200 || !result.list || result.list.length === 0) {
// 没有 Banner 时显示默认内容
bannerContainer.innerHTML = '<div class="swiper-slide"><div class="hero-section hero-style-5 img-bg" style="background-image: url(\'assets/img/hero/hero-5/hero-bg.svg\')"><div class="container"><div class="row"><div class="col-lg-6"><div class="hero-content-wrapper"><h2 class="mb-30">欢迎来到我们的网站</h2><p class="mb-30">精彩从这里开始</p></div></div><div class="col-lg-6 align-self-end"><div class="hero-image"><img src="assets/img/hero/hero-5/hero-img.svg" alt=""></div></div></div></div></div></div>';
initSwiper();
return;
}
let html = '';
result.list.forEach((item) => {
const title = item.title || '';
const desc = item.desc || '';
const imageUrl = item.image || '';
const url = item.url || '#';
html += '<div class="swiper-slide">' +
'<div class="hero-section hero-style-5 img-bg" style="background-image: url(\'assets/img/hero/hero-5/hero-bg.svg\')">' +
'<div class="container">' +
'<div class="row">' +
'<div class="col-lg-6">' +
'<div class="hero-content-wrapper">' +
'<h2 class="mb-30 wow fadeInUp" data-wow-delay=".2s">' + title + '</h2>' +
'<p class="mb-30 wow fadeInUp" data-wow-delay=".4s">' + desc + '</p>' +
(url !== '#' ? '<a href="' + url + '" class="button button-lg radius-50 wow fadeInUp" data-wow-delay=".6s">了解更多 <i class="lni lni-chevron-right"></i></a>' : '') +
'</div>' +
'</div>' +
'<div class="col-lg-6 align-self-end">' +
'<div class="hero-image wow fadeInUp" data-wow-delay=".5s">' +
'<img src="' + imageUrl + '" alt="' + title + '">' +
'</div>' +
'</div>' +
'</div>' +
'</div>' +
'</div>' +
'</div>';
});
bannerContainer.innerHTML = html;
initSwiper();
})
.catch(err => {
console.error('加载 Banner 失败:', err);
bannerContainer.innerHTML = '<div class="swiper-slide"><div class="hero-section hero-style-5 img-bg" style="background-image: url(\'assets/img/hero/hero-5/hero-bg.svg\')"><div class="container"><div class="row"><div class="col-lg-6"><div class="hero-content-wrapper"><h2 class="mb-30">欢迎来到我们的网站</h2><p class="mb-30">精彩从这里开始</p></div></div><div class="col-lg-6 align-self-end"><div class="hero-image"><img src="assets/img/hero/hero-5/hero-img.svg" alt=""></div></div></div></div></div></div>';
initSwiper();
});
}
// 初始化 Swiper
function initSwiper() {
new Swiper('.banner-swiper', {
loop: true,
autoplay: {
delay: 5000,
disableOnInteraction: false,
},
pagination: {
el: '.swiper-pagination',
clickable: true,
},
navigation: {
nextEl: '.swiper-button-next',
prevEl: '.swiper-button-prev',
}
});
}
// 去除 HTML 标签,提取纯文本
function stripHtml(html) {
if (!html) return '';
// 先替换所有 HTML 标签为空格
var text = html.replace(/<[^>]+>/g, ' ');
// 替换多个空格为单个空格
text = text.replace(/\s+/g, ' ');
// 去除首尾空格
return text.trim();
}
// 获取完整图片地址
function getFullImageUrl(imagePath) {
if (!imagePath) return '';
// 如果已经是完整 URL直接返回
if (imagePath.startsWith('http://') || imagePath.startsWith('https://')) {
return imagePath;
}
// 拼接完整 URL
return API_BASE_URL + (imagePath.startsWith('/') ? imagePath : '/' + imagePath);
}
// 加载首页数据
function loadHomeData() {
const container = document.getElementById('friendlink-container');
if (!container) return;
fetch(API_BASE_URL + '/homeData?baseUrl=' + window.location.hostname)
.then(res => res.json())
.then(result => {
if (result.code !== 200 || !result.data || !result.data.links || result.data.links.length === 0) {
container.innerHTML = '<div class="col-12 text-center"><p>暂无友情链接</p></div>';
return;
}
// 更新站点信息
if (result.data.normal) {
const n = result.data.normal;
if (n.sitename) document.title = n.sitename;
if (n.ico) {
const favicon = document.querySelector('link[rel="icon"]');
if (favicon) {
favicon.href = API_BASE_URL + (n.ico.startsWith('/') ? n.ico : '/' + n.ico);
} else {
const newFavicon = document.createElement('link');
newFavicon.rel = 'icon';
newFavicon.href = API_BASE_URL + (n.ico.startsWith('/') ? n.ico : '/' + n.ico);
newFavicon.type = 'image/x-icon';
document.head.appendChild(newFavicon);
}
}
}
let html = '';
result.data.links.forEach((item) => {
const logoUrl = item.link_logo ? (item.link_logo.startsWith('http') ? item.link_logo : API_BASE_URL + item.link_logo) : '';
const linkName = item.link_name || '';
const linkUrl = item.link_url || '#';
const description = item.description || '';
html += '<div class="col-lg-3 col-md-4 col-sm-6 mb-4">' +
'<a href="' + linkUrl + '" target="_blank" class="friendlink-item" title="' + description + '">' +
'<div class="friendlink-card">' +
(logoUrl ? '<img src="' + logoUrl + '" alt="' + linkName + '" class="friendlink-logo">' : '<div class="friendlink-name">' + linkName + '</div>') +
'</div>' +
'</a>' +
'</div>';
});
container.innerHTML = html;
})
.catch(err => {
console.error('加载友情链接失败:', err);
container.innerHTML = '<div class="col-12 text-center"><p>加载失败</p></div>';
});
}
// 页面加载完成后执行
document.addEventListener('DOMContentLoaded', function() {
// 加载 Banner 轮播图
loadBanners();
// 加载首页数据
loadHomeData();
// 加载新闻数据
const container = document.getElementById('news-container');
if (!container) return;
// 请求数据(后端从 Referer 自动识别租户域名)
fetch(API_BASE_URL + '/getCenterNews')
.then(res => res.json())
.then(result => {
if (result.code !== 200 || !result.list || result.list.length === 0) {
container.innerHTML = '<p style="text-align:center;width:100%">暂无新闻</p>';
return;
}
const newsList = result.list;
const showCount = 8; // 初始显示数量
const hasMore = newsList.length > showCount;
let html = '';
// 只显示前 showCount 个新闻
const displayNews = hasMore ? newsList.slice(0, showCount) : newsList;
displayNews.forEach((item, i) => {
const title = item.title || '无标题';
let desc = item.summary || item.description || '';
// 去除 HTML 标签后截取
if (!desc && item.content) {
desc = stripHtml(item.content);
}
if (!desc) desc = '暂无描述';
// 获取缩略图地址(优先使用 thumb其次使用 image
const thumbUrl = getFullImageUrl(item.thumb || item.image);
const thumbHtml = thumbUrl ?
'<img src="' + thumbUrl + '" alt="' + title + '" class="news-thumb">' :
'<div class="news-thumb-placeholder">暂无图片</div>';
html += '<div class="col-lg-3 col-md-6 mb-4">' +
'<a href="/news/article_detail.php?id=' + item.id + '" target="_blank" class="news-item-link">' +
'<div class="news-card wow fadeInUp" data-wow-delay=".2s">' +
'<div class="news-thumb-wrap">' +
thumbHtml +
'</div>' +
'<div class="news-body">' +
'<h5 class="news-title">' + title + '</h5>' +
'<p class="news-desc">' + desc + '</p>' +
'</div>' +
'</div>' +
'</a>' +
'</div>';
});
// 如果有更多新闻,添加查看更多按钮
if (hasMore) {
html += '<div class="col-12 text-center mt-4">' +
'<a href="/news" class="btn btn-primary">查看更多</a>' +
'</div>';
}
container.innerHTML = html;
})
.catch(err => {
console.error('加载失败:', err);
container.innerHTML = '<p style="text-align:center;width:100%">加载失败</p>';
});
});
</script>
<!-- Banner 轮播图样式 -->
<style>
.desc {
color: #fff;
}
.logo img {
width: 300px;
}
.banner-swiper {
width: 100%;
}
.banner-swiper .swiper-slide {
height: auto;
}
.banner-swiper .hero-section {
margin-bottom: 0;
}
.banner-swiper .swiper-pagination {
bottom: 20px;
}
.banner-swiper .swiper-pagination-bullet {
background: #333;
opacity: 0.3;
width: 10px;
height: 10px;
}
.banner-swiper .swiper-pagination-bullet-active {
opacity: 1;
background: #5864FF;
}
.banner-swiper .swiper-button-next,
.banner-swiper .swiper-button-prev {
color: #5864FF;
width: 40px;
height: 40px;
background: rgba(255, 255, 255, 0.8);
border-radius: 50%;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
}
.banner-swiper .swiper-button-next:after,
.banner-swiper .swiper-button-prev:after {
font-size: 18px;
font-weight: bold;
}
.banner-swiper .swiper-button-next:hover,
.banner-swiper .swiper-button-prev:hover {
background: #fff;
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.15);
}
/* 友情链接样式 */
.friendlink-item {
display: block;
text-decoration: none;
}
.friendlink-card {
background: #fff;
border-radius: 8px;
padding: 15px;
height: 150px;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.3s ease;
overflow: hidden;
}
.friendlink-card:hover {
border-color: #5864FF;
box-shadow: 0 4px 12px rgba(88, 100, 255, 0.15);
transform: translateY(-2px);
}
.friendlink-logo {
max-width: 100%;
max-height: 120px;
width: auto;
height: auto;
object-fit: contain;
}
.friendlink-name {
font-size: 16px;
font-weight: 600;
color: #333;
text-align: center;
}
</style>
<!-- 新闻卡片样式 -->
<style>
.feature-section {
background-color: #fafafa;
}
.news-card {
background: #fff;
border-radius: 8px;
overflow: hidden;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
transition: transform 0.3s ease, box-shadow 0.3s ease;
height: 100%;
display: flex;
flex-direction: column;
}
.news-card:hover {
transform: translateY(-4px);
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);
}
.news-thumb-wrap {
width: 100%;
height: 160px;
overflow: hidden;
}
.news-thumb {
width: 100%;
height: 100%;
object-fit: cover;
}
.news-thumb-placeholder {
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
background: #f0f0f0;
color: #999;
font-size: 14px;
}
.news-body {
padding: 16px;
flex: 1;
display: flex;
flex-direction: column;
}
.news-title {
font-size: 16px;
font-weight: 600;
line-height: 1.4;
margin-bottom: 8px;
color: #333;
/* 显示2行超出省略 */
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;
min-height: 44px;
}
.news-desc {
font-size: 14px;
line-height: 1.5;
color: #666;
margin: 0;
/* 显示2行超出省略 */
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;
min-height: 42px;
}
</style>
</body>
</html>