chore: 重写初始提交(清空历史,整理后全量提交)

This commit is contained in:
ywxapp
2026-08-16 16:54:14 +08:00
commit 6c1a106bc1
1808 changed files with 238144 additions and 0 deletions
+9
View File
@@ -0,0 +1,9 @@
<?php
// +----------------------------------------------------------------------
// | YwxApp [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2026-2036 http://ywxapp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Author: ywxapp<admin@ywxapp.cn>
// +----------------------------------------------------------------------
// 这是系统自动生成的公共文件
+102
View File
@@ -0,0 +1,102 @@
<?php
// +----------------------------------------------------------------------
// | YwxApp [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2026-2036 http://ywxapp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Author: ywxapp<admin@ywxapp.cn>
// +----------------------------------------------------------------------
declare (strict_types = 1);
namespace app\frontend\controller;
use think\Request;
use ywxapp\controller\FrontendBase;
/**
* About 类
*
* @author ywxapp <admin@ywxapp.cn>
*/
class About extends FrontendBase
{
/**
* 显示资源列表
*
* @return \think\Response
*/
public function index()
{
return view('index', [
'controller' => $this->request->controller(),
'email' => $this->request->controller(),
'latest_news' => [],
]);
}
/**
* 显示创建资源表单页.
*
* @return \think\Response
*/
public function create()
{
//
}
/**
* 保存新建的资源
*
* @param \think\Request $request
* @return \think\Response
*/
public function save(Request $request)
{
//
}
/**
* 显示指定的资源
*
* @param int $id
* @return \think\Response
*/
public function read($id)
{
//
}
/**
* 显示编辑资源表单页.
*
* @param int $id
* @return \think\Response
*/
public function edit($id = null)
{
//
}
/**
* 保存更新的资源
*
* @param \think\Request $request
* @param int $id
* @return \think\Response
*/
public function update(Request $request, $id)
{
//
}
/**
* 删除指定资源
*
* @param int $id
* @return \think\Response
*/
public function delete($id)
{
//
}
}
+34
View File
@@ -0,0 +1,34 @@
<?php
declare (strict_types = 1);
namespace app\frontend\controller;
use ywxapp\controller\FrontendBase;
/**
* 客户案例
*/
class Cases extends FrontendBase
{
protected $noNeedLogin = ['*'];
protected $noNeedVerify = ['*'];
public function index()
{
$cases = [
['title' => '某科技公司', 'brief' => '官网+电商一体化部署,3 天快速上线', 'logo' => '/static/frontend/img/case1.jpg'],
['title' => '某制造企业', 'brief' => '会员与订单系统打通,运营效率提升 40%', 'logo' => '/static/frontend/img/case2.jpg'],
['title' => '某教育机构', 'brief' => '表单引擎采集学员信息,转化率翻倍', 'logo' => '/static/frontend/img/case3.jpg'],
['title' => '某零售连锁', 'brief' => '多门店统一后台,数据实时汇总', 'logo' => '/static/frontend/img/case4.jpg'],
['title' => '某医疗平台', 'brief' => '在线预约与会员体系结合,服务更贴心', 'logo' => '/static/frontend/img/case5.jpg'],
['title' => '某金融企业', 'brief' => '插件化风控模块,按需启用安全合规', 'logo' => '/static/frontend/img/case6.jpg'],
['title' => '某物流公司', 'brief' => '订单追踪与支付打通,全程可视', 'logo' => '/static/frontend/img/case7.jpg'],
['title' => '某政务系统', 'brief' => '多应用隔离部署,权限分级清晰', 'logo' => '/static/frontend/img/case8.jpg'],
['title' => '某文创品牌', 'brief' => '精美模板 + 营销插件,品牌声量提升', 'logo' => '/static/frontend/img/case9.jpg'],
];
return view('case/index', [
'cases' => $cases,
]);
}
}
+102
View File
@@ -0,0 +1,102 @@
<?php
// +----------------------------------------------------------------------
// | YwxApp [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2026-2036 http://ywxapp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Author: ywxapp<admin@ywxapp.cn>
// +----------------------------------------------------------------------
declare (strict_types = 1);
namespace app\frontend\controller;
use think\Request;
use ywxapp\controller\FrontendBase;
/**
* Contact 类
*
* @author ywxapp <admin@ywxapp.cn>
*/
class Contact extends FrontendBase
{
/**
* 显示资源列表
*
* @return \think\Response
*/
public function index()
{
return view('index', [
'controller' => $this->request->controller(),
'email' => $this->request->controller(),
'latest_news' => [ ],
]);
}
/**
* 显示创建资源表单页.
*
* @return \think\Response
*/
public function create()
{
//
}
/**
* 保存新建的资源
*
* @param \think\Request $request
* @return \think\Response
*/
public function save(Request $request)
{
//
}
/**
* 显示指定的资源
*
* @param int $id
* @return \think\Response
*/
public function read($id)
{
//
}
/**
* 显示编辑资源表单页.
*
* @param int $id
* @return \think\Response
*/
public function edit($id = null)
{
//
}
/**
* 保存更新的资源
*
* @param \think\Request $request
* @param int $id
* @return \think\Response
*/
public function update(Request $request, $id)
{
//
}
/**
* 删除指定资源
*
* @param int $id
* @return \think\Response
*/
public function delete($id)
{
//
}
}
+44
View File
@@ -0,0 +1,44 @@
<?php
declare (strict_types = 1);
namespace app\frontend\controller;
use ywxapp\controller\FrontendBase;
/**
* 文档 / 示例入口(由 app/wxapp 合并至 app/frontend
*/
class Doc extends FrontendBase
{
protected $noNeedLogin = ['index'];
protected $noNeedVerify = ['*'];
public function index()
{
$docs = [
[
'title' => 'mqpay 支付钩子机制与时序图',
'desc' => '事件系统、订阅器注册、会员开通链路详解',
'path' => 'addon/mqpay/docs/payment_hooks.md',
'url' => '/addon/mqpay/docs/payment_hooks.md',
],
[
'title' => '安卓到账监听 App 接入指南',
'desc' => '免签监听 App 对接 notify-app 接口说明',
'path' => 'addon/mqpay/docs/listen_app_guide.md',
'url' => '/addon/mqpay/docs/listen_app_guide.md',
],
[
'title' => 'mqpay 插件总览',
'desc' => '插件能力、配置项、钩子速查表',
'path' => 'addon/mqpay/README.md',
'url' => '/addon/mqpay/README.md',
],
];
return view('doc/index', [
'controller' => $this->request->controller(),
'docs' => $docs,
]);
}
}
+106
View File
@@ -0,0 +1,106 @@
<?php
declare(strict_types=1);
namespace app\frontend\controller;
use ywxapp\controller\FrontendBase;
/**
* 特性详情(由 app/wxapp 合并至 app/frontend
*/
class Feature extends FrontendBase
{
protected $noNeedLogin = ['index', 'detail'];
protected $noNeedVerify = ['*'];
// 四大特性元数据
private $items = [
'plugin' => [
'title' => '插件机制',
'summary' => '基于 ThinkPHP 事件系统 + 订阅器的热插拔插件架构。',
'points' => [
'插件在 info.php 的 events.subscribe 声明订阅器类',
'AppService 启动时自动 loadEvent 注册,无需手动绑定',
'订阅方法 onXxx 自动监听对应事件,与业务完全解耦',
'后台可在线安装 / 启用 / 禁用 / 卸载',
],
'code' => "## 插件订阅器示例(mqpay
class Payment extends \\ywxapp\\addon {
// 监听支付方式列表事件
public function onPaymentMethods(\$event) {
return ['personal' => ['name'=>'免签支付','sort'=>10]];
}
// 监听支付创建事件,生成收款码
public function onPaymentCreate(\$event) { /* ... */ }
}",
],
'multi-app' => [
'title' => '多应用架构',
'summary' => 'app 目录下按业务域拆分多个独立应用,互不干扰。',
'points' => [
'api → 对外 JSON 接口(移动端 / 第三方)',
'backend → 管理后台(RBAC 权限)',
'member → 会员中心(支付 / 订单 / 会员)',
'frontend → 标准 Web 前端',
'site → 本展示官网',
],
'code' => "# route/app.php 按应用分组
Route::group('api', function () {
Route::get('user/info', 'api/v1.user/info');
});",
],
'member-pay' => [
'title' => '会员 / 支付',
'summary' => 'mqpay 免签支付 + 会员开通事件链,扫码到账自动开通。',
'points' => [
'免签支付:监听系统通知栏,到账自动确认',
'安卓调用 POST /mqpay/pay/notify-app 验签确认',
'confirmOrder() 触发 UserMemberActivate 事件',
'会员监听器顺延会员期限并写入权益',
],
'code' => "// confirmOrder 内触发会员开通
Event::trigger('UserMemberActivate', [
'uid' => \$order['uid'],
'plan_id' => \$order['plan_id'],
'order' => \$order,
'method' => 'personal',
]);",
],
'doc' => [
'title' => '文档 / 示例',
'summary' => '完善的开发文档、API 示例与快速开始指南。',
'points' => [
'插件 README + docs 文档体系',
'API 示例与请求 / 响应契约',
'快速开始指南降低上手成本',
'钩子 / 事件速查表一键索引',
],
'code' => "# 查看支付钩子文档
addon/mqpay/docs/payment_hooks.md
addon/mqpay/docs/listen_app_guide.md",
],
];
public function index()
{
return view('feature/index', [
'controller' => $this->request->controller(),
'items' => $this->items,
]);
}
public function detail($name = 'plugin')
{
if (!isset($this->items[$name])) {
$name = 'plugin';
}
$item = $this->items[$name];
return view('feature/detail', [
'controller' => $this->request->controller(),
'name' => $name,
'item' => $item,
'items' => $this->items,
]);
}
}
+61
View File
@@ -0,0 +1,61 @@
<?php
declare(strict_types=1);
namespace app\frontend\controller;
use think\facade\Db;
use ywxapp\controller\FrontendBase;
use ywxapp\model\Help as HelpModel;
/**
* 站点帮助中心(前台)
*/
class Help extends FrontendBase
{
/**
* 帮助中心首页:按分类分组列出所有启用项
*/
public function index()
{
$list = (new HelpModel())
->where('status', 1)
->order('sort', 'desc')
->order('id', 'desc')
->field('id,category,title,view_count')
->select()
->toArray();
$groups = [];
foreach ($list as $item) {
$cat = $item['category'] ?: '其他';
$groups[$cat][] = $item;
}
// 维护分类顺序(按首个条目出现顺序)
$categories = [];
foreach ($groups as $cat => $items) {
$categories[] = ['name' => $cat, 'items' => $items];
}
$this->assign('categories', $categories);
return $this->fetch();
}
/**
* 帮助详情
*/
public function read($id = null)
{
if (empty($id)) {
$this->error('参数错误');
}
$info = (new HelpModel())->where('id', $id)->where('status', 1)->find();
if (empty($info)) {
$this->error('帮助内容不存在或已下架');
}
// 浏览量自增
Db::name('help')->where('id', $id)->inc('view_count')->update();
$this->assign('info', $info);
return $this->fetch('read');
}
}
+84
View File
@@ -0,0 +1,84 @@
<?php
// +----------------------------------------------------------------------
// | YwxApp [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2026-2036 http://ywxapp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Author: ywxapp<admin@ywxapp.cn>
// +----------------------------------------------------------------------
declare (strict_types = 1);
namespace app\frontend\controller;
use ywxapp\controller\FrontendBase;
/**
* Index 类
*
* @author ywxapp <admin@ywxapp.cn>
*/
class Index extends FrontendBase
{
/**
* Summary of needLogin
* @var array
*/
protected $noNeedLogin = ["index", "hello"];
/**
* Summary of needRight
* @var array
*/
protected $noNeedVerify = [];
/**
* 控制器初始化 initialize
* @return void
*/
protected function initialize()
{
}
public function index()
{
// 模拟新闻数据(实际从数据库获取)
$latest_news = [
[
'id' => 1,
'title' => '公司荣获2023年度创新企业奖',
'description' => '在近日举办的行业峰会上...',
'create_at' => date('Y-m-d H:i:s'),
'views' => 128,
],
[
'id' => 2,
'title' => '智创科技发布新一代企业服务平台',
'description' => '全新平台整合了...',
'create_at' => date('Y-m-d H:i:s',
strtotime('-2 days')),
'views' => 256,
],
// ...更多数据
];
return view('index', [
'site_name' => '智创科技',
'seo_keywords' => '企业服务,数字化转型,软件开发',
'seo_description' => '智创科技专注企业数字化解决方案,10年行业经验,服务1000+企业客户',
'contact_phone' => '400-888-9999',
'contact_email' => 'service@zhichuang.com',
'company_address' => '北京市海淀区中关村大厦18层',
'icp_number' => '京ICP备12345678号',
'controller' => $this->request->controller(),
'latest_news' => $latest_news,
]);
}
public function hello($name = 'ThinkPHP8')
{
return 'hello,' . $name;
}
}
+107
View File
@@ -0,0 +1,107 @@
<?php
// +----------------------------------------------------------------------
// | YwxApp [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2026-2036 http://ywxapp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Author: ywxapp<admin@ywxapp.cn>
// +----------------------------------------------------------------------
declare (strict_types = 1);
namespace app\frontend\controller;
use think\Request;
use ywxapp\controller\FrontendBase;
/**
* News 类
*
* @author ywxapp <admin@ywxapp.cn>
*/
class News extends FrontendBase
{
/**
* 显示资源列表
*
* @return \think\Response
*/
public function index()
{
return view('index', [
'controller' => $this->request->controller(),
'email' => $this->request->controller(),
'latest_news' => [],
'news_list' => [],
]);
}
/**
* 显示创建资源表单页.
*
* @return \think\Response
*/
public function create()
{
//
}
/**
* 保存新建的资源
*
* @param \think\Request $request
* @return \think\Response
*/
public function save(Request $request)
{
//
}
/**
* 显示指定的资源
*
* @param int $id
* @return \think\Response
*/
public function read($id)
{
return view('read', [
'controller' => $this->request->controller(),
'email' => $this->request->controller(),
'latest_news' => [],
]);
}
/**
* 显示编辑资源表单页.
*
* @param int $id
* @return \think\Response
*/
public function edit($id = null)
{
//
}
/**
* 保存更新的资源
*
* @param \think\Request $request
* @param int $id
* @return \think\Response
*/
public function update(Request $request, $id)
{
//
}
/**
* 删除指定资源
*
* @param int $id
* @return \think\Response
*/
public function delete($id)
{
//
}
}
+75
View File
@@ -0,0 +1,75 @@
<?php
// +----------------------------------------------------------------------
// | YwxApp [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2026-2036 http://ywxapp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Author: ywxapp<admin@ywxapp.cn>
// +----------------------------------------------------------------------
declare (strict_types = 1);
namespace app\frontend\controller;
use think\facade\Db;
use think\facade\View;
use ywxapp\controller\FrontendBase;
use ywxapp\model\Notice as NoticeModel;
/**
* 前台站点公告(方案 B:列表 + 详情)
*/
class Notice extends FrontendBase
{
protected $noNeedLogin = ['index', 'read'];
/**
* 公告列表
*/
public function index()
{
$page = $this->request->param('page/d', 1);
$type = $this->request->param('type/d', 0);
$list = NoticeModel::getList($page, 10, $type);
// 附加类型文案
$typeList = NoticeModel::typeList();
$items = $list->items();
foreach ($items as &$it) {
$it['type_text'] = $typeList[$it['type']] ?? '公告';
}
unset($it);
View::assign('title', '站点公告 - YwxApp');
return view('index', [
'type' => $type,
'type_list' => $typeList,
'list' => $list,
'items' => $items,
]);
}
/**
* 公告详情
*/
public function read($id = null)
{
$id = $id ?: $this->request->param('id/d');
if (! $id) {
$this->redirect('notice/index');
}
$info = (new NoticeModel())->where('status', 1)->find($id);
if (! $info) {
$this->redirect('notice/index');
}
// 浏览量自增(模型 view_count 为 readonly,用 Db 原生 inc 绕过)
Db::name('notice')->where('id', $id)->inc('view_count')->update();
$info->view_count = ($info->view_count ?? 0) + 1;
$typeList = NoticeModel::typeList();
$info->type_text = $typeList[$info['type']] ?? '公告';
View::assign('title', ($info->title ?? '公告详情') . ' - YwxApp');
return view('read', [
'info' => $info,
]);
}
}
+73
View File
@@ -0,0 +1,73 @@
<?php
declare (strict_types = 1);
namespace app\frontend\controller;
use ywxapp\controller\FrontendBase;
/**
* 插件机制展示页(由 app/wxapp 合并至 app/frontend
*/
class Plugin extends FrontendBase
{
protected $noNeedLogin = ['*'];
protected $noNeedVerify = ['*'];
public function index()
{
// 展示应用市场在线插件列表(中心站读本地库 / 客户机代理中心站 API)
$items = [];
$categories = [];
$errMsg = '';
try {
if (is_market_client()) {
// 客户机:经 RemoteAppmallService 拉取中心站列表
$resp = \ywxapp\service\RemoteAppmallService::instance()->lists([
'page' => 1,
'page_size' => 24,
]);
if (!empty($resp['success']) && !empty($resp['data']['list'])) {
$items = $resp['data']['list'];
} else {
$errMsg = $resp['message'] ?? '暂无插件';
}
} else {
// 中心站:直接读本地市场库(appmall_addon_list
$catalog = \addon\appmall\service\MarketService::instance()->catalog();
$items = $catalog['list'] ?? [];
$categories = $catalog['categories'] ?? [];
}
} catch (\Throwable $e) {
$errMsg = '市场列表加载失败:' . $e->getMessage();
}
$plugins = [];
foreach ($items as $it) {
$price = (float) ($it['price'] ?? 0);
$plugins[] = [
'id' => $it['id'] ?? 0,
'name' => $it['name'] ?? '',
'title' => $it['title'] ?? ($it['name'] ?? ''),
'desc' => $it['intro'] ?? '',
'version' => $it['version'] ?? '',
'author' => $it['author'] ?? '',
'logo' => $it['logo'] ?? '',
'price' => $price,
'price_text' => $price > 0 ? '¥' . number_format($price, 2) : '免费',
'rating' => (float) ($it['rating'] ?? 0),
'downloads' => (int) ($it['download_count'] ?? 0),
'category' => $it['category'] ?? '',
'type' => $it['type'] ?? 'addon',
];
}
return view('plugin/index', [
'title' => '插件市场',
'controller' => 'Plugin',
'plugins' => $plugins,
'categories' => $categories,
'err_msg' => $errMsg,
'hooks' => [],
]);
}
}
+98
View File
@@ -0,0 +1,98 @@
<?php
// +----------------------------------------------------------------------
// | YwxApp [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2026-2036 http://ywxapp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Author: ywxapp<admin@ywxapp.cn>
// +----------------------------------------------------------------------
declare (strict_types = 1);
namespace app\frontend\controller;
use think\Request;
use ywxapp\controller\FrontendBase;
/**
* Product 类
*
* @author ywxapp <admin@ywxapp.cn>
*/
class Product extends FrontendBase
{
/**
* 显示资源列表
*
* @return \think\Response
*/
public function index()
{
return $this->view->fetch();
}
/**
* 显示创建资源表单页.
*
* @return \think\Response
*/
public function create()
{
//
}
/**
* 保存新建的资源
*
* @param \think\Request $request
* @return \think\Response
*/
public function save(Request $request)
{
//
}
/**
* 显示指定的资源
*
* @param int $id
* @return \think\Response
*/
public function read($id)
{
//
}
/**
* 显示编辑资源表单页.
*
* @param int $id
* @return \think\Response
*/
public function edit($id = null)
{
//
}
/**
* 保存更新的资源
*
* @param \think\Request $request
* @param int $id
* @return \think\Response
*/
public function update(Request $request, $id)
{
//
}
/**
* 删除指定资源
*
* @param int $id
* @return \think\Response
*/
public function delete($id)
{
//
}
}
+87
View File
@@ -0,0 +1,87 @@
<?php
declare (strict_types = 1);
namespace app\frontend\controller;
use ywxapp\controller\FrontendBase;
/**
* 展示官网首页(由 app/wxapp 合并至 app/frontend
*/
class Site extends FrontendBase
{
protected $noNeedLogin = ['*'];
protected $noNeedVerify = ['*'];
public function index()
{
// 已启用插件数(扫描 addon 目录 + info.php
$plugins = $this->scanaddon();
$pluginCount = count(array_filter($plugins, fn($p) => ($p['state'] ?? 0) == 1));
// 应用模块数(app 目录下)
$appDir = root_path() . 'app';
$apps = array_filter(scandir($appDir), function ($d) use ($appDir) {
return $d !== '.' && $d !== '..' && is_dir($appDir . DIRECTORY_SEPARATOR . $d);
});
$features = [
[
'icon' => 'plugin',
'title' => '插件机制',
'desc' => '基于事件订阅器的热插拔插件,钩子自动注册,与业务完全解耦。',
'url' => url('feature/detail', ['name' => 'plugin']),
],
[
'icon' => 'app',
'title' => '多应用架构',
'desc' => 'api / backend / member / frontend 多应用隔离,路由分组清晰。',
'url' => url('feature/detail', ['name' => 'multi-app']),
],
[
'icon' => 'vip',
'title' => '会员 / 支付',
'desc' => 'mqpay 免签支付 + 会员开通事件链,扫码即到帐自动开通。',
'url' => url('feature/detail', ['name' => 'member-pay']),
],
[
'icon' => 'doc',
'title' => '文档 / 示例',
'desc' => '完善的开发文档、API 示例与快速开始指南,开箱即用。',
'url' => url('feature/detail', ['name' => 'doc']),
],
];
return view('site/index', [
'controller' => $this->request->controller(),
'features' => $features,
'pluginCount' => $pluginCount,
'appCount' => count($apps),
]);
}
/**
* 扫描 addon 目录,读取各插件 info.php
*/
private function scanaddon(): array
{
$dir = root_path() . 'addon';
$list = [];
if (!is_dir($dir)) {
return $list;
}
foreach (scandir($dir) as $name) {
if ($name === '.' || $name === '..' || !is_dir($dir . DIRECTORY_SEPARATOR . $name)) {
continue;
}
$infoFile = $dir . DIRECTORY_SEPARATOR . $name . DIRECTORY_SEPARATOR . 'info.php';
if (!is_file($infoFile)) {
continue;
}
$info = include $infoFile;
if (is_array($info)) {
$list[] = $info;
}
}
return $list;
}
}
+12
View File
@@ -0,0 +1,12 @@
<?php
// +----------------------------------------------------------------------
// | YwxApp [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2026-2036 http://ywxapp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Author: ywxapp<admin@ywxapp.cn>
// +----------------------------------------------------------------------
// 这是系统自动生成的event定义文件
return [
];
+12
View File
@@ -0,0 +1,12 @@
<?php
// +----------------------------------------------------------------------
// | YwxApp [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2026-2036 http://ywxapp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Author: ywxapp<admin@ywxapp.cn>
// +----------------------------------------------------------------------
// 这是系统自动生成的middleware定义文件
return [
];
+15
View File
@@ -0,0 +1,15 @@
<?php
// +----------------------------------------------------------------------
// | YwxApp [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2026-2036 http://ywxapp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Author: ywxapp<admin@ywxapp.cn>
// +----------------------------------------------------------------------
use think\facade\Route;
///Route::rule('login/index', '\app\member\controller\Login@index');
Route::rule('login', \app\member\controller\Login::class . '@index');
//Route::rule('/', \addon\demo\controller\Index::class . '@index');
+160
View File
@@ -0,0 +1,160 @@
<div class="page-header">
<div class="layui-container">
<div class="layui-row">
<div class="layui-col-md12">
<div class="breadcrumb">
<span class="layui-breadcrumb">
<a href="{:url('index/index')}"><i class="layui-icon layui-icon-home"></i> 首页</a>
<a><cite>关于我们</cite></a>
</span>
</div>
<h1 class="page-title">关于我们</h1>
<p class="page-desc">了解我们的故事、使命与价值观</p>
</div>
</div>
</div>
</div>
<div class="about-section">
<div class="layui-container">
<div class="about-intro">
<div class="layui-row layui-col-space30">
<div class="layui-col-md6">
<div class="intro-content">
<h2>企业简介</h2>
<p class="highlight">{$site_name|default='智创科技'}成立于2010年,是一家专注于企业数字化转型的高新技术企业。</p>
<p>我们拥有200+专业团队,服务覆盖全国30+城市,累计为1000+企业提供优质解决方案。公司始终秉持"客户至上、创新驱动、诚信共赢"的核心价值观,致力于成为最受尊敬的企业服务品牌。</p>
<p>凭借深厚的技术积累和行业洞察,我们已成功帮助众多企业实现业务增长与效率提升,在金融、制造、零售、政务等多个领域树立了标杆案例。</p>
<a href="{:url('page/contact')}" class="layui-btn intro-btn">联系我们 <i class="layui-icon layui-icon-right"></i></a>
</div>
</div>
<div class="layui-col-md6">
<div class="intro-image">
<img src="/static/images/about-img.jpg" alt="公司环境" loading="lazy">
<div class="image-badge">10年行业经验</div>
</div>
</div>
</div>
</div>
<div class="stats-section">
<div class="layui-row layui-col-space20">
<div class="layui-col-md3 layui-col-sm6">
<div class="stat-item">
<div class="num">10<span></span></div>
<div class="label">行业经验</div>
</div>
</div>
<div class="layui-col-md3 layui-col-sm6">
<div class="stat-item">
<div class="num">1000<span>+</span></div>
<div class="label">服务客户</div>
</div>
</div>
<div class="layui-col-md3 layui-col-sm6">
<div class="stat-item">
<div class="num">200<span>+</span></div>
<div class="label">专业团队</div>
</div>
</div>
<div class="layui-col-md3 layui-col-sm6">
<div class="stat-item">
<div class="num">99<span>%</span></div>
<div class="label">客户满意度</div>
</div>
</div>
</div>
</div>
<div class="culture-section">
<h2 class="section-title">企业文化</h2>
<div class="layui-row layui-col-space30">
<div class="layui-col-md4">
<div class="culture-card">
<div class="culture-icon"><i class="layui-icon layui-icon-heart"></i></div>
<h3>企业使命</h3>
<p>用科技赋能企业,助力客户实现可持续增长</p>
</div>
</div>
<div class="layui-col-md4">
<div class="culture-card">
<div class="culture-icon"><i class="layui-icon layui-icon-auz"></i></div>
<h3>企业愿景</h3>
<p>成为全球领先的企业数字化服务提供商</p>
</div>
</div>
<div class="layui-col-md4">
<div class="culture-card">
<div class="culture-icon"><i class="layui-icon layui-icon-dialogue"></i></div>
<h3>核心价值观</h3>
<p>诚信 · 创新 · 协作 · 共赢</p>
</div>
</div>
</div>
</div>
<div class="timeline-section">
<h2 class="section-title">发展历程</h2>
<div class="timeline">
<div class="timeline-item">
<div class="timeline-dot"></div>
<div class="timeline-content">
<h4>2010年</h4>
<p>公司成立,专注企业软件定制开发</p>
</div>
</div>
<div class="timeline-item">
<div class="timeline-dot"></div>
<div class="timeline-content">
<h4>2015年</h4>
<p>服务客户突破300家,获得国家高新技术企业认证</p>
</div>
</div>
<div class="timeline-item">
<div class="timeline-dot"></div>
<div class="timeline-content">
<h4>2019年</h4>
<p>推出企业数字化平台,服务范围扩展至全国</p>
</div>
</div>
<div class="timeline-item">
<div class="timeline-dot"></div>
<div class="timeline-content">
<h4>2023年</h4>
<p>客户数量突破1000家,启动国际化战略</p>
</div>
</div>
</div>
</div>
</div>
</div>
<style>
.about-intro { margin: 50px 0; }
.intro-content h2 { font-size: 28px; margin-bottom: 20px; color: #333; }
.highlight { font-weight: bold; color: #1E9FFF; margin: 15px 0; display: block; }
.intro-btn { margin-top: 20px; background: #1E9FFF; border-color: #1E9FFF; }
.intro-image { position: relative; border-radius: 8px; overflow: hidden; box-shadow: 0 5px 20px rgba(0,0,0,0.15); }
.image-badge { position: absolute; bottom: 20px; right: 20px; background: rgba(30, 159, 255, 0.9); color: #fff; padding: 5px 15px; border-radius: 20px; font-weight: bold; }
.stats-section { background: #f9f9f9; padding: 40px 0; margin: 40px 0; border-radius: 8px; }
.stat-item { text-align: center; padding: 20px; }
.num { font-size: 42px; font-weight: bold; color: #1E9FFF; margin-bottom: 10px; }
.num span { font-size: 24px; }
.label { font-size: 16px; color: #666; }
.culture-card { text-align: center; padding: 30px 20px; border-radius: 8px; background: #fff; box-shadow: 0 3px 10px rgba(0,0,0,0.08); transition: transform 0.3s; margin-bottom: 20px; }
.culture-card:hover { transform: translateY(-5px); }
.culture-icon { width: 80px; height: 80px; line-height: 80px; margin: 0 auto 20px; border-radius: 50%; background: #e9f7fe; color: #1E9FFF; font-size: 32px; }
.timeline { position: relative; padding-left: 30px; margin-top: 30px; }
.timeline::before { content: ''; position: absolute; left: 0; top: 10px; bottom: 10px; width: 2px; background: #e9e9e9; }
.timeline-item { position: relative; padding-left: 30px; margin-bottom: 30px; }
.timeline-dot { position: absolute; left: -9px; top: 5px; width: 16px; height: 16px; border-radius: 50%; background: #1E9FFF; border: 3px solid #fff; box-shadow: 0 0 0 2px #1E9FFF; }
.timeline-content { background: #f9f9f9; padding: 15px 20px; border-radius: 6px; position: relative; }
.timeline-content::before { content: ''; position: absolute; left: -10px; top: 15px; width: 0; height: 0; border-top: 6px solid transparent; border-bottom: 6px solid transparent; border-right: 10px solid #f9f9f9; }
@media (max-width: 768px) {
.stats-section .layui-col-sm6 { margin-bottom: 20px; }
.timeline { padding-left: 25px; }
.timeline::before { left: 5px; }
.timeline-item { padding-left: 25px; }
.timeline-dot { left: -7px; }
}
</style>
+32
View File
@@ -0,0 +1,32 @@
<div class="page-header">
<div class="layui-container">
<h2>客户案例</h2>
<p>已服务数千家企业客户,用实力见证价值</p>
</div>
</div>
<div class="section">
<div class="layui-container">
<div class="card-grid">
{notempty name="cases"}
{volist name="cases" id="c"}
<div class="case-card">
<img src="{$c.logo}" style="width:100%;height:180px;object-fit:cover;border-radius:8px;margin-bottom:14px;" alt="{$c.title}">
<h4>{$c.title}</h4>
<p>{$c.brief}</p>
</div>
{/volist}
{else/}
<div class="empty-tip"><i class="layui-icon layui-icon-app"></i>暂无案例</div>
{/notempty}
</div>
</div>
</div>
<div class="home-cta">
<div class="layui-container">
<h3>想成为下一个成功案例?</h3>
<p>立即联系我们,获取专属数字化解决方案</p>
<a href="{:url('contact/index')}" class="banner-btn">联系我们</a>
</div>
</div>
+9
View File
@@ -0,0 +1,9 @@
<div class="section" style="text-align:center;padding:80px 0;">
<div class="layui-container">
<img src="/static/frontend/img/logo.png" style="width:80px;margin-bottom:20px;" alt="404">
<h1 style="font-size:120px;color:#1E9FFF;font-weight:bold;line-height:1;margin:0;">404</h1>
<p style="font-size:18px;color:#666;margin:20px 0 30px;">抱歉,您访问的页面不存在或已被移除</p>
<a href="{:url('index/index')}" class="layui-btn layui-btn-normal" style="height:44px;line-height:44px;padding:0 40px;font-size:16px;">返回首页</a>
<a href="{:url('contact/index')}" class="layui-btn layui-btn-primary" style="height:44px;line-height:44px;padding:0 40px;font-size:16px;margin-left:12px;">联系我们</a>
</div>
</div>
+29
View File
@@ -0,0 +1,29 @@
{notempty name="adSlots[$slot]"}
<div class="ad-slot ad-slot-{$slot}">
{volist name="adSlots[$slot]" id="ad"}
<div class="ad-item ad-type-{$ad.type}">
{switch name="ad.type"}
{case value="1"}
{if condition="$ad.url"}
<a href="{$ad.url}" target="_blank" rel="nofollow">
<img src="{$ad.image}" alt="{$ad.title}" title="{$ad.title}">
</a>
{else /}
<img src="{$ad.image}" alt="{$ad.title}" title="{$ad.title}">
{/if}
{/case}
{case value="2"}
{if condition="$ad.url"}
<a href="{$ad.url}" target="_blank" rel="nofollow" class="ad-text-link">{$ad.content}</a>
{else /}
<span class="ad-text">{$ad.content}</span>
{/if}
{/case}
{case value="3"}
{$ad.content|raw}
{/case}
{/switch}
</div>
{/volist}
</div>
{/notempty}
+25
View File
@@ -0,0 +1,25 @@
<div class="footer">
<div class="layui-container">
<p class="footer-web">
{volist name="links" id="link"}
<a href="{$link.url}">{$link.title}</a>
{/volist}
</p>
<div class="layui-row footer-contact">
<div class="layui-col-sm2 layui-col-lg1"><img src="/static/frontend/img/erweima.jpg"></div>
<div class="layui-col-sm10 layui-col-lg11">
<div class="layui-row">
<div class="layui-col-sm6 layui-col-md8 layui-col-lg9">
<p class="contact-top"><i class="layui-icon layui-icon-cellphone"></i>{$siteConf.telephone|default='YwxApp'}&nbsp;&nbsp;(9:00-18:00)</p>
<p class="contact-bottom"><i class="layui-icon layui-icon-home"></i>{$siteConf.site_email|default='YwxApp'} </span></p>
</div>
<div class="layui-col-sm6 layui-col-md4 layui-col-lg3">
<p class="contact-top"><span class="right"> © 2023 {$siteConf.site_name|default='YwxApp'} 版权所有</span>
<p class="contact-bottom"><span class="right"> <a href="http://beian.miit.gov.cn" target="_blank" class="icp-link">{$siteConf.beian|default='京ICP备12345678号'}</a></span></p>
</div>
</div>
</div>
</div>
</div>
</div>
+68
View File
@@ -0,0 +1,68 @@
<!-- 全站置顶公告条(方案 A -->
{notempty name="topNotices"}
<div class="site-notice-bar" id="siteNoticeBar">
{volist name="topNotices" id="nt"}
<div class="notice-item notice-type-{$nt.type}" data-id="{$nt.id}">
<span class="notice-badge">{$nt.type_text|default='公告'}</span>
<span class="notice-title">{$nt.title}</span>
<a href="{:url('notice/read', ['id'=>$nt.id])}" class="notice-link">查看详情</a>
<span class="notice-close" data-id="{$nt.id}" title="关闭">×</span>
</div>
{/volist}
</div>
<script>
(function () {
var KEY = 'closed_notices';
try {
var closed = JSON.parse(localStorage.getItem(KEY) || '[]');
document.querySelectorAll('#siteNoticeBar .notice-item').forEach(function (el) {
if (closed.indexOf(el.getAttribute('data-id')) > -1) el.style.display = 'none';
});
document.querySelectorAll('#siteNoticeBar .notice-close').forEach(function (btn) {
btn.addEventListener('click', function () {
var id = btn.getAttribute('data-id');
btn.closest('.notice-item').style.display = 'none';
var arr = JSON.parse(localStorage.getItem(KEY) || '[]');
if (arr.indexOf(id) === -1) { arr.push(id); localStorage.setItem(KEY, JSON.stringify(arr)); }
});
});
} catch (e) {}
})();
</script>
{/notempty}
<!-- 重构导航:彻底解决移动端Logo重合 -->
<header class="main-header">
<div class="layui-container header-container">
<div class="header-inner">
<div class="logo-box">
<a href="{:url('index/index')}" class=" ">
<span class="logo-text">{$siteConf.sitename|default='YwxApp'}</span>
</a>
</div>
<div class="nav-trigger" id="navToggle">
<span></span><span></span><span></span>
</div>
<ul class="nav-menu" id="navMenu">
{volist name="navMenus" id="m"}
<li class="nav-item {if $m.ctrl == $site.controller}active{/if}{if !empty($m.child)} has-child{/if}">
<a href="{if strpos($m.url,'http')===0}{$m.url}{else/}{:url($m.url)}{/if}">
{if !empty($m.icon)}<i class="layui-icon {$m.icon}"></i> {/if}{$m.title}
</a>
{if !empty($m.child)}
<ul class="sub-menu">
{volist name="m.child" id="c"}
<li class="sub-item {if $c.ctrl == $site.controller}active{/if}">
<a href="{if strpos($c.url,'http')===0}{$c.url}{else/}{:url($c.url)}{/if}">
{if !empty($c.icon)}<i class="layui-icon {$c.icon}"></i> {/if}{$c.title}
</a>
</li>
{/volist}
</ul>
{/if}
</li>
{/volist}
</ul>
</div>
</div>
</header>
+130
View File
@@ -0,0 +1,130 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>{$title|default='YwxApp'}</title>
<meta name="keywords" content="{$seo_keywords|default=''}">
<meta name="description" content="{$seo_description|default=''}">
<link rel="stylesheet" href="/assets/layui/css/layui.css">
<link rel="stylesheet" href="/static/frontend/css/responsive.css?v=3.0">
<link rel="stylesheet" href="/static/frontend/css/style.css?v=1.2">
{block name="style"}{/block}
</head>
<body>
{include file="common/header" /}
<main class="main-wrapper">
{__CONTENT__}
</main>
{include file="common/footer" /}
<!-- 首页底部广告位(全站预埋钩子:仅当挂在首页时由 index 页控制,此处留作通用容器) -->
{notempty name="adSlots.home_bottom"}
<div class="ad-slot ad-slot-home_bottom">
{volist name="adSlots.home_bottom" id="ad"}
<div class="ad-item ad-type-{$ad.type}">
{switch name="ad.type"}
{case value="1"}<a href="{$ad.url}" target="_blank" rel="nofollow"><img src="{$ad.image}" alt="{$ad.title}" title="{$ad.title}"></a>{/case}
{case value="2"}<a href="{$ad.url}" target="_blank" rel="nofollow" class="ad-text-link">{$ad.content}</a>{/case}
{case value="3"}{$ad.content|raw}{/case}
{/switch}
</div>
{/volist}
</div>
{/notempty}
<!-- 全站悬浮角标广告位(固定右下角,无数据时自动隐藏) -->
{notempty name="adSlots.float"}
<div class="ad-float" id="adFloat">
{volist name="adSlots.float" id="ad"}
<div class="ad-float-item ad-type-{$ad.type}">
{switch name="ad.type"}
{case value="1"}<a href="{$ad.url}" target="_blank" rel="nofollow"><img src="{$ad.image}" alt="{$ad.title}" title="{$ad.title}"></a>{/case}
{case value="2"}<a href="{$ad.url}" target="_blank" rel="nofollow" class="ad-text-link">{$ad.content}</a>{/case}
{case value="3"}{$ad.content|raw}{/case}
{/switch}
</div>
{/volist}
<span class="ad-float-close" id="adFloatClose" title="关闭">×</span>
</div>
{/notempty}
<!-- 全站弹窗广告位 -->
{notempty name="adSlots.popup"}
<div class="ad-popup-mask" id="adPopupMask">
<div class="ad-popup-box">
<span class="ad-popup-close" id="adPopupClose" title="关闭">×</span>
{volist name="adSlots.popup" id="ad"}
<div class="ad-popup-item ad-type-{$ad.type}">
{switch name="ad.type"}
{case value="1"}
{if condition="$ad.url"}<a href="{$ad.url}" target="_blank" rel="nofollow">{/if}
<img src="{$ad.image}" alt="{$ad.title}" title="{$ad.title}">
{if condition="$ad.url"}</a>{/if}
{/case}
{case value="2"}
{if condition="$ad.url"}<a href="{$ad.url}" target="_blank" rel="nofollow" class="ad-text-link">{/if}{$ad.content}{if condition="$ad.url"}</a>{/if}
{/case}
{case value="3"}
{$ad.content|raw}
{/case}
{/switch}
</div>
{/volist}
</div>
</div>
{/notempty}
<script src="/assets/layui/layui.js"></script>
<script src="/static/frontend/js/main.js?v=2.1"></script>
{block name="script"}{/block}
<script>
(function () {
var mask = document.getElementById('adPopupMask');
if (!mask) return;
var KEY = 'closed_popup_ads';
try {
if (localStorage.getItem(KEY) === '1') { mask.style.display = 'none'; return; }
} catch (e) {}
mask.style.display = 'flex';
var closeBtn = document.getElementById('adPopupClose');
if (closeBtn) {
closeBtn.addEventListener('click', function () {
mask.style.display = 'none';
try { localStorage.setItem(KEY, '1'); } catch (e) {}
});
mask.addEventListener('click', function (e) {
if (e.target === mask) {
mask.style.display = 'none';
try { localStorage.setItem(KEY, '1'); } catch (e) {}
}
});
}
})();
// 全站悬浮角标广告:关闭按钮
(function () {
var box = document.getElementById('adFloat');
if (!box) return;
var KEY = 'closed_float_ads';
try {
if (localStorage.getItem(KEY) === '1') { box.style.display = 'none'; return; }
} catch (e) {}
var closeBtn = document.getElementById('adFloatClose');
if (closeBtn) {
closeBtn.addEventListener('click', function (e) {
e.stopPropagation();
box.style.display = 'none';
try { localStorage.setItem(KEY, '1'); } catch (e2) {}
});
}
})();
</script>
</body>
</html>
+250
View File
@@ -0,0 +1,250 @@
<div class="page-header">
<div class="layui-container">
<div class="layui-row">
<div class="layui-col-md12">
<div class="breadcrumb">
<span class="layui-breadcrumb">
<a href="{:url('index/index')}"><i class="layui-icon layui-icon-home"></i> 首页</a>
<a><cite>联系我们</cite></a>
</span>
</div>
<h1 class="page-title">联系我们</h1>
<p class="page-desc">期待与您合作,共创美好未来</p>
</div>
</div>
</div>
</div>
<div class="contact-section">
<div class="layui-container">
<div class="layui-row layui-col-space30">
<div class="layui-col-md6">
<div class="contact-info-panel">
<h2><i class="layui-icon layui-icon-location"></i> 联系方式</h2>
<div class="info-grid">
<div class="info-item">
<div class="icon"><i class="layui-icon layui-icon-cellphone"></i></div>
<div class="content">
<h4>联系电话</h4>
<p><a href="tel:{$contact_phone|default='4008889999'}" class="phone-link">{$contact_phone|default='400-888-9999'}</a></p>
<p class="desc">工作日 9:00-18:00</p>
</div>
</div>
<div class="info-item">
<div class="icon"><i class="layui-icon layui-icon-email"></i></div>
<div class="content">
<h4>电子邮箱</h4>
<p><a href="mailto:{$contact_email|default='service@zhichuang.com'}">{$contact_email|default='service@zhichuang.com'}</a></p>
<p class="desc">24小时内回复</p>
</div>
</div>
<div class="info-item">
<div class="icon"><i class="layui-icon layui-icon-location"></i></div>
<div class="content">
<h4>公司地址</h4>
<p>{$company_address|default='北京市海淀区中关村大厦18层'}</p>
<p class="desc">欢迎来访,请提前预约</p>
</div>
</div>
<div class="info-item">
<div class="icon"><i class="layui-icon layui-icon-time"></i></div>
<div class="content">
<h4>工作时间</h4>
<p>周一至周五 9:00 - 18:00</p>
<p class="desc">节假日除外</p>
</div>
</div>
</div>
</div>
<div class="map-container">
<h2><i class="layui-icon layui-icon-map"></i> 公司位置</h2>
<div id="baiduMap" style="height: 300px; border-radius: 8px; overflow: hidden; box-shadow: 0 3px 10px rgba(0,0,0,0.1);"></div>
<p class="map-tip">* 地图位置仅供参考,具体位置请以实际导航为准</p>
</div>
</div>
<div class="layui-col-md6">
<div class="message-panel">
<h2><i class="layui-icon layui-icon-edit"></i> 在线留言</h2>
<form class="layui-form" action="" method="post">
<div class="layui-form-item">
<label class="layui-form-label">您的姓名</label>
<div class="layui-input-block">
<input type="text" name="name" required lay-verify="required" placeholder="请输入姓名" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">联系电话</label>
<div class="layui-input-block">
<input type="tel" name="phone" required lay-verify="phone" placeholder="请输入手机号" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">电子邮箱</label>
<div class="layui-input-block">
<input type="email" name="email" lay-verify="email" placeholder="请输入邮箱" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">留言类型</label>
<div class="layui-input-block">
<select name="type" lay-verify="required">
<option value="">请选择</option>
<option value="1">商务合作</option>
<option value="2">技术支持</option>
<option value="3">人才招聘</option>
<option value="4">其他咨询</option>
</select>
</div>
</div>
<div class="layui-form-item layui-form-text">
<label class="layui-form-label">留言内容</label>
<div class="layui-input-block">
<textarea name="content" required lay-verify="required" placeholder="请输入留言内容(至少10字)" class="layui-textarea" lay-verify="content"></textarea>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">验证码</label>
<div class="layui-input-inline" style="width: 150px;">
<input type="text" name="captcha" required lay-verify="required" placeholder="请输入验证码" autocomplete="off" class="layui-input">
</div>
<div class="layui-form-mid">
<img src="/static/images/captcha.jpg" alt="验证码" class="captcha-img" id="captchaImg">
<a href="javascript:;" id="refreshCaptcha" class="refresh-link">看不清?换一张</a>
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn btn-submit" lay-submit lay-filter="formSubmit">提交留言</button>
<button type="reset" class="layui-btn layui-btn-primary">重置内容</button>
</div>
</div>
<div class="form-tip">
<p><i class="layui-icon layui-icon-dialogue"></i> 我们将在24小时内回复您的留言,请保持电话畅通</p>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
<!-- 服务网点 -->
<div class="branch-section">
<div class="layui-container">
<h2 class="section-title">全国服务网点</h2>
<div class="branch-grid">
<div class="branch-item">
<h4>北京总部</h4>
<p>北京市海淀区中关村大厦18层</p>
<p>010-8888 9999</p>
</div>
<div class="branch-item">
<h4>上海分公司</h4>
<p>上海市浦东新区陆家嘴环路1000号</p>
<p>021-6666 8888</p>
</div>
<div class="branch-item">
<h4>深圳分公司</h4>
<p>深圳市南山区科技园科兴科学园A座</p>
<p>0755-2222 6666</p>
</div>
<div class="branch-item">
<h4>成都分公司</h4>
<p>成都市高新区天府大道北段1700号</p>
<p>028-5555 7777</p>
</div>
</div>
</div>
</div>
<script src="https://api.map.baidu.com/api?v=3.0&ak=您的百度地图AK"></script>
<script>
layui.use(['form', 'layer'], function(){
var form = layui.form;
var layer = layui.layer;
// 表单验证
form.verify({
content: function(value){
if(value.length < 10){
return '留言内容不能少于10个字符';
}
},
phone: [/^1[3-9]\d{9}$/, '手机号格式不正确']
});
// 表单提交
form.on('submit(formSubmit)', function(data){
// 实际项目中应通过AJAX提交
layer.msg('留言提交成功!我们将在24小时内与您联系', {icon: 1, time: 3000});
// 清空表单(实际项目中应保留用户输入)
// this.reset();
return false; // 阻止表单跳转
});
// 刷新验证码
document.getElementById('refreshCaptcha').onclick = function(){
var img = document.getElementById('captchaImg');
img.src = '/static/images/captcha.jpg?t=' + new Date().getTime();
};
// 百度地图初始化
function initMap() {
var map = new BMap.Map("baiduMap");
var point = new BMap.Point(116.331398, 39.897445); // 示例坐标(北京)
map.centerAndZoom(point, 16);
map.enableScrollWheelZoom(true);
// 添加标注
var marker = new BMap.Marker(point);
map.addOverlay(marker);
// 添加信息窗口
var infoWindow = new BMap.InfoWindow("<b>智创科技总部</b><br>北京市海淀区中关村大厦18层");
marker.addEventListener("click", function(){
this.openInfoWindow(infoWindow);
});
marker.openInfoWindow(infoWindow);
}
// 延迟初始化地图(确保容器已渲染)
setTimeout(initMap, 500);
});
</script>
<style>
.contact-info-panel h2, .message-panel h2, .map-container h2 {
border-left: 3px solid #1E9FFF;
padding-left: 12px;
margin-bottom: 25px;
font-size: 20px;
}
.info-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 20px; }
.info-item { display: flex; padding: 15px; background: #f9f9f9; border-radius: 6px; transition: all 0.3s; }
.info-item:hover { background: #e9f7fe; transform: translateX(5px); }
.icon { width: 40px; height: 40px; line-height: 40px; text-align: center; border-radius: 50%; background: #1E9FFF; color: #fff; flex-shrink: 0; margin-right: 15px; font-size: 18px; }
.content h4 { font-weight: bold; margin-bottom: 5px; color: #333; font-size: 16px; }
.content p { margin: 3px 0; color: #666; }
.phone-link { color: #1E9FFF; font-weight: bold; font-size: 18px; display: block; margin: 3px 0; }
.desc { color: #999; font-size: 13px; }
.map-tip { text-align: center; color: #999; font-size: 13px; margin-top: 8px; }
.message-panel .layui-form-label { width: 80px; padding-left: 10px; }
.message-panel .layui-input-block { margin-left: 100px; }
.captcha-img { height: 38px; border-radius: 4px; vertical-align: middle; margin-right: 8px; }
.refresh-link { color: #1E9FFF; font-size: 13px; vertical-align: middle; }
.form-tip { margin-top: 15px; padding: 12px; background: #e9f7fe; border-radius: 4px; color: #1E9FFF; }
.form-tip i { margin-right: 5px; }
.branch-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 25px; margin-top: 30px; }
.branch-item { text-align: center; padding: 25px 15px; background: #fff; border-radius: 8px; box-shadow: 0 3px 10px rgba(0,0,0,0.08); transition: all 0.3s; }
.branch-item:hover { transform: translateY(-5px); box-shadow: 0 5px 15px rgba(0,0,0,0.15); }
.branch-item h4 { color: #1E9FFF; font-size: 18px; margin-bottom: 10px; }
.branch-item p { color: #666; line-height: 1.6; margin: 5px 0; }
@media (max-width: 768px) {
.info-grid { grid-template-columns: 1fr; }
.message-panel .layui-form-label { width: 70px; }
.message-panel .layui-input-block { margin-left: 80px; }
.branch-grid { grid-template-columns: 1fr; }
}
</style>
+25
View File
@@ -0,0 +1,25 @@
<div class="page-header">
<div class="layui-container">
<h2>开发文档</h2>
<p>完善的文档与示例,助你快速上手 YwxApp</p>
</div>
</div>
<div class="section">
<div class="layui-container">
<div class="doc-list">
{notempty name="docs"}
{volist name="docs" id="d"}
<a class="doc-item" href="{$d.url}" target="_blank">
<span class="doc-tag">文档</span>
<span class="doc-title">{$d.title}</span>
<span class="doc-time" style="flex:1;text-align:left;margin-left:10px;color:#999;">{$d.desc}</span>
<span class="doc-arrow"></span>
</a>
{/volist}
{else/}
<div class="doc-item"><span class="doc-tag">文档</span><span class="doc-title">暂无文档</span></div>
{/notempty}
</div>
</div>
</div>
+43
View File
@@ -0,0 +1,43 @@
<div class="page-header">
<div class="layui-container">
<h2>{$item.title|default='特性详情'}</h2>
<p>功能特性 / 详细说明</p>
</div>
</div>
<div class="section">
<div class="layui-container">
<div class="layui-row layui-col-space30">
<div class="layui-col-md9">
<div class="news-detail">
<div class="detail-title">{$item.title|default='特性详情'}</div>
<div class="detail-content">
<p style="font-size:16px;color:#555;margin-bottom:20px;">{$item.summary|default=''}</p>
<h4 style="margin:20px 0 12px;color:#1E9FFF;">核心要点</h4>
<ul class="feature-points">
{notempty name="item.points"}
{volist name="item.points" id="pt"}<li><i class="layui-icon layui-icon-ok-circle"></i> {$pt}</li>{/volist}
{/notempty}
</ul>
<h4 style="margin:24px 0 12px;color:#1E9FFF;">代码示例</h4>
<pre class="code-block">{$item.code|default='// 暂无示例'}</pre>
</div>
</div>
<div style="margin-top:24px;">
<a href="{:url('feature/index')}" class="layui-btn layui-btn-primary">&lt; 返回特性列表</a>
</div>
</div>
<div class="layui-col-md3">
<div class="feature-card" style="text-align:left;">
<div class="icon"><i class="layui-icon layui-icon-list"></i></div>
<h4>全部特性</h4>
{notempty name="items"}
{volist name="items" id="it"}
<p style="margin:6px 0;"><a href="{:url('feature/detail', ['name'=>$key])}" style="color:#666;">• {$it.title}</a></p>
{/volist}
{/notempty}
</div>
</div>
</div>
</div>
</div>
+51
View File
@@ -0,0 +1,51 @@
<div class="page-header">
<div class="layui-container">
<h2>功能特性</h2>
<p>深入了解 YwxApp 框架的设计理念与核心能力</p>
</div>
</div>
<div class="section">
<div class="layui-container">
<div class="card-grid">
{notempty name="items"}
{volist name="items" id="it"}
<div class="feature-card">
<div class="icon"><i class="layui-icon layui-icon-{$it.icon|default='component'}"></i></div>
<h4>{$it.title}</h4>
<p>{$it.summary}</p>
<a href="{:url('feature/detail', ['name'=>$key])}" class="layui-btn layui-btn-primary layui-btn-sm" style="margin-top:12px;">查看详情</a>
</div>
{/volist}
{else/}
<div class="feature-card"><div class="icon"><i class="layui-icon layui-icon-plugin"></i></div><h4>插件机制</h4><p>热插拔插件架构</p></div>
<div class="feature-card"><div class="icon"><i class="layui-icon layui-icon-app"></i></div><h4>多应用架构</h4><p>多应用隔离</p></div>
<div class="feature-card"><div class="icon"><i class="layui-icon layui-icon-vip"></i></div><h4>会员/支付</h4><p>免签支付链路</p></div>
<div class="feature-card"><div class="icon"><i class="layui-icon layui-icon-doc"></i></div><h4>文档/示例</h4><p>完善文档体系</p></div>
{/notempty}
</div>
</div>
</div>
<!-- 详情锚点区 -->
<div class="section" style="background:#f7f9fb;">
<div class="layui-container">
{notempty name="items"}
{volist name="items" id="it"}
<div class="about-section" id="{$key}" style="margin-bottom:50px;">
<div class="about-text">
<h3>{$it.title}</h3>
<p>{$it.summary}</p>
<ul class="feature-points">
{volist name="it.points" id="pt"}<li><i class="layui-icon layui-icon-ok-circle"></i> {$pt}</li>{/volist}
</ul>
<a href="{:url('feature/detail', ['name'=>$key])}" class="layui-btn layui-btn-normal layui-btn-sm">阅读完整说明</a>
</div>
<div class="about-img">
<pre class="code-block">{$it.code|default=''}</pre>
</div>
</div>
{/volist}
{/notempty}
</div>
</div>
+90
View File
@@ -0,0 +1,90 @@
<div class="page-header">
<div class="layui-container">
<div class="layui-row">
<div class="layui-col-md12">
<div class="breadcrumb">
<span class="layui-breadcrumb">
<a href="{:url('index/index')}"><i class="layui-icon layui-icon-home"></i> 首页</a>
<a><cite>帮助中心</cite></a>
</span>
</div>
<h1 class="page-title">帮助中心</h1>
<p class="page-desc">新手指南、常见问题与使用说明,帮你快速上手</p>
</div>
</div>
</div>
</div>
<div class="help-section">
<div class="layui-container">
<div class="layui-row layui-col-space30">
<div class="layui-col-md3">
<div class="help-sidemenu">
{volist name="categories" id="cat"}
<div class="help-sidemenu-group">
<div class="help-sidemenu-title">{$cat.name}</div>
<ul>
{volist name="cat.items" id="item"}
<li><a href="{:url('help/read', ['id'=>$item.id])}">{$item.title}</a></li>
{/volist}
</ul>
</div>
{/volist}
{empty name="categories"}
<div class="empty-container">
<i class="layui-icon layui-icon-face-smile" style="font-size: 60px; color: #ccc;"></i>
<p>暂无帮助内容</p>
</div>
{/empty}
</div>
</div>
<div class="layui-col-md9">
<div class="help-content-card">
{volist name="categories" id="cat"}
<div class="help-block">
<h2 class="help-block-title">{$cat.name}</h2>
<ul class="help-block-list">
{volist name="cat.items" id="item"}
<li>
<a href="{:url('help/read', ['id'=>$item.id])}" class="help-link">
<span class="help-link-title">{$item.title}</span>
<span class="help-link-meta"><i class="layui-icon layui-icon-eye"></i> {$item.view_count|default=0}</span>
</a>
</li>
{/volist}
</ul>
</div>
{/volist}
{empty name="categories"}
<div class="empty-container">
<i class="layui-icon layui-icon-face-smile" style="font-size: 60px; color: #ccc;"></i>
<p>暂无帮助内容</p>
</div>
{/empty}
</div>
<!-- 列表底部广告位 -->
{assign name="slot" value="list_bottom" /}{include file="common/adslot" /}
</div>
</div>
</div>
</div>
<style>
.help-sidemenu { background: #fff; border: 1px solid #eee; border-radius: 8px; padding: 12px 0; position: sticky; top: 20px; }
.help-sidemenu-group { padding: 8px 0; }
.help-sidemenu-group + .help-sidemenu-group { border-top: 1px solid #f5f5f5; }
.help-sidemenu-title { font-weight: 700; color: #333; padding: 6px 18px; font-size: 14px; }
.help-sidemenu ul { list-style: none; margin: 0; padding: 0; }
.help-sidemenu li a { display: block; padding: 6px 18px 6px 28px; color: #666; text-decoration: none; font-size: 14px; }
.help-sidemenu li a:hover { background: #f0f7ff; color: #1E9FFF; }
.help-content-card { background: #fff; border: 1px solid #eee; border-radius: 8px; padding: 24px 28px; }
.help-block + .help-block { margin-top: 26px; padding-top: 26px; border-top: 1px solid #f0f0f0; }
.help-block-title { font-size: 18px; font-weight: 700; color: #222; margin: 0 0 14px; }
.help-block-list { list-style: none; margin: 0; padding: 0; }
.help-block-list li { border-bottom: 1px solid #f5f5f5; }
.help-block-list li:last-child { border-bottom: none; }
.help-link { display: flex; align-items: center; justify-content: space-between; padding: 12px 6px; color: #444; text-decoration: none; transition: color .2s; }
.help-link:hover { color: #1E9FFF; }
.help-link-title { font-size: 15px; }
.help-link-meta { color: #999; font-size: 13px; display: inline-flex; align-items: center; gap: 3px; }
</style>
+51
View File
@@ -0,0 +1,51 @@
<div class="page-header">
<div class="layui-container">
<div class="layui-row">
<div class="layui-col-md12">
<div class="breadcrumb">
<span class="layui-breadcrumb">
<a href="{:url('index/index')}"><i class="layui-icon layui-icon-home"></i> 首页</a>
<a href="{:url('help/index')}">帮助中心</a>
<a><cite>{$info.title|default=''}</cite></a>
</span>
</div>
</div>
</div>
</div>
</div>
<div class="help-detail">
<div class="layui-container">
<div class="layui-row">
<div class="layui-col-md12">
<div class="help-detail-card">
<div class="help-detail-head">
{notempty name="info.category"}<span class="help-badge">{$info.category}</span>{/notempty}
<h1 class="help-detail-title">{$info.title}</h1>
<div class="help-detail-meta">
<span><i class="layui-icon layui-icon-date"></i> {$info.create_at|substr=0,16}</span>
<span><i class="layui-icon layui-icon-eye"></i> {$info.view_count|default=0}</span>
</div>
</div>
<div class="help-detail-content">
{:nl2br(htmlspecialchars($info.content))}
</div>
<div class="help-detail-back">
<a href="{:url('help/index')}" class="layui-btn layui-btn-primary"><i class="layui-icon layui-icon-return"></i> 返回帮助中心</a>
</div>
</div>
</div>
</div>
</div>
</div>
<style>
.help-detail-card { background: #fff; border: 1px solid #eee; border-radius: 8px; padding: 30px 36px; margin-bottom: 30px; }
.help-detail-head { border-bottom: 1px solid #f0f0f0; padding-bottom: 18px; margin-bottom: 22px; }
.help-badge { display: inline-block; color: #fff; background: #16b8a6; border-radius: 3px; padding: 2px 10px; font-size: 13px; margin-bottom: 10px; }
.help-detail-title { font-size: 24px; font-weight: 700; color: #222; margin: 12px 0 14px; line-height: 1.4; }
.help-detail-meta { display: flex; flex-wrap: wrap; gap: 18px; color: #999; font-size: 13px; }
.help-detail-meta span { display: inline-flex; align-items: center; gap: 3px; }
.help-detail-content { font-size: 15px; line-height: 2; color: #444; white-space: pre-wrap; word-break: break-word; }
.help-detail-back { margin-top: 30px; }
</style>
+125
View File
@@ -0,0 +1,125 @@
{block name="style"}
<link rel="stylesheet" href="/static/frontend/css/index.css">
{/block}
<!-- banner部分 -->
<div>
<div class="layui-carousel" id="banner">
<div carousel-item>
<div>
<img src="/static/frontend/img/banner1.jpg">
<div class="panel">
<p class="title">网络公司</p>
<p>完美前端体验</p>
</div>
</div>
<div>
<img src="/static/frontend/img/banner2.jpg">
<div class="panel">
<p class="title">网络公司</p>
<p>完美前端体验</p>
</div>
</div>
</div>
</div>
</div>
<!-- 首页顶部横幅广告位 -->
{assign name="slot" value="home_top" /}{include file="common/adslot" /}
<!-- main部分 -->
<div class="main-product">
<div class="layui-container">
<p class="title">专为前端而研制的<span>核心产品</span></p>
<div class="layui-row layui-col-space25">
<div class="layui-col-sm6 layui-col-md3">
<div class="content">
<div><img src="/static/frontend/img/Big_icon1.png"></div>
<div>
<p class="label">JS基础库</p>
<p>从小屏逐步扩展到大屏,最终实现所有屏幕适配,适应移动互联潮流。</p>
</div>
<a href="javascript:;">查看产品 ></a>
</div>
</div>
<div class="layui-col-sm6 layui-col-md3 ">
<div class="content">
<div><img src="/static/frontend/img/Big_icon2.png"></div>
<div>
<p class="label">CSS处理</p>
<p>从小屏逐步扩展到大屏,最终实现所有屏幕适配,适应移动互联潮流。</p>
</div>
<a href="javascript:;">查看产品 ></a>
</div>
</div>
<div class="layui-col-sm6 layui-col-md3 ">
<div class="content">
<div><img src="/static/frontend/img/Big_icon3.png"></div>
<div>
<p class="label">兼容性</p>
<p>从小屏逐步扩展到大屏,最终实现所有屏幕适配,适应移动互联潮流。</p>
</div>
<a href="javascript:;">查看产品 ></a>
</div>
</div>
<div class="layui-col-sm6 layui-col-md3 ">
<div class="content">
<div><img src="/static/frontend/img/Big_icon4.png"></div>
<div>
<p class="label">响应式</p>
<p>从小屏逐步扩展到大屏,最终实现所有屏幕适配,适应移动互联潮流。</p>
</div>
<a href="javascript:;">查看产品 ></a>
</div>
</div>
</div>
</div>
</div>
<div class="main-service">
<div class="layui-container">
<!-- 首页侧边广告位(右侧浮层) -->
{assign name="slot" value="home_side" /}{include file="common/adslot" /}
<p class="title">为客户打造完美的<span>专业服务</span></p>
<div class="layui-row layui-col-space25 layui-col-space80">
<div class="layui-col-sm6">
<div class="content">
<div class="content-left"><img src="/static/frontend/img/home_img1.jpg"></div>
<div class="content-right">
<p class="label">1 对 1 前端指导</p>
<span></span>
<p>更有多个包含不同主题的Web组件,可快速构建界面出色、体验优秀的跨屏页面,大幅提升开发效率。</p>
</div>
</div>
</div>
<div class="layui-col-sm6">
<div class="content">
<div class="content-left"><img src="/static/frontend/img/home_img2.jpg"></div>
<div class="content-right">
<p class="label">1 对 1 前端指导</p>
<span></span>
<p>更有多个包含不同主题的Web组件,可快速构建界面出色、体验优秀的跨屏页面,大幅提升开发效率。</p>
</div>
</div>
</div>
<div class="layui-col-sm6">
<div class="content">
<div class="content-left"><img src="/static/frontend/img/home_img3.jpg"></div>
<div class="content-right">
<p class="label">1 对 1 前端指导</p>
<span></span>
<p>更有多个包含不同主题的Web组件,可快速构建界面出色、体验优秀的跨屏页面,大幅提升开发效率。</p>
</div>
</div>
</div>
<div class="layui-col-sm6">
<div class="content">
<div class="content-left"><img src="/static/frontend/img/home_img4.jpg"></div>
<div class="content-right">
<p class="label">1 对 1 前端指导</p>
<span></span>
<p>更有多个包含不同主题的Web组件,可快速构建界面出色、体验优秀的跨屏页面,大幅提升开发效率。</p>
</div>
</div>
</div>
</div>
<div class="service-more"><a href="">查看更多</a></div>
</div>
</div>
+118
View File
@@ -0,0 +1,118 @@
<div class="page-header detail-header" style="background-image: linear-gradient(rgba(0,0,0,0.7), rgba(0,0,0,0.7)), url('{$news.thumb|default='/static/images/news-banner.jpg'}')">
<div class="layui-container">
<div class="layui-row">
<div class="layui-col-md12">
<div class="breadcrumb">
<span class="layui-breadcrumb">
<a href="{:url('index/index')}"><i class="layui-icon layui-icon-home"></i> 首页</a>
<a href="{:url('news/index')}">企业动态</a>
<a><cite>{$news.category_name|default='公司新闻'}</cite></a>
</span>
</div>
<h1 class="detail-title">{$news.title}</h1>
<div class="detail-meta">
<span><i class="layui-icon layui-icon-date"></i> {:date('Y-m-d H:i', strtotime($news.create_time))}</span>
<span><i class="layui-icon layui-icon-user"></i> {$news.author|default='智创科技'}</span>
<span><i class="layui-icon layui-icon-eye"></i> 浏览 {$news.views|default=0} 次</span>
</div>
</div>
</div>
</div>
</div>
<div class="detail-section">
<div class="layui-container">
<div class="layui-row layui-col-space30">
<div class="layui-col-md8 layui-col-sm12">
<div class="article-content">
{:htmlspecialchars_decode($news.content)}
</div>
<div class="article-tags">
<span class="label">标签:</span>
{volist name=":explode(',', $news.tags)" id="tag"}
<span class="tag-item">{$tag}</span>
{/volist}
</div>
<div class="article-nav">
{if condition="$prev"}
<a href="{:url('news/detail', ['id'=>$prev.id])}" class="prev-article">
<i class="layui-icon layui-icon-left"></i> 上一篇:{$prev.title|mb_substr=0,25,'utf-8'}
</a>
{/if}
{if condition="$next"}
<a href="{:url('news/detail', ['id'=>$next.id])}" class="next-article">
下一篇:{$next.title|mb_substr=0,25,'utf-8'} <i class="layui-icon layui-icon-right"></i>
</a>
{/if}
</div>
<div class="related-news">
<h3>相关推荐</h3>
<div class="news-list">
{volist name="related_news" id="vo" length="3"}
<div class="news-item simple">
<span class="date">{:date('m-d', strtotime($vo.create_time))}</span>
<a href="{:url('news/detail', ['id'=>$vo.id])}">{$vo.title|mb_substr=0,30,'utf-8'}</a>
</div>
{/volist}
</div>
</div>
</div>
<div class="layui-col-md4 layui-col-sm12">
<div class="sidebar-panel">
<h3><i class="layui-icon layui-icon-note"></i> 最新动态</h3>
<ul class="sidebar-list">
{volist name="sidebar_news" id="vo" length="5"}
<li>
<a href="{:url('news/detail', ['id'=>$vo.id])}">
<span class="date">{:date('m-d', strtotime($vo.create_time))}</span>
<span class="title">{$vo.title|mb_substr=0,28,'utf-8'}</span>
</a>
</li>
{/volist}
</ul>
</div>
<div class="sidebar-panel mt20">
<h3><i class="layui-icon layui-icon-service"></i> 联系我们</h3>
<div class="contact-mini">
<p><i class="layui-icon layui-icon-cellphone"></i> {$contact_phone|default='400-888-9999'}</p>
<p><i class="layui-icon layui-icon-email"></i> {$contact_email|default='service@zhichuang.com'}</p>
<a href="{:url('page/contact')}" class="layui-btn layui-btn-sm layui-btn-fluid">立即咨询</a>
</div>
</div>
</div>
</div>
</div>
</div>
<style>
.detail-header { height: 400px; background-size: cover; background-position: center; color: #fff; text-align: center; padding-top: 100px; }
.detail-title { font-size: 36px; margin: 20px 0; text-shadow: 0 2px 5px rgba(0,0,0,0.3); }
.detail-meta { font-size: 16px; color: rgba(255,255,255,0.9); margin-top: 15px; }
.detail-meta span { margin: 0 15px; }
@media (max-width: 768px) {
.detail-header { height: 320px; padding-top: 80px; }
.detail-title { font-size: 26px; }
.detail-meta { font-size: 14px; flex-wrap: wrap; }
}
.article-content { line-height: 1.8; font-size: 16px; color: #333; margin-bottom: 30px; }
.article-content img { max-width: 100%; height: auto; margin: 15px 0; border-radius: 4px; box-shadow: 0 2px 8px rgba(0,0,0,0.1); }
.article-tags { margin: 25px 0; padding: 15px; background: #f9f9f9; border-radius: 4px; }
.tag-item { display: inline-block; padding: 3px 10px; margin: 5px 5px 0 0; background: #e9f7fe; color: #1E9FFF; border-radius: 3px; font-size: 13px; }
.article-nav { display: flex; justify-content: space-between; margin: 30px 0; }
.article-nav a { display: block; padding: 12px 20px; background: #f5f5f5; border-radius: 4px; color: #333; transition: all 0.3s; width: 48%; }
.article-nav a:hover { background: #1E9FFF; color: #fff; transform: translateY(-2px); }
@media (max-width: 768px) {
.article-nav { flex-direction: column; }
.article-nav a { width: 100%; margin-bottom: 10px; }
}
.related-news h3, .sidebar-panel h3 { border-left: 3px solid #1E9FFF; padding-left: 10px; margin-bottom: 15px; font-size: 18px; }
.sidebar-list li { padding: 10px 0; border-bottom: 1px dashed #eee; }
.sidebar-list li:last-child { border-bottom: none; }
.sidebar-list .date { color: #999; font-size: 13px; margin-right: 8px; display: inline-block; width: 40px; }
.contact-mini p { margin: 8px 0; font-size: 14px; }
</style>
+93
View File
@@ -0,0 +1,93 @@
<div class="page-header">
<div class="layui-container">
<div class="layui-row">
<div class="layui-col-md12">
<div class="breadcrumb">
<span class="layui-breadcrumb">
<a href="{:url('index/index')}"><i class="layui-icon layui-icon-home"></i> 首页</a>
<a><cite>企业动态</cite></a>
</span>
</div>
<h1 class="page-title">企业动态</h1>
<p class="page-desc">了解我们的最新动态与行业洞察</p>
</div>
</div>
</div>
</div>
<div class="news-section">
<div class="layui-container">
<div class="layui-row">
<div class="layui-col-md12">
<div class="news-filter">
<div class="filter-title">分类筛选:</div>
<ul class="filter-list">
<li class="active">全部</li>
<li>公司新闻</li>
<li>行业动态</li>
<li>技术分享</li>
<li>客户案例</li>
</ul>
</div>
<div class="news-grid">
{volist name="news_list" id="vo"}
<div class="news-card">
<div class="news-thumb">
<a href="{:url('news/detail', ['id'=>$vo.id])}">
<img src="{$vo.thumb|default='/static/images/news-default.jpg'}" alt="{$vo.title}" loading="lazy">
<div class="overlay"></div>
<div class="date-tag">
<span class="day">{:date('d', strtotime($vo.create_time))}</span>
<span class="month">{:date('m', strtotime($vo.create_time))}月</span>
</div>
</a>
</div>
<div class="news-content">
<div class="category-tag">{$vo.category_name|default='公司新闻'}</div>
<h3><a href="{:url('news/detail', ['id'=>$vo.id])}">{$vo.title}</a></h3>
<p class="summary">{$vo.description|default=mb_substr(strip_tags($vo.content),0,80,'utf-8')}</p>
<div class="news-footer">
<div class="meta">
<span><i class="layui-icon layui-icon-date"></i> {:date('Y-m-d', strtotime($vo.create_time))}</span>
<span><i class="layui-icon layui-icon-eye"></i> {$vo.views|default=0}</span>
</div>
<a href="{:url('news/detail', ['id'=>$vo.id])}" class="read-more">阅读更多 <i class="layui-icon layui-icon-right"></i></a>
</div>
</div>
</div>
{/volist}
{empty name="news_list"}
<div class="empty-container">
<i class="layui-icon layui-icon-face-smile" style="font-size: 60px; color: #ccc;"></i>
<p>暂无动态数据,敬请期待</p>
</div>
{/empty}
</div>
<!-- 分页 -->
{notempty name="news_list"}
<div class="page-pagination">
{$news_list->render()}
</div>
{/notempty}
</div>
<!-- 列表底部广告位 -->
{assign name="slot" value="list_bottom" /}{include file="common/adslot" /}
</div>
</div>
</div>
<style>
.news-filter { margin-bottom: 30px; padding: 15px 0; border-bottom: 1px solid #eee; }
.filter-title { display: inline-block; font-weight: bold; margin-right: 15px; color: #333; }
.filter-list { display: inline-block; }
.filter-list li { display: inline-block; padding: 5px 15px; margin-right: 8px; border-radius: 20px; background: #f5f5f5; cursor: pointer; transition: all 0.3s; }
.filter-list li.active, .filter-list li:hover { background: #1E9FFF; color: #fff; }
.news-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 25px; }
@media (max-width: 768px) {
.news-grid { grid-template-columns: 1fr; }
.filter-list li { padding: 4px 12px; font-size: 13px; }
}
</style>
+99
View File
@@ -0,0 +1,99 @@
<div class="page-header">
<div class="layui-container">
<div class="layui-row">
<div class="layui-col-md12">
<div class="breadcrumb">
<span class="layui-breadcrumb">
<a href="{:url('index/index')}"><i class="layui-icon layui-icon-home"></i> 首页</a>
<a><cite>站点公告</cite></a>
</span>
</div>
<h1 class="page-title">站点公告</h1>
<p class="page-desc">系统维护、活动与版本更新等官方通知</p>
</div>
</div>
</div>
</div>
<div class="news-section">
<div class="layui-container">
<div class="layui-row">
<div class="layui-col-md12">
<div class="news-filter">
<div class="filter-title">分类筛选:</div>
<ul class="filter-list">
<li class="{eq name='type' value='0'}active{/eq}"><a href="{:url('notice/index', ['type'=>0])}">全部</a></li>
{volist name="type_list" id="t"}
<li class="{eq name='type' value='$key'}active{/eq}"><a href="{:url('notice/index', ['type'=>$key])}">{$t}</a></li>
{/volist}
</ul>
</div>
<div class="notice-list">
{volist name="items" id="vo"}
<div class="notice-row {eq name='vo.is_top' value='1'}is-top{/eq}">
<div class="notice-row-head">
<span class="notice-badge notice-type-{$vo.type}">{$vo.type_text}</span>
{eq name='vo.is_top' value='1'}<span class="top-flag">置顶</span>{/eq}
<a href="{:url('notice/read', ['id'=>$vo.id])}" class="notice-row-title">{$vo.title}</a>
</div>
<div class="notice-row-summary">{:mb_substr(strip_tags($vo.content),0,120,'utf-8')}{:strlen(strip_tags($vo.content))>120?'…':''}</div>
<div class="notice-row-meta">
<span><i class="layui-icon layui-icon-user"></i> {$vo.author|default='官方'}</span>
<span><i class="layui-icon layui-icon-date"></i> {$vo.create_at|substr=0,16}</span>
<span><i class="layui-icon layui-icon-eye"></i> {$vo.view_count|default=0}</span>
{if condition="$vo.start_time > 0 || $vo.end_time > 0"}
<span><i class="layui-icon layui-icon-time"></i>
{$vo.start_time>0?date('Y-m-d',$vo.start_time):'长期'} ~
{$vo.end_time>0?date('Y-m-d',$vo.end_time):'长期'}
</span>
{/if}
</div>
</div>
{/volist}
{empty name="items"}
<div class="empty-container">
<i class="layui-icon layui-icon-face-smile" style="font-size: 60px; color: #ccc;"></i>
<p>暂无公告</p>
</div>
{/empty}
</div>
{notempty name="list"}
<div class="page-pagination">
{$list->render()}
</div>
{/notempty}
</div>
<!-- 列表底部广告位 -->
{assign name="slot" value="list_bottom" /}{include file="common/adslot" /}
</div>
</div>
</div>
<style>
.notice-list { display: flex; flex-direction: column; gap: 14px; }
.notice-row { background: #fff; border: 1px solid #eee; border-radius: 8px; padding: 16px 18px; transition: box-shadow .2s; }
.notice-row:hover { box-shadow: 0 4px 16px rgba(0,0,0,.08); }
.notice-row.is-top { border-color: #ffe58f; background: #fffdf5; }
.notice-row-head { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; }
.notice-badge { flex: none; color: #fff; border-radius: 3px; padding: 1px 8px; font-size: 12px; background: #8c8c8c; }
.notice-type-1 { background: #1890ff; }
.notice-type-2 { background: #fa8c16; }
.notice-type-3 { background: #52c41a; }
.notice-type-4 { background: #8c8c8c; }
.top-flag { flex: none; color: #d46b08; font-size: 12px; border: 1px solid #ffd591; border-radius: 3px; padding: 0 6px; }
.notice-row-title { font-size: 16px; font-weight: 600; color: #333; text-decoration: none; }
.notice-row-title:hover { color: #1E9FFF; }
.notice-row-summary { color: #666; font-size: 14px; line-height: 1.7; margin-bottom: 10px; }
.notice-row-meta { display: flex; flex-wrap: wrap; gap: 16px; color: #999; font-size: 13px; }
.notice-row-meta span { display: inline-flex; align-items: center; gap: 3px; }
.news-filter { margin-bottom: 24px; padding: 15px 0; border-bottom: 1px solid #eee; }
.filter-title { display: inline-block; font-weight: bold; margin-right: 15px; color: #333; }
.filter-list { display: inline-block; }
.filter-list li { display: inline-block; padding: 5px 15px; margin-right: 8px; border-radius: 20px; background: #f5f5f5; }
.filter-list li.active, .filter-list li:hover { background: #1E9FFF; }
.filter-list li.active a, .filter-list li:hover a { color: #fff; }
.filter-list li a { color: #555; text-decoration: none; }
</style>
+64
View File
@@ -0,0 +1,64 @@
<div class="page-header">
<div class="layui-container">
<div class="layui-row">
<div class="layui-col-md12">
<div class="breadcrumb">
<span class="layui-breadcrumb">
<a href="{:url('index/index')}"><i class="layui-icon layui-icon-home"></i> 首页</a>
<a href="{:url('notice/index')}">站点公告</a>
<a><cite>{$info.title|default=''}</cite></a>
</span>
</div>
</div>
</div>
</div>
</div>
<div class="notice-detail">
<div class="layui-container">
<div class="layui-row">
<div class="layui-col-md12">
<div class="notice-detail-card">
<div class="notice-detail-head">
<span class="notice-badge notice-type-{$info.type}">{$info.type_text}</span>
{eq name='info.is_top' value='1'}<span class="top-flag">置顶</span>{/eq}
<h1 class="notice-detail-title">{$info.title}</h1>
<div class="notice-detail-meta">
<span><i class="layui-icon layui-icon-user"></i> {$info.author|default='官方'}</span>
<span><i class="layui-icon layui-icon-date"></i> {$info.create_at|substr=0,16}</span>
<span><i class="layui-icon layui-icon-eye"></i> {$info.view_count|default=0}</span>
{if condition="$info.start_time > 0 || $info.end_time > 0"}
<span><i class="layui-icon layui-icon-time"></i>
{$info.start_time>0?date('Y-m-d',$info.start_time):'长期'} ~
{$info.end_time>0?date('Y-m-d',$info.end_time):'长期'}
</span>
{/if}
</div>
</div>
<div class="notice-detail-content">
{:nl2br(htmlspecialchars($info.content))}
</div>
<div class="notice-detail-back">
<a href="{:url('notice/index')}" class="layui-btn layui-btn-primary"><i class="layui-icon layui-icon-return"></i> 返回公告列表</a>
</div>
</div>
</div>
</div>
</div>
</div>
<style>
.notice-detail-card { background: #fff; border: 1px solid #eee; border-radius: 8px; padding: 30px 36px; margin-bottom: 30px; }
.notice-detail-head { border-bottom: 1px solid #f0f0f0; padding-bottom: 18px; margin-bottom: 22px; }
.notice-badge { display: inline-block; color: #fff; border-radius: 3px; padding: 2px 10px; font-size: 13px; background: #8c8c8c; }
.notice-type-1 { background: #1890ff; }
.notice-type-2 { background: #fa8c16; }
.notice-type-3 { background: #52c41a; }
.notice-type-4 { background: #8c8c8c; }
.top-flag { display: inline-block; color: #d46b08; font-size: 12px; border: 1px solid #ffd591; border-radius: 3px; padding: 1px 8px; margin-left: 6px; }
.notice-detail-title { font-size: 24px; font-weight: 700; color: #222; margin: 12px 0 14px; line-height: 1.4; }
.notice-detail-meta { display: flex; flex-wrap: wrap; gap: 18px; color: #999; font-size: 13px; }
.notice-detail-meta span { display: inline-flex; align-items: center; gap: 3px; }
.notice-detail-content { font-size: 15px; line-height: 2; color: #444; white-space: pre-wrap; word-break: break-word; }
.notice-detail-back { margin-top: 30px; }
</style>
+46
View File
@@ -0,0 +1,46 @@
<div class="page-header">
<div class="layui-container">
<h2>插件市场</h2>
<p>数百款插件与模板,即装即用,快速构建业务</p>
</div>
</div>
<div class="section">
<div class="layui-container">
{notempty name="err_msg"}
<div class="layui-bg-red" style="color:#fff;padding:12px 16px;border-radius:6px;margin-bottom:20px;">{$err_msg}</div>
{/notempty}
{notempty name="categories"}
<div class="plugin-cats" style="margin-bottom:24px;text-align:center;">
{volist name="categories" id="c"}
<span class="layui-badge layui-bg-blue" style="margin:4px;padding:6px 14px;">{$c.name}</span>
{/volist}
</div>
{/notempty}
<div class="card-grid">
{notempty name="plugins"}
{volist name="plugins" id="p"}
<div class="case-card" style="text-align:left;">
<div style="display:flex;align-items:center;margin-bottom:12px;">
{notempty name="p.logo"}<img src="{$p.logo}" style="width:48px;height:48px;border-radius:8px;margin-right:12px;">{/notempty}
<div>
<h4 style="margin:0;">{$p.title}</h4>
<span class="layui-badge-rim">{$p.category|default='插件'}</span>
</div>
</div>
<p style="color:#666;font-size:14px;line-height:1.7;min-height:42px;">{$p.desc|default='—'}</p>
<div style="display:flex;justify-content:space-between;align-items:center;margin-top:10px;">
<span style="color:#ff5722;font-weight:bold;">{$p.price_text}</span>
<span style="color:#999;font-size:13px;"><i class="layui-icon layui-icon-download-circle"></i> {$p.downloads}</span>
</div>
<a href="javascript:;" class="layui-btn layui-btn-normal layui-btn-sm" style="width:100%;margin-top:10px;">查看详情</a>
</div>
{/volist}
{else/}
<div class="empty-tip" style="grid-column:1/-1;"><i class="layui-icon layui-icon-app"></i>暂无可展示的插件,请连接应用市场</div>
{/notempty}
</div>
</div>
</div>
+44
View File
@@ -0,0 +1,44 @@
<div class="page-header">
<div class="layui-container">
<h2>{$product.name}</h2>
<p>产品中心 / 详情</p>
</div>
</div>
<div class="section">
<div class="layui-container">
<div class="layui-row layui-col-space30">
<div class="layui-col-md8">
<div class="news-detail">
<div class="about-section" style="margin-bottom:20px;">
<div class="about-img" style="flex:0 0 120px;">
<div class="icon" style="font-size:60px;color:#1E9FFF;"><i class="layui-icon layui-icon-{$product.icon|default='component'}"></i></div>
</div>
<div class="about-text">
<h3>{$product.name}</h3>
<p>{$product.brief}</p>
</div>
</div>
<div class="detail-content">
<p style="font-size:15px;line-height:2;color:#555;">{$product.content}</p>
</div>
</div>
<div style="margin-top:24px;">
<a href="{:url('product/index')}" class="layui-btn layui-btn-primary">&lt; 返回产品列表</a>
<a href="{:url('contact/index')}" class="layui-btn layui-btn-normal">咨询购买</a>
</div>
</div>
<div class="layui-col-md4">
<div class="feature-card" style="text-align:left;">
<div class="icon"><i class="layui-icon layui-icon-app"></i></div>
<h4>相关产品</h4>
<p style="margin:6px 0;"><a href="{:url('product/read', ['id'=>2])}" style="color:#666;">• 电商系统</a></p>
<p style="margin:6px 0;"><a href="{:url('product/read', ['id'=>3])}" style="color:#666;">• 会员中心</a></p>
<p style="margin:6px 0;"><a href="{:url('product/read', ['id'=>4])}" style="color:#666;">• 表单引擎</a></p>
<p style="margin:6px 0;"><a href="{:url('product/read', ['id'=>5])}" style="color:#666;">• 数据分析</a></p>
<p style="margin:6px 0;"><a href="{:url('product/read', ['id'=>6])}" style="color:#666;">• 应用市场</a></p>
</div>
</div>
</div>
</div>
</div>
+38
View File
@@ -0,0 +1,38 @@
<div class="page-header">
<div class="layui-container">
<h2>产品中心</h2>
<p>覆盖企业核心场景的完整产品矩阵</p>
</div>
</div>
<div class="section">
<div class="layui-container">
{notempty name="cats"}
<div class="plugin-cats" style="margin-bottom:24px;text-align:center;">
{volist name="cats" id="c"}
<span class="layui-badge layui-bg-blue" style="margin:4px;padding:6px 14px;">{$c.name}</span>
{/volist}
</div>
{/notempty}
<div class="card-grid">
{notempty name="products"}
{volist name="products" id="p"}
<div class="product-card">
<div class="icon"><i class="layui-icon layui-icon-{$p.icon|default='component'}"></i></div>
<h4>{$p.name}</h4>
<p>{$p.brief|default='企业级解决方案,助力业务增长'}</p>
<a href="{:url('product/read', ['id'=>$p.id])}" class="layui-btn layui-btn-primary layui-btn-sm" style="margin-top:12px;">查看详情</a>
</div>
{/volist}
{else/}
<div class="product-card"><div class="icon"><i class="layui-icon layui-icon-template"></i></div><h4>企业官网</h4><p>多套精美模板,可视化建站</p><a href="javascript:;" class="layui-btn layui-btn-primary layui-btn-sm" style="margin-top:12px;">查看详情</a></div>
<div class="product-card"><div class="icon"><i class="layui-icon layui-icon-cart"></i></div><h4>电商系统</h4><p>商品、订单、支付一体化</p><a href="javascript:;" class="layui-btn layui-btn-primary layui-btn-sm" style="margin-top:12px;">查看详情</a></div>
<div class="product-card"><div class="icon"><i class="layui-icon layui-icon-user"></i></div><h4>会员中心</h4><p>统一账号体系与权限管理</p><a href="javascript:;" class="layui-btn layui-btn-primary layui-btn-sm" style="margin-top:12px;">查看详情</a></div>
<div class="product-card"><div class="icon"><i class="layui-icon layui-icon-form"></i></div><h4>表单引擎</h4><p>拖拽式表单,零代码采集</p><a href="javascript:;" class="layui-btn layui-btn-primary layui-btn-sm" style="margin-top:12px;">查看详情</a></div>
<div class="product-card"><div class="icon"><i class="layui-icon layui-icon-chart"></i></div><h4>数据分析</h4><p>多维度报表与可视化大屏</p><a href="javascript:;" class="layui-btn layui-btn-primary layui-btn-sm" style="margin-top:12px;">查看详情</a></div>
<div class="product-card"><div class="icon"><i class="layui-icon layui-icon-app"></i></div><h4>应用市场</h4><p>海量插件即装即用</p><a href="javascript:;" class="layui-btn layui-btn-primary layui-btn-sm" style="margin-top:12px;">查看详情</a></div>
{/notempty}
</div>
</div>
</div>
+55
View File
@@ -0,0 +1,55 @@
<!-- 框架 Hero -->
<div class="home-carousel">
<div class="banner-item" style="background:linear-gradient(120deg,#1E9FFF 0%,#16b8a6 100%);">
<div class="banner-inner">
<h2>YwxApp 企业级开发框架</h2>
<p>基于 ThinkPHP6 多应用架构,插件化、模块化,让业务快速落地</p>
<a href="{:url('feature/index')}" class="banner-btn">探索特性</a>
</div>
</div>
</div>
<!-- 数据概览 -->
<div class="section" style="padding:36px 0;">
<div class="layui-container">
<div class="about-stats" style="justify-content:center;gap:80px;">
<div class="stat"><div class="num">{$pluginCount|default=0}</div><div class="label">可用插件</div></div>
<div class="stat"><div class="num">{$appCount|default=4}</div><div class="label">应用模块</div></div>
<div class="stat"><div class="num">TP6</div><div class="label">底层引擎</div></div>
<div class="stat"><div class="num">MIT</div><div class="label">开源协议</div></div>
</div>
</div>
</div>
<!-- 四大特性 -->
<div class="section" style="background:#f7f9fb;">
<div class="layui-container">
<div class="section-title"><h3>核心特性</h3><p>框架为业务而生</p></div>
<div class="card-grid">
{notempty name="features"}
{volist name="features" id="f"}
<div class="feature-card">
<div class="icon"><i class="layui-icon layui-icon-{$f.icon|default='component'}"></i></div>
<h4>{$f.title}</h4>
<p>{$f.desc}</p>
<a href="{$f.url}" class="layui-btn layui-btn-primary layui-btn-sm" style="margin-top:12px;">了解更多</a>
</div>
{/volist}
{else/}
<div class="feature-card"><div class="icon"><i class="layui-icon layui-icon-plugin"></i></div><h4>插件机制</h4><p>热插拔插件,钩子自动注册,与业务解耦。</p></div>
<div class="feature-card"><div class="icon"><i class="layui-icon layui-icon-app"></i></div><h4>多应用架构</h4><p>api/backend/member/frontend 多应用隔离。</p></div>
<div class="feature-card"><div class="icon"><i class="layui-icon layui-icon-vip"></i></div><h4>会员/支付</h4><p>免签支付 + 会员开通事件链,到账自动开通。</p></div>
<div class="feature-card"><div class="icon"><i class="layui-icon layui-icon-doc"></i></div><h4>文档/示例</h4><p>完善的开发文档与快速开始指南。</p></div>
{/notempty}
</div>
</div>
</div>
<!-- 行动号召 -->
<div class="home-cta">
<div class="layui-container">
<h3>立即开始构建你的业务</h3>
<p>免费使用框架,按需获取插件与模板,快速上线</p>
<a href="{:url('plugin/index')}" class="banner-btn">前往插件市场</a>
</div>
</div>