This commit is contained in:
迷和油
2025-06-11 17:24:11 +08:00
11 changed files with 994 additions and 629 deletions

View File

@@ -141,6 +141,44 @@ 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) {
$configs_map[$cfg['name']] = $cfg;
}
return $configs_map;
}
return [];
}
// 更新配置 // 更新配置
public function update() public function update()
{ {

View File

@@ -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,6 +228,124 @@ 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)
{ {
@@ -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 [];
}
} }

View File

@@ -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;
/** /**
@@ -44,9 +45,75 @@ class Upload
$image_model = SysImageUploadRecordModel::md5($filemd5)->find(); $image_model = SysImageUploadRecordModel::md5($filemd5)->find();
if (is_null($image_model)) { if (is_null($image_model)) {
$filename = Filesystem::disk('image')->putFile($param['module'], $file); $filename = Filesystem::disk('image')->putFile($param['module'], $file);
// 生成缩略图 // 处理图片
$image_manager = new ImageManager(new \Intervention\Image\Drivers\Imagick\Driver()); $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 +146,90 @@ class Upload
return error('上传失败'); return error('上传失败');
} }
/**
* 获取水印配置
*
* @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');
}
}
/** /**
* 上传视频 * 上传视频
@@ -152,7 +303,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,ttf"
]); ]);
if (!$validate->check(['attachment' => $file])) { if (!$validate->check(['attachment' => $file])) {
return error($validate->getError()); return error($validate->getError());

View File

@@ -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);
} }

View File

@@ -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);
} }

View File

@@ -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',

View File

@@ -23,7 +23,7 @@ class SysBannerItemValidate extends Validate
'type' => 'in:image,video', 'type' => 'in:image,video',
'image' => 'max:255', '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'
@@ -50,7 +50,7 @@ class SysBannerItemValidate extends Validate
'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'

View File

@@ -111,7 +111,9 @@ 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'])->enabled(true); $query->withoutField(['sort', 'created_at', 'updated_at', 'deleted_at'])
->order(['sort' => 'asc', 'id' => 'desc'])
->enabled(true);
}]) }])
->atPlatform(request()->from) ->atPlatform(request()->from)
->uniqueLabel([ ->uniqueLabel([
@@ -150,7 +152,9 @@ 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'])->enabled(true); $query->withoutField(['sort', 'created_at', 'updated_at', 'deleted_at'])
->order(['sort' => 'asc', 'id' => 'desc'])
->enabled(true);
}]) }])
->atPlatform(request()->from) ->atPlatform(request()->from)
->uniqueLabel([ ->uniqueLabel([
@@ -189,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',
@@ -205,7 +211,9 @@ 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'])->enabled(true); $query->withoutField(['sort', 'created_at', 'updated_at', 'deleted_at'])
->order(['sort' => 'asc', 'id' => 'desc'])
->enabled(true);
}]) }])
->atPlatform(request()->from) ->atPlatform(request()->from)
->uniqueLabel(['BANNER_6819754be2dc6']) ->uniqueLabel(['BANNER_6819754be2dc6'])
@@ -238,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',
@@ -261,6 +269,25 @@ 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',
'title' 'title'
@@ -269,6 +296,7 @@ class TopicNas extends Common
'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());
@@ -282,7 +310,9 @@ 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'])->enabled(true); $query->withoutField(['sort', 'created_at', 'updated_at', 'deleted_at'])
->order(['sort' => 'asc', 'id' => 'desc'])
->enabled(true);
}]) }])
->atPlatform(request()->from) ->atPlatform(request()->from)
->uniqueLabel([ ->uniqueLabel([

View File

@@ -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>

View File

@@ -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,13 +102,7 @@
{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>
@@ -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;
// 计算分页点间距 // 计算分页点间距

View File

@@ -86,11 +86,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 +124,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 +152,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 () {