Compare commits
204 Commits
a0045f2397
...
f7ced51c4d
| Author | SHA1 | Date | |
|---|---|---|---|
| f7ced51c4d | |||
| aee2f81601 | |||
| cc85925f37 | |||
| 8897a3bbda | |||
| 9292e40053 | |||
| 57058dd150 | |||
| 8237fb50ce | |||
| 6e2800f361 | |||
| 8bb323f3f5 | |||
| c85cb4af54 | |||
| 5d4baf4383 | |||
| dbf0a65ee7 | |||
| 46c72f1146 | |||
| 2a1c9f7825 | |||
| 878885377c | |||
| 8841bc9819 | |||
| bde8ef0bb3 | |||
| 8e78f95002 | |||
| 77706e5bcb | |||
| 1100e347bd | |||
| de44890014 | |||
| f970f22539 | |||
| 90c1be254b | |||
| 87c3180229 | |||
| 74942de6db | |||
| 04fb5cd3b1 | |||
| 52a1756d5b | |||
| ecd2602d35 | |||
| 0de7fce26d | |||
| 46b85b090d | |||
| 1074b99bb8 | |||
| 11091d46e9 | |||
| 4836f113fa | |||
| 9b7679af30 | |||
| cc8258c764 | |||
| f8734366f1 | |||
| b625a23856 | |||
| 6d2135b862 | |||
| 927c4c65a9 | |||
| 1295706704 | |||
| 50dade9517 | |||
| 26af0577ad | |||
| ec20bd3741 | |||
| c13fcc2cb9 | |||
| 74e7e145af | |||
| b68c56cfdc | |||
| e60b2a02a1 | |||
| 9a9b714aad | |||
| 9ab935e1ff | |||
| c5e28d153d | |||
| 023ebf775d | |||
| f086dd0239 | |||
| 69e45a8044 | |||
| bdd6a7ba34 | |||
| cbb6bc144b | |||
| 304f7c460d | |||
| 163de38bb2 | |||
| 62baecc835 | |||
| 1dd37485a2 | |||
| 6eca3790d3 | |||
| 61c7d32f50 | |||
| 35e11d7d8f | |||
| 999bb94f70 | |||
| bd9e6009ad | |||
| 47d9be28fa | |||
| e765dd4153 | |||
| 207106c34c | |||
| 2af9f63b83 | |||
| dd3672c93a | |||
| 9fb3d8f874 | |||
| 519160218f | |||
| 81ec4a84a8 | |||
| a29e95a951 | |||
| 239bb64e9a | |||
| 774954c70b | |||
| a3f8668b60 | |||
| 3cb48fd462 | |||
| 778e7180d7 | |||
| 1eecd80340 | |||
| 0ba42e2a20 | |||
| 55e8e914fb | |||
| 37828dafca | |||
| 043bac94ec | |||
| e7b76ea68b | |||
| e9a2165b10 | |||
| 93bf23f307 | |||
| fcd562595d | |||
| 4444875e48 | |||
| 5e8f7549e0 | |||
| f0ea57c19f | |||
| ed8ae64cac | |||
| 4b3f626443 | |||
| d06378e264 | |||
| 0ea2fbeb1f | |||
| cb5f4a6148 | |||
| fed50a9f4c | |||
| d94ceb2a9c | |||
| 307c80e5e9 | |||
| 873d043e45 | |||
| dd328e5b9e | |||
| fb135cd1dc | |||
| 65b1fcd992 | |||
| 7ac132a182 | |||
| 929608b9b9 | |||
| cdd4d0d09f | |||
| 9c4cccbeb0 | |||
| 34866fd9fe | |||
| c9107fce72 | |||
| 4953163892 | |||
| cb87b3203c | |||
| 35329b25e8 | |||
| 6dd714dce7 | |||
| 80dbc75c73 | |||
| e76fcf2822 | |||
| b4b36aa988 | |||
| 20deefdd5f | |||
|
|
475fe19d84 | ||
|
|
eba4a1c96e | ||
| b4903854c1 | |||
| 44057cb26d | |||
| c5f88098f5 | |||
| 9a220bbb97 | |||
| 8ec4fd9dce | |||
|
|
2566538006 | ||
|
|
64ff307d57 | ||
| e7a232ac9c | |||
| 4f3c5fdee2 | |||
| eea5f83afc | |||
| 53086a83d1 | |||
| 96d693af64 | |||
|
|
70266967e1 | ||
|
|
24959571b7 | ||
|
|
5c4aa9e21d | ||
|
|
474ea78de5 | ||
|
|
addf3abae0 | ||
| ed5f6e0642 | |||
| d2bb8fbf01 | |||
| 421d549109 | |||
| a2d03eb0d0 | |||
| 425a438852 | |||
|
|
ac249f0a18 | ||
| 55b45a0aef | |||
| e6733ba338 | |||
| cea787d493 | |||
| a8f3aa3a1b | |||
| c8284568aa | |||
| 306d3faa71 | |||
| 49193a8d52 | |||
| c138bf501e | |||
| 127901d864 | |||
| 5a15210d00 | |||
| 184595ce36 | |||
| 4214331fd3 | |||
| 57aba229cd | |||
| add17eac0c | |||
| 8f9e304294 | |||
| 6bd988f257 | |||
| 0665cccd9d | |||
| 80e4b502d1 | |||
| d522c862c2 | |||
| 8eee103fb6 | |||
|
|
41fc9b81e7 | ||
|
|
414b79c2d8 | ||
| f48f2265d8 | |||
| 50f4e5db55 | |||
| adbfc34f9d | |||
| aa4d5b5f31 | |||
| 0c4c40ce7f | |||
| abef3a7750 | |||
| e746952c11 | |||
| 00f3cda6ac | |||
| a823cfaf91 | |||
| 51d31a1a6d | |||
| b2699a952e | |||
| 5c84e7e390 | |||
| 648fde842c | |||
| e927468965 | |||
| a8f7758f46 | |||
| a79adefd64 | |||
| 76a652661c | |||
|
|
357f1fa4c0 | ||
|
|
c0227d2d4a | ||
| 4779280647 | |||
| 776163bb09 | |||
| 2333dcd188 | |||
| 9f0ad41e8f | |||
| 230114d110 | |||
|
|
0f1e480935 | ||
|
|
e70b793e2b | ||
| a1412898af | |||
| 69fe15b9b6 | |||
| ae8fc70e97 | |||
| 56029236bd | |||
| fa2b67c5b5 | |||
| 38ad0bc700 | |||
|
|
3e8643d1fa | ||
|
|
bd0cde3261 | ||
| 76b987205f | |||
|
|
77bd7e1031 | ||
|
|
65d636177f | ||
| 888fed6390 | |||
|
|
8891017cef | ||
| 01a2bfe4c7 | |||
| dbf693d674 |
18
.env.local
18
.env.local
@@ -35,3 +35,21 @@ MAX_ATTACHMENT_SIZE = 100mb; # 附件上传最大限制
|
|||||||
[OPENAPI]
|
[OPENAPI]
|
||||||
RESOURCE_IMAGES_DOMAIN = http://local.orico.com; # 图片资源服务器地址
|
RESOURCE_IMAGES_DOMAIN = http://local.orico.com; # 图片资源服务器地址
|
||||||
RESOURCE_VIDEOS_DOMAIN = http://local.orico.com; # 视频资源服务器地址
|
RESOURCE_VIDEOS_DOMAIN = http://local.orico.com; # 视频资源服务器地址
|
||||||
|
|
||||||
|
# 视图模板规则配置
|
||||||
|
[VIEW_TPL]
|
||||||
|
# 视图目录
|
||||||
|
# query 规则:URL参数 mtpl=1 表示移动端访问
|
||||||
|
# 例如:http://xxxx.com?mtpl=1
|
||||||
|
# domain 规则:根据特定域名,判断是否移动端访问
|
||||||
|
# 例如:http://mobile.orico.cn
|
||||||
|
RULE = query
|
||||||
|
# query 规则参数名
|
||||||
|
RULE_QUERY_NAME = mtpl
|
||||||
|
# query 规则参数值
|
||||||
|
RULE_QUERY_VALUE = 1
|
||||||
|
# domain 规则协议
|
||||||
|
RULE_DOMAIN_SCHEME[] = http
|
||||||
|
RULE_DOMAIN_SCHEME[] = https
|
||||||
|
# domain 规则域名
|
||||||
|
RULE_DOMAIN_HOST = mobile.orico.cn
|
||||||
217
app/admin/controller/ReceiveProductSync.php
Normal file
217
app/admin/controller/ReceiveProductSync.php
Normal file
@@ -0,0 +1,217 @@
|
|||||||
|
<?php
|
||||||
|
declare (strict_types = 1);
|
||||||
|
|
||||||
|
namespace app\admin\controller;
|
||||||
|
|
||||||
|
use app\admin\model\v1\LanguageModel;
|
||||||
|
use app\admin\model\v1\ProductCategoryModel;
|
||||||
|
use app\admin\model\v1\ProductModel;
|
||||||
|
use app\admin\model\v1\ProductTcoCategoryModel;
|
||||||
|
use think\facade\Db;
|
||||||
|
|
||||||
|
class Operate_Of_ReceiveSync
|
||||||
|
{
|
||||||
|
const Add = 'add';
|
||||||
|
const Update = 'update';
|
||||||
|
const Enable = 'enable';
|
||||||
|
const Disable = 'disable';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 接收产品相关同步数据
|
||||||
|
*/
|
||||||
|
class ReceiveProductSync
|
||||||
|
{
|
||||||
|
// 接收产品目录分类同步数据
|
||||||
|
public function category()
|
||||||
|
{
|
||||||
|
$data = request()->post();
|
||||||
|
if (empty($data)) return error('请确认同步数据');
|
||||||
|
|
||||||
|
$validate = validate([
|
||||||
|
'name|分类名称' => 'require',
|
||||||
|
'erp_code|分类ERP编码' => 'require',
|
||||||
|
]);
|
||||||
|
if (!$validate->check($data)) {
|
||||||
|
return error((string)$validate->getError());
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取对应语言ID
|
||||||
|
$lang_id = LanguageModel::where('code', $data['lang'])->value('id');
|
||||||
|
if (empty($lang_id)) {
|
||||||
|
return error('语言不存在');
|
||||||
|
}
|
||||||
|
|
||||||
|
Db::startTrans();
|
||||||
|
try {
|
||||||
|
$tco_category_data = [
|
||||||
|
'language_id' => $lang_id,
|
||||||
|
'name' => $data['name'],
|
||||||
|
'tco_id' => $data['tco_id'],
|
||||||
|
'tco_pid' => $data['tco_pid'],
|
||||||
|
'tco_path' => $data['tco_path'],
|
||||||
|
'erp_id' => $data['erp_id'],
|
||||||
|
'erp_pid' => $data['erp_pid'],
|
||||||
|
'erp_code' => $data['erp_code'],
|
||||||
|
'erp_path' => $data['erp_path'],
|
||||||
|
'disabled' => Operate_Of_ReceiveSync::Disable == $data['operate'] ? 1 : 0,
|
||||||
|
'sync_time' => strtotime($data['created_at'])
|
||||||
|
];
|
||||||
|
$tco_category = ProductTcoCategoryModel::language($lang_id)->erpCode($tco_category_data['erp_code'])->find();
|
||||||
|
if (empty($tco_category)) {
|
||||||
|
$tco_category = ProductTcoCategoryModel::create($tco_category_data);
|
||||||
|
if ($tco_category->isEmpty()) {
|
||||||
|
throw new \Exception('产品目录分类创建失败');
|
||||||
|
}
|
||||||
|
|
||||||
|
$category_data = [
|
||||||
|
'language_id' => $lang_id,
|
||||||
|
'unique_id' => uniqid('PRO_CATE_'),
|
||||||
|
'pid' => 0,
|
||||||
|
'path' => '',
|
||||||
|
'name' => $tco_category_data['name'],
|
||||||
|
'icon' => '',
|
||||||
|
'desc' => '',
|
||||||
|
'related_tco_category' => $tco_category['id'],
|
||||||
|
'sort' => 0,
|
||||||
|
'level' => 1,
|
||||||
|
'is_show' => 1,
|
||||||
|
];
|
||||||
|
$tco_parent = ProductTcoCategoryModel::language($lang_id)->tcoId($tco_category['tco_pid'])->find();
|
||||||
|
if (!empty($tco_parent)) {
|
||||||
|
$parent = ProductCategoryModel::language($lang_id)->tcoId($tco_parent['id'])->find();
|
||||||
|
if ($parent->isEmpty()) {
|
||||||
|
throw new \Exception('产品分类父级不存在');
|
||||||
|
}
|
||||||
|
$category_data['pid'] = $parent['id'];
|
||||||
|
$category_data['path'] = $parent['path'] . $parent['pid'];
|
||||||
|
$category_data['level'] = $parent['level'] + 1;
|
||||||
|
}
|
||||||
|
$category = ProductCategoryModel::create($category_data);
|
||||||
|
if ($category->isEmpty()) {
|
||||||
|
throw new \Exception('产品分类创建失败');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ($tco_category['sync_time'] < $tco_category_data['sync_time']) {
|
||||||
|
$success = $tco_category->save($tco_category_data);
|
||||||
|
if (!$success) {
|
||||||
|
throw new \Exception('产品目录分类更新失败');
|
||||||
|
}
|
||||||
|
|
||||||
|
$category = ProductCategoryModel::language($lang_id)->tcoId($tco_category['id'])->find();
|
||||||
|
$tco_parent = ProductTcoCategoryModel::language($lang_id)->tcoId($tco_category['tco_pid'])->find();
|
||||||
|
if (!empty($tco_parent)) {
|
||||||
|
$parent = ProductCategoryModel::language($lang_id)->tcoId($tco_parent['id'])->find();
|
||||||
|
if ($parent->isEmpty()) {
|
||||||
|
throw new \Exception('产品分类父级不存在');
|
||||||
|
}
|
||||||
|
$category['pid'] = $parent['id'];
|
||||||
|
$category['path'] = $parent['path'] . $parent['pid'];
|
||||||
|
$category['level'] = $parent['level'] + 1;
|
||||||
|
}
|
||||||
|
if (!$category->save($category)) {
|
||||||
|
throw new \Exception('产品分类更新失败');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Db::commit();
|
||||||
|
} catch (\Throwable $th) {
|
||||||
|
Db::rollback();
|
||||||
|
return error(sprintf('%s %s:%d', $th->getMessage(), $th->getFile(), $th->getLine()));
|
||||||
|
}
|
||||||
|
|
||||||
|
return success('同步成功');
|
||||||
|
}
|
||||||
|
|
||||||
|
// 接收产品同步数据
|
||||||
|
public function product()
|
||||||
|
{
|
||||||
|
$data = request()->post();
|
||||||
|
if (empty($data)) {
|
||||||
|
return error('请确认同步数据');
|
||||||
|
}
|
||||||
|
|
||||||
|
$validate = validate([
|
||||||
|
'spu' => 'require',
|
||||||
|
'name' => 'require',
|
||||||
|
'category_erp_code' => 'require',
|
||||||
|
'lang' => 'require',
|
||||||
|
'created_at' => 'require',
|
||||||
|
]);
|
||||||
|
if (!$validate->check($data)) {
|
||||||
|
return error((string)$validate->getError());
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取对应语言ID
|
||||||
|
$lang_id = LanguageModel::where('code', $data['lang'])->value('id');
|
||||||
|
if (empty($lang_id)) {
|
||||||
|
return error('语言不存在');
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果 spu_before_modification 存在则根据 spu_before_modification 更新型号
|
||||||
|
$product = null;
|
||||||
|
if (!empty($data['spu_before_modification'])) {
|
||||||
|
$product = ProductModel::language($lang_id)->spu($data['spu_before_modification'])->find();
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
(empty($data['spu_before_modification']) && !empty($data['spu']))
|
||||||
|
// 避免 spu_before_modification 更新型号时,人为删除了旧型号导致的新增,从而出现重复型号问题,而进行再次验证
|
||||||
|
|| (!empty($data['spu_before_modification']) && empty($product))
|
||||||
|
) {
|
||||||
|
$product = ProductModel::language($lang_id)->spu($data['spu'])->find();
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
$product_tco_category = ProductTcoCategoryModel::language($lang_id)->erpCade($data['category_erp_code'])->find();
|
||||||
|
if (empty($product_tco_category)) {
|
||||||
|
throw new \Exception('官网未找到产品目录同步分类');
|
||||||
|
}
|
||||||
|
|
||||||
|
$product_category = ProductCategoryModel::language($lang_id)->tcoId($product_tco_category['id'])->find();
|
||||||
|
if (empty($product_category)) {
|
||||||
|
throw new \Exception('官网未找到产品目录同步分类关联的分类');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (empty($product)) {
|
||||||
|
$product = ProductModel::create([
|
||||||
|
'language_id' => $lang_id,
|
||||||
|
'category_id' => $product_category['id'],
|
||||||
|
'spu' => $data['spu'],
|
||||||
|
'name' => $data['name'],
|
||||||
|
'short_name' => '',
|
||||||
|
'cover_image' => '',
|
||||||
|
'desc' => '',
|
||||||
|
'video_img' => '',
|
||||||
|
'video_url' => '',
|
||||||
|
'is_sale' => 0,
|
||||||
|
'is_new' => 0,
|
||||||
|
'is_hot' => 0,
|
||||||
|
'is_show' => Operate_Of_ReceiveSync::Disable == $data['operate'] ? 0 : 1,
|
||||||
|
'sort' => 0,
|
||||||
|
'detail' => '',
|
||||||
|
'status' => 1,
|
||||||
|
'seo_title' => '',
|
||||||
|
'seo_keywords' => '',
|
||||||
|
'seo_desc' => '',
|
||||||
|
'updated_at' => $data['created_at'],
|
||||||
|
]);
|
||||||
|
if ($product->isEmpty()) {
|
||||||
|
throw new \Exception('产品创建失败');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (strtotime($product['updated_at']) < strtotime($data['created_at'])) {
|
||||||
|
$product->spu = $data['spu'];
|
||||||
|
$product->name = $data['name'];
|
||||||
|
$product->category_id = $product_category['id'];
|
||||||
|
$product->is_show = Operate_Of_ReceiveSync::Disable == $data['operate'] ? 0 : 1;
|
||||||
|
if (!$product->save()) {
|
||||||
|
throw new \Exception('产品更新失败');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (\Throwable $th) {
|
||||||
|
return error(sprintf('%s %s:%d', $th->getMessage(), $th->getFile(), $th->getLine()));
|
||||||
|
}
|
||||||
|
|
||||||
|
return success('同步成功');
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -34,12 +34,12 @@ class Banner
|
|||||||
$datas = [];
|
$datas = [];
|
||||||
if (!$banners->isEmpty()) {
|
if (!$banners->isEmpty()) {
|
||||||
$temp = [];
|
$temp = [];
|
||||||
$map = ['pc' => 'PC端', 'mobile' => '移动端'];
|
$map = ['pc' => ['id' => -1, 'name' => 'PC端'], 'mobile' => ['id' => -2, 'name' => '移动端']];
|
||||||
foreach ($banners as $banner) {
|
foreach ($banners as $banner) {
|
||||||
if (!isset($temp[$banner->at_platform])) {
|
if (!isset($temp[$banner->at_platform])) {
|
||||||
$temp[$banner->at_platform] = [
|
$temp[$banner->at_platform] = [
|
||||||
'id' => 0,
|
'id' => $map[$banner->at_platform]['id'] ?? 0,
|
||||||
'name' => $map[$banner->at_platform] ?? '未知平台',
|
'name' => $map[$banner->at_platform]['name'] ?? '未知平台',
|
||||||
'children' => []
|
'children' => []
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -105,6 +105,7 @@ class BannerItem
|
|||||||
'desc_txt_color',
|
'desc_txt_color',
|
||||||
'type',
|
'type',
|
||||||
'image',
|
'image',
|
||||||
|
'extra_image',
|
||||||
'video',
|
'video',
|
||||||
'link_to' => 'custom',
|
'link_to' => 'custom',
|
||||||
'link',
|
'link',
|
||||||
@@ -159,6 +160,7 @@ class BannerItem
|
|||||||
'desc_txt_color',
|
'desc_txt_color',
|
||||||
'type',
|
'type',
|
||||||
'image',
|
'image',
|
||||||
|
'extra_image',
|
||||||
'video',
|
'video',
|
||||||
'link_to',
|
'link_to',
|
||||||
'link',
|
'link',
|
||||||
@@ -187,10 +189,7 @@ class BannerItem
|
|||||||
|
|
||||||
// 更新关联的产品分类
|
// 更新关联的产品分类
|
||||||
if (!empty($put['rel_prod_cate_id'])) {
|
if (!empty($put['rel_prod_cate_id'])) {
|
||||||
$ok = SysBannerProdCateMappingModel::where('banner_item_id', '=', $id)->delete();
|
SysBannerProdCateMappingModel::where('banner_item_id', '=', $id)->delete();
|
||||||
if (!$ok) {
|
|
||||||
throw new InvalidOperateException('更新横幅与产品分类关联失败');
|
|
||||||
}
|
|
||||||
$mapping = SysBannerProdCateMappingModel::create([
|
$mapping = SysBannerProdCateMappingModel::create([
|
||||||
'banner_item_id' => $id,
|
'banner_item_id' => $id,
|
||||||
'product_category_id' => $put['rel_prod_cate_id']
|
'product_category_id' => $put['rel_prod_cate_id']
|
||||||
@@ -245,6 +244,7 @@ class BannerItem
|
|||||||
'desc_txt_color' => '描述字体颜色',
|
'desc_txt_color' => '描述字体颜色',
|
||||||
'type' => '前台显示类型',
|
'type' => '前台显示类型',
|
||||||
'image' => '图片地址',
|
'image' => '图片地址',
|
||||||
|
'extra_image' => '额外图片地址',
|
||||||
'video' => '视频地址',
|
'video' => '视频地址',
|
||||||
'link_to' => '链接类型',
|
'link_to' => '链接类型',
|
||||||
'link' => '链接地址',
|
'link' => '链接地址',
|
||||||
@@ -277,6 +277,7 @@ class BannerItem
|
|||||||
'item.desc_txt_color',
|
'item.desc_txt_color',
|
||||||
'item.type',
|
'item.type',
|
||||||
'item.image',
|
'item.image',
|
||||||
|
'item.extra_image',
|
||||||
'item.video',
|
'item.video',
|
||||||
'item.link_to',
|
'item.link_to',
|
||||||
'item.link',
|
'item.link',
|
||||||
|
|||||||
@@ -141,6 +141,61 @@ class SiteConfig
|
|||||||
return $ret;
|
return $ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 根据分组获取配置
|
||||||
|
public function getByGroupUniqueLabel($unique_label)
|
||||||
|
{
|
||||||
|
$configs = SysConfigModel::alias('c')
|
||||||
|
->field([
|
||||||
|
'c.id',
|
||||||
|
'c.title',
|
||||||
|
'c.name',
|
||||||
|
'c.value',
|
||||||
|
])
|
||||||
|
->join(SysConfigGroupModel::getTable(). ' g', 'g.id = c.group_id')
|
||||||
|
->where('g.language_id', '=', request()->lang_id)
|
||||||
|
->where('g.unique_label', '=', $unique_label)
|
||||||
|
->where('g.status', '=', 1)
|
||||||
|
->order(['c.sort' => 'asc', 'c.id' => 'desc'])
|
||||||
|
->select()
|
||||||
|
->each(function ($item) {
|
||||||
|
// 修改字段为null的输出为空字符串
|
||||||
|
$keys = array_keys($item->toArray());
|
||||||
|
foreach ($keys as $key) {
|
||||||
|
if (is_null($item[$key])) {
|
||||||
|
$item[$key] = '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $item;
|
||||||
|
})
|
||||||
|
->toArray();
|
||||||
|
if (!empty($configs)) {
|
||||||
|
$configs_map = [];
|
||||||
|
foreach ($configs as $cfg) {
|
||||||
|
$current = &$configs_map;
|
||||||
|
|
||||||
|
// 根据name中"."拆分为多维数组
|
||||||
|
$parts = explode('.', $cfg['name']);
|
||||||
|
foreach ($parts as $part) {
|
||||||
|
if (!isset($current[$part])) {
|
||||||
|
$current[$part] = [];
|
||||||
|
}
|
||||||
|
$current = &$current[$part];
|
||||||
|
}
|
||||||
|
$current = [
|
||||||
|
'id' => $cfg['id'],
|
||||||
|
'title' => $cfg['title'],
|
||||||
|
'name' => $cfg['name'],
|
||||||
|
'value' => $cfg['value']
|
||||||
|
];
|
||||||
|
}
|
||||||
|
unset($current);
|
||||||
|
|
||||||
|
return $configs_map;
|
||||||
|
}
|
||||||
|
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
// 更新配置
|
// 更新配置
|
||||||
public function update()
|
public function update()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ use app\admin\model\v1\ArticleModel;
|
|||||||
use app\admin\model\v1\ProductCategoryModel;
|
use app\admin\model\v1\ProductCategoryModel;
|
||||||
use app\admin\model\v1\ProductModel;
|
use app\admin\model\v1\ProductModel;
|
||||||
use think\facade\Db;
|
use think\facade\Db;
|
||||||
use think\facade\Route;
|
|
||||||
|
|
||||||
class System
|
class System
|
||||||
{
|
{
|
||||||
@@ -147,7 +146,11 @@ class System
|
|||||||
'name' => '产品分类',
|
'name' => '产品分类',
|
||||||
'link_to' => 'product_category',
|
'link_to' => 'product_category',
|
||||||
'data' => array_to_tree(array_map(function($item) {
|
'data' => array_to_tree(array_map(function($item) {
|
||||||
$item['url'] = (string)url('/index/product/category/' . $item['id']);
|
if ($item['pid'] == 0) {
|
||||||
|
$item['url'] = (string)url('/index/product/category/'. $item['id']);
|
||||||
|
} else {
|
||||||
|
$item['url'] = (string)url('/index/product/subcategory/' . $item['id']);
|
||||||
|
}
|
||||||
return $item;
|
return $item;
|
||||||
}, $product_category), 0, 'pid', false, false)
|
}, $product_category), 0, 'pid', false, false)
|
||||||
],
|
],
|
||||||
@@ -155,6 +158,11 @@ class System
|
|||||||
'name' => '产品',
|
'name' => '产品',
|
||||||
'link_to' => 'product',
|
'link_to' => 'product',
|
||||||
'data' => array_to_tree($product_category, 0, 'pid', false, false)
|
'data' => array_to_tree($product_category, 0, 'pid', false, false)
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'name' => '其他内页',
|
||||||
|
'link_to' => 'system_page',
|
||||||
|
'data' => self::getSystemOtherPages()
|
||||||
]
|
]
|
||||||
];
|
];
|
||||||
|
|
||||||
@@ -220,10 +228,128 @@ class System
|
|||||||
return $data->toArray();
|
return $data->toArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 获取系统其他内页
|
||||||
|
static private function getSystemOtherPages()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
[
|
||||||
|
'id' => 1,
|
||||||
|
'name' => '首页',
|
||||||
|
'url' => (string)url('/index/index/index')
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'id' => 2,
|
||||||
|
'name' => '新品上市',
|
||||||
|
'url' => (string)url('/index/product/newpro')
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'id' => 3,
|
||||||
|
'name' => '附件下载',
|
||||||
|
'url' => (string)url('/index/attachment/index')
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'id' => 4,
|
||||||
|
'name' => '问答中心',
|
||||||
|
'url' => (string)url('/index/faq/index')
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'id' => 5,
|
||||||
|
'name' => '关于我们',
|
||||||
|
'url' => '',
|
||||||
|
'children' => [
|
||||||
|
[
|
||||||
|
'id' => 51,
|
||||||
|
'name' => '品牌介绍',
|
||||||
|
'url' => (string)url('/index/aboutus/introduction')
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'id' => 52,
|
||||||
|
'name' => '品牌故事',
|
||||||
|
'url' => (string)url('/index/aboutus/story')
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'id' => 53,
|
||||||
|
'name' => '品牌历程',
|
||||||
|
'url' => (string)url('/index/aboutus/mileage')
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'id' => 54,
|
||||||
|
'name' => '文化介绍',
|
||||||
|
'url' => (string)url('/index/aboutus/culture')
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'id' => 55,
|
||||||
|
'name' => '售后政策',
|
||||||
|
'url' => (string)url('/index/aboutus/policy')
|
||||||
|
]
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'id' => 6,
|
||||||
|
'name' => '联系我们',
|
||||||
|
'url' => '',
|
||||||
|
'children' => [
|
||||||
|
[
|
||||||
|
'id' => 61,
|
||||||
|
'name' => '联系我们',
|
||||||
|
'url' => (string)url('/index/contactus/index')
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'id' => 62,
|
||||||
|
'name' => '留言联系我们',
|
||||||
|
'url' => (string)url('/index/contactus/message')
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'id' => 63,
|
||||||
|
'name' => '留言成为分销商',
|
||||||
|
'url' => (string)url('/index/contactus/distributor')
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'id' => 64,
|
||||||
|
'name' => '留言批量购买',
|
||||||
|
'url' => (string)url('/index/contactus/bulkbuy')
|
||||||
|
]
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'id' => 7,
|
||||||
|
'name' => 'NAS专题',
|
||||||
|
'url' => '',
|
||||||
|
'children' => [
|
||||||
|
[
|
||||||
|
'id' => 71,
|
||||||
|
'name' => '首页',
|
||||||
|
'url' => (string)url('/index/topic/nas/index')
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'id' => 72,
|
||||||
|
'name' => '产品体验',
|
||||||
|
'url' => (string)url('/index/topic/nas/product')
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'id' => 73,
|
||||||
|
'name' => '客户合作',
|
||||||
|
'url' => (string)url('/index/topic/nas/cooperation')
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'id' => 74,
|
||||||
|
'name' => '帮助中心',
|
||||||
|
'url' => (string)url('/index/topic/nas/help')
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'id' => 75,
|
||||||
|
'name' => '软件下载',
|
||||||
|
'url' => (string)url('/index/topic/nas/download')
|
||||||
|
]
|
||||||
|
]
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
// 根据系统页面url获取回显数据项
|
// 根据系统页面url获取回显数据项
|
||||||
static public function getEchoDataBySystemPageUrl($link_to, $link)
|
static public function getEchoDataBySystemPageUrl($link_to, $link)
|
||||||
{
|
{
|
||||||
if ('custom' == $link_to) return [];
|
if ('custom' == $link_to || empty($link)) return [];
|
||||||
|
|
||||||
$data = [];
|
$data = [];
|
||||||
$params = [];
|
$params = [];
|
||||||
@@ -235,21 +361,29 @@ class System
|
|||||||
parse_str($url, $params);
|
parse_str($url, $params);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (empty($params['id'])) return [];
|
|
||||||
|
|
||||||
switch ($link_to) {
|
switch ($link_to) {
|
||||||
case 'article_category':
|
case 'article_category':
|
||||||
|
if (empty($params['id'])) return [];
|
||||||
$data = ArticleCategoryModel::field(['id', 'name'])->bypk($params['id'])->find();
|
$data = ArticleCategoryModel::field(['id', 'name'])->bypk($params['id'])->find();
|
||||||
break;
|
break;
|
||||||
case 'article':
|
case 'article':
|
||||||
|
if (empty($params['id'])) return [];
|
||||||
$data = ArticleModel::field(['id', 'title' => 'name'])->bypk($params['id'])->find();
|
$data = ArticleModel::field(['id', 'title' => 'name'])->bypk($params['id'])->find();
|
||||||
break;
|
break;
|
||||||
case 'product_category':
|
case 'product_category':
|
||||||
|
if (empty($params['id'])) return [];
|
||||||
$data = ProductCategoryModel::field(['id', 'name'])->bypk($params['id'])->find();
|
$data = ProductCategoryModel::field(['id', 'name'])->bypk($params['id'])->find();
|
||||||
break;
|
break;
|
||||||
case 'product':
|
case 'product':
|
||||||
|
if (empty($params['id'])) return [];
|
||||||
$data = ProductModel::field(['id', 'name'])->bypk($params['id'])->find();
|
$data = ProductModel::field(['id', 'name'])->bypk($params['id'])->find();
|
||||||
break;
|
break;
|
||||||
|
case 'system_page':
|
||||||
|
$data = self::filterSystemOtherPage(self::getSystemOtherPages(), function($item) use ($params, $link) {
|
||||||
|
if (empty($params['id'])) return $item['url'] == $link;
|
||||||
|
return $item['id'] == $params['id'];
|
||||||
|
});
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return [];
|
return [];
|
||||||
break;
|
break;
|
||||||
@@ -262,4 +396,22 @@ class System
|
|||||||
'link' => $link
|
'link' => $link
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 根据条件过滤结果
|
||||||
|
static private function filterSystemOtherPage(array $data, callable $callback): array
|
||||||
|
{
|
||||||
|
foreach ($data as $it) {
|
||||||
|
if ($callback($it)) {
|
||||||
|
return $it;
|
||||||
|
}
|
||||||
|
if (isset($it['children'])) {
|
||||||
|
$child = self::filterSystemOtherPage($it['children'], $callback);
|
||||||
|
if (!empty($child)) {
|
||||||
|
return $child;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return [];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -7,6 +7,7 @@ use app\admin\model\v1\SysImageUploadRecordModel;
|
|||||||
use app\admin\model\v1\SysVideoUploadRecordModel;
|
use app\admin\model\v1\SysVideoUploadRecordModel;
|
||||||
use app\admin\model\v1\SysAttachmentUploadRecordModel;
|
use app\admin\model\v1\SysAttachmentUploadRecordModel;
|
||||||
use Intervention\Image\ImageManager;
|
use Intervention\Image\ImageManager;
|
||||||
|
use Intervention\Image\Typography\FontFactory;
|
||||||
use think\facade\Filesystem;
|
use think\facade\Filesystem;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -30,7 +31,7 @@ class Upload
|
|||||||
$max_size = strtobytes(env('ADMIN_API.MAX_IMAGE_SIZE', '1mb'));
|
$max_size = strtobytes(env('ADMIN_API.MAX_IMAGE_SIZE', '1mb'));
|
||||||
$validate = validate([
|
$validate = validate([
|
||||||
'module' => 'require|max:64',
|
'module' => 'require|max:64',
|
||||||
'image' => "fileSize:$max_size|fileExt:jpg,jpeg,png,gif"
|
'image' => "fileSize:$max_size|fileExt:jpg,jpeg,png,gif,webp"
|
||||||
]);
|
]);
|
||||||
if (!$validate->check(['module' => $param['module'], 'image' => $file])) {
|
if (!$validate->check(['module' => $param['module'], 'image' => $file])) {
|
||||||
return error($validate->getError());
|
return error($validate->getError());
|
||||||
@@ -41,12 +42,86 @@ class Upload
|
|||||||
$filemd5 = $file->md5();
|
$filemd5 = $file->md5();
|
||||||
$filesha1 = $file->sha1();
|
$filesha1 = $file->sha1();
|
||||||
|
|
||||||
$image_model = SysImageUploadRecordModel::md5($filemd5)->find();
|
// 获取图片上传配置
|
||||||
|
list(
|
||||||
|
'filename_keep' => $filename_keep,
|
||||||
|
'filemd5_unique' => $filemd5_unique
|
||||||
|
) = $this->getUploadOptions('upload_image');
|
||||||
|
// 是否需要根据文件MD5值检查文件是否已存在
|
||||||
|
$image_model = $filemd5_unique ? SysImageUploadRecordModel::md5($filemd5)->find() : null;
|
||||||
if (is_null($image_model)) {
|
if (is_null($image_model)) {
|
||||||
$filename = Filesystem::disk('image')->putFile($param['module'], $file);
|
// 检查是否需要保留原文件名生成器
|
||||||
// 生成缩略图
|
$name_rule = fn() => $filename_keep ? $this->filenameGenerator($file) : null;
|
||||||
$image_manager = new ImageManager(new \Intervention\Image\Drivers\Imagick\Driver());
|
$filename = Filesystem::disk('image')->putFile($param['module'], $file, $name_rule());
|
||||||
|
// 处理图片
|
||||||
|
$image_manager = ImageManager::imagick();
|
||||||
$image = $image_manager->read('.' . $storage . '/' . $filename);
|
$image = $image_manager->read('.' . $storage . '/' . $filename);
|
||||||
|
|
||||||
|
// 水印
|
||||||
|
list(
|
||||||
|
'enabled' => $enabled,
|
||||||
|
'type' => $type,
|
||||||
|
'text_options' => $text_options,
|
||||||
|
'image_options' => $image_options
|
||||||
|
) = $this->getWatermarkOptions();
|
||||||
|
if ($enabled) {
|
||||||
|
// 图片水印
|
||||||
|
if ($type == 'IMAGE' && $image_options['image'] != '') {
|
||||||
|
// 读取水印图片
|
||||||
|
$watermark_image = $image_manager->read(public_path() . $image_options['image']);
|
||||||
|
// 缩放水印图片
|
||||||
|
$watermark_image->scale($image_options['width'], $image_options['height']);
|
||||||
|
// 绘制水印图片
|
||||||
|
$image->place(
|
||||||
|
$watermark_image,
|
||||||
|
$image_options['position'],
|
||||||
|
$image_options['offset_x'],
|
||||||
|
$image_options['offset_y'],
|
||||||
|
$image_options['opacity']
|
||||||
|
);
|
||||||
|
}
|
||||||
|
// 文字水印
|
||||||
|
else if ($type == 'TEXT' && $text_options['txt'] != '') {
|
||||||
|
// 原图宽度
|
||||||
|
$origin_width = $image->width();
|
||||||
|
// 原图高度
|
||||||
|
$origin_height = $image->height();
|
||||||
|
|
||||||
|
$font_factory = new FontFactory(function(FontFactory $font) use($text_options) {
|
||||||
|
// 设置字体
|
||||||
|
$font->filename(public_path() . $text_options['font']);
|
||||||
|
// 设置字体大小
|
||||||
|
$font->size($text_options['size']);
|
||||||
|
// 设置字体颜色及透明度
|
||||||
|
$opacity = $text_options['opacity'] > 0 ? dechex((int)ceil(255 * ($text_options['opacity'] / 100))) : '00';
|
||||||
|
$font->color($text_options['color'] . $opacity);
|
||||||
|
$font->align('left');
|
||||||
|
$font->valign('top');
|
||||||
|
});
|
||||||
|
// 文字尺寸
|
||||||
|
$font_rect = $image->driver()->fontProcessor()->boxSize($text_options['txt'], $font_factory());
|
||||||
|
// 计算偏移量
|
||||||
|
list($offset_x, $offset_y) = $this->scaleTxtOffsetXYByPosition(
|
||||||
|
$text_options['position'],
|
||||||
|
$text_options['offset_x'],
|
||||||
|
$text_options['offset_y'],
|
||||||
|
$origin_width,
|
||||||
|
$origin_height,
|
||||||
|
$font_rect->width(),
|
||||||
|
$font_rect->height()
|
||||||
|
);
|
||||||
|
// 绘制文字
|
||||||
|
$image->text(
|
||||||
|
$text_options['txt'],
|
||||||
|
$offset_x,
|
||||||
|
$offset_y,
|
||||||
|
$font_factory()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
$image->save('.'. $storage. '/'. $filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 缩略图
|
||||||
$image->scale(200, 200);
|
$image->scale(200, 200);
|
||||||
$idx = strrpos($filename, '.');
|
$idx = strrpos($filename, '.');
|
||||||
$thumb_filename = mb_substr($filename, 0, $idx) . '_thumb.' . mb_substr($filename, $idx + 1);
|
$thumb_filename = mb_substr($filename, 0, $idx) . '_thumb.' . mb_substr($filename, $idx + 1);
|
||||||
@@ -79,6 +154,117 @@ class Upload
|
|||||||
|
|
||||||
return error('上传失败');
|
return error('上传失败');
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* 文件名生成回调
|
||||||
|
*
|
||||||
|
* @param \think\file\UploadedFile $file
|
||||||
|
* @return callable
|
||||||
|
*/
|
||||||
|
private function filenameGenerator(\think\file\UploadedFile $file): callable
|
||||||
|
{
|
||||||
|
return fn() => date('Ymd') . '/' . pathinfo($file->getOriginalName(), PATHINFO_FILENAME);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 获取上传配置
|
||||||
|
*
|
||||||
|
* @param string $module
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
private function getUploadOptions($module)
|
||||||
|
{
|
||||||
|
$config_model = new \app\admin\controller\v1\SiteConfig;
|
||||||
|
$config = $config_model->getByGroupUniqueLabel('upload');
|
||||||
|
$options = data_get($config, $module, []);
|
||||||
|
throw_if(empty($options), '上传配置错误');
|
||||||
|
return [
|
||||||
|
'filename_keep' => (int)data_get($options, 'filename_keep.value', 0) == 1,
|
||||||
|
'filemd5_unique' => (int)data_get($options, 'filemd5_unique.value', 0) == 1,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 获取水印配置
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
private function getWatermarkOptions(): array
|
||||||
|
{
|
||||||
|
$config_model = new \app\admin\controller\v1\SiteConfig;
|
||||||
|
$watermark_config = $config_model->getByGroupUniqueLabel('watermark');
|
||||||
|
|
||||||
|
$opacity = data_get($watermark_config, 'watermark_opacity.value', 100);
|
||||||
|
if ($opacity == '') {
|
||||||
|
$opacity = 100;
|
||||||
|
}
|
||||||
|
return [
|
||||||
|
'enabled' => data_get($watermark_config, 'watermark_enabled.value', 0) == 1,
|
||||||
|
'type' => data_get($watermark_config, 'watermark_type.value', ''),
|
||||||
|
'text_options' => [
|
||||||
|
'txt' => data_get($watermark_config, 'watermark_text_value.value', ''),
|
||||||
|
'font' => data_get($watermark_config, 'watermark_text_font.value', ''),
|
||||||
|
'size' => (float)data_get($watermark_config, 'watermark_text_size.value', 12)?:12,
|
||||||
|
'color' => data_get($watermark_config, 'watermark_text_color.value', '#000000')?:'#000000',
|
||||||
|
'position' => data_get($watermark_config, 'watermark_position.value', 'top-left')?:'top-left',
|
||||||
|
'offset_x' => (int)data_get($watermark_config, 'watermark_offset_x.value', 0),
|
||||||
|
'offset_y' => (int)data_get($watermark_config, 'watermark_offset_y.value', 0),
|
||||||
|
'opacity' => (int)$opacity,
|
||||||
|
],
|
||||||
|
'image_options' => [
|
||||||
|
'image' => data_get($watermark_config, 'watermark_image_value.value', ''),
|
||||||
|
'width' => (int)data_get($watermark_config, 'watermark_image_width.value')?:null,
|
||||||
|
'height' => (int)data_get($watermark_config, 'watermark_image_height.value')?:null,
|
||||||
|
'position' => data_get($watermark_config, 'watermark_position.value', 'top-left')?:'top-left',
|
||||||
|
'offset_x' => (int)data_get($watermark_config, 'watermark_offset_x.value', 0),
|
||||||
|
'offset_y' => (int)data_get($watermark_config, 'watermark_offset_y.value', 0),
|
||||||
|
'opacity' => (int)$opacity,
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 计算文体水印偏移量
|
||||||
|
*
|
||||||
|
* @param string $position
|
||||||
|
* @param integer $offset_x
|
||||||
|
* @param integer $offset_y
|
||||||
|
* @param integer $image_width
|
||||||
|
* @param integer $image_height
|
||||||
|
* @param integer $txt_width
|
||||||
|
* @param integer $txt_height
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
private function scaleTxtOffsetXYByPosition(string $position, int $offset_x, int $offset_y, int $image_width, int $image_height, int $txt_width, int $txt_height)
|
||||||
|
{
|
||||||
|
switch ($position) {
|
||||||
|
case 'top-left':
|
||||||
|
// top-left:左上角
|
||||||
|
return [$offset_x, $offset_y];
|
||||||
|
case 'top-right':
|
||||||
|
// top-right:右上角
|
||||||
|
return [(int)($image_width-$txt_width-$offset_x), $offset_y];
|
||||||
|
case 'top':
|
||||||
|
// top:上 - 水平居中
|
||||||
|
return [(int)(($image_width-$txt_width+$offset_x)/2), $offset_y];
|
||||||
|
case 'left':
|
||||||
|
// left:左 - 垂直居中
|
||||||
|
return [$offset_x, (int)(($image_height-$txt_height)/2+$offset_y)];
|
||||||
|
case 'center':
|
||||||
|
// center:水平垂直居中
|
||||||
|
return [(int)(($image_width-$txt_width)/2+$offset_x), (int)(($image_height-$txt_height)/2+$offset_y)];
|
||||||
|
case 'right':
|
||||||
|
// right:右 - 垂直居中
|
||||||
|
return [(int)($image_width-$txt_width-$offset_x), (int)(($image_height-$txt_height)/2+$offset_y)];
|
||||||
|
case'bottom':
|
||||||
|
// bottom:下 - 水平居中
|
||||||
|
return [(int)(($image_width-$txt_width+$offset_x)/2), (int)($image_height-$txt_height-$offset_y)];
|
||||||
|
case'bottom-left':
|
||||||
|
// bottom-left:左下角
|
||||||
|
return [$offset_x, (int)($image_height-$txt_height-$offset_y)];
|
||||||
|
case'bottom-right':
|
||||||
|
// bottom-right:右下角
|
||||||
|
return [(int)($image_width-$txt_width-$offset_x), (int)($image_height-$txt_height-$offset_y)];
|
||||||
|
default:
|
||||||
|
throw new \InvalidArgumentException('Invalid position');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 上传视频
|
* 上传视频
|
||||||
@@ -109,9 +295,17 @@ class Upload
|
|||||||
$filemd5 = $file->md5();
|
$filemd5 = $file->md5();
|
||||||
$filesha1 = $file->sha1();
|
$filesha1 = $file->sha1();
|
||||||
|
|
||||||
$video = SysVideoUploadRecordModel::md5($filemd5)->find();
|
// 获取视频上传配置
|
||||||
|
list(
|
||||||
|
'filename_keep' => $filename_keep,
|
||||||
|
'filemd5_unique' => $filemd5_unique
|
||||||
|
) = $this->getUploadOptions('upload_video');
|
||||||
|
// 是否需要根据文件MD5值检查文件是否已存在
|
||||||
|
$video = $filemd5_unique ? SysVideoUploadRecordModel::md5($filemd5)->find() : null;
|
||||||
if (is_null($video)) {
|
if (is_null($video)) {
|
||||||
$filename = Filesystem::disk('video')->putFile($param['module'], $file);
|
// 检查是否需要保留原文件名
|
||||||
|
$name_rule = fn() => $filename_keep ? $this->filenameGenerator($file) : null;
|
||||||
|
$filename = Filesystem::disk('video')->putFile($param['module'], $file, $name_rule());
|
||||||
|
|
||||||
// 保存视频
|
// 保存视频
|
||||||
$video = new SysVideoUploadRecordModel();
|
$video = new SysVideoUploadRecordModel();
|
||||||
@@ -152,7 +346,7 @@ class Upload
|
|||||||
try {
|
try {
|
||||||
$max_size = strtobytes(env('ADMIN_API.MAX_ATTACHMENT_SIZE', '100mb'));
|
$max_size = strtobytes(env('ADMIN_API.MAX_ATTACHMENT_SIZE', '100mb'));
|
||||||
$validate = validate([
|
$validate = validate([
|
||||||
'attachment' => "fileSize:$max_size|fileExt:biz,bz,bz2,gz,tgz,zip,rar,7z,doc,docx,xls,xlsx,csv,ppt,pptx,pdf,txt,jpg,jpeg,png"
|
'attachment' => "fileSize:$max_size|fileExt:biz,bz,bz2,gz,tgz,zip,rar,7z,doc,docx,xls,xlsx,csv,ppt,pptx,pdf,txt,jpg,jpeg,png,webp,ttf"
|
||||||
]);
|
]);
|
||||||
if (!$validate->check(['attachment' => $file])) {
|
if (!$validate->check(['attachment' => $file])) {
|
||||||
return error($validate->getError());
|
return error($validate->getError());
|
||||||
@@ -161,9 +355,17 @@ class Upload
|
|||||||
$filemd5 = $file->md5();
|
$filemd5 = $file->md5();
|
||||||
$filesha1 = $file->sha1();
|
$filesha1 = $file->sha1();
|
||||||
|
|
||||||
$attachment = SysAttachmentUploadRecordModel::md5($filemd5)->find();
|
// 获取附件上传配置
|
||||||
|
list(
|
||||||
|
'filename_keep' => $filename_keep,
|
||||||
|
'filemd5_unique' => $filemd5_unique
|
||||||
|
) = $this->getUploadOptions('upload_attachment');
|
||||||
|
// 是否需要根据文件MD5值检查文件是否已存在
|
||||||
|
$attachment = $filemd5_unique ? SysAttachmentUploadRecordModel::md5($filemd5)->find() : null;
|
||||||
if (is_null($attachment)) {
|
if (is_null($attachment)) {
|
||||||
$filename = Filesystem::disk('public')->putFile('attachments', $file);
|
// 检查是否需要保留原文件名
|
||||||
|
$name_rule = fn() => $filename_keep ? $this->filenameGenerator($file) : null;
|
||||||
|
$filename = Filesystem::disk('public')->putFile('attachments', $file, $name_rule());
|
||||||
|
|
||||||
// 保存视频
|
// 保存视频
|
||||||
$attachment = new SysAttachmentUploadRecordModel();
|
$attachment = new SysAttachmentUploadRecordModel();
|
||||||
|
|||||||
@@ -50,7 +50,8 @@ class Video
|
|||||||
'page' => $params['page'],
|
'page' => $params['page'],
|
||||||
])
|
])
|
||||||
->bindAttr('category', ['category_name'])
|
->bindAttr('category', ['category_name'])
|
||||||
->hidden(['category', 'category_id']);
|
->hidden(['category', 'category_id'])
|
||||||
|
?->each(fn($item) => $item->image = thumb($item->image));
|
||||||
|
|
||||||
return success('获取成功', $videos);
|
return success('获取成功', $videos);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,7 +47,8 @@ class VideoTrash
|
|||||||
'page' => $params['page'],
|
'page' => $params['page'],
|
||||||
])
|
])
|
||||||
->bindAttr('category', ['category_name'])
|
->bindAttr('category', ['category_name'])
|
||||||
->hidden(['category_id', 'category']);
|
->hidden(['category_id', 'category'])
|
||||||
|
?->each(fn($item) => $item->image = thumb($item->image));
|
||||||
|
|
||||||
return success('获取成功', $videos);
|
return success('获取成功', $videos);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,6 +29,12 @@ class ProductCategoryModel extends ProductCategoryBaseModel
|
|||||||
$query->where('language_id', '=', $value);
|
$query->where('language_id', '=', $value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 所属产品目录分类id查询
|
||||||
|
public function scopeTcoId($query, $value)
|
||||||
|
{
|
||||||
|
$query->where('related_tco_category', '=', $value);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据是否显示查询
|
* 根据是否显示查询
|
||||||
* @param $query
|
* @param $query
|
||||||
|
|||||||
@@ -80,6 +80,12 @@ class ProductModel extends ProductBaseModel
|
|||||||
$query->where('category_id', '=', $value);
|
$query->where('category_id', '=', $value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 规格型号查询
|
||||||
|
public function scopeSpu($query, $spu)
|
||||||
|
{
|
||||||
|
$query->where('spu', '=', $spu);
|
||||||
|
}
|
||||||
|
|
||||||
// 启用状态查询
|
// 启用状态查询
|
||||||
public function scopeEnabled($query)
|
public function scopeEnabled($query)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -23,6 +23,18 @@ class ProductTcoCategoryModel extends ProductTcoCategoryBaseModel
|
|||||||
$query->where('language_id', '=', $value);
|
$query->where('language_id', '=', $value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 根据 tco_id 查询
|
||||||
|
public function scopeTcoId($query, $value)
|
||||||
|
{
|
||||||
|
$query->where('tco_id', '=', $value);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 根据ERP Code查询
|
||||||
|
public function scopeErpCode($query, $value)
|
||||||
|
{
|
||||||
|
$query->where('erp_code', '=', $value);
|
||||||
|
}
|
||||||
|
|
||||||
// 按分类名称搜索
|
// 按分类名称搜索
|
||||||
public function searchNameAttr($query, $value, $data)
|
public function searchNameAttr($query, $value, $data)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ class NavigationItemValidate extends Validate
|
|||||||
'pid' => 'integer|different:id|checkPidNotBeChildren',
|
'pid' => 'integer|different:id|checkPidNotBeChildren',
|
||||||
'name' => 'require|max:64',
|
'name' => 'require|max:64',
|
||||||
'icon' => 'max:64',
|
'icon' => 'max:64',
|
||||||
'link_to' => 'require|max:64|in:article,article_category,product,product_category,custom',
|
'link_to' => 'require|max:64|in:article,article_category,product,product_category,system_page,custom',
|
||||||
'link' => 'max:255',
|
'link' => 'max:255',
|
||||||
'sort' => 'integer',
|
'sort' => 'integer',
|
||||||
'blank' => 'in:0,1',
|
'blank' => 'in:0,1',
|
||||||
@@ -47,7 +47,7 @@ class NavigationItemValidate extends Validate
|
|||||||
'icon.max' => '图标最多不能超过64个字符',
|
'icon.max' => '图标最多不能超过64个字符',
|
||||||
'link_to.require' => '链接类型不能为空',
|
'link_to.require' => '链接类型不能为空',
|
||||||
'link_to.max' => '链接类型最多不能超过64个字符',
|
'link_to.max' => '链接类型最多不能超过64个字符',
|
||||||
'link_to.in' => '链接类型必须是article,goods_category,goods,custom中之一',
|
'link_to.in' => '链接类型必须是article,article_category,product_category,product,system_page,custom中之一',
|
||||||
'link.max' => '链接最多不能超过255个字符',
|
'link.max' => '链接最多不能超过255个字符',
|
||||||
'sort.integer' => '排序必须为整数',
|
'sort.integer' => '排序必须为整数',
|
||||||
'blank.in' => '是否新窗口打开只能是0或1',
|
'blank.in' => '是否新窗口打开只能是0或1',
|
||||||
|
|||||||
@@ -22,8 +22,9 @@ class SysBannerItemValidate extends Validate
|
|||||||
'desc_txt_color' => 'max:7',
|
'desc_txt_color' => 'max:7',
|
||||||
'type' => 'in:image,video',
|
'type' => 'in:image,video',
|
||||||
'image' => 'max:255',
|
'image' => 'max:255',
|
||||||
|
'extra_image' => 'max:255',
|
||||||
'video' => 'max:255',
|
'video' => 'max:255',
|
||||||
'link_to' => 'requireIf:type,image|max:64|in:article,article_category,product,product_category,custom',
|
'link_to' => 'requireIf:type,image|max:64|in:article,article_category,product,product_category,system_page,custom',
|
||||||
'link' => 'max:255',
|
'link' => 'max:255',
|
||||||
'sort' => 'integer',
|
'sort' => 'integer',
|
||||||
'status' => 'in:-1,1'
|
'status' => 'in:-1,1'
|
||||||
@@ -47,10 +48,11 @@ class SysBannerItemValidate extends Validate
|
|||||||
'desc_txt_color.max' => '描述字体颜色最多不能超过7个字符',
|
'desc_txt_color.max' => '描述字体颜色最多不能超过7个字符',
|
||||||
'type.in' => '显示类型必须是image或video',
|
'type.in' => '显示类型必须是image或video',
|
||||||
'image.max' => '图片地址最多不能超过255个字符',
|
'image.max' => '图片地址最多不能超过255个字符',
|
||||||
|
'extra_image.max' => '额外图片地址最多不能超过255个字符',
|
||||||
'video.max' => '视频地址最多不能超过255个字符',
|
'video.max' => '视频地址最多不能超过255个字符',
|
||||||
'link_to.requireIf' => '链接类型不能为空',
|
'link_to.requireIf' => '链接类型不能为空',
|
||||||
'link_to.max' => '链接类型最多不能超过64个字符',
|
'link_to.max' => '链接类型最多不能超过64个字符',
|
||||||
'link_to.in' => '链接类型必须是article,article_category,product,product_category,custom中之一',
|
'link_to.in' => '链接类型必须是article,article_category,product,product_category,system_page,custom中之一',
|
||||||
'link.max' => '链接最多不能超过255个字符',
|
'link.max' => '链接最多不能超过255个字符',
|
||||||
'sort.integer' => '排序值必须是整数',
|
'sort.integer' => '排序值必须是整数',
|
||||||
'status.in' => '状态必须是-1或1'
|
'status.in' => '状态必须是-1或1'
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ class ProductTcoCategoryBaseModel extends BaseModel
|
|||||||
'tco_path' => 'string',
|
'tco_path' => 'string',
|
||||||
'erp_id' => 'int',
|
'erp_id' => 'int',
|
||||||
'erp_pid' => 'int',
|
'erp_pid' => 'int',
|
||||||
|
'erp_code' => 'string',
|
||||||
'erp_path' => 'string',
|
'erp_path' => 'string',
|
||||||
'disabled' => 'int',
|
'disabled' => 'int',
|
||||||
'sync_time' => 'int',
|
'sync_time' => 'int',
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ class SysBannerItemBaseModel extends BaseModel
|
|||||||
'desc_txt_color' => 'string',
|
'desc_txt_color' => 'string',
|
||||||
'type' => 'string',
|
'type' => 'string',
|
||||||
'image' => 'string',
|
'image' => 'string',
|
||||||
|
'extra_image' => 'string',
|
||||||
'video' => 'string',
|
'video' => 'string',
|
||||||
'link_to' => 'string',
|
'link_to' => 'string',
|
||||||
'link' => 'string',
|
'link' => 'string',
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ class SysConfigGroupBaseModel extends BaseModel
|
|||||||
protected $schema = [
|
protected $schema = [
|
||||||
'id' => 'int',
|
'id' => 'int',
|
||||||
'language_id' => 'int',
|
'language_id' => 'int',
|
||||||
|
'unique_label' => 'string',
|
||||||
'name' => 'string',
|
'name' => 'string',
|
||||||
'sort' => 'int',
|
'sort' => 'int',
|
||||||
'status' => 'int',
|
'status' => 'int',
|
||||||
|
|||||||
@@ -111,3 +111,133 @@ if (!function_exists('lang_i18n')) {
|
|||||||
return Lang::get($lang_key, $vars, $lang);
|
return Lang::get($lang_key, $vars, $lang);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!function_exists('date_format_i18n')) {
|
||||||
|
/**
|
||||||
|
* 格式化日期时间为指定语言
|
||||||
|
* @param int|string $datetime 要格式化的日期时间字符串
|
||||||
|
* @param string $lang 语言标识
|
||||||
|
* @param bool $keep_time 是否保留时间
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function date_format_i18n(int|string|null $datetime, string $lang = '', bool $keep_time = false): string
|
||||||
|
{
|
||||||
|
// 处理语言标识,若未提供则使用当前语言设置,并转换为小写
|
||||||
|
$lang = $lang ?: Lang::getLangSet();
|
||||||
|
$lang = strtolower($lang);
|
||||||
|
|
||||||
|
// 处理日期时间输入
|
||||||
|
if (is_numeric($datetime)) {
|
||||||
|
// 若输入为数字,直接作为时间戳处理
|
||||||
|
$timestamp = (int)$datetime;
|
||||||
|
} elseif (is_string($datetime)) {
|
||||||
|
// 尝试将字符串转换为时间戳
|
||||||
|
$timestamp = strtotime($datetime);
|
||||||
|
if ($timestamp === false) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
// 根据$datetime传值决定格式
|
||||||
|
$date_parts = [];
|
||||||
|
if (is_numeric($datetime)) {
|
||||||
|
$date_str = date('Y-m-d', $timestamp);
|
||||||
|
$date_parts = explode('-', $date_str);
|
||||||
|
} elseif (is_string($datetime)) {
|
||||||
|
if (preg_match('/^\d{4}$/', $datetime)) {
|
||||||
|
$date_parts = [$datetime];
|
||||||
|
} elseif (preg_match('/^\d{4}-\d{1,2}$/', $datetime)) {
|
||||||
|
$date_parts = explode('-', $datetime);
|
||||||
|
} elseif (preg_match('/^\d{4}-\d{1,2}-\d{1,2}(.{1,9})?$/', $datetime)) {
|
||||||
|
$date_parts = explode('-', $datetime);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 定义默认格式
|
||||||
|
$fmt = '';
|
||||||
|
|
||||||
|
// 根据语言和日期部分数量设置日期格式
|
||||||
|
$format = [
|
||||||
|
'zh-cn' => [0 => '', 1 => 'Y', 2 => 'Y-m', 3 => 'Y-m-d'],
|
||||||
|
'en-us' => [0 => '', 1 => 'Y', 2 => 'F Y', 3 => 'F j, Y'],
|
||||||
|
'default' => [0 => '', 1 => 'Y', 2 => 'Y-m', 3 => 'Y-m-d']
|
||||||
|
];
|
||||||
|
$fmt = $format[$lang][count($date_parts)] ?? $format['default'][count($date_parts)];
|
||||||
|
|
||||||
|
// 若需要保留时间
|
||||||
|
if ($keep_time) {
|
||||||
|
if ($lang === 'en-us') {
|
||||||
|
$fmt .= ', g:i A';
|
||||||
|
} else {
|
||||||
|
$fmt .= ' H:i:s';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return date($fmt, $timestamp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!function_exists('get_platform')) {
|
||||||
|
/**
|
||||||
|
* 获取平台
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function get_platform(): string
|
||||||
|
{
|
||||||
|
$detect = new \Detection\MobileDetect();
|
||||||
|
$platform = 'pc';
|
||||||
|
|
||||||
|
if ($detect->isMobile() || $detect->isTablet()) {
|
||||||
|
$platform = 'mobile';
|
||||||
|
} else {
|
||||||
|
// 在非移动端环境,根据配置规则判断是否要显示移动端
|
||||||
|
$view_cfg = $view_cfg = [
|
||||||
|
'rule' => env('VIEW_TPL.RULE', 'query'),
|
||||||
|
'query' => [
|
||||||
|
'name' => env('VIEW_TPL.RULE_QUERY_NAME', 'mtpl'),
|
||||||
|
'value' => env('VIEW_TPL.RULE_QUERY_VALUE', '1'),
|
||||||
|
],
|
||||||
|
'domain' => [
|
||||||
|
'scheme' => env('VIEW_TPL.RULE_DOMAIN_SCHEME', ['http']),
|
||||||
|
'host' => env('VIEW_TPL.RULE_DOMAIN_HOST'),
|
||||||
|
],
|
||||||
|
];
|
||||||
|
if ($view_cfg['rule'] == 'query') {
|
||||||
|
$name = $view_cfg['query']['name'];
|
||||||
|
$value = $view_cfg['query']['value'];
|
||||||
|
if (request()->get($name) == $value) {
|
||||||
|
$platform = 'mobile';
|
||||||
|
}
|
||||||
|
} elseif ($view_cfg['rule'] == 'domain') {
|
||||||
|
$scheme = $view_cfg['domain']['scheme'];
|
||||||
|
$host = $view_cfg['domain']['host'];
|
||||||
|
if (in_array(request()->scheme(), $scheme) && $host == request()->host()) {
|
||||||
|
$platform = 'mobile';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $platform;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!function_exists('highlight_keywords')) {
|
||||||
|
/**
|
||||||
|
* 高亮关键词
|
||||||
|
* @param string $text // 要处理的文本
|
||||||
|
* @param string $keyword // 关键词
|
||||||
|
* @param string|callable $repalce // 替换函数或字符串
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function highlight_keywords(string $text, string $keyword, string|callable $replace): string
|
||||||
|
{
|
||||||
|
return preg_replace_callback('/' . preg_quote($keyword, '/') . '+/i', function($match) use($text, $replace) {
|
||||||
|
if (empty($match)) return $text;
|
||||||
|
if (is_string($replace)) return '<strong>' . $match[0] . '</strong>';
|
||||||
|
if (is_callable($replace)) return $replace($match[0]);
|
||||||
|
return $match[0];
|
||||||
|
}, $text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ return [
|
|||||||
// 扩展语言包
|
// 扩展语言包
|
||||||
'extend_list' => [
|
'extend_list' => [
|
||||||
'en-us' => [
|
'en-us' => [
|
||||||
app()->getAppPath() . '/lang/en-us/' . (request()->isMobile() ? 'mobile' : 'pc') . '.php',
|
app()->getAppPath() . '/lang/en-us/' . get_platform() . '.php',
|
||||||
app()->getAppPath() . '/lang/en-us/validate.php',
|
app()->getAppPath() . '/lang/en-us/validate.php',
|
||||||
],
|
],
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -2,10 +2,8 @@
|
|||||||
// +----------------------------------------------------------------------
|
// +----------------------------------------------------------------------
|
||||||
// | 模板设置
|
// | 模板设置
|
||||||
// +----------------------------------------------------------------------
|
// +----------------------------------------------------------------------
|
||||||
$view_device_name = 'pc';
|
|
||||||
if (request()->isMobile()) {
|
$view_device_name = get_platform();
|
||||||
$view_device_name = 'mobile';
|
|
||||||
}
|
|
||||||
|
|
||||||
return [
|
return [
|
||||||
// 模板引擎类型使用Think
|
// 模板引擎类型使用Think
|
||||||
|
|||||||
@@ -99,7 +99,25 @@ class Article extends Common
|
|||||||
$share_config = $this->getSysConfig($this->lang_id, ['article_share']);
|
$share_config = $this->getSysConfig($this->lang_id, ['article_share']);
|
||||||
View::assign('share_config', $share_config['article_share']);
|
View::assign('share_config', $share_config['article_share']);
|
||||||
|
|
||||||
|
// 获取文章评论数据
|
||||||
|
$comments = ArticleLeaveMessageModel::field([
|
||||||
|
'id',
|
||||||
|
'name',
|
||||||
|
'email',
|
||||||
|
'content',
|
||||||
|
'created_at'
|
||||||
|
])
|
||||||
|
->article($id)
|
||||||
|
->audited(true)
|
||||||
|
->order(['id' => 'desc'])
|
||||||
|
->limit(5)
|
||||||
|
->select();
|
||||||
|
View::assign('comments', $comments);
|
||||||
|
|
||||||
// 获取倒序或发布时间倒序3篇文章做为推荐文章
|
// 获取倒序或发布时间倒序3篇文章做为推荐文章
|
||||||
|
$category_model = new ArticleCategoryModel;
|
||||||
|
$parent_id = $category_model->bypk($detail['category_id'])->value('pid');
|
||||||
|
$categorys = $category_model->child($parent_id)->column('id');
|
||||||
$recommends = ArticleModel::field([
|
$recommends = ArticleModel::field([
|
||||||
'id',
|
'id',
|
||||||
'title',
|
'title',
|
||||||
@@ -107,6 +125,8 @@ class Article extends Common
|
|||||||
'image'
|
'image'
|
||||||
])
|
])
|
||||||
->where('id', '<>', $id)
|
->where('id', '<>', $id)
|
||||||
|
->language($this->lang_id)
|
||||||
|
->category($categorys)
|
||||||
->order(['release_time' => 'desc', 'id' => 'desc'])
|
->order(['release_time' => 'desc', 'id' => 'desc'])
|
||||||
->limit(3)
|
->limit(3)
|
||||||
->select();
|
->select();
|
||||||
@@ -150,9 +170,9 @@ class Article extends Common
|
|||||||
]);
|
]);
|
||||||
$ret = ArticleLeaveMessageModel::create($data);
|
$ret = ArticleLeaveMessageModel::create($data);
|
||||||
if ($ret->isEmpty()) {
|
if ($ret->isEmpty()) {
|
||||||
return error(lang('留言提交失败'));
|
return error(lang('信息提交失败!'));
|
||||||
}
|
}
|
||||||
|
|
||||||
return success(lang('留言提交成功'));
|
return success(lang('信息已成功提交!'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,14 +45,7 @@ class ContactUs extends Common
|
|||||||
$banner_map[$v->unique_label] = $v;
|
$banner_map[$v->unique_label] = $v;
|
||||||
}
|
}
|
||||||
$focus_image = data_get($banner_map, 'BANNER_6805e3d32dcc2')?->items->first()?->toArray();
|
$focus_image = data_get($banner_map, 'BANNER_6805e3d32dcc2')?->items->first()?->toArray();
|
||||||
$info_datas = data_get($banner_map, 'BANNER_6806090c1838f')?->items->each(function($item) {
|
$info_datas = data_get($banner_map, 'BANNER_6806090c1838f')?->items->toArray();
|
||||||
if (Str::contains($item->title, '<br/>')) {
|
|
||||||
$title = explode('<br/>', $item->title);
|
|
||||||
$item->title = $title[0];
|
|
||||||
$item->title_short = $title[1];
|
|
||||||
}
|
|
||||||
return $item;
|
|
||||||
})->toArray();
|
|
||||||
}
|
}
|
||||||
View::assign('focus_image', $focus_image);
|
View::assign('focus_image', $focus_image);
|
||||||
View::assign('info_datas', $info_datas);
|
View::assign('info_datas', $info_datas);
|
||||||
@@ -136,6 +129,7 @@ class ContactUs extends Common
|
|||||||
'corp_name',
|
'corp_name',
|
||||||
'email',
|
'email',
|
||||||
'phone',
|
'phone',
|
||||||
|
'website_url',
|
||||||
'business_type',
|
'business_type',
|
||||||
'enterprise_size',
|
'enterprise_size',
|
||||||
'address',
|
'address',
|
||||||
@@ -155,7 +149,7 @@ class ContactUs extends Common
|
|||||||
'email' => $form_data['email'],
|
'email' => $form_data['email'],
|
||||||
'phone' => $form_data['phone'],
|
'phone' => $form_data['phone'],
|
||||||
'referer_url' => request()->header('referer'),
|
'referer_url' => request()->header('referer'),
|
||||||
'website_url' => request()->header('host'),
|
'website_url' => $form_data['website_url'],
|
||||||
'business_type' => $form_data['business_type'],
|
'business_type' => $form_data['business_type'],
|
||||||
'enterprise_size' => $form_data['enterprise_size'],
|
'enterprise_size' => $form_data['enterprise_size'],
|
||||||
'address' => $form_data['address'],
|
'address' => $form_data['address'],
|
||||||
@@ -212,7 +206,7 @@ class ContactUs extends Common
|
|||||||
'last_name' => $form_data['last_name'],
|
'last_name' => $form_data['last_name'],
|
||||||
'email' => $form_data['email'],
|
'email' => $form_data['email'],
|
||||||
'phone' => $form_data['phone'],
|
'phone' => $form_data['phone'],
|
||||||
'interested' => $form_data['interested'],
|
'interested' => is_array($form_data['interested']) ? implode(',', $form_data['interested']) : $form_data['interested'],
|
||||||
'referer_url' => request()->header('referer'),
|
'referer_url' => request()->header('referer'),
|
||||||
'website_url' => request()->header('host'),
|
'website_url' => request()->header('host'),
|
||||||
'message' => $form_data['message'],
|
'message' => $form_data['message'],
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ class Faq extends Common
|
|||||||
'at_platform' => request()->from
|
'at_platform' => request()->from
|
||||||
])
|
])
|
||||||
->type('image')
|
->type('image')
|
||||||
|
->enabled()
|
||||||
->visible(['id', 'title', 'image', 'link'])
|
->visible(['id', 'title', 'image', 'link'])
|
||||||
->find();
|
->find();
|
||||||
View::assign('banner', $banner);
|
View::assign('banner', $banner);
|
||||||
|
|||||||
@@ -45,6 +45,7 @@ class Product extends Common
|
|||||||
->where('status', '=', 1)
|
->where('status', '=', 1)
|
||||||
->order(['sort' => 'asc', 'id' => 'desc']);
|
->order(['sort' => 'asc', 'id' => 'desc']);
|
||||||
}])
|
}])
|
||||||
|
->atPlatform(request()->from)
|
||||||
->uniqueLabel(['BANNER_6808abd813d78'])
|
->uniqueLabel(['BANNER_6808abd813d78'])
|
||||||
->language($this->lang_id)
|
->language($this->lang_id)
|
||||||
->enabled(true)
|
->enabled(true)
|
||||||
@@ -230,7 +231,7 @@ class Product extends Common
|
|||||||
$attr = $sku_attrs_map[$v['id']]?? [];
|
$attr = $sku_attrs_map[$v['id']]?? [];
|
||||||
if (!empty($attr)) {
|
if (!empty($attr)) {
|
||||||
foreach ($attr as $at) {
|
foreach ($attr as $at) {
|
||||||
if ($at['attr_name'] == '颜色') {
|
if (in_array($at['attr_name'], ['颜色', 'Color'])) {
|
||||||
$color_map[$v['product_id']][] = $at;
|
$color_map[$v['product_id']][] = $at;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -298,9 +299,10 @@ class Product extends Common
|
|||||||
'query' => request()->param()
|
'query' => request()->param()
|
||||||
])
|
])
|
||||||
->each(function ($item) use($keywords) {
|
->each(function ($item) use($keywords) {
|
||||||
$item['spu'] = str_replace($keywords, '<strong class="redpoint">'.$keywords.'</strong>', $item['spu']);
|
$replace = fn($txt) => '<strong class="redpoint">' . $txt . '</strong>';
|
||||||
$item['name'] = str_replace($keywords, '<strong class="redpoint">'.$keywords.'</strong>', $item['name']);
|
$item['spu'] = highlight_keywords($item['spu'], $keywords, $replace);
|
||||||
$item['short_name'] = str_replace($keywords, '<strong class="redpoint">'.$keywords.'</strong>', $item['short_name']);
|
$item['name'] = highlight_keywords($item['name'], $keywords, $replace);
|
||||||
|
$item['short_name'] = highlight_keywords($item['short_name'], $keywords, $replace);
|
||||||
return $item;
|
return $item;
|
||||||
});
|
});
|
||||||
View::assign('products', $products);
|
View::assign('products', $products);
|
||||||
@@ -372,6 +374,8 @@ class Product extends Common
|
|||||||
// 获取属性名称
|
// 获取属性名称
|
||||||
$attrs = ProductAttrModel::bypks(array_unique(Arr::pluck($sku_attrs, 'attr_id')))->column(['attr_name'], 'id');
|
$attrs = ProductAttrModel::bypks(array_unique(Arr::pluck($sku_attrs, 'attr_id')))->column(['attr_name'], 'id');
|
||||||
foreach ($sku_attrs as $v) {
|
foreach ($sku_attrs as $v) {
|
||||||
|
if (empty($v['attr_value'])) continue;
|
||||||
|
|
||||||
$v['attr_name'] = $attrs[$v['attr_id']]?? '';
|
$v['attr_name'] = $attrs[$v['attr_id']]?? '';
|
||||||
// 按属性分组
|
// 按属性分组
|
||||||
$product_sku_attrs[$v['attr_id']]['attr_id'] = $v['attr_id'];
|
$product_sku_attrs[$v['attr_id']]['attr_id'] = $v['attr_id'];
|
||||||
@@ -456,9 +460,9 @@ class Product extends Common
|
|||||||
'message' => $post['message'],
|
'message' => $post['message'],
|
||||||
]);
|
]);
|
||||||
if ($ret->isEmpty()) {
|
if ($ret->isEmpty()) {
|
||||||
return error(lang('提交成功'));
|
return error(lang('提交失败'));
|
||||||
}
|
}
|
||||||
return success(lang('提交失败'));
|
return success(lang('提交成功'));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -478,6 +482,7 @@ class Product extends Common
|
|||||||
->where('status', '=', 1)
|
->where('status', '=', 1)
|
||||||
->order(['sort' => 'asc', 'id' => 'desc']);
|
->order(['sort' => 'asc', 'id' => 'desc']);
|
||||||
}])
|
}])
|
||||||
|
->atPlatform(request()->from)
|
||||||
->uniqueLabel(['BANNER_680dd7ceaa529'])
|
->uniqueLabel(['BANNER_680dd7ceaa529'])
|
||||||
->language($this->lang_id)
|
->language($this->lang_id)
|
||||||
->enabled(true)
|
->enabled(true)
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ class TopicNas extends Common
|
|||||||
// 获取国家/语言列表
|
// 获取国家/语言列表
|
||||||
$languages = $this->getLanguages();
|
$languages = $this->getLanguages();
|
||||||
// 输出国家/语言列表
|
// 输出国家/语言列表
|
||||||
if (request()->isMobile()) {
|
if (get_platform() == 'mobile') {
|
||||||
View::assign('header_languages', $languages);
|
View::assign('header_languages', $languages);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -66,7 +66,8 @@ class TopicNas extends Common
|
|||||||
// 获取banner数据
|
// 获取banner数据
|
||||||
$banners = SysBannerModel::with(['items' => function($query) {
|
$banners = SysBannerModel::with(['items' => function($query) {
|
||||||
$query->withoutField(['sort', 'created_at', 'updated_at', 'deleted_at'])
|
$query->withoutField(['sort', 'created_at', 'updated_at', 'deleted_at'])
|
||||||
->order(['sort' => 'asc', 'id' => 'desc']);
|
->order(['sort' => 'asc', 'id' => 'desc'])
|
||||||
|
->enabled(true);
|
||||||
}])
|
}])
|
||||||
->atPlatform(request()->from)
|
->atPlatform(request()->from)
|
||||||
->uniqueLabel([
|
->uniqueLabel([
|
||||||
@@ -110,8 +111,11 @@ class TopicNas extends Common
|
|||||||
$trial_instructions = [];
|
$trial_instructions = [];
|
||||||
// 获取banner数据
|
// 获取banner数据
|
||||||
$banners = SysBannerModel::with(['items' => function($query) {
|
$banners = SysBannerModel::with(['items' => function($query) {
|
||||||
$query->withoutField(['sort', 'created_at', 'updated_at', 'deleted_at']);
|
$query->withoutField(['sort', 'created_at', 'updated_at', 'deleted_at'])
|
||||||
|
->order(['sort' => 'asc', 'id' => 'desc'])
|
||||||
|
->enabled(true);
|
||||||
}])
|
}])
|
||||||
|
->atPlatform(request()->from)
|
||||||
->uniqueLabel([
|
->uniqueLabel([
|
||||||
'BANNER_68103aaebe4c4',
|
'BANNER_68103aaebe4c4',
|
||||||
'BANNER_68103acd1a8b9',
|
'BANNER_68103acd1a8b9',
|
||||||
@@ -148,8 +152,11 @@ class TopicNas extends Common
|
|||||||
$cooperation_cotacts = [];
|
$cooperation_cotacts = [];
|
||||||
// 获取banner数据
|
// 获取banner数据
|
||||||
$banners = SysBannerModel::with(['items' => function($query) {
|
$banners = SysBannerModel::with(['items' => function($query) {
|
||||||
$query->withoutField(['sort', 'created_at', 'updated_at', 'deleted_at']);
|
$query->withoutField(['sort', 'created_at', 'updated_at', 'deleted_at'])
|
||||||
|
->order(['sort' => 'asc', 'id' => 'desc'])
|
||||||
|
->enabled(true);
|
||||||
}])
|
}])
|
||||||
|
->atPlatform(request()->from)
|
||||||
->uniqueLabel([
|
->uniqueLabel([
|
||||||
'BANNER_6810670b8ef17',
|
'BANNER_6810670b8ef17',
|
||||||
'BANNER_681067451b78f',
|
'BANNER_681067451b78f',
|
||||||
@@ -186,7 +193,9 @@ class TopicNas extends Common
|
|||||||
// 获取文章分类及文章数据
|
// 获取文章分类及文章数据
|
||||||
$parent = ArticleCategoryModel::uniqueLabel('CATEGORY_681182e0a4529')->language($this->lang_id)->value('id');
|
$parent = ArticleCategoryModel::uniqueLabel('CATEGORY_681182e0a4529')->language($this->lang_id)->value('id');
|
||||||
$article_categorys = ArticleCategoryModel::with(['article' => function($query) {
|
$article_categorys = ArticleCategoryModel::with(['article' => function($query) {
|
||||||
$query->field(['id', 'title', 'category_id'])->limit(3);
|
$query->field(['id', 'title', 'category_id'])
|
||||||
|
->order(['sort' => 'asc', 'id' => 'desc'])
|
||||||
|
->limit(3);
|
||||||
}])
|
}])
|
||||||
->field([
|
->field([
|
||||||
'id',
|
'id',
|
||||||
@@ -202,8 +211,11 @@ class TopicNas extends Common
|
|||||||
$contacts = [];
|
$contacts = [];
|
||||||
// 获取banner数据
|
// 获取banner数据
|
||||||
$banners = SysBannerModel::with(['items' => function ($query) {
|
$banners = SysBannerModel::with(['items' => function ($query) {
|
||||||
$query->withoutField(['sort', 'created_at', 'updated_at', 'deleted_at']);
|
$query->withoutField(['sort', 'created_at', 'updated_at', 'deleted_at'])
|
||||||
|
->order(['sort' => 'asc', 'id' => 'desc'])
|
||||||
|
->enabled(true);
|
||||||
}])
|
}])
|
||||||
|
->atPlatform(request()->from)
|
||||||
->uniqueLabel(['BANNER_6819754be2dc6'])
|
->uniqueLabel(['BANNER_6819754be2dc6'])
|
||||||
->language($this->lang_id)
|
->language($this->lang_id)
|
||||||
->enabled(true)
|
->enabled(true)
|
||||||
@@ -234,7 +246,7 @@ class TopicNas extends Common
|
|||||||
// 获取文章分类及文章数据
|
// 获取文章分类及文章数据
|
||||||
$parent = ArticleCategoryModel::uniqueLabel('CATEGORY_681182e0a4529')->language($this->lang_id)->value('id');
|
$parent = ArticleCategoryModel::uniqueLabel('CATEGORY_681182e0a4529')->language($this->lang_id)->value('id');
|
||||||
$article_categorys = ArticleCategoryModel::with(['article' => function ($query) {
|
$article_categorys = ArticleCategoryModel::with(['article' => function ($query) {
|
||||||
$query->field(['id', 'title', 'category_id']);
|
$query->field(['id', 'title', 'category_id'])->order(['sort' => 'asc', 'id' => 'desc']);
|
||||||
}])
|
}])
|
||||||
->field([
|
->field([
|
||||||
'id',
|
'id',
|
||||||
@@ -257,14 +269,35 @@ class TopicNas extends Common
|
|||||||
{
|
{
|
||||||
$keywords = request()->post('keywords');
|
$keywords = request()->post('keywords');
|
||||||
// 根据关键词查询文章
|
// 根据关键词查询文章
|
||||||
|
$parent = ArticleCategoryModel::uniqueLabel('CATEGORY_681182e0a4529')
|
||||||
|
->language($this->lang_id)
|
||||||
|
->value('id');
|
||||||
|
|
||||||
|
// 获取帮且中心分类子分类
|
||||||
|
$table_name = (new ArticleCategoryModel)->getTable();
|
||||||
|
$categorys = \think\facade\Db::query(preg_replace(
|
||||||
|
'/\s+/u',
|
||||||
|
' ',
|
||||||
|
"WITH RECURSIVE article_tree_by AS (
|
||||||
|
SELECT a.id, a.pid FROM $table_name a WHERE a.id = {$parent}
|
||||||
|
UNION ALL
|
||||||
|
SELECT k.id, k.pid FROM $table_name k INNER JOIN article_tree_by t ON t.id = k.pid
|
||||||
|
)
|
||||||
|
SELECT id FROM article_tree_by WHERE id <> {$parent}"
|
||||||
|
));
|
||||||
|
if (empty($categorys)) return success('success', []);
|
||||||
|
|
||||||
|
// 获取文章数据
|
||||||
$articles = ArticleModel::field([
|
$articles = ArticleModel::field([
|
||||||
'id',
|
'id',
|
||||||
|
'category_id',
|
||||||
'title'
|
'title'
|
||||||
])
|
])
|
||||||
->withSearch(['title'], [
|
->withSearch(['title'], [
|
||||||
'title' => $keywords??null
|
'title' => $keywords??null
|
||||||
])
|
])
|
||||||
->language($this->lang_id)
|
->language($this->lang_id)
|
||||||
|
->where('category_id', 'IN', array_column($categorys, 'id'))
|
||||||
->select();
|
->select();
|
||||||
|
|
||||||
return success('success', $articles->toArray());
|
return success('success', $articles->toArray());
|
||||||
@@ -278,8 +311,11 @@ class TopicNas extends Common
|
|||||||
$data = [];
|
$data = [];
|
||||||
// 获取banner数据
|
// 获取banner数据
|
||||||
$banners = SysBannerModel::with(['items' => function($query) {
|
$banners = SysBannerModel::with(['items' => function($query) {
|
||||||
$query->withoutField(['sort', 'created_at', 'updated_at', 'deleted_at']);
|
$query->withoutField(['sort', 'created_at', 'updated_at', 'deleted_at'])
|
||||||
|
->order(['sort' => 'asc', 'id' => 'desc'])
|
||||||
|
->enabled(true);
|
||||||
}])
|
}])
|
||||||
|
->atPlatform(request()->from)
|
||||||
->uniqueLabel([
|
->uniqueLabel([
|
||||||
'BANNER_6810798e6e828',
|
'BANNER_6810798e6e828',
|
||||||
'BANNER_68107a0a63910',
|
'BANNER_68107a0a63910',
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ return [
|
|||||||
'电子邮箱' => 'Email',
|
'电子邮箱' => 'Email',
|
||||||
'您的电子邮件地址不会被公开' => 'Your email address will not be pulished.',
|
'您的电子邮件地址不会被公开' => 'Your email address will not be pulished.',
|
||||||
'留言内容' => 'Comment',
|
'留言内容' => 'Comment',
|
||||||
|
'评论' => 'COMMENT',
|
||||||
'提交留言' => 'POST COMMENT',
|
'提交留言' => 'POST COMMENT',
|
||||||
'你可能还喜欢' => 'Recommended for you',
|
'你可能还喜欢' => 'Recommended for you',
|
||||||
'链接复制成功' => 'Link copied successfully',
|
'链接复制成功' => 'Link copied successfully',
|
||||||
@@ -178,4 +179,43 @@ return [
|
|||||||
'网络存储解决方案' => 'Network Storage Solutions',
|
'网络存储解决方案' => 'Network Storage Solutions',
|
||||||
'配套软件' => 'Software',
|
'配套软件' => 'Software',
|
||||||
],
|
],
|
||||||
|
|
||||||
|
// nas主题 - 客户合作页
|
||||||
|
'topicnas/cooperation' => [
|
||||||
|
'成为ORICO合作伙伴' => 'Be an ORICO partner',
|
||||||
|
'合作伙伴招募' => 'Partner recruitment',
|
||||||
|
'广告代理' => 'Advertising Agency',
|
||||||
|
'抖音销售' => 'Douyin Sales',
|
||||||
|
'代理经销合作' => 'Proxy and distribution cooperation',
|
||||||
|
'ODM合作' => 'ODM cooperation',
|
||||||
|
'合作优势' => 'Cooperation advantages',
|
||||||
|
'期待与您的合作' => 'Looking forward to working with you'
|
||||||
|
],
|
||||||
|
|
||||||
|
// nas主题 - 下载页
|
||||||
|
'topicnas/download' => [
|
||||||
|
'CyberData赛博云空间' => 'CyberData',
|
||||||
|
'Weline微链接' => 'Weline'
|
||||||
|
],
|
||||||
|
|
||||||
|
// nas主题 - 帮助页
|
||||||
|
'topicnas/help' => [
|
||||||
|
'帮助中心' => 'Quick Start Guide',
|
||||||
|
'请输入搜索关键字,如安装赛博云空间,影视库' => 'What are you looking for?',
|
||||||
|
'取消' => 'Cancel',
|
||||||
|
'使用教程' => 'User\' s Guide',
|
||||||
|
'查看更多' => 'Click to view more',
|
||||||
|
'联系我们' => 'Contact US',
|
||||||
|
'目录' => 'Content'
|
||||||
|
],
|
||||||
|
|
||||||
|
// nas主题 - 帮助详情页
|
||||||
|
'topicnas/helpdetail' => [
|
||||||
|
'帮助中心' => 'Quick Start Guide',
|
||||||
|
'请输入搜索关键字,如安装赛博云空间,影视库' => 'What are you looking for?',
|
||||||
|
'取消' => 'Cancel',
|
||||||
|
'使用教程' => 'User\' s Guide',
|
||||||
|
'联系我们' => 'Contact US',
|
||||||
|
'目录' => 'Content'
|
||||||
|
],
|
||||||
];
|
];
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
return [
|
return [
|
||||||
|
'首页' => 'Home',
|
||||||
'产品列表' => 'Products',
|
'产品列表' => 'Products',
|
||||||
'店铺' => 'Store',
|
'店铺' => 'Store',
|
||||||
'搜索记录' => 'Search History',
|
'搜索记录' => 'Search History',
|
||||||
@@ -35,6 +36,7 @@ return [
|
|||||||
'电子邮箱' => 'Email',
|
'电子邮箱' => 'Email',
|
||||||
'您的电子邮件地址不会被公开' => 'Your email address will not be pulished.',
|
'您的电子邮件地址不会被公开' => 'Your email address will not be pulished.',
|
||||||
'留言内容' => 'Comment',
|
'留言内容' => 'Comment',
|
||||||
|
'评论' => 'COMMENT',
|
||||||
'提交留言' => 'POST COMMENT',
|
'提交留言' => 'POST COMMENT',
|
||||||
'你可能还喜欢' => 'Recommended for you',
|
'你可能还喜欢' => 'Recommended for you',
|
||||||
'链接复制成功' => 'Link copied successfully',
|
'链接复制成功' => 'Link copied successfully',
|
||||||
@@ -51,14 +53,14 @@ return [
|
|||||||
'视频' => 'Videos',
|
'视频' => 'Videos',
|
||||||
'支持型号' => 'Supported Models',
|
'支持型号' => 'Supported Models',
|
||||||
'支持系统' => 'Supported Systems',
|
'支持系统' => 'Supported Systems',
|
||||||
'搜索型号' => 'Search model',
|
'搜索' => 'Search',
|
||||||
'查询无结果!' => 'No Result!',
|
'查询无结果!' => 'No Result!',
|
||||||
],
|
],
|
||||||
|
|
||||||
// 附件页 - 视频
|
// 附件页 - 视频
|
||||||
'attachment/video' => [
|
'attachment/video' => [
|
||||||
'软件和驱动程序' => 'Software and Drivers',
|
'软件和驱动程序' => 'Software and Drivers',
|
||||||
'搜索型号' => 'Search model',
|
'搜索' => 'Search',
|
||||||
'视频' => 'Videos',
|
'视频' => 'Videos',
|
||||||
'查询无此视频!' => 'No Video!',
|
'查询无此视频!' => 'No Video!',
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -9,17 +9,20 @@ return [
|
|||||||
'姓名不能超过:rule个字符' => 'Name cannot exceed :rule characters',
|
'姓名不能超过:rule个字符' => 'Name cannot exceed :rule characters',
|
||||||
'电话号码不能为空' => 'Phone Number is required',
|
'电话号码不能为空' => 'Phone Number is required',
|
||||||
'电话号码不能超过:rule个字符' => 'Phone number cannot exceed :rule characters',
|
'电话号码不能超过:rule个字符' => 'Phone number cannot exceed :rule characters',
|
||||||
|
'感兴趣的产品种类不能为空' => 'Interested product categories is required',
|
||||||
'感兴趣的产品种类不能超过:rule个字符' => 'Interested product categories cannot exceed :rule characters',
|
'感兴趣的产品种类不能超过:rule个字符' => 'Interested product categories cannot exceed :rule characters',
|
||||||
'邮箱不能为空' => 'Email is required',
|
'邮箱不能为空' => 'Email is required',
|
||||||
'邮箱格式不正确' => 'Email format is incorrect',
|
'邮箱格式不正确' => 'Email format is incorrect',
|
||||||
'邮箱不能超过:rule个字符' => 'Email cannot exceed :rule characters',
|
'邮箱不能超过:rule个字符' => 'Email cannot exceed :rule characters',
|
||||||
'国家不能为空' => 'Country is required',
|
'国家不能为空' => 'Country is required',
|
||||||
'国家不能超过:rule个字符' => 'Country cannot exceed :rule characters',
|
'国家不能超过:rule个字符' => 'Country cannot exceed :rule characters',
|
||||||
|
'网址格式不正确' => 'URL format is incorrect',
|
||||||
'网址不能超过:rule个字符' => 'URL cannot exceed :rule characters',
|
'网址不能超过:rule个字符' => 'URL cannot exceed :rule characters',
|
||||||
'公司名称不能为空' => 'Company Name is required',
|
'公司名称不能为空' => 'Company Name is required',
|
||||||
'公司名称不能超过:rule个字符' => 'Company name cannot exceed :rule characters',
|
'公司名称不能超过:rule个字符' => 'Company name cannot exceed :rule characters',
|
||||||
'公司地址不能为空' => 'Company Address is required',
|
'公司地址不能为空' => 'Company Address is required',
|
||||||
'公司地址不能超过:rule个字符' => 'Company Address cannot exceed :rule characters',
|
'公司地址不能超过:rule个字符' => 'Company Address cannot exceed :rule characters',
|
||||||
|
'留言不能为空' => 'Message is required',
|
||||||
'企业规模不能为空' => 'Enterprise Size is required',
|
'企业规模不能为空' => 'Enterprise Size is required',
|
||||||
'企业规模不能超过:rule个字符' => 'Enterprise Size cannot exceed :rule characters',
|
'企业规模不能超过:rule个字符' => 'Enterprise Size cannot exceed :rule characters',
|
||||||
'业务类型不能为空' => 'Type of Business is required',
|
'业务类型不能为空' => 'Type of Business is required',
|
||||||
|
|||||||
@@ -15,10 +15,7 @@ class ConfirmRequestFrom
|
|||||||
public function handle($request, \Closure $next)
|
public function handle($request, \Closure $next)
|
||||||
{
|
{
|
||||||
// 确认请求来源
|
// 确认请求来源
|
||||||
$request->from = 'pc';
|
$request->from = get_platform();
|
||||||
if ($request->isMobile()) {
|
|
||||||
$request->from = 'mobile';
|
|
||||||
}
|
|
||||||
|
|
||||||
return $next($request);
|
return $next($request);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,6 +46,17 @@ class ArticleCategoryModel extends ArticleCategoryBaseModel
|
|||||||
$query->where('pid', '=', $parent);
|
$query->where('pid', '=', $parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 所属子分类范围查询
|
||||||
|
public function scopeChild($query, $id, $merge_self = false)
|
||||||
|
{
|
||||||
|
$query->where(function($q) use($id, $merge_self) {
|
||||||
|
$q->where('pid', '=', $id);
|
||||||
|
if ($merge_self) {
|
||||||
|
$q->whereOr('id', '=', $id);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// 是否显示状态范围查询
|
// 是否显示状态范围查询
|
||||||
public function scopeIsShow($query, bool $is_show)
|
public function scopeIsShow($query, bool $is_show)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -16,4 +16,16 @@ class ArticleLeaveMessageModel extends ArticleLeaveMessageBaseModel
|
|||||||
use SoftDelete;
|
use SoftDelete;
|
||||||
// 软删除字段
|
// 软删除字段
|
||||||
protected $deleteTime = 'deleted_at';
|
protected $deleteTime = 'deleted_at';
|
||||||
|
|
||||||
|
// 文章文章范围查询
|
||||||
|
public function scopeArticle($query, $article_id)
|
||||||
|
{
|
||||||
|
$query->where('article_id', '=', $article_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 审核状态范围查询
|
||||||
|
public function scopeAudited($query, bool $is_audited = true)
|
||||||
|
{
|
||||||
|
$query->where('is_audited', '=', (int)$is_audited);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,6 +32,11 @@ class ArticleModel extends ArticleBaseModel
|
|||||||
// 文章分类范围查询
|
// 文章分类范围查询
|
||||||
public function scopeCategory($query, $category)
|
public function scopeCategory($query, $category)
|
||||||
{
|
{
|
||||||
|
if (is_null($category)) return;
|
||||||
|
if (is_array($category)) {
|
||||||
|
$query->where('category_id', 'in', $category);
|
||||||
|
return;
|
||||||
|
}
|
||||||
$query->where('category_id', '=', $category);
|
$query->where('category_id', '=', $category);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -79,6 +79,6 @@ class ProductModel extends ProductBaseModel
|
|||||||
// 关键词搜索
|
// 关键词搜索
|
||||||
public function searchKeywordsAttr($query, string $keywords)
|
public function searchKeywordsAttr($query, string $keywords)
|
||||||
{
|
{
|
||||||
$query->whereRaw('BINARY spu LIKE "%' . $keywords . '%" OR BINARY name LIKE "%' . $keywords . '%" OR BINARY short_name LIKE "%' . $keywords . '%"');
|
$query->whereRaw('spu LIKE "%' . $keywords . '%" OR name LIKE "%' . $keywords . '%" OR short_name LIKE "%' . $keywords . '%"');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,12 +15,12 @@ class ContactUsBulkBuyValidate extends Validate
|
|||||||
*/
|
*/
|
||||||
protected $rule = [
|
protected $rule = [
|
||||||
'corp_name' => 'require|max:128',
|
'corp_name' => 'require|max:128',
|
||||||
'url' => 'max:255',
|
'url' => 'url|max:255',
|
||||||
'first_name' => 'require|max:64',
|
'first_name' => 'require|max:64',
|
||||||
'last_name' => 'require|max:64',
|
'last_name' => 'require|max:64',
|
||||||
'email' => 'require|email|max:128',
|
'email' => 'require|email|max:128',
|
||||||
'phone' => 'max:32',
|
'phone' => 'max:32',
|
||||||
'interested' => 'max:255',
|
'interested' => 'require|max:255',
|
||||||
'message' => 'require|max:1024',
|
'message' => 'require|max:1024',
|
||||||
];
|
];
|
||||||
|
|
||||||
@@ -33,6 +33,7 @@ class ContactUsBulkBuyValidate extends Validate
|
|||||||
protected $message = [
|
protected $message = [
|
||||||
'corp_name.require' => '公司名称不能为空',
|
'corp_name.require' => '公司名称不能为空',
|
||||||
'corp_name.max' => '公司名称不能超过:rule个字符',
|
'corp_name.max' => '公司名称不能超过:rule个字符',
|
||||||
|
'url.url' => '网址格式不正确',
|
||||||
'url.max' => '网址不能超过:rule个字符',
|
'url.max' => '网址不能超过:rule个字符',
|
||||||
'first_name.require' => '名不能为空',
|
'first_name.require' => '名不能为空',
|
||||||
'first_name.max' => '名不能超过:rule个字符',
|
'first_name.max' => '名不能超过:rule个字符',
|
||||||
@@ -42,6 +43,7 @@ class ContactUsBulkBuyValidate extends Validate
|
|||||||
'email.email' => '邮箱格式不正确',
|
'email.email' => '邮箱格式不正确',
|
||||||
'email.max' => '邮箱不能超过:rule个字符',
|
'email.max' => '邮箱不能超过:rule个字符',
|
||||||
'phone.max' => '电话号码不能超过:rule个字符',
|
'phone.max' => '电话号码不能超过:rule个字符',
|
||||||
|
'interested.require' => '感兴趣的产品种类不能为空',
|
||||||
'interested.max' => '感兴趣的产品种类不能超过:rule个字符',
|
'interested.max' => '感兴趣的产品种类不能超过:rule个字符',
|
||||||
'message.require' => '留言内容不能为空',
|
'message.require' => '留言内容不能为空',
|
||||||
'message.max' => '留言内容不能超过:rule个字符',
|
'message.max' => '留言内容不能超过:rule个字符',
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ class ContactUsDistributorValidate extends Validate
|
|||||||
'corp_name' => 'require|max:64',
|
'corp_name' => 'require|max:64',
|
||||||
'email' => 'require|email|max:128',
|
'email' => 'require|email|max:128',
|
||||||
'phone' => 'require|max:64',
|
'phone' => 'require|max:64',
|
||||||
|
'website_url' => 'url|max:255',
|
||||||
'business_type' => 'require|max:128',
|
'business_type' => 'require|max:128',
|
||||||
'enterprise_size' => 'require|max:128',
|
'enterprise_size' => 'require|max:128',
|
||||||
'address' => 'require|max:255',
|
'address' => 'require|max:255',
|
||||||
@@ -37,6 +38,8 @@ class ContactUsDistributorValidate extends Validate
|
|||||||
'email.max' => '邮箱不能超过:rule个字符',
|
'email.max' => '邮箱不能超过:rule个字符',
|
||||||
'phone.require' => '电话号码不能为空',
|
'phone.require' => '电话号码不能为空',
|
||||||
'phone.max' => '电话号码不能超过:rule个字符',
|
'phone.max' => '电话号码不能超过:rule个字符',
|
||||||
|
'website_url.url' => '网址格式不正确',
|
||||||
|
'website_url.max' => '网址不能超过:rule个字符',
|
||||||
'business_type.require' => '业务类型不能为空',
|
'business_type.require' => '业务类型不能为空',
|
||||||
'business_type.max' => '业务类型不能超过:rule个字符',
|
'business_type.max' => '业务类型不能超过:rule个字符',
|
||||||
'enterprise_size.require' => '企业规模不能为空',
|
'enterprise_size.require' => '企业规模不能为空',
|
||||||
|
|||||||
@@ -21,10 +21,23 @@
|
|||||||
<div class="blog_detail">
|
<div class="blog_detail">
|
||||||
<div class="blog_title">
|
<div class="blog_title">
|
||||||
<h2>{$detail.title}</h2>
|
<h2>{$detail.title}</h2>
|
||||||
<p>{$detail.release_time}</p>
|
<p>{$detail.release_time|date_format_i18n}</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="blog_content">{$detail.content|raw}</div>
|
<div class="blog_content">{$detail.content|raw}</div>
|
||||||
</div>
|
</div>
|
||||||
|
{notempty name="comments"}
|
||||||
|
<div class="pl_box">
|
||||||
|
<div class="blog_pl">
|
||||||
|
<h3>{:lang_i18n('评论')}</h3>
|
||||||
|
{volist name="comments" id="cm"}
|
||||||
|
<div class="plitem">
|
||||||
|
<div class="pl_name">{$cm.name}:</div>
|
||||||
|
<div class="pl_text">{$cm.content}</div>
|
||||||
|
</div>
|
||||||
|
{/volist}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{/notempty}
|
||||||
<div class="share_box">
|
<div class="share_box">
|
||||||
{notempty name="share_config"}
|
{notempty name="share_config"}
|
||||||
<div class="blog_share">
|
<div class="blog_share">
|
||||||
@@ -37,7 +50,7 @@
|
|||||||
{notempty name="sc.url.value"}href="{$sc.url.value}"{/notempty}>
|
{notempty name="sc.url.value"}href="{$sc.url.value}"{/notempty}>
|
||||||
{eq name=":array_key_exists('triggered_qrcode', $sc)" value="true"}
|
{eq name=":array_key_exists('triggered_qrcode', $sc)" value="true"}
|
||||||
<img class="toggle_qrcode" src="{$sc.image.value}" />
|
<img class="toggle_qrcode" src="{$sc.image.value}" />
|
||||||
<div class="triggered_qrcode">
|
<div class="triggered_qrcode wechat_code">
|
||||||
<img src="{$sc.triggered_qrcode.value}" />
|
<img src="{$sc.triggered_qrcode.value}" />
|
||||||
</div>
|
</div>
|
||||||
{else /}
|
{else /}
|
||||||
@@ -73,7 +86,7 @@
|
|||||||
<p class="thtitle">{:lang_i18n('你可能还喜欢')}</p>
|
<p class="thtitle">{:lang_i18n('你可能还喜欢')}</p>
|
||||||
<p><img src="__IMAGES__/1line.webp"></p>
|
<p><img src="__IMAGES__/1line.webp"></p>
|
||||||
</div>
|
</div>
|
||||||
<div class="swiper-container loveswiper">
|
<div class="swiper loveswiper">
|
||||||
<div class="swiper-wrapper">
|
<div class="swiper-wrapper">
|
||||||
{volist name="recommends" id="vo"}
|
{volist name="recommends" id="vo"}
|
||||||
<div class="swiper-slide">
|
<div class="swiper-slide">
|
||||||
@@ -115,18 +128,15 @@
|
|||||||
})
|
})
|
||||||
|
|
||||||
$('.toggle_qrcode').click(function() {
|
$('.toggle_qrcode').click(function() {
|
||||||
$(this).siblings('.triggered_qrcode').toggle();
|
const qrcode = $(this).siblings('.triggered_qrcode');
|
||||||
})
|
qrcode.css('display', qrcode.css('display') === 'none' ? 'flex' : 'none');
|
||||||
|
});
|
||||||
})
|
})
|
||||||
//banner轮播
|
//banner轮播
|
||||||
var loveswiper = new Swiper('.loveswiper', {
|
var loveswiper = new Swiper('.loveswiper', {
|
||||||
// 配置选项
|
// 配置选项
|
||||||
slidesPerView: 2,
|
slidesPerView: 2,
|
||||||
spaceBetween: 30,
|
spaceBetween: 30,
|
||||||
loop: true,
|
|
||||||
autoplay: {
|
|
||||||
delay: 3000,
|
|
||||||
},
|
|
||||||
pagination: {
|
pagination: {
|
||||||
el: '.swiper-pagination',
|
el: '.swiper-pagination',
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,7 +32,7 @@
|
|||||||
<form action="{:url('article/index', ['pid' => $Request.param.pid])}" method="get" autocomplete="off">
|
<form action="{:url('article/index', ['pid' => $Request.param.pid])}" method="get" autocomplete="off">
|
||||||
<input type="text" class="search" id="article-blog-in" name="keywords" value="">
|
<input type="text" class="search" id="article-blog-in" name="keywords" value="">
|
||||||
<input type="hidden" class="search" id="article-blog-in" name="cid" value="{$Request.get.cid}">
|
<input type="hidden" class="search" id="article-blog-in" name="cid" value="{$Request.get.cid}">
|
||||||
<button id="blog-btnput" class="search-button-blog" style="padding:5px 12px;">{:lang_i18n('搜索')}</button>
|
<button id="blog-btnput" class="search-button-blog">{:lang_i18n('搜索')}</button>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
{notempty name="articles"}
|
{notempty name="articles"}
|
||||||
@@ -45,7 +45,7 @@
|
|||||||
<h3>{$ar.title}</h3>
|
<h3>{$ar.title}</h3>
|
||||||
<p>{$ar.desc|raw}</p>
|
<p>{$ar.desc|raw}</p>
|
||||||
</a>
|
</a>
|
||||||
<span class="blue">{$ar.release_time|default=''|date='Y-m-d'}</span>
|
<span class="blue">{$ar.release_time|date_format_i18n}</span>
|
||||||
</li>
|
</li>
|
||||||
{/volist}
|
{/volist}
|
||||||
</ul>
|
</ul>
|
||||||
|
|||||||
@@ -44,12 +44,12 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="theit">
|
<div class="theit">
|
||||||
<div class="bditem bditem1">
|
<div class="bditem bditem1">
|
||||||
<label class="itlable">{:lang_i18n('您对哪个产品品类感兴趣?')}</label>
|
<label class="itlable">{:lang_i18n('您对哪个产品品类感兴趣?')}<span class="redtag">*</span></label>
|
||||||
<div class="sfbchecks">
|
<div class="sfbchecks">
|
||||||
{notempty name="interested"}
|
{notempty name="interested"}
|
||||||
{volist name="interested" id="it"}
|
{volist name="interested" id="it"}
|
||||||
<label class="cit">
|
<label class="cit">
|
||||||
<input name="interested" type="checkbox" value="{$it}" class="sfbcheckboxit" />{$it}
|
<input name="interested[]" type="checkbox" value="{$it}" class="sfbcheckboxit" />{$it}
|
||||||
</label>
|
</label>
|
||||||
{/volist}
|
{/volist}
|
||||||
{/notempty}
|
{/notempty}
|
||||||
|
|||||||
@@ -19,19 +19,19 @@
|
|||||||
<div class="theit">
|
<div class="theit">
|
||||||
<div class="bditem">
|
<div class="bditem">
|
||||||
<label class="itlable">{:lang_i18n('公司名称')}<span class="redtag">*</span></label>
|
<label class="itlable">{:lang_i18n('公司名称')}<span class="redtag">*</span></label>
|
||||||
<input type="text" class="form-control itinp companyName" placeholder="{:lang_i18n('请输入公司名称')}" />
|
<input type="text" name="corp_name" class="form-control itinp companyName" placeholder="{:lang_i18n('请输入公司名称')}" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="theit">
|
<div class="theit">
|
||||||
<div class="bditem">
|
<div class="bditem">
|
||||||
<label class="itlable">{:lang_i18n('电子邮件')}<span class="redtag">*</span></label>
|
<label class="itlable">{:lang_i18n('电子邮件')}<span class="redtag">*</span></label>
|
||||||
<input type="text" class="form-control itinp email" placeholder="{:lang_i18n('请输入邮箱')}" />
|
<input type="text" name="email" class="form-control itinp email" placeholder="{:lang_i18n('请输入邮箱')}" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="theit">
|
<div class="theit">
|
||||||
<div class="bditem bditem1">
|
<div class="bditem bditem1">
|
||||||
<label class="itlable">{:lang_i18n('电话号码')}<span class="redtag">*</span></label>
|
<label class="itlable">{:lang_i18n('电话号码')}<span class="redtag">*</span></label>
|
||||||
<input type="text" class="form-control itinp mphone" placeholder="{:lang_i18n('请输入电话号码')}" />
|
<input type="text" name="phone" class="form-control itinp mphone" placeholder="{:lang_i18n('请输入电话号码')}" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="theit">
|
<div class="theit">
|
||||||
@@ -47,7 +47,7 @@
|
|||||||
<div class="theit">
|
<div class="theit">
|
||||||
<div class="bditem">
|
<div class="bditem">
|
||||||
<label class="itlable">{:lang_i18n('在线商店网址')}</label>
|
<label class="itlable">{:lang_i18n('在线商店网址')}</label>
|
||||||
<input type="text" class="form-control itinp url" placeholder="{:lang_i18n('请输入网址')}" />
|
<input type="text" name="website_url" class="form-control itinp url" placeholder="{:lang_i18n('请输入网址')}" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="theit">
|
<div class="theit">
|
||||||
@@ -63,13 +63,13 @@
|
|||||||
<div class="theit">
|
<div class="theit">
|
||||||
<div class="bditem bditem1">
|
<div class="bditem bditem1">
|
||||||
<label class="itlable">{:lang_i18n('公司地址')}<span class="redtag">*</span></label>
|
<label class="itlable">{:lang_i18n('公司地址')}<span class="redtag">*</span></label>
|
||||||
<input type="text" class="form-control itinp address" placeholder="{:lang_i18n('请输入地址')}">
|
<input type="text" name="address" class="form-control itinp address" placeholder="{:lang_i18n('请输入地址')}">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="theit">
|
<div class="theit">
|
||||||
<div class="bditem bditem1">
|
<div class="bditem bditem1">
|
||||||
<label class="itlable">{:lang_i18n('留言')}<span class="redtag">*</span></label>
|
<label class="itlable">{:lang_i18n('留言')}<span class="redtag">*</span></label>
|
||||||
<textarea class="ittextarea message" placeholder="{:lang_i18n('请输入留言')}"></textarea>
|
<textarea name="message" class="ittextarea message" placeholder="{:lang_i18n('请输入留言')}"></textarea>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -23,14 +23,14 @@
|
|||||||
{volist name="ch" id="item"}
|
{volist name="ch" id="item"}
|
||||||
<div class="narskfit" {notempty name="item.link"}onclick="location.href='{$item.link}'"{/notempty}>
|
<div class="narskfit" {notempty name="item.link"}onclick="location.href='{$item.link}'"{/notempty}>
|
||||||
<img src="{$item.image}" class="narskico-img" />
|
<img src="{$item.image}" class="narskico-img" />
|
||||||
<span class="narskf-title">{$item.title}</span>
|
<span class="narskf-title" {:style(['color' => $item['title_txt_color']])}>{$item.title}</span>
|
||||||
{notempty name="item.title_short"}
|
|
||||||
<span class="narskf-sm">{$item.title_short}</span>
|
|
||||||
{/notempty}
|
|
||||||
{notempty name="item.desc"}
|
{notempty name="item.desc"}
|
||||||
{if condition="str_contains($item.desc, '<img')"}
|
<span class="narskf-sm" {:style(['color' => $item['desc_txt_color']])}>{$item.desc|raw}</span>
|
||||||
<div class="narskfactive-ewm" style="display: none;">{$item.desc|raw}</div>
|
{/notempty}
|
||||||
{/if}
|
{notempty name="item.extra_image"}
|
||||||
|
<div class="narskfactive-ewm" style="display: none;">
|
||||||
|
<img src="{$item.extra_image}" alt="" />
|
||||||
|
</div>
|
||||||
{/notempty}
|
{/notempty}
|
||||||
</div>
|
</div>
|
||||||
{/volist}
|
{/volist}
|
||||||
@@ -41,8 +41,8 @@
|
|||||||
<div class="narskfit narskfit2">
|
<div class="narskfit narskfit2">
|
||||||
<img src="{$item.image}" class="narskico-img">
|
<img src="{$item.image}" class="narskico-img">
|
||||||
<div class="narskfit2-ct">
|
<div class="narskfit2-ct">
|
||||||
<span class="narskf-title">{$item.title}</span>
|
<span class="narskf-title" {:style(['color' => $item['title_txt_color']])}>{$item.title}</span>
|
||||||
<span class="narskf-sm">{$item.desc|raw}</span>
|
<span class="narskf-sm" {:style(['color' => $item['desc_txt_color']])}>{$item.desc|raw}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -63,7 +63,7 @@
|
|||||||
<div class="question">
|
<div class="question">
|
||||||
<div class="title">{:lang_i18n('您的问题')} <span class="red">*</span></div>
|
<div class="title">{:lang_i18n('您的问题')} <span class="red">*</span></div>
|
||||||
<div class="des">
|
<div class="des">
|
||||||
<textarea rows="6" name="message" id="message" class="ittextarea message" placeholder="{:lang_i18n('请输入内容...')}"></textarea>
|
<textarea rows="6" name="content" id="message" class="ittextarea message" placeholder="{:lang_i18n('请输入内容...')}"></textarea>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="question">
|
<div class="question">
|
||||||
|
|||||||
@@ -101,8 +101,8 @@
|
|||||||
<a href="{$sc.link}"><img src="{$sc.image}" /></a>
|
<a href="{$sc.link}"><img src="{$sc.image}" /></a>
|
||||||
<div class="position_a text_center wow animated bounceInLeft">
|
<div class="position_a text_center wow animated bounceInLeft">
|
||||||
<p class="f_weight_500 timetitle" {:style(['color'=>$sc['title_txt_color']])}>{$sc.title}</p>
|
<p class="f_weight_500 timetitle" {:style(['color'=>$sc['title_txt_color']])}>{$sc.title}</p>
|
||||||
<p class=" margin-top-14 f_weight_100 timedesin" {:style(['color'=>$sc['desc_txt_color']])}>{$sc.desc}</p>
|
<p class=" margin-top-14 f_weight_400 timedesin" {:style(['color'=>$sc['desc_txt_color']])}>{$sc.desc}</p>
|
||||||
<p class=" margin-top-20 f_weight_100">
|
<p class=" margin-top-20 f_weight_400">
|
||||||
<a href="{$sc.link}" class="timeblue"> {:lang_i18n('了解更多')} <img src="__IMAGES__/more-r.png"></a>
|
<a href="{$sc.link}" class="timeblue"> {:lang_i18n('了解更多')} <img src="__IMAGES__/more-r.png"></a>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
@@ -141,8 +141,8 @@
|
|||||||
<img src="{$bs.image}">
|
<img src="{$bs.image}">
|
||||||
<div class="position_a text_center">
|
<div class="position_a text_center">
|
||||||
<p class=" timetitle" {:style(['color'=>$bs['title_txt_color']])}>{$bs.title} </p>
|
<p class=" timetitle" {:style(['color'=>$bs['title_txt_color']])}>{$bs.title} </p>
|
||||||
<p class=" margin-top-14 f_weight_100 timedesin" {:style(['color'=>$bs['desc_txt_color']])}>{$bs.desc}</p>
|
<p class=" margin-top-14 f_weight_400 timedesin" {:style(['color'=>$bs['desc_txt_color']])}>{$bs.desc}</p>
|
||||||
<p class=" margin-top-20 f_weight_100">
|
<p class=" margin-top-20 f_weight_400">
|
||||||
<span class=" timeblue">
|
<span class=" timeblue">
|
||||||
<a href="{$bs.link}">{:lang_i18n('了解更多')}<img src="__IMAGES__/more-r.png"></a>
|
<a href="{$bs.link}">{:lang_i18n('了解更多')}<img src="__IMAGES__/more-r.png"></a>
|
||||||
</span>
|
</span>
|
||||||
@@ -310,6 +310,16 @@
|
|||||||
icon.removeClass('icon-jian-svg').addClass('icon-add-svg');
|
icon.removeClass('icon-jian-svg').addClass('icon-add-svg');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// 判断年份
|
||||||
|
// 计算.timeline下的li元素数量
|
||||||
|
var liCount = $('.timeline ol li').length;
|
||||||
|
|
||||||
|
// 如果有li元素,则设置a标签的宽度
|
||||||
|
if (liCount > 0) {
|
||||||
|
var widthPerItem = (100 / liCount-0.3) + '%';
|
||||||
|
$('.timeline ol li a').css('width', widthPerItem);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
{/block}
|
{/block}
|
||||||
@@ -9,7 +9,7 @@
|
|||||||
<div>
|
<div>
|
||||||
{volist name="focus_image" id="fi"}
|
{volist name="focus_image" id="fi"}
|
||||||
<a {notempty name="fi.link" }href="{$fi.link}"{/notempty}>
|
<a {notempty name="fi.link" }href="{$fi.link}"{/notempty}>
|
||||||
<img src="{$fi.image}" />
|
<img src="{$fi.image}" style="width: 100%;margin-top: 3.5rem;"/>
|
||||||
</a>
|
</a>
|
||||||
{/volist}
|
{/volist}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -37,6 +37,13 @@
|
|||||||
<img src="{$photo}" alt="" />
|
<img src="{$photo}" alt="" />
|
||||||
</div>
|
</div>
|
||||||
{/volist}
|
{/volist}
|
||||||
|
{if condition="!empty($product.video_img) && !empty($product.video_url) && $idx == 1"}
|
||||||
|
<div class="swiper-slide">
|
||||||
|
<video poster="{$product.video_img}" autoplay="autoplay" muted="muted" loop="loop" id="video" controls>
|
||||||
|
<source src="{$product.video_url}" type="video/mp4"/>
|
||||||
|
</video>
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
<!-- 如果需要分页器 -->
|
<!-- 如果需要分页器 -->
|
||||||
<div class="swiper-pagination"></div>
|
<div class="swiper-pagination"></div>
|
||||||
@@ -44,9 +51,9 @@
|
|||||||
{/volist}
|
{/volist}
|
||||||
</div>
|
</div>
|
||||||
{/notempty}
|
{/notempty}
|
||||||
<!-- 规格参数-->
|
<!-- 规格参数 -->
|
||||||
<div class="m_Container">
|
<div class="m_Container">
|
||||||
<!--多颜色-->
|
<!-- 颜色/属性 -->
|
||||||
{notempty name="product_sku_attrs"}
|
{notempty name="product_sku_attrs"}
|
||||||
<div class="slideTxtBox">
|
<div class="slideTxtBox">
|
||||||
<div class="hd clearfix">
|
<div class="hd clearfix">
|
||||||
@@ -57,7 +64,11 @@
|
|||||||
<ul class="hd clearfix">
|
<ul class="hd clearfix">
|
||||||
{volist name="ps.attr_values" id="pv" key="pk"}
|
{volist name="ps.attr_values" id="pv" key="pk"}
|
||||||
{assign name="attr_value_type" value=":rgb_or_image($pv.attr_value)" /}
|
{assign name="attr_value_type" value=":rgb_or_image($pv.attr_value)" /}
|
||||||
|
{between name="ps.attr_id" value="1,2"}
|
||||||
<li class="attr_value tip1 attr_item" data-index="{$pk}">
|
<li class="attr_value tip1 attr_item" data-index="{$pk}">
|
||||||
|
{else/}
|
||||||
|
<li class="attr_value tip1 attr_item_defalut" data-index="{$pk}">
|
||||||
|
{/between}
|
||||||
{eq name="attr_value_type" value="IMAGE"}
|
{eq name="attr_value_type" value="IMAGE"}
|
||||||
<span class="co-bg"><img src="{$pv.attr_value}" /></span>
|
<span class="co-bg"><img src="{$pv.attr_value}" /></span>
|
||||||
{elseif condition="$attr_value_type == 'RGB'" /}
|
{elseif condition="$attr_value_type == 'RGB'" /}
|
||||||
@@ -96,7 +107,9 @@
|
|||||||
</div>
|
</div>
|
||||||
{/notempty}
|
{/notempty}
|
||||||
<div class="platform_buy">
|
<div class="platform_buy">
|
||||||
|
{eq name=":cookie('think_lang')" value="en-us"}
|
||||||
<a class="btn-blue-detail business-button">{:lang_i18n('发送查询')}</a>
|
<a class="btn-blue-detail business-button">{:lang_i18n('发送查询')}</a>
|
||||||
|
{/eq}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!-- 产品描述 -->
|
<!-- 产品描述 -->
|
||||||
@@ -104,7 +117,7 @@
|
|||||||
<ul class="cpa des cursor_p">
|
<ul class="cpa des cursor_p">
|
||||||
<li class="active" id="one">{:lang_i18n('产品描述')}</li>
|
<li class="active" id="one">{:lang_i18n('产品描述')}</li>
|
||||||
{notempty name="product_related"}
|
{notempty name="product_related"}
|
||||||
<li>{:lang_i18n('关联产品')}</li>
|
<li onclick="javascript:location.href='#related'">{:lang_i18n('关联产品')}</li>
|
||||||
{/notempty}
|
{/notempty}
|
||||||
<div class="clear"></div>
|
<div class="clear"></div>
|
||||||
</ul>
|
</ul>
|
||||||
@@ -112,13 +125,19 @@
|
|||||||
<!-- 产品图片-->
|
<!-- 产品图片-->
|
||||||
<div class="goods_des img-responsives" id="description-tab">{$product.detail|raw}</div>
|
<div class="goods_des img-responsives" id="description-tab">{$product.detail|raw}</div>
|
||||||
<!-- 关联产品-->
|
<!-- 关联产品-->
|
||||||
<div class="glcplist" id="related-tab" style="display: none;">
|
{notempty name="product_related"}
|
||||||
<div class="glcpitem" >
|
<div class="glcplist" id="related">
|
||||||
<img src="indeximg/i560-800-1.png" src="glcpimg" />
|
{volist name="product_related" id="rel"}
|
||||||
<span class="glt1" >98系列多盘位DAS桌面阵列存储系统</span>
|
<div class="glcpitem">
|
||||||
<span class="glt2">ORICO-9858RU3</span>
|
<a href="{:url('product/detail', ['id'=>$rel.id])}">
|
||||||
|
<img src="{:thumb($rel.cover_image)}" class="glcpimg" />
|
||||||
|
<span class="glt1">{$rel.name}</span>
|
||||||
|
<span class="glt2">{$rel.spu}</span>
|
||||||
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
{/volist}
|
||||||
</div>
|
</div>
|
||||||
|
{/notempty}
|
||||||
<!-- 弹窗-->
|
<!-- 弹窗-->
|
||||||
<div class="marsk-container-detail">
|
<div class="marsk-container-detail">
|
||||||
<div class="popup-quick">
|
<div class="popup-quick">
|
||||||
@@ -212,9 +231,7 @@
|
|||||||
$('.tab-pane').hide();
|
$('.tab-pane').hide();
|
||||||
if (targetTab === 'description') {
|
if (targetTab === 'description') {
|
||||||
$('#description-tab').show();
|
$('#description-tab').show();
|
||||||
$('#related-tab').hide();
|
|
||||||
} else if (targetTab === 'related') {
|
} else if (targetTab === 'related') {
|
||||||
$('#related-tab').show();
|
|
||||||
$('#description-tab').hide();
|
$('#description-tab').hide();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -223,8 +240,8 @@
|
|||||||
var index = $(this).data('index');
|
var index = $(this).data('index');
|
||||||
$('.pdetailswiper').hide();
|
$('.pdetailswiper').hide();
|
||||||
$('.pdetailswiper[data-index="' + index + '"]').show();
|
$('.pdetailswiper[data-index="' + index + '"]').show();
|
||||||
$('.attr_value').removeClass('active');
|
$('.attr_value').removeClass('attr_item_on');
|
||||||
$(this).addClass('active');
|
$(this).addClass('attr_item_on');
|
||||||
});
|
});
|
||||||
|
|
||||||
// 提交产品询价查询
|
// 提交产品询价查询
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
{notempty name="products"}
|
{notempty name="products"}
|
||||||
<div class="prlist">
|
<div class="prlist">
|
||||||
{volist name="products" id="pro"}
|
{volist name="products" id="pro"}
|
||||||
<a class="pritem">
|
<a class="pritem" href="{:url('product/detail',['id'=>$pro.id])}">
|
||||||
<img src="{$pro.cover_image}" class="primg"/>
|
<img src="{$pro.cover_image}" class="primg"/>
|
||||||
<div class="prinfo">
|
<div class="prinfo">
|
||||||
<span class="t1">{$pro.name|raw}</span>
|
<span class="t1">{$pro.name|raw}</span>
|
||||||
@@ -27,6 +27,8 @@
|
|||||||
</div>
|
</div>
|
||||||
<!-- 分页 -->
|
<!-- 分页 -->
|
||||||
<div>{$page|raw}</div>
|
<div>{$page|raw}</div>
|
||||||
|
{else/}
|
||||||
|
<div style="text-align: center; padding: 10%;">暂无数据</div>
|
||||||
{/notempty}
|
{/notempty}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -18,8 +18,28 @@
|
|||||||
<link rel="stylesheet" href="https://unpkg.com/swiper@9/swiper-bundle.min.css">
|
<link rel="stylesheet" href="https://unpkg.com/swiper@9/swiper-bundle.min.css">
|
||||||
<script type="text/javascript" src='https://code.jquery.com/jquery-3.6.0.min.js'></script>
|
<script type="text/javascript" src='https://code.jquery.com/jquery-3.6.0.min.js'></script>
|
||||||
<script type="text/javascript" src="https://unpkg.com/swiper@9.4.1/swiper-bundle.min.js"></script>
|
<script type="text/javascript" src="https://unpkg.com/swiper@9.4.1/swiper-bundle.min.js"></script>
|
||||||
|
<!-- Matomo -->
|
||||||
|
<script>
|
||||||
|
var _paq = window._paq = window._paq || [];
|
||||||
|
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
|
||||||
|
_paq.push(['trackPageView']);
|
||||||
|
_paq.push(['enableLinkTracking']);
|
||||||
|
(function() {
|
||||||
|
var u="//analytics.f2b211.com/";
|
||||||
|
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||||
|
_paq.push(['setSiteId', '1']);
|
||||||
|
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||||
|
g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
|
||||||
|
})();
|
||||||
|
</script>
|
||||||
|
<!-- End Matomo Code -->
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
<noscript>
|
||||||
|
<!-- Matomo Image Tracker-->
|
||||||
|
<img referrerpolicy="no-referrer-when-downgrade" src="https://analytics.f2b211.com/matomo.php?idsite=1&rec=1" style="border:0" alt="" />
|
||||||
|
<!-- End Matomo -->
|
||||||
|
</noscript>
|
||||||
{block name="header"}
|
{block name="header"}
|
||||||
{include file="public/header"/}
|
{include file="public/header"/}
|
||||||
{/block}
|
{/block}
|
||||||
@@ -28,5 +48,31 @@
|
|||||||
{include file="public/footer"/}
|
{include file="public/footer"/}
|
||||||
{/block}
|
{/block}
|
||||||
{block name="script"}{/block}
|
{block name="script"}{/block}
|
||||||
|
<script>
|
||||||
|
$(window).ready(function () {
|
||||||
|
// 为所有站内链接,添加标识
|
||||||
|
// 使用mtpl=1参数标识解决ipad访问站点时,从pc重定向到mobile每次页面都会pc - mobile闪现问题
|
||||||
|
var LURL = new URL(window.location.href);
|
||||||
|
if (LURL.searchParams.get('mtpl') == 1) {
|
||||||
|
$('a').each(function () {
|
||||||
|
var href = $(this).attr('href');
|
||||||
|
if (href) {
|
||||||
|
var origin = LURL.origin;
|
||||||
|
if (href.indexOf('http') == -1) {
|
||||||
|
href = new URL(href, origin);
|
||||||
|
href.searchParams.set('mtpl', '1');
|
||||||
|
$(this).attr('href', href);
|
||||||
|
} else {
|
||||||
|
href = new URL(href);
|
||||||
|
if (href.origin == origin) {
|
||||||
|
href.searchParams.set('mtpl', '1');
|
||||||
|
$(this).attr('href', href);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
</script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
@@ -18,7 +18,9 @@
|
|||||||
{notempty name="fn.children"}
|
{notempty name="fn.children"}
|
||||||
{volist name="fn.children" id="fnc"}
|
{volist name="fn.children" id="fnc"}
|
||||||
<p>
|
<p>
|
||||||
<a href="{$fnc.link}" target="_blank" class="inline-block link-faded break-all">{$fnc.name}</a>
|
<a href="{$fnc.link}" {eq name="fnc.link" value="1"}target="_blank"{/eq} class="inline-block link-faded break-all">
|
||||||
|
{$fnc.name}
|
||||||
|
</a>
|
||||||
</p>
|
</p>
|
||||||
{/volist}
|
{/volist}
|
||||||
{/notempty}
|
{/notempty}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<header class="oircoEgapp-head">
|
<header class="oircoEgapp-head">
|
||||||
<div class="headtop">
|
<div class="headtop">
|
||||||
<a><img src="__IMAGES__/logo.png" class="headerlogimg" /></a>
|
<a href="/"><img src="__IMAGES__/logo.png" class="headerlogimg" /></a>
|
||||||
<div class="action-r">
|
<div class="action-r">
|
||||||
<div class="right img-responsive cursor_p">
|
<div class="right img-responsive cursor_p">
|
||||||
<span class="icon-category cursor_p top-menu-toggle"><i class="icon-menu-svg"></i></span>
|
<span class="icon-category cursor_p top-menu-toggle"><i class="icon-menu-svg"></i></span>
|
||||||
@@ -53,6 +53,7 @@
|
|||||||
</form>
|
</form>
|
||||||
<div class="title-text">
|
<div class="title-text">
|
||||||
<p><a href="#">{:lang_i18n('搜索历史')}</a></p>
|
<p><a href="#">{:lang_i18n('搜索历史')}</a></p>
|
||||||
|
<div id="history"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -107,5 +108,54 @@
|
|||||||
$('.top-country .close-icon').click(function(){
|
$('.top-country .close-icon').click(function(){
|
||||||
$(".mask,.action-sheet").hide();
|
$(".mask,.action-sheet").hide();
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// 移动端顶部宽度设置和主体内容宽度一致
|
||||||
|
var pageWidth = $('.oricoEGapp').outerWidth();
|
||||||
|
// 设置.header-PC元素的宽度
|
||||||
|
$('.oircoEgapp-head').css('width', pageWidth + 'px');
|
||||||
|
// 可选:监听窗口大小变化,实时更新宽度
|
||||||
|
$(window).resize(function() {
|
||||||
|
var newWidth = $('.oricoEGapp').outerWidth();
|
||||||
|
$('.oircoEgapp-head').css('width', newWidth + 'px');
|
||||||
|
});
|
||||||
|
|
||||||
|
// 回显搜索历史记录
|
||||||
|
history();
|
||||||
})
|
})
|
||||||
|
|
||||||
|
function history() {
|
||||||
|
var keywords = new URL(window.location.href).searchParams.get('keywords')
|
||||||
|
var history_keywords = localStorage.getItem('header_search_keywords');
|
||||||
|
if (!history_keywords) {
|
||||||
|
history_keywords = [];
|
||||||
|
} else {
|
||||||
|
history_keywords = JSON.parse(history_keywords);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 记录搜索关键词
|
||||||
|
if (keywords) {
|
||||||
|
if (history_keywords.includes(keywords)) {
|
||||||
|
history_keywords.splice(history_keywords.indexOf(keywords), 1);
|
||||||
|
}
|
||||||
|
history_keywords.unshift(keywords);
|
||||||
|
if (history_keywords.length > 3) {
|
||||||
|
history_keywords.pop();
|
||||||
|
}
|
||||||
|
localStorage.setItem('header_search_keywords', JSON.stringify(history_keywords));
|
||||||
|
}
|
||||||
|
|
||||||
|
// 回显搜索历史
|
||||||
|
history_keywords.forEach(function(item) {
|
||||||
|
$('#history').append(
|
||||||
|
$('<a>')
|
||||||
|
.css({
|
||||||
|
'margin-right': '10px'
|
||||||
|
})
|
||||||
|
.attr('href', '{:url("product/search")}?keywords=' + item)
|
||||||
|
.text(item)
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
return history_keywords;
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
99
app/index/view/mobile/public/nas_header.html
Normal file
99
app/index/view/mobile/public/nas_header.html
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
<header class="oircoEgapp-head">
|
||||||
|
<div class="headtop">
|
||||||
|
{eq name=":cookie('think_lang')" value="zh-cn"}
|
||||||
|
<a href="{:url('/index/topic/nas/index')}">
|
||||||
|
{else/}
|
||||||
|
<a>
|
||||||
|
{/eq}
|
||||||
|
<img src="__IMAGES__/logo.png" class="headerlogimg" />
|
||||||
|
</a>
|
||||||
|
<div class="action-r">
|
||||||
|
<div class="right img-responsive cursor_p">
|
||||||
|
<span class="icon-category cursor_p top-menu-toggle"><i class="icon-menu-svg"></i></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- 顶部菜单-->
|
||||||
|
<div class="top-menu">
|
||||||
|
{notempty name="header_navigation"}
|
||||||
|
{volist name="header_navigation" id="nav"}
|
||||||
|
<div class="it-ct">
|
||||||
|
<div class="it-1">
|
||||||
|
{empty name="nav.children"}
|
||||||
|
<a href="{$nav.link}">{$nav.name}</a>
|
||||||
|
{else/}
|
||||||
|
<div class="it-1-more">{$nav.name}<i class="icon-arrow"></i></div>
|
||||||
|
{volist name="nav.children" id="ch"}
|
||||||
|
<div class="it-1-2"><a href="{$ch.link}">{$ch.name}</a></div>
|
||||||
|
{/volist}
|
||||||
|
{/empty}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{/volist}
|
||||||
|
{/notempty}
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
<script type="text/javascript">
|
||||||
|
$(function() {
|
||||||
|
// 点击顶部菜单
|
||||||
|
$(".top-menu-toggle").click(function() {
|
||||||
|
$(".top-menu").slideToggle(800);
|
||||||
|
})
|
||||||
|
// 点击一级菜单显示二级菜单
|
||||||
|
$(".it-1-more").on("click", function() {
|
||||||
|
$('.it-1-2').hide();
|
||||||
|
$('.icon-arrow').removeClass('rotate');
|
||||||
|
$(this).siblings('.it-1-2').slideToggle(800);
|
||||||
|
$(this).find('.icon-arrow').addClass('rotate');
|
||||||
|
});
|
||||||
|
|
||||||
|
// 移动端顶部宽度设置和主体内容宽度一致
|
||||||
|
var pageWidth = $('.oricoEGapp').outerWidth();
|
||||||
|
// 设置.header-PC元素的宽度
|
||||||
|
$('.oircoEgapp-head').css('width', pageWidth + 'px');
|
||||||
|
// 可选:监听窗口大小变化,实时更新宽度
|
||||||
|
$(window).resize(function() {
|
||||||
|
var newWidth = $('.oricoEGapp').outerWidth();
|
||||||
|
$('.oircoEgapp-head').css('width', newWidth + 'px');
|
||||||
|
});
|
||||||
|
|
||||||
|
// 回显搜索历史记录
|
||||||
|
history();
|
||||||
|
})
|
||||||
|
|
||||||
|
function history() {
|
||||||
|
var keywords = new URL(window.location.href).searchParams.get('keywords')
|
||||||
|
var history_keywords = localStorage.getItem('header_search_keywords');
|
||||||
|
if (!history_keywords) {
|
||||||
|
history_keywords = [];
|
||||||
|
} else {
|
||||||
|
history_keywords = JSON.parse(history_keywords);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 记录搜索关键词
|
||||||
|
if (keywords) {
|
||||||
|
if (history_keywords.includes(keywords)) {
|
||||||
|
history_keywords.splice(history_keywords.indexOf(keywords), 1);
|
||||||
|
}
|
||||||
|
history_keywords.unshift(keywords);
|
||||||
|
if (history_keywords.length > 3) {
|
||||||
|
history_keywords.pop();
|
||||||
|
}
|
||||||
|
localStorage.setItem('header_search_keywords', JSON.stringify(history_keywords));
|
||||||
|
}
|
||||||
|
|
||||||
|
// 回显搜索历史
|
||||||
|
history_keywords.forEach(function(item) {
|
||||||
|
$('#history').append(
|
||||||
|
$('<a>')
|
||||||
|
.css({
|
||||||
|
'margin-right': '10px'
|
||||||
|
})
|
||||||
|
.attr('href', '{:url("product/search")}?keywords=' + item)
|
||||||
|
.text(item)
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
return history_keywords;
|
||||||
|
}
|
||||||
|
</script>
|
||||||
69
app/index/view/mobile/topic_nas/cooperation.html
Normal file
69
app/index/view/mobile/topic_nas/cooperation.html
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
{extend name="public/base" /}
|
||||||
|
{block name="style"}
|
||||||
|
<link rel="stylesheet" href="__CSS__/topic_nas_cooperation.css">
|
||||||
|
{/block}
|
||||||
|
{block name="header"}
|
||||||
|
{include file="public/nas_header" /}
|
||||||
|
{/block}
|
||||||
|
{block name="main"}
|
||||||
|
<div class="oricoEGapp">
|
||||||
|
<div class="narshzhbMbpage">
|
||||||
|
<!-- banner -->
|
||||||
|
{notempty name="focus_image"}
|
||||||
|
<div class="narshzhb-banner">
|
||||||
|
<img src="{$focus_image.image}" style="margin-top: 3.7rem;">
|
||||||
|
<!-- <div class="narshzhb-banner-content">
|
||||||
|
<span class="t1">{:lang_i18n('成为ORICO合作伙伴')}</span>
|
||||||
|
<h2><strong style="color: #004BFA;">NAS</strong>{:lang_i18n('合作伙伴招募')}</h2>
|
||||||
|
<div class="narshzhb-banner-btct">
|
||||||
|
<span>{:lang_i18n('广告代理')}</span>
|
||||||
|
<span>{:lang_i18n('抖音销售')}</span>
|
||||||
|
<span>{:lang_i18n('代理经销合作')}</span>
|
||||||
|
<span>{:lang_i18n('ODM合作')}</span>
|
||||||
|
</div>
|
||||||
|
</div> -->
|
||||||
|
</div>
|
||||||
|
{/notempty}
|
||||||
|
<!-- top 介绍 -->
|
||||||
|
{notempty name="cooperation_methods"}
|
||||||
|
{volist name="cooperation_methods" id="method" key="idx"}
|
||||||
|
<div class="narshzhbmb-cttop-it {neq name='idx' value='1'}narshzhbmb-cttop-it2{/neq}">
|
||||||
|
<img src="{$method.image}">
|
||||||
|
<div class="cts" {:style(['color' => $method.desc_txt_color])}>{$method.desc|raw}</div>
|
||||||
|
{eq name="idx" value="1"}
|
||||||
|
<h2 {:style(['color' => $method.title_txt_color])}>{$method.title}</h2>
|
||||||
|
{/eq}
|
||||||
|
</div>
|
||||||
|
{/volist}
|
||||||
|
{/notempty}
|
||||||
|
{notempty name="cooperation_advantages"}
|
||||||
|
<h2 class="narshzhb-title">{:lang_i18n('合作优势')}</h2>
|
||||||
|
{assign name="cooperation_advantages_chunk" value=":array_chunk($cooperation_advantages, 2)" /}
|
||||||
|
{volist name="cooperation_advantages_chunk" id="adv"}
|
||||||
|
<div class="narshzhbmb-rowits">
|
||||||
|
{volist name="adv" id="it"}
|
||||||
|
<div class="narshzhbmb-item">
|
||||||
|
<img src="{$it.image}" class="hzhbappico">
|
||||||
|
<h3 class="hzhbapptitle" {:style(['color' => $it.title_txt_color])}>{$it.title}</h3>
|
||||||
|
<div class="srt" {:style(['color' => $it.desc_txt_color])}>{$it.desc|raw}</div>
|
||||||
|
</div>
|
||||||
|
{/volist}
|
||||||
|
</div>
|
||||||
|
{/volist}
|
||||||
|
{/notempty}
|
||||||
|
<!-- 期待与您的合作 -->
|
||||||
|
{notempty name="cooperation_cotacts"}
|
||||||
|
<h2 class="narshzhb-title">{:lang_i18n('期待与您的合作')}</h2>
|
||||||
|
{assign name="cooperation_cotacts_flat" value=":array_flatten($cooperation_cotacts)" /}
|
||||||
|
{volist name="cooperation_cotacts_flat" id="ct" key="idx"}
|
||||||
|
<div class="narshzhbmb-rowits">
|
||||||
|
<div class="narshzhbmb-item narshzhbmb-item2">
|
||||||
|
<img src="{$ct.image}" class="hzhbappico">
|
||||||
|
<span class="srt" {:style(['color'=>$ct.title_txt_color])}>{$ct.title}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{/volist}
|
||||||
|
{/notempty}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{/block}
|
||||||
89
app/index/view/mobile/topic_nas/download.html
Normal file
89
app/index/view/mobile/topic_nas/download.html
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
{extend name="public/base" /}
|
||||||
|
{block name="style"}
|
||||||
|
<link rel="stylesheet" href="__CSS__/topic_nas_download.css" />
|
||||||
|
{/block}
|
||||||
|
{block name="header"}
|
||||||
|
{include file="public/nas_header" /}
|
||||||
|
{/block}
|
||||||
|
{block name="main"}
|
||||||
|
<div class="oricoEGapp">
|
||||||
|
<div class="narsDowloadPc">
|
||||||
|
{egt name=":count($data)" value="2"}
|
||||||
|
<div class="narsDtabs">
|
||||||
|
{notempty name="data.cyber"}
|
||||||
|
<div class="narsDtabIt narsDtabIt_active">{:lang_i18n('CyberData赛博云空间')}</div>
|
||||||
|
{/notempty}
|
||||||
|
{notempty name="data.weline"}
|
||||||
|
<div class="narsDtabIt">{:lang_i18n('Weline微链接')}</div>
|
||||||
|
{/notempty}
|
||||||
|
</div>
|
||||||
|
{/egt}
|
||||||
|
<!-- 赛博云 -->
|
||||||
|
{notempty name="data.cyber"}
|
||||||
|
<div class="nDtopCtMian narssbshow" style="display: block;">
|
||||||
|
{notempty name="data.cyber.focus_image"}
|
||||||
|
<div class="nDtopIt">
|
||||||
|
<img src="{$data.cyber.focus_image.image}" class="tpimg">
|
||||||
|
</div>
|
||||||
|
{/notempty}
|
||||||
|
{notempty name="data.cyber.down_items"}
|
||||||
|
<div class="nDtopIt2">
|
||||||
|
{volist name="data.cyber.down_items" id="it" length="4"}
|
||||||
|
<a class="nDitImg" {notempty name="it.link"}href="{$it.link}"{/notempty}>
|
||||||
|
<div class="nDitImg"><img src="{$it.image}"></div>
|
||||||
|
{eq name=":cookie('think_lang')" value="en-us"}
|
||||||
|
<div class="yy_name" {:style(['color'=>$it.title_txt_color])}>{$it.title}</div>
|
||||||
|
<div class="dwbt">Download</div>
|
||||||
|
{/eq}
|
||||||
|
</a>
|
||||||
|
{/volist}
|
||||||
|
</div>
|
||||||
|
{volist name="data.cyber.down_items" id="it" offset="4"}
|
||||||
|
<a {notempty name="it.link"}href="{$it.link}"{/notempty}>
|
||||||
|
<div class="nDitImg nrowimg" style="margin-bottom: 25px;">
|
||||||
|
<img src="{$it.image}">
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
{/volist}
|
||||||
|
{/notempty}
|
||||||
|
</div>
|
||||||
|
{/notempty}
|
||||||
|
<!-- 微链接 -->
|
||||||
|
{notempty name="data.weline"}
|
||||||
|
<div class="nDtopCtMian narswljshow">
|
||||||
|
{notempty name="data.weline.focus_image"}
|
||||||
|
<div class="nDtopIt">
|
||||||
|
<img src="{$data.weline.focus_image.image}" class="tpimg">
|
||||||
|
</div>
|
||||||
|
{/notempty}
|
||||||
|
{notempty name="data.weline.down_items"}
|
||||||
|
<div class="nDtopIt2" style="margin-bottom: 25px;">
|
||||||
|
{volist name="data.weline.down_items" id="it"}
|
||||||
|
<a class="nDitImg" {notempty name="it.link"}href="{$it.link}"{/notempty}>
|
||||||
|
<div class="nDitImg"><img src="{$it.image}"></div>
|
||||||
|
</a>
|
||||||
|
{/volist}
|
||||||
|
</div>
|
||||||
|
{/notempty}
|
||||||
|
</div>
|
||||||
|
{/notempty}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{/block}
|
||||||
|
{block name="script"}
|
||||||
|
<script type="text/javascript">
|
||||||
|
$(document).ready(function () {
|
||||||
|
$('.narsDtabIt').click(function () {
|
||||||
|
$('.narsDtabIt').removeClass('narsDtabIt_active');
|
||||||
|
$(this).addClass('narsDtabIt_active');
|
||||||
|
if ($(this).index() === 0) {
|
||||||
|
$('.narssbshow').show();
|
||||||
|
$('.narswljshow').hide();
|
||||||
|
} else {
|
||||||
|
$('.narssbshow').hide();
|
||||||
|
$('.narswljshow').show();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
{/block}
|
||||||
137
app/index/view/mobile/topic_nas/help.html
Normal file
137
app/index/view/mobile/topic_nas/help.html
Normal file
@@ -0,0 +1,137 @@
|
|||||||
|
{extend name="public/base" /}
|
||||||
|
{block name="style"}
|
||||||
|
<link rel="stylesheet" href="__CSS__/topic_nas_help.css" />
|
||||||
|
{/block}
|
||||||
|
{block name="header"}
|
||||||
|
<!-- 重置header头为空 -->
|
||||||
|
{/block}
|
||||||
|
{block name="main"}
|
||||||
|
<div class="oricoEGapp">
|
||||||
|
<div class="narshelpCenterPc-app">
|
||||||
|
<div class="headtop">
|
||||||
|
{eq name=":cookie('think_lang')" value="zh-cn"}
|
||||||
|
<a href="{:url('/index/topic/nas/index')}">
|
||||||
|
{else/}
|
||||||
|
<a>
|
||||||
|
{/eq}
|
||||||
|
<img src="__IMAGES__/logo.png" class="logoicoimg">
|
||||||
|
</a>
|
||||||
|
<img src="__IMAGES__/ssapp.png" class="ssicoimg">
|
||||||
|
</div>
|
||||||
|
<!-- banner -->
|
||||||
|
<img src="__IMAGES__/nhlpapp-banner.webp" class="nhlpbner">
|
||||||
|
<!-- 使用教程 -->
|
||||||
|
{notempty name="article_categorys"}
|
||||||
|
<h1 class="nhlpapp-title">{:lang_i18n('使用教程')}</h1>
|
||||||
|
{volist name="article_categorys" id="vo" key="idx"}
|
||||||
|
<div class="nhlpappit">
|
||||||
|
<div class="nhlptl">
|
||||||
|
<img src="{$vo.icon}" class="bhlpicoimg">{$vo.name}
|
||||||
|
</div>
|
||||||
|
<div class="nhlp-tx-list">
|
||||||
|
{volist name="vo.article" id="va"}
|
||||||
|
<a class="txrow" href="{:url('/index/topic/nas/help_detail', ['cid' => $vo.id,'id' => $va.id])}">
|
||||||
|
<div class="nhlp-point"></div>
|
||||||
|
<span class="nhlpsp">{$va.title}</span>
|
||||||
|
<span class="narhelpgoimg"><img src="__IMAGES__/nars-jt.png"></span>
|
||||||
|
</a>
|
||||||
|
{/volist}
|
||||||
|
{if condition="count($vo.article) >= 3"}
|
||||||
|
<a href="{:url('/index/topic/nas/help_detail', ['cid' => $vo.id, 'id' => isset($vo.article[0])?$vo.article[0]['id']:0, 'view' => 'more'])}">
|
||||||
|
<div class="ckgdbt">{:lang_i18n('查看更多')} <img src="__IMAGES__/nars-jt.png"></div>
|
||||||
|
</a>
|
||||||
|
{/if}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{/volist}
|
||||||
|
{/notempty}
|
||||||
|
<!-- 联系我们 -->
|
||||||
|
{notempty name="contacts"}
|
||||||
|
<h1 class="nhlpapp-title">{:lang_i18n('联系我们')}</h1>
|
||||||
|
<div class="nhlpapp-row">
|
||||||
|
{assign name="first_section" value=":array_splice($contacts, 0, count($contacts) - 3)"}
|
||||||
|
<div class="sec-1">
|
||||||
|
{volist name="first_section" id="co"}
|
||||||
|
<a class="nhlplxwmit" {notempty name="co.link"}href="{$co.link}"{/notempty}>
|
||||||
|
<img src="{$co.image}" class="lximg">
|
||||||
|
<span class="t1" {:style(['color'=>$co.title_txt_color])}>{$co.title}</span>
|
||||||
|
{notempty name="co.desc"}
|
||||||
|
<span class="t2" {:style(['color'=>$co.desc_txt_color])}>{$co.desc|raw}</span>
|
||||||
|
{/notempty}
|
||||||
|
</a>
|
||||||
|
{/volist}
|
||||||
|
</div>
|
||||||
|
<div class="sec-2">
|
||||||
|
{volist name="contacts" id="co"}
|
||||||
|
<a class="nhlplxwmit nhlplxwmit-w1" {notempty name="co.link"}href="{$co.link}"{/notempty}>
|
||||||
|
<img src="{$co.image}" class="lximg">
|
||||||
|
<span class="t1" {:style(['color'=>$co.title_txt_color])}>{$co.title}<br></span>
|
||||||
|
</a>
|
||||||
|
{/volist}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{/notempty}
|
||||||
|
<!-- 搜索 -->
|
||||||
|
<div class="nhlpapp-search">
|
||||||
|
<div class="nhlpappshtop">
|
||||||
|
<div class="nhlpapp-shdiv">
|
||||||
|
<input class="nhlp-ipt" id="search-input" placeholder="{:lang_i18n('请输入搜索关键字,如安装赛博云空间,影视库')}" autocomplete="off">
|
||||||
|
<img src="__IMAGES__/ssapp.png" class="searchimg">
|
||||||
|
</div>
|
||||||
|
<span class="closetx">{:lang_i18n('取消')}</span>
|
||||||
|
</div>
|
||||||
|
<div class="nhlpappline"></div>
|
||||||
|
<!-- 下拉搜索框 -->
|
||||||
|
<div class="dropdown" id="dropdown"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{/block}
|
||||||
|
{block name="script"}
|
||||||
|
<script type="text/javascript">
|
||||||
|
$(document).ready(function () {
|
||||||
|
$('.closetx').click(function () {
|
||||||
|
$('.nhlpapp-search').hide();
|
||||||
|
});
|
||||||
|
$('.ssicoimg').click(function () {
|
||||||
|
$('.nhlpapp-search').show();
|
||||||
|
});
|
||||||
|
|
||||||
|
// 搜索
|
||||||
|
var timeout = null;
|
||||||
|
$('#search-input').on('focus input', function () {
|
||||||
|
clearTimeout(timeout);
|
||||||
|
var _this = this;
|
||||||
|
timeout = setTimeout(function () {
|
||||||
|
var keywords = $(_this).val();
|
||||||
|
if (keywords == '') {
|
||||||
|
$('#dropdown').hide().html('');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$.ajax({
|
||||||
|
url: "{:url('/index/topic/nas/help_search')}",
|
||||||
|
type: 'POST',
|
||||||
|
data: { keywords: keywords },
|
||||||
|
dataType: 'JSON',
|
||||||
|
success: function (r) {
|
||||||
|
var html = '';
|
||||||
|
if (r.code == 0) {
|
||||||
|
html = '<ul>'
|
||||||
|
$.each(r.data, function (k, v) {
|
||||||
|
html += '<li><a class="search-item" href="{:url(\'/index/topic/nas/help_detail\')}?id=' + v.id + '">' + v.title + '</a></li>'
|
||||||
|
})
|
||||||
|
html += '</ul>'
|
||||||
|
}
|
||||||
|
$('#dropdown').show().html(html);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}, 300);
|
||||||
|
});
|
||||||
|
$('.nhlplxwmit:not(:first)').hover(function () {
|
||||||
|
$(this).find('.lximg').show();
|
||||||
|
}, function () {
|
||||||
|
$(this).find('.lximg').show();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
{/block}
|
||||||
147
app/index/view/mobile/topic_nas/help_detail.html
Normal file
147
app/index/view/mobile/topic_nas/help_detail.html
Normal file
@@ -0,0 +1,147 @@
|
|||||||
|
{extend name="public/base" /}
|
||||||
|
{block name="title"}
|
||||||
|
{notempty name="article.seo_title"}<title>{$article.seo_title}</title>{else /}{__BLOCK__}{/notempty}
|
||||||
|
{/block}
|
||||||
|
{block name="seo"}
|
||||||
|
{notempty name="article.seo_keywords"}
|
||||||
|
<meta name="keywords" content="{$article.seo_keywords}" />
|
||||||
|
<meta name="description" content="{$article.seo_desc}" />
|
||||||
|
{else /}
|
||||||
|
{__BLOCK__}
|
||||||
|
{/notempty}
|
||||||
|
{/block}
|
||||||
|
{block name="style"}
|
||||||
|
<link rel="stylesheet" href="__CSS__/topic_nas_help-detail.css" />
|
||||||
|
{/block}
|
||||||
|
{block name="header"}
|
||||||
|
<!-- 重置header头为空 -->
|
||||||
|
{/block}
|
||||||
|
{block name="main"}
|
||||||
|
<div class="oricoEGapp">
|
||||||
|
<div class="narshelpCenterdetail-app">
|
||||||
|
<div class="headtop">
|
||||||
|
{eq name=":cookie('think_lang')" value="zh-cn"}
|
||||||
|
<a href="{:url('/index/topic/nas/index')}">
|
||||||
|
{else/}
|
||||||
|
<a>
|
||||||
|
{/eq}
|
||||||
|
<img src="__IMAGES__/logo.png" class="logoicoimg">
|
||||||
|
</a>
|
||||||
|
<div style="display: flex;">
|
||||||
|
<img src="__IMAGES__/fenlei.png" class="ssicoimg" id="flico">
|
||||||
|
<img src="__IMAGES__/sousuo.png" class="ssicoimg" id="ssico" style="margin-right:32px">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- 文章内容 -->
|
||||||
|
<div id="rendered-content" class="nhlp-app-content">
|
||||||
|
{$article.content|raw|default=''}
|
||||||
|
</div>
|
||||||
|
<!-- 搜索 -->
|
||||||
|
<div class="nhlpapp-search">
|
||||||
|
<div class="nhlpappshtop">
|
||||||
|
<div class="nhlpapp-shdiv">
|
||||||
|
<input class="nhlp-ipt" id="search-input" placeholder="{:lang_i18n('请输入搜索关键字,如安装赛博云空间,影视库')}" autocomplete="off">
|
||||||
|
<img src="__IMAGES__/ssapp.png" class="searchimg">
|
||||||
|
</div>
|
||||||
|
<span class="closetx">{:lang_i18n('取消')}</span>
|
||||||
|
</div>
|
||||||
|
<div class="nhlpappline"></div>
|
||||||
|
<!-- 下拉搜索框 -->
|
||||||
|
<div class="dropdown" id="dropdown"></div>
|
||||||
|
</div>
|
||||||
|
<!-- 分类文章目录 -->
|
||||||
|
<div class="nhlpapp-pagescate" {:style(['display' => $Request.get.view == 'more' ? 'block' : 'none'])}>
|
||||||
|
<div class="nars-hlpdt-ml">
|
||||||
|
{notempty name="article_categorys"}
|
||||||
|
<div class="nav-tree">
|
||||||
|
{volist name="article_categorys" id="ac" key="idx"}
|
||||||
|
<div class="categoryhelp">
|
||||||
|
<div class="categoryhelp-title">
|
||||||
|
<div>
|
||||||
|
<img src="__IMAGES__/nars-jt.png" class="arrow {if condition='$ac.id == $Request.get.cid'}rotate{/if}">
|
||||||
|
</div>
|
||||||
|
<span>{$ac.name}</span>
|
||||||
|
</div>
|
||||||
|
<ul class="sub-list" {if condition='$ac.id == $Request.get.cid'}style="display: block;"{/if}>
|
||||||
|
{volist name="ac.article" id="ar"}
|
||||||
|
<li>
|
||||||
|
<a href="{:url('/index/topic/nas/help_detail', ['cid' => $ac.id , 'id' => $ar.id])}" style="padding-top: 6px;">
|
||||||
|
{$ar.title}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{/volist}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
{/volist}
|
||||||
|
</div>
|
||||||
|
{/notempty}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{/block}
|
||||||
|
{block name="script"}
|
||||||
|
<script type="text/javascript">
|
||||||
|
$(document).ready(function () {
|
||||||
|
// 点击顶部分类图标
|
||||||
|
$('#flico').click(function () {
|
||||||
|
$('.nhlpapp-pagescate').toggle();
|
||||||
|
// 检查分类菜单是否显示
|
||||||
|
if ($('.nhlpapp-pagescate').is(':visible')) {
|
||||||
|
// 如果分类菜单显示,则隐藏文章内容
|
||||||
|
$('#rendered-content').hide();
|
||||||
|
$('.footer').hide()
|
||||||
|
} else {
|
||||||
|
// 如果分类菜单隐藏,则显示文章内容
|
||||||
|
$('#rendered-content').show();
|
||||||
|
$('.footer').show()
|
||||||
|
}
|
||||||
|
});
|
||||||
|
// 点击分类的交互
|
||||||
|
$('.categoryhelp-title').click(function () {
|
||||||
|
$(this).next('.sub-list').slideToggle();
|
||||||
|
$(this).find('.arrow').toggleClass('rotate');
|
||||||
|
});
|
||||||
|
// 点击顶部搜索图标-点击取消关闭
|
||||||
|
$('#ssico').click(function () {
|
||||||
|
$('.nhlpapp-pagescate').hide();
|
||||||
|
$('.nhlpapp-search').show();
|
||||||
|
});
|
||||||
|
$('.closetx').click(function () {
|
||||||
|
$('.nhlpapp-search').hide();
|
||||||
|
});
|
||||||
|
// 搜索
|
||||||
|
var timeout = null;
|
||||||
|
$('#search-input').on('focus input', function () {
|
||||||
|
clearTimeout(timeout);
|
||||||
|
var _this = this;
|
||||||
|
timeout = setTimeout(function () {
|
||||||
|
var keywords = $(_this).val();
|
||||||
|
if (keywords == '') {
|
||||||
|
$('#dropdown').hide().html('');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$.ajax({
|
||||||
|
url: "{:url('/index/topic/nas/help_search')}",
|
||||||
|
type: 'POST',
|
||||||
|
data: {
|
||||||
|
keywords: keywords
|
||||||
|
},
|
||||||
|
dataType: 'JSON',
|
||||||
|
success: function (r) {
|
||||||
|
var html = '';
|
||||||
|
if (r.code == 0) {
|
||||||
|
html = '<ul>'
|
||||||
|
$.each(r.data, function (k, v) {
|
||||||
|
html += '<li><a class="search-item" href="{:url(\'/index/topic/nas/help_detail\')}?id=' + v.id + '">' + v.title + '</a></li>'
|
||||||
|
})
|
||||||
|
html += '</ul>'
|
||||||
|
}
|
||||||
|
$('#dropdown').show().html(html);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}, 300);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
{/block}
|
||||||
@@ -2,6 +2,9 @@
|
|||||||
{block name="style"}
|
{block name="style"}
|
||||||
<link rel="stylesheet" href="__CSS__/topic_nas_index.css">
|
<link rel="stylesheet" href="__CSS__/topic_nas_index.css">
|
||||||
{/block}
|
{/block}
|
||||||
|
{block name="header"}
|
||||||
|
{include file="public/nas_header" /}
|
||||||
|
{/block}
|
||||||
{block name="main"}
|
{block name="main"}
|
||||||
<div class="oricoEGapp">
|
<div class="oricoEGapp">
|
||||||
<!-- 首页 -->
|
<!-- 首页 -->
|
||||||
|
|||||||
61
app/index/view/mobile/topic_nas/product.html
Normal file
61
app/index/view/mobile/topic_nas/product.html
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
{extend name="public/base" /}
|
||||||
|
{block name="style"}
|
||||||
|
<link rel="stylesheet" type="text/css" href="__CSS__/topic_nas_product.css" />
|
||||||
|
{/block}
|
||||||
|
{block name="header"}
|
||||||
|
{include file="public/nas_header" /}
|
||||||
|
{/block}
|
||||||
|
{block name="main"}
|
||||||
|
<div class="narsZTPC">
|
||||||
|
<div class="nZTtopCtMian narssbshow">
|
||||||
|
{notempty name="focus_image"}
|
||||||
|
<a {notempty name="focus_image.link"}href="{$focus_image.link}"{/notempty}>
|
||||||
|
<img src="{$focus_image.image}" class="narsZCimg">
|
||||||
|
</a>
|
||||||
|
{/notempty}
|
||||||
|
{notempty name="step"}
|
||||||
|
<div class="narsZTicos">
|
||||||
|
{volist name="step" id="st"}
|
||||||
|
<div class="nztit">
|
||||||
|
<img src="{$st.image}" class="narsicimg">
|
||||||
|
<span class="narsstep">{$st.title}</span>
|
||||||
|
<span class="narszttext">{$st.desc|raw}</span>
|
||||||
|
</div>
|
||||||
|
{/volist}
|
||||||
|
</div>
|
||||||
|
{/notempty}
|
||||||
|
{notempty name="trial_instructions"}
|
||||||
|
<div class="narsZTinfo">
|
||||||
|
<div class="nztif-left">
|
||||||
|
{volist name="trial_instructions" id="trial" offset="0" length="2"}
|
||||||
|
<div class="narsztewmit">
|
||||||
|
<a {notempty name="trial.link"}href="{$trial.link}" target="_blank"{/notempty}>
|
||||||
|
<img src="{$trial.image}" class="nztewmimg">
|
||||||
|
</a>
|
||||||
|
<p {:style(["color"=>$trial.title_txt_color])}>{$trial.title}</p>
|
||||||
|
<span {:style(["color"=>$trial.desc_txt_color])}>{$trial.desc|raw}</span>
|
||||||
|
</div>
|
||||||
|
{/volist}
|
||||||
|
</div>
|
||||||
|
<div class="nztif-right">
|
||||||
|
{notempty name="trial_instructions.2"}
|
||||||
|
<span class="sysmtxt" {:style(["color"=>$trial_instructions.2.title_txt_color])}>
|
||||||
|
{$trial_instructions.2.title|default=''}
|
||||||
|
</span>
|
||||||
|
<div class="sminfo" {:style(["color"=>$trial_instructions.2.desc_txt_color])}>
|
||||||
|
{$trial_instructions.2.desc|raw|default=''}
|
||||||
|
</div>
|
||||||
|
{/notempty}
|
||||||
|
<div class="nztbzyj">
|
||||||
|
{volist name="trial_instructions" id="trial" offset="3"}
|
||||||
|
<a {notempty name="trial.link"}href="{$trial.link}" target="_blank"{/notempty}>
|
||||||
|
<span {:style(["color"=>$trial.title_txt_color])}>{$trial.title}</span>
|
||||||
|
</a>
|
||||||
|
{/volist}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{/notempty}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{/block}
|
||||||
@@ -11,12 +11,13 @@
|
|||||||
<div class="orico_Page_productxc">
|
<div class="orico_Page_productxc">
|
||||||
<!--内容 -->
|
<!--内容 -->
|
||||||
<div class="productxcMain">
|
<div class="productxcMain">
|
||||||
<div class="culture_top">
|
|
||||||
{notempty name="focus_image"}
|
{notempty name="focus_image"}
|
||||||
<a {notempty name="focus_image.link"}href="{$focus_image.link}"{/notempty}>
|
<a class="topimg" {notempty name="focus_image.link"}href="{$focus_image.link}"{/notempty}>
|
||||||
<img src="{$focus_image.image}">
|
<img src="{$focus_image.image}">
|
||||||
</a>
|
</a>
|
||||||
{/notempty}
|
{/notempty}
|
||||||
|
<div class="culture_top">
|
||||||
|
|
||||||
{notempty name="culture"}
|
{notempty name="culture"}
|
||||||
<div class="culture_bril_con">
|
<div class="culture_bril_con">
|
||||||
{volist name="culture" id="cul" offset="0" length="3"}
|
{volist name="culture" id="cul" offset="0" length="3"}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{extend name="public/base" /}
|
{extend name="public/base" /}
|
||||||
{block name="style"}
|
{block name="style"}
|
||||||
<link rel="stylesheet" href="__CSS__/achievement.css" />
|
<link rel="stylesheet" href="__CSS__/aboutus_mileage.css" />
|
||||||
{/block}
|
{/block}
|
||||||
{block name="main"}
|
{block name="main"}
|
||||||
<div class="orico_Page_achievement">
|
<div class="orico_Page_achievement">
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{extend name="public/base" /}
|
{extend name="public/base" /}
|
||||||
{block name="style"}
|
{block name="style"}
|
||||||
<link rel="stylesheet" href="__CSS__/brand.css" />
|
<link rel="stylesheet" href="__CSS__/aboutus_story.css" />
|
||||||
{/block}
|
{/block}
|
||||||
{block name="main"}
|
{block name="main"}
|
||||||
<div class="orico_Page_brand">
|
<div class="orico_Page_brand">
|
||||||
|
|||||||
@@ -3,12 +3,12 @@
|
|||||||
{notempty name="detail.seo_title"}<title>{$detail.seo_title}</title>{else /}{__BLOCK__}{/notempty}
|
{notempty name="detail.seo_title"}<title>{$detail.seo_title}</title>{else /}{__BLOCK__}{/notempty}
|
||||||
{/block}
|
{/block}
|
||||||
{block name="seo"}
|
{block name="seo"}
|
||||||
{notempty name="detail.seo_keywords"}
|
{notempty name="detail.seo_keywords"}
|
||||||
<meta name="keywords" content="{$detail.seo_keywords}" />
|
<meta name="keywords" content="{$detail.seo_keywords}" />
|
||||||
<meta name="description" content="{$detail.seo_desc}" />
|
<meta name="description" content="{$detail.seo_desc}" />
|
||||||
{else /}
|
{else /}
|
||||||
{__BLOCK__}
|
{__BLOCK__}
|
||||||
{/notempty}
|
{/notempty}
|
||||||
{/block}
|
{/block}
|
||||||
{block name="style"}
|
{block name="style"}
|
||||||
<link rel="stylesheet" href="__CSS__/article_detail.css">
|
<link rel="stylesheet" href="__CSS__/article_detail.css">
|
||||||
@@ -18,35 +18,28 @@
|
|||||||
<!--内容 -->
|
<!--内容 -->
|
||||||
<div class="articleDetailMain">
|
<div class="articleDetailMain">
|
||||||
<div class="atmleft">
|
<div class="atmleft">
|
||||||
|
<div class="ct">
|
||||||
<div class="blog_title">
|
<div class="blog_title">
|
||||||
<h2>{$detail.title}</h2>
|
<h2>{$detail.title}</h2>
|
||||||
<p>{$detail.release_time}</p>
|
<p>{$detail.release_time|date_format_i18n}</p>
|
||||||
</div>
|
|
||||||
<!-- 文本渲染-->
|
|
||||||
<div class="blog_content">{$detail.content|raw}</div>
|
|
||||||
</div>
|
</div>
|
||||||
<!-- 文本渲染-->
|
<!-- 文本渲染-->
|
||||||
<div class="blog_content">{$detail.content|raw}</div>
|
<div class="blog_content">{$detail.content|raw}</div>
|
||||||
</div>
|
</div>
|
||||||
<!-- 评论只显示前面五条--->
|
<!-- 评论只显示前面五条--->
|
||||||
|
{notempty name="comments"}
|
||||||
<div class="plmain">
|
<div class="plmain">
|
||||||
<div class="pl">
|
<div class="pl">
|
||||||
<span class="titlepp">评论</span>
|
<span class="titlepp">{:lang_i18n('评论')}</span>
|
||||||
|
{volist name="comments" id="cm"}
|
||||||
<div class="plit">
|
<div class="plit">
|
||||||
<span class="name">张三:</span>
|
<span class="name">{$cm.name}:</span>
|
||||||
<p>12sdfksdljfksdljdksf是看大家分厘卡聖誕節分厘卡聖誕節付款了</p>
|
<p>{$cm.content}</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="plit">
|
{/volist}
|
||||||
<span class="name">张三:</span>
|
|
||||||
<p>12sdfksdljfksdljdksf是看大家分厘卡聖誕節分厘卡聖誕節付款了</p>
|
|
||||||
</div>
|
|
||||||
<div class="plit">
|
|
||||||
<span class="name">张三:</span>
|
|
||||||
<p>12sdfksdljfksdljdksf是看大家分厘卡聖誕節分厘卡聖誕節付款了</p>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
{/notempty}
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div class="atmright">
|
<div class="atmright">
|
||||||
{notempty name="share_config"}
|
{notempty name="share_config"}
|
||||||
@@ -54,8 +47,7 @@
|
|||||||
<h3>{:lang_i18n('分享')}</h3>
|
<h3>{:lang_i18n('分享')}</h3>
|
||||||
<div class="share_list">
|
<div class="share_list">
|
||||||
{volist name="share_config" id="sc"}
|
{volist name="share_config" id="sc"}
|
||||||
<a class="atdit" {if condition="!empty($sc.is_blank) && $sc.is_blank.value == 1" }target="_blank" {/if}
|
<a class="atdit" {if condition="!empty($sc.is_blank) && $sc.is_blank.value == 1" }target="_blank" {/if} {notempty name="sc.url.value" }href="{$sc.url.value}" {/notempty}> <img src="{$sc.image.value}" />
|
||||||
{notempty name="sc.url.value" }href="{$sc.url.value}" {/notempty}> <img src="{$sc.image.value}" />
|
|
||||||
{eq name=":array_key_exists('triggered_qrcode', $sc)" value="true"}
|
{eq name=":array_key_exists('triggered_qrcode', $sc)" value="true"}
|
||||||
<div class="triggered_qrcode">
|
<div class="triggered_qrcode">
|
||||||
<img src="{$sc.triggered_qrcode.value}" />
|
<img src="{$sc.triggered_qrcode.value}" />
|
||||||
@@ -72,12 +64,10 @@
|
|||||||
<span>{:lang_i18n('名称')}</span>
|
<span>{:lang_i18n('名称')}</span>
|
||||||
<input class="form-control itinp new_name" type="text" name="name" style="text-indent: 10px;">
|
<input class="form-control itinp new_name" type="text" name="name" style="text-indent: 10px;">
|
||||||
<span>{:lang_i18n('电子邮箱')}</span>
|
<span>{:lang_i18n('电子邮箱')}</span>
|
||||||
<input class="form-control itinp new_email" type="email" name="email"
|
<input class="form-control itinp new_email" type="email" name="email" style="text-indent: 10px; margin-bottom:0;">
|
||||||
style="text-indent: 10px; margin-bottom:0;">
|
|
||||||
<p style="color: #C6C7C9; font-size: 0.75rem; margin-bottom: 0.625rem;">{:lang_i18n('您的电子邮件地址不会被公开')}</p>
|
<p style="color: #C6C7C9; font-size: 0.75rem; margin-bottom: 0.625rem;">{:lang_i18n('您的电子邮件地址不会被公开')}</p>
|
||||||
<span>{:lang_i18n('留言内容')}</span>
|
<span>{:lang_i18n('留言内容')}</span>
|
||||||
<textarea class="form-control itinp new_comment" name="content" rows="3"
|
<textarea class="form-control itinp new_comment" name="content" rows="3" style="text-indent: 10px;width: 98%; margin-top: 0.625rem;margin-bottom: 0.625rem;border: 1px solid #DBDBDB;"></textarea>
|
||||||
style="text-indent: 10px;width: 98%; margin-top: 0.625rem;margin-bottom: 0.625rem;border: 1px solid #DBDBDB;"></textarea>
|
|
||||||
<div class="comment_btn" style="color:#ffffff;">{:lang_i18n('提交留言')}</div>
|
<div class="comment_btn" style="color:#ffffff;">{:lang_i18n('提交留言')}</div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
@@ -141,9 +131,9 @@
|
|||||||
const elHeight = $el.outerHeight();
|
const elHeight = $el.outerHeight();
|
||||||
// 元素底部距离视口顶部还有 50px 时触发动画
|
// 元素底部距离视口顶部还有 50px 时触发动画
|
||||||
const triggerPosition = scrollTop + viewportHeight;
|
const triggerPosition = scrollTop + viewportHeight;
|
||||||
if (scrollTop > $('.orico_Page_articleDetail').height()-350-900) {
|
if (scrollTop > $('.orico_Page_articleDetail').height() - 350 - 900) {
|
||||||
$(".atmright").css("position", "static");
|
$(".atmright").css("position", "static");
|
||||||
$(".orico_Page_articleDetail .articleDetailMain").css("align-items","flex-end");
|
$(".orico_Page_articleDetail .articleDetailMain").css("align-items", "flex-end");
|
||||||
} else {
|
} else {
|
||||||
// 还原原始样式
|
// 还原原始样式
|
||||||
$(".atmright").removeAttr("style"); // 清除自定义样式
|
$(".atmright").removeAttr("style"); // 清除自定义样式
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{extend name="public/base" /}
|
{extend name="public/base" /}
|
||||||
{block name="style"}
|
{block name="style"}
|
||||||
<link rel="stylesheet" type="text/css" href="__CSS__/article_category.css" />
|
<link rel="stylesheet" type="text/css" href="__CSS__/article_index.css" />
|
||||||
{/block}
|
{/block}
|
||||||
{block name="main"}
|
{block name="main"}
|
||||||
<div class="orico_Page_category">
|
<div class="orico_Page_category">
|
||||||
@@ -23,6 +23,7 @@
|
|||||||
<div class="categorySearch">
|
<div class="categorySearch">
|
||||||
<form action="{:url('article/index', ['pid' => $Request.param.pid])}" method="get">
|
<form action="{:url('article/index', ['pid' => $Request.param.pid])}" method="get">
|
||||||
<i class="search_icon"></i>
|
<i class="search_icon"></i>
|
||||||
|
<input type="hidden" name="cid" value="{$Request.param.cid}" />
|
||||||
<input type="text" class="search" id="article-search-in" name="keywords" value="">
|
<input type="text" class="search" id="article-search-in" name="keywords" value="">
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
@@ -36,13 +37,15 @@
|
|||||||
<img src="{$ar.image}" />
|
<img src="{$ar.image}" />
|
||||||
<h3>{$ar.title}</h3>
|
<h3>{$ar.title}</h3>
|
||||||
<p>{$ar.desc}</p>
|
<p>{$ar.desc}</p>
|
||||||
<p>{$ar.release_time}</p>
|
<p>{$ar.release_time|date_format_i18n}</p>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
{/volist}
|
{/volist}
|
||||||
</div>
|
</div>
|
||||||
<!-- 分页-->
|
<!-- 分页-->
|
||||||
<div>{$articles|raw}</div>
|
<div>{$articles|raw}</div>
|
||||||
|
{else/}
|
||||||
|
<div style="text-align: center; padding: 10%;">暂无数据</div>
|
||||||
</div>
|
</div>
|
||||||
{/notempty}
|
{/notempty}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{extend name="public/base" /}
|
{extend name="public/base" /}
|
||||||
{block name="style"}
|
{block name="style"}
|
||||||
<link rel="stylesheet" href="__CSS__/download.css" />
|
<link rel="stylesheet" href="__CSS__/attachment_index.css" />
|
||||||
{/block}
|
{/block}
|
||||||
{block name="main"}
|
{block name="main"}
|
||||||
<div class="orico_Page_download">
|
<div class="orico_Page_download">
|
||||||
@@ -15,7 +15,7 @@
|
|||||||
<form action="{:url('attachment/index')}" method="get">
|
<form action="{:url('attachment/index')}" method="get">
|
||||||
<div class="search_all">
|
<div class="search_all">
|
||||||
<input type="hidden" name="id" value="{$Request.get.id}" />
|
<input type="hidden" name="id" value="{$Request.get.id}" />
|
||||||
<input type="text" name="keyword" placeholder="{:lang_i18n('搜索型号')}" />
|
<input type="text" name="keyword" placeholder="{:lang_i18n('搜索')}" />
|
||||||
<button class="searchbtn" type="submit"><img src="__IMAGES__/search_blue.png" /></button>
|
<button class="searchbtn" type="submit"><img src="__IMAGES__/search_blue.png" /></button>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{extend name="public/base" /}
|
{extend name="public/base" /}
|
||||||
{block name="style"}
|
{block name="style"}
|
||||||
<link rel="stylesheet" href="__CSS__/download.css" />
|
<link rel="stylesheet" href="__CSS__/attachment_index.css" />
|
||||||
{/block}
|
{/block}
|
||||||
{block name="main"}
|
{block name="main"}
|
||||||
<div class="orico_Page_download">
|
<div class="orico_Page_download">
|
||||||
@@ -14,7 +14,8 @@
|
|||||||
<!-- 搜索 -->
|
<!-- 搜索 -->
|
||||||
<form action="{:url('attachment/video')}" method="get">
|
<form action="{:url('attachment/video')}" method="get">
|
||||||
<div class="search_all">
|
<div class="search_all">
|
||||||
<input type="text" name="keyword" placeholder="{:lang_i18n('搜索型号')}" />
|
<input type="hidden" name="id" value="{$Request.get.id}" />
|
||||||
|
<input type="text" name="keyword" placeholder="{:lang_i18n('搜索')}" />
|
||||||
<button class="searchbtn" type="submit"><img src="__IMAGES__/search_blue.png" /></button>
|
<button class="searchbtn" type="submit"><img src="__IMAGES__/search_blue.png" /></button>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
|||||||
@@ -56,7 +56,7 @@
|
|||||||
{notempty name="interested"}
|
{notempty name="interested"}
|
||||||
{volist name="interested" id="it"}
|
{volist name="interested" id="it"}
|
||||||
<label class="cit">
|
<label class="cit">
|
||||||
<input name="interested" type="checkbox" value="{$it}" class="sfbcheckboxit" />{$it}
|
<input name="interested[]" type="checkbox" value="{$it}" class="sfbcheckboxit" />{$it}
|
||||||
</label>
|
</label>
|
||||||
{/volist}
|
{/volist}
|
||||||
{/notempty}
|
{/notempty}
|
||||||
|
|||||||
@@ -46,7 +46,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="bditem">
|
<div class="bditem">
|
||||||
<label class="itlable">{:lang_i18n('在线商店网址')}</label>
|
<label class="itlable">{:lang_i18n('在线商店网址')}</label>
|
||||||
<input type="text" class="form-control itinp" name="url" placeholder="{:lang_i18n('请输入网址')}" />
|
<input type="text" class="form-control itinp" name="website_url" placeholder="{:lang_i18n('请输入网址')}" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="theit">
|
<div class="theit">
|
||||||
@@ -61,7 +61,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="theit">
|
<div class="theit">
|
||||||
<div class="bditem bditem1">
|
<div class="bditem bditem1">
|
||||||
<label class="itlable">{:lang_i18n('c公司地址')}<span class="redtag">*</span></label>
|
<label class="itlable">{:lang_i18n('公司地址')}<span class="redtag">*</span></label>
|
||||||
<input class="form-control itinp" name="address" placeholder="{:lang_i18n('请输入地址')}" />
|
<input class="form-control itinp" name="address" placeholder="{:lang_i18n('请输入地址')}" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -23,17 +23,13 @@
|
|||||||
{volist name="items" id="item"}
|
{volist name="items" id="item"}
|
||||||
<a class="narskfit" href="{$item.link}">
|
<a class="narskfit" href="{$item.link}">
|
||||||
<img src="{$item.image}" class="narskico-img" />
|
<img src="{$item.image}" class="narskico-img" />
|
||||||
<span class="narskf-title">{$item.title}</span>
|
<span class="narskf-title" {:style(['color' => $item['title_txt_color']])}>{$item.title}</span>
|
||||||
{notempty name="item.title_short"}
|
|
||||||
<span class="narskf-sm">{$item.title_short}</span>
|
|
||||||
{/notempty}
|
|
||||||
{notempty name="item.desc"}
|
{notempty name="item.desc"}
|
||||||
{if condition="str_contains($item.desc, '<img')"}
|
<span class="narskf-sm" {:style(['color' => $item['desc_txt_color']])}>{$item.desc|raw}</span>
|
||||||
|
{/notempty}
|
||||||
|
{notempty name="item.extra_image"}
|
||||||
<div class="narskfactive-ewm">
|
<div class="narskfactive-ewm">
|
||||||
{else/}
|
<img src="{$item.extra_image}" alt="" />
|
||||||
<div class="narskf-sm narskf-font-26">
|
|
||||||
{/if}
|
|
||||||
{$item.desc|raw}
|
|
||||||
</div>
|
</div>
|
||||||
{/notempty}
|
{/notempty}
|
||||||
</a>
|
</a>
|
||||||
@@ -43,8 +39,8 @@
|
|||||||
<div class="narskfit narskfit2">
|
<div class="narskfit narskfit2">
|
||||||
<img src="{$item.image}" class="narskico-img" />
|
<img src="{$item.image}" class="narskico-img" />
|
||||||
<div class="narskfit2-ct">
|
<div class="narskfit2-ct">
|
||||||
<span class="narskf-title">{$item.title}</span>
|
<span class="narskf-title" {:style(['color' => $item['title_txt_color']])}>{$item.title}</span>
|
||||||
<span class="narskf-sm">{$item.desc|raw}</span>
|
<span class="narskf-sm" {:style(['color' => $item['desc_txt_color']])}>{$item.desc|raw}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{/volist}
|
{/volist}
|
||||||
|
|||||||
@@ -30,8 +30,7 @@
|
|||||||
{volist name="product_categorys" id="cate"}
|
{volist name="product_categorys" id="cate"}
|
||||||
<a class="catit" href="{$cate.link}">
|
<a class="catit" href="{$cate.link}">
|
||||||
<img src="{$cate.image}" class="catIcoImg" />
|
<img src="{$cate.image}" class="catIcoImg" />
|
||||||
<span class="catName" {notempty name="cate.title_txt_color" }style="color:{$cate.title_txt_color};"
|
<span class="catName" {notempty name="cate.title_txt_color" }style="color:{$cate.title_txt_color};" {/notempty}>{$cate.title}</span>
|
||||||
{/notempty}>{$cate.title}</span>
|
|
||||||
</a>
|
</a>
|
||||||
{/volist}
|
{/volist}
|
||||||
</div>
|
</div>
|
||||||
@@ -78,12 +77,12 @@
|
|||||||
<div class="swiper-wrapper">
|
<div class="swiper-wrapper">
|
||||||
{volist name="featured_products" id="product"}
|
{volist name="featured_products" id="product"}
|
||||||
<div class="swiper-slide picture">
|
<div class="swiper-slide picture">
|
||||||
<a class="primg">
|
<a class="primg" href="{:url('product/detail', ['id' => $product.id])}">
|
||||||
<img src="{$product.cover_image}" />
|
<img src="{$product.cover_image}" />
|
||||||
</a>
|
</a>
|
||||||
<div class="fpptitle">{$product.name}</div>
|
<div class="fpptitle">{$product.name}</div>
|
||||||
<div class="subtitle">{$product.short_name}</div>
|
<div class="subtitle">{$product.short_name}</div>
|
||||||
<a class="more">{:lang_i18n('了解更多')} ></a>
|
<a class="more" href="{:url('product/detail', ['id' => $product.id])}">{:lang_i18n('了解更多')} ></a>
|
||||||
</div>
|
</div>
|
||||||
{/volist}
|
{/volist}
|
||||||
</div>
|
</div>
|
||||||
@@ -103,15 +102,9 @@
|
|||||||
{notempty name="video"}
|
{notempty name="video"}
|
||||||
<div class="hotProduct">
|
<div class="hotProduct">
|
||||||
<div class="hotvideo">
|
<div class="hotvideo">
|
||||||
<video poster="{$video.image}"
|
<video poster="{$video.image}" src="{$video.video}" style="max-height:50rem;z-index:9999;width: 100%;object-fit: cover;" autoplay loop controls id="oricoVideo"></video>
|
||||||
src="{$video.video}"
|
|
||||||
style="max-height:50rem;z-index:9999;width: 100%;object-fit: cover;"
|
|
||||||
autoplay
|
|
||||||
loop
|
|
||||||
controls
|
|
||||||
id="oricoVideo"></video>
|
|
||||||
</div>
|
</div>
|
||||||
<img src="{$video.image}" class="hotImg" />
|
<!-- <img src="{$video.image}" class="hotImg" /> -->
|
||||||
</div>
|
</div>
|
||||||
{/notempty}
|
{/notempty}
|
||||||
<!-- 场景介绍 -->
|
<!-- 场景介绍 -->
|
||||||
@@ -120,8 +113,7 @@
|
|||||||
{volist name="scenes" id="scene"}
|
{volist name="scenes" id="scene"}
|
||||||
<div class="sceneitem">
|
<div class="sceneitem">
|
||||||
<div class="sceneInfo">
|
<div class="sceneInfo">
|
||||||
<p class="scenetitle" {notempty name="scene.title_txt_color" }style="color:{$scene.title_txt_color};"
|
<p class="scenetitle" {notempty name="scene.title_txt_color" }style="color:{$scene.title_txt_color};" {/notempty}>{$scene.title}</p>
|
||||||
{/notempty}>{$scene.title}</p>
|
|
||||||
<p class="subtitle" {notempty name="scene.desc_txt_color" }style="color:{$scene.desc_txt_color};" {/notempty}>
|
<p class="subtitle" {notempty name="scene.desc_txt_color" }style="color:{$scene.desc_txt_color};" {/notempty}>
|
||||||
{$scene.desc|raw}</p>
|
{$scene.desc|raw}</p>
|
||||||
<a class="sceneMore" href="{$scene.link}">{:lang_i18n('了解更多')} ></a>
|
<a class="sceneMore" href="{$scene.link}">{:lang_i18n('了解更多')} ></a>
|
||||||
@@ -157,10 +149,8 @@
|
|||||||
<img src="{$story.image}" class="bsImg" />
|
<img src="{$story.image}" class="bsImg" />
|
||||||
</div>
|
</div>
|
||||||
<div class="bsinf">
|
<div class="bsinf">
|
||||||
<div class="bstitle" {notempty name="story.title_txt_color" }style="color:{$story.title_txt_color};"
|
<div class="bstitle" {notempty name="story.title_txt_color" }style="color:{$story.title_txt_color};" {/notempty}>{$story.title}</div>
|
||||||
{/notempty}>{$story.title}</div>
|
<div class="bssubtitle" {notempty name="story.desc_txt_color" }style="color:{$story.desc_txt_color};" {/notempty}>{$story.desc|raw}</div>
|
||||||
<div class="bssubtitle" {notempty name="story.desc_txt_color" }style="color:{$story.desc_txt_color};"
|
|
||||||
{/notempty}>{$story.desc|raw}</div>
|
|
||||||
<a class="bsmore" href="{$story.link}">{:lang_i18n('了解更多')} ></a>
|
<a class="bsmore" href="{$story.link}">{:lang_i18n('了解更多')} ></a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -276,14 +266,14 @@
|
|||||||
const videoContainer = $('.hotvideo');
|
const videoContainer = $('.hotvideo');
|
||||||
const img = $('.hotImg');
|
const img = $('.hotImg');
|
||||||
// 监听视频加载完成事件
|
// 监听视频加载完成事件
|
||||||
video.on('canplaythrough', function() {
|
video.on('canplaythrough', function () {
|
||||||
// 显示视频容器,隐藏图片
|
// 显示视频容器,隐藏图片
|
||||||
videoContainer.css('display', 'block');
|
videoContainer.css('display', 'block');
|
||||||
img.hide();
|
img.hide();
|
||||||
console.log('视频可以流畅播放');
|
console.log('视频可以流畅播放');
|
||||||
});
|
});
|
||||||
// 处理视频加载失败(可选)
|
// 处理视频加载失败(可选)
|
||||||
video.on('error', function() {
|
video.on('error', function () {
|
||||||
// 可在此添加失败提示,如显示错误信息或保留图片
|
// 可在此添加失败提示,如显示错误信息或保留图片
|
||||||
img.show();
|
img.show();
|
||||||
videoContainer.css('display', 'none');
|
videoContainer.css('display', 'none');
|
||||||
@@ -340,11 +330,11 @@
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
// 计算品牌故事轮播个数样式调整
|
// 计算品牌故事轮播个数样式调整
|
||||||
function calculateDisplayValue (n) {
|
function calculateDisplayValue(n) {
|
||||||
return 8 - n;
|
return 8 - n;
|
||||||
}
|
}
|
||||||
// 动态调整分页点和年份位置
|
// 动态调整分页点和年份位置
|
||||||
function adjustTimeline () {
|
function adjustTimeline() {
|
||||||
const slideCount = brandStoryswiper.slides.length; // 获取轮播项个数
|
const slideCount = brandStoryswiper.slides.length; // 获取轮播项个数
|
||||||
if (slideCount === 0) return;
|
if (slideCount === 0) return;
|
||||||
// 计算分页点间距
|
// 计算分页点间距
|
||||||
|
|||||||
@@ -37,13 +37,13 @@
|
|||||||
<!-- 小图片预览 -->
|
<!-- 小图片预览 -->
|
||||||
<div id="imageMenu">
|
<div id="imageMenu">
|
||||||
<ul class="image_list">
|
<ul class="image_list">
|
||||||
|
{volist name="sku.photo_album" id="photo"}
|
||||||
|
<li id="onlickImg"><img src="{:thumb($photo)}" data-url="{$photo}" /></li>
|
||||||
|
{/volist}
|
||||||
{if condition="!empty($product.video_img) && !empty($product.video_url) && $idx == 1"}
|
{if condition="!empty($product.video_img) && !empty($product.video_url) && $idx == 1"}
|
||||||
<!-- 产品视频 -->
|
<!-- 产品视频 -->
|
||||||
<li id="onlickImg"><img src="{:thumb($product.video_img)}" data-url="{$product.video_url}" /></li>
|
<li id="onlickImg"><img src="{:thumb($product.video_img)}" data-url="{$product.video_url}" /></li>
|
||||||
{/if}
|
{/if}
|
||||||
{volist name="sku.photo_album" id="photo"}
|
|
||||||
<li id="onlickImg"><img src="{:thumb($photo)}" data-url="{$photo}" /></li>
|
|
||||||
{/volist}
|
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<!-- 右边切换按钮 -->
|
<!-- 右边切换按钮 -->
|
||||||
@@ -52,16 +52,9 @@
|
|||||||
<!-- 产品大图 -->
|
<!-- 产品大图 -->
|
||||||
<div class="bigImg" id="vertical">
|
<div class="bigImg" id="vertical">
|
||||||
<!-- 主图 -->
|
<!-- 主图 -->
|
||||||
{if condition="!empty($product.video_img) && !empty($product.video_url) && $idx == 1"}
|
|
||||||
<!-- 如果有视频情况下默认先显示视频 -->
|
|
||||||
<video poster="{$product.video_img}" autoplay="autoplay" muted="muted" loop="loop" id="video" controls style="width: 510px;height: 510px; position: relative;z-index: 998;">
|
|
||||||
<source src="{$product.video_url}" type="video/mp4"/>
|
|
||||||
</video>
|
|
||||||
{else/}
|
|
||||||
{notempty name="sku.photo_album[0]"}
|
{notempty name="sku.photo_album[0]"}
|
||||||
<img src="{$sku.photo_album[0]}" id="midimg" />
|
<img src="{$sku.photo_album[0]}" id="midimg" />
|
||||||
{/notempty}
|
{/notempty}
|
||||||
{/if}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{/volist}
|
{/volist}
|
||||||
@@ -82,14 +75,19 @@
|
|||||||
{/volist}
|
{/volist}
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<!-- 颜色-->
|
<!-- 颜色/属性 -->
|
||||||
{volist name="product_sku_attrs" id="ps"}
|
{volist name="product_sku_attrs" id="ps"}
|
||||||
<div class="prcolors">
|
<div class="prcolors">
|
||||||
<div class="dt">{$ps.attr_name}</div>
|
<div class="dt">{$ps.attr_name}</div>
|
||||||
<ul class="dowebok">
|
<ul class="dowebok">
|
||||||
{volist name="ps.attr_values" id="pv" key="k"}
|
{volist name="ps.attr_values" id="pv" key="k"}
|
||||||
{assign name="attr_value_type" value=":rgb_or_image($pv.attr_value)" /}
|
{assign name="attr_value_type" value=":rgb_or_image($pv.attr_value)" /}
|
||||||
<a {eq name='k' value='1'}class="on"{/eq} data-sku_id="{$pv.sku_id}">
|
<li>
|
||||||
|
{between name='ps.attr_id' value='1,2'}
|
||||||
|
<a class="{eq name='k' value='1'}on{/eq}" data-sku_id="{$pv.sku_id}">
|
||||||
|
{else /}
|
||||||
|
<a class="charging {eq name='k' value='1'}on{/eq}" data-sku_id="{$pv.sku_id}">
|
||||||
|
{/between}
|
||||||
{eq name="attr_value_type" value="IMAGE"}
|
{eq name="attr_value_type" value="IMAGE"}
|
||||||
<span class="itemcolor"><img src="{$pv.attr_value}" /></span>
|
<span class="itemcolor"><img src="{$pv.attr_value}" /></span>
|
||||||
{elseif condition="$attr_value_type == 'RGB'" /}
|
{elseif condition="$attr_value_type == 'RGB'" /}
|
||||||
@@ -98,6 +96,7 @@
|
|||||||
<span>{$pv.attr_value}</span>
|
<span>{$pv.attr_value}</span>
|
||||||
{/eq}
|
{/eq}
|
||||||
</a>
|
</a>
|
||||||
|
</li>
|
||||||
{/volist}
|
{/volist}
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
@@ -108,7 +107,9 @@
|
|||||||
{volist name="product_purchase_links" id="ppp" key="k"}
|
{volist name="product_purchase_links" id="ppp" key="k"}
|
||||||
<a class="thebt bttype{$k}" href="{$ppp.link}">{$ppp.platform_name}</a>
|
<a class="thebt bttype{$k}" href="{$ppp.link}">{$ppp.platform_name}</a>
|
||||||
{/volist}
|
{/volist}
|
||||||
|
{eq name=":cookie('think_lang')" value="en-us"}
|
||||||
<a class="thebt bttype3" id="open_form_modal">{:lang_i18n('发送查询')}</a>
|
<a class="thebt bttype3" id="open_form_modal">{:lang_i18n('发送查询')}</a>
|
||||||
|
{/eq}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -217,7 +218,7 @@
|
|||||||
<textarea name="message" id="message"></textarea>
|
<textarea name="message" id="message"></textarea>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<button type="button" id="send" class="submit-btn">{:lang_i18n('提交')}</button>
|
<button type="submit" class="submit-btn">{:lang_i18n('提交')}</button>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -237,7 +238,7 @@
|
|||||||
// 切换图册
|
// 切换图册
|
||||||
$('.prcolors .dowebok a').click(function() {
|
$('.prcolors .dowebok a').click(function() {
|
||||||
// 移除所有 .on 类
|
// 移除所有 .on 类
|
||||||
$(this).addClass('on').siblings('a').removeClass('on');
|
$(this).addClass('on').parent('li').siblings('li').find('a').removeClass('on');
|
||||||
// 获取当前点击的元素的 data-sku_id 值
|
// 获取当前点击的元素的 data-sku_id 值
|
||||||
var skuId = $(this).data('sku_id');
|
var skuId = $(this).data('sku_id');
|
||||||
// 根据 skuId 显示对应的预览
|
// 根据 skuId 显示对应的预览
|
||||||
@@ -265,21 +266,12 @@
|
|||||||
// 处理表单提交
|
// 处理表单提交
|
||||||
modal.find("form").submit(function(e) {
|
modal.find("form").submit(function(e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
var form = $(this)
|
||||||
var formData = $(this).serialize();
|
var formData = $(this).serialize();
|
||||||
// 这里可以添加代码将formData发送到服务器
|
|
||||||
// 例如通过AJAX
|
|
||||||
console.log("提交的数据: " + formData);
|
|
||||||
// 提交成功后可以选择关闭模态框
|
|
||||||
modal.hide();
|
|
||||||
});
|
|
||||||
|
|
||||||
// 提交询盘
|
|
||||||
$('#send').click(function() {
|
|
||||||
var form = $(this).parents('form');
|
|
||||||
$.ajax({
|
$.ajax({
|
||||||
url: "{:url('product/inquiry')}",
|
url: "{:url('product/inquiry')}",
|
||||||
type: 'POST',
|
type: 'POST',
|
||||||
data: form.serialize(),
|
data: formData,
|
||||||
success: function(r) {
|
success: function(r) {
|
||||||
if (r.code == 0) {
|
if (r.code == 0) {
|
||||||
form[0].reset(); // 重置表单
|
form[0].reset(); // 重置表单
|
||||||
@@ -289,6 +281,7 @@
|
|||||||
},
|
},
|
||||||
error: function(e) {
|
error: function(e) {
|
||||||
console.error(e);
|
console.error(e);
|
||||||
|
modal.hide();
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
@@ -324,8 +317,6 @@
|
|||||||
slidesPerView: 3,
|
slidesPerView: 3,
|
||||||
spaceBetween: 30,
|
spaceBetween: 30,
|
||||||
slidesPerGroup: 3,
|
slidesPerGroup: 3,
|
||||||
loop: true,
|
|
||||||
loopFillGroupWithBlank: true,
|
|
||||||
navigation: {
|
navigation: {
|
||||||
nextEl: '.swiper-button-next',
|
nextEl: '.swiper-button-next',
|
||||||
prevEl: '.swiper-button-prev',
|
prevEl: '.swiper-button-prev',
|
||||||
|
|||||||
@@ -14,6 +14,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
<!-- 搜索结果列表-->
|
<!-- 搜索结果列表-->
|
||||||
|
{notempty name="products"}
|
||||||
<ul class="seul">
|
<ul class="seul">
|
||||||
{volist name="products" id="pro"}
|
{volist name="products" id="pro"}
|
||||||
<a href="{:url('product/detail', ['id' => $pro['id']])}">
|
<a href="{:url('product/detail', ['id' => $pro['id']])}">
|
||||||
@@ -32,6 +33,10 @@
|
|||||||
</a>
|
</a>
|
||||||
{/volist}
|
{/volist}
|
||||||
</ul>
|
</ul>
|
||||||
|
<div>{$page|raw}</div>
|
||||||
|
{else/}
|
||||||
|
<div style="text-align: center; padding: 10%;">暂无数据</div>
|
||||||
|
{/notempty}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{/block}
|
{/block}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
|
||||||
|
<head>
|
||||||
<meta charset="utf-8" />
|
<meta charset="utf-8" />
|
||||||
{block name="title"}<title>{$basic_config['website_seo_title']['value']}</title>{/block}
|
{block name="title"}<title>{$basic_config['website_seo_title']['value']}</title>{/block}
|
||||||
{block name="seo"}
|
{block name="seo"}
|
||||||
@@ -13,13 +14,119 @@
|
|||||||
<link rel="stylesheet" type="text/css" href="__CSS__/orico_header.css" />
|
<link rel="stylesheet" type="text/css" href="__CSS__/orico_header.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="__CSS__/orico_footer.css" />
|
<link rel="stylesheet" type="text/css" href="__CSS__/orico_footer.css" />
|
||||||
{block name="style"}{/block}
|
{block name="style"}{/block}
|
||||||
<link rel="stylesheet" href="https://unpkg.com/swiper@9/swiper-bundle.min.css">
|
<script>
|
||||||
|
// 增强型 UC 浏览器检测
|
||||||
|
function isUCBrowser() {
|
||||||
|
const ua = navigator.userAgent.toLowerCase();
|
||||||
|
return ua.includes('ubrowser');
|
||||||
|
}
|
||||||
|
|
||||||
|
// 直接输出对应的 HTML 标签
|
||||||
|
if (isUCBrowser()) {
|
||||||
|
document.write(`
|
||||||
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/swiper@8.4.7/swiper-bundle.min.css">
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/swiper@8.4.7/swiper-bundle.min.js"><\/script>
|
||||||
|
`);
|
||||||
|
} else {
|
||||||
|
document.write(`
|
||||||
|
<link rel="stylesheet" href="https://unpkg.com/swiper@9.4.1/swiper-bundle.min.css">
|
||||||
|
<script src="https://unpkg.com/swiper@9.4.1/swiper-bundle.min.js"><\/script>
|
||||||
|
`);
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<!-- 你的 jQuery 和其他脚本 -->
|
||||||
|
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
|
||||||
|
<!-- <link rel="stylesheet" href="https://unpkg.com/swiper@9/swiper-bundle.min.css">
|
||||||
|
<script type="text/javascript" src="https://unpkg.com/swiper@9.4.1/swiper-bundle.min.js"></script> -->
|
||||||
<script type="text/javascript" src='https://code.jquery.com/jquery-3.6.0.min.js'></script>
|
<script type="text/javascript" src='https://code.jquery.com/jquery-3.6.0.min.js'></script>
|
||||||
<script type="text/javascript" src="https://unpkg.com/swiper@9.4.1/swiper-bundle.min.js"></script>
|
|
||||||
<script type="text/javascript" src="__JS__/before-after.min.js"></script>
|
<script type="text/javascript" src="__JS__/before-after.min.js"></script>
|
||||||
<script type="text/javascript" src="__JS__/large.js"></script>
|
<script type="text/javascript" src="__JS__/large.js"></script>
|
||||||
</head>
|
<script type="text/javascript">
|
||||||
<body>
|
function detectDeviceByResolution() {
|
||||||
|
// 获取屏幕信息
|
||||||
|
const screenWidth = window.screen.width;
|
||||||
|
const screenHeight = window.screen.height;
|
||||||
|
const aspectRatio = screenWidth / screenHeight;
|
||||||
|
const pixelDensity = window.devicePixelRatio || 1;
|
||||||
|
|
||||||
|
// 计算物理屏幕尺寸(对角线英寸数)
|
||||||
|
// 注意:此计算依赖浏览器提供准确的 devicePixelRatio
|
||||||
|
const diagonalPixels = Math.sqrt(
|
||||||
|
Math.pow(screenWidth, 2) + Math.pow(screenHeight, 2)
|
||||||
|
);
|
||||||
|
const diagonalInches = diagonalPixels / pixelDensity / 96;
|
||||||
|
|
||||||
|
// 设备类型判断阈值
|
||||||
|
const isTabletSize = diagonalInches >= 7 && diagonalInches <= 13;
|
||||||
|
const isLaptopSize = diagonalInches > 13 && diagonalInches <= 17;
|
||||||
|
const isDesktopSize = diagonalInches > 17;
|
||||||
|
|
||||||
|
// 常见平板分辨率模式(非绝对标准)
|
||||||
|
const isTabletResolution = (
|
||||||
|
(screenWidth >= 768 && screenWidth <= 1100 && aspectRatio <= 1.7) || // 竖屏或方屏平板
|
||||||
|
(screenHeight >= 768 && screenHeight <= 1100 && aspectRatio >= 1.5) // 横屏平板
|
||||||
|
);
|
||||||
|
|
||||||
|
// 常见PC/笔记本分辨率模式
|
||||||
|
const isPcResolution = (
|
||||||
|
(screenWidth >= 1280 && aspectRatio >= 1.6) || // 宽屏笔记本/桌面
|
||||||
|
(screenWidth >= 1920) // 高分辨率桌面
|
||||||
|
);
|
||||||
|
|
||||||
|
if (isTabletSize && isTabletResolution) {
|
||||||
|
return 'tablet';
|
||||||
|
} else if (isLaptopSize && isPcResolution) {
|
||||||
|
return 'laptop';
|
||||||
|
} else if (isDesktopSize && isPcResolution) {
|
||||||
|
return 'desktop';
|
||||||
|
} else {
|
||||||
|
return 'unknown';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// $(window).ready(function () {
|
||||||
|
// const deviceType = detectDeviceByResolution();
|
||||||
|
// if (deviceType=='tablet') {
|
||||||
|
// window.location.href = '?mtpl=1';
|
||||||
|
// }
|
||||||
|
// })
|
||||||
|
$(window).ready(function () {
|
||||||
|
if ($(window).width() < 1024) {
|
||||||
|
var locationURL = new URL(window.location.href);
|
||||||
|
var mtpl = locationURL.searchParams.get("mtpl");
|
||||||
|
if (mtpl == null) {
|
||||||
|
locationURL.searchParams.set("mtpl", "1");
|
||||||
|
window.location.href = locationURL.href;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<!-- Matomo -->
|
||||||
|
<script>
|
||||||
|
var _paq = window._paq = window._paq || [];
|
||||||
|
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
|
||||||
|
_paq.push(['trackPageView']);
|
||||||
|
_paq.push(['enableLinkTracking']);
|
||||||
|
(function() {
|
||||||
|
var u="//analytics.f2b211.com/";
|
||||||
|
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||||
|
_paq.push(['setSiteId', '1']);
|
||||||
|
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||||
|
g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
|
||||||
|
})();
|
||||||
|
</script>
|
||||||
|
<!-- End Matomo Code -->
|
||||||
|
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<noscript>
|
||||||
|
<!-- Matomo Image Tracker-->
|
||||||
|
<img referrerpolicy="no-referrer-when-downgrade" src="https://analytics.f2b211.com/matomo.php?idsite=1&rec=1" style="border:0" alt="" />
|
||||||
|
<!-- End Matomo -->
|
||||||
|
</noscript>
|
||||||
{block name="header"}
|
{block name="header"}
|
||||||
{include file="public/header"/}
|
{include file="public/header"/}
|
||||||
{/block}
|
{/block}
|
||||||
@@ -28,5 +135,6 @@
|
|||||||
{include file="public/footer"/}
|
{include file="public/footer"/}
|
||||||
{/block}
|
{/block}
|
||||||
{block name="script"}{/block}
|
{block name="script"}{/block}
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
@@ -51,10 +51,10 @@
|
|||||||
<ul>
|
<ul>
|
||||||
{volist name="contact_config" id="vo"}
|
{volist name="contact_config" id="vo"}
|
||||||
<li>
|
<li>
|
||||||
<a href="javascript:void(0);" class="fline">
|
|
||||||
{if condition="$vo.type == 'image'"}
|
{if condition="$vo.type == 'image'"}
|
||||||
<img src="{$vo.value}" {if condition="!empty($vo.extra)" }style="{$vo.extra}" {/if} />
|
<img src="{$vo.value}" {if condition="!empty($vo.extra)" }style="{$vo.extra}" {/if} />
|
||||||
{else/}
|
{else/}
|
||||||
|
<a href="javascript:void(0);" class="fline">
|
||||||
{$vo.value}
|
{$vo.value}
|
||||||
{/if}
|
{/if}
|
||||||
</a>
|
</a>
|
||||||
@@ -70,7 +70,7 @@
|
|||||||
<ul>
|
<ul>
|
||||||
{volist name="media_config" id="vo"}
|
{volist name="media_config" id="vo"}
|
||||||
<a href="{$vo.url.value}">
|
<a href="{$vo.url.value}">
|
||||||
<img src="{$vo.image.value}" {if condition="!empty($vo.image.extra)"}style="{$vo.image.extra}" {/if} />
|
<img src="{$vo.image.value}" {if condition="!empty($vo.image.extra)" }style="{$vo.image.extra}" {/if} />
|
||||||
</a>
|
</a>
|
||||||
{/volist}
|
{/volist}
|
||||||
</ul>
|
</ul>
|
||||||
@@ -89,3 +89,35 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
{eq name=":cookie('think_lang')" value="zh-cn"}
|
||||||
|
<div class="backtop">
|
||||||
|
<img src="__IMAGES__/ic-backtop.png" class="ictop" />
|
||||||
|
<span>返回顶部</span>
|
||||||
|
</div>
|
||||||
|
{/eq}
|
||||||
|
<script>
|
||||||
|
$(document).ready(function () {
|
||||||
|
// 获取窗口高度
|
||||||
|
var windowHeight = $(window).height();
|
||||||
|
// 监听滚动事件
|
||||||
|
$(window).scroll(function () {
|
||||||
|
// 检查滚动距离是否超过一屏幕高度
|
||||||
|
if ($(this).scrollTop() > windowHeight) {
|
||||||
|
// 如果超过,显示返回顶部按钮
|
||||||
|
$('.backtop').fadeIn(300);
|
||||||
|
} else {
|
||||||
|
// 如果未超过,隐藏返回顶部按钮
|
||||||
|
$('.backtop').fadeOut(300);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// 点击返回顶部按钮时的事件处理
|
||||||
|
$('.backtop').click(function () {
|
||||||
|
// 平滑滚动到页面顶部
|
||||||
|
$('html, body').animate({
|
||||||
|
scrollTop: 0
|
||||||
|
}, 800);
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
@@ -26,18 +26,22 @@
|
|||||||
<!-- 右边子菜单-->
|
<!-- 右边子菜单-->
|
||||||
{volist name="header_categorys" id="vo" key="idx"}
|
{volist name="header_categorys" id="vo" key="idx"}
|
||||||
<div class="navItem_cyright" {eq name="idx" value="1" }style="display: block;"{else/}style="display: none;"{/eq}>
|
<div class="navItem_cyright" {eq name="idx" value="1" }style="display: block;"{else/}style="display: none;"{/eq}>
|
||||||
|
{if condition="!empty($vo.children)"}
|
||||||
{volist name="vo.children" id="vc"}
|
{volist name="vo.children" id="vc"}
|
||||||
<dl class="nav_cyrightit">
|
<dl class="nav_cyrightit">
|
||||||
<dt>
|
<dt>
|
||||||
<a href="{:url('product/subcategory', ['id' => $vc.id])}">{$vc.name}</a>
|
<a href="{:url('product/subcategory', ['id' => $vc.id])}">{$vc.name}</a>
|
||||||
</dt>
|
</dt>
|
||||||
|
{if condition="!empty($vc.children)"}
|
||||||
{volist name="vc.children" id="vcc"}
|
{volist name="vc.children" id="vcc"}
|
||||||
<dd>
|
<dd>
|
||||||
<a href="{:url('product/subcategory', ['id' => $vcc.id])}">{$vcc.name}</a>
|
<a href="{:url('product/subcategory', ['id' => $vcc.id])}">{$vcc.name}</a>
|
||||||
</dd>
|
</dd>
|
||||||
{/volist}
|
{/volist}
|
||||||
|
{/if}
|
||||||
</dl>
|
</dl>
|
||||||
{/volist}
|
{/volist}
|
||||||
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
{/volist}
|
{/volist}
|
||||||
</ol>
|
</ol>
|
||||||
@@ -86,11 +90,13 @@
|
|||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
{eq name=":cookie('think_lang')" value="en-us"}
|
||||||
{notempty name="basic_config['navigation_store_url']['value']"}
|
{notempty name="basic_config['navigation_store_url']['value']"}
|
||||||
<a class="storetopbt" href="{$basic_config['navigation_store_url']['value']}">
|
<a class="storetopbt" href="{$basic_config['navigation_store_url']['value']}">
|
||||||
<img src="__IMAGES__/shopico.png" class="storeImgico" />{:lang_i18n('店铺')}
|
<img src="__IMAGES__/shopico.png" class="storeImgico" />{:lang_i18n('店铺')}
|
||||||
</a>
|
</a>
|
||||||
{/notempty}
|
{/notempty}
|
||||||
|
{/eq}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -122,7 +128,7 @@
|
|||||||
<script>
|
<script>
|
||||||
$(document).ready(function () {
|
$(document).ready(function () {
|
||||||
// 搜索历史记录处理
|
// 搜索历史记录处理
|
||||||
function history (keywords) {
|
function history(keywords) {
|
||||||
var history = localStorage.getItem('header_search_keywords');
|
var history = localStorage.getItem('header_search_keywords');
|
||||||
if (!history) {
|
if (!history) {
|
||||||
history = [];
|
history = [];
|
||||||
@@ -150,7 +156,7 @@
|
|||||||
return history;
|
return history;
|
||||||
}
|
}
|
||||||
// 封装一个函数用于处理鼠标悬停显示和隐藏内容
|
// 封装一个函数用于处理鼠标悬停显示和隐藏内容
|
||||||
function handleHover ($element, $content) {
|
function handleHover($element, $content) {
|
||||||
$element.mouseenter(function () {
|
$element.mouseenter(function () {
|
||||||
$content.stop(true, true).slideDown(60);
|
$content.stop(true, true).slideDown(60);
|
||||||
}).mouseleave(function () {
|
}).mouseleave(function () {
|
||||||
|
|||||||
@@ -14,8 +14,60 @@
|
|||||||
<link rel="stylesheet" type="text/css" href="__CSS__/orico_footer.css" />
|
<link rel="stylesheet" type="text/css" href="__CSS__/orico_footer.css" />
|
||||||
{block name="style"}{/block}
|
{block name="style"}{/block}
|
||||||
<script type="text/javascript" src='https://code.jquery.com/jquery-3.6.0.min.js'></script>
|
<script type="text/javascript" src='https://code.jquery.com/jquery-3.6.0.min.js'></script>
|
||||||
|
<script>
|
||||||
|
// 增强型 UC 浏览器检测
|
||||||
|
function isUCBrowser() {
|
||||||
|
const ua = navigator.userAgent.toLowerCase();
|
||||||
|
return ua.includes('ubrowser');
|
||||||
|
}
|
||||||
|
|
||||||
|
// 直接输出对应的 HTML 标签
|
||||||
|
if (isUCBrowser()) {
|
||||||
|
document.write(`
|
||||||
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/swiper@8.4.7/swiper-bundle.min.css">
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/swiper@8.4.7/swiper-bundle.min.js"><\/script>
|
||||||
|
`);
|
||||||
|
} else {
|
||||||
|
document.write(`
|
||||||
|
<link rel="stylesheet" href="https://unpkg.com/swiper@9.4.1/swiper-bundle.min.css">
|
||||||
|
<script src="https://unpkg.com/swiper@9.4.1/swiper-bundle.min.js"><\/script>
|
||||||
|
`);
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<script>
|
||||||
|
$(window).ready(function () {
|
||||||
|
if ($(window).width() < 1024) {
|
||||||
|
var locationURL = new URL(window.location.href);
|
||||||
|
var mtpl = locationURL.searchParams.get("mtpl");
|
||||||
|
if (mtpl == null) {
|
||||||
|
locationURL.searchParams.set("mtpl", "1");
|
||||||
|
window.location.href = locationURL.href;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
<!-- Matomo -->
|
||||||
|
<script>
|
||||||
|
var _paq = window._paq = window._paq || [];
|
||||||
|
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
|
||||||
|
_paq.push(['trackPageView']);
|
||||||
|
_paq.push(['enableLinkTracking']);
|
||||||
|
(function() {
|
||||||
|
var u="//analytics.f2b211.com/";
|
||||||
|
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||||
|
_paq.push(['setSiteId', '1']);
|
||||||
|
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||||
|
g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
|
||||||
|
})();
|
||||||
|
</script>
|
||||||
|
<!-- End Matomo Code -->
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
<noscript>
|
||||||
|
<!-- Matomo Image Tracker-->
|
||||||
|
<img referrerpolicy="no-referrer-when-downgrade" src="https://analytics.f2b211.com/matomo.php?idsite=1&rec=1" style="border:0" alt="" />
|
||||||
|
<!-- End Matomo -->
|
||||||
|
</noscript>
|
||||||
{block name="header"}
|
{block name="header"}
|
||||||
{include file="public/nas_header"/}
|
{include file="public/nas_header"/}
|
||||||
{/block}
|
{/block}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<header class="narsPage-head">
|
<header class="narsPage-head">
|
||||||
<div class="headcenter">
|
<div class="headcenter">
|
||||||
<a href="{:url('/index/topic/nas/index')}">
|
<a>
|
||||||
<img class="logico" style="cursor:pointer;" src="__IMAGES__/logo_nas_{:cookie('think_lang')}.png" />
|
<img class="logico" style="cursor:pointer;" src="__IMAGES__/logo_nas_{:cookie('think_lang')}.png" />
|
||||||
</a>
|
</a>
|
||||||
{notempty name="header_navigation"}
|
{notempty name="header_navigation"}
|
||||||
@@ -17,9 +17,10 @@
|
|||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
$(function() {
|
$(function() {
|
||||||
$('.headnav .navitem').each(function(idx, item) {
|
$('.headnav .navitem').each(function(idx, item) {
|
||||||
$(item).removeClass('hover');
|
var _item = $(item);
|
||||||
if (compareUrls(location.href, item.href)) {
|
_item.removeClass('hover');
|
||||||
$(item).addClass('hover').siblings();
|
if (_item.attr('href') && compareUrls(location.href, _item.get(0).href)) {
|
||||||
|
_item.addClass('hover').siblings();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -32,17 +32,19 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="nhlp-tx-list">
|
<div class="nhlp-tx-list">
|
||||||
{volist name="vo.article" id="va" key="index"}
|
{volist name="vo.article" id="va" key="index"}
|
||||||
<a class="txrow" href="{:url('/index/topic/nas/help_detail', ['id' => $va.id])}">
|
<a class="txrow" href="{:url('/index/topic/nas/help_detail', ['cid' => $vo.id, 'id' => $va.id])}">
|
||||||
<div class="nhlp-point"></div>
|
<div class="nhlp-point"></div>
|
||||||
<span class="nhlpsp">{$va.title}</span>
|
<span class="nhlpsp">{$va.title}</span>
|
||||||
<span class="narhelpgoimg">
|
<span class="narhelpgoimg">
|
||||||
<img src="__IMAGES__/nas-jt.png" />
|
<img src="__IMAGES__/nas-jt.png" />
|
||||||
</span>
|
</span>
|
||||||
</a>
|
</a>
|
||||||
{egt name="index" value="3"}
|
|
||||||
<a class="ckgdbt" href="{:url('/index/topic/nas/help_detail', ['id' => isset($vo.article[0])?$vo.article[0]['id']:0])}">{:lang_i18n('查看更多')} ></a>
|
|
||||||
{/egt}
|
|
||||||
{/volist}
|
{/volist}
|
||||||
|
{if condition="count($vo.article) >= 3"}
|
||||||
|
<a class="ckgdbt" href="{:url('/index/topic/nas/help_detail', ['cid' => $vo.id, 'id' => isset($vo.article[0])?$vo.article[0]['id']:0])}">
|
||||||
|
{:lang_i18n('查看更多')} >
|
||||||
|
</a>
|
||||||
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{/volist}
|
{/volist}
|
||||||
@@ -55,33 +57,37 @@
|
|||||||
<h1 class="lxwmtitle">{:lang_i18n('联系我们')}</h1>
|
<h1 class="lxwmtitle">{:lang_i18n('联系我们')}</h1>
|
||||||
<div class="nhlp-row">
|
<div class="nhlp-row">
|
||||||
<div class="nhlp-row-content">
|
<div class="nhlp-row-content">
|
||||||
{volist name="contacts" id="co" key="idx" offset="0" length="3"}
|
{assign name="fist_section" value=":array_splice($contacts, 0, 3)" /}
|
||||||
<a class="nhlplxwmit nhlplxwmit-w1" {notempty name="co.link"}href="{$co.link}"{/notempty} {eq name="idx" value="3"}style="margin-right: 0;"{/eq}>
|
{volist name="fist_section" id="co"}
|
||||||
|
<a class="nhlplxwmit nhlplxwmit-w1" {notempty name="co.link"}href="{$co.link}"{/notempty}>
|
||||||
<img src="{$co.image}" class="lximg" />
|
<img src="{$co.image}" class="lximg" />
|
||||||
{if condition="!empty($co.desc) && str_contains($co.desc, '<img')"}
|
{notempty name="co.extra_image"}
|
||||||
<img src="{:get_path_from_img_tag($co.desc)}" class="lxewmimg" />
|
<img src="{$co.extra_image}" class="lxewmimg" />
|
||||||
<span class="t1" {:style(['color'=>$co.title_txt_color])}>{$co.title}</span>
|
{/notempty}
|
||||||
{else/}
|
|
||||||
<span class="t1" {:style(['color'=>$co.title_txt_color])}>{$co.title}</span>
|
<span class="t1" {:style(['color'=>$co.title_txt_color])}>{$co.title}</span>
|
||||||
|
{notempty name="co.desc"}
|
||||||
<span class="t2" {:style(['color'=>$co.desc_txt_color])}>{$co.desc|raw}</span>
|
<span class="t2" {:style(['color'=>$co.desc_txt_color])}>{$co.desc|raw}</span>
|
||||||
{/if}
|
{/notempty}
|
||||||
</a>
|
</a>
|
||||||
{/volist}
|
{/volist}
|
||||||
</div>
|
</div>
|
||||||
|
{assign name="second_section" value=":array_chunk($contacts, 4)" /}
|
||||||
|
{volist name="second_section" id="chunk"}
|
||||||
<div class="nhlp-row-content">
|
<div class="nhlp-row-content">
|
||||||
{volist name="contacts" id="co" key="idx" offset="3"}
|
{volist name="chunk" id="co"}
|
||||||
<a class="nhlplxwmit nhlplxwmit-w2" {notempty name="co.link"}href="{$co.link}"{/notempty} {eq name="idx%4" value="0"}style="margin-right: 0;"{/eq}>
|
<a class="nhlplxwmit nhlplxwmit-w2" {notempty name="co.link"}href="{$co.link}"{/notempty}>
|
||||||
<img src="{$co.image}" class="lximg" />
|
<img src="{$co.image}" class="lximg" />
|
||||||
{if condition="!empty($co.desc) && str_contains($co.desc, '<img')"}
|
{notempty name="co.extra_image"}
|
||||||
<img src="{:get_path_from_img_tag($co.desc)}" class="lxewmimg" />
|
<img src="{$co.extra_image}" class="lxewmimg" />
|
||||||
<span class="t1" {:style(['color'=>$co.title_txt_color])}>{$co.title}</span>
|
{/notempty}
|
||||||
{else/}
|
|
||||||
<span class="t1" {:style(['color'=>$co.title_txt_color])}>{$co.title}</span>
|
<span class="t1" {:style(['color'=>$co.title_txt_color])}>{$co.title}</span>
|
||||||
|
{notempty name="co.desc"}
|
||||||
<span class="t2" {:style(['color'=>$co.desc_txt_color])}>{$co.desc|raw}</span>
|
<span class="t2" {:style(['color'=>$co.desc_txt_color])}>{$co.desc|raw}</span>
|
||||||
{/if}
|
{/notempty}
|
||||||
</a>
|
</a>
|
||||||
{/volist}
|
{/volist}
|
||||||
</div>
|
</div>
|
||||||
|
{/volist}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{/notempty}
|
{/notempty}
|
||||||
@@ -130,7 +136,7 @@
|
|||||||
$('#dropdown').hide();
|
$('#dropdown').hide();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
$('.nhlplxwmit:not(:first)').hover(function () {
|
$('.nhlplxwmit').hover(function () {
|
||||||
// 当鼠标移入时,显示.lxewmimg 并隐藏.lximg
|
// 当鼠标移入时,显示.lxewmimg 并隐藏.lximg
|
||||||
var lxe = $(this).find('.lxewmimg');
|
var lxe = $(this).find('.lxewmimg');
|
||||||
var lxi = $(this).find('.lximg');
|
var lxi = $(this).find('.lximg');
|
||||||
|
|||||||
@@ -26,21 +26,30 @@
|
|||||||
<!-- 下拉搜索框 -->
|
<!-- 下拉搜索框 -->
|
||||||
<div class="dropdown" id="dropdown"></div>
|
<div class="dropdown" id="dropdown"></div>
|
||||||
</div>
|
</div>
|
||||||
<!-- 目录-文章详情-锚点定位--->
|
<!-- 目录-文章详情-锚点定位- -->
|
||||||
<div class="nars-help-content">
|
<div class="nars-help-content">
|
||||||
<!--目录 -->
|
<!-- 目录 -->
|
||||||
<div class="nars-hlpdt-ml">
|
<div class="nars-hlpdt-ml">
|
||||||
{notempty name="article_categorys"}
|
{notempty name="article_categorys"}
|
||||||
<div class="nav-tree">
|
<div class="nav-tree">
|
||||||
{volist name="article_categorys" id="ac"}
|
{volist name="article_categorys" id="ac"}
|
||||||
<div class="category">
|
<div class="category">
|
||||||
<div class="category-title">
|
<div class="category-title">
|
||||||
<div class="arrow"><img src="__IMAGES__/nas-jt.png" class="arrow" /></div>
|
<div class="arrow {if condition='$ac.id == $Request.get.cid'}rotate{/if}">
|
||||||
|
<img src="__IMAGES__/nas-jt.png" class="arrow {if condition='$ac.id == $Request.get.cid'}rotate{/if}" />
|
||||||
|
</div>
|
||||||
<span>{$ac.name}</span>
|
<span>{$ac.name}</span>
|
||||||
</div>
|
</div>
|
||||||
<ul class="sub-list">
|
<ul class="sub-list" {if condition='$ac.id == $Request.get.cid'}style="display: block;"{/if}>
|
||||||
{volist name="ac.article" id="ar"}
|
{volist name="ac.article" id="ar"}
|
||||||
<li><a href="{:url('/index/topic/nas/help_detail', ['id' => $ar.id])}" style="padding-top: 6px;">{$ar.title}</a></li>
|
<li>
|
||||||
|
<a
|
||||||
|
href="{:url('/index/topic/nas/help_detail', ['cid' => $ac.id, 'id' => $ar.id])}"
|
||||||
|
{eq name="ar.id" value="$Request.get.id"}class="active"{/eq}
|
||||||
|
>
|
||||||
|
{$ar.title}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
{/volist}
|
{/volist}
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
@@ -98,7 +107,7 @@
|
|||||||
html = '<ul>'
|
html = '<ul>'
|
||||||
$.each(r.data, function (k, v) {
|
$.each(r.data, function (k, v) {
|
||||||
html +=
|
html +=
|
||||||
'<li><a href="{:url(\'/index/topic/nas/help_detail\')}?id=' + v.id + '">' + v.title + '</a></li>'
|
'<li><a href="{:url(\'/index/topic/nas/help_detail\')}?cid=' + v.category_id + '&id=' + v.id + '">' + v.title + '</a></li>'
|
||||||
})
|
})
|
||||||
html += '</ul>'
|
html += '</ul>'
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -113,7 +113,7 @@
|
|||||||
</div>
|
</div>
|
||||||
{/block}
|
{/block}
|
||||||
{block name="script"}
|
{block name="script"}
|
||||||
<script type="text/javascript" src="https://unpkg.com/swiper@9.4.1/swiper-bundle.min.js"></script>
|
<!-- <script type="text/javascript" src="https://unpkg.com/swiper@9.4.1/swiper-bundle.min.js"></script> -->
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
$(document).ready(function () {
|
$(document).ready(function () {
|
||||||
// banner轮播
|
// banner轮播
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ class Product
|
|||||||
*/
|
*/
|
||||||
public function list()
|
public function list()
|
||||||
{
|
{
|
||||||
|
|
||||||
$params = request()->get([
|
$params = request()->get([
|
||||||
'category_id',
|
'category_id',
|
||||||
'language' => 'zh-cn',
|
'language' => 'zh-cn',
|
||||||
@@ -47,7 +48,7 @@ class Product
|
|||||||
->order(['sort' => 'asc', 'id' => 'desc'])
|
->order(['sort' => 'asc', 'id' => 'desc'])
|
||||||
->hidden(['category_id'])
|
->hidden(['category_id'])
|
||||||
->paginate([
|
->paginate([
|
||||||
'list_row' => $params['size'],
|
'list_rows' => $params['size'],
|
||||||
'page' => $params['page']
|
'page' => $params['page']
|
||||||
])
|
])
|
||||||
->each(function($item) {
|
->each(function($item) {
|
||||||
|
|||||||
@@ -33,7 +33,8 @@
|
|||||||
"intervention/image": "^3.10",
|
"intervention/image": "^3.10",
|
||||||
"topthink/think-cors": "^1.0",
|
"topthink/think-cors": "^1.0",
|
||||||
"phpoffice/phpspreadsheet": "^3.8",
|
"phpoffice/phpspreadsheet": "^3.8",
|
||||||
"friendsofsymfony/oauth2-php": "^1.3"
|
"friendsofsymfony/oauth2-php": "^1.3",
|
||||||
|
"mobiledetect/mobiledetectlib": "4.8.09"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"symfony/var-dumper": ">=4.2",
|
"symfony/var-dumper": ">=4.2",
|
||||||
|
|||||||
@@ -12,9 +12,9 @@ return [
|
|||||||
// cookie 启用安全传输
|
// cookie 启用安全传输
|
||||||
'secure' => false,
|
'secure' => false,
|
||||||
// httponly设置
|
// httponly设置
|
||||||
'httponly' => false,
|
'httponly' => true,
|
||||||
// 是否使用 setcookie
|
// 是否使用 setcookie
|
||||||
'setcookie' => true,
|
'setcookie' => true,
|
||||||
// samesite 设置,支持 'strict' 'lax'
|
// samesite 设置,支持 'strict' 'lax'
|
||||||
'samesite' => '',
|
'samesite' => 'strict',
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ class CreateProductTcoCategory extends Migrator
|
|||||||
->addColumn('tco_path', 'string', ['limit' => 120, 'default' => null, 'comment' => '产品目录分类上下级关联路径'])
|
->addColumn('tco_path', 'string', ['limit' => 120, 'default' => null, 'comment' => '产品目录分类上下级关联路径'])
|
||||||
->addColumn('erp_id', 'integer', ['default' => null, 'comment' => '分类在ERP中的ID'])
|
->addColumn('erp_id', 'integer', ['default' => null, 'comment' => '分类在ERP中的ID'])
|
||||||
->addColumn('erp_pid', 'integer', ['default' => null, 'comment' => '分类在ERP中的父级ID'])
|
->addColumn('erp_pid', 'integer', ['default' => null, 'comment' => '分类在ERP中的父级ID'])
|
||||||
|
->addColumn('erp_code', 'string', ['limit' => 64, 'null' => true, 'default' => null, 'comment' => '分类在ERP中的编码'])
|
||||||
->addColumn('erp_path', 'string', ['limit' => 120, 'default' => null, 'comment' => '分类在ERP中的上下级关联路径'])
|
->addColumn('erp_path', 'string', ['limit' => 120, 'default' => null, 'comment' => '分类在ERP中的上下级关联路径'])
|
||||||
->addColumn('disabled', 'boolean', ['null' => false, 'default' => 0, 'comment' => '0为启用, 1为禁用'])
|
->addColumn('disabled', 'boolean', ['null' => false, 'default' => 0, 'comment' => '0为启用, 1为禁用'])
|
||||||
->addColumn('sync_time', 'integer', ['null' => false, 'default' => 0, 'comment' => '同步时间'])
|
->addColumn('sync_time', 'integer', ['null' => false, 'default' => 0, 'comment' => '同步时间'])
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ class CreateArticleCategory extends Migrator
|
|||||||
$table = $this->table('article_category', ['engine' => 'MyISAM', 'comment' => '文章分类表']);
|
$table = $this->table('article_category', ['engine' => 'MyISAM', 'comment' => '文章分类表']);
|
||||||
$table->addColumn('language_id', 'integer', ['signed' => false, 'null' => false, 'comment' => '语言ID'])
|
$table->addColumn('language_id', 'integer', ['signed' => false, 'null' => false, 'comment' => '语言ID'])
|
||||||
->addColumn('pid', 'integer', ['signed' => false, 'null' => false, 'default' => 0, 'comment' => '父级ID'])
|
->addColumn('pid', 'integer', ['signed' => false, 'null' => false, 'default' => 0, 'comment' => '父级ID'])
|
||||||
|
->addColumn('unique_label', 'string', ['limit' => 64, 'null' => false, 'comment' => '唯一标识'])
|
||||||
->addColumn('name', 'string', ['limit' => 64, 'null' => false, 'comment' => '分类名称'])
|
->addColumn('name', 'string', ['limit' => 64, 'null' => false, 'comment' => '分类名称'])
|
||||||
->addColumn('short_name', 'string', ['limit' => 64, 'null' => true, 'default' => null, 'comment' => '分类简称'])
|
->addColumn('short_name', 'string', ['limit' => 64, 'null' => true, 'default' => null, 'comment' => '分类简称'])
|
||||||
->addColumn('icon', 'string', ['limit' => 125, 'default' => null, 'comment' => '图标'])
|
->addColumn('icon', 'string', ['limit' => 125, 'default' => null, 'comment' => '图标'])
|
||||||
@@ -41,6 +42,7 @@ class CreateArticleCategory extends Migrator
|
|||||||
->addColumn('created_at', 'timestamp', ['null' => false, 'default' => 'CURRENT_TIMESTAMP', 'comment' => '新增时间'])
|
->addColumn('created_at', 'timestamp', ['null' => false, 'default' => 'CURRENT_TIMESTAMP', 'comment' => '新增时间'])
|
||||||
->addColumn('updated_at', 'timestamp', ['null' => false, 'default' => 'CURRENT_TIMESTAMP', 'update' => 'CURRENT_TIMESTAMP', 'comment' => '更新时间'])
|
->addColumn('updated_at', 'timestamp', ['null' => false, 'default' => 'CURRENT_TIMESTAMP', 'update' => 'CURRENT_TIMESTAMP', 'comment' => '更新时间'])
|
||||||
->addColumn('deleted_at', 'timestamp', ['null' => true, 'comment' => '删除时间'])
|
->addColumn('deleted_at', 'timestamp', ['null' => true, 'comment' => '删除时间'])
|
||||||
|
->addIndex(['language_id', 'unique_label'], ['name' => 'idx_language_id_unique_label', 'unique' => true])
|
||||||
->create();
|
->create();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ class CreateArticleLeaveMessage extends Migrator
|
|||||||
->addColumn('email', 'string', ['limit' => 128, 'null' => false, 'comment' => '邮箱'])
|
->addColumn('email', 'string', ['limit' => 128, 'null' => false, 'comment' => '邮箱'])
|
||||||
->addColumn('content', 'text', ['null' => false, 'comment' => '内容'])
|
->addColumn('content', 'text', ['null' => false, 'comment' => '内容'])
|
||||||
->addColumn('ip', 'string', ['limit' => 64, 'null' => false, 'comment' => 'IP'])
|
->addColumn('ip', 'string', ['limit' => 64, 'null' => false, 'comment' => 'IP'])
|
||||||
->addColumn('user_agent', 'string', ['limit' => 255, 'null' => false, 'comment' => 'UserAgent'])
|
->addColumn('user_agent', 'string', ['limit' => 1024, 'null' => false, 'comment' => 'UserAgent'])
|
||||||
->addColumn('is_audited', 'boolean', ['null' => false, 'default' => 0, 'comment' => '0待审核,1已审核'])
|
->addColumn('is_audited', 'boolean', ['null' => false, 'default' => 0, 'comment' => '0待审核,1已审核'])
|
||||||
->addColumn('created_at', 'timestamp', ['null' => false, 'default' => 'CURRENT_TIMESTAMP', 'comment' => '创建时间'])
|
->addColumn('created_at', 'timestamp', ['null' => false, 'default' => 'CURRENT_TIMESTAMP', 'comment' => '创建时间'])
|
||||||
->addColumn('deleted_at', 'timestamp', ['null' => true, 'comment' => '删除时间'])
|
->addColumn('deleted_at', 'timestamp', ['null' => true, 'comment' => '删除时间'])
|
||||||
|
|||||||
@@ -28,7 +28,8 @@ class CreateAttachmentCategory extends Migrator
|
|||||||
public function change()
|
public function change()
|
||||||
{
|
{
|
||||||
$table = $this->table('attachment_category', ['engine' => 'MyISAM', 'comment' => '附件分类表']);
|
$table = $this->table('attachment_category', ['engine' => 'MyISAM', 'comment' => '附件分类表']);
|
||||||
$table->addColumn('language_id', 'integer', ['signed' => false , 'null' => false, 'comment' => '语言ID'])
|
$table->addColumn('pid', 'integer', ['null' => true, 'default' => 0, 'comment' => '上级id'])
|
||||||
|
->addColumn('language_id', 'integer', ['signed' => false , 'null' => false, 'comment' => '语言ID'])
|
||||||
->addColumn('name', 'string', ['limit' => 64 , 'null' => false, 'comment' => '分类名称'])
|
->addColumn('name', 'string', ['limit' => 64 , 'null' => false, 'comment' => '分类名称'])
|
||||||
->addColumn('sort', 'integer', ['null' => false, 'default' => 0, 'comment' => '排序'])
|
->addColumn('sort', 'integer', ['null' => false, 'default' => 0, 'comment' => '排序'])
|
||||||
->addColumn('is_show', 'boolean', ['null' => false, 'default' => 1, 'comment' => '是否显示:1是,0否'])
|
->addColumn('is_show', 'boolean', ['null' => false, 'default' => 1, 'comment' => '是否显示:1是,0否'])
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ class CreateLeaveMessage extends Migrator
|
|||||||
->addColumn('email', 'string', ['limit' => 128, 'null' => false, 'comment' => '邮箱'])
|
->addColumn('email', 'string', ['limit' => 128, 'null' => false, 'comment' => '邮箱'])
|
||||||
->addColumn('content', 'text', ['null' => false, 'comment' => '内容'])
|
->addColumn('content', 'text', ['null' => false, 'comment' => '内容'])
|
||||||
->addColumn('ip', 'string', ['limit' => 64, 'null' => false, 'comment' => 'IP'])
|
->addColumn('ip', 'string', ['limit' => 64, 'null' => false, 'comment' => 'IP'])
|
||||||
->addColumn('user_agent', 'string', ['limit' => 255, 'null' => false, 'comment' => 'UserAgent'])
|
->addColumn('user_agent', 'string', ['limit' => 1024, 'null' => false, 'comment' => 'UserAgent'])
|
||||||
->addColumn('created_at', 'timestamp', ['null' => false, 'default' => 'CURRENT_TIMESTAMP', 'comment' => '创建时间'])
|
->addColumn('created_at', 'timestamp', ['null' => false, 'default' => 'CURRENT_TIMESTAMP', 'comment' => '创建时间'])
|
||||||
->create();
|
->create();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ class CreateBulkPurchaseInquiry extends Migrator
|
|||||||
->addColumn('province', 'string', ['limit' => 64, 'null' => true, 'comment' => '省'])
|
->addColumn('province', 'string', ['limit' => 64, 'null' => true, 'comment' => '省'])
|
||||||
->addColumn('city', 'string', ['limit' => 64, 'null' => true, 'comment' => '市'])
|
->addColumn('city', 'string', ['limit' => 64, 'null' => true, 'comment' => '市'])
|
||||||
->addColumn('district', 'string', ['limit' => 64, 'null' => true, 'comment' => '区'])
|
->addColumn('district', 'string', ['limit' => 64, 'null' => true, 'comment' => '区'])
|
||||||
->addColumn('address', 'string', ['limit' => 255, 'null' => true, 'comment' => '地址'])
|
->addColumn('street', 'string', ['limit' => 255, 'null' => true, 'comment' => '街道'])
|
||||||
->addColumn('interested', 'string', ['limit' => 255, 'null' => false, 'comment' => '兴趣(感兴趣的产品品类)'])
|
->addColumn('interested', 'string', ['limit' => 255, 'null' => false, 'comment' => '兴趣(感兴趣的产品品类)'])
|
||||||
->addColumn('url', 'string', ['limit' => 255, 'null' => true, 'comment' => '感兴趣产品所在官网URL'])
|
->addColumn('url', 'string', ['limit' => 255, 'null' => true, 'comment' => '感兴趣产品所在官网URL'])
|
||||||
->addColumn('referer_url', 'string', ['limit' => 255, 'null' => true, 'comment' => '来源URL'])
|
->addColumn('referer_url', 'string', ['limit' => 255, 'null' => true, 'comment' => '来源URL'])
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
use think\migration\Migrator;
|
use think\migration\Migrator;
|
||||||
|
|
||||||
class CreateAgentEntrypriceSizeType extends Migrator
|
class CreateAgentEnterpriseSizeType extends Migrator
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Change Method.
|
* Change Method.
|
||||||
@@ -27,7 +27,7 @@ class CreateAgentEntrypriceSizeType extends Migrator
|
|||||||
*/
|
*/
|
||||||
public function change()
|
public function change()
|
||||||
{
|
{
|
||||||
$table = $this->table('agent_entryprice_size_type', ['engine' => 'MyISAM', 'comment' => '代理商企业规模类型表']);
|
$table = $this->table('agent_enterprise_size_type', ['engine' => 'MyISAM', 'comment' => '代理商企业规模类型表']);
|
||||||
$table->addColumn('language_id', 'integer', ['null' => false, 'default' => 0, 'comment' => '语言ID'])
|
$table->addColumn('language_id', 'integer', ['null' => false, 'default' => 0, 'comment' => '语言ID'])
|
||||||
->addColumn('name', 'string', ['limit' => 64, 'null' => false, 'comment' => '类型名'])
|
->addColumn('name', 'string', ['limit' => 64, 'null' => false, 'comment' => '类型名'])
|
||||||
->addColumn('value', 'string', ['limit' => 64, 'null' => false, 'comment' => '类型值'])
|
->addColumn('value', 'string', ['limit' => 64, 'null' => false, 'comment' => '类型值'])
|
||||||
@@ -31,7 +31,7 @@ class CreateSysUserLoginLog extends Migrator
|
|||||||
$table = $this->table('sys_user_login_log', ['engine' => 'MyISAM', 'comment' => '系统用户登录日志表']);
|
$table = $this->table('sys_user_login_log', ['engine' => 'MyISAM', 'comment' => '系统用户登录日志表']);
|
||||||
$table->addColumn('user_id', 'integer', ['null' => false, 'comment' => '用户ID'])
|
$table->addColumn('user_id', 'integer', ['null' => false, 'comment' => '用户ID'])
|
||||||
->addColumn('ip', 'integer', ['limit' => 11, 'signed' => false, 'null' => false, 'comment' => '登录IP'])
|
->addColumn('ip', 'integer', ['limit' => 11, 'signed' => false, 'null' => false, 'comment' => '登录IP'])
|
||||||
->addColumn('user_agent', 'string', ['limit' => 255, 'null' => true, 'default' => null, 'comment' => '登录设备UA信息'])
|
->addColumn('user_agent', 'string', ['limit' => 1024, 'null' => true, 'default' => null, 'comment' => '登录设备UA信息'])
|
||||||
->addColumn('created_at', 'timestamp', ['null' => false, 'default' => 'CURRENT_TIMESTAMP', 'comment' => '创建时间'])
|
->addColumn('created_at', 'timestamp', ['null' => false, 'default' => 'CURRENT_TIMESTAMP', 'comment' => '创建时间'])
|
||||||
->create();
|
->create();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,14 +31,15 @@ class CreateSysConfig extends Migrator
|
|||||||
$table->addColumn('group_id', 'integer', ['limit' => 11, 'null' => false, 'comment' => '分组ID'])
|
$table->addColumn('group_id', 'integer', ['limit' => 11, 'null' => false, 'comment' => '分组ID'])
|
||||||
->addColumn('title', 'string', ['limit' => 64, 'null' => false, 'comment' => '配置标题'])
|
->addColumn('title', 'string', ['limit' => 64, 'null' => false, 'comment' => '配置标题'])
|
||||||
->addColumn('name', 'string', ['limit' => 64, 'null' => false, 'comment' => '配置名称'])
|
->addColumn('name', 'string', ['limit' => 64, 'null' => false, 'comment' => '配置名称'])
|
||||||
->addColumn('value', 'string', ['limit' => 512, 'null' => true, 'default' => null, 'comment' => '配置值'])
|
->addColumn('value', 'string', ['limit' => 4096, 'null' => true, 'default' => null, 'comment' => '配置值'])
|
||||||
->addColumn('extra', 'string', ['limit' => 512, 'null' => true, 'default' => null, 'comment' => '配置额外信息'])
|
->addColumn('extra', 'string', ['limit' => 4096, 'null' => true, 'default' => null, 'comment' => '配置额外信息'])
|
||||||
->addColumn('type', 'string', ['limit' => 64, 'null' => false, 'comment' => '配置类型: text, textarea, number, select, checkbox, radio, date, time, datetime'])
|
->addColumn('type', 'string', ['limit' => 64, 'null' => false, 'comment' => '配置类型: text, textarea, number, select, checkbox, radio, date, time, datetime'])
|
||||||
->addColumn('sort', 'integer', ['limit' => 11, 'null' => false, 'default' => 0, 'comment' => '排序'])
|
->addColumn('sort', 'integer', ['limit' => 11, 'null' => false, 'default' => 0, 'comment' => '排序'])
|
||||||
->addColumn('remark', 'string', ['limit' => 255, 'null' => true, 'default' => null, 'comment' => '备注'])
|
->addColumn('remark', 'string', ['limit' => 255, 'null' => true, 'default' => null, 'comment' => '备注'])
|
||||||
->addColumn('created_at', 'timestamp', ['null' => false, 'default' => 'CURRENT_TIMESTAMP', 'comment' => '创建时间'])
|
->addColumn('created_at', 'timestamp', ['null' => false, 'default' => 'CURRENT_TIMESTAMP', 'comment' => '创建时间'])
|
||||||
->addColumn('updated_at', 'timestamp', ['null' => false, 'default' => 'CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP', 'comment' => '更新时间'])
|
->addColumn('updated_at', 'timestamp', ['null' => false, 'default' => 'CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP', 'comment' => '更新时间'])
|
||||||
->addIndex(['name'], ['unique' => true, 'name' => 'unique_idx_name'])
|
->addColumn('deleted_at', 'timestamp', ['null' => true, 'default' => null, 'comment' => '删除时间'])
|
||||||
|
->addIndex(['group_id', 'name'], ['unique' => true, 'name' => 'idx_unique_group_id_name'])
|
||||||
->create();
|
->create();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,12 +29,13 @@ class CreateSysConfigGroup extends Migrator
|
|||||||
{
|
{
|
||||||
$table = $this->table('sys_config_group', ['engine' => 'InnoDB', 'comment' => '系统配置分组表']);
|
$table = $this->table('sys_config_group', ['engine' => 'InnoDB', 'comment' => '系统配置分组表']);
|
||||||
$table->addColumn('language_id', 'integer', ['null' => false, 'comment' => '语言ID'])
|
$table->addColumn('language_id', 'integer', ['null' => false, 'comment' => '语言ID'])
|
||||||
->addColumn('unique_label', 'string', ['32' => 64, 'null' => true, 'default' => 'null', 'comment' => '唯一标识'])
|
->addColumn('unique_label', 'string', ['limit' => 64, 'null' => true, 'default' => null, 'comment' => '唯一标识'])
|
||||||
->addColumn('name', 'string', ['limit' => 50, 'default' => '', 'comment' => '分组名称'])
|
->addColumn('name', 'string', ['limit' => 50, 'default' => '', 'comment' => '分组名称'])
|
||||||
->addColumn('sort', 'integer', ['limit' => 11, 'default' => 0, 'comment' => '排序'])
|
->addColumn('sort', 'integer', ['limit' => 11, 'default' => 0, 'comment' => '排序'])
|
||||||
->addColumn('status', 'boolean', ['limit' => 1, 'default' => 1, 'comment' => '状态 -1禁用, 1启用'])
|
->addColumn('status', 'boolean', ['limit' => 1, 'default' => 1, 'comment' => '状态 -1禁用, 1启用'])
|
||||||
->addColumn('created_at', 'timestamp', ['null' => false, 'default' => 'CURRENT_TIMESTAMP', 'comment' => '创建时间'])
|
->addColumn('created_at', 'timestamp', ['null' => false, 'default' => 'CURRENT_TIMESTAMP', 'comment' => '创建时间'])
|
||||||
->addColumn('updated_at', 'timestamp', ['null' => false, 'default' => 'CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP', 'comment' => '更新时间'])
|
->addColumn('updated_at', 'timestamp', ['null' => false, 'default' => 'CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP', 'comment' => '更新时间'])
|
||||||
|
->addColumn('deleted_at', 'timestamp', ['null' => true, 'default' => null, 'comment' => '删除时间'])
|
||||||
->create();
|
->create();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ class CreateSysOperateLog extends Migrator
|
|||||||
->addColumn('status', MysqlAdapter::PHINX_TYPE_SMALL_INTEGER, ['limit' => 5, 'default' => 200, 'comment' => '状态码'])
|
->addColumn('status', MysqlAdapter::PHINX_TYPE_SMALL_INTEGER, ['limit' => 5, 'default' => 200, 'comment' => '状态码'])
|
||||||
->addColumn('message', MysqlAdapter::PHINX_TYPE_TEXT, ['default' => null, 'comment' => '消息'])
|
->addColumn('message', MysqlAdapter::PHINX_TYPE_TEXT, ['default' => null, 'comment' => '消息'])
|
||||||
->addColumn('created_at', 'timestamp', ['null' => false, 'default' => 'CURRENT_TIMESTAMP', 'comment' => '创建时间'])
|
->addColumn('created_at', 'timestamp', ['null' => false, 'default' => 'CURRENT_TIMESTAMP', 'comment' => '创建时间'])
|
||||||
|
->addIndex(['user_id'], ['name' => 'idx_user_id'])
|
||||||
->create();
|
->create();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ class CreateSysNavigation extends Migrator
|
|||||||
$table = $this->table('sys_navigation', ['engine' => 'InnoDB', 'comment' => '系统导航表']);
|
$table = $this->table('sys_navigation', ['engine' => 'InnoDB', 'comment' => '系统导航表']);
|
||||||
$table->addColumn('language_id', 'integer', ['null' => false, 'comment' => '语言ID'])
|
$table->addColumn('language_id', 'integer', ['null' => false, 'comment' => '语言ID'])
|
||||||
->addColumn('at_page', 'string', ['limit' => 64, 'null' => true, 'comment' => '导航所在页面路径'])
|
->addColumn('at_page', 'string', ['limit' => 64, 'null' => true, 'comment' => '导航所在页面路径'])
|
||||||
|
->addColumn('at_platform', 'string', ['limit' => 8, 'null' => false, 'comment' => '所在平台: pc为电脑, mobile为手机'])
|
||||||
->addColumn('unique_label', 'string', ['limit' => 64, 'null' => false, 'comment' => '导航唯一标识'])
|
->addColumn('unique_label', 'string', ['limit' => 64, 'null' => false, 'comment' => '导航唯一标识'])
|
||||||
->addColumn('name', 'string', ['limit' => 64, 'null' => false, 'comment' => '导航名称'])
|
->addColumn('name', 'string', ['limit' => 64, 'null' => false, 'comment' => '导航名称'])
|
||||||
->addColumn('desc', 'string', ['limit' => 255, 'null' => true, 'default' => null, 'comment' => '导航描述'])
|
->addColumn('desc', 'string', ['limit' => 255, 'null' => true, 'default' => null, 'comment' => '导航描述'])
|
||||||
@@ -38,7 +39,7 @@ class CreateSysNavigation extends Migrator
|
|||||||
->addColumn('created_at', 'timestamp', ['null' => false, 'default' => 'CURRENT_TIMESTAMP', 'comment' => '创建时间'])
|
->addColumn('created_at', 'timestamp', ['null' => false, 'default' => 'CURRENT_TIMESTAMP', 'comment' => '创建时间'])
|
||||||
->addColumn('updated_at', 'timestamp', ['null' => false, 'default' => 'CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP', 'comment' => '更新时间'])
|
->addColumn('updated_at', 'timestamp', ['null' => false, 'default' => 'CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP', 'comment' => '更新时间'])
|
||||||
->addColumn('deleted_at', 'timestamp', ['null' => true, 'default' => null, 'comment' => '删除时间'])
|
->addColumn('deleted_at', 'timestamp', ['null' => true, 'default' => null, 'comment' => '删除时间'])
|
||||||
->addIndex(['unique_label'], ['unique' => true])
|
->addIndex(['at_platform', 'language_id', 'unique_label'], ['name' => 'idx_at_platform_language_id_unique_label', 'unique' => true])
|
||||||
->create();
|
->create();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,7 +31,6 @@ class CreateSysBanner extends Migrator
|
|||||||
$table->addColumn('language_id', 'integer', ['null' => false, 'comment' => '语言ID'])
|
$table->addColumn('language_id', 'integer', ['null' => false, 'comment' => '语言ID'])
|
||||||
->addColumn('at_platform', 'string', ['limit' => 8, 'null' => false, 'comment' => '所在平台: pc为电脑, mobile为手机'])
|
->addColumn('at_platform', 'string', ['limit' => 8, 'null' => false, 'comment' => '所在平台: pc为电脑, mobile为手机'])
|
||||||
->addColumn('at_page', 'string', ['limit' => 255, 'null' => true, 'comment' => '所在页面'])
|
->addColumn('at_page', 'string', ['limit' => 255, 'null' => true, 'comment' => '所在页面'])
|
||||||
->addColumn('at_position', 'string', ['limit' => 255, 'null' => true, 'comment' => '所在位置: top为顶部, footer为底部, left为左侧, right为右侧, center为中间'])
|
|
||||||
->addColumn('unique_label', 'string', ['limit' => 64, 'null' => false, 'comment' => 'banner唯一标识'])
|
->addColumn('unique_label', 'string', ['limit' => 64, 'null' => false, 'comment' => 'banner唯一标识'])
|
||||||
->addColumn('name', 'string', ['limit' => 64, 'null' => false, 'comment' => 'banner名称'])
|
->addColumn('name', 'string', ['limit' => 64, 'null' => false, 'comment' => 'banner名称'])
|
||||||
->addColumn('desc', 'string', ['limit' => 255, 'null' => false, 'default' => '', 'comment' => 'banner描述'])
|
->addColumn('desc', 'string', ['limit' => 255, 'null' => false, 'default' => '', 'comment' => 'banner描述'])
|
||||||
@@ -41,7 +40,7 @@ class CreateSysBanner extends Migrator
|
|||||||
->addColumn('created_at', 'timestamp', ['null' => false, 'default' =>'CURRENT_TIMESTAMP', 'comment' => '创建时间'])
|
->addColumn('created_at', 'timestamp', ['null' => false, 'default' =>'CURRENT_TIMESTAMP', 'comment' => '创建时间'])
|
||||||
->addColumn('updated_at', 'timestamp', ['null' => false, 'default' =>'CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP', 'comment' => '更新时间'])
|
->addColumn('updated_at', 'timestamp', ['null' => false, 'default' =>'CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP', 'comment' => '更新时间'])
|
||||||
->addColumn('deleted_at', 'timestamp', ['null' => true, 'default' => null, 'comment' => '删除时间'])
|
->addColumn('deleted_at', 'timestamp', ['null' => true, 'default' => null, 'comment' => '删除时间'])
|
||||||
->addIndex(['unique_label'], ['unique' => true])
|
->addIndex(['at_platform', 'language_id', 'unique_label'], ['name' => 'idx_at_platform_language_id_unique_label', 'unique' => true])
|
||||||
->create();
|
->create();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ class CreateSysBannerItem extends Migrator
|
|||||||
->addColumn('desc_txt_color', 'string', ['limit' => 7, 'null' => false, 'default' => '', 'comment' => '描述文本颜色'])
|
->addColumn('desc_txt_color', 'string', ['limit' => 7, 'null' => false, 'default' => '', 'comment' => '描述文本颜色'])
|
||||||
->addColumn('type', 'string', ['limit' => 16, 'null' => false, 'comment' => '类型: image为图片, video为视频'])
|
->addColumn('type', 'string', ['limit' => 16, 'null' => false, 'comment' => '类型: image为图片, video为视频'])
|
||||||
->addColumn('image', 'string', ['limit' => 255, 'null' => true, 'default' => null, 'comment' => '图片'])
|
->addColumn('image', 'string', ['limit' => 255, 'null' => true, 'default' => null, 'comment' => '图片'])
|
||||||
|
->addColumn('extra_image', 'string', ['limit' => 255, 'null' => true, 'default' => null, 'comment' => '额外的图片'])
|
||||||
->addColumn('video', 'string', ['limit' => 255, 'null' => true, 'default' => null, 'comment' => '视频'])
|
->addColumn('video', 'string', ['limit' => 255, 'null' => true, 'default' => null, 'comment' => '视频'])
|
||||||
->addColumn('link_to', 'string', ['limit' => 64, 'null' => true, 'default' => null, 'comment' => '链接到(类型): article:文章, article_category:文章分类, product:产品, product_category:产品分类, custom:自定义链接'])
|
->addColumn('link_to', 'string', ['limit' => 64, 'null' => true, 'default' => null, 'comment' => '链接到(类型): article:文章, article_category:文章分类, product:产品, product_category:产品分类, custom:自定义链接'])
|
||||||
->addColumn('link', 'string', ['limit' => 255, 'null' => true, 'default' => null, 'comment' => '链接'])
|
->addColumn('link', 'string', ['limit' => 255, 'null' => true, 'default' => null, 'comment' => '链接'])
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ class CreateOauthClient extends Migrator
|
|||||||
*/
|
*/
|
||||||
public function change()
|
public function change()
|
||||||
{
|
{
|
||||||
$table = $this->table('oauth_client', ['engine' => 'MyISAM', 'collation' => 'utf8mb4_general_ci', 'comment' => 'OAuth 客户端表']);
|
$table = $this->table('oauth_client', ['engine' => 'MyISAM', 'collation' => 'utf8mb4_general_ci', 'comment' => 'OAuth2 客户端表']);
|
||||||
$table->addColumn('agent_id', 'integer', ['limit' => 10, 'null' => true, 'comment' => '代理ID'])
|
$table->addColumn('agent_id', 'integer', ['limit' => 10, 'null' => true, 'comment' => '代理ID'])
|
||||||
->addColumn('client_id', 'string', ['limit' => 32, 'comment' => '客户端id'])
|
->addColumn('client_id', 'string', ['limit' => 32, 'comment' => '客户端id'])
|
||||||
->addColumn('client_secret', 'string', ['limit' => 128, 'comment' => '客户端密钥'])
|
->addColumn('client_secret', 'string', ['limit' => 128, 'comment' => '客户端密钥'])
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ class CreateOauthAuthCode extends Migrator
|
|||||||
*/
|
*/
|
||||||
public function change()
|
public function change()
|
||||||
{
|
{
|
||||||
$table = $this->table('oauth_auth_code', ['engine' => 'MyISAM', 'collation' => 'utf8mb4_general_ci', 'comment' => '授权码表']);
|
$table = $this->table('oauth_auth_code', ['engine' => 'MyISAM', 'collation' => 'utf8mb4_general_ci', 'comment' => 'OAuth2 授权码表']);
|
||||||
$table->addColumn('code', 'string', ['limit' => 64, 'null' => false, 'default' => '', 'comment' => '授权码'])
|
$table->addColumn('code', 'string', ['limit' => 64, 'null' => false, 'default' => '', 'comment' => '授权码'])
|
||||||
->addColumn('client_id', 'integer', ['limit' => 11, 'null' => false, 'default' => 0, 'comment' => '客户端ID'])
|
->addColumn('client_id', 'integer', ['limit' => 11, 'null' => false, 'default' => 0, 'comment' => '客户端ID'])
|
||||||
->addColumn('user_id', 'integer', ['limit' => 11, 'null' => false, 'default' => 0, 'comment' => '用户ID'])
|
->addColumn('user_id', 'integer', ['limit' => 11, 'null' => false, 'default' => 0, 'comment' => '用户ID'])
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ class CreateOauthAccessToken extends Migrator
|
|||||||
*/
|
*/
|
||||||
public function change()
|
public function change()
|
||||||
{
|
{
|
||||||
$table = $this->table('oauth_access_token', ['engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => 'OAuth2访问令牌表']);
|
$table = $this->table('oauth_access_token', ['engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => 'OAuth2 访问令牌表']);
|
||||||
$table->addColumn('client_id', 'string', ['limit' => 32, 'default' => '', 'comment' => '客户端ID'])
|
$table->addColumn('client_id', 'string', ['limit' => 32, 'default' => '', 'comment' => '客户端ID'])
|
||||||
->addColumn('user_id', 'integer', ['limit' => 10, 'default' => 0, 'comment' => '用户ID'])
|
->addColumn('user_id', 'integer', ['limit' => 10, 'default' => 0, 'comment' => '用户ID'])
|
||||||
->addColumn('access_token', 'string', ['limit' => 64, 'default' => '', 'comment' => '访问令牌'])
|
->addColumn('access_token', 'string', ['limit' => 64, 'default' => '', 'comment' => '访问令牌'])
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ class CreateOauthRefreshToken extends Migrator
|
|||||||
*/
|
*/
|
||||||
public function change()
|
public function change()
|
||||||
{
|
{
|
||||||
$table = $this->table('oauth_refresh_token', ['engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => 'OAuth2刷新令牌表']);
|
$table = $this->table('oauth_refresh_token', ['engine' => 'InnoDB', 'collation' => 'utf8mb4_general_ci', 'comment' => 'OAuth2 刷新令牌表']);
|
||||||
$table->addColumn('client_id', 'string', ['limit' => 32, 'default' => '', 'comment' => '客户端ID'])
|
$table->addColumn('client_id', 'string', ['limit' => 32, 'default' => '', 'comment' => '客户端ID'])
|
||||||
->addColumn('user_id', 'integer', ['limit' => 10, 'default' => 0, 'comment' => '用户ID'])
|
->addColumn('user_id', 'integer', ['limit' => 10, 'default' => 0, 'comment' => '用户ID'])
|
||||||
->addColumn('refresh_token', 'string', ['limit' => 64, 'default' => '', 'comment' => '刷新令牌'])
|
->addColumn('refresh_token', 'string', ['limit' => 64, 'default' => '', 'comment' => '刷新令牌'])
|
||||||
|
|||||||
34
database/seeds/AgentBusinessTypeInit.php
Normal file
34
database/seeds/AgentBusinessTypeInit.php
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use think\migration\Seeder;
|
||||||
|
|
||||||
|
class AgentBusinessTypeInit extends Seeder
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run Method.
|
||||||
|
*
|
||||||
|
* Write your database seeder using this method.
|
||||||
|
*
|
||||||
|
* More information on writing seeders is available here:
|
||||||
|
* http://docs.phinx.org/en/latest/seeding.html
|
||||||
|
*/
|
||||||
|
public function run(): void
|
||||||
|
{
|
||||||
|
$data = [
|
||||||
|
["id" => 1, "language_id" => 1, "name" => "在线商店", "value" => "Online Store", "desc" => null, "sort" => 0, "created_at" => "2025-03-13 17:50:36"],
|
||||||
|
["id" => 2, "language_id" => 1, "name" => "本地商店", "value" => "Local store", "desc" => null, "sort" => 2, "created_at" => "2025-03-13 17:50:57"],
|
||||||
|
["id" => 3, "language_id" => 1, "name" => "两者都有", "value" => "Both", "desc" => null, "sort" => 0, "created_at" => "2025-03-13 17:51:14"],
|
||||||
|
["id" => 4, "language_id" => 2, "name" => "Online Store", "value" => "Online Store", "desc" => null, "sort" => 0, "created_at" => "2025-03-13 17:50:36"],
|
||||||
|
["id" => 5, "language_id" => 2, "name" => "Local store", "value" => "Local store", "desc" => null, "sort" => 2, "created_at" => "2025-03-13 17:50:57"],
|
||||||
|
["id" => 6, "language_id" => 2, "name" => "Both", "value" => "Both", "desc" => null, "sort" => 0, "created_at" => "2025-03-13 17:51:14"]
|
||||||
|
];
|
||||||
|
|
||||||
|
$table = $this->table('agent_business_type');
|
||||||
|
|
||||||
|
// empty the table
|
||||||
|
$table->truncate();
|
||||||
|
|
||||||
|
// insert data
|
||||||
|
$table->insert($data)->saveData();
|
||||||
|
}
|
||||||
|
}
|
||||||
36
database/seeds/AgentEnterpriseSizeTypeInit.php
Normal file
36
database/seeds/AgentEnterpriseSizeTypeInit.php
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use think\migration\Seeder;
|
||||||
|
|
||||||
|
class AgentEnterpriseSizeTypeInit extends Seeder
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run Method.
|
||||||
|
*
|
||||||
|
* Write your database seeder using this method.
|
||||||
|
*
|
||||||
|
* More information on writing seeders is available here:
|
||||||
|
* http://docs.phinx.org/en/latest/seeding.html
|
||||||
|
*/
|
||||||
|
public function run(): void
|
||||||
|
{
|
||||||
|
$data = [
|
||||||
|
["id" => 1, "language_id" => 1, "name" => "10或更少", "value" => "10 Or Less", "desc" => null, "sort" => 1, "created_at" => "2025-03-13 17:41:06"],
|
||||||
|
["id" => 2, "language_id" => 1, "name" => "10-50", "value" => "1-50", "desc" => null, "sort" => 2, "created_at" => "2025-03-13 17:41:41"],
|
||||||
|
["id" => 3, "language_id" => 1, "name" => "50-199", "value" => "50-199", "desc" => null, "sort" => 3, "created_at" => "2025-03-13 17:41:57"],
|
||||||
|
["id" => 4, "language_id" => 1, "name" => "200或更多", "value" => "200 Or More", "desc" => null, "sort" => 4, "created_at" => "2025-03-13 17:42:20"],
|
||||||
|
["id" => 5, "language_id" => 2, "name" => "10 Or Less", "value" => "10 Or Less", "desc" => null, "sort" => 1, "created_at" => "2025-03-13 17:41:06"],
|
||||||
|
["id" => 6, "language_id" => 2, "name" => "1-50", "value" => "1-50", "desc" => null, "sort" => 2, "created_at" => "2025-03-13 17:41:41"],
|
||||||
|
["id" => 7, "language_id" => 2, "name" => "50-199", "value" => "50-199", "desc" => null, "sort" => 3, "created_at" => "2025-03-13 17:41:57"],
|
||||||
|
["id" => 8, "language_id" => 2, "name" => "200 Or More", "value" => "200 Or More", "desc" => null, "sort" => 4, "created_at" => "2025-03-13 17:42:20"]
|
||||||
|
];
|
||||||
|
|
||||||
|
$table = $this->table('agent_enterprise_size_type');
|
||||||
|
|
||||||
|
// empty the data
|
||||||
|
$table->truncate();
|
||||||
|
|
||||||
|
// insert data
|
||||||
|
$table->insert($data)->saveData();
|
||||||
|
}
|
||||||
|
}
|
||||||
30
database/seeds/ProductAttrInit.php
Normal file
30
database/seeds/ProductAttrInit.php
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use think\migration\Seeder;
|
||||||
|
|
||||||
|
class ProductAttrInit extends Seeder
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run Method.
|
||||||
|
*
|
||||||
|
* Write your database seeder using this method.
|
||||||
|
*
|
||||||
|
* More information on writing seeders is available here:
|
||||||
|
* http://docs.phinx.org/en/latest/seeding.html
|
||||||
|
*/
|
||||||
|
public function run(): void
|
||||||
|
{
|
||||||
|
$data = [
|
||||||
|
['id' => 1, 'language_id' => 1, 'attr_type' => 1, 'attr_name' => '颜色', 'is_system' => 1, 'created_at' => '2025-02-12 10:11:05', 'updated_at' => '2025-03-28 16:17:46', 'deleted_at' => null],
|
||||||
|
['id' => 2, 'language_id' => 2, 'attr_type' => 1, 'attr_name' => 'Color', 'is_system' => 1, 'created_at' => '2025-02-12 10:11:05', 'updated_at' => '2025-05-26 11:08:55', 'deleted_at' => null]
|
||||||
|
];
|
||||||
|
|
||||||
|
$table = $this->table('product_attr');
|
||||||
|
|
||||||
|
// empty the table
|
||||||
|
$table->truncate();
|
||||||
|
|
||||||
|
// insert data
|
||||||
|
$table->insert($data)->saveData();
|
||||||
|
}
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user