From b3a25ceb8222528706b2e0d9819d18f807f43f08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BF=97=E5=BC=BA?= <357099073@qq.com> Date: Fri, 20 Mar 2026 19:48:32 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=A7=E5=93=81=E6=A8=A1?= =?UTF-8?q?=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Cms/Products/ProductsController.php | 188 ++++++++++ .../Cms/Services/ServicesController.php | 71 +--- app/admin/route/routes/products.php | 8 + app/admin/route/routes/services.php | 8 +- app/index/controller/Index.php | 31 +- app/index/route/app.php | 12 +- app/model/Cms/Products.php | 44 +++ config/app.php | 2 + docs/nginx/dh2fun.md | 126 +++++++ docs/nginx/yunzercomcn.md | 120 +++++++ public/themes/template3/assets/css/main.css | 1 + public/themes/template3/blog-details.php | 16 +- public/themes/template3/blog.php | 340 +++++------------- public/themes/template3/footer.php | 74 ++-- public/themes/template3/header.php | 38 +- public/themes/template3/index.php | 282 ++++++++++----- public/themes/template3/portfolio.php | 24 +- 17 files changed, 916 insertions(+), 469 deletions(-) create mode 100644 app/admin/controller/Cms/Products/ProductsController.php create mode 100644 app/admin/route/routes/products.php create mode 100644 app/model/Cms/Products.php create mode 100644 docs/nginx/dh2fun.md create mode 100644 docs/nginx/yunzercomcn.md diff --git a/app/admin/controller/Cms/Products/ProductsController.php b/app/admin/controller/Cms/Products/ProductsController.php new file mode 100644 index 0000000..b2666bb --- /dev/null +++ b/app/admin/controller/Cms/Products/ProductsController.php @@ -0,0 +1,188 @@ +request->param('page', 1); + $limit = (int)$this->request->param('limit', 10); + $keyword = $this->request->param('keyword', ''); + + $query = Products::where('delete_time', null) + ->where('tid', $this->getTenantId()); + + // 关键词搜索 + if (!empty($keyword)) { + $query->where('title', 'like', '%' . $keyword . '%'); + } + + $total = $query->count(); + $list = $query->order('sort', 'asc') + ->order('id', 'desc') + ->page($page, $limit) + ->select() + ->toArray(); + + return json([ + 'code' => 200, + 'msg' => 'success', + 'data' => [ + 'list' => $list, + 'total' => $total + ] + ]); + } catch (\Exception $e) { + return json([ + 'code' => 500, + 'msg' => '获取失败:' . $e->getMessage(), + 'data' => [] + ]); + } + } + + /** + * 添加特色产品 + * @return Json + */ + public function addProducts(): Json + { + try { + $data = $this->request->param(); + + $product = new Products(); + $product->tid = $this->getTenantId(); + $product->title = $data['title']; + $product->url = $data['url']; + $product->thumb = $data['thumb'] ?? ''; + $product->desc = $data['desc'] ?? ''; + $product->content = $data['content'] ?? ''; + $product->sort = $data['sort'] ?? 0; + $product->create_time = date('Y-m-d H:i:s'); + $product->save(); + + $this->logSuccess('特色产品', '添加产品', ['id' => $product->id]); + + return json([ + 'code' => 200, + 'msg' => '添加成功', + 'data' => $product->toArray() + ]); + } catch (ValidateException $e) { + return json([ + 'code' => 400, + 'msg' => $e->getError() + ]); + } catch (\Exception $e) { + $this->logFail('特色产品', '添加产品', $e->getMessage()); + return json([ + 'code' => 500, + 'msg' => '添加失败:' . $e->getMessage() + ]); + } + } + + /** + * 更新特色产品 + * @param int $id + * @return Json + */ + public function editProducts(int $id): Json + { + try { + $data = $this->request->param(); + + $product = Products::where('id', $id) + ->where('tid', $this->getTenantId()) + ->where('delete_time', null) + ->find(); + + if (!$product) { + return json([ + 'code' => 404, + 'msg' => '产品不存在' + ]); + } + + if (isset($data['title'])) $product->title = $data['title']; + if (isset($data['url'])) $product->url = $data['url']; + if (isset($data['thumb'])) $product->thumb = $data['thumb']; + if (isset($data['desc'])) $product->desc = $data['desc']; + if (isset($data['sort'])) $product->sort = $data['sort']; + $product->update_time = date('Y-m-d H:i:s'); + $product->save(); + + $this->logSuccess('特色产品', '更新产品', ['id' => $id]); + + return json([ + 'code' => 200, + 'msg' => '更新成功', + 'data' => $product->toArray() + ]); + } catch (ValidateException $e) { + return json([ + 'code' => 400, + 'msg' => $e->getError() + ]); + } catch (\Exception $e) { + $this->logFail('特色产品', '更新产品', $e->getMessage()); + return json([ + 'code' => 500, + 'msg' => '更新失败:' . $e->getMessage() + ]); + } + } + + /** + * 删除特色产品 + * @param int $id + * @return Json + */ + public function deleteProducts(int $id): Json + { + try { + $product = Products::where('id', $id) + ->where('tid', $this->getTenantId()) + ->where('delete_time', null) + ->find(); + + if (!$product) { + return json([ + 'code' => 404, + 'msg' => '产品不存在' + ]); + } + + $product->delete(); + + $this->logSuccess('特色产品', '删除产品', ['id' => $id]); + + return json([ + 'code' => 200, + 'msg' => '删除成功' + ]); + } catch (\Exception $e) { + $this->logFail('特色产品', '删除产品', $e->getMessage()); + return json([ + 'code' => 500, + 'msg' => '删除失败:' . $e->getMessage() + ]); + } + } +} diff --git a/app/admin/controller/Cms/Services/ServicesController.php b/app/admin/controller/Cms/Services/ServicesController.php index 0f5cf84..4ec6789 100644 --- a/app/admin/controller/Cms/Services/ServicesController.php +++ b/app/admin/controller/Cms/Services/ServicesController.php @@ -18,13 +18,12 @@ class ServicesController extends BaseController * 获取特色服务列表 * @return Json */ - public function getList(): Json + public function servicesList(): Json { try { $page = (int)$this->request->param('page', 1); $limit = (int)$this->request->param('limit', 10); $keyword = $this->request->param('keyword', ''); - $status = $this->request->param('status', ''); $query = Services::where('delete_time', null) ->where('tid', $this->getTenantId()); @@ -34,11 +33,6 @@ class ServicesController extends BaseController $query->where('name', 'like', '%' . $keyword . '%'); } - // 状态筛选 - if ($status !== '') { - $query->where('status', (int)$status); - } - $total = $query->count(); $list = $query->order('sort', 'asc') ->order('id', 'desc') @@ -67,19 +61,11 @@ class ServicesController extends BaseController * 添加特色服务 * @return Json */ - public function add(): Json + public function addServices(): Json { try { $data = $this->request->param(); - // 验证参数 - $this->validate($data, [ - 'name|服务名称' => 'require|max:100', - 'url|服务地址' => 'require|url|max:255', - 'sort|排序' => 'integer', - 'status|状态' => 'in:0,1' - ]); - $service = new Services(); $service->tid = $this->getTenantId(); $service->title = $data['title']; @@ -87,7 +73,6 @@ class ServicesController extends BaseController $service->thumb = $data['thumb'] ?? ''; $service->desc = $data['desc'] ?? ''; $service->sort = $data['sort'] ?? 0; - $service->status = $data['status'] ?? 1; $service->create_time = date('Y-m-d H:i:s'); $service->save(); @@ -117,7 +102,7 @@ class ServicesController extends BaseController * @param int $id * @return Json */ - public function update(int $id): Json + public function editServices(int $id): Json { try { $data = $this->request->param(); @@ -134,24 +119,11 @@ class ServicesController extends BaseController ]); } - // 验证参数 - if (isset($data['name'])) { - $this->validate($data, [ - 'name|服务名称' => 'require|max:100' - ]); - } - if (isset($data['url'])) { - $this->validate($data, [ - 'url|服务地址' => 'require|url|max:255' - ]); - } - if (isset($data['title'])) $service->title = $data['title']; if (isset($data['url'])) $service->url = $data['url']; if (isset($data['thumb'])) $service->thumb = $data['thumb']; if (isset($data['desc'])) $service->desc = $data['desc']; if (isset($data['sort'])) $service->sort = $data['sort']; - if (isset($data['status'])) $service->status = $data['status']; $service->update_time = date('Y-m-d H:i:s'); $service->save(); @@ -181,7 +153,7 @@ class ServicesController extends BaseController * @param int $id * @return Json */ - public function delete(int $id): Json + public function deleteServices(int $id): Json { try { $service = Services::where('id', $id) @@ -213,39 +185,4 @@ class ServicesController extends BaseController } } - /** - * 批量删除特色服务 - * @return Json - */ - public function batchDelete(): Json - { - try { - $ids = $this->request->param('ids', []); - - if (empty($ids)) { - return json([ - 'code' => 400, - 'msg' => '请选择要删除的服务' - ]); - } - - Services::whereIn('id', $ids) - ->where('tid', $this->getTenantId()) - ->where('delete_time', null) - ->update(['delete_time' => date('Y-m-d H:i:s')]); - - $this->logSuccess('特色服务', '批量删除服务', ['ids' => $ids]); - - return json([ - 'code' => 200, - 'msg' => '批量删除成功' - ]); - } catch (\Exception $e) { - $this->logFail('特色服务', '批量删除服务', $e->getMessage()); - return json([ - 'code' => 500, - 'msg' => '批量删除失败:' . $e->getMessage() - ]); - } - } } diff --git a/app/admin/route/routes/products.php b/app/admin/route/routes/products.php new file mode 100644 index 0000000..ce9419e --- /dev/null +++ b/app/admin/route/routes/products.php @@ -0,0 +1,8 @@ +field('sitename,logo,logow,ico,description,copyright,companyname,icp,companyintroduction') ->find(); - // 3. 获取友情链接列表 + // 获取特色服务列表 + $servicesList = Services::where('delete_time', null) + ->where('tid', $tid) + ->order('sort', 'asc') + ->field('id,title,desc,thumb,url') + ->select() + ->toArray(); + + // 获取企业产品列表 + $productsList = Products::where('delete_time', null) + ->where('tid', $tid) + ->order('sort', 'asc') + ->field('id,title,desc,content,thumb,url') + ->select() + ->toArray(); + + // 获取友情链接列表 $friendlinkList = Friendlink::where('delete_time', null) ->where('tid', $tid) ->where('status', 1) @@ -484,17 +502,18 @@ class Index extends BaseController ->field('contact_phone,contact_email,address,worktime') ->find(); - // 4. 合并返回 + // 合并返回 return json([ 'code' => 200, 'msg' => 'success', 'data' => [ - 'normal' => $normalInfos ?: (object) [], + 'normal' => $normalInfos ?: (object) [], 'contact' => $contact ?: (object) [], + 'services' => $servicesList, + 'products' => $productsList, 'links' => $friendlinkList ] ]); - } catch (\Exception $e) { return json([ 'code' => 500, diff --git a/app/index/route/app.php b/app/index/route/app.php index deb3285..c2ab573 100644 --- a/app/index/route/app.php +++ b/app/index/route/app.php @@ -13,6 +13,9 @@ Route::get(':page', 'app\index\controller\Index@page') // --- 模板初始化接口 --- Route::get('init', 'app\index\controller\Index@init'); +// --- Banner 路由 --- +Route::get('getBanners', 'app\index\controller\BannerController@getBanners'); + // --- 前端其他数据路由 --- Route::get('footerdata', 'app\index\controller\Index@getFooterData'); Route::get('companyInfos', 'app\index\controller\Index@getCompanyInfos'); @@ -21,13 +24,12 @@ Route::get('homeData', 'app\index\controller\Index@getHomeData'); // --- 客户需求路由 --- -// --- 文章列表路由 --- +// --- 新闻中心列表路由 --- Route::get('getCenterNews', 'app\index\controller\Article\NewsCenterController@getCenterNews'); -// --- Banner 路由 --- -Route::get('getBanners', 'app\index\controller\BannerController@getBanners'); - -// --- 文章互动路由 --- +// --- 新闻中心互动路由 --- Route::post('articleViews/:id', 'app\index\controller\Article\ArticleController@articleViews'); Route::post('articleLikes/:id', 'app\index\controller\Article\ArticleController@articleLikes'); Route::post('articleUnlikes/:id', 'app\index\controller\Article\ArticleController@articleUnlikes'); + + diff --git a/app/model/Cms/Products.php b/app/model/Cms/Products.php new file mode 100644 index 0000000..87ee64b --- /dev/null +++ b/app/model/Cms/Products.php @@ -0,0 +1,44 @@ + +// +---------------------------------------------------------------------- + +namespace app\model\Cms; + +use think\Model; +use think\model\concern\SoftDelete; + +/** + * 特色服务模型 + */ +class Products extends Model +{ + // 启用软删除 + use SoftDelete; + + // 数据库表名 + protected $name = 'mete_apps_cms_products'; + + // 字段类型转换 + protected $type = [ + 'id' => 'integer', + 'tid' => 'integer', + 'title' => 'string', + 'desc' => 'string', + 'content' => 'string', + 'thumb' => 'string', + 'url' => 'string', + 'sort' => 'integer', + 'create_time' => 'datetime', + 'update_time' => 'datetime', + 'delete_time' => 'datetime', + ]; + + +} diff --git a/config/app.php b/config/app.php index 4ac42b4..574c881 100644 --- a/config/app.php +++ b/config/app.php @@ -21,6 +21,8 @@ return [ // 应用映射(自动多应用模式有效) 'app_map' => [], // 域名绑定(自动多应用模式有效) + // 多租户二级域名池场景下,不建议在这里写死具体主域名/子域名 + // 否则后续新增租户域名需要反复改配置 'domain_bind' => [], // 禁止URL访问的应用列表(自动多应用模式有效) 'deny_app_list' => [], diff --git a/docs/nginx/dh2fun.md b/docs/nginx/dh2fun.md new file mode 100644 index 0000000..4ff5387 --- /dev/null +++ b/docs/nginx/dh2fun.md @@ -0,0 +1,126 @@ +server + { + listen 80; + listen 443 ssl; + listen 443 quic; + http2 on; + server_name dh2.fun ~^(?.+)\.dh2\.fun$; + index index.php index.html index.htm default.php default.htm default.html; + root /www/wwwroot/api.yunzer.cn/public; + + #CERT-APPLY-CHECK--START + include /www/server/panel/vhost/nginx/well-known/dh2.fun.conf; + #CERT-APPLY-CHECK--END + include /www/server/panel/vhost/nginx/extension/dh2.fun/*.conf; + + # 根目录的 *.html 和 *.php,交给 ThinkPHP 处理 + location ~* ^/(.+\.(html|php))$ { + try_files $uri /index.php?$query_string; + } + + # 所有 /themes/... 直接当静态文件返回(模板静态资源) + location ^~ /themes/ { + root /www/wwwroot/api.yunzer.cn/public; + try_files $uri $uri/ =404; + expires 12h; + access_log off; + } + + # /template1..100/... 预览入口 + location ~ ^/(template(?:[1-9]\d?|100))/(.*)$ { + alias /www/wwwroot/api.yunzer.cn/public/themes/$1/$2; + try_files $uri $uri/ =404; + expires 12h; + access_log off; + } + + #SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则 + #error_page 404/404.html; + #HTTP_TO_HTTPS_START + set $isRedcert 1; + if ($server_port != 443) { + set $isRedcert 2; + } + if ( $uri ~ /\.well-known/ ) { + set $isRedcert 1; + } + if ($isRedcert != 1) { + rewrite ^(/.*)$ https://$host$1 permanent; + } + #HTTP_TO_HTTPS_END + ssl_certificate /www/server/panel/vhost/cert/dh2.fun/fullchain.pem; + ssl_certificate_key /www/server/panel/vhost/cert/dh2.fun/privkey.pem; + ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3; + ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5; + ssl_prefer_server_ciphers on; + ssl_session_tickets on; + ssl_session_cache shared:SSL:10m; + ssl_session_timeout 10m; + add_header Strict-Transport-Security "max-age=31536000"; + add_header Alt-Svc 'quic=":443"; h3=":443"; h3-29=":443"; h3-27=":443";h3-25=":443"; h3-T050=":443"; h3-Q050=":443";h3-Q049=":443";h3-Q048=":443"; h3-Q046=":443"; h3-Q043=":443"'; + error_page 497 https://$host$request_uri; + #SSL-END + + #ERROR-PAGE-START 错误页配置,可以注释、删除或修改 + error_page 404 /404.html; + #ERROR-PAGE-END + + #PHP-INFO-START PHP引用配置,可以注释或修改 + include enable-php-82.conf; + #PHP-INFO-END + + #REWRITE-START URL重写规则引用,修改后将导致面板设置的伪静态规则失效 + include /www/server/panel/vhost/rewrite/dh2.fun.conf; + #REWRITE-END + + # 禁止访问的敏感文件 + location ~* (\.user.ini|\.htaccess|\.htpasswd|\.env.*|\.project|\.bashrc|\.bash_profile|\.bash_logout|\.DS_Store|\.gitignore|\.gitattributes|LICENSE|README\.md|CLAUDE\.md|CHANGELOG\.md|CHANGELOG|CONTRIBUTING\.md|TODO\.md|FAQ\.md|composer\.json|composer\.lock|package(-lock)?\.json|yarn\.lock|pnpm-lock\.yaml|\.\w+~|\.swp|\.swo|\.bak(up)?|\.old|\.tmp|\.temp|\.log|\.sql(\.gz)?|docker-compose\.yml|docker\.env|Dockerfile|\.csproj|\.sln|Cargo\.toml|Cargo\.lock|go\.mod|go\.sum|phpunit\.xml|phpunit\.xml|pom\.xml|build\.gradl|pyproject\.toml|requirements\.txt|application(-\w+)?\.(ya?ml|properties))$ + { + return 404; + } + + # 禁止访问的敏感目录 + location ~* /(\.git|\.svn|\.bzr|\.vscode|\.claude|\.idea|\.ssh|\.github|\.npm|\.yarn|\.pnpm|\.cache|\.husky|\.turbo|\.next|\.nuxt|node_modules|runtime)/ { + return 404; + } + + #一键申请SSL证书验证目录相关设置 + location ~ \.well-known{ + allow all; + } + + #禁止在证书验证目录放入敏感文件 + if ( $uri ~ "^/\.well-known/.*\.(php|jsp|py|js|css|lua|ts|go|zip|tar\.gz|rar|7z|sql|bak)$" ) { + return 403; + } + + location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ + { + expires 30d; + error_log /dev/null; + access_log /dev/null; + } + + location ~ .*\.(js|css)?$ + { + expires 12h; + error_log /dev/null; + access_log /dev/null; + } + + # PHP 解析 + 传递子域名参数 + location ~ [^/]\.php(/|$) { + include enable-php-82.conf; + fastcgi_param HTTP_SUBDOMAIN $subdomain; + fastcgi_param HTTP_MAIN_DOMAIN dh2.fun; + } + + # TP路由重写 + if (!-e $request_filename) { + # 将原始 URI 追加到 /index.php 后面,让 ThinkPHP 从 pathinfo 里拿到 :page + rewrite ^(.*)$ /index.php$1$is_args$args last; + } + + access_log /www/wwwlogs/dh2.fun.log; + error_log /www/wwwlogs/dh2.fun.error.log; + } \ No newline at end of file diff --git a/docs/nginx/yunzercomcn.md b/docs/nginx/yunzercomcn.md new file mode 100644 index 0000000..55d1ec6 --- /dev/null +++ b/docs/nginx/yunzercomcn.md @@ -0,0 +1,120 @@ +server { + listen 80; + listen 443 ssl; + listen 443 quic; + http2 on; + + # 捕获子域名变量 $subdomain + server_name yunzer.com.cn ~^(?.+)\.yunzer\.com\.cn$; + index index.php index.html index.htm default.php default.htm default.html; + root /www/wwwroot/api.yunzer.cn/public; + + #CERT-APPLY-CHECK--START + include /www/server/panel/vhost/nginx/well-known/yunzer.com.cn.conf; + #CERT-APPLY-CHECK--END + include /www/server/panel/vhost/nginx/extension/yunzer.com.cn/*.conf; + + # --- SSL 配置 START --- + set $isRedcert 1; + if ($server_port != 443) { + set $isRedcert 2; + } + if ( $uri ~ /\.well-known/ ) { + set $isRedcert 1; + } + if ($isRedcert != 1) { + rewrite ^(/.*)$ https://$host$1 permanent; + } + + ssl_certificate /www/server/panel/vhost/cert/yunzer.com.cn/fullchain.pem; + ssl_certificate_key /www/server/panel/vhost/cert/yunzer.com.cn/privkey.pem; + ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3; + ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5; + ssl_prefer_server_ciphers on; + ssl_session_tickets on; + ssl_session_cache shared:SSL:10m; + ssl_session_timeout 10m; + add_header Strict-Transport-Security "max-age=31536000"; + add_header Alt-Svc 'quic=":443"; h3=":443"; h3-29=":443"; h3-27=":443";h3-25=":443"; h3-T050=":443"; h3-Q050=":443";h3-Q049=":443";h3-Q048=":443"; h3-Q046=":443"; h3-Q043=":443"'; + error_page 497 https://$host$request_uri; + # --- SSL 配置 END --- + + #ERROR-PAGE-START + error_page 404 /404.html; + #ERROR-PAGE-END + + # --- 安全与防盗链拦截 START --- + location ~* (\.user.ini|\.htaccess|\.htpasswd|\.env.*|\.project|\.bashrc|\.bash_profile|\.bash_logout|\.DS_Store|\.gitignore|\.gitattributes|LICENSE|README\.md|CLAUDE\.md|CHANGELOG\.md|CHANGELOG|CONTRIBUTING\.md|TODO\.md|FAQ\.md|composer\.json|composer\.lock|package(-lock)?\.json|yarn\.lock|pnpm-lock\.yaml|\.\w+~|\.swp|\.swo|\.bak(up)?|\.old|\.tmp|\.temp|\.log|\.sql(\.gz)?|docker-compose\.yml|docker\.env|Dockerfile|\.csproj|\.sln|Cargo\.toml|Cargo\.lock|go\.mod|go\.sum|phpunit\.xml|phpunit\.xml|pom\.xml|build\.gradl|pyproject\.toml|requirements\.txt|application(-\w+)?\.(ya?ml|properties))$ { + return 404; + } + + location ~* /(\.git|\.svn|\.bzr|\.vscode|\.claude|\.idea|\.ssh|\.github|\.npm|\.yarn|\.pnpm|\.cache|\.husky|\.turbo|\.next|\.nuxt|node_modules|runtime)/ { + return 404; + } + + location ~ \.well-known { + allow all; + } + + if ( $uri ~ "^/\.well-known/.*\.(php|jsp|py|js|css|lua|ts|go|zip|tar\.gz|rar|7z|sql|bak)$" ) { + return 403; + } + # --- 安全与防盗链拦截 END --- + + # --- 静态资源与缓存 START --- + location ^~ /themes/ { + root /www/wwwroot/api.yunzer.cn/public; + try_files $uri $uri/ =404; + expires 12h; + access_log off; + } + + location ~ ^/(template(?:[1-9]\d?|100))/(.*)$ { + alias /www/wwwroot/api.yunzer.cn/public/themes/$1/$2; + try_files $uri $uri/ =404; + expires 12h; + access_log off; + } + + location ~* \.(gif|jpg|jpeg|png|bmp|swf)$ { + expires 30d; + error_log /dev/null; + access_log /dev/null; + } + + location ~* \.(js|css)$ { + expires 12h; + error_log /dev/null; + access_log /dev/null; + } + # --- 静态资源与缓存 END --- + + # --- 核心路由与 PHP 解析 START --- + # 1. 根目录的 *.html,交给 ThinkPHP 处理 + location ~* ^/(.+\.html)$ { + try_files /themes/template3/$1 /index.php?$query_string; + } + + # 2. 唯一且正确的 PHP 解析块(解决了直接下载的问题) + location ~ [^/]\.php(/|$) { + # 引入宝塔的 PHP FastCGI 配置,确保 PHP 正常执行 + include enable-php-82.conf; + + # 传递自定义子域名参数给 ThinkPHP + fastcgi_param HTTP_SUBDOMAIN $subdomain; + fastcgi_param HTTP_MAIN_DOMAIN yunzer.com.cn; + } + + # 3. 统一入口(ThinkPHP 默认伪静态):先找真实文件,找不到再交给 index.php + location / { + # 当访问的路径没有对应静态文件时,将请求回退到 ThinkPHP 前端入口。 + # 使用 /index.php$uri 让内部请求变成 /index.php/portfolio 这类形式, + # 从而使 ThinkPHP 能从 pathinfo 中拿到 portfolio,并匹配 Route::get(':page', ...) + # 保留 query_string(用于 ?page=n 之类分页参数) + try_files $uri $uri/ /index.php$uri$is_args$args; + } + # --- 核心路由与 PHP 解析 END --- + + access_log /www/wwwlogs/yunzer.com.cn.log; + error_log /www/wwwlogs/yunzer.com.cn.error.log; +} \ No newline at end of file diff --git a/public/themes/template3/assets/css/main.css b/public/themes/template3/assets/css/main.css index 246aae9..4e25410 100644 --- a/public/themes/template3/assets/css/main.css +++ b/public/themes/template3/assets/css/main.css @@ -1925,6 +1925,7 @@ section, font-weight: 700; padding: 0; margin: 0 0 20px 0; + height: 48px; } .blog-posts .title a { diff --git a/public/themes/template3/blog-details.php b/public/themes/template3/blog-details.php index 3191a90..fc696f9 100644 --- a/public/themes/template3/blog-details.php +++ b/public/themes/template3/blog-details.php @@ -37,9 +37,9 @@ require_once __DIR__ . '/header.php'; @@ -301,7 +301,7 @@ require_once __DIR__ . '/header.php';
-

Nihil blanditiis at in nihil autem

+

Nihil blanditiis at in nihil autem

@@ -309,7 +309,7 @@ require_once __DIR__ . '/header.php';
-

Quidem autem et impedit

+

Quidem autem et impedit

@@ -317,7 +317,7 @@ require_once __DIR__ . '/header.php';
-

Id quia et et ut maxime similique occaecati ut

+

Id quia et et ut maxime similique occaecati ut

@@ -325,7 +325,7 @@ require_once __DIR__ . '/header.php';
-

Laborum corporis quo dara net para

+

Laborum corporis quo dara net para

@@ -333,7 +333,7 @@ require_once __DIR__ . '/header.php';
-

Et dolores corrupti quae illo quod dolor

+

Et dolores corrupti quae illo quod dolor

diff --git a/public/themes/template3/blog.php b/public/themes/template3/blog.php index b32f630..65e0f6b 100644 --- a/public/themes/template3/blog.php +++ b/public/themes/template3/blog.php @@ -3,6 +3,28 @@ $pageTitle = '新闻中心 - Nova'; $pageDescription = 'Nova Bootstrap Template 的新闻中心页面'; $pageKeywords = 'blog, news, nova'; require_once __DIR__ . '/header.php'; +?> + $totalPages) { + $currentPage = $totalPages; +} + +$newsListForPage = array_slice($allNewsList, ($currentPage - 1) * $pageSize, $pageSize); ?> @@ -28,162 +50,68 @@ require_once __DIR__ . '/header.php';
+ + $item): ?> + -
+ $publishDateRaw = $item['publish_date'] ?? ''; + $postDate = !empty($publishDateRaw) ? date('Y年m月d日', strtotime($publishDateRaw)) : ''; -
- -
+ $thumbUrl = $item['thumb'] ?? ($item['image'] ?? ''); + if (!empty($thumbUrl)) { + if (strpos($thumbUrl, 'http') === 0) { + $imgSrc = $thumbUrl; + } elseif (strpos($thumbUrl, '/') === 0) { + $imgSrc = $apiUrl . $thumbUrl; + } else { + $imgSrc = $apiUrl . '/' . $thumbUrl; + } + } else { + $imgIndex = ($i % 6) + 1; // blog-1.jpg ~ blog-6.jpg + $imgSrc = $baseUrl . "/themes/template3/assets/img/blog/blog-{$imgIndex}.jpg"; + } - + $articleUrl = $apiUrl . '/article_detail/' . ($item['id'] ?? 0); + ?> -

- Dolorum optio tempore voluptas dignissimos -

+
+
-
- - -
+
+ +
-
-
+ -
- -
- -
- -
- -
- -
- -
- -
- -
- -
+
+
+ + +
+

暂无新闻数据

+
+
@@ -196,14 +124,24 @@ require_once __DIR__ . '/header.php';
@@ -250,7 +188,7 @@ require_once __DIR__ . '/header.php';
-

Nihil blanditiis at in nihil autem

+

Nihil blanditiis at in nihil autem

@@ -258,7 +196,7 @@ require_once __DIR__ . '/header.php';
-

Quidem autem et impedit

+

Quidem autem et impedit

@@ -266,7 +204,7 @@ require_once __DIR__ . '/header.php';
-

Id quia et et ut maxime similique occaecati ut

+

Id quia et et ut maxime similique occaecati ut

@@ -274,7 +212,7 @@ require_once __DIR__ . '/header.php';
-

Laborum corporis quo dara net para

+

Laborum corporis quo dara net para

@@ -282,33 +220,13 @@ require_once __DIR__ . '/header.php';
-

Et dolores corrupti quae illo quod dolor

+

Et dolores corrupti quae illo quod dolor

- -
- -

标签

- - -
- @@ -318,66 +236,6 @@ require_once __DIR__ . '/header.php'; - + \ No newline at end of file diff --git a/public/themes/template3/footer.php b/public/themes/template3/footer.php index 6f00106..ee52e4d 100644 --- a/public/themes/template3/footer.php +++ b/public/themes/template3/footer.php @@ -1,33 +1,67 @@ - + - -
+ +
- -
+ +
+ +
+ - - - - - - - - + - - +
+ + + + + + + + + + + + - + \ No newline at end of file diff --git a/public/themes/template3/header.php b/public/themes/template3/header.php index eccef6c..e8dbef9 100644 --- a/public/themes/template3/header.php +++ b/public/themes/template3/header.php @@ -1,4 +1,3 @@ - - <?php echo htmlspecialchars($homeInfo['normal']['sitename']); ?> - - + + <?php echo htmlspecialchars($seoTitle); ?> + + + @@ -90,17 +96,27 @@ $seoKeywords = $pageKeywords ?? ($homeInfo['normal']['keywords'] ?? '');