1 Commits

Author SHA1 Message Date
a3da3c3ae4 refactor: 七牛云上传 2025-07-25 17:35:43 +08:00
241 changed files with 1087 additions and 17445 deletions

View File

@@ -26,13 +26,6 @@ TTL=3600
REFRESH_TTL=20160
SECRET=b43e6276644ed60e65c50d1b324ba10b
# 七牛云存储配置
[QINIU_CLOUD]
BUCKET = orico-official-website
BASE_URL = //ow.static.f2b211.com
ACCESS_KEY = dOsTum4a5qvhPTBbZRPX0pIOU7PZWRX7htKjztms
SECRET_KEY = KFxsGbnErkALFfeGdMa8QWTdodJbamMX0iznLe-q
# 后台不需要登录的接口
[ADMIN_AUTH]
WHITE_LIST[] = v1/user/login

4
.gitattributes vendored
View File

@@ -1,10 +1,12 @@
*.eot filter=lfs diff=lfs merge=lfs -text
*.ttf filter=lfs diff=lfs merge=lfs -text
*.woff filter=lfs diff=lfs merge=lfs -text
*.woff2 filter=lfs diff=lfs merge=lfs -text
*.svg filter=lfs diff=lfs merge=lfs -text
*.tff filter=lfs diff=lfs merge=lfs -text
*.zip filter=lfs diff=lfs merge=lfs -text
*.rar filter=lfs diff=lfs merge=lfs -text
*.pdf filter=lfs diff=lfs merge=lfs -text
*.gz filter=lfs diff=lfs merge=lfs -text
*.gzip filter=lfs diff=lfs merge=lfs -text
*.ttf filter=lfs diff=lfs merge=lfs -text
*.otf filter=lfs diff=lfs merge=lfs -text

View File

@@ -1,26 +0,0 @@
name: Gitea Actions Official-website
run-name: Deploy to ${{ inputs.deploy_target }} by @${{ gitea.actor }}
on:
push:
branches:
- dev
jobs:
deploy-dev:
runs-on: ubuntu-latest
steps:
- name: Setup SSH
run: |
mkdir -p ~/.ssh
echo "${{ secrets.SERVER_SSH_KEY }}" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
ssh-keyscan -H ${{ secrets.SERVER_HOST }} >> ~/.ssh/known_hosts
- name: Deploy application
run: |
ssh ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }} << 'EOF'
set -e
cd /www/wwwroot/dev.ow.f2b211.com
# 拉取最新代码
git pull --rebase
EOF

14
.gitignore vendored
View File

@@ -7,22 +7,10 @@ Thumbs.db
.env.dev
.env.local
.env.prod
.htaccess
.user.ini
/404.html
/index.html
public/dist*
public/opendoc
public/logo.png
public/.well-known
/.idea
/.vscode
/.zed
/vendor
/.settings
/.buildpath
/.project
CLAUDE.md
/skills
/.project

View File

@@ -1,24 +0,0 @@
// Folder-specific settings
//
// For a full list of overridable settings, and general information on folder-specific settings,
// see the documentation: https://zed.dev/docs/configuring-zed#settings-files
{
"languages": {
"PHP": {
"language_servers": ["intelephense","!phpactor"]
}
},
"lsp": {
"intelephense": {
"initialization_options": {
"stubs": [
"wordpress",
"laravel",
"symfony",
"codeigniter",
"thinkphp"
]
}
}
}
}

View File

@@ -99,20 +99,18 @@ class ReceiveProductSync
}
$category = ProductCategoryModel::language($lang_id)->tcoId($tco_category['id'])->find();
if (!empty($category)) {
$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()) {
throw new \Exception('产品分类更新失败');
$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('产品分类更新失败');
}
}
@@ -201,16 +199,15 @@ class ReceiveProductSync
throw new \Exception('产品创建失败');
}
}
// 注释更新同步防止tco同步修改官网手动调整数据
// 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->status = Operate_Of_ReceiveSync::Disable == $data['operate'] ? -1 : 1;
// if (!$product->save()) {
// 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->status = Operate_Of_ReceiveSync::Disable == $data['operate'] ? -1 : 1;
if (!$product->save()) {
throw new \Exception('产品更新失败');
}
}
} catch (\Throwable $th) {
return error(sprintf('%s %s:%d', $th->getMessage(), $th->getFile(), $th->getLine()));
}

View File

@@ -228,7 +228,7 @@ class Article
private function getExportArticleData()
{
$server = request()->server();
$image_host = $server['REQUEST_SCHEME'] . "://" . $server['SERVER_NAME'] . '/';
$image_host = $server['REQUEST_SCHEME'] . "://" . $server['SERVER_NAME'] . config('filesystem.disks.public.url') . '/';
$param = request()->param(['title', 'category_id', 'release_time']);
$data = ArticleModel::field([
'*',
@@ -253,7 +253,7 @@ class Article
])
->bindAttr('category', ['category_name' => 'name'])
->each(function ($item) use($image_host) {
$item->image = !empty($item->image) ? url_join($image_host, $item->image) : '';
$item->image = !empty($item->image) ? $image_host . $item->image : '';
return $item;
});

View File

@@ -91,6 +91,7 @@ class Banner
$banner = SysBannerModel::withoutField([
'at_page',
'unique_label',
'language_id',
'created_at',
'updated_at',
@@ -141,11 +142,10 @@ class Banner
'name',
'desc',
'recommend',
'unique_label',
'at_platform' => 'pc',
'status' => 1
]);
$validate = new SysBannerValidate;
if (!$validate->scene('edit')->check(array_merge($put, ['id' => $id]))) {
return error($validate->getError());

View File

@@ -101,8 +101,6 @@ class BannerItem
'rel_prod_cate_id',
'title',
'title_txt_color',
'short_title',
'short_title_txt_color',
'desc',
'desc_txt_color',
'type',
@@ -158,8 +156,6 @@ class BannerItem
'rel_prod_cate_id',
'title',
'title_txt_color',
'short_title',
'short_title_txt_color',
'desc',
'desc_txt_color',
'type',
@@ -212,7 +208,7 @@ class BannerItem
Log::error(sprintf('%s:%s %s', $th->getFile(), $th->getLine(), $th->getMessage()));
return error('操作失败');
}
return success('操作成功');
}
@@ -244,7 +240,6 @@ class BannerItem
'banner_name' => '分类名称',
'title' => '横幅名称',
'title_txt_color' => '横幅名称字体颜色',
'short_title' => '横幅简称',
'desc' => '描述',
'desc_txt_color' => '描述字体颜色',
'type' => '前台显示类型',
@@ -267,16 +262,17 @@ class BannerItem
// 获取导出数据
private function getBannerExportData()
{
$server = request()->server();
$image_host = $server['REQUEST_SCHEME'] . "://" . $server['SERVER_NAME'] . '/';
$param = request()->param(['title', 'banner_id', 'created_at']);
$param = request()->param([
'title',
'banner_id',
'created_at'
]);
return SysBannerItemModel::alias('item')
->field([
'item.id',
'banner.name' => 'banner_name',
'item.title',
'item.title_txt_color',
'item.short_title',
'item.desc',
'item.desc_txt_color',
'item.type',
@@ -315,13 +311,7 @@ class BannerItem
}
})
->order(['item.sort' => 'asc', 'item.id' => 'desc'])
->select()
->each(function($item) use($image_host) {
$item->image = !empty($item->image) ? url_join($image_host, $item->image) : '';
$item->extra_image = !empty($item->extra_image) ? url_join($image_host, $item->extra_image) : '';
$item->video = !empty($item->video) ? url_join($image_host, $item->video) : '';
return $item;
});
->select();
}
// 删除

View File

@@ -67,8 +67,6 @@ class NavigationItem
'id',
'pid',
'name',
'desc',
'image',
'nav_id',
'sort',
'status',
@@ -95,9 +93,7 @@ class NavigationItem
'pid',
'nav_id',
'name',
'desc',
'icon',
'image',
'link_to' => 'custom',
'link',
'sort',
@@ -125,9 +121,7 @@ class NavigationItem
'pid',
'nav_id',
'name',
'desc',
'icon',
'image',
'link_to',
'link',
'sort',
@@ -178,7 +172,7 @@ class NavigationItem
if (empty($nav)) {
return error('请确认要操作对象是否存在');
}
if (!$nav->delete()) {
return error('操作失败');
}

View File

@@ -24,7 +24,7 @@ class Product
'category_id',
'created_at',
'is_show',
'page/d' => 1,
'page/d' => 1,
'size/d' => 10
]);
@@ -83,7 +83,7 @@ class Product
])
->bypk(request()->param('id'))
->find()
?->bindAttr('category', ['category_name'])
->bindAttr('category', ['category_name'])
->hidden(['category']);
if (empty($product)) {
return error('产品不存在');
@@ -108,7 +108,7 @@ class Product
// 获取关联产品
$product->related = ProductRelatedModel::field([
'related_product_id',
'related_product_id',
'sort'
])
->with(['product' => function($query) {
@@ -149,8 +149,8 @@ class Product
'seo_desc'
]);
$put = array_merge(
$put,
['skus' => json_decode($put['skus'], true)],
$put,
['skus' => json_decode($put['skus'], true)],
['related' => json_decode($put['related'], true)],
);
@@ -305,7 +305,7 @@ class Product
return success('操作成功');
}
// 导出
public function export()
{
@@ -346,7 +346,7 @@ class Product
private function getExportProductData()
{
$server = request()->server();
$image_host = $server['REQUEST_SCHEME'] . "://" . $server['SERVER_NAME'] . '/';
$image_host = $server['REQUEST_SCHEME'] . "://" . $server['SERVER_NAME'] . config('filesystem.disks.public.url') . '/';
$param = request()->param([
'name',
'spu',
@@ -360,10 +360,10 @@ class Product
'spu',
'name',
'short_name',
'cover_image',
'CONCAT("' . $image_host . '", `cover_image`)' => 'cover_image',
'desc',
'video_img',
'video_url',
'CONCAT("' . $image_host . '", `video_img`)' => 'video_img',
'CONCAT("' . $image_host . '", `video_url`)' => 'video_url',
'CASE WHEN is_new = 1 THEN "是" ELSE "否" END' => 'is_new',
'CASE WHEN is_hot = 1 THEN "是" ELSE "否" END' => 'is_hot',
'CASE WHEN is_sale = 1 THEN "是" ELSE "否" END' => 'is_sale',
@@ -390,18 +390,7 @@ class Product
->order(['id' => 'asc'])
->select()
->bindAttr('category', ['category_name' => 'name'])
->hidden(['category_id', 'category'])
->each(function($item) use($image_host) {
if (!empty($item["cover_image"])) {
$item["cover_image"] = url_join($image_host, $item["cover_image"]);
}
if (!empty($item["video_img"])) {
$item["video_img"] = url_join($image_host, $item["video_img"]);
}
if (!empty($item["video_url"])) {
$item["video_url"] = url_join($image_host, $item["video_url"]);
}
});
->hidden(['category_id', 'category']);
if (!$products->isEmpty()) {
// 产品参数
@@ -444,7 +433,7 @@ class Product
});
}
}
return $products->toArray();
}
}

View File

@@ -1,203 +0,0 @@
<?php
declare(strict_types=1);
namespace app\admin\controller\v1;
use app\admin\model\v1\ProductCategoryRecommendModel;
use app\admin\validate\v1\ProductCategoryRecommendValidate;
/**
* 产品分类推荐管理控制器
*/
class ProductCategoryRecommend
{
/**
* 分页列表
*/
public function index()
{
$param = request()->get([
'keywords',
'category_name',
'page/d' => 1,
'size/d' => 10
]);
// 查询数据
$data = ProductCategoryRecommendModel::withJoin(['category' => function($query) use ($param) {
if (!empty($param['category_name'])) {
$query->where('category.name', 'like', '%' . $param['category_name'] . '%');
}
}])
->withSearch(['keywords'], ['keywords' => $param['keywords']??null])
->language(request()->lang_id)
->order(['sort' => 'asc', 'id' => 'desc'])
->paginate([
'list_rows' => $param['size'],
'page' => $param['page'],
])
->bindAttr('category', ['category_name' => 'name'])
->hidden(['category', 'language_id', 'updated_at', 'deleted_at'])
?->each(function($item) {
// 列表页面图片输出缩略图
if (!empty($item['image'])) {
$item['image'] = thumb($item['image']);
}
});
return success('获取成功', $data);
}
/**
* 导出Excel
*/
public function export()
{
$schema = [
'id' => 'ID',
'image' => '图片',
'category_name' => '分类名称',
'desc' => '产品介绍',
'link' => '链接地址',
'sort' => '排序',
'disabled' => '状态',
'created_at' => '添加时间'
];
// 获取导出数据
$data = $this->getProductCategoryRecommendData();
// 导出
return xlsx_writer($data, $schema, '产品推荐列表' . date('YmdHis'));
}
// 获取要导出的推荐记录数据
private function getProductCategoryRecommendData()
{
$server = request()->server();
$image_host = $server['REQUEST_SCHEME'] . "://" . $server['SERVER_NAME'] . '/';
$param = request()->get(['keywords']);
// 查询数据
return ProductCategoryRecommendModel::withJoin(['category' => function($query) use ($param) {
if (!empty($param['category_name'])) {
$query->where('category.name', 'like', '%' . $param['category_name'] . '%');
}
}])
->withSearch(['keywords'], ['keywords' => $param['keywords']??null])
->language(request()->lang_id)
->order(['sort' => 'asc', 'id' => 'desc'])
->select()
->bindAttr('category', ['category_name' => 'name'])
->hidden(['category', 'language_id', 'updated_at', 'deleted_at'])
?->each(function($item) use($image_host) {
// 拼接完整图片URL
if (!empty($item['image'])) {
$item['image'] = url_join($image_host, $item['image']);
}
// 状态
$item['disabled'] = $item['disabled'] == 1 ? '禁用' : '启用';
})
->toArray();
}
/**
* 获取详细数据
*/
public function read()
{
$id = request()->param('id/d');
$record = ProductCategoryRecommendModel::bypk($id)
->withoutField(['language_id', 'created_at', 'updated_at', 'deleted_at'])
->find();
if (empty($record)) {
return error('推荐数据不存在');
}
return success('success', $record);
}
/**
* 新增数据
*/
public function save()
{
$post = request()->post([
'category_id',
'title',
'image',
'desc',
'link',
'sort',
'disabled'
]);
$data = array_merge($post, ['language_id' => request()->lang_id]);
// 参数校验
$validate = new ProductCategoryRecommendValidate();
if (!$validate->scene('create')->check($data)) {
return error($validate->getError());
}
// 保存推荐数据
$recommend = ProductCategoryRecommendModel::create($data);
if ($recommend->isEmpty()) {
return error('保存失败');
}
return success('保存成功');
}
/**
* 更新数据
*/
public function update()
{
$id = request()->param('id/d');
$post = request()->post([
'category_id',
'title',
'image',
'desc',
'link',
'sort',
'disabled'
]);
$data = array_merge($post, ['language_id' => request()->lang_id]);
// 参数校验
$validate = new ProductCategoryRecommendValidate();
$check_data = array_merge($data, ['id' => $id]);
if (!$validate->scene('update')->check($check_data)) {
return error($validate->getError());
}
// 更新推荐数据
$recommend = ProductCategoryRecommendModel::bypk($id)->find();
if (empty($recommend)) {
return error('请确认操作对象是否存在');
}
if (!$recommend->save($data)) {
return error('操作失败');
}
return success('操作成功');
}
/**
* 删除
*/
public function delete()
{
$id = request()->param('id/d');
// 删除推荐记录数据
$record = ProductCategoryRecommendModel::bypk($id)->find();
if (empty($record)) {
return error('请确认操作对象是否正确');
}
if (!$record->delete()) {
return error('操作失败');
}
return success('操作成功');
}
}

View File

@@ -16,9 +16,8 @@ class ProductTcoCategory
$param = request()->param(['name']);
$categorys = ProductTcoCategoryModel::field([
'id',
'tco_id',
'tco_pid',
'tco_id' => 'id',
'tco_pid' => 'pid',
'name',
])
->withSearch(['name'], [
@@ -26,10 +25,10 @@ class ProductTcoCategory
])
->language(request()->lang_id)
->enabled()
->order(['tco_id' => 'asc'])
->order(['id' => 'asc'])
->select()
->toArray();
return success('获取成功', array_to_tree($categorys, 0, 'tco_pid', false, true, 'tco_id'));
return success('获取成功', array_to_tree($categorys, 0, 'pid', false));
}
}

View File

@@ -1,201 +0,0 @@
<?php
declare(strict_types=1);
namespace app\admin\controller\v1;
use app\admin\model\v1\SysMallStoreEntranceModel;
use app\admin\validate\v1\SysMallStoreEntranceValidate;
/**
* 系统商城店铺入口管理控制器
*/
class SysMallStoreEntrance
{
/**
* 分页列表
*/
public function index()
{
$param = request()->get([
'name',
'page/d' => 1,
'size/d' => 10
]);
// 查询数据
$data = SysMallStoreEntranceModel::withoutField([
'language_id',
'hover_image',
'updated_at',
'deleted_at'
])
->withSearch(['name'], ['name' => $param['name']??null])
->language(request()->lang_id)
->order(['sort' => 'asc', 'id' => 'desc'])
->paginate([
'list_rows' => $param['size'],
'page' => $param['page'],
])
?->each(function($item) {
// 列表页面图片输出缩略图
if (!empty($item['image'])) {
$item['image'] = thumb($item['image']);
}
});
return success('获取成功', $data);
}
/**
* 获取详情
*/
public function read()
{
$id = request()->param('id/d');
$record = SysMallStoreEntranceModel::bypk($id)
->withoutField(['language_id', 'created_at', 'updated_at', 'deleted_at'])
->find();
if (empty($record)) {
return error('商城店铺入口数据不存在');
}
return success('success', $record);
}
/**
* 新增数据
*/
public function save()
{
$post = request()->post([
'name',
'image',
'hover_image',
'link',
'sort',
'disabled'
]);
$data = array_merge($post, ['language_id' => request()->lang_id]);
// 参数校验
$validate = new SysMallStoreEntranceValidate();
if (!$validate->scene('create')->check($data)) {
return error($validate->getError());
}
// 保存数据
$entrance = SysMallStoreEntranceModel::create($data);
if ($entrance->isEmpty()) {
return error('保存失败');
}
return success('保存成功');
}
/**
* 更新数据
*/
public function update()
{
$id = request()->param('id/d');
$post = request()->post([
'name',
'image',
'hover_image',
'link',
'sort',
'disabled'
]);
$data = array_merge($post, ['language_id' => request()->lang_id]);
// 参数校验
$validate = new SysMallStoreEntranceValidate();
$check_data = array_merge($data, ['id' => $id]);
if (!$validate->scene('update')->check($check_data)) {
return error($validate->getError());
}
// 更新数据
$entrance = SysMallStoreEntranceModel::bypk($id)->find();
if (empty($entrance)) {
return error('请确认操作对象是否存在');
}
if (!$entrance->save($data)) {
return error('操作失败');
}
return success('操作成功');
}
/**
* 删除
*/
public function delete()
{
$id = request()->param('id/d');
// 删除数据
$record = SysMallStoreEntranceModel::bypk($id)->find();
if (empty($record)) {
return error('请确认操作对象是否正确');
}
if (!$record->delete()) {
return error('操作失败');
}
return success('操作成功');
}
/**
* 导出Excel
*/
public function export()
{
$schema = [
'id' => 'ID',
'image' => '图片',
'hover_image' => '悬浮图',
'name' => '名称',
'link' => '链接地址',
'sort' => '排序',
'disabled' => '状态',
'created_at' => '添加时间'
];
// 获取导出数据
$data = $this->getExportData();
// 导出
return xlsx_writer($data, $schema, '系统商城店铺入口列表' . date('YmdHis'));
}
// 获取要导出的数据
private function getExportData()
{
$server = request()->server();
$image_host = $server['REQUEST_SCHEME'] . "://" . $server['SERVER_NAME'] . '/';
$param = request()->get(['name']);
// 查询数据
return SysMallStoreEntranceModel::withoutField([
'language_id',
'updated_at',
'deleted_at'
])
->withSearch(['name'], ['name' => $param['name']??null])
->language(request()->lang_id)
->order(['sort' => 'asc', 'id' => 'desc'])
->select()
?->each(function($item) use($image_host) {
// 拼接完整图片URL
if (!empty($item['image'])) {
$item['image'] = url_join($image_host, $item['image']);
}
if (!empty($item['hover_image'])) {
$item['hover_image'] = url_join($image_host, $item['hover_image']);
}
// 状态转换
$item['disabled'] = $item['disabled'] == 1 ? '禁用' : '启用';
})
->toArray();
}
}

View File

@@ -342,30 +342,6 @@ class System
'url' => (string)url('/index/topic/nas/download')
]
]
],
[
'id' => 8,
'name' => '电力品线专题',
'url' => '',
'children' => [
[
'id' => 81,
'name' => '首页',
'url' => (string)url('/index/topic/power_prodline/index')
],
]
],
[
'id' => 9,
'name' => '笔记本AI PC专题',
'url' => '',
'children' => [
[
'id' => 91,
'name' => '首页',
'url' => (string)url('/index/topic/laptop/index')
],
]
]
];
}

View File

@@ -209,6 +209,9 @@ class Video
]);
$domain = request()->domain();
$image_path = Config::get('filesystem.disks.image.url');
$video_path = Config::get('filesystem.disks.video.url');
return VideoModel::withoutField([
'language_id',
'updated_at',
@@ -227,9 +230,13 @@ class Video
->select()
->bindAttr('category', ['category_name' => 'name'])
->hidden(['category_id', 'category'])
->each(function ($item) use($domain) {
$item->image = !empty($item->image) ? url_join($domain, $item->image) : '';
$item->video = !empty($item->video) ? url_join($domain, $item->video) : '';
->each(function ($item) use($domain, $image_path, $video_path) {
if (!empty($item->image)) {
$item->image = $domain . $image_path . '/' . $item->image;
}
if (!empty($item->video)) {
$item->video = $domain . $video_path . '/' . $item->video;
}
$item->recommend = $item->recommend == 1 ? '是' : '否';
$item->status = $item->status == 1 ? '启用' : '禁用';
return $item;

View File

@@ -32,8 +32,7 @@ class ProductCategoryModel extends ProductCategoryBaseModel
// 所属产品目录分类id查询
public function scopeTcoId($query, $value)
{
// $query->where('related_tco_category', '=', $value);
$query->whereRaw('FIND_IN_SET(:ref_id, related_tco_category)', ['ref_id' => $value]);
$query->where('related_tco_category', '=', $value);
}
/**

View File

@@ -1,47 +0,0 @@
<?php
declare (strict_types = 1);
namespace app\admin\model\v1;
use app\common\model\ProductCategoryRecommendBaseModel;
use think\model\concern\SoftDelete;
/**
* 产品分类推荐模型
* @mixin \think\Model
*/
class ProductCategoryRecommendModel extends ProductCategoryRecommendBaseModel
{
// 启用软件删除
use SoftDelete;
// 软件删除时间字段
protected $deleteTime = 'deleted_at';
// 关联语言
public function language()
{
return $this->belongsTo(\app\index\model\LanguageModel::class, 'language_id', 'id');
}
// 关联产品分类
public function category()
{
return $this->belongsTo(\app\index\model\ProductCategoryModel::class, 'category_id', 'id');
}
// 所属语言范围查询
public function scopeLanguage($query, $language)
{
$query->where($this->getTable() . '.language_id', '=', $language);
}
// 关键词搜索
public function searchKeywordsAttr($query, string|null $keywords)
{
if (is_null($keywords)) {
return;
}
$query->where($this->getTable() . '.title', 'like', "%{$keywords}%")
->whereOr($this->getTable() . '.desc', 'like', "%{$keywords}%");
}
}

View File

@@ -1,61 +0,0 @@
<?php
declare (strict_types = 1);
namespace app\admin\model\v1;
use app\common\model\SysMallStoreEntranceBaseModel;
use think\model\concern\SoftDelete;
/**
* 系统商城店铺入口模型
* @mixin \think\Model
*/
class SysMallStoreEntranceModel extends SysMallStoreEntranceBaseModel
{
// 启用软删除
use SoftDelete;
// 软删除字段
protected $deleteTime = 'deleted_at';
// 关联语言
public function language()
{
return $this->belongsTo(\app\index\model\LanguageModel::class, 'language_id', 'id');
}
// 所属语言范围查询
public function scopeLanguage($query, $language)
{
$query->where($this->getTable() . '.language_id', '=', $language);
}
// 查询启用状态
public function scopeEnabled($query)
{
$query->where('disabled', '=', 0);
}
// 查询禁用状态
public function scopeDisabled($query)
{
$query->where('disabled', '=', 1);
}
// 按名称搜索
public function searchNameAttr($query, $value, $data)
{
if (is_null($value)) {
return;
}
$query->where('name', 'like', "%{$value}%");
}
// 按链接地址搜索
public function searchLinkAttr($query, $value, $data)
{
if (is_null($value)) {
return;
}
$query->where('link_url', 'like', "%{$value}%");
}
}

View File

@@ -87,7 +87,7 @@ Route::group('v1', function () {
// 视频分类列表
Route::get('categorys', 'VideoCategory/list');
// 视频分类
Route::group('category', function () {
// 视频分类分页数据
@@ -311,27 +311,6 @@ Route::group('v1', function () {
// 分类删除
Route::delete('delete/:id', 'ProductCategory/delete');
// 产品分类推荐数据
Route::group('recommend', function () {
// 推荐数据分页列表
Route::get('index', 'ProductCategoryRecommend/index');
// 推荐数据导出
Route::get('export', 'ProductCategoryRecommend/export');
// 推荐数据详情
Route::get('read/:id', 'ProductCategoryRecommend/read');
// 推荐数据新增
Route::post('save', 'ProductCategoryRecommend/save');
// 推荐数据更新
Route::put('update/:id', 'ProductCategoryRecommend/update');
// 推荐数据删除
Route::delete('delete/:id', 'ProductCategoryRecommend/delete');
});
});
// 产品购买链接
@@ -504,7 +483,7 @@ Route::group('v1', function () {
// 分页
Route::get('index', 'Navigation/index');
// 导航详情
Route::get('read/:id', 'Navigation/read');
@@ -595,29 +574,6 @@ Route::group('v1', function () {
// 反馈管理 - 产品询盘列表
Route::get('product/inquiry/index', 'ProductInquiry/index');
// 系统商城店铺入口
Route::group('mall', function() {
Route::group('store', function() {
// 店铺入口列表分页
Route::get('index', 'SysMallStoreEntrance/index');
// 店铺入口导出
Route::get('export', 'SysMallStoreEntrance/export');
// 店铺入口详情
Route::get('read/:id', 'SysMallStoreEntrance/read');
// 店铺入口新增
Route::post('save', 'SysMallStoreEntrance/save');
// 店铺入口更新
Route::put('update/:id', 'SysMallStoreEntrance/update');
// 店铺入口删除
Route::delete('delete/:id', 'SysMallStoreEntrance/delete');
});
});
// 配置项列表
Route::group('config', function() {
// 配置分组

View File

@@ -20,9 +20,7 @@ class NavigationItemValidate extends Validate
'nav_id' => 'require|integer',
'pid' => 'integer|different:id|checkPidNotBeChildren',
'name' => 'require|max:64',
'desc' => 'max:255',
'icon' => 'max:64',
'image' => 'max:255',
'link_to' => 'require|max:64|in:article,article_category,product,product_category,system_page,custom',
'link' => 'max:255',
'sort' => 'integer',
@@ -46,9 +44,7 @@ class NavigationItemValidate extends Validate
'pid.checkPidNotBeChildren' => '父级ID不能为自身的子导航',
'name.require' => '导航名称不能为空',
'name.max' => '导航名称最多不能超过64个字符',
'desc.max' => '导航名称最多不能超过:rule个字符',
'icon.max' => '图标最多不能超过64个字符',
'image.max' => '图标最多不能超过:rule个字符',
'link_to.require' => '链接类型不能为空',
'link_to.max' => '链接类型最多不能超过64个字符',
'link_to.in' => '链接类型必须是article,article_category,product_category,product,system_page,custom中之一',
@@ -71,7 +67,7 @@ class NavigationItemValidate extends Validate
if (env('DB_VERSION', '5') == '8') {
$children = Db::query(
preg_replace(
'/\s+/u',
'/\s+/u',
' ',
"WITH RECURSIVE tree_by AS (
SELECT a.id, a.pid FROM $table_name a WHERE a.id = {$data['id']}
@@ -84,13 +80,13 @@ class NavigationItemValidate extends Validate
} else {
$children = \think\facade\Db::query("
SELECT t2.id
FROM (
SELECT
FROM (
SELECT
@r AS _id, (SELECT @r := GROUP_CONCAT(id) FROM $table_name WHERE FIND_IN_SET(pid, _id)) AS parent_id
FROM
(SELECT @r := {$data['id']}) vars, $table_name h
WHERE @r <> 0) t1
JOIN $table_name t2
FROM
(SELECT @r := {$data['id']}) vars, $table_name h
WHERE @r <> 0) t1
JOIN $table_name t2
ON FIND_IN_SET(t2.pid, t1._id)
ORDER BY t2.id;
");

View File

@@ -1,63 +0,0 @@
<?php
declare (strict_types = 1);
namespace app\admin\validate\v1;
use think\Validate;
class ProductCategoryRecommendValidate extends Validate
{
/**
* 定义验证规则
* 格式:'字段名' => ['规则1','规则2'...]
*
* @var array
*/
protected $rule = [
'language_id' => 'require|integer',
'category_id' => 'require|integer',
'title' => 'require|max:255',
'image' => 'require|max:255',
'desc' => 'require|max:255',
'link' => 'max:500',
'sort' => 'require|integer',
'disabled' => 'in:0,1'
];
/**
* 定义错误信息
* 格式:'字段名.规则名' => '错误信息'
*
* @var array
*/
protected $message = [
'id.require' => 'ID不能为空',
'id.integer' => 'ID必须是整数',
'language_id.require' => '语言ID不能为空',
'language_id.integer' => '语言ID必须是整数',
'category_id.require' => '分类ID不能为空',
'category_id.integer' => '分类ID必须是整数',
'title.require' => '标题不能为空',
'title.max' => '标题长度不能超过:rule个字符',
'image.require' => '图片不能为空',
'image.max' => '图片长度不能超过:rule个字符',
'desc.require' => '描述不能为空',
'desc.max' => '描述长度不能超过:rule个字符',
'link.max' => '链接长度不能超过:rule个字符',
'sort.require' => '排序不能为空',
'sort.integer' => '排序必须是整数',
'disabled.in' => '禁用状态只能是0或1',
];
// 新增场景
protected function sceneCreate()
{
return $this->remove('id', 'require|integer');
}
// 更新场景
protected function sceneUpdate()
{
return $this->append('id', 'require|integer');
}
}

View File

@@ -23,7 +23,7 @@ class ProductCategoryValidate extends Validate
'name' => 'require|max:64',
'icon' => 'max:125',
'desc' => 'max:255',
'related_tco_category' => 'string|checkRelatedTcoCategory',
'related_tco_category' => 'integer',
'sort' => 'integer',
'level' => 'integer',
'is_show' => 'in:0,1',
@@ -39,26 +39,25 @@ class ProductCategoryValidate extends Validate
* @var array
*/
protected $message = [
'id.require' => 'ID不能为空',
'id.integer' => 'ID必须为整数',
'language_id.require' => '语言ID不能为空',
'language_id.integer' => '语言ID必须为整数',
'unique_id.require' => '唯一标识不能为空',
'pid.different' => '父级ID不能为自身',
'pid.checkPidNotBeChildren' => '父级ID不能为自身的子分类',
'pid.integer' => '父级ID必须为整数',
'name.require' => '名称不能为空',
'name.max' => '名称最多不能超过64个字符',
'icon.max' => '图标最多不能超过125个字符',
'desc.max' => '描述最多不能超过255个字符',
'related_tco_category.string' => '关联TCO分类格式错误',
'related_tco_category.checkRelatedTcoCategory' => '该TCO分类已绑定',
'sort.integer' => '排序格式错误',
'level.integer' => '级别格式错误',
'is_show.in' => '是否显示格式错误',
'seo_title.max' => 'SEO标题最多不能超过255个字符',
'seo_keywords.max' => 'SEO关键字最多不能超过255个字符',
'seo_desc.max' => 'SEO描述最多不能超过255个字符',
'id.require' => 'ID不能为空',
'id.integer' => 'ID必须为整数',
'language_id.require' => '语言ID不能为空',
'language_id.integer' => '语言ID必须为整数',
'unique_id.require' => '唯一标识不能为空',
'pid.different' => '父级ID不能为自身',
'pid.checkPidNotBeChildren' => '父级ID不能为自身的子分类',
'pid.integer' => '父级ID必须为整数',
'name.require' => '名称不能为空',
'name.max' => '名称最多不能超过64个字符',
'icon.max' => '图标最多不能超过125个字符',
'desc.max' => '描述最多不能超过255个字符',
'related_tco_category.integer' => '关联TCO分类格式错误',
'sort.integer' => '排序格式错误',
'level.integer' => '级别格式错误',
'is_show.in' => '是否显示格式错误',
'seo_title.max' => 'SEO标题最多不能超过255个字符',
'seo_keywords.max' => 'SEO关键字最多不能超过255个字符',
'seo_desc.max' => 'SEO描述最多不能超过255个字符',
];
// 验证pid
@@ -85,32 +84,4 @@ class ProductCategoryValidate extends Validate
{
return $this->remove('id', 'require|integer')->remove('pid', 'different|checkPidNotBeChildren');
}
// 验证related_tco_category
protected function checkRelatedTcoCategory($value, $rule, $data = [])
{
if (empty($value)) {
return true;
}
$val = ProductCategoryModel::where(function($query) use($value) {
$arr = explode(",", $value);
foreach ($arr as $v) {
$query->whereFindInSet('related_tco_category', $v, 'OR');
}
})->column('id');
if (!empty($val)) {
$size = count($val);
// 如果存在超过一个,直接验证失败
if ($size > 1) {
return false;
}
// 如果存在一个并存在的id不为自身验证失败考虑更新场景查到自身情况
if ($size == 1 && $val[0] != $data['id']) {
return false;
}
}
return true;
}
}

View File

@@ -5,6 +5,8 @@ namespace app\admin\validate\v1;
use think\Validate;
use function PHPSTORM_META\type;
class ProductValidate extends Validate
{
/**

View File

@@ -18,14 +18,14 @@ class SysBannerItemValidate extends Validate
'banner_id' => 'require|integer|gt:0',
'title' => 'require|max:256',
'title_txt_color' => 'max:7',
'desc' => 'max:2048',
'desc' => 'max:1024',
'desc_txt_color' => 'max:7',
'type' => 'in:image,video',
'image' => 'max:255',
'extra_image' => 'max:255',
'video' => 'max:255',
'link_to' => 'requireIf:type,image|max:64|in:article,article_category,product,product_category,system_page,custom',
'link' => 'max:510',
'link' => 'max:255',
'sort' => 'integer',
'status' => 'in:-1,1'
];
@@ -45,7 +45,7 @@ class SysBannerItemValidate extends Validate
'title.require' => '名称不能为空',
'title.max' => '名称最多不能超过256个字符',
'title_txt_color.max' => '名称字体颜色最多不能超过7个字符',
'desc.max' => '描述最多不能超过2048个字符',
'desc.max' => '描述最多不能超过1024个字符',
'desc_txt_color.max' => '描述字体颜色最多不能超过7个字符',
'type.in' => '显示类型必须是image或video',
'image.max' => '图片地址最多不能超过255个字符',
@@ -54,7 +54,7 @@ class SysBannerItemValidate extends Validate
'link_to.requireIf' => '链接类型不能为空',
'link_to.max' => '链接类型最多不能超过64个字符',
'link_to.in' => '链接类型必须是article,article_category,product,product_category,system_page,custom中之一',
'link.max' => '链接最多不能超过512个字符',
'link.max' => '链接最多不能超过255个字符',
'sort.integer' => '排序值必须是整数',
'status.in' => '状态必须是-1或1'
];

View File

@@ -43,6 +43,7 @@ class SysBannerValidate extends BaseValidate
'at_platform.in' => '显示端口只能是pc或mobile',
'at_page.max' => '页面位置最多255个字符',
'unique_label.max' => '唯一标识最多64个字符',
'unique_label.mustOmit' => '更新时不能有unique_label字段',
'name.require' => '名称不能为空',
'name.max' => '名称最多64个字符',
'desc.max' => '描述最多255个字符',
@@ -60,6 +61,6 @@ class SysBannerValidate extends BaseValidate
// 编辑场景
public function sceneEdit()
{
return $this->remove('language_id', 'require|integer');
return $this->remove('language_id', 'require|integer')->append('unique_label', 'mustOmit');
}
}

View File

@@ -1,60 +0,0 @@
<?php
declare (strict_types = 1);
namespace app\admin\validate\v1;
use think\Validate;
class SysMallStoreEntranceValidate extends Validate
{
/**
* 定义验证规则
* 格式:'字段名' => ['规则1','规则2'...]
*
* @var array
*/
protected $rule = [
'id' => 'require|integer',
'language_id' => 'require|integer',
'name' => 'require|max:255',
'image' => 'require|max:255',
'hover_image' => 'max:255',
'link' => 'max:500',
'sort' => 'require|integer',
'disabled' => 'in:0,1',
];
/**
* 定义错误信息
* 格式:'字段名.规则名' => '错误信息'
*
* @var array
*/
protected $message = [
'id.require' => 'ID不能为空',
'id.integer' => 'ID必须是整数',
'language_id.require' => '语言ID不能为空',
'language_id.integer' => '语言ID必须是整数',
'name.require' => '商城名称不能为空',
'name.max' => '商城名称长度不能超过:rule个字符',
'image.require' => '图片不能为空',
'image.max' => '图片长度不能超过:rule个字符',
'hover_image.max' => '悬浮图长度不能超过:rule个字符',
'link.max' => '链接地址长度不能超过:rule个字符',
'sort.require' => '排序不能为空',
'sort.integer' => '排序必须是整数',
'disabled.in' => '禁用状态只能是0或1',
];
// 新增场景
protected function sceneCreate()
{
return $this->remove('id', 'require|integer');
}
// 更新场景
protected function sceneUpdate()
{
return $this->append('id', 'require|integer');
}
}

View File

@@ -17,7 +17,7 @@ class VideoValidate extends Validate
'id' => 'require|integer',
'language_id' => 'require|integer',
'category_id' => 'require|integer',
'name' => 'require|max:128',
'name' => 'require|max:64',
'desc' => 'max:512',
'image' => 'max:125',
'video' => 'max:125',
@@ -43,7 +43,7 @@ class VideoValidate extends Validate
'category_id.require' => '分类不能为空',
'category_id.integer' => '分类参数类型错误',
'name.require' => '名称不能为空',
'name.max' => '名称不能超过128个字符',
'name.max' => '名称不能超过64个字符',
'desc.max' => '描述不能超过512个字符',
'image.max' => '图片不能超过125个字符',
'video.max' => '视频不能超过125个字符',

View File

@@ -1,42 +0,0 @@
<?php
declare (strict_types = 1);
namespace app\command\OpenApiMgr;
use oauth\OAuthStorage;
use think\console\Command;
use think\console\Input;
use think\console\input\Argument;
use think\console\input\Option;
use think\console\Output;
class AddClient extends Command
{
protected function configure()
{
// 指令配置
$this->setName('OpenApiMgr:AddClient')
->addArgument('salt', Argument::OPTIONAL, "开放API的client_secret密钥的盐值")
->setDescription('开放API的client管理');
}
protected function execute(Input $input, Output $output)
{
$salt = $input->getArgument('salt');
$salt = empty($salt) ? null : trim($salt);
// 指令输出
$oauth = new OAuthStorage($salt);
$client_id = random_str(13, 'all', 0);
$client_secret = random_str(32, 'all', 0);
$ok = $oauth->addClient($client_id, $client_secret, null);
if (!$ok) {
$output->writeln("添加失败");
return;
}
$output->writeln("添加成功:\nClientID: {$client_id}\nClientSecret: {$client_secret}\n");
}
}

View File

@@ -80,7 +80,7 @@ if (!function_exists('array_to_tree')) {
* @param bool $keep_pid 是否保留pid
* @return array
*/
function array_to_tree(array $data, int $pid, string $with = 'pid', int|bool $level = 1, bool $keep_pid = true, $with_ref = 'id')
function array_to_tree(array $data, int $pid, string $with = 'pid', int|bool $level = 1, bool $keep_pid = true)
{
$ret = [];
foreach ($data as $item) {
@@ -93,7 +93,7 @@ if (!function_exists('array_to_tree')) {
if ($keep_pid === false) {
unset($item[$with]);
}
$children = array_to_tree($data, $item[$with_ref], $with, $lv, $keep_pid, $with_ref);
$children = array_to_tree($data, $item['id'], $with, $lv, $keep_pid);
if ($children) {
$item['children'] = $children;
}
@@ -153,13 +153,9 @@ if (!function_exists('get_filesystem_url')) {
* @param string $disk 磁盘配置 key
* @return string
*/
function get_filesystem_url(string|null $url, string $disk): string
function get_filesystem_url(string $url, string $disk): string
{
if (is_null($url)) {
return '';
}
if (\think\helper\Str::startsWith($url, ['http://', 'https://', '//'])) {
if (\think\helper\Str::startsWith($url, ['http://', 'https://'])) {
return $url;
}
if (empty($disk)) {
@@ -175,20 +171,16 @@ if (!function_exists('url_filesystem_detect')) {
* @param string $url 文件地址
* @return string
*/
function url_filesystem_detect(string|null $url): string
function url_filesystem_detect(string $url): string
{
if (is_null($url)) {
return '';
}
$idx = strrpos($url, '.');
if ($idx === false) {
return $url;
}
$disks = [
'public_qiniu' => '_' . base64_encode('public_qiniu'),
'video_qiniu' => '_' . base64_encode('video_qiniu')
'public_qiniu' => '_' . base64_encode('public_qiniu'),
'video_qiniu' => '_' . base64_encode('video_qiniu')
];
foreach ($disks as $disk => $marker) {
if (str_ends_with(mb_substr($url, 0, $idx), $marker)) {
@@ -198,37 +190,4 @@ if (!function_exists('url_filesystem_detect')) {
return $url;
}
}
if (!function_exists('url_join')) {
/**
* 合并URL
* @param string $url 基础URL
* @param string $path 路径
* @param bool $remove_slash 是否移除首尾的斜杠
* @return string
*/
function url_join(string $url, string $path, bool $remove_slash = true): string
{
if (empty($url)) {
return $path;
}
if (empty($path)) {
return $url;
}
if (\think\helper\Str::startsWith($path, ['http://', 'https://', '//'])) {
return $path;
}
if ($remove_slash) {
if (str_ends_with($url, '/') && str_starts_with($path, '/')) {
return $url . substr($path, 1);
}
if (!str_ends_with($url, '/') && !str_starts_with($path, '/')) {
return $url . '/' . $path;
}
}
return $url . $path;
}
}

View File

@@ -1,33 +0,0 @@
<?php
declare (strict_types = 1);
namespace app\common\model;
/**
* 产品分类推荐模型
* @mixin \think\Model
*/
class ProductCategoryRecommendBaseModel extends BaseModel
{
// 表名
protected $name = 'product_category_recommend';
// 主键
protected $pk = 'id';
// 字段信息
protected $schema = [
'id' => 'int',
'language_id' => 'int',
'category_id' => 'int',
'title' => 'string',
'image' => 'string',
'desc' => 'string',
'link' => 'string',
'sort' => 'int',
'disabled' => 'int',
'created_at' => 'datetime',
'updated_at' => 'datetime',
'deleted_at' => 'datetime'
];
}

View File

@@ -17,24 +17,22 @@ class SysBannerItemBaseModel extends BaseModel
// 字段信息
protected $schema = [
'id' => 'int',
'banner_id' => 'int',
'title' => 'string',
'title_txt_color' => 'string',
'short_title' => 'string',
'short_title_txt_color' => 'string',
'desc' => 'string',
'desc_txt_color' => 'string',
'type' => 'string',
'image' => 'string',
'extra_image' => 'string',
'video' => 'string',
'link_to' => 'string',
'link' => 'string',
'sort' => 'int',
'status' => 'int',
'created_at' => 'datetime',
'updated_at' => 'datetime',
'deleted_at' => 'datetime'
'id' => 'int',
'banner_id' => 'int',
'title' => 'string',
'title_txt_color' => 'string',
'desc' => 'string',
'desc_txt_color' => 'string',
'type' => 'string',
'image' => 'string',
'extra_image' => 'string',
'video' => 'string',
'link_to' => 'string',
'link' => 'string',
'sort' => 'int',
'status' => 'int',
'created_at' => 'datetime',
'updated_at' => 'datetime',
'deleted_at' => 'datetime'
];
}

View File

@@ -1,32 +0,0 @@
<?php
declare (strict_types = 1);
namespace app\common\model;
/**
* 系统商城店铺入口模型
* @mixin \think\Model
*/
class SysMallStoreEntranceBaseModel extends BaseModel
{
// 表名
protected $name = 'sys_mall_store_entrance';
// 主键
protected $pk = 'id';
// 字段信息
protected $schema = [
'id' => 'int',
'language_id' => 'int',
'name' => 'string',
'image' => 'string',
'hover_image' => 'string',
'link' => 'string',
'sort' => 'int',
'disabled' => 'int',
'created_at' => 'datetime',
'updated_at' => 'datetime',
'deleted_at' => 'datetime',
];
}

View File

@@ -21,9 +21,7 @@ class SysNavigationItemBaseModel extends BaseModel
'nav_id' => 'int',
'pid' => 'int',
'name' => 'string',
'desc' => 'string',
'icon' => 'string',
'image' => 'string',
'link_to' => 'string',
'link' => 'string',
'sort' => 'int',

View File

@@ -8,7 +8,6 @@ use app\index\model\LanguageModel;
use app\index\model\ProductCategoryModel;
use app\index\model\ProductModel;
use app\index\model\SysConfigModel;
use app\index\model\SysMallStoreEntranceModel;
use app\index\model\SysNavigationItemModel;
use think\facade\Lang;
use think\facade\View;
@@ -39,7 +38,7 @@ abstract class Common extends BaseController
}
// 获取产品分类
$categorys = $this->getProductCategory($this->lang_id, true);
$categorys = $this->getProductCategory($this->lang_id);
// 输出产品分类
View::assign('header_categorys', $categorys);
@@ -48,9 +47,6 @@ abstract class Common extends BaseController
// 输出热销产品
View::assign('header_hot_products', $hot_products);
// 获取商品购买入口
View::assign("header_mall_entrance", $this->getMallStoreEntrance($this->lang_id));
// 输出顶部导航
View::assign('header_navigation', $this->getNavigation('NAV_67f3701f3e831', $this->lang_id));
@@ -82,7 +78,7 @@ abstract class Common extends BaseController
}
// 获取产品分类
protected function getProductCategory($language = 1, $with_recommends = false)
protected function getProductCategory($language = 1)
{
$categorys = ProductCategoryModel::field([
'id',
@@ -91,42 +87,15 @@ abstract class Common extends BaseController
'icon',
'level'
])
->when($with_recommends, function($query) {
$query->with(['recommends' => function($query) {
$query->field(['id', 'category_id', 'title', 'image', 'desc', 'link'])
->order(['sort' => 'asc', 'id' => 'desc']);
}]);
})
->language($language)
->displayed()
->order(['sort' => 'asc', 'id' => 'desc'])
->select()
->hidden(["recommends.category_id"]);
->select();
if ($categorys->isEmpty()) {
return [];
}
return $this->toTreeAndChunk($categorys->toArray(), 0, 1);
}
private function toTreeAndChunk(array $categorys, int $pid, int|bool $level): array
{
$ret = [];
foreach ($categorys as $item) {
if ($item['pid'] == $pid) {
$lv = $level;
if ($level !== false) {
$item['level'] = $level;
$lv = $level + 1;
}
$children = $this->toTreeAndChunk($categorys, $item['id'], $lv);
if (!empty($children)) {
$item['children'] = $item['level'] == 1 ? array_chunk($children, 2) : $children;
}
$ret[] = $item;
}
}
return $ret;
return array_to_tree($categorys->toArray(), 0, 'pid', 1, false);
}
// 获取顶部导航
@@ -195,26 +164,6 @@ abstract class Common extends BaseController
return $languages;
}
// 获取商品购买入口
private function getMallStoreEntrance($language = 1)
{
return SysMallStoreEntranceModel::field([
'id',
'name',
'image',
'hover_image',
'link'
])
->language($language)
->enabled()
->order(['sort' => 'asc', 'id' => 'desc'])
->select()
?->each(function($item) {
$item->image = thumb($item->image);
return $item;
});
}
// 获取系统联系方式配置
protected function getSysConfig($language, $group = [])
{
@@ -261,7 +210,7 @@ abstract class Common extends BaseController
];
}
unset($current);
return $data;
}
}

View File

@@ -1,104 +0,0 @@
<?php
declare (strict_types = 1);
namespace app\index\controller;
use app\index\model\SysBannerModel;
use think\facade\View;
class TopicLaptop extends Common
{
/**
* 专题 - 笔记本电脑首页
*/
public function index()
{
$banners = SysBannerModel::with([
'items' => function ($query) {
$query->withoutField(['sort', 'created_at', 'updated_at', 'deleted_at'])
->order(['sort' => 'asc', 'id' => 'desc'])
->enabled(true);
}
])
->atPlatform(request()->from)
->uniqueLabel([
'BANNER_693a268c8aa5f', // 专题 - 笔记本首页 - 焦点图
'BANNER_693a26b1ad252', // 专题 - 笔记本首页 - 性能介绍
'BANNER_693a27b767c8c', // 专题 - 笔记本首页 - CPU介绍
'BANNER_693a28740b8a7', // 专题 - 笔记本首页 - 显卡介绍
'BANNER_693a28aa8412d', // 专题 - 笔记本首页 - 运行内存介绍
'BANNER_693a29009fa72', // 专题 - 笔记本首页 - 硬盘介绍
'BANNER_693a29263c609', // 专题 - 笔记本首页 - 散热系统介绍
'BANNER_693a2959958bc', // 专题 - 笔记本首页 - 行业App运行介绍
'BANNER_693a298342b38', // 专题 - 笔记本首页 - 柔光屏介绍
'BANNER_693a2ad31fbe8', // 专题 - 笔记本首页 - 色域介绍
'BANNER_693a2b0327ac3', // 专题 - 笔记本首页 - 防眩光介绍
'BANNER_693a2cc70c762', // 专题 - 笔记本首页 - 外形质感介绍
'BANNER_693a2d3113d14', // 专题 - 笔记本首页 - 网卡介绍
'BANNER_693a2d53ac247', // 专题 - 笔记本首页 - 电池续航介绍
'BANNER_693a2d7f5fa21', // 专题 - 笔记本首页 - 接口介绍
'BANNER_693a2f2114eb3', // 专题 - 笔记本首页 - 使用场景焦点图
'BANNER_693a2f92baaa3', // 专题 - 笔记本首页 - 摄像头/麦克风/安全介绍
'BANNER_693a2fad26f55', // 专题 - 笔记本首页 - 系统预装介绍
'BANNER_693a2ff4629bd', // 专题 - 笔记本首页 - 产品检测介绍
'BANNER_693a30e9e4572', // 专题 - 笔记本首页 - 网页脚注
])
->language($this->lang_id)
->enabled(true)
->order(['sort' => 'asc', 'id' => 'desc'])
->select();
$data = [];
if (!$banners->isEmpty()) {
$banners_map = [];
foreach ($banners as $banner) {
$banners_map[$banner->unique_label] = $banner;
}
// 焦点图轮播图
$data['top_focus_images'] = data_get($banners_map, 'BANNER_693a268c8aa5f')?->items->toArray();
// 性能介绍
$data['perf'] = data_get($banners_map, 'BANNER_693a26b1ad252')?->items->toArray();
// CPU介绍
$data['cpu'] = data_get($banners_map, 'BANNER_693a27b767c8c')?->items->toArray();
// 显卡介绍
$data['gpu'] = data_get($banners_map, 'BANNER_693a28740b8a7')?->items->toArray();
// 运行内存介绍
$data['ram'] = data_get($banners_map, 'BANNER_693a28aa8412d')?->items->first()?->toArray();
// 硬盘介绍
$data['hard_drive'] = data_get($banners_map, 'BANNER_693a29009fa72')?->items->toArray();
// 散热系统介绍
$data['cooling_system'] = data_get($banners_map, 'BANNER_693a29263c609')?->items->toArray();
// 行业App运行介绍
$data['apps'] = data_get($banners_map, 'BANNER_693a2959958bc')?->items->first()?->toArray();
// 柔光屏介绍
$data['screen_soft_light'] = data_get($banners_map, 'BANNER_693a298342b38')?->items->toArray();
// 色域介绍
$data['screen_color_gamut'] = data_get($banners_map, 'BANNER_693a2ad31fbe8')?->items->toArray();
// 防眩光介绍
$data['screen_anti_glare'] = data_get($banners_map, 'BANNER_693a2b0327ac3')?->items->toArray();
// 外形质感介绍
$data['exterior_texture'] = data_get($banners_map, 'BANNER_693a2cc70c762')?->items->toArray();
// 网卡介绍
$data['network_card'] = data_get($banners_map, 'BANNER_693a2d3113d14')?->items->toArray();
// 电池续航介绍
$data['battery_life'] = data_get($banners_map, 'BANNER_693a2d53ac247')?->items->toArray();
// 接口介绍
$data['interface'] = data_get($banners_map, 'BANNER_693a2d7f5fa21')?->items->toArray();
// 使用场景焦点图
$data['scene_focus_images'] = data_get($banners_map, 'BANNER_693a2f2114eb3')?->items->toArray();
// 摄像头/麦克风/安全介绍
$data['camare_microphone_security'] = data_get($banners_map, 'BANNER_693a2f92baaa3')?->items->toArray();
// 系统预装介绍
$data['unified_preinstall'] = data_get($banners_map, 'BANNER_693a2fad26f55')?->items->first()?->toArray();
// 产品检测介绍
$data['product_testing'] = data_get($banners_map, 'BANNER_693a2ff4629bd')?->items->toArray();
// 网页脚注
$data['webpage_footnotes'] = data_get($banners_map, 'BANNER_693a30e9e4572')?->items->first()?->toArray();
}
View::assign('data', $data);
return View::fetch('index');
}
}

View File

@@ -192,8 +192,6 @@ class TopicNas extends Common
{
// 获取文章分类及文章数据
$parent = ArticleCategoryModel::uniqueLabel('CATEGORY_681182e0a4529')->language($this->lang_id)->value('id');
$parent_two = ArticleCategoryModel::parent($parent)->language($this->lang_id)->column('id');//二级分类id
array_push($parent_two,$parent);
$article_categorys = ArticleCategoryModel::with(['article' => function($query) {
$query->field(['id', 'title', 'category_id'])
->order(['sort' => 'asc', 'id' => 'desc'])
@@ -201,48 +199,15 @@ class TopicNas extends Common
}])
->field([
'id',
'pid',
'name',
'icon'
])
->language($this->lang_id)
// ->parent($parent)
->parentChild($parent_two)
->parent($parent)
->isShow(true)
->order(['sort' => 'asc', 'id' => 'desc'])
->select();
//查询三级分类
$article_categorys_new = [];
$article_categorys_two = [];
// dump($article_categorys->toArray());exit;
if (!$article_categorys->isEmpty()) {
foreach ($article_categorys->toArray() as $kk=>$vv) {
if ( $parent == $vv['pid'] ) {
array_push($article_categorys_new,$vv);
} else {
$article_categorys_two[$vv['pid']][] = $vv;
}
}
if ( !empty($article_categorys_two) ) {
foreach ($article_categorys_new as &$vvv) {
$articles = $vvv['article'];
if ( isset($article_categorys_two[$vvv['id']]) ) {
foreach ($article_categorys_two[$vvv['id']] as $v) {
foreach ($v['article'] as $av) {
if ( count($articles) < 3 ) {
array_push($articles,$av);
}
}
}
}
$vvv['article'] = $articles;
}
}
}
View::assign('article_categorys', $article_categorys_new);
// View::assign('article_categorys', $article_categorys);
View::assign('article_categorys', $article_categorys);
$contacts = [];
// 获取banner数据
@@ -281,46 +246,20 @@ class TopicNas extends Common
// 获取文章分类及文章数据
$parent = ArticleCategoryModel::uniqueLabel('CATEGORY_681182e0a4529')->language($this->lang_id)->value('id');
$parent_two = ArticleCategoryModel::parent($parent)->language($this->lang_id)->column('id');//二级分类id
array_push($parent_two,$parent);
$article_categorys = ArticleCategoryModel::with(['article' => function ($query) {
$query->field(['id', 'title', 'category_id'])->order(['sort' => 'asc', 'id' => 'desc']);
}])
->field([
'id',
'pid',
'name',
'icon'
])
->language($this->lang_id)
// ->parent($parent)
->parentChild($parent_two)
->parent($parent)
->isShow(true)
->order(['sort' => 'asc', 'id' => 'desc'])
->select();
// dump($article_categorys->toArray());exit;
//查询三级分类
$article_categorys_new = [];
$article_categorys_two = [];
if (!$article_categorys->isEmpty()) {
foreach ($article_categorys->toArray() as $kk=>$vv) {
if ( $parent == $vv['pid'] ) {
$vv['child'] = '';
array_push($article_categorys_new,$vv);
} else {
$article_categorys_two[$vv['pid']][] = $vv;
}
}
if ( !empty($article_categorys_two) ) {
foreach ($article_categorys_new as &$vvv) {
$vvv['child'] = isset($article_categorys_two[$vvv['id']])?$article_categorys_two[$vvv['id']]:'';
}
}
}
// dump($article_categorys_new);exit;
// dump($article_categorys_two);exit;
View::assign('article_categorys', $article_categorys_new);
View::assign('article_categorys', $article_categorys);
return View::fetch('help_detail');
}
@@ -378,18 +317,8 @@ class TopicNas extends Common
->language($this->lang_id)
->where('category_id', 'IN', array_column($categorys, 'id'))
->select();
//查询上级id
$parent_two = ArticleCategoryModel::parentColumn(array_column($categorys, 'id'))->language($this->lang_id)->column('pid','id');//二级分类id
$articles_data = $articles->toArray();
foreach ($articles_data as &$v) {
$v['pid'] = 0;
if ( $parent_two[$v['category_id']] !== $parent ) {
$v['pid'] = $v['category_id'];
$v['category_id'] = $parent_two[$v['category_id']];
}
}
return success('success', $articles_data);
return success('success', $articles->toArray());
}
/**

View File

@@ -1,90 +0,0 @@
<?php
declare(strict_types=1);
namespace app\index\controller;
use app\index\model\SysBannerModel;
use think\facade\View;
use think\Request;
/**
* 专题 - 电力品线控制器
*/
class TopicPowerProdline extends Common
{
/**
* 专题 - 电力品线首页
*/
public function index()
{
$banners = SysBannerModel::with([
'items' => function ($query) {
$query->withoutField(['sort', 'created_at', 'updated_at', 'deleted_at'])
->order(['sort' => 'asc', 'id' => 'desc'])
->enabled(true);
}
])
->atPlatform(request()->from)
->uniqueLabel([
'BANNER_691e729f2428d',
'BANNER_691e732e4ad69',
'BANNER_691e752d2bbe2',
'BANNER_691e75561c4d3',
'BANNER_691e75ec9391c',
'BANNER_691e7616545bf',
'BANNER_691e763fc08f4',
'BANNER_691e765a27eba',
'BANNER_691e76b6af393',
])
->language($this->lang_id)
->enabled(true)
->order(['sort' => 'asc', 'id' => 'desc'])
->select();
$data = [];
if (!$banners->isEmpty()) {
$banners_map = [];
foreach ($banners as $banner) {
$banners_map[$banner->unique_label] = $banner;
}
// 焦点轮播图
$focus_image = data_get($banners_map, 'BANNER_691e729f2428d')?->items->toArray();
if (!empty($focus_image)) $data['focus_image'] = $focus_image;
// 分类
$category = data_get($banners_map, 'BANNER_691e732e4ad69')?->items->toArray();
if (!empty($category)) $data['category'] = $category;
// 为什么选择奥睿科相关数据
$why_choose = data_get($banners_map, 'BANNER_691e752d2bbe2')?->items->toArray();
if (!empty($why_choose)) $data['why_choose'] = $why_choose;
// 差旅充
$travel_charger = data_get($banners_map, 'BANNER_691e75561c4d3')?->items->toArray();
if (!empty($travel_charger)) $data['travel_charger'] = $travel_charger;
// 家居充
$home_charger = data_get($banners_map, 'BANNER_691e75ec9391c')?->items->toArray();
if (!empty($home_charger)) $data['home_charger'] = $home_charger;
// 桌面充
$desktop_charger = data_get($banners_map, 'BANNER_691e7616545bf')?->items->toArray();
if (!empty($desktop_charger)) $data['desktop_charger'] = $desktop_charger;
// 墙充
$wall_charger = data_get($banners_map, 'BANNER_691e763fc08f4')?->items->toArray();
if (!empty($wall_charger)) $data['wall_charger'] = $wall_charger;
// 转换器
$converter = data_get($banners_map, 'BANNER_691e765a27eba')?->items->toArray();
if (!empty($converter)) $data['converter'] = $converter;
// 底部介绍
$footer_info = data_get($banners_map, 'BANNER_691e76b6af393')?->items->toArray();
if (!empty($footer_info)) $data['footer_info'] = $footer_info;
}
View::assign('data', $data);
return View::fetch('index');
}
}

View File

@@ -6,9 +6,6 @@ return [
'产品列表' => 'Products',
'搜索' => 'Search',
'搜索历史' => 'Search History',
'请输入搜索关键词' => 'Please enter a search keyword',
'搜索记录' => 'Search History',
'清空' => 'Clear',
'请择地区' => 'SELECT A REGION',
'产品' => 'Product',
'联系方式' => 'Contact',
@@ -95,9 +92,9 @@ return [
],
'attachment/video' => [
'软件和驱动程序' => 'Software and Drivers',
'您的浏览器不支持 video 标签。' => 'Your browser does not support HTML5 video.',
'您的浏览器不支持 video 标签。' => 'Your browser does not support HTML5 video.',
],
// 联系我们批量购买页面
'contactus/bulkbuy' => [
'批量购买' => 'Bulk Buy',
@@ -222,21 +219,4 @@ return [
'联系我们' => 'Contact US',
'目录' => 'Content'
],
// 笔记本专题 - 首页
'topiclaptop/index' => [
'CineBench R23 多核跑分' => 'Outperforms Ryzen 5 & Intel i5',
'*此跑分为ORICO实验室测定所得请以实际使用为准' => '*Data measured by ORICO Lab. Actual performance may vary.',
'3DMARK Time Spy显卡得分' => 'Handles Office & Gaming with Ease',
'肯辛通锁孔' => 'Kensington <br/> Lock Slot',
'千兆网口' => 'Gigabit <br/> Ethernet',
'USB-A<br/>(5Gbps)' => 'USB-A <br/> (5Gbps)',
'3.5mm<br/>耳麦合一' => '3.5mm <br/> Combo Audio',
'TF口3.0' => 'TF 3.0 <br/> Card Slot',
'全功能<br/>USB-C' => 'All-in-One <br/> USB-C',
"接口大满贯" => "Full-Featured Ports",
"酷睿i5-12450H" => "Core i5-12450H",
"锐龙9 6900HX" => "Ryzen9 6900HX",
"标配多种接口,会议室连接电脑、</br>U盘传输文件、TF卡读取等全都轻松搞定" => "Versatile Ports for Easy Connectivity. Effortlessly</br> link to projectors, U disks, TF cards, and more.",
],
];
];

View File

@@ -5,17 +5,10 @@ return [
'产品列表' => 'Products',
'店铺' => 'Store',
'搜索记录' => 'Search History',
'热销产品' => 'Popular Products',
'产品' => 'Product',
'联系我们' => 'Contact',
// 新导航栏 - 2023-03-31
'搜索' => 'Search',
'搜索产品、分类...' => 'Search products and categories...',
'最近搜索' => 'Recent Searches',
'清空' => 'Clear',
'热销产品' => 'Popular Products',
'购买' => 'Buy',
// 返回文本
'提交成功' => 'success',
'提交失败' => 'fail',
@@ -231,21 +224,4 @@ return [
'联系我们' => 'Contact US',
'目录' => 'Content'
],
// 笔记本专题 - 首页
'topiclaptop/index' => [
'CineBench R23 多核跑分' => 'Outperforms Ryzen 5 & Intel i5',
'*此跑分为ORICO实验室测定所得请以实际使用为准' => '*Data measured by ORICO Lab. Actual performance may vary.',
'3DMARK Time Spy显卡得分' => 'Handles Office & Gaming with Ease',
'肯辛通锁孔' => 'Kensington <br/> Lock Slot',
'千兆网口' => 'Gigabit <br/> Ethernet',
'USB-A<br/>(5Gbps)' => 'USB-A <br/> (5Gbps)',
'3.5mm<br/>耳麦合一' => '3.5mm <br/> Combo Audio',
'TF口3.0' => 'TF 3.0 <br/> Card Slot',
'全功能<br/>USB-C' => 'All-in-One <br/> USB-C',
"接口大满贯" => "Full-Featured Ports",
"酷睿i5-12450H" => "Core i5-12450H",
"锐龙9 6900HX" => "Ryzen9 6900HX",
"标配多种接口会议室连接电脑、U盘传输文件、TF卡读取等全都轻松搞定" => "Versatile Ports for Easy Connectivity. Effortlessly link to pro",
],
];
];

View File

@@ -46,27 +46,6 @@ class ArticleCategoryModel extends ArticleCategoryBaseModel
$query->where('pid', '=', $parent);
}
// 所属上级分类范围查询
public function scopeParentChild($query, $parent)
{
if (is_array($parent)) {
$query->where('pid', 'IN', $parent);
return;
}
$query->where('pid', '=', $parent);
}
// 所属上级分类查询
public function scopeParentColumn($query, $parent)
{
if (is_array($parent)) {
$query->where('id', 'IN', $parent);
return;
}
$query->where('id', '=', $parent);
}
// 所属子分类范围查询
public function scopeChild($query, $id, $merge_self = false)
{

View File

@@ -17,12 +17,6 @@ class ProductCategoryModel extends ProductCategoryBaseModel
// 软件删除时间字段
protected $deleteTime = 'deleted_at';
// 关联产品推荐
public function recommends()
{
return $this->hasMany(ProductCategoryRecommendModel::class, 'category_id', 'id');
}
// 所属语言范围查询
public function scopeLanguage($query, $language)
{

View File

@@ -1,25 +0,0 @@
<?php
declare (strict_types = 1);
namespace app\index\model;
use app\common\model\ProductCategoryRecommendBaseModel;
use think\model\concern\SoftDelete;
/**
* 产品分类推荐模型
* @mixin \think\Model
*/
class ProductCategoryRecommendModel extends ProductCategoryRecommendBaseModel
{
// 启用软件删除
use SoftDelete;
// 软件删除时间字段
protected $deleteTime = 'deleted_at';
// 所属语言范围查询
public function scopeLanguage($query, $language)
{
$query->where($this->getTable() . '.language_id', '=', $language);
}
}

View File

@@ -1,43 +0,0 @@
<?php
declare (strict_types = 1);
namespace app\index\model;
use app\common\model\SysMallStoreEntranceBaseModel;
use think\model\concern\SoftDelete;
/**
* 系统商城店铺入口模型
* @mixin \think\Model
*/
class SysMallStoreEntranceModel extends SysMallStoreEntranceBaseModel
{
// 启用软删除
use SoftDelete;
// 软删除字段
protected $deleteTime = 'deleted_at';
// 关联语言
public function language()
{
return $this->belongsTo(\app\index\model\LanguageModel::class, 'language_id', 'id');
}
// 所属语言范围查询
public function scopeLanguage($query, $language)
{
$query->where($this->getTable() . '.language_id', '=', $language);
}
// 查询启用状态
public function scopeEnabled($query)
{
$query->where('disabled', '=', 0);
}
// 查询禁用状态
public function scopeDisabled($query)
{
$query->where('disabled', '=', 1);
}
}

View File

@@ -105,18 +105,6 @@ Route::group('topic', function () {
// 专题-Nas软件下载页
Route::get('download', 'TopicNas/download');
});
// 专题 - 电力品线
Route::group('power_prodline', function() {
// 专题 - 电力品线首页
Route::get('index', 'TopicPowerProdline/index');
});
// 专题 - 笔记本电脑
Route::group('laptop', function() {
// 专题 - 笔记本电脑首页
Route::get('index', 'TopicLaptop/index');
});
});
// 数据迁移

View File

@@ -14,7 +14,7 @@
<div class="tabs">
{notempty name="video_categorys"}
{volist name="video_categorys" id="va"}
<a href="{:url('attachment/video', ['id' => $va.id])}"><div class="tabit active">{$va.name}</div></a>
<a href="{:url('attachment/index', ['id' => $va.id])}"><div class="tabit active">{$va.name}</div></a>
{/volist}
{/notempty}
</div>

View File

@@ -22,11 +22,7 @@
<a class="href_01">{:lang_i18n('首页')}</a>
{volist name="product_categorys" id="ca"}
<span class="icon-arrow arrow_address"></span>
{eq name="ca.pid" value="0"}
<a class="href_02" href="{:url('product/category', ['id' => $ca.id])}">{$ca.name}</a>
{else /}
<a class="href_02" href="{:url('product/subcategory', ['id' => $ca.id])}">{$ca.name}</a>
{/eq}
{/volist}
</div>
</div>

View File

@@ -29,13 +29,12 @@
{/notempty}
<li>
<h3>{:lang_i18n('联系方式')}</h3>
{if condition="!empty($contact_config)"}
{volist name="contact_config" id="vo"}
{if condition="$vo.type != 'image'"}
<p>{$vo.value}</p>
{/if}
{/volist}
{/if}
{notempty name="contact_config.website_email"}
<p>{$contact_config.website_email.title} {$contact_config.website_email.value}</p>
{/notempty}
{notempty name="contact_config.website_hotline_office_hours"}
<p>{$contact_config.website_hotline_office_hours.title} {$contact_config.website_hotline_office_hours.value}</p>
{/notempty}
</li>
</ul>
</div>

View File

@@ -1,865 +1,161 @@
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: sans-serif
}
a {
text-decoration: none;
}
.mobile-header-box {
display: flex;
justify-content: space-between;
align-items: center;
height: 46px;
padding: 0 17px;
background: #fff;
position: relative;
z-index: 100;
}
.mobile-header-left {
display: flex;
align-items: center;
}
.nav-img,
.nav-search,
.nav-lang,
.nav-img1,
.nav-card {
width: 18px;
height: 18px;
cursor: pointer;
}
.nav-log {
width: 90px;
height: 22px;
margin-left: 14px;
cursor: pointer;
}
.nav-lang {
margin: 0 18px;
cursor: pointer;
}
/* 下拉菜单 */
.nav-dropdown-menu {
width: 100%;
background: #fff;
border-top: 1px solid #eee;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
display: none;
position: absolute;
top: 46px;
left: 0;
z-index: 99;
}
.nav-dropdown-menu.show {
display: block;
}
/* 所有菜单项统一用 div */
.menu-item {
margin: 0 22px;
font-size: 15px;
color: #333;
border-bottom: 1px solid #f5f5f5;
cursor: pointer;
position: relative;
}
.menu-item-box {
display: flex;
justify-content: space-between;
align-items: center;
padding: 16px 0;
}
.menu-item-img {
width: 14px;
height: 14px;
display: block;
}
/* 有子菜单才显示箭头 */
.has-child .menu-item-img {
display: block;
}
/* 无子菜单隐藏箭头 */
.no-child .menu-item-img {
display: none;
}
/* 箭头旋转 */
.has-child.open .menu-item-img {
transform: rotate(180deg);
transition: transform 0.3s ease;
}
.nav-img1 {
display: none;
}
.sub-menu {
display: none;
}
.sub-menu.show {
display: block;
}
.sub-item {
padding: 0 16px;
font-size: 14px;
margin: 16px 0;
}
.sub-item:nth-child(1) {
margin-top: 0;
}
.sub-item a {
color: #686A70;
display: block;
}
.sub-item:last-child {
padding-bottom: 0;
}
.sub-item-card-img {
width: 100%;
height: auto;
aspect-ratio: 358 / 192;
}
.sub-item-card-title {
font-size: 16px;
color: #1D1D1F;
margin-top: 10px;
}
.sub-item-card-name {
font-size: 14px;
color: #686A70;
margin-top: 4px;
margin-bottom: 24px;
}
.no-padding {
padding: 0;
}
/* ====================== 弹窗样式(不遮盖头部) ====================== */
.modal-overlay {
position: fixed;
top: 46px;
left: 0;
width: 100%;
height: calc(100% - 46px);
background: rgba(0, 0, 0, 0.5);
display: none;
justify-content: center;
align-items: flex-start;
z-index: 98;
}
.modal-overlay.show {
display: flex;
}
.modal-content {
width: 90%;
background: #fff;
border-radius: 12px;
padding: 66px 24px 8px 24px;
margin-top: 20px;
position: relative;
text-align: center;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
}
.modal-close {
position: absolute;
top: 24px;
right: 24px;
width: 18px;
height: 18px;
cursor: pointer;
}
/* 写法2使用 flex 布局实现一行2个 */
.modal-items-list {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
}
.modal-item {
width: calc(50% - 16px);
font-size: 16px;
color: #1D1D1F;
cursor: pointer;
text-align: center;
box-sizing: border-box;
display: flex;
flex-direction: column;
align-items: center;
margin-bottom: 32px;
}
.modal-item-img {
width: clamp(48px, 17vw, 128px);
height: auto;
aspect-ratio: 64 / 64;
object-fit: contain;
display: block;
}
.modal-item-title {
margin-top: 10px;
font-size: 16px;
color: #1D1D1F;
}
.modal-item:hover {
background-color: #f5f5f5;
border-radius: 8px;
}
/* 语言弹窗样式 - 列表布局 */
.lang-modal-content {
width: 90%;
background: #fff;
border-radius: 12px;
padding: 68px 24px;
margin-top: 20px;
position: relative;
text-align: center;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
}
.lang-items-list {
display: flex;
flex-direction: column;
}
.lang-item {
font-size: 16px;
color: #1D1D1F;
cursor: pointer;
display: flex;
align-items: center;
}
.lang-item img {
width: 29px;
height: 20px;
margin-right: 16px;
display: block;
}
.lang-item:last-child {
border-bottom: none;
margin-top: 24px;
}
.lang-item:hover {
background-color: #f5f5f5;
border-radius: 8px;
}
/* 搜索弹窗样式 */
.search-modal-content {
width: 90%;
background: #fff;
border-radius: 12px;
padding: 68px 24px;
margin-top: 20px;
position: relative;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
}
.search-input-box {
display: flex;
align-items: center;
border: 1px solid #e0e0e0;
border-radius: 30px;
padding-left: 24px;
padding-right: 13px;
background: #f8f8f8;
}
.search-input-box input {
flex: 1;
border: none;
outline: none;
background: transparent;
font-size: 14px;
padding: 10px 0;
}
.search-input-box input::placeholder {
color: #aaa;
}
.search-input-box .search-clear-btn {
width: 14px;
height: 14px;
cursor: pointer;
opacity: 0.6;
}
.search-input-box .search-clear-btn:hover {
opacity: 1;
}
.search-input-box .search-submit-icon {
width: 18px;
height: 18px;
cursor: pointer;
}
.search-history {
margin-top: 20px;
}
.search-history-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 12px;
}
.search-history-title {
font-size: 14px;
color: #888;
}
.search-history-clear {
font-size: 12px;
color: #999;
cursor: pointer;
}
.search-history-clear:hover {
color: #666;
}
.search-history-list {
display: flex;
flex-direction: column;
}
.search-history-item {
display: flex;
justify-content: space-between;
align-items: center;
padding: 12px 0;
border-bottom: 1px solid #f0f0f0;
cursor: pointer;
}
.search-history-item:hover {
background-color: #f5f5f5;
border-radius: 8px;
padding-left: 8px;
padding-right: 8px;
margin-left: -8px;
margin-right: -8px;
}
.search-history-item span {
font-size: 14px;
color: #333;
}
.search-history-item .delete-icon {
width: 14px;
height: 14px;
cursor: pointer;
opacity: 0.5;
}
.search-history-item .delete-icon:hover {
opacity: 1;
}
.empty-history {
text-align: center;
padding: 40px 0;
font-size: 14px;
color: #aaa;
}
</style>
<header>
<div class="mobile-header-box">
<div class="mobile-header-left">
<img src="__IMAGES__/header/nav.png" class="nav-img">
<img src="__IMAGES__/header/x.png" class="nav-img1">
<a href="#" target="_self" style="display: flex; justify-content: center;">
<img src="__IMAGES__/logo.png" class="nav-log">
</a>
</div>
<div class="mobile-header-right">
<img src="__IMAGES__/header/search.png" class="nav-search">
<img src="__IMAGES__/header/lang.png" class="nav-lang">
<img src="__IMAGES__/header/card.png" class="nav-card">
<header class="oircoEgapp-head">
<div class="headtop">
<a href="/"><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>
<span class="icon-keyword cursor_p top-search-toggle"><i class="icon-search-svg"></i></span>
<span class="mask-up cursor_p top-country-toggle"><i class="icon-lag-svg"></i></span>
</div>
</div>
</div>
<div class="nav-dropdown-menu">
<!-- 产品列表 - 有子菜单 -->
<div class="menu-item has-child">
<div class="menu-item-box">
<span>{:lang_i18n('产品列表')}</span>
<img src="__IMAGES__/header/b.png" class="menu-item-img">
</div>
{if condition="!empty($header_categorys)"}
<div class="sub-menu">
{volist name="header_categorys" id="vo" key="idx"}
<div class="sub-item"><a href="#" target="_self">{$vo.name}</a></div>
{/volist}
</div>
{/if}
<!-- 顶部菜单-->
<div class="top-menu">
<div class="it-ct">
<div class="it-1"><a href="/">{:lang_i18n('首页')}</a></div>
</div>
{if condition="!empty($header_navigation)"}
{volist name="header_navigation" id="nav"}
{empty name='nav.children'}
<div class="menu-item no-child" data-link="{$nav.link}">
{else/}
<div class="menu-item has-child" data-link="{$nav.link}">
{/empty}
<div class="menu-item-box">
<span>{$nav.name}</span>
<img src="__IMAGES__/header/b.png" class="menu-item-img">
</div>
{if condition="!empty($nav.children)"}
<div class="sub-menu">
{volist name="nav.children" id="child"}
<div class="sub-item no-padding">
<a href="{$child.link}" target="{$child.blank==1?'_blank':'_self'}" class="sub-item-card">
<img src="{$child.image}" alt="" class="sub-item-card-img">
<div class="sub-item-card-title">{$child.name}</div>
<div class="sub-item-card-name">{$child.desc}</div>
</a>
</div>
<div class="it-ct">
<div class="it-1">
<div class="it-1-more">{:lang_i18n('产品列表')}<i class="icon-arrow"></i></div>
{notempty name="header_categorys"}
{volist name="header_categorys" id="ca"}
<div class="it-1-2"><a href="{:url('product/category', ['id' => $ca.id])}">{$ca.name}</a></div>
{/volist}
{/notempty}
</div>
</div>
{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>
{/if}
</div>
{/volist}
{/if}
{/notempty}
</div>
<!-- ====================== 购物车弹窗 ====================== -->
<div class="modal-overlay" id="cartModal">
<div class="modal-content">
<img src="__IMAGES__/header/x.png" class="modal-close">
{if condition="!empty($header_mall_entrance)"}
<div class="modal-items-list">
{volist name="header_mall_entrance" id="ma"}
{if condition="!empty($ma.link) && empty($ma.hover_image)"}
<a class="modal-item" href="{$ma.link}" target="_self">
<img src="{$ma.image}" alt="" class="modal-item-img">
<div class="modal-item-title">{$ma.name}</div>
</a>
{else/}
<!--悬浮图-->
<!--<img src="{$ma.hover_image}" alt="" class="modal-item-img">-->
{/if}
{/volist}
<!-- 顶部搜索-->
<div class="top-search">
<div class="marsk-container">
<div class="popup-quick">
<div class="ac-close float_r "><img src="__IMAGES__/close.png"></div>
<div class="search-in">
<form action="{:url('product/search')}" method="get">
<input type="text" name="keywords" placeholder="{:lang_i18n('产品')} USB 2.0...">
<button type="submit" id="search-btnput" class="search-button">{:lang_i18n('搜索')}</button>
</form>
<div class="title-text">
<p><a href="#">{:lang_i18n('搜索历史')}</a></p>
<div id="history"></div>
</div>
</div>
</div>
{/if}
</div>
</div>
<!-- ====================== 语言弹窗 ====================== -->
<div class="modal-overlay" id="langModal">
<div class="lang-modal-content">
<img src="__IMAGES__/header/x.png" class="modal-close">
<div class="lang-items-list">
<!-- 顶部国家选择-->
<div class="top-country">
<div class="mask"></div>
<div class="action-sheet">
<div class="menu-title">
<div class="menu-name">{:lang_i18n('请择地区')}</div>
<div class="close-icon">
<img src="__IMAGES__/close.png">
</div>
</div>
<ul>
{volist name="header_languages" id="la"}
<a class="lang-item" href="{$la.lang_url}" target="_self">
<img src="{$la.lang_icon}" />
<div>{$la.country_en_name} - {$la.lang_en_name}</div>
</a>
<li>
<a href="{$la.lang_url}" target="_blank">
<img src="{$la.lang_icon}">{$la.country_en_name} - {$la.lang_en_name}
</a>
</li>
{/volist}
</div>
</div>
</div>
<!-- ====================== 搜索弹窗 ====================== -->
<div class="modal-overlay" id="searchModal">
<div class="search-modal-content">
<img src="__IMAGES__/header/x.png" class="modal-close">
<div class="search-input-box">
<input type="text" placeholder="{:lang_i18n('请输入搜索关键词')}" id="searchInput">
<img src="__IMAGES__/header/x.png" alt="{:lang_i18n('清除')}" class="search-clear-btn" id="searchClearBtn" style="display: none;">
<span style="width: 1px; color:#d9d9d9;margin: 0 10px;">|</span>
<img src="__IMAGES__/header/search.png" alt="{:lang_i18n('搜索')}" class="search-submit-icon" id="searchSubmit">
</div>
<div class="search-history">
<div class="search-history-header">
<div class="search-history-title">{:lang_i18n('搜索记录')}</div>
<div class="search-history-clear" id="clearAllHistory">{:lang_i18n('清空')}</div>
</div>
<div class="search-history-list" id="searchHistoryList">
<!-- 搜索记录会动态显示在这里 -->
</div>
</div>
</ul>
</div>
</div>
</header>
<script>
document.addEventListener('DOMContentLoaded', function ()
{
const navBtn = document.querySelector('.nav-img');
const navBtn1 = document.querySelector('.nav-img1');
const dropdownMenu = document.querySelector('.nav-dropdown-menu');
// 打开菜单
navBtn.addEventListener('click', function (e)
{
e.stopPropagation();
// 关闭所有弹窗
closeAllModals();
dropdownMenu.classList.add('show');
navBtn.style.display = 'none';
navBtn1.style.display = 'block';
<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');
});
//点击搜索
$('.top-search-toggle').click(function() {
$(".marsk-container").show();
})
$('.ac-close').click(function() {
$(".marsk-container").hide();
})
// 顶部国家选择
$('.top-country-toggle').click(function(){
$(".mask,.action-sheet").show();
})
$('.top-country .close-icon').click(function(){
$(".mask,.action-sheet").hide();
})
// 关闭菜单
navBtn1.addEventListener('click', function (e)
{
e.stopPropagation();
dropdownMenu.classList.remove('show');
navBtn.style.display = 'block';
navBtn1.style.display = 'none';
// 移动端顶部宽度设置和主体内容宽度一致
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();
})
// 处理所有菜单项
document.querySelectorAll('.menu-item').forEach(function (item)
{
const isHasChild = item.classList.contains('has-child');
const subMenu = item.querySelector('.sub-menu');
const box = item.querySelector('.menu-item-box');
if (isHasChild && subMenu) {
box.addEventListener('click', function (e)
{
e.stopPropagation();
subMenu.classList.toggle('show');
item.classList.toggle('open');
});
} else {
const link = item.getAttribute('data-link');
if (link) {
item.addEventListener('click', function (e)
{
e.stopPropagation();
window.location.href = link;
});
}
}
});
// 阻止子菜单链接冒泡
document.querySelectorAll('.sub-item').forEach(function (sub)
{
sub.addEventListener('click', function (e)
{
e.stopPropagation();
});
});
dropdownMenu.addEventListener('click', function (e)
{
e.stopPropagation();
});
navBtn1.style.display = 'none';
navBtn.style.display = 'block';
// 关闭所有弹窗的公共函数
function closeAllModals ()
{
cartModal.classList.remove('show');
langModal.classList.remove('show');
searchModal.classList.remove('show');
if (searchInput) {
searchInput.value = '';
if (searchClearBtn) searchClearBtn.style.display = 'none';
}
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);
}
// ====================== 购物车弹窗交互 ======================
const cardBtn = document.querySelector('.nav-card');
const cartModal = document.getElementById('cartModal');
const cartModalClose = cartModal.querySelector('.modal-close');
cardBtn.addEventListener('click', function (e)
{
e.stopPropagation();
// 关闭下拉菜单和其他弹窗
dropdownMenu.classList.remove('show');
navBtn.style.display = 'block';
navBtn1.style.display = 'none';
closeAllModals();
cartModal.classList.add('show');
});
cartModalClose.addEventListener('click', function ()
{
cartModal.classList.remove('show');
});
cartModal.addEventListener('click', function (e)
{
if (e.target === cartModal) {
cartModal.classList.remove('show');
// 记录搜索关键词
if (keywords) {
if (history_keywords.includes(keywords)) {
history_keywords.splice(history_keywords.indexOf(keywords), 1);
}
});
// ====================== 语言弹窗交互 ======================
const langBtn = document.querySelector('.nav-lang');
const langModal = document.getElementById('langModal');
const langModalClose = langModal.querySelector('.modal-close');
langBtn.addEventListener('click', function (e)
{
e.stopPropagation();
// 关闭下拉菜单和其他弹窗
dropdownMenu.classList.remove('show');
navBtn.style.display = 'block';
navBtn1.style.display = 'none';
closeAllModals();
langModal.classList.add('show');
});
langModalClose.addEventListener('click', function ()
{
langModal.classList.remove('show');
});
langModal.addEventListener('click', function (e)
{
if (e.target === langModal) {
langModal.classList.remove('show');
history_keywords.unshift(keywords);
if (history_keywords.length > 3) {
history_keywords.pop();
}
});
document.querySelectorAll('.lang-item').forEach(function (item)
{
item.addEventListener('click', function (e)
{
e.stopPropagation();
console.log('选择了语言:', this.innerText);
langModal.classList.remove('show');
});
});
// ====================== 搜索记录功能 ======================
// 获取搜索记录
function getSearchHistory ()
{
const history = localStorage.getItem('searchHistory');
return history ? JSON.parse(history) : [];
localStorage.setItem('header_search_keywords', JSON.stringify(history_keywords));
}
// 保存搜索记录
function saveSearchHistory (history)
{
localStorage.setItem('searchHistory', JSON.stringify(history));
}
// 添加搜索记录
function addSearchHistory (keyword)
{
if (!keyword || !keyword.trim()) return;
keyword = keyword.trim();
let history = getSearchHistory();
history = history.filter(item => item !== keyword);
history.unshift(keyword);
if (history.length > 10) {
history = history.slice(0, 10);
}
saveSearchHistory(history);
renderSearchHistory();
}
// 删除单条搜索记录
function deleteSearchHistoryItem (keyword)
{
let history = getSearchHistory();
history = history.filter(item => item !== keyword);
saveSearchHistory(history);
renderSearchHistory();
}
// 清空所有搜索记录
function clearAllSearchHistory ()
{
saveSearchHistory([]);
renderSearchHistory();
}
// 渲染搜索记录列表
function renderSearchHistory ()
{
const historyList = document.getElementById('searchHistoryList');
const history = getSearchHistory();
if (!historyList) return;
if (history.length === 0) {
historyList.innerHTML = '<div class="empty-history">暂无搜索记录</div>';
return;
}
historyList.innerHTML = '';
history.forEach(function (keyword)
{
const itemDiv = document.createElement('div');
itemDiv.className = 'search-history-item';
itemDiv.innerHTML = `
<span>${escapeHtml(keyword)}</span>
<img src="__IMAGES__/header/x.png" class="delete-icon" data-keyword="${escapeHtml(keyword)}">
`;
itemDiv.addEventListener('click', function (e)
{
if (e.target.classList && e.target.classList.contains('delete-icon')) {
e.stopPropagation();
deleteSearchHistoryItem(keyword);
} else {
e.stopPropagation();
searchInput.value = keyword;
doSearch(keyword);
}
});
historyList.appendChild(itemDiv);
});
}
// 简单的防XSS
function escapeHtml (str)
{
return str.replace(/[&<>]/g, function (m)
{
if (m === '&') return '&amp;';
if (m === '<') return '&lt;';
if (m === '>') return '&gt;';
return m;
});
}
// ====================== 搜索弹窗交互 ======================
const searchBtn = document.querySelector('.nav-search');
const searchModal = document.getElementById('searchModal');
const searchModalClose = searchModal.querySelector('.modal-close');
const searchInput = document.getElementById('searchInput');
const searchSubmit = document.getElementById('searchSubmit');
const searchClearBtn = document.getElementById('searchClearBtn');
const clearAllHistoryBtn = document.getElementById('clearAllHistory');
searchInput.addEventListener('input', function (e)
{
if (searchInput.value.length > 0) {
searchClearBtn.style.display = 'block';
} else {
searchClearBtn.style.display = 'none';
}
// 回显搜索历史
history_keywords.forEach(function(item) {
$('#history').append(
$('<a>')
.css({
'margin-right': '10px'
})
.attr('href', '{:url("product/search")}?keywords=' + item)
.text(item)
);
});
searchClearBtn.addEventListener('click', function (e)
{
e.stopPropagation();
searchInput.value = '';
searchClearBtn.style.display = 'none';
searchInput.focus();
});
if (clearAllHistoryBtn) {
clearAllHistoryBtn.addEventListener('click', function (e)
{
e.stopPropagation();
clearAllSearchHistory();
});
}
searchBtn.addEventListener('click', function (e)
{
e.stopPropagation();
// 关闭下拉菜单和其他弹窗
dropdownMenu.classList.remove('show');
navBtn.style.display = 'block';
navBtn1.style.display = 'none';
closeAllModals();
renderSearchHistory();
searchModal.classList.add('show');
setTimeout(() =>
{
searchInput.focus();
}, 100);
});
searchModalClose.addEventListener('click', function ()
{
searchModal.classList.remove('show');
searchInput.value = '';
searchClearBtn.style.display = 'none';
});
searchModal.addEventListener('click', function (e)
{
if (e.target === searchModal) {
searchModal.classList.remove('show');
searchInput.value = '';
searchClearBtn.style.display = 'none';
}
});
// 执行搜索
function doSearch (keyword)
{
if (keyword && keyword.trim()) {
const searchKeyword = keyword.trim();
console.log('搜索关键词:', searchKeyword);
addSearchHistory(searchKeyword);
alert('搜索: ' + searchKeyword);
searchModal.classList.remove('show');
searchInput.value = '';
searchClearBtn.style.display = 'none';
} else {
alert('请输入搜索关键词');
}
}
searchSubmit.addEventListener('click', function (e)
{
e.stopPropagation();
doSearch(searchInput.value);
});
searchInput.addEventListener('keypress', function (e)
{
if (e.key === 'Enter' || e.key === 'enter' || e.keyCode === 13) {
e.preventDefault();
doSearch(searchInput.value);
}
});
});
</script>
return history_keywords;
}
</script>

View File

@@ -1,161 +0,0 @@
<header class="oircoEgapp-head">
<div class="headtop">
<a href="/"><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>
<span class="icon-keyword cursor_p top-search-toggle"><i class="icon-search-svg"></i></span>
<span class="mask-up cursor_p top-country-toggle"><i class="icon-lag-svg"></i></span>
</div>
</div>
</div>
<!-- 顶部菜单-->
<div class="top-menu">
<div class="it-ct">
<div class="it-1"><a href="/">{:lang_i18n('首页')}</a></div>
</div>
<div class="it-ct">
<div class="it-1">
<div class="it-1-more">{:lang_i18n('产品列表')}<i class="icon-arrow"></i></div>
{notempty name="header_categorys"}
{volist name="header_categorys" id="ca"}
<div class="it-1-2"><a href="{:url('product/category', ['id' => $ca.id])}">{$ca.name}</a></div>
{/volist}
{/notempty}
</div>
</div>
{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>
<!-- 顶部搜索-->
<div class="top-search">
<div class="marsk-container">
<div class="popup-quick">
<div class="ac-close float_r "><img src="__IMAGES__/close.png"></div>
<div class="search-in">
<form action="{:url('product/search')}" method="get">
<input type="text" name="keywords" placeholder="{:lang_i18n('产品')} USB 2.0...">
<button type="submit" id="search-btnput" class="search-button">{:lang_i18n('搜索')}</button>
</form>
<div class="title-text">
<p><a href="#">{:lang_i18n('搜索历史')}</a></p>
<div id="history"></div>
</div>
</div>
</div>
</div>
</div>
<!-- 顶部国家选择-->
<div class="top-country">
<div class="mask"></div>
<div class="action-sheet">
<div class="menu-title">
<div class="menu-name">{:lang_i18n('请择地区')}</div>
<div class="close-icon">
<img src="__IMAGES__/close.png">
</div>
</div>
<ul>
{volist name="header_languages" id="la"}
<li>
<a href="{$la.lang_url}" target="_blank">
<img src="{$la.lang_icon}">{$la.country_en_name} - {$la.lang_en_name}
</a>
</li>
{/volist}
</ul>
</div>
</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');
});
//点击搜索
$('.top-search-toggle').click(function() {
$(".marsk-container").show();
})
$('.ac-close').click(function() {
$(".marsk-container").hide();
})
// 顶部国家选择
$('.top-country-toggle').click(function(){
$(".mask,.action-sheet").show();
})
$('.top-country .close-icon').click(function(){
$(".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>

File diff suppressed because it is too large Load Diff

View File

@@ -57,8 +57,6 @@
<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">
@@ -69,24 +67,6 @@
<span>{$ac.name}</span>
</div>
<ul class="sub-list" {if condition='$ac.id == $Request.get.cid' }style="display: block;" {/if}>
{volist name="ac.child" id="ad"}
<li class="two-mues">
<a href="#" class="two-a">
<div><img src="__IMAGES__/nars-jt.png"
class="arrow {if condition='$ad.id == $Request.get.pid'}rotate{/if}">
</div>
<span>{$ad.name}</span>
</a>
<ul class="thress-mues" {if condition='$ad.id == $Request.get.pid' }style="display: block;" {/if}>
{volist name="ad.article" id="ae"}
<li>
<a href="{:url('/index/topic/nas/help_detail', ['cid' => $ac.id ,'pid' => $ad.id, 'id' => $ae.id])}"
style="margin-left:18%;padding: 0.4rem;">{$ae.title}</a>
</li>
{/volist}
</ul>
</li>
{/volist}
{volist name="ac.article" id="ar"}
<li>
<a href="{:url('/index/topic/nas/help_detail', ['cid' => $ac.id , 'id' => $ar.id])}"
@@ -98,9 +78,6 @@
</ul>
</div>
{/volist}
</div>
{/notempty}
</div>
@@ -151,17 +128,6 @@
$(this).next('.sub-list').slideToggle();
$(this).find('.arrow').toggleClass('rotate');
});
//分类二三级交互
$('.two-a').click(function(e) {
e.preventDefault();
e.stopPropagation(); // 阻止事件冒泡
// 切换当前二级菜单的箭头方向
$(this).find('.arrow').toggleClass('rotate');
// 切换对应的三级菜单显示/隐藏
$(this).siblings('.thress-mues').slideToggle();
});
// 点击顶部搜索图标-点击取消关闭
$('#ssico').click(function () {
$('.nhlpapp-pagescate').hide();

View File

@@ -1,765 +0,0 @@
{extend name="public/base" /}
{block name="style"}
<!-- 将rem适配JS移到这里确保优先执行 -->
<script type="text/javascript">
(function (doc, win) {
var docEl = doc.documentElement;
var resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize';
function setRootFontSize() {
var clientWidth = docEl.clientWidth;
if (!clientWidth) return;
var fontSize = clientWidth / 7.5; // 750px/7.5=100px375px/7.5=50px
// 直接修改内联样式,优先级最高
docEl.setAttribute('style', 'font-size: ' + fontSize + 'px !important;');
}
setRootFontSize();
win.addEventListener(resizeEvt, setRootFontSize);
doc.addEventListener('DOMContentLoaded', setRootFontSize);
})(document, window);
</script>
<link rel="stylesheet" href="__CSS__/topic_power_prodline/index.css">
<link rel="stylesheet" href="__CSS__/topic_power_prodline/swiper.css">
<link rel="stylesheet" href="__CSS__/topic_power_prodline/nav.css">
<link rel="stylesheet" href="__CSS__/topic_power_prodline/advantage.css">
<link rel="stylesheet" href="__CSS__/topic_power_prodline/moren.css">
<link rel="stylesheet" href="__CSS__/topic_power_prodline/mask.css">
<link rel="stylesheet" href="__CSS__/topic_power_prodline/product.css">
<link rel="stylesheet" href="__CSS__/topic_power_prodline/product_list.css">
<link rel="stylesheet" href="__CSS__/topic_power_prodline/product_card.css">
<link rel="stylesheet" href="__CSS__/topic_power_prodline/footer.css">
{/block}
{block name="header"}
<!-- 重置header头为空 -->
{/block}
{block name="main"}
<a class="header" href="/">
<div class="header-img">
<img src="__IMAGES__/logo.png" alt="">
</div>
</a>
<!-- 轮播核心容器 -->
<div class="swiper-container auto-swiper-container" >
{notempty name="data.focus_image"}
<div class="swiper-wrapper">
{volist name="data.focus_image" id="fo"}
<a class="swiper-slide auto-swiper-slide" href="{$fo.link}">
<img src="{$fo.image}" alt="{$fo.title}" />
</a>
{/volist}
</div>
<div class="swiper-pagination"></div>
{/notempty}
</div>
<!-- 分类 -->
{notempty name="data.category"}
<div class="nav-box">
{volist name="data.category" id="ca"}
<a class="nav-item" href="{$ca.link}">
<img src="{$ca.image}" alt="{$ca.title}">
<p {:style(['color'=>$ca.title_txt_color])}>{$ca.title}</p>
</a>
{/volist}
</div>
{/notempty}
<!-- 500万 -->
{notempty name="data.why_choose"}
<div class="advantage-section">
{assign name="why_choose_title" value=":array_shift($data.why_choose)" /}
<h2 class="advantage-section__title">{$why_choose_title.title|default=''|raw}</h2>
<div class="advantage-section__list">
{volist name="data.why_choose" id="ch"}
<div class="advantage-card-wrap">
<div class="advantage-card" data-target="design">
<img src="{$ch.image}" alt="{$ch.title}:{$ch.short_title}" class="advantage-card__img">
<div class="advantage-card__content">
<!-- 标题+箭头容器:水平+垂直双居中,内部文字左、箭头右 -->
<div class="advantage-card__heading-wrap">
<div class="advantage-card__heading" {:style(['color'=>$ch.title_txt_color])}>{$ch.title}</div>
<img src="__IMAGES__/jiant.png" alt="" class="card-arrow">
</div>
<div class="advantage-card__description" {:style(['color'=>$ch.short_title_txt_color])}>{$ch.short_title}</div>
<div style="display:none;" class="mack-conten-text">{$ch.desc|raw}</div>
</div>
</div>
</div>
{/volist}
</div>
</div>
{/notempty}
<!-- 产品差旅充 -->
{notempty name="data.travel_charger"}
<div class="product-box">
{assign name="tc_title" value=":array_shift($data.travel_charger)" /}
<div class="product-title">
<h2 class="product-title-h2">{$tc_title.title|default=''}</h2>
<p class="product-title-p">{$tc_title.short_title|default=''}</p>
</div>
<div class="product-container" >
{assign name="tc_first_section_lf" value=":array_shift($data.travel_charger)" /}
{notempty name="tc_first_section_lf"}
<a class="product-left" href="{$tc_first_section_lf.link}">
<img src="{$tc_first_section_lf.image}" alt="{$tc_first_section_lf.title}" class="product-img">
<!-- 公共类+定位类:尺寸统一,定位不同 -->
<div class="product-img-hover top55">
<img src="{$tc_first_section_lf.extra_image}" alt="{$tc_first_section_lf.short_title}" class="img1">
</div>
</a>
{/notempty}
{assign name="tc_first_section_lr" value=":array_shift($data.travel_charger)" /}
{notempty name="tc_first_section_lr"}
<div class="product-right">
<img src="{$tc_first_section_lr.image}" alt="{$tc_first_section_lr.title}" class="right-content right-img">
<video src="{$tc_first_section_lr.video}" class="right-content right-video" muted loop playsinline>
您的浏览器不支持HTML5视频播放请升级浏览器
</video>
<button class="video-play-btn">
<span class="play-icon">
<svg width="40" height="40" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="12" cy="12" r="10" fill="rgba(0,0,0,0.5)" />
<path d="M9 7L16 12L9 17V7Z" fill="white" />
</svg>
</span>
<!-- 暂停图标(默认隐藏) -->
<span class="pause-icon">
<svg width="40" height="40" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="12" cy="12" r="10" fill="rgba(0,0,0,0.5)" />
<rect x="8" y="7" width="3" height="10" fill="white" />
<rect x="13" y="7" width="3" height="10" fill="white" />
</svg>
</span>
</button>
</div>
{/notempty}
</div>
{assign name="tc_second_section" value=":array_splice($data.travel_charger, 0, 4)" /}
{notempty name="tc_second_section"}
<div class="product-card-box">
<div class="product-card-container">
{volist name="tc_second_section" id="tss"}
<a class="product-card-wrap" href="{$tss.link}">
<div class="product-card" >
<div class="product-card-img">
<img src="{$tss.image}" alt="{$tss.title}">
</div>
<div class="product-card-text">
<div class="product-card-title" {:style(['color'=>$tss.title_txt_color])}>{$tss.title}</div>
<div class="product-card-desc" {:style(['color'=>$tss.short_title_txt_color])}>{$tss.short_title}</div>
</div>
<div class="product-card-link">
<img src="__IMAGES__/ljgd.png" alt="查看更多">
</div>
</div>
</a>
{/volist}
</div>
</div>
{assign name="tc_three_section" value=":array_shift($data.travel_charger)" /}
{notempty name="tc_three_section"}
<a href="{$tc_three_section.link}" class="more">
<div class="more-img">
{$tc_three_section.title}
</div>
</a>
{/notempty}
{/notempty}
</div>
{/notempty}
<!-- 产品 家居充-->
{notempty name="data.home_charger"}
<div class="product-box">
{assign name="hc_title" value=":array_shift($data.home_charger)" /}
<div class="product-title">
<h2 class="product-title-h2">{$hc_title.title|default=''}</h2>
<p class="product-title-p">{$hc_title.short_title|default=''}</p>
</div>
<div class="product-container">
{assign name="hc_first_section_lf" value=":array_shift($data.home_charger)" /}
{notempty name="hc_first_section_lf"}
<a class="product-left" href="{$hc_first_section_lf.link}">
<img src="{$hc_first_section_lf.image}" alt="{$hc_first_section_lf.title}" class="product-img">
<!-- 公共类+定位类:尺寸统一,定位不同 -->
<div class="product-img-hover">
<img src="{$hc_first_section_lf.extra_image}" alt="{$hc_first_section_lf.short_title}" class="img2">
</div>
</a>
{/notempty}
{assign name="hc_first_section_lr" value=":array_shift($data.home_charger)" /}
{notempty name="hc_first_section_lr"}
<div class="product-right">
<img src="{$hc_first_section_lr.image}" alt="{$hc_first_section_lr.title}" class="right-content right-img">
<video src="{$hc_first_section_lr.video}" class="right-content right-video" muted loop playsinline >
您的浏览器不支持HTML5视频播放请升级浏览器
</video>
<button class="video-play-btn">
<span class="play-icon">
<svg width="40" height="40" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="12" cy="12" r="10" fill="rgba(0,0,0,0.5)" />
<path d="M9 7L16 12L9 17V7Z" fill="white" />
</svg>
</span>
<!-- 暂停图标(默认隐藏) -->
<span class="pause-icon">
<svg width="40" height="40" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="12" cy="12" r="10" fill="rgba(0,0,0,0.5)" />
<rect x="8" y="7" width="3" height="10" fill="white" />
<rect x="13" y="7" width="3" height="10" fill="white" />
</svg>
</span>
</button>
</div>
{/notempty}
</div>
{assign name="hc_second_section" value=":array_splice($data.home_charger, 0, 4)" /}
{notempty name="hc_second_section"}
<div class="product-card-box">
<div class="product-card-container">
{volist name="hc_second_section" id="hcs"}
<a class="product-card-wrap" href="{$hcs.link}">
<div class="product-card" href="#">
<div class="product-card-img">
<img src="{$hcs.image}" alt="{$hcs.short_title}">
</div>
<div class="product-card-text">
<div class="product-card-title">{$hcs.title}</div>
<div class="product-card-desc">{$hcs.short_title}</div>
</div>
<div class="product-card-link">
<img src="__IMAGES__/ljgd.png" alt="查看更多">
</div>
</div>
</a>
{/volist}
</div>
</div>
{/notempty}
{assign name="hc_three_section" value=":array_shift($data.home_charger)" /}
{notempty name="hc_three_section"}
<a href="{$hc_three_section.link}" class="more">
<div class="more-img">
{$hc_three_section.title}
</div>
</a>
{/notempty}
</div>
{/notempty}
<!-- 产品 桌面充(悬浮图上右超出)底部列表样式不一样(左文右图) -->
<div class="product-box">
{assign name="dc_title" value=":array_shift($data.desktop_charger)" /}
<div class="product-title">
<h2 class="product-title-h2">{$dc_title.title|default=''}</h2>
<p class="product-title-p">{$dc_title.short_title|default=''}</p>
</div>
<div class="product-container">
{assign name="dc_first_section_lf" value=":array_shift($data.desktop_charger)" /}
{notempty name="dc_first_section_lf"}
<a class="product-left" href="{$dc_first_section_lf.link}">
<img src="{$dc_first_section_lf.image}" alt="{$dc_first_section_lf.short_title}" class="product-img">
<!-- 公共类+定位类:尺寸和第一个完全一致,仅定位不同 -->
<div class="product-img-hover right" >
<img src="{$dc_first_section_lf.extra_image}" alt="{$dc_first_section_lf.short_title}" class="img3">
</div>
</a>
{/notempty}
{assign name="dc_first_section_lr" value=":array_shift($data.desktop_charger)" /}
{notempty name="dc_first_section_lr"}
<div class="product-right">
<img src="{$dc_first_section_lr.image}"
alt="使用场景" class="right-content right-img">
<!--muted loop playsinline controls-->
<video
src="{$dc_first_section_lr.video}"
class="right-content right-video" muted loop playsinline >
您的浏览器不支持HTML5视频播放请升级浏览器
</video>
<button class="video-play-btn">
<span class="play-icon">
<svg width="40" height="40" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="12" cy="12" r="10" fill="rgba(0,0,0,0.5)" />
<path d="M9 7L16 12L9 17V7Z" fill="white" />
</svg>
</span>
<!-- 暂停图标(默认隐藏) -->
<span class="pause-icon">
<svg width="40" height="40" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="12" cy="12" r="10" fill="rgba(0,0,0,0.5)" />
<rect x="8" y="7" width="3" height="10" fill="white" />
<rect x="13" y="7" width="3" height="10" fill="white" />
</svg>
</span>
</button>
</div>
{/notempty}
</div>
{assign name="dc_second_section" value=":array_splice($data.desktop_charger, 0, 2)" /}
{notempty name="dc_second_section"}
<div class="product-card-box">
<div class="product-card-container">
{volist name="dc_second_section" id="dcs"}
<a class="product-card-wrap" href="{$dcs.link}">
<div class="product-card" href="#">
<div class="product-card-img">
<img src="{$dcs.image}" alt="{$dcs.short_title}">
</div>
<div class="product-card-text">
<div class="product-card-title">{$dcs.title}</div>
<div class="product-card-desc">{$dcs.short_title}</div>
</div>
<div class="product-card-link">
<img src="__IMAGES__/ljgd.png" alt="查看更多">
</div>
</div>
</a>
{/volist}
</div>
</div>
{/notempty}
{assign name="dc_three_section" value=":array_shift($data.desktop_charger)" /}
{notempty name="dc_three_section"}
<a href="{$dc_three_section.link}" class="more">
<div class="more-img">
{$dc_three_section.title}
</div>
</a>
{/notempty}
</div>
<!-- 墙插 -->
{notempty name="data.wall_charger"}
<div class="product-box">
{assign name="wc_title" value=":array_shift($data.wall_charger)" /}
<div class="product-title">
<h2 class="product-title-h2">{$wc_title.title|default=''}</h2>
<p class="product-title-p">{$wc_title.short_title|default=''}</p>
</div>
<div class="product-container">
{assign name="wc_first_section_lf" value=":array_shift($data.wall_charger)" /}
{notempty name="wc_first_section_lf"}
<a class="product-left" href="{$wc_first_section_lf.link}">
<img src="{$wc_first_section_lf.image}" alt="{$wc_first_section_lf.title}" class="product-img">
<!-- 公共类+定位类:尺寸统一,定位不同 -->
<div class="product-img-hover top70">
<img src="{$wc_first_section_lf.extra_image}" alt="{$wc_first_section_lf.title}" class="img4">
</div>
</a>
{/notempty}
{assign name="wc_first_section_lr" value=":array_shift($data.wall_charger)" /}
{notempty name="wc_first_section_lr"}
<div class="product-right">
<img src="{$wc_first_section_lr.image}" alt="{$wc_first_section_lr.title}" class="right-content right-img">
<video src="{$wc_first_section_lr.video}" class="right-content right-video" muted loop playsinline>
您的浏览器不支持HTML5视频播放请升级浏览器
</video>
<button class="video-play-btn">
<span class="play-icon">
<svg width="40" height="40" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="12" cy="12" r="10" fill="rgba(0,0,0,0.5)" />
<path d="M9 7L16 12L9 17V7Z" fill="white" />
</svg>
</span>
<!-- 暂停图标(默认隐藏) -->
<span class="pause-icon">
<svg width="40" height="40" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="12" cy="12" r="10" fill="rgba(0,0,0,0.5)" />
<rect x="8" y="7" width="3" height="10" fill="white" />
<rect x="13" y="7" width="3" height="10" fill="white" />
</svg>
</span>
</button>
</div>
{/notempty}
</div>
{assign name="wc_more_section" value=":array_shift($data.wall_charger)" /}
{notempty name="wc_more_section"}
<a href="{$wc_more_section.link}" class="more">
<div class="more-img">
{$wc_more_section.title}
</div>
</a>
{/notempty}
</div>
{/notempty}
{notempty name="data.converter"}
<!-- 转换器 -->
<div class="product-box">
{assign name="ct_title" value=":array_shift($data.converter)" /}
<div class="product-title">
<h2 class="product-title-h2">{$ct_title.title|default=''}</h2>
<p class="product-title-p">{$ct_title.short_title|default=''}</p>
</div>
{assign name="ct_more_section" value=":array_pop($data.converter)" /}
{assign name="ct_chunk_section" value=":array_chunk($data.converter, 2)" /}
{assign name="ct_chunk_section_len" value=":count($ct_chunk_section)" /}
{volist name="ct_chunk_section" id="cts" key="k"}
<div class="product-container">
{assign name="cts_lf" value=":array_shift($cts)" /}
{notempty name="cts_lf"}
<a class="product-left" href="{$cts_lf.link}">
<img src="{$cts_lf.image}" alt="{$cts_lf.title}" class="product-img">
<!-- 公共类+定位类:尺寸统一,定位不同 -->
<!--style="display:flex;justify-content: center;"-->
<div class="product-img-hover top40" >
<!-- style="width:70%"-->
<img src="{$cts_lf.extra_image}" alt="{$cts_lf.title}" class="img5">
</div>
</a>
{/notempty}
{assign name="cts_lr" value=":array_shift($cts)" /}
{notempty name="cts_lr"}
<div class="product-right">
<img src="{$cts_lr.image}" alt="{$cts_lr.title}" class="right-content right-img">
<video src="{$cts_lr.video}" class="right-content right-video" muted loop playsinline>
您的浏览器不支持HTML5视频播放请升级浏览器
</video>
<!-- 播放图标 -->
<button class="video-play-btn">
<span class="play-icon">
<svg width="40" height="40" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="12" cy="12" r="10" fill="rgba(0,0,0,0.5)" />
<path d="M9 7L16 12L9 17V7Z" fill="white" />
</svg>
</span>
<!-- 暂停图标(默认隐藏) -->
<span class="pause-icon">
<svg width="40" height="40" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="12" cy="12" r="10" fill="rgba(0,0,0,0.5)" />
<rect x="8" y="7" width="3" height="10" fill="white" />
<rect x="13" y="7" width="3" height="10" fill="white" />
</svg>
</span>
</button>
</div>
{/notempty}
</div>
{neq name="k" value="$ct_chunk_section_len"}
<div class="line"></div>
{/neq}
{/volist}
{notempty name="ct_more_section"}
<a href="{$ct_more_section.link}" class="more">
<div class="more-img">
{$ct_more_section.title}
</div>
</a>
{/notempty}
</div>
{/notempty}
{notempty name="data.footer_info"}
<!-- 底部 -->
<div class="prodline-footer-box">
<div class="prodline-footer-box-img">
<img src="{$data.footer_info.0.image}" alt="">
</div>
</div>
{/notempty}
<!-- 蒙版 -->
<div class="mask" id="mask">
<div class="mask-content" >
<span class="close-btn">&times;</span>
<div class="mask-scroll-content"></div>
</div>
</div>
{/block}
{block name="script"}
<script type="text/javascript">
let swiper=null;
const advantageItems = document.querySelectorAll('.advantage-card');
let scrollTop = 0; // 保存页面滚动位置
let closeBtnHtml = null; // 关闭按钮元素(全局变量,避免重复创建)
const mask = document.getElementById('mask');
const maskContent = document.querySelector('.mask-content');
const maskScrollContent = document.querySelector('.mask-scroll-content'); // 滚动容器(关键!)
const closeBtn = document.querySelector('.close-btn')
// 初始化:确保 maskScrollContent 存在于 maskContent 中(避免被清空)
if (!maskScrollContent) {
// 如果页面没有 mask-scroll-content动态创建确保结构稳定
const scrollContent = document.createElement('div');
scrollContent.className = 'mask-scroll-content';
maskContent.appendChild(scrollContent);
}
function createCloseBtn() {
if (closeBtnHtml) {
closeBtnHtml.remove();
}
closeBtnHtml = document.createElement('span');
closeBtnHtml.className = 'close-btn';
closeBtnHtml.innerHTML = '&times;';
closeBtnHtml.addEventListener('click', hideMask);
// 挂载到 maskContent而非 scrollContent避免被滚动影响位置
maskContent.prepend(closeBtnHtml);
}
function showMask(contentHtml) {
// 保存页面滚动位置
scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;
// 关键:将内容填充到 scrollContent 中(而非直接替换 maskContent
maskScrollContent.innerHTML = contentHtml;
createCloseBtn();
// 显示蒙版
mask.style.display = 'flex';
// 禁止滚动(复用你的逻辑)
document.documentElement.classList.add('no-scroll');
document.body.classList.add('no-scroll');
document.body.style.top = `-${scrollTop}px`;
// 额外:打开蒙版时就重置滚动位置(避免残留上次滚动状态)
maskScrollContent.scrollTop = 0;
}
function hideMask() {
// 关键步骤 1先重置 scrollContent 的滚动位置(此时元素还未被销毁)
maskScrollContent.scrollTop = 0;
// 关键步骤 2清空 scrollContent 的内容(而非 maskContent
maskScrollContent.innerHTML = "";
// 隐藏蒙版
mask.style.display = 'none';
// 恢复滚动(复用你的逻辑)
document.documentElement.classList.remove('no-scroll');
document.body.classList.remove('no-scroll');
document.body.style.top = '';
// 还原页面滚动位置
window.scrollTo(0, scrollTop);
// 移除关闭按钮(可选,避免残留)
if (closeBtnHtml) {
closeBtnHtml.remove();
closeBtnHtml = null;
}
}
// 点击卡片显示详情
advantageItems.forEach((item) => {
item.addEventListener('click', (e) => {
// 获取当前点击卡片内的.mack-conten-text元素
const currentMackContent = e.currentTarget.querySelector('.mack-conten-text');
if (currentMackContent) {
// 关键修改获取该元素的子内容innerHTML 本身就是内部HTML不含当前元素标签
// 若想更彻底,可遍历子节点拼接内容(兼容特殊场景)
let contentHtml = '';
Array.from(currentMackContent.childNodes).forEach(child => {
// 只保留元素节点和文本节点(过滤空节点)
if (child.nodeType === 1 || child.nodeType === 3) {
contentHtml += child.outerHTML || child.textContent;
}
});
// 显示蒙版并传入纯净的子内容
showMask(contentHtml);
}
});
});
// 关闭按钮事件
closeBtn.addEventListener('click', hideMask);
// 点击蒙版背景关闭(可选)
mask.addEventListener('click', (e) => {
if (e.target === mask) hideMask();
});
// ESC 键关闭(可选)
document.addEventListener('keydown', (e) => {
if (e.key === 'Escape' && mask.style.display === 'flex') hideMask();
});
// 关键:拦截蒙版的 touchmove 事件,阻止滚动穿透(移动端核心)
mask.addEventListener(
'touchmove',
(e) => {
// 只有点击蒙版背景(不是内容区域)才阻止滚动
if (e.target === mask) {
e.preventDefault(); // 阻止默认触摸滚动行为
e.stopPropagation(); // 阻止事件冒泡
}
},
{ passive: false }
); // passive: false 必须,否则 preventDefault 无效
document.addEventListener('DOMContentLoaded', () => {
// 初始化所有视频容器
function initVideoContainers() {
const productRights = document.querySelectorAll('.product-right');
// 支持的视频格式
const supportedVideoFormats = ['.mp4', '.webm', '.ogg', '.mov', '.avi', '.mkv', '.flv', '.wmv'];
productRights.forEach((container, index) => {
const video = container.querySelector('.right-video');
const btn = container.querySelector('.video-play-btn');
const img = container.querySelector('.right-img');
if (!video || !btn || !img) return;
const videoSrc = video.src.trim()
console.log(videoSrc,'=videoSrc=')
// 修复:正确检测有效视频地址
// 排除空字符串、null、undefined
const hasValidVideo = !!videoSrc && videoSrc.trim() !== '' && videoSrc !== 'undefined' && videoSrc !== 'null';
// 验证视频格式是否有效
const isValidFormat = supportedVideoFormats.some(format =>
videoSrc.toLowerCase().endsWith(format) ||
(videoSrc.includes('?') && videoSrc.toLowerCase().split('?')[0].endsWith(format))
);
// 初始化状态:无视频或格式无效则保持图片显示,永不切换
if (!hasValidVideo || !isValidFormat) {
img.style.display = 'block';
video.style.display = 'none';
btn.style.display = 'none';
// 绑定空方法,防止调用报错
video.switchMedia = function() {};
console.log(`容器${index}:无有效视频(src="${videoSrc}"),保持图片显示`);
return;
}
// 有有效视频的情况
console.log(`容器${index}:有有效视频(src="${videoSrc}"),初始化播放逻辑`);
// 初始状态
video.style.display = 'none';
video.pause();
img.style.display = 'block';
btn.style.display = 'none';
btn.style.opacity = '0';
// 同步状态函数
function syncMediaState() {
if (img.style.display === 'block') {
btn.style.display = 'none';
btn.style.opacity = '0';
} else {
btn.style.display = 'block';
btn.style.opacity = '1';
btn.classList.toggle('paused', !video.paused && !video.ended);
}
}
// 按钮点击事件
btn.addEventListener('click', () => {
if (video.paused) {
video.play().catch(() => syncMediaState());
} else {
video.pause();
}
syncMediaState();
});
// 视频事件监听
['play', 'pause', 'ended', 'playing', 'waiting'].forEach(event => {
video.addEventListener(event, syncMediaState);
});
// 滚动切换函数
video.switchMedia = function(showVideo) {
// 只处理有有效视频的情况
if (showVideo) {
img.style.display = 'none';
video.style.display = 'block';
video.play().catch(() => {
console.log(`容器${index}:自动播放失败,需要用户交互`);
syncMediaState();
});
} else {
video.pause();
img.style.display = 'block';
video.style.display = 'none';
}
syncMediaState();
};
// 初始同步
syncMediaState();
});
}
// 滚动监听 - 优化版
function setupScrollWatcher() {
let ticking = false;
function updateVideoVisibility() {
const productRights = document.querySelectorAll('.product-right');
productRights.forEach(container => {
const video = container.querySelector('.right-video');
if (!video || !video.switchMedia) return;
// 检查是否在视口中
const rect = container.getBoundingClientRect();
const viewHeight = window.innerHeight || document.documentElement.clientHeight;
const isInView = rect.top < viewHeight * 0.7 && rect.bottom > viewHeight * 0.3;
// 只对有有效视频的元素调用switchMedia
video.switchMedia(isInView);
});
ticking = false;
}
// 使用requestAnimationFrame优化性能
window.addEventListener('scroll', () => {
if (!ticking) {
requestAnimationFrame(updateVideoVisibility);
ticking = true;
}
});
}
// 初始化
initVideoContainers();
setupScrollWatcher();
// 初始检查一次
setTimeout(() => {
const event = new Event('scroll');
window.dispatchEvent(event);
}, 300);
});
window.onload = function () {
if (typeof Swiper === 'undefined') {
console.error('Swiper加载失败请刷新页面重试');
return;
}
swiper = new Swiper('.auto-swiper-container', {
autoplay: {
delay: 3000, // 3秒切换
disableOnInteraction: false,
},
loop: false,
slidesPerView: 1,
spaceBetween: 0,
// 启用分页指示标(核心配置)
pagination: {
el: '.swiper-pagination', // 对应 HTML 中的指示标容器
clickable: true, // 允许点击指示标切换
// dynamicBullets: true, // 动态指示标(当前激活放大)
//dynamicMainBullets: 3, // 动态模式显示3个核心指示标
},
navigation: false,
scrollbar: false,
on: {
resize: function () {
this.update();
},
},
});
window.addEventListener('resize', function () {
swiper.update();
});
// 初始化时触发滚动事件,确保状态正确
window.dispatchEvent(new Event('scroll'));
};
</script>
{/block}

View File

@@ -24,9 +24,7 @@
<p>{$detail.release_time|date_format_i18n}</p>
</div>
<!-- 文本渲染-->
<div class="ql-container">
<div class="blog_content ql-editor">{$detail.content|raw}</div>
</div>
<div class="blog_content">{$detail.content|raw}</div>
</div>
<!-- 评论只显示前面五条--->
{notempty name="comments"}

View File

@@ -117,8 +117,8 @@
<p class="subtitle" {notempty name="scene.desc_txt_color" }style="color:{$scene.desc_txt_color};" {/notempty}>
{$scene.desc|raw}</p>
<a class="sceneMore" href="{$scene.link}">{:lang_i18n('了解更多')} ></a> -->
<div style="background-image: url('{$scene.image}');" class="sceneimg"></div>
</a>
<div style="background-image: url('{$scene.image}');" class="sceneimg"></div>
</div>
{/volist}
</div>

View File

@@ -22,11 +22,7 @@
<a class="pathname" href="/">{:lang_i18n('首页')}</a>
{volist name="product_categorys" id="ca"}
<div class="arrow"></div>
{eq name="ca.pid" value="0"}
<a class="pathname" href="{:url('product/category', ['id' => $ca.id])}">{$ca.name}</a>
{else /}
<a class="pathname" href="{:url('product/subcategory', ['id' => $ca.id])}">{$ca.name}</a>
{/eq}
{/volist}
</div>
<!-- 产品主图切换和参数详情-->
@@ -133,10 +129,8 @@
{/notempty}
</div>
<!-- 富文本渲染-->
<div class="ql-container">
<div class="products_des ql-editor" id="detail">
{$product.detail|default=''|raw}
</div>
<div class="products_des" id="detail">
{$product.detail|default=''|raw}
</div>
</div>
<!-- 关联产品 -->

View File

@@ -1,287 +0,0 @@
<header class="header-PC">
<div id="header">
<!-- LOG -->
<div class="nav1">
<a href="/">
<img src="__IMAGES__/logo.png" />
</a>
</div>
<!--顶部导航栏 -->
<div class="nav2">
<nav id="booNavigation" class="booNavigation">
<ul>
{if condition="!empty($header_categorys)"}
<li class="navItem">
<a href="javascript:void(0);">{:lang_i18n('产品列表')}</a>
<img src="__IMAGES__/black-down.png" class="downimg" />
<ol class="navItemConten">
<!-- 左边子菜单-->
<ul class="navItem_cyleft">
{volist name="header_categorys" id="vo"}
<li class="{$key == 0 ? 'it_active' : ''}">
<a href="{:url('product/category', ['id' => $vo.id])}">{$vo.name}</a>
</li>
{/volist}
</ul>
<!-- 右边子菜单-->
{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}>
{if condition="!empty($vo.children)"}
{volist name="vo.children" id="vc"}
<dl class="nav_cyrightit">
<dt>
<a href="{:url('product/subcategory', ['id' => $vc.id])}">{$vc.name}</a>
</dt>
{if condition="!empty($vc.children)"}
{volist name="vc.children" id="vcc"}
<dd>
<a href="{:url('product/subcategory', ['id' => $vcc.id])}">{$vcc.name}</a>
</dd>
{/volist}
{/if}
</dl>
{/volist}
{/if}
</div>
{/volist}
</ol>
</li>
{/if}
{volist name="header_navigation" id="vo"}
<li class="navItem">
<a href="{$vo.link}" target="{$vo.blank==1?'_blank':'_self'}">{$vo.name}</a>
{if condition="!empty($vo.children)"}
<img src="__IMAGES__/black-down.png" class="downimg" />
<!--下拉菜单 -->
<ol class="navItemConten1">
{volist name="vo.children" id="voc"}
<li>
<a href="{$voc.link}" target="{$voc.blank==1?'_blank':'_self'}">{$voc.name}</a>
</li>
{/volist}
</ol>
{/if}
</li>
{/volist}
</ul>
</nav>
</div>
<!-- 顶部搜索/国家选择/商店-->
<div class="nav3">
<img src="__IMAGES__/icon-search.png" id="openModalBtn" class="searchimg" />
<div class="choesCountry">
<img src="__IMAGES__/icon-language.png" id="countrycheck" class="checkimg" />
<!--国家选择 -->
<div class="topCountry" id="top-country">
<ul>
<li class="closec">
<span class="closecountrybt">×</span>
</li>
{volist name="header_languages" id="vo"}
<a href="{$vo.lang_url}">
<li>
<div class="cico">
<img src="{$vo.lang_icon}" class="countryimg" />
</div>
<p class="countryName">{$vo.country_en_name} - {$vo.lang_en_name}</p>
</li>
</a>
{/volist}
</ul>
</div>
</div>
{eq name=":cookie('think_lang')" value="en-us"}
{notempty name="basic_config['navigation_store_url']['value']"}
<a class="storetopbt" href="{$basic_config['navigation_store_url']['value']}" target="_blank">
<img src="__IMAGES__/shopico.png" class="storeImgico" />{:lang_i18n('店铺')}
</a>
{/notempty}
{/eq}
</div>
</div>
<!-- 搜索弹框-->
<div class="searchmodalMian" id="scmodal">
<div class="searchmodalct">
<span class="close-btn">×</span>
<input type="text" name="keywords" id="serrchinput" autocomplete="off" />
<!-- 历史记录 -->
<div class="searchhistory">
<p class="h_title">{:lang_i18n('搜索记录')}</p>
<ul></ul>
</div>
<div class="popProduct">
<p class="h_title">{:lang_i18n('热销产品')}</p>
<div class="popmain">
{volist name="header_hot_products" id="vo"}
<div class="popitem">
<a href="{:url('product/detail', ['id' => $vo.id])}"><img src="{:thumb($vo.cover_image)}" class="popimg" /></a>
<div class="productName">{$vo.name}</div>
<div class="produc-dec">{$vo.short_name}</div>
</div>
{/volist}
</div>
</div>
</div>
</div>
</header>
<script type="text/javascript">
$(function() {
$('.header-PC #header .navItem>a').each(function(idx, item) {
var _item = $(item);
_item.removeClass('active');
if (_item.attr('href') && compareUrls(location.href, _item.get(0).href)) {
_item.addClass('active').siblings();
}
});
// 比较两个URL是否相等支持只有path的情况并处理有无.html后缀的情况
function compareUrls(url1, url2) {
// 如果输入的是相对路径,添加当前域名
if (!url1.startsWith('http')) {
url1 = window.location.origin + (url1.startsWith('/') ? '' : '/') + url1;
}
if (!url2.startsWith('http')) {
url2 = window.location.origin + (url2.startsWith('/') ? '' : '/') + url2;
}
// 将两个URL转换为URL对象
const urlObj1 = new URL(url1);
const urlObj2 = new URL(url2);
// 获取路径名并移除末尾的斜杠
let path1 = urlObj1.pathname.replace(/\/$/, '');
let path2 = urlObj2.pathname.replace(/\/$/, '');
// 移除.html后缀
path1 = path1.replace(/\.html$/, '');
path2 = path2.replace(/\.html$/, '');
// 比较处理后的路径
return path1 === path2;
}
})
</script>
<script>
$(document).ready(function () {
// 搜索历史记录处理
function history(keywords) {
var history = localStorage.getItem('header_search_keywords');
if (!history) {
history = [];
} else {
history = JSON.parse(history);
}
// 记录搜索关键词
if (keywords) {
if (history.includes(keywords)) {
history.splice(history.indexOf(keywords), 1);
}
history.unshift(keywords);
if (history.length > 3) {
history.pop();
}
localStorage.setItem('header_search_keywords', JSON.stringify(history));
return history;
}
// 回显搜索历史记录
history.forEach(function (item) {
$('.searchhistory ul').append('<li><a href="{:url(\'product/search\')}?keywords=' + item + '">' + item + '</a></li>');
});
return history;
}
// 封装一个函数用于处理鼠标悬停显示和隐藏内容
function handleHover($element, $content) {
// 同时支持鼠标悬停和点击事件
$element
.mouseenter(function () {
$content.stop(true, true).slideDown(60);
})
.mouseleave(function () {
$content.stop(true, true).slideUp(60);
})
.click(function (e) {
// 阻止链接默认跳转(如果有链接的话)
if ($content.is(':visible')) {
$content.stop(true, true).slideUp(60);
} else {
$content.stop(true, true).slideDown(60);
}
// 防止点击事件冒泡到a标签
e.preventDefault();
e.stopPropagation();
});
}
// 处理产品列表的下拉菜单
var $firstNav = $('.navItem').eq(0);
if ($firstNav.find('.navItemConten').length) {
handleHover($firstNav, $firstNav.find('.navItemConten'));
}
// 鼠标移入左侧子菜单切换显示
$('.navItem_cyleft li').mouseenter(function () {
$(this).addClass('it_active').siblings().removeClass('it_active');
$('.navItem_cyright').hide();
$('.navItem_cyright').eq($(this).index()).show();
});
// 动态处理所有带有navItemConten1的导航项
$('.navItem').each(function () {
var $this = $(this);
var $dropdown = $this.find('.navItemConten1');
// 只给有下拉菜单的导航项绑定事件
if ($dropdown.length) {
handleHover($this, $dropdown);
}
});
// 点击搜索
$('#openModalBtn').click(function () {
$('#scmodal').toggle();
});
$('.close-btn').click(function () {
$('#scmodal').hide();
});
// 点击空白处关闭下拉菜单
$(document).click(function () {
$('.navItemConten, .navItemConten1, #top-country').slideUp(60);
});
// 防止下拉菜单内部点击触发空白处关闭事件
$('.navItemConten, .navItemConten1, #top-country').click(function (e) {
e.stopPropagation();
});
// 搜索历史记录回显
history();
// 执行搜索
$('#serrchinput').keydown(function (event) {
if (event.originalEvent.keyCode == 13) {
var keywords = $(this).val();
if (keywords == '') {
return false;
}
// 记录搜索关键词
history(keywords);
// 跳转到搜索页面
window.location.href = "{:url('product/search')}" + '?keywords=' + keywords;
}
});
// 点击选择国家
$('#countrycheck').click(function (e) {
$('#top-country').toggle();
e.stopPropagation();
});
$('.closecountrybt').click(function () {
$('#top-country').hide();
});
});
</script>

View File

@@ -58,7 +58,7 @@
{else/}
<a href="javascript:void(0);" class="fline">
{$vo.value}
{/if}
{/if}
</a>
</li>
{/volist}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -32,7 +32,7 @@
</div>
<div class="nhlp-tx-list">
{volist name="vo.article" id="va" key="index"}
<a class="txrow" href="{:url('/index/topic/nas/help_detail', ['pid' => $va.category_id,'cid' => $vo.id, 'id' => $va.id])}">
<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">
@@ -41,7 +41,7 @@
</a>
{/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,'pid' => isset($vo.article[0])?$vo.article[0]['category_id']:0])}">
<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}

View File

@@ -1,17 +1,17 @@
{extend name="public/nas_base" /}
{block name="title"}
{notempty name="article.seo_title"}<title>{$article.seo_title}</title>{else /}{__BLOCK__}{/notempty}
{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}
{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" />
<link rel="stylesheet" href="__CSS__/topic_nas_help-detail.css"/>
{/block}
{block name="main"}
<div class="orico_Page_index">
@@ -32,42 +32,28 @@
<div class="nars-hlpdt-ml">
{notempty name="article_categorys"}
<div class="nav-tree">
<!-- start 三级菜单 -->
{volist name="article_categorys" id="ac"}
<div class="category">
<!-- 一级 -->
<div class="category-title">
<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>
<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>
</div>
<!-- 二级-->
<ul class="sub-list" {if condition='$ac.id == $Request.get.cid' }style="display: block;" {/if}>
{volist name="ac.child" id="ad"}
<li class="two-mues">
<a href="#" class="two-a">
<div class="arrow {if condition='$ad.id == $Request.get.pid'}rotate{/if}"><img src="__IMAGES__/nas-jt.png" class="arrow {if condition='$ad.id == $Request.get.pid'}rotate{/if}" /></div>
<span>{$ad.name}</span>
<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])}"
{eq name="ar.id" value="$Request.get.id"}class="active"{/eq}
>
{$ar.title}
</a>
<ul class="thress-mues" {if condition='$ad.id == $Request.get.pid' }style="display: block;" {/if}>
{volist name="ad.article" id="ae"}
<li style="margin-left: 30px;"><a href="{:url('/index/topic/nas/help_detail', ['cid' => $ac.id,'pid' => $ad.id, 'id' => $ae.id])}" style="padding-top: 6px;" {eq
name="ae.id" value="$Request.get.id" }class="active" {/eq}>{$ae.title}</a></li>
{/volist}
</ul>
<!-- 三级-->
</li>
{/volist}
{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;" {eq
name="ar.id" value="$Request.get.id" }class="active" {/eq}>{$ar.title}</a></li>
{/volist}
</ul>
</div>
{/volist}
<!-- end 三级菜单 -->
</div>
{/notempty}
</div>
@@ -89,22 +75,10 @@
{block name="script"}
<script type="text/javascript">
$(document).ready(function () {
// 一级菜单点击事件
$('.category-title').click(function () {
$(this).next('.sub-list').slideToggle();
$(this).find('.arrow').toggleClass('rotate');
});
// 二级菜单点击事件
$('.two-a').click(function(e) {
e.preventDefault();
e.stopPropagation(); // 阻止事件冒泡
// 切换当前二级菜单的箭头方向
$(this).find('.arrow').toggleClass('rotate');
// 切换对应的三级菜单显示/隐藏
$(this).siblings('.thress-mues').slideToggle();
});
// 搜索
$(document).on('click', function (e) {
var target = $(e.target);
@@ -135,7 +109,7 @@
html = '<ul>'
$.each(r.data, function (k, v) {
html +=
'<li><a href="{:url(\'/index/topic/nas/help_detail\')}?cid=' + v.category_id + '&id=' + v.id + '&pid=' + v.pid + '">' + 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>'
}

View File

@@ -1,573 +0,0 @@
{extend name="public/base" /}
{block name="style"}
<link rel="stylesheet" href="__CSS__/topic_power_prodline/index.css">
<link rel="stylesheet" href="__CSS__/topic_power_prodline/swiper.css">
<link rel="stylesheet" href="__CSS__/topic_power_prodline/nav.css">
<link rel="stylesheet" href="__CSS__/topic_power_prodline/advantage.css">
<link rel="stylesheet" href="__CSS__/topic_power_prodline/mask.css">
<link rel="stylesheet" href="__CSS__/topic_power_prodline/product.css">
<link rel="stylesheet" href="__CSS__/topic_power_prodline/product_list.css">
<link rel="stylesheet" href="__CSS__/topic_power_prodline/product_card.css">
<link rel="stylesheet" href="__CSS__/topic_power_prodline/footer.css">
{/block}
{block name="main"}
<!-- 轮播核心容器 -->
<div class="swiper-container auto-swiper-container" >
{notempty name="data.focus_image"}
<div class="swiper-wrapper">
{volist name="data.focus_image" id="fo"}
<a class="swiper-slide auto-swiper-slide" href="{$fo.link}">
<img src="{$fo.image}" alt="{$fo.title}" />
</a>
{/volist}
</div>
<div class="swiper-pagination"></div>
{/notempty}
</div>
<!-- 分类 -->
{notempty name="data.category"}
<div class="nav-box">
{volist name="data.category" id="ca"}
<a class="nav-item" href="{$ca.link}">
<img src="{$ca.image}" alt="{$ca.title}">
<p {:style(['color'=>$ca.title_txt_color])}>{$ca.title}</p>
</a>
{/volist}
</div>
{/notempty}
<!-- 500万 -->
{notempty name="data.why_choose"}
<div class="advantage-section">
{assign name="why_choose_title" value=":array_shift($data.why_choose)" /}
<h2 class="advantage-section__title">{$why_choose_title.title|default=''|raw}</h2>
<div class="advantage-section__list">
{volist name="data.why_choose" id="ch"}
<div class="advantage-card-wrap">
<div class="advantage-card" data-target="design">
<img src="{$ch.image}" alt="{$ch.title}:{$ch.short_title}" class="advantage-card__img">
<div class="advantage-card__content">
<!-- 标题+箭头容器:水平+垂直双居中,内部文字左、箭头右 -->
<div class="advantage-card__heading-wrap">
<div class="advantage-card__heading" {:style(['color'=>$ch.title_txt_color])}>{$ch.title}</div>
<img src="__IMAGES__/jiant.png" alt="" class="card-arrow">
</div>
<div class="advantage-card__description" {:style(['color'=>$ch.short_title_txt_color])}>{$ch.short_title}</div>
<div style="display:none;" class="mack-conten-text">{$ch.desc|raw}</div>
</div>
</div>
</div>
{/volist}
</div>
</div>
{/notempty}
<!-- 产品差旅充 -->
{notempty name="data.travel_charger"}
<div class="product-box">
{assign name="tc_title" value=":array_shift($data.travel_charger)" /}
<div class="product-title">
<h2 class="product-title-h2">{$tc_title.title|default=''}</h2>
<p class="product-title-p">{$tc_title.short_title|default=''}</p>
</div>
<div class="product-container" >
{assign name="tc_first_section_lf" value=":array_shift($data.travel_charger)" /}
{notempty name="tc_first_section_lf"}
<a class="product-left" href="{$tc_first_section_lf.link}">
<img src="{$tc_first_section_lf.image}" alt="{$tc_first_section_lf.title}" class="product-img">
<!-- 公共类+定位类:尺寸统一,定位不同 -->
<div class="product-img-hover product-img-1">
<img src="{$tc_first_section_lf.extra_image}" alt="{$tc_first_section_lf.short_title}">
</div>
</a>
{/notempty}
{assign name="tc_first_section_lr" value=":array_shift($data.travel_charger)" /}
{notempty name="tc_first_section_lr"}
<div class="product-right">
<img src="{$tc_first_section_lr.image}" alt="{$tc_first_section_lr.title}" class="right-content right-img">
<video src="{$tc_first_section_lr.video}" class="right-content right-video" muted loop playsinline controls>
您的浏览器不支持HTML5视频播放请升级浏览器
</video>
</div>
{/notempty}
</div>
{assign name="tc_second_section" value=":array_splice($data.travel_charger, 0, 4)" /}
{notempty name="tc_second_section"}
<div class="product-card-box">
<div class="product-card-container">
{volist name="tc_second_section" id="tss"}
<a class="product-card-wrap" href="{$tss.link}">
<div class="product-card" >
<div class="product-card-img">
<img src="{$tss.image}" alt="{$tss.title}">
</div>
<div class="product-card-text">
<div class="product-card-title" {:style(['color'=>$tss.title_txt_color])}>{$tss.title}</div>
<div class="product-card-desc" {:style(['color'=>$tss.short_title_txt_color])}>{$tss.short_title}</div>
</div>
<div class="product-card-link">
<img src="__IMAGES__/ljgd.png" alt="查看更多">
</div>
</div>
</a>
{/volist}
</div>
</div>
{assign name="tc_three_section" value=":array_shift($data.travel_charger)" /}
{notempty name="tc_three_section"}
<a href="{$tc_three_section.link}" class="more">
<div class="more-img">
{$tc_three_section.title}
</div>
</a>
{/notempty}
{/notempty}
</div>
{/notempty}
<!-- 产品 家居充-->
{notempty name="data.home_charger"}
<div class="product-box">
{assign name="hc_title" value=":array_shift($data.home_charger)" /}
<div class="product-title">
<h2 class="product-title-h2">{$hc_title.title|default=''}</h2>
<p class="product-title-p">{$hc_title.short_title|default=''}</p>
</div>
<div class="product-container">
{assign name="hc_first_section_lf" value=":array_shift($data.home_charger)" /}
{notempty name="hc_first_section_lf"}
<a class="product-left" href="{$hc_first_section_lf.link}">
<img src="{$hc_first_section_lf.image}" alt="{$hc_first_section_lf.title}" class="product-img">
<!-- 公共类+定位类:尺寸统一,定位不同 -->
<div class="product-img-hover product-img-1">
<img src="{$hc_first_section_lf.extra_image}" alt="{$hc_first_section_lf.short_title}">
</div>
</a>
{/notempty}
{assign name="hc_first_section_lr" value=":array_shift($data.home_charger)" /}
{notempty name="hc_first_section_lr"}
<div class="product-right">
<img src="{$hc_first_section_lr.image}" alt="{$hc_first_section_lr.title}" class="right-content right-img">
<video src="{$hc_first_section_lr.video}" class="right-content right-video" muted loop playsinline controls>
您的浏览器不支持HTML5视频播放请升级浏览器
</video>
</div>
{/notempty}
</div>
{assign name="hc_second_section" value=":array_splice($data.home_charger, 0, 4)" /}
{notempty name="hc_second_section"}
<div class="product-card-box">
<div class="product-card-container">
{volist name="hc_second_section" id="hcs"}
<a class="product-card-wrap" href="{$hcs.link}">
<div class="product-card" href="#">
<div class="product-card-img">
<img src="{$hcs.image}" alt="{$hcs.short_title}">
</div>
<div class="product-card-text">
<div class="product-card-title">{$hcs.title}</div>
<div class="product-card-desc">{$hcs.short_title}</div>
</div>
<div class="product-card-link">
<img src="__IMAGES__/ljgd.png" alt="查看更多">
</div>
</div>
</a>
{/volist}
</div>
</div>
{/notempty}
{assign name="hc_three_section" value=":array_shift($data.home_charger)" /}
{notempty name="hc_three_section"}
<a href="{$hc_three_section.link}" class="more">
<div class="more-img">
{$hc_three_section.title}
</div>
</a>
{/notempty}
</div>
{/notempty}
<!-- 产品 桌面充(悬浮图上右超出)底部列表样式不一样(左文右图) -->
<div class="product-box">
{assign name="dc_title" value=":array_shift($data.desktop_charger)" /}
<div class="product-title">
<h2 class="product-title-h2">{$dc_title.title|default=''}</h2>
<p class="product-title-p">{$dc_title.short_title|default=''}</p>
</div>
<div class="product-container">
{assign name="dc_first_section_lf" value=":array_shift($data.desktop_charger)" /}
{notempty name="dc_first_section_lf"}
<a class="product-left" href="{$dc_first_section_lf.link}">
<img src="{$dc_first_section_lf.image}" alt="{$dc_first_section_lf.short_title}" class="product-img">
<!-- 公共类+定位类:尺寸和第一个完全一致,仅定位不同 -->
<div class="product-img-hover product-img-2" >
<img src="{$dc_first_section_lf.extra_image}" alt="{$dc_first_section_lf.short_title}">
</div>
</a>
{/notempty}
{assign name="dc_first_section_lr" value=":array_shift($data.desktop_charger)" /}
{notempty name="dc_first_section_lr"}
<div class="product-right">
<img src="{$dc_first_section_lr.image}"
alt="使用场景" class="right-content right-img">
<!--muted loop playsinline controls-->
<video
src="{$dc_first_section_lr.video}"
class="right-content right-video" muted loop playsinline controls>
您的浏览器不支持HTML5视频播放请升级浏览器
</video>
</div>
{/notempty}
</div>
{assign name="dc_second_section" value=":array_splice($data.desktop_charger, 0, 2)" /}
{notempty name="dc_second_section"}
<div class="product-card-box">
<div class="product-card-container2">
{volist name="dc_second_section" id="dcs"}
<a class="product-card2" href="{$dcs.link}">
<div class="product-text2">
<!-- 新增内部容器,确保所有内容左对齐一致性 -->
<div class="product-text-content2">
<div class="product-card-title2">{$dcs.title}</div> <!-- 测试超出一行省略 -->
<div class="product-card-desc2">{$dcs.short_title}</div> <!-- 测试超出2行省略 -->
<div class="product-card-link2">
<img src="__IMAGES__/ljgd.png" alt="了解更多">
</div>
</div>
</div>
<div class="product-card-img2">
<img src="{$dcs.image}" alt="{$dcs.title}">
</div>
</a>
{/volist}
</div>
</div>
{/notempty}
{assign name="dc_three_section" value=":array_shift($data.desktop_charger)" /}
{notempty name="dc_three_section"}
<a href="{$dc_three_section.link}" class="more">
<div class="more-img">
{$dc_three_section.title}
</div>
</a>
{/notempty}
</div>
<!-- 墙插 -->
{notempty name="data.wall_charger"}
<div class="product-box">
{assign name="wc_title" value=":array_shift($data.wall_charger)" /}
<div class="product-title">
<h2 class="product-title-h2">{$wc_title.title|default=''}</h2>
<p class="product-title-p">{$wc_title.short_title|default=''}</p>
</div>
<div class="product-container">
{assign name="wc_first_section_lf" value=":array_shift($data.wall_charger)" /}
{notempty name="wc_first_section_lf"}
<a class="product-left" href="{$wc_first_section_lf.link}">
<img src="{$wc_first_section_lf.image}" alt="{$wc_first_section_lf.title}" class="product-img">
<!-- 公共类+定位类:尺寸统一,定位不同 -->
<div class="product-img-hover product-img-1">
<img src="{$wc_first_section_lf.extra_image}" alt="{$wc_first_section_lf.title}">
</div>
</a>
{/notempty}
{assign name="wc_first_section_lr" value=":array_shift($data.wall_charger)" /}
{notempty name="wc_first_section_lr"}
<div class="product-right">
<img src="{$wc_first_section_lr.image}" alt="{$wc_first_section_lr.title}" class="right-content right-img">
<video src="{$wc_first_section_lr.video}" class="right-content right-video" muted loop playsinline controls>
您的浏览器不支持HTML5视频播放请升级浏览器
</video>
</div>
{/notempty}
</div>
{assign name="wc_more_section" value=":array_shift($data.wall_charger)" /}
{notempty name="wc_more_section"}
<a href="{$wc_more_section.link}" class="more">
<div class="more-img">
{$wc_more_section.title}
</div>
</a>
{/notempty}
</div>
{/notempty}
{notempty name="data.converter"}
<!-- 转换器 -->
<div class="product-box">
{assign name="ct_title" value=":array_shift($data.converter)" /}
<div class="product-title">
<h2 class="product-title-h2">{$ct_title.title|default=''}</h2>
<p class="product-title-p">{$ct_title.short_title|default=''}</p>
</div>
{assign name="ct_more_section" value=":array_pop($data.converter)" /}
{assign name="ct_chunk_section" value=":array_chunk($data.converter, 2)" /}
{assign name="ct_chunk_section_len" value=":count($ct_chunk_section)" /}
{volist name="ct_chunk_section" id="cts" key="k"}
<div class="product-container">
{assign name="cts_lf" value=":array_shift($cts)" /}
{notempty name="cts_lf"}
<a class="product-left" href="{$cts_lf.link}">
<img src="{$cts_lf.image}" alt="{$cts_lf.title}" class="product-img">
<!-- 公共类+定位类:尺寸统一,定位不同 -->
<!--style="display:flex;justify-content: center;"-->
<div class="product-img-hover product-img-1" >
<!-- style="width:70%"-->
<img src="{$cts_lf.extra_image}" alt="{$cts_lf.title}">
</div>
</a>
{/notempty}
{assign name="cts_lr" value=":array_shift($cts)" /}
{notempty name="cts_lr"}
<div class="product-right">
<img src="{$cts_lr.image}" alt="{$cts_lr.title}" class="right-content right-img">
<video src="{$cts_lr.video}" class="right-content right-video" muted loop playsinline controls>
您的浏览器不支持HTML5视频播放请升级浏览器
</video>
</div>
{/notempty}
</div>
{neq name="k" value="$ct_chunk_section_len"}
<div class="line"></div>
{/neq}
{/volist}
{notempty name="ct_more_section"}
<a href="{$ct_more_section.link}" class="more" style="padding: clamp(1.5rem, 3vw, 3rem) 0">
<div class="more-img">
{$ct_more_section.title}
</div>
</a>
{/notempty}
</div>
{/notempty}
{notempty name="data.footer_info"}
<!-- 底部 -->
<div class="prodline-footer-box">
<div class="prodline-footer-box-img">
<img src="{$data.footer_info.0.image}" alt="">
</div>
</div>
{/notempty}
<!-- 蒙版 -->
<div class="mask" id="mask">
<div class="mask-content" >
<span class="close-btn">&times;</span>
<div class="mask-scroll-content"></div>
</div>
</div>
{/block}
{block name="script"}
<script type="text/javascript">
let swiper=null;
const advantageItems = document.querySelectorAll('.advantage-card');
let scrollTop = 0; // 保存页面滚动位置
let closeBtnHtml = null; // 关闭按钮元素(全局变量,避免重复创建)
const mask = document.getElementById('mask');
const maskContent = document.querySelector('.mask-content');
const maskScrollContent = document.querySelector('.mask-scroll-content'); // 滚动容器(关键!)
const closeBtn = document.querySelector('.close-btn')
// 初始化:确保 maskScrollContent 存在于 maskContent 中(避免被清空)
if (!maskScrollContent) {
// 如果页面没有 mask-scroll-content动态创建确保结构稳定
const scrollContent = document.createElement('div');
scrollContent.className = 'mask-scroll-content';
maskContent.appendChild(scrollContent);
}
function createCloseBtn() {
if (closeBtnHtml) {
closeBtnHtml.remove();
}
closeBtnHtml = document.createElement('span');
closeBtnHtml.className = 'close-btn';
closeBtnHtml.innerHTML = '&times;';
closeBtnHtml.addEventListener('click', hideMask);
// 挂载到 maskContent而非 scrollContent避免被滚动影响位置
maskContent.prepend(closeBtnHtml);
}
function showMask(contentHtml) {
// 保存页面滚动位置
scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;
// 关键:将内容填充到 scrollContent 中(而非直接替换 maskContent
maskScrollContent.innerHTML = contentHtml;
createCloseBtn();
// 显示蒙版
mask.style.display = 'flex';
// 禁止滚动(复用你的逻辑)
document.documentElement.classList.add('no-scroll');
document.body.classList.add('no-scroll');
document.body.style.top = `-${scrollTop}px`;
// 额外:打开蒙版时就重置滚动位置(避免残留上次滚动状态)
maskScrollContent.scrollTop = 0;
}
function hideMask() {
// 关键步骤 1先重置 scrollContent 的滚动位置(此时元素还未被销毁)
maskScrollContent.scrollTop = 0;
// 关键步骤 2清空 scrollContent 的内容(而非 maskContent
maskScrollContent.innerHTML = "";
// 隐藏蒙版
mask.style.display = 'none';
// 恢复滚动(复用你的逻辑)
document.documentElement.classList.remove('no-scroll');
document.body.classList.remove('no-scroll');
document.body.style.top = '';
// 还原页面滚动位置
window.scrollTo(0, scrollTop);
// 移除关闭按钮(可选,避免残留)
if (closeBtnHtml) {
closeBtnHtml.remove();
closeBtnHtml = null;
}
}
// 点击卡片显示详情
advantageItems.forEach((item) => {
item.addEventListener('click', (e) => {
// 获取当前点击卡片内的.mack-conten-text元素
const currentMackContent = e.currentTarget.querySelector('.mack-conten-text');
if (currentMackContent) {
// 关键修改获取该元素的子内容innerHTML 本身就是内部HTML不含当前元素标签
// 若想更彻底,可遍历子节点拼接内容(兼容特殊场景)
let contentHtml = '';
Array.from(currentMackContent.childNodes).forEach(child => {
// 只保留元素节点和文本节点(过滤空节点)
if (child.nodeType === 1 || child.nodeType === 3) {
contentHtml += child.outerHTML || child.textContent;
}
});
// 显示蒙版并传入纯净的子内容
showMask(contentHtml);
}
});
});
// 关闭按钮事件
closeBtn.addEventListener('click', hideMask);
// 点击蒙版背景关闭(可选)
mask.addEventListener('click', (e) => {
if (e.target === mask) hideMask();
});
// ESC 键关闭(可选)
document.addEventListener('keydown', (e) => {
if (e.key === 'Escape' && mask.style.display === 'flex') hideMask();
});
// 关键:拦截蒙版的 touchmove 事件,阻止滚动穿透(移动端核心)
mask.addEventListener(
'touchmove',
(e) => {
// 只有点击蒙版背景(不是内容区域)才阻止滚动
if (e.target === mask) {
e.preventDefault(); // 阻止默认触摸滚动行为
e.stopPropagation(); // 阻止事件冒泡
}
},
{ passive: false }
); // passive: false 必须,否则 preventDefault 无效
const allVideos = document.querySelectorAll('.right-video');
// 停止所有视频播放
function stopAllVideos() {
allVideos.forEach((video) => {
video.pause();
video.style.display = 'none';
// 显示对应图片
const img = video.parentElement.querySelector('.right-img');
if (img) img.style.display = 'block';
});
}
// 滚动切换图片/视频(核心逻辑)
window.addEventListener('scroll', function () {
const productRights = document.querySelectorAll('.product-right');
let activeVideo = null;
// 找出当前在视口中的视频容器
productRights.forEach((rightContainer) => {
const img = rightContainer.querySelector('.right-img');
const video = rightContainer.querySelector('.right-video');
const videoSrc = video.src.trim()
if (!img || !video) return;
if(!videoSrc) return;
const rect = rightContainer.getBoundingClientRect();
// 视口判断容器进入视口50%以上视为活跃
const isInView =
rect.top < window.innerHeight * 0.7 &&
rect.bottom > window.innerHeight * 0.3;
if (isInView) {
activeVideo = video;
}
});
// 处理活跃视频
if (activeVideo) {
stopAllVideos(); // 先停止其他视频
const img = activeVideo.parentElement.querySelector('.right-img');
img.style.display = 'none';
activeVideo.style.display = 'block';
// 自动播放(兼容原生控制栏,用户手动暂停后不会强制播放)
if (activeVideo.paused) {
activeVideo.play().catch((err) => {
console.log('视频播放失败(浏览器限制):', err);
// 播放失败时回退到图片
activeVideo.style.display = 'none';
img.style.display = 'block';
});
}
} else {
stopAllVideos(); // 无活跃视频时停止所有播放
}
});
window.onload = function () {
if (typeof Swiper === 'undefined') {
console.error('Swiper加载失败请刷新页面重试');
return;
}
swiper = new Swiper('.auto-swiper-container', {
autoplay: {
delay: 3000, // 3秒切换
disableOnInteraction: false,
},
loop: false,
slidesPerView: 1,
spaceBetween: 0,
// 启用分页指示标(核心配置)
pagination: {
el: '.swiper-pagination', // 对应 HTML 中的指示标容器
clickable: true, // 允许点击指示标切换
// dynamicBullets: true, // 动态指示标(当前激活放大)
//dynamicMainBullets: 3, // 动态模式显示3个核心指示标
},
navigation: false,
scrollbar: false,
on: {
resize: function () {
this.update();
},
},
});
window.addEventListener('resize', function () {
swiper.update();
});
// 初始化时触发滚动事件,确保状态正确
window.dispatchEvent(new Event('scroll'));
};
</script>
{/block}

View File

@@ -18,7 +18,7 @@ if (!function_exists('image_domain_concat')) {
return $path;
}
return url_join($domain, $path);
return rtrim($domain, '/') . '/' . ltrim($path, '/');
}
}
@@ -39,7 +39,7 @@ if (!function_exists('video_domain_concat')) {
return $path;
}
return url_join($domain, $path);
return rtrim($domain, '/') . '/' . ltrim($path, '/');
}
}

View File

@@ -21,7 +21,7 @@
],
"require": {
"php": ">=8.0.0",
"topthink/framework": "8.1.2",
"topthink/framework": "^8.0",
"topthink/think-orm": "v3.0.34",
"topthink/think-filesystem": "^3.0",
"topthink/think-multi-app": "^1.1",

View File

@@ -2,12 +2,9 @@
// +----------------------------------------------------------------------
// | 控制台配置
// +----------------------------------------------------------------------
return [
// 指令定义
'commands' => [
'data:migrate' => \app\command\DataMigration::class,
'openapi:addclient' => \app\command\OpenApiMgr\AddClient::class,
],
];

View File

@@ -43,13 +43,13 @@ return [
// 磁盘类型
'type' => \filesystem\driver\Qiniu::class,
// bucker 名称
'bucket' => env('QINIU_CLOUD.BUCKET', 'orico-official-website'),
'bucket' => 'orico-official-website',
// 访问密钥
'access_key' => env('QINIU_CLOUD.ACCESS_KEY', 'dOsTum4a5qvhPTBbZRPX0pIOU7PZWRX7htKjztms'),
'access_key' => 'dOsTum4a5qvhPTBbZRPX0pIOU7PZWRX7htKjztms',
// 密钥
'secret_key' => env('QINIU_CLOUD.SECRET_KEY', 'KFxsGbnErkALFfeGdMa8QWTdodJbamMX0iznLe-q'),
'secret_key' => 'KFxsGbnErkALFfeGdMa8QWTdodJbamMX0iznLe-q',
// 外部URL
'base_url' => env('QINIU_CLOUD.BASE_URL', '//szw73dlk3.hn-bkt.clouddn.com'),
'base_url' => '//szw73dlk3.hn-bkt.clouddn.com',
// 路径
'path_prefix' => '/storage',
// 文件名称回调,可为文件名添加特定标志,以便可以在后续识别
@@ -70,13 +70,13 @@ return [
// 磁盘类型
'type' => \filesystem\driver\Qiniu::class,
// bucker 名称
'bucket' => env('QINIU_CLOUD.BUCKET', 'orico-official-website'),
'bucket' => 'orico-official-website',
// 访问密钥
'access_key' => env('QINIU_CLOUD.ACCESS_KEY', 'dOsTum4a5qvhPTBbZRPX0pIOU7PZWRX7htKjztms'),
'access_key' => 'dOsTum4a5qvhPTBbZRPX0pIOU7PZWRX7htKjztms',
// 密钥
'secret_key' => env('QINIU_CLOUD.SECRET_KEY', 'KFxsGbnErkALFfeGdMa8QWTdodJbamMX0iznLe-q'),
'secret_key' => 'KFxsGbnErkALFfeGdMa8QWTdodJbamMX0iznLe-q',
// 外部URL
'base_url' => env('QINIU_CLOUD.BASE_URL', '//szw73dlk3.hn-bkt.clouddn.com'),
'base_url' => '//szw73dlk3.hn-bkt.clouddn.com',
// 路径
'path_prefix' => '/storage/videos',
// 文件名称回调,可为文件名添加特定标志,以便可以在后续识别

View File

@@ -31,7 +31,7 @@ class CreateVideo extends Migrator
$table = $this->table('video', ['engine' => 'MyISAM', 'comment' => '视频表']);
$table->addColumn('language_id', 'integer', ['signed' => false , 'null' => false, 'comment' => '语言ID'])
->addColumn('category_id', 'integer', ['signed' => false , 'null' => false, 'comment' => '分类ID'])
->addColumn('name', 'string', ['limit' => 128 , 'null' => false, 'comment' => '名称'])
->addColumn('name', 'string', ['limit' => 64 , 'null' => false, 'comment' => '名称'])
->addColumn('desc', 'string', ['limit' => 512, 'null' => true, 'default' => null, 'comment' => '描述信息'])
->addColumn('image', 'string', ['limit' => 125, 'null' => true, 'default' => null, 'comment' => '封面图片'])
->addColumn('video', 'string', ['limit' => 125, 'null' => true, 'default' => null, 'comment' => '视频地址'])

View File

@@ -31,9 +31,7 @@ class CreateSysNavigationItem extends Migrator
$table->addColumn('nav_id', 'string', ['limit' => 64, 'null' => false, 'comment' => '所属导航ID'])
->addColumn('pid', 'integer', ['null' => false, 'default' => 0, 'comment' => '父级ID'])
->addColumn('name', 'string', ['limit' => 64, 'null' => false, 'comment' => '名称'])
->addColumn('desc', 'string', ['limit' => 255, 'null' => true, 'default' => null, 'comment' => '描述'])
->addColumn('icon', 'string', ['limit' => 64, 'null' => true, 'default' => null, 'comment' => '图标'])
->addColumn('image', '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', 'string', ['limit' => 255, 'null' => true, 'default' => null, 'comment' => '链接'])
->addColumn('sort', 'integer', ['limit' => 11, 'null' => false, 'default' => 0, 'comment' => '排序'])

View File

@@ -32,8 +32,6 @@ class CreateSysBannerItem extends Migrator
$table->addColumn('banner_id', 'integer', ['null' => false, 'comment' => '所属Banner ID'])
->addColumn('title', 'string', ['limit' => 256, 'null' => false, 'comment' => '标题'])
->addColumn('title_txt_color', 'string', ['limit' => 7, 'null' => false, 'default' => '', 'comment' => '标题文本颜色'])
->addColumn('short_title', 'string', ['limit' => 255, 'null' => true, 'comment' => 'banner简称'])
->addColumn('short_title_txt_color', 'string', ['limit' => 7, 'null' => true, 'comment' => 'banner简称文本颜色'])
->addColumn('desc', MysqlAdapter::PHINX_TYPE_TEXT, ['null' => true, 'default' => null, 'comment' => '描述'])
->addColumn('desc_txt_color', 'string', ['limit' => 7, 'null' => false, 'default' => '', 'comment' => '描述文本颜色'])
->addColumn('type', 'string', ['limit' => 16, 'null' => false, 'comment' => '类型: image为图片, video为视频'])
@@ -41,7 +39,7 @@ class CreateSysBannerItem extends Migrator
->addColumn('extra_image', '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', 'string', ['limit' => 510, 'null' => true, 'default' => null, 'comment' => '链接'])
->addColumn('link', 'string', ['limit' => 255, 'null' => true, 'default' => null, 'comment' => '链接'])
->addColumn('sort', 'integer', ['limit' => 11, 'null' => false, 'default' => 0, 'comment' => '排序'])
->addColumn('status', 'boolean', ['limit' => 1, 'null' => false, 'default' => 1, 'comment' => '-1为禁用, 1为启用'])
->addColumn('created_at', 'timestamp', ['null' => false, 'default' =>'CURRENT_TIMESTAMP', 'comment' => '创建时间'])

View File

@@ -1,50 +0,0 @@
<?php
use think\migration\Migrator;
use think\migration\db\Column;
class CreateProductCategoryRecommend extends Migrator
{
/**
* Change Method.
*
* Write your reversible migrations using this method.
*
* More information on writing migrations is available here:
* http://docs.phinx.org/en/latest/migrations.html#the-abstractmigration-class
*
* The following commands can be used in this method and Phinx will
* automatically reverse them when rolling back:
*
* createTable
* renameTable
* addColumn
* renameColumn
* addIndex
* addForeignKey
*
* Remember to call "create()" or "update()" and NOT "save()" when working
* with the Table class.
*/
public function change()
{
$table = $this->table('product_category_recommend', [
'engine' => 'MyISAM',
'collation' => 'utf8mb4_general_ci',
'comment' => '产品分类推荐表'
]);
$table->addColumn('language_id', 'integer', ['signed' => false, 'null' => false, 'comment' => '语言ID'])
->addColumn('category_id', 'integer', ['signed' => false, 'null' => false, 'comment' => '分类ID'])
->addColumn('title', 'string', ['limit' => 255, 'comment' => '标题'])
->addColumn('image', 'string', ['limit' => 255, 'default' => '', 'comment' => '图片'])
->addColumn('desc', 'string', ['limit' => 255, 'comment' => '描述'])
->addColumn('link', 'string', ['limit' => 500, 'default' => '', 'comment' => '外链地址'])
->addColumn('sort', 'integer', ['default' => 0, 'comment' => '排序'])
->addColumn('disabled', 'boolean', ['default' => 0, 'comment' => '是否禁用 0:启用 1:禁用'])
->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('deleted_at', 'timestamp', ['null' => true, 'comment' => '删除时间'])
->create();
}
}

View File

@@ -1,50 +0,0 @@
<?php
use think\migration\Migrator;
use think\migration\db\Column;
class SysMallStoreEntrance extends Migrator
{
/**
* Change Method.
*
* Write your reversible migrations using this method.
*
* More information on writing migrations is available here:
* http://docs.phinx.org/en/latest/migrations.html#the-abstractmigration-class
*
* The following commands can be used in this method and Phinx will
* automatically reverse them when rolling back:
*
* createTable
* renameTable
* addColumn
* renameColumn
* addIndex
* addForeignKey
*
* Remember to call "create()" or "update()" and NOT "save()" when working
* with the Table class.
*/
public function change()
{
$table = $this->table('sys_mall_store_entrance', [
'engine' => 'MyISAM',
'collation' => 'utf8mb4_general_ci',
'comment' => '系统商城店铺入口表'
]);
$table->addColumn('language_id', 'integer', ['signed' => false, 'null' => false, 'comment' => '语言ID'])
->addColumn('name', 'string', ['limit' => 255, 'null' => false, 'comment' => '商城名称'])
->addColumn('image', 'string', ['limit' => 255, 'default' => '', 'comment' => '图片'])
->addColumn('hover_image', 'string', ['limit' => 255, 'default' => '', 'comment' => '悬浮图'])
->addColumn('link', 'string', ['limit' => 500, 'default' => '', 'comment' => '链接地址'])
->addColumn('sort', 'integer', ['default' => 0, 'comment' => '排序'])
->addColumn('disabled', 'boolean', ['default' => 0, 'comment' => '是否禁用 0:启用 1:禁用'])
->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('deleted_at', 'timestamp', ['null' => true, 'comment' => '删除时间'])
->addIndex(['language_id'], ['name' => 'idx_language_id'])
->create();
}
}

View File

@@ -73,8 +73,8 @@ class SysConfigInit extends Seeder
["id" => 56, "group_id" => 12, "title" => "Instagram URL新窗口打开", "name" => "article_share_to_instagram.is_blank", "value" => "1", "extra" => "1:是\n0:否", "type" => "radio", "sort" => 6, "remark" => "", "created_at" => "2025-04-23 17:49:12", "updated_at" => "2025-06-12 09:55:21", "deleted_at" => null],
["id" => 57, "group_id" => 12, "title" => "Twitter URL新窗口打开", "name" => "article_share_to_twitter.is_blank", "value" => "1", "extra" => "1:是\n0:否", "type" => "radio", "sort" => 9, "remark" => "", "created_at" => "2025-04-23 17:49:12", "updated_at" => "2025-06-12 09:55:21", "deleted_at" => null],
["id" => 58, "group_id" => 12, "title" => "Reddit URL新窗口打开", "name" => "article_share_to_reddit.is_blank", "value" => "1", "extra" => "1:是\n0:否", "type" => "radio", "sort" => 12, "remark" => "", "created_at" => "2025-04-23 17:49:12", "updated_at" => "2025-06-12 09:55:21", "deleted_at" => null],
["id" => 59, "group_id" => 1, "title" => "产品询盘可选国家", "name" => "optional_country_for_product_inquiry", "value" => "Afghanistan\nAlbania\nAlgeria\nAmerican Samoa\nAndorra\nAngola\nAnguilla\nAntigua and Barbuda\nArgentina\nArmenia\nAruba\nAustralia\nAustria\nAzerbaijan\nAzores\nBahamas\nBahrain\nBangladesh\nBarbados\nBelarus\nBelgium\nBelize\nBenin\nBermuda\nBhutan\nBolivia\nBosnia and Herzegovina\nBotswana\nBrazil\nBrunei\nBulgaria\nBurkina Faso\nBurundi\nCambodia\nCameroon\nCanada\nCanarias\nCape Verde\nCayman\nCentral African Republic\nChad\nChile\nChina\nColombia\nComoros\nCongo (Congo-Kinshasa)\nCongo\nCook Islands\nCosta Rica\nCote D'Ivoire\nCroatia\nCuba\nCyprus\nCzech\nDenmark\nDjibouti\nDominica\nDominican\nEcuador\nEgypt\nEl Salvador\nEquatorial Guinea\nEritrea\nEstonia\nEthiopia\nFiji\nFinland\nFrance\nFrench Guiana\nFrench Polynesia\nGabon\nGambia\nGeorgia\nGermany\nGhana\nGreece\nGreenland\nGrenada\nGuadeloupe\nGuam\nGuatemala\nGuinea\nGuinea-Bissau\nGuyana\nHaiti\nHonduras\nHungary\nIceland\nIndia\nIndonesia\nIran\nIraq\nIreland\nIsrael\nItaly\nJamaica\nJapan\nJordan\nKazakhstan\nKenya\nKiribati\nKorea (North)\nKorea (South)\nKuwait\nKyrgyzstan\nLaos\nLatvia\nLebanon\nLesotho\nLiberia\nLibya\nLiechtenstein\nLithuania\nLuxembourg\nMacedonia\nMadagascar\nMadeira\nMalawi\nMalaysia\nMaldives\nMali\nMalta\nMarshall Islands\nMartinique\nMauritania\nMauritius\nMexico\nMicronesia\nMoldova\nMonaco\nMongolia\nHarmonyOS\nMorocco\nMozambique\nMyanmar\nNamibia\nNauru\nNepal\nNetherlands Antilles\nNetherlands\nNew Caledonia\nNew Zealand\nNicaragua\nNiger\nNiue\nNorthern Mariana\nNorway\nOman\nPakistan\nPalau\nPalestine\nPanama\nPapua New Guinea\nParaguay\nPeru\nPhilippines\nPitcairn Islands\nPoland\nPortugal\nPuerto Rico\nQatar\nReunion\nRomania\nRussian Federation\nRwanda\nSaint Helena\nSaint Kitts-Nevis\nSaint Lucia\nSaint Vincent and the Grenadines\nSamoa\nSan Marino\nSao Tome and Principe\nSaudi Arabia\nSenegal\nSerbia\nSeychelles\nSierra Leone\nSingapore\nSlovakia\nSlovenia\nSolomon Islands\nSomalia\nSouth Africa\nSpain\nSri Lanka\nSudan\nSuriname\nSwaziland\nSweden\nSwitzerland\nSyria\nTajikistan\nTanzania\nThailand\nThe British Virgin Islands\nThe United States Virgin Islands\nTimor-Leste\nTogo\nTokelau\nTonga\nTrinidad and Tobago\nTunisia\nTurkey\nTurkmenistan\nTurks and Caicos Islands\nTuvalu\nUganda\nUkraine\nUnited Arab Emirates\nUnited Kingdom\nUnited States\nUruguay\nUzbekistan\nVanuatu\nVatican City\nVenezuela\nVietnam\nWallis and Futuna\nWestern Sahara\nYemen\nZambia\nZimbabwe", "extra" => "", "type" => "textarea", "sort" => 7, "remark" => "", "created_at" => "2025-04-27 11:10:22", "updated_at" => "2025-06-11 17:09:13", "deleted_at" => null],
["id" => 60, "group_id" => 4, "title" => "产品询盘可选国家", "name" => "optional_country_for_product_inquiry", "value" => "Afghanistan\nAlbania\nAlgeria\nAmerican Samoa\nAndorra\nAngola\nAnguilla\nAntigua and Barbuda\nArgentina\nArmenia\nAruba\nAustralia\nAustria\nAzerbaijan\nAzores\nBahamas\nBahrain\nBangladesh\nBarbados\nBelarus\nBelgium\nBelize\nBenin\nBermuda\nBhutan\nBolivia\nBosnia and Herzegovina\nBotswana\nBrazil\nBrunei\nBulgaria\nBurkina Faso\nBurundi\nCambodia\nCameroon\nCanada\nCanarias\nCape Verde\nCayman\nCentral African Republic\nChad\nChile\nChina\nColombia\nComoros\nCongo (Congo-Kinshasa)\nCongo\nCook Islands\nCosta Rica\nCote D'Ivoire\nCroatia\nCuba\nCyprus\nCzech\nDenmark\nDjibouti\nDominica\nDominican\nEcuador\nEgypt\nEl Salvador\nEquatorial Guinea\nEritrea\nEstonia\nEthiopia\nFiji\nFinland\nFrance\nFrench Guiana\nFrench Polynesia\nGabon\nGambia\nGeorgia\nGermany\nGhana\nGreece\nGreenland\nGrenada\nGuadeloupe\nGuam\nGuatemala\nGuinea\nGuinea-Bissau\nGuyana\nHaiti\nHonduras\nHungary\nIceland\nIndia\nIndonesia\nIran\nIraq\nIreland\nIsrael\nItaly\nJamaica\nJapan\nJordan\nKazakhstan\nKenya\nKiribati\nKorea (North)\nKorea (South)\nKuwait\nKyrgyzstan\nLaos\nLatvia\nLebanon\nLesotho\nLiberia\nLibya\nLiechtenstein\nLithuania\nLuxembourg\nMacedonia\nMadagascar\nMadeira\nMalawi\nMalaysia\nMaldives\nMali\nMalta\nMarshall Islands\nMartinique\nMauritania\nMauritius\nMexico\nMicronesia\nMoldova\nMonaco\nMongolia\nHarmonyOS\nMorocco\nMozambique\nMyanmar\nNamibia\nNauru\nNepal\nNetherlands Antilles\nNetherlands\nNew Caledonia\nNew Zealand\nNicaragua\nNiger\nNiue\nNorthern Mariana\nNorway\nOman\nPakistan\nPalau\nPalestine\nPanama\nPapua New Guinea\nParaguay\nPeru\nPhilippines\nPitcairn Islands\nPoland\nPortugal\nPuerto Rico\nQatar\nReunion\nRomania\nRussian Federation\nRwanda\nSaint Helena\nSaint Kitts-Nevis\nSaint Lucia\nSaint Vincent and the Grenadines\nSamoa\nSan Marino\nSao Tome and Principe\nSaudi Arabia\nSenegal\nSerbia\nSeychelles\nSierra Leone\nSingapore\nSlovakia\nSlovenia\nSolomon Islands\nSomalia\nSouth Africa\nSpain\nSri Lanka\nSudan\nSuriname\nSwaziland\nSweden\nSwitzerland\nSyria\nTajikistan\nTanzania\nThailand\nThe British Virgin Islands\nThe United States Virgin Islands\nTimor-Leste\nTogo\nTokelau\nTonga\nTrinidad and Tobago\nTunisia\nTurkey\nTurkmenistan\nTurks and Caicos Islands\nTuvalu\nUganda\nUkraine\nUnited Arab Emirates\nUnited Kingdom\nUnited States\nUruguay\nUzbekistan\nVanuatu\nVatican City\nVenezuela\nVietnam\nWallis and Futuna\nWestern Sahara\nYemen\nZambia\nZimbabwe", "extra" => null, "type" => "textarea", "sort" => 7, "remark" => null, "created_at" => "2025-04-27 11:23:25", "updated_at" => "2025-06-12 09:55:21", "deleted_at" => null],
["id" => 59, "group_id" => 1, "title" => "产品询盘可选国家", "name" => "optional_country_for_product_inquiry", "value" => "Afghanistan\nAlbania\nAlgeria\nAmerican Samoa\nAndorra\nAngola\nAnguilla\nAntigua and Barbuda\nArgentina\nArmenia\nAruba\nAustralia\nAustria\nAzerbaijan\nAzores\nBahamas\nBahrain\nBangladesh\nBarbados\nBelarus\nBelgium\nBelize\nBenin\nBermuda\nBhutan\nBolivia\nBosnia and Herzegovina\nBotswana\nBrazil\nBrunei\nBulgaria\nBurkina Faso\nBurundi\nCambodia\nCameroon\nCanada\nCanarias\nCape Verde\nCayman\nCentral African Republic\nChad\nChile\nChina\nColombia\nComoros\nCongo (Congo-Kinshasa)\nCongo\nCook Islands\nCosta Rica\nCote D'Ivoire\nCroatia\nCuba\nCyprus\nCzech\nDenmark\nDjibouti\nDominica\nDominican\nEcuador\nEgypt\nEl Salvador\nEquatorial Guinea\nEritrea\nEstonia\nEthiopia\nFiji\nFinland\nFrance\nFrench Guiana\nFrench Polynesia\nGabon\nGambia\nGeorgia\nGermany\nGhana\nGreece\nGreenland\nGrenada\nGuadeloupe\nGuam\nGuatemala\nGuinea\nGuinea-Bissau\nGuyana\nHaiti\nHonduras\nHungary\nIceland\nIndia\nIndonesia\nIran\nIraq\nIreland\nIsrael\nItaly\nJamaica\nJapan\nJordan\nKazakhstan\nKenya\nKiribati\nKorea (North)\nKorea (South)\nKuwait\nKyrgyzstan\nLaos\nLatvia\nLebanon\nLesotho\nLiberia\nLibya\nLiechtenstein\nLithuania\nLuxembourg\nMacedonia\nMadagascar\nMadeira\nMalawi\nMalaysia\nMaldives\nMali\nMalta\nMarshall Islands\nMartinique\nMauritania\nMauritius\nMexico\nMicronesia\nMoldova\nMonaco\nMongolia\nMontserrat\nMorocco\nMozambique\nMyanmar\nNamibia\nNauru\nNepal\nNetherlands Antilles\nNetherlands\nNew Caledonia\nNew Zealand\nNicaragua\nNiger\nNiue\nNorthern Mariana\nNorway\nOman\nPakistan\nPalau\nPalestine\nPanama\nPapua New Guinea\nParaguay\nPeru\nPhilippines\nPitcairn Islands\nPoland\nPortugal\nPuerto Rico\nQatar\nReunion\nRomania\nRussian Federation\nRwanda\nSaint Helena\nSaint Kitts-Nevis\nSaint Lucia\nSaint Vincent and the Grenadines\nSamoa\nSan Marino\nSao Tome and Principe\nSaudi Arabia\nSenegal\nSerbia\nSeychelles\nSierra Leone\nSingapore\nSlovakia\nSlovenia\nSolomon Islands\nSomalia\nSouth Africa\nSpain\nSri Lanka\nSudan\nSuriname\nSwaziland\nSweden\nSwitzerland\nSyria\nTajikistan\nTanzania\nThailand\nThe British Virgin Islands\nThe United States Virgin Islands\nTimor-Leste\nTogo\nTokelau\nTonga\nTrinidad and Tobago\nTunisia\nTurkey\nTurkmenistan\nTurks and Caicos Islands\nTuvalu\nUganda\nUkraine\nUnited Arab Emirates\nUnited Kingdom\nUnited States\nUruguay\nUzbekistan\nVanuatu\nVatican City\nVenezuela\nVietnam\nWallis and Futuna\nWestern Sahara\nYemen\nZambia\nZimbabwe", "extra" => "", "type" => "textarea", "sort" => 7, "remark" => "", "created_at" => "2025-04-27 11:10:22", "updated_at" => "2025-06-11 17:09:13", "deleted_at" => null],
["id" => 60, "group_id" => 4, "title" => "产品询盘可选国家", "name" => "optional_country_for_product_inquiry", "value" => "Afghanistan\nAlbania\nAlgeria\nAmerican Samoa\nAndorra\nAngola\nAnguilla\nAntigua and Barbuda\nArgentina\nArmenia\nAruba\nAustralia\nAustria\nAzerbaijan\nAzores\nBahamas\nBahrain\nBangladesh\nBarbados\nBelarus\nBelgium\nBelize\nBenin\nBermuda\nBhutan\nBolivia\nBosnia and Herzegovina\nBotswana\nBrazil\nBrunei\nBulgaria\nBurkina Faso\nBurundi\nCambodia\nCameroon\nCanada\nCanarias\nCape Verde\nCayman\nCentral African Republic\nChad\nChile\nChina\nColombia\nComoros\nCongo (Congo-Kinshasa)\nCongo\nCook Islands\nCosta Rica\nCote D'Ivoire\nCroatia\nCuba\nCyprus\nCzech\nDenmark\nDjibouti\nDominica\nDominican\nEcuador\nEgypt\nEl Salvador\nEquatorial Guinea\nEritrea\nEstonia\nEthiopia\nFiji\nFinland\nFrance\nFrench Guiana\nFrench Polynesia\nGabon\nGambia\nGeorgia\nGermany\nGhana\nGreece\nGreenland\nGrenada\nGuadeloupe\nGuam\nGuatemala\nGuinea\nGuinea-Bissau\nGuyana\nHaiti\nHonduras\nHungary\nIceland\nIndia\nIndonesia\nIran\nIraq\nIreland\nIsrael\nItaly\nJamaica\nJapan\nJordan\nKazakhstan\nKenya\nKiribati\nKorea (North)\nKorea (South)\nKuwait\nKyrgyzstan\nLaos\nLatvia\nLebanon\nLesotho\nLiberia\nLibya\nLiechtenstein\nLithuania\nLuxembourg\nMacedonia\nMadagascar\nMadeira\nMalawi\nMalaysia\nMaldives\nMali\nMalta\nMarshall Islands\nMartinique\nMauritania\nMauritius\nMexico\nMicronesia\nMoldova\nMonaco\nMongolia\nMontserrat\nMorocco\nMozambique\nMyanmar\nNamibia\nNauru\nNepal\nNetherlands Antilles\nNetherlands\nNew Caledonia\nNew Zealand\nNicaragua\nNiger\nNiue\nNorthern Mariana\nNorway\nOman\nPakistan\nPalau\nPalestine\nPanama\nPapua New Guinea\nParaguay\nPeru\nPhilippines\nPitcairn Islands\nPoland\nPortugal\nPuerto Rico\nQatar\nReunion\nRomania\nRussian Federation\nRwanda\nSaint Helena\nSaint Kitts-Nevis\nSaint Lucia\nSaint Vincent and the Grenadines\nSamoa\nSan Marino\nSao Tome and Principe\nSaudi Arabia\nSenegal\nSerbia\nSeychelles\nSierra Leone\nSingapore\nSlovakia\nSlovenia\nSolomon Islands\nSomalia\nSouth Africa\nSpain\nSri Lanka\nSudan\nSuriname\nSwaziland\nSweden\nSwitzerland\nSyria\nTajikistan\nTanzania\nThailand\nThe British Virgin Islands\nThe United States Virgin Islands\nTimor-Leste\nTogo\nTokelau\nTonga\nTrinidad and Tobago\nTunisia\nTurkey\nTurkmenistan\nTurks and Caicos Islands\nTuvalu\nUganda\nUkraine\nUnited Arab Emirates\nUnited Kingdom\nUnited States\nUruguay\nUzbekistan\nVanuatu\nVatican City\nVenezuela\nVietnam\nWallis and Futuna\nWestern Sahara\nYemen\nZambia\nZimbabwe", "extra" => null, "type" => "textarea", "sort" => 7, "remark" => null, "created_at" => "2025-04-27 11:23:25", "updated_at" => "2025-06-12 09:55:21", "deleted_at" => null],
["id" => 61, "group_id" => 1, "title" => "导航位置店铺URL", "name" => "navigation_store_url", "value" => "https://oricotechs.com/", "extra" => null, "type" => "text", "sort" => 6, "remark" => null, "created_at" => "2025-05-13 17:45:46", "updated_at" => "2025-06-11 17:09:13", "deleted_at" => null],
["id" => 62, "group_id" => 4, "title" => "导航位置店铺URL", "name" => "navigation_store_url", "value" => "https://oricotechs.com/", "extra" => null, "type" => "text", "sort" => 6, "remark" => null, "created_at" => "2025-05-13 17:45:46", "updated_at" => "2025-06-12 09:55:21", "deleted_at" => null],
["id" => 63, "group_id" => 7, "title" => "邮箱", "name" => "website_email", "value" => "supports@orico.com.cn", "extra" => null, "type" => "text", "sort" => 1, "remark" => null, "created_at" => "2025-05-23 17:06:53", "updated_at" => "2025-06-11 17:09:13", "deleted_at" => null],
@@ -119,10 +119,6 @@ class SysConfigInit extends Seeder
["id" => 102, "group_id" => 13, "title" => "视频 - 唯一性保持", "name" => "upload_video.filemd5_unique", "value" => "1", "extra" => "0:否\n1:是", "type" => "radio", "sort" => 5, "remark" => "如果保持视频文件唯一,重复视频上传时将立即返回已存在的地址;如果不保持,则同模块同一天上传的文件根据原文件名覆盖。", "created_at" => "2025-06-12 11:24:24", "updated_at" => "2025-06-12 11:25:18", "deleted_at" => NULL],
["id" => 103, "group_id" => 13, "title" => "附件 - 保留原文件名", "name" => "upload_attachment.filename_keep", "value" => NULL, "extra" => "0:否\n1:是", "type" => "radio", "sort" => 6, "remark" => "默认为否", "created_at" => "2025-06-12 11:27:08", "updated_at" => "2025-06-12 11:27:08", "deleted_at" => NULL],
["id" => 104, "group_id" => 13, "title" => "附件 - 唯一性保持", "name" => "upload_attachment.filemd5_unique", "value" => "1", "extra" => "0:否\n1:是", "type" => "radio", "sort" => 7, "remark" => "如果保持附件文件唯一,重复附件上传时将立即返回已存在的地址;如果不保持,则同模块同一天上传的文件根据原文件名覆盖。", "created_at" => "2025-06-12 11:28:22", "updated_at" => "2025-06-12 11:28:22", "deleted_at" => NULL],
['id' => 105, 'group_id' => 13, 'title' => '视频 - 保存到', 'name' => 'upload_video.save_to', 'value' => 'qiniu_cloud', 'extra' => 'local:本地\nqiniu_cloud:七牛云', 'type' => 'radio', 'sort' => 6, 'remark' => '视频保存位置,默认为“本地” - [本地为本站点服务器;七牛云为七牛云对象存储,上传经这本站点服务器中转,上传耗时稍慢于“本地”]', 'created_at' => '2025-07-25 10:46:24', 'updated_at' => '2025-07-25 16:41:53', 'deleted_at' => NULL],
['id' => 106, 'group_id' => 13, 'title' => '附件 - 保存到', 'name' => 'upload_attachment.save_to', 'value' => 'local', 'extra' => 'local:本地\nqiniu_cloud:七牛云', 'type' => 'radio', 'sort' => 9, 'remark' => '附件保存位置,默认为“本地” - [本地为本站点服务器;七牛云为七牛云对象存储,上传经这本站点服务器中转,上传耗时稍慢于“本地”]', 'created_at' => '2025-07-25 10:51:34', 'updated_at' => '2025-07-25 16:41:53', 'deleted_at' => NULL],
['id' => 107, 'group_id' => 14, 'title' => '视频 - 保存到', 'name' => 'upload_video.save_to', 'value' => 'qiniu_cloud', 'extra' => 'local:本地\nqiniu_cloud:七牛云', 'type' => 'radio', 'sort' => 6, 'remark' => '视频保存位置,默认为“本地” - [本地为本站点服务器;七牛云为七牛云对象存储,上传经这本站点服务器中转,上传耗时稍慢于“本地”]', 'created_at' => '2025-07-25 10:46:24', 'updated_at' => '2025-07-25 16:41:53', 'deleted_at' => NULL],
['id' => 108, 'group_id' => 14, 'title' => '附件 - 保存到', 'name' => 'upload_attachment.save_to', 'value' => 'local', 'extra' => 'local:本地\nqiniu_cloud:七牛云', 'type' => 'radio', 'sort' => 9, 'remark' => '附件保存位置,默认为“本地” - [本地为本站点服务器;七牛云为七牛云对象存储,上传经这本站点服务器中转,上传耗时稍慢于“本地”]', 'created_at' => '2025-07-25 10:51:34', 'updated_at' => '2025-07-25 16:41:53', 'deleted_at' => NULL],
];
$table = $this->table('sys_config');

54
public/gitea_webhook.php Normal file
View File

@@ -0,0 +1,54 @@
<?php
try {
$secret_key = 'Aa-1221';
// check for POST request
if ($_SERVER['REQUEST_METHOD'] != 'POST') {
throw new \Exception('FAILED - not POST - '. $_SERVER['REQUEST_METHOD']);
}
// get content type
$content_type = isset($_SERVER['CONTENT_TYPE']) ? strtolower(trim($_SERVER['CONTENT_TYPE'])) : '';
if ($content_type != 'application/json') {
throw new \Exception('FAILED - not application/json - '. $content_type);
}
// get payload
$payload = trim(file_get_contents("php://input"));
if (empty($payload)) {
throw new \Exception('FAILED - no payload');
}
// get header signature
$header_signature = isset($_SERVER['HTTP_X_GITEA_SIGNATURE']) ? $_SERVER['HTTP_X_GITEA_SIGNATURE'] : '';
if (empty($header_signature)) {
throw new \Exception('FAILED - header signature missing');
}
// calculate payload signature
$payload_signature = hash_hmac('sha256', $payload, $secret_key, false);
// check payload signature against header signature
if ($header_signature !== $payload_signature) {
throw new \Exception('FAILED - payload signature');
}
// convert json to array
$decoded = json_decode($payload, true);
// check for json decode errors
if (json_last_error() !== JSON_ERROR_NONE) {
throw new \Exception('FAILED - json decode - '. json_last_error());
}
exec('git pull origin dev --rebase 2>&1', $result);
var_export($result);exit;
} catch (\Throwable $th) {
var_export($th->getMessage());
}

2
public/migrate_temp_images/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
*
!.gitignore

View File

@@ -23,7 +23,7 @@
.iotbt1 {
font-size: 18px;
font-family: HarmonyOS-Bold, HarmonyOS;
font-family: Montserrat-Bold, Montserrat;
padding-bottom: 24px;
padding-top: 40px;
font-weight: 700;
@@ -60,7 +60,7 @@
.iotbtp1 {
font-size: 14px;
font-family: HarmonyOS-Bold, HarmonyOS;
font-family: Montserrat-Bold, Montserrat;
font-weight: bold;
padding-bottom: 11px;
word-break: break-word;
@@ -69,7 +69,7 @@
.iotbts1 {
text-align: center;
font-size: 12px;
font-family: HarmonyOS-Medium, HarmonyOS;
font-family: Montserrat-Medium, Montserrat;
color: #9e9e9f;
word-break: break-word;
}
@@ -140,7 +140,7 @@
font-size: 14px;
padding-top: 12px;
text-align: center;
font-family: HarmonyOS-Medium, HarmonyOS;
font-family: Montserrat-Medium, Montserrat;
overflow-wrap: break-word;
word-break: break-word;
}
@@ -152,7 +152,7 @@
.sfbt1 {
text-align: center;
font-size: 18px;
font-family: HarmonyOS-Bold, HarmonyOS;
font-family: Montserrat-Bold, Montserrat;
font-weight: bold;
padding-bottom: 24px;
padding-top: 24px;
@@ -183,7 +183,7 @@
.cit {
width: 100%;
font-size: 14px;
font-family: HarmonyOS-Regular, HarmonyOS;
font-family: Montserrat-Regular, Montserrat;
color: #000;
display: flex;
flex-direction: row;
@@ -237,7 +237,7 @@
.wcu_s1 {
color: #000;
font: 16px;
font-family: HarmonyOS-Medium, HarmonyOS;
font-family: Montserrat-Medium, Montserrat;
font-weight: 500;
padding: 20px 24px;
}

View File

@@ -598,7 +598,7 @@
margin: auto;
font-size: 1rem;
color: #707070;
font-family: "HarmonyOS-Medium";
font-family: "Montserrat-Medium";
}
.oricoCnLc .gallery-thumbs .swiper-slide-thumb-active {
@@ -632,14 +632,14 @@
.oricoCnLc .info h5 {
font-size: #000;
font-size: 1rem;
font-family: "HarmonyOS-Bold";
font-family: "Montserrat-Bold";
padding: 2rem 2rem 0 1rem;
margin: 0;
}
.oricoCnLc .info p {
color: #707070;
font-family: "HarmonyOS-Regular";
font-family: "Montserrat-Regular";
padding: 1rem;
}
@@ -651,7 +651,7 @@
.oricoCnLc .m_ach-b .title {
font-size: 1.125rem;
font-family: "HarmonyOS-Bold";
font-family: "Montserrat-Bold";
width: 98%;
margin: auto;
position: relative;
@@ -660,7 +660,7 @@
.oricoCnLc .m_ach-b .chtitle {
font-size: 1.125rem;
font-family: "HarmonyOS-Bold";
font-family: "Montserrat-Bold";
width: 98%;
margin: auto;
position: relative;
@@ -677,7 +677,7 @@
.oricoCnLc .m_ch-title {
font-size: 1rem;
font-family: "HarmonyOS-Bold";
font-family: "Montserrat-Bold";
width: 98%;
margin: 1rem auto 0;
padding: 1rem 0 0;
@@ -690,7 +690,7 @@
font-size: 0.875;
line-height: 1.5rem;
color: #707070;
font-family: "HarmonyOS-Regular";
font-family: "Montserrat-Regular";
width: 98%;
margin: 1rem auto;
padding: 0;

View File

@@ -156,7 +156,7 @@
border-radius: 8px;
height: 48px;
box-shadow: none;
font-family: HarmonyOS-Regular, HarmonyOS;
font-family: Montserrat-Regular, Montserrat;
}
.oricoEGapp-articledetail .content .share_box .comment .comment_form>div input {

View File

@@ -33,7 +33,7 @@
border-radius: 1rem;
background-color: #fff;
color: #6b6c6e;
font-family: "HarmonyOS-Medium";
font-family: "Montserrat-Medium";
font-size: 0.875rem;
display: inline-block;
margin-bottom: 0.5rem;

View File

@@ -16,7 +16,7 @@
font-size: 18px;
color: #004bfa;
text-align: left;
font-family: HarmonyOS-Bold, HarmonyOS;
font-family: Montserrat-Bold, Montserrat;
font-weight: 700;
margin-top: 0;
margin-bottom: 12px;
@@ -27,7 +27,7 @@
color: #707070;
text-align: center;
text-align: left;
font-family: HarmonyOS-Medium, HarmonyOS;
font-family: Montserrat-Medium, Montserrat;
font-weight: 500;
}
@@ -83,7 +83,7 @@
.itlable {
font-size: 12.5px;
font-family: HarmonyOS-Medium, HarmonyOS;
font-family: Montserrat-Medium, Montserrat;
color: #000000;
font-weight: bold;
padding-bottom: 5px;
@@ -106,7 +106,7 @@
height: 48px;
border: none;
box-shadow: none;
font-family: HarmonyOS-Regular, HarmonyOS;
font-family: Montserrat-Regular, Montserrat;
}
.itselectopen {
@@ -130,12 +130,12 @@
padding: 15px;
background: #f2f2f2;
border-radius: 8px;
font-family: HarmonyOS-Regular, HarmonyOS;
font-family: Montserrat-Regular, Montserrat;
}
.bttj {
font-size: 14px;
font-family: HarmonyOS-Bold, HarmonyOS;
font-family: Montserrat-Bold, Montserrat;
font-weight: bold;
/* width: 212px; */
/* height: 48px; */
@@ -173,7 +173,7 @@
.iotbt1 {
font-size: 18px;
font-family: HarmonyOS-Bold, HarmonyOS;
font-family: Montserrat-Bold, Montserrat;
padding-bottom: 24px;
padding-top: 40px;
font-weight: 700;
@@ -210,7 +210,7 @@
.iotbtp1 {
font-size: 14px;
font-family: HarmonyOS-Bold, HarmonyOS;
font-family: Montserrat-Bold, Montserrat;
font-weight: bold;
padding-bottom: 11px;
word-break: break-word;
@@ -219,7 +219,7 @@
.iotbts1 {
text-align: center;
font-size: 12px;
font-family: HarmonyOS-Medium, HarmonyOS;
font-family: Montserrat-Medium, Montserrat;
color: #9e9e9f;
word-break: break-word;
}
@@ -290,7 +290,7 @@
font-size: 14px;
padding-top: 12px;
text-align: center;
font-family: HarmonyOS-Medium, HarmonyOS;
font-family: Montserrat-Medium, Montserrat;
overflow-wrap: break-word;
word-break: break-word;
}
@@ -302,7 +302,7 @@
.sfbt1 {
text-align: center;
font-size: 18px;
font-family: HarmonyOS-Bold, HarmonyOS;
font-family: Montserrat-Bold, Montserrat;
font-weight: bold;
padding-bottom: 24px;
padding-top: 24px;
@@ -333,7 +333,7 @@
.cit {
width: 100%;
font-size: 14px;
font-family: HarmonyOS-Regular, HarmonyOS;
font-family: Montserrat-Regular, Montserrat;
color: #000;
display: flex;
flex-direction: row;
@@ -388,7 +388,7 @@
.wcu_s1 {
color: #000;
font-size: 16px;
font-family: HarmonyOS-Medium, HarmonyOS;
font-family: Montserrat-Medium, Montserrat;
font-weight: 500;
padding: 20px 24px;
}

View File

@@ -16,7 +16,7 @@
font-size: 18px;
color: #004bfa;
text-align: left;
font-family: HarmonyOS-Bold, HarmonyOS;
font-family: Montserrat-Bold, Montserrat;
font-weight: 700;
margin-top: 0;
margin-bottom: 12px;
@@ -27,7 +27,7 @@
color: #707070;
text-align: center;
text-align: left;
font-family: HarmonyOS-Medium, HarmonyOS;
font-family: Montserrat-Medium, Montserrat;
font-weight: 500;
}
@@ -83,7 +83,7 @@
.itlable {
font-size: 12.5px;
font-family: HarmonyOS-Medium, HarmonyOS;
font-family: Montserrat-Medium, Montserrat;
color: #000000;
font-weight: bold;
padding-bottom: 5px;
@@ -106,7 +106,7 @@
height: 48px;
border: none;
box-shadow: none;
font-family: HarmonyOS-Regular, HarmonyOS;
font-family: Montserrat-Regular, Montserrat;
}
.itselectopen {
@@ -130,13 +130,13 @@
padding: 15px;
background: #f2f2f2;
border-radius: 8px;
font-family: HarmonyOS-Regular, HarmonyOS;
font-family: Montserrat-Regular, Montserrat;
border: 0;
}
.bttj {
font-size: 14px;
font-family: HarmonyOS-Bold, HarmonyOS;
font-family: Montserrat-Bold, Montserrat;
font-weight: bold;
/* width: 212px; */
padding: 15px 60px;
@@ -173,7 +173,7 @@
.iotbt1 {
font-size: 18px;
font-family: HarmonyOS-Bold, HarmonyOS;
font-family: Montserrat-Bold, Montserrat;
padding-bottom: 24px;
padding-top: 40px;
font-weight: 700;
@@ -210,7 +210,7 @@
.iotbtp1 {
font-size: 14px;
font-family: HarmonyOS-Bold, HarmonyOS;
font-family: Montserrat-Bold, Montserrat;
font-weight: bold;
padding-bottom: 11px;
word-break: break-word;
@@ -219,7 +219,7 @@
.iotbts1 {
text-align: center;
font-size: 12px;
font-family: HarmonyOS-Medium, HarmonyOS;
font-family: Montserrat-Medium, Montserrat;
color: #9e9e9f;
word-break: break-word;
}
@@ -290,7 +290,7 @@
font-size: 14px;
padding-top: 12px;
text-align: center;
font-family: HarmonyOS-Medium, HarmonyOS;
font-family: Montserrat-Medium, Montserrat;
overflow-wrap: break-word;
word-break: break-word;
}
@@ -302,7 +302,7 @@
.sfbt1 {
text-align: center;
font-size: 18px;
font-family: HarmonyOS-Bold, HarmonyOS;
font-family: Montserrat-Bold, Montserrat;
font-weight: bold;
padding-bottom: 24px;
padding-top: 24px;
@@ -333,7 +333,7 @@
.cit {
width: 100%;
font-size: 14px;
font-family: HarmonyOS-Regular, HarmonyOS;
font-family: Montserrat-Regular, Montserrat;
color: #000;
display: flex;
flex-direction: row;
@@ -387,7 +387,7 @@
.wcu_s1 {
color: #000;
font: 16px;
font-family: HarmonyOS-Medium, HarmonyOS;
font-family: Montserrat-Medium, Montserrat;
font-weight: 500;
padding: 20px 24px;
}

View File

@@ -7,7 +7,7 @@
margin-top: 3.3rem;
}
.oricoEGapp-Contact .banner_title {
font-family: "HarmonyOS-Bold";
font-family: "Montserrat-Bold";
font-size: 1.5rem;
position: absolute;
top: 50%;
@@ -24,7 +24,7 @@
color: #000;
}
.oricoEGapp-Contact .title {
font-family: "HarmonyOS-Bold";
font-family: "Montserrat-Bold";
font-size: 1rem;
}
.oricoEGapp-Contact .info {
@@ -43,12 +43,12 @@
height: 3rem;
}
.oricoEGapp-Contact .info .right .des {
font-family: "HarmonyOS-Regular";
font-family: "Montserrat-Regular";
font-size: 0.875rem;
line-height: 1.25rem;
}
.oricoEGapp-Contact .info_title {
font-family: "HarmonyOS-Bold";
font-family: "Montserrat-Bold";
font-size: 0.875rem;
line-height: 1.25rem;
margin-bottom: 0.22rem;
@@ -61,7 +61,7 @@
}
.oricoEGapp-Contact .question .title {
margin-top: 0.5rem;
font-family: "HarmonyOS-Bold";
font-family: "Montserrat-Bold";
font-size: 0.875rem;
line-height: 1.25rem;
}
@@ -86,7 +86,7 @@
.oricoEGapp-Contact .send {
display: block;
background-color: #004bfa;
font-family: "HarmonyOS-Bold";
font-family: "Montserrat-Bold";
font-size: 0.875rem;
padding: 0.75rem 1.5rem;
color: #fff;
@@ -98,7 +98,7 @@
color: #ee2f53;
}
.oricoEGapp-Contact .contact_b {
font-family: "HarmonyOS-SemiBold";
font-family: "Montserrat-SemiBold";
font-size: 1rem;
padding-top: 1.125rem;
padding-bottom: 1.125rem;
@@ -119,42 +119,42 @@
.oricoEGapp-Contact input::-webkit-input-placeholder {
color: #9e9e9f;
font-size: 0.875rem;
font-family: "HarmonyOS-Regular";
font-family: "Montserrat-Regular";
}
.oricoEGapp-Contact input:-moz-placeholder {
color: #9e9e9f;
font-size: 0.875rem;
font-family: "HarmonyOS-Regular";
font-family: "Montserrat-Regular";
}
.oricoEGapp-Contact input::-moz-placeholder {
color: #9e9e9f;
font-size: 0.875rem;
font-family: "HarmonyOS-Regular";
font-family: "Montserrat-Regular";
}
.oricoEGapp-Contact input:-ms-input-placeholder {
color: #9e9e9f;
font-size: 0.875rem;
font-family: "HarmonyOS-Regular";
font-family: "Montserrat-Regular";
}
.oricoEGapp-Contact textarea::-webkit-input-placeholder {
color: #9e9e9f;
font-size: 0.875rem;
font-family: "HarmonyOS-Regular";
font-family: "Montserrat-Regular";
}
.oricoEGapp-Contact textarea:-moz-placeholder {
color: #9e9e9f;
font-size: 0.875rem;
font-family: "HarmonyOS-Regular";
font-family: "Montserrat-Regular";
}
.oricoEGapp-Contact textarea::-moz-placeholder {
color: #9e9e9f;
font-size: 0.875rem;
font-family: "HarmonyOS-Regular";
font-family: "Montserrat-Regular";
}
.oricoEGapp-Contact textarea:-ms-input-placeholder {
color: #9e9e9f;
font-size: 0.875rem;
font-family: "HarmonyOS-Regular";
font-family: "Montserrat-Regular";
}
.oricoEGapp-Contact .narskfPage {
width: 100%;

View File

@@ -7,7 +7,7 @@
margin-top: 3.3rem;
}
.oricoEGapp-Contact .banner_title {
font-family: "HarmonyOS-Bold";
font-family: "Montserrat-Bold";
font-size: 1.5rem;
position: absolute;
top: 50%;
@@ -24,7 +24,7 @@
color: #000;
}
.oricoEGapp-Contact .title {
font-family: "HarmonyOS-Bold";
font-family: "Montserrat-Bold";
font-size: 1rem;
}
.oricoEGapp-Contact .info {
@@ -46,12 +46,12 @@
width: 88% !important;
}
.oricoEGapp-Contact .info .right .des {
font-family: "HarmonyOS-Regular";
font-family: "Montserrat-Regular";
font-size: 0.875rem;
line-height: 1.25rem;
}
.oricoEGapp-Contact .info_title {
font-family: "HarmonyOS-Bold";
font-family: "Montserrat-Bold";
font-size: 0.875rem;
line-height: 1.25rem;
margin-bottom: 0.22rem;
@@ -64,7 +64,7 @@
}
.oricoEGapp-Contact .question .title {
margin-top: 0.5rem;
font-family: "HarmonyOS-Bold";
font-family: "Montserrat-Bold";
font-size: 0.875rem;
line-height: 1.25rem;
}
@@ -89,7 +89,7 @@
.oricoEGapp-Contact .send {
display: block;
background-color: #004bfa;
font-family: "HarmonyOS-Bold";
font-family: "Montserrat-Bold";
font-size: 0.875rem;
padding: 0.75rem 1.5rem;
color: #fff;
@@ -101,7 +101,7 @@
color: #ee2f53;
}
.oricoEGapp-Contact .contact_b {
font-family: "HarmonyOS-SemiBold";
font-family: "Montserrat-SemiBold";
font-size: 1rem;
padding-top: 1.125rem;
padding-bottom: 1.125rem;
@@ -122,40 +122,40 @@
.oricoEGapp-Contact input::-webkit-input-placeholder {
color: #9e9e9f;
font-size: 0.875rem;
font-family: "HarmonyOS-Regular";
font-family: "Montserrat-Regular";
}
.oricoEGapp-Contact input:-moz-placeholder {
color: #9e9e9f;
font-size: 0.875rem;
font-family: "HarmonyOS-Regular";
font-family: "Montserrat-Regular";
}
.oricoEGapp-Contact input::-moz-placeholder {
color: #9e9e9f;
font-size: 0.875rem;
font-family: "HarmonyOS-Regular";
font-family: "Montserrat-Regular";
}
.oricoEGapp-Contact input:-ms-input-placeholder {
color: #9e9e9f;
font-size: 0.875rem;
font-family: "HarmonyOS-Regular";
font-family: "Montserrat-Regular";
}
.oricoEGapp-Contact textarea::-webkit-input-placeholder {
color: #9e9e9f;
font-size: 0.875rem;
font-family: "HarmonyOS-Regular";
font-family: "Montserrat-Regular";
}
.oricoEGapp-Contact textarea:-moz-placeholder {
color: #9e9e9f;
font-size: 0.875rem;
font-family: "HarmonyOS-Regular";
font-family: "Montserrat-Regular";
}
.oricoEGapp-Contact textarea::-moz-placeholder {
color: #9e9e9f;
font-size: 0.875rem;
font-family: "HarmonyOS-Regular";
font-family: "Montserrat-Regular";
}
.oricoEGapp-Contact textarea:-ms-input-placeholder {
color: #9e9e9f;
font-size: 0.875rem;
font-family: "HarmonyOS-Regular";
font-family: "Montserrat-Regular";
}

View File

@@ -1,7 +1,7 @@
@font-face {
font-family: 'icomoon';
src: url('../fonts/icomoon/icomoon.eot?11cuay');
src: url('../fonts/icomoon/icomoon.eot?11cuay#iefix') format('embedded-opentype'), url('../fonts/icomoon/icomoon.ttf?11cuay') format('opentype'),
src: url('../fonts/icomoon/icomoon.eot?11cuay#iefix') format('embedded-opentype'), url('../fonts/icomoon/icomoon.ttf?11cuay') format('truetype'),
url('../fonts/icomoon/icomoon.woff?11cuay') format('woff'), url('../fonts/icomoon/icomoon.svg?11cuay#icomoon') format('svg');
font-weight: normal;
font-style: normal;
@@ -54,7 +54,7 @@
font-family: 'colleciton';
src: url('../fonts/icomoon/colleciton/icomoon.eot?11cuay');
src: url('../fonts/icomoon/colleciton/icomoon.eot?11cuay#iefix') format('embedded-opentype'),
url('../fonts/icomoon/colleciton/icomoon.ttf?11cuay') format('opentype'), url('../fonts/icomoon/colleciton/icomoon.woff?11cuay') format('woff'),
url('../fonts/icomoon/colleciton/icomoon.ttf?11cuay') format('truetype'), url('../fonts/icomoon/colleciton/icomoon.woff?11cuay') format('woff'),
url('../fonts/icomoon/colleciton/icomoon.svg?11cuay#icomoon') format('svg');
font-weight: normal;
font-style: normal;
@@ -83,7 +83,7 @@
@font-face {
font-family: 'icomoon';
src: url('../fonts/icomoon/icomoona.eot?c46hgi');
src: url('../fonts/icomoon/icomoona.eot?c46hgi#iefix') format('embedded-opentype'), url('../fonts/icomoon/icomoona.ttf?c46hgi') format('opentype'),
src: url('../fonts/icomoon/icomoona.eot?c46hgi#iefix') format('embedded-opentype'), url('../fonts/icomoon/icomoona.ttf?c46hgi') format('truetype'),
url('../fonts/icomoon/icomoona.woff?c46hgi') format('woff'), url('../fonts/icomoon/icomoona.svg?c46hgi#icomoon') format('svg');
font-weight: normal;
font-style: normal;

View File

@@ -1,7 +1,7 @@
@font-face {
font-family: 'icomoon';
src: url('../fonts/icomoon/icomoon.eot?ujw7hy');
src: url('../fonts/icomoon/icomoon.eot?ujw7hy#iefix') format('embedded-opentype'), url('../fonts/icomoon/icomoon.ttf?ujw7hy') format('opentype'),
src: url('../fonts/icomoon/icomoon.eot?ujw7hy#iefix') format('embedded-opentype'), url('../fonts/icomoon/icomoon.ttf?ujw7hy') format('truetype'),
url('../fonts/icomoon/icomoon.woff?ujw7hy') format('woff'), url('../fonts/icomoon/icomoon.svg?ujw7hy#icomoon') format('svg');
font-weight: normal;
font-style: normal;
@@ -114,7 +114,7 @@
font-family: 'icomoon01';
src: url('fonts-20190124/icomoon.eot?ll2528');
src: url('fonts-20190124/icomoon.eot?ll2528#iefix') format('embedded-opentype'),
url('fonts-20190124/icomoon.ttf?ll2528') format('opentype'), url('fonts-20190124/icomoon.woff?ll2528') format('woff'),
url('fonts-20190124/icomoon.ttf?ll2528') format('truetype'), url('fonts-20190124/icomoon.woff?ll2528') format('woff'),
url('fonts-20190124/icomoon.svg?ll2528#icomoon') format('svg');
font-weight: normal;
font-style: normal;
@@ -161,7 +161,7 @@
@font-face {
font-family: 'icomoon02';
src: url('fonts/other/icomoon.eot?ujw7hy');
src: url('fonts/other/icomoon.eot?ujw7hy#iefix') format('embedded-opentype'), url('fonts/other/icomoon.ttf?ujw7hy') format('opentype'),
src: url('fonts/other/icomoon.eot?ujw7hy#iefix') format('embedded-opentype'), url('fonts/other/icomoon.ttf?ujw7hy') format('truetype'),
url('fonts/other/icomoon.woff?ujw7hy') format('woff'), url('fonts/other/icomoon.svg?ujw7hy#icomoon') format('svg');
font-weight: normal;
font-style: normal;
@@ -189,7 +189,7 @@
font-family: 'icomoon05';
src: url('fonts-20220322/icomoon.eot?cdcz43');
src: url('fonts-20220322/icomoon.eot?cdcz43#iefix') format('embedded-opentype'),
url('fonts-20220322/icomoon.ttf?cdcz43') format('opentype'), url('fonts-20220322/icomoon.woff?cdcz43') format('woff'),
url('fonts-20220322/icomoon.ttf?cdcz43') format('truetype'), url('fonts-20220322/icomoon.woff?cdcz43') format('woff'),
url('fonts-20220322/icomoon.svg?cdcz43#icomoon') format('svg');
font-weight: normal;
font-style: normal;

View File

@@ -29,7 +29,7 @@
display: none;
}
.oircoEgapp-head .top-menu .it-ct {
font-family: "HarmonyOS-SemiBold";
font-family: "Montserrat-SemiBold";
font-weight: bold;
}
.oircoEgapp-head .top-menu .it-ct .it-1 {

View File

@@ -1,45 +1,28 @@
@font-face {
font-family: "Montserrat";
src: url("../fonts/Montserrat-Regular.ttf") format("truetype");
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: "HarmonyOS";
src: url("//ow.static.f2b211.com/static/fonts/HarmonyOS_Sans_SC_Regular.ttf") format("opentype");
font-family: "Montserrat-Bold";
src: url("../fonts/Montserrat-Bold.ttf") format("truetype");
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: "HarmonyOS-Regular";
src: url("//ow.static.f2b211.com/static/fonts/HarmonyOS_Sans_SC_Regular.ttf") format("opentype");
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: "HarmonyOS-Bold";
src: url("//ow.static.f2b211.com/static/fonts/HarmonyOS_Sans_SC_Bold.ttf") format("opentype");
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: "HarmonyOS-Medium";
src: url("//ow.static.f2b211.com/static/fonts/HarmonyOS_Sans_SC_Medium.ttf") format("opentype");
font-weight: normal;
font-style: normal;
}
/* HarmonyOS-SemiBold1 */
@font-face {
font-family: "HarmonyOS-SemiBold";
src: url("//ow.static.f2b211.com/static/fonts/HarmonyOS_Sans_SC_Bold.ttf") format("opentype");
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: "HarmonyOS-Light";
src: url("//ow.static.f2b211.com/static/fonts/HarmonyOS_Sans_SC_Light.ttf") format("opentype");
font-family: "Montserrat-Medium";
src: url("../fonts/Montserrat-Medium.ttf") format("truetype");
font-weight: normal;
font-style: normal;
}
* {
margin: 0;
padding: 0;
font-family: 'HarmonyOS';
/* font-family: 'Montserrat'; */
-ms-overflow-style: none;
/* IE 和 Edge */
scrollbar-width: none;
@@ -105,7 +88,7 @@ a {
}
body {
font-family: 'HarmonyOS-SemiBold';
font-family: 'Montserrat-SemiBold';
}
/* 分页样式 */
@@ -178,9 +161,7 @@ body {
.ql-editor>* {
cursor: text
}
.ql-editor video{
max-width: 100% !important;
}
.ql-editor p,.ql-editor ol,.ql-editor ul,.ql-editor pre,.ql-editor blockquote,.ql-editor h1,.ql-editor h2,.ql-editor h3,.ql-editor h4,.ql-editor h5,.ql-editor h6 {
margin: 0;
padding: 0;

View File

@@ -1,30 +1,29 @@
@font-face {
font-family: "HarmonyOS";
src: url("//ow.static.f2b211.com/static/fonts/HarmonyOS_Sans_SC_Regular.woff2") format("woff2");
font-family: "Montserrat";
src: url("../fonts/Montserrat-Regular.ttf") format("truetype");
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: "HarmonyOS-Bold";
src: url("//ow.static.f2b211.com/static/fonts/HarmonyOS_Sans_SC_Bold.woff2") format("woff2");
font-family: "Montserrat-Bold";
src: url("../fonts/Montserrat-Bold.ttf") format("truetype");
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: "HarmonyOS-Medium";
src: url("//ow.static.f2b211.com/static/fonts/HarmonyOS_Sans_SC_Medium.woff2") format("woff2");
font-family: "Montserrat-Medium";
src: url("../fonts/Montserrat-Medium.ttf") format("truetype");
font-weight: normal;
font-style: normal;
}
/* HarmonyOS-SemiBold1 */
@font-face {
font-family: "HarmonyOS-SemiBold";
src: url("//ow.static.f2b211.com/static/fonts/HarmonyOS_Sans_SC_Bold.woff2") format("woff2");
font-family: "Montserrat-SemiBold";
src: url("../fonts/Montserrat-SemiBold.ttf") format("truetype");
font-weight: normal;
font-style: normal;
}
body {
font-family: 'HarmonyOS-SemiBold';
font-family: 'Montserrat-SemiBold';
margin: auto;
background-color: #f5f5f5;
max-width: 750px;
@@ -592,7 +591,7 @@ button.swiper-pagination-bullet {
.Innew-text .title {
font-size: 2.5rem;
padding-bottom: 1rem;
font-family: 'HarmonyOS-Bold';
font-family: 'Montserrat-Bold';
}
.Inpro-text {
padding: 2rem 0 0.8rem;
@@ -601,7 +600,7 @@ button.swiper-pagination-bullet {
.Inpro-text .title {
font-size: 1.5rem;
padding-bottom: 1rem;
font-family: 'HarmonyOS-Bold';
font-family: 'Montserrat-Bold';
}
.Innew-text .more {
@@ -636,7 +635,7 @@ video img {
font-size: 1.2rem;
max-height: 3rem;
overflow: hidden;
font-family: 'HarmonyOS-Bold';
font-family: 'Montserrat-Bold';
}
.inprotext .t-f16 {
font-size: 1rem;
@@ -958,12 +957,12 @@ video img {
margin: auto;
line-height: 2rem;
padding: 0 3rem;
font-family: 'HarmonyOS-Bold';
font-family: 'Montserrat-Bold';
}
.ban-t {
padding: 0.5rem 3rem;
font-size: 1.125rem;
font-family: 'HarmonyOS-Regular';
font-family: 'Montserrat-Regular';
}
.btn-more {
background: transparent;
@@ -980,7 +979,7 @@ video img {
margin: auto;
font-size: 1rem;
font-weight: 600;
font-family: 'HarmonyOS-Bold';
font-family: 'Montserrat-Bold';
}
/*类别*/
.category {
@@ -1096,11 +1095,11 @@ video img {
padding: 0.2rem 0;
text-align: center;
margin: 0;
font-family: 'HarmonyOS-Bold';
font-family: 'Montserrat-Bold';
}
.num-bg li p {
font-size: 0.8rem;
font-family: 'HarmonyOS-Regular';
font-family: 'Montserrat-Regular';
}
/*标题*/
.Tech-text {
@@ -1116,7 +1115,7 @@ video img {
.Tech-text p {
padding: 1rem 0;
font-size: 0.875rem;
font-family: 'HarmonyOS-Medium';
font-family: 'Montserrat-Medium';
}
.pos-text {
@@ -1126,7 +1125,7 @@ video img {
color: #fff;
font-size: 0.825rem;
margin: 0 auto;
font-family: 'HarmonyOS-Bold';
font-family: 'Montserrat-Bold';
height: 2rem;
overflow: hidden;
text-overflow: ellipsis;
@@ -1158,7 +1157,7 @@ video img {
font-size: 0.9rem;
padding: 1rem 0;
line-height: 1.3em;
font-family: 'HarmonyOS-Bold';
font-family: 'Montserrat-Bold';
word-break: break-all;
}
.faq span {
@@ -1173,7 +1172,7 @@ video img {
font-size: 0.875rem;
line-height: 1.75em;
color: #666;
font-family: 'HarmonyOS-Medium';
font-family: 'Montserrat-Medium';
}
.faq i {
position: absolute;
@@ -1210,7 +1209,7 @@ video img {
word-wrap: break-word;
overflow: hidden;
height: 1.5rem;
font-family: 'HarmonyOS-Medium';
font-family: 'Montserrat-Medium';
font-weight: 400;
word-break: break-all;
}
@@ -1218,7 +1217,7 @@ video img {
font-size: 1.125rem;
color: #7f7f7f;
padding-bottom: 1rem;
font-family: 'HarmonyOS-Medium';
font-family: 'Montserrat-Medium';
font-weight: 400;
}
/*foot */
@@ -1250,7 +1249,7 @@ video img {
}
.foot-in h3 {
font-size: 1.25rem;
font-family: 'HarmonyOS-Bold';
font-family: 'Montserrat-Bold';
font-weight: 100;
}
.logo-input {
@@ -1279,7 +1278,7 @@ video img {
margin-left: 1rem;
}
.foot-cate li {
min-width: 50%;
width: 50%;
display: inline-block;
float: left;
color: #fff;
@@ -1293,7 +1292,7 @@ video img {
.foot-cate li p {
font-size: 0.7rem;
line-height: 2.5rem;
font-family: 'HarmonyOS-Medium';
font-family: 'Montserrat-Medium';
word-wrap: break-word;
}
.foot-wei {
@@ -1328,7 +1327,7 @@ video img {
width: 100%;
height: 1.2rem;
cursor: pointer;
font-family: 'HarmonyOS-Medium';
font-family: 'Montserrat-Medium';
}
/*下拉*/
.m_footer .left {
@@ -1376,7 +1375,7 @@ video img {
text-align: center;
font-size: 12px;
padding-bottom: 0.5rem;
font-family: 'HarmonyOS-Medium';
font-family: 'Montserrat-Medium';
}
/*下拉*/
.mask-up {
@@ -1986,7 +1985,7 @@ video img {
}
.swiper-slide a {
color: #000;
font-family: 'HarmonyOS-SemiBold';
font-family: 'Montserrat-SemiBold';
}
.swiper-slide img {
max-width: 100%;
@@ -2343,59 +2342,6 @@ video img {
margin-bottom: 1.3rem;
}
.products_des {
width: 100%;
margin-bottom: 50px;
}
.products_des img {
width: 100%;
}
.de_t_n {
font-size: 1.5em;
color: #333;
}
.detail_title {
text-align: center;
padding: 2% 0;
}
.detail_title p {
line-height: 2em;
}
.detail_con_a {
margin: auto;
overflow: hidden;
}
.lj_detail_text,
.lj_detail_texts {
font-size: 0.875em;
}
.lj_detail_text p {
line-height: 1.6em;
padding: 0.5% 0;
}
/*seo-pro*/
.seo-pro h3 {
font-size: 1.5em;
text-align: center;
color: #333;
margin: 2% 0 1%;
line-height: 1.2;
font-weight: 400;
}
.seo-pro p {
text-align: center;
margin: 0 0 11px;
}
.seo-pro a {
color: #333;
text-decoration: none;
}
.sa_blue,
.sa_blue a,
.seo-pro a:hover {
color: #009fdf;
}
/*两列*/
.list_two {
width: 100%;
@@ -2492,7 +2438,7 @@ video img {
margin-right: 0px;
line-height: 40px;
font-weight: 600;
font-family: HarmonyOS !important;
font-family: Montserrat !important;
color: #666;
text-align: left;
}
@@ -3480,26 +3426,26 @@ video img {
font-size: 1.5rem;
width: 90%;
margin: 4rem auto 0;
font-family: 'HarmonyOS-Bold';
font-family: 'Montserrat-Bold';
}
.timedesin {
font-size: 0.875rem;
padding: 0.5rem 1rem;
line-height: 1.3rem;
width: 90%;
font-family: 'HarmonyOS-Medium';
font-family: 'Montserrat-Medium';
}
.timeblue {
color: #004bfa;
font-size: 1.125rem;
font-family: 'HarmonyOS-Medium';
font-family: 'Montserrat-Medium';
}
.timeblue img {
vertical-align: middle;
}
.timeblue a {
color: #004bfa;
font-family: 'HarmonyOS-Medium';
font-family: 'Montserrat-Medium';
}
/*视频*/
.video-youtu {
@@ -3559,7 +3505,7 @@ video img {
}
.vision-title {
font-size: 1rem;
font-family: 'HarmonyOS-Bold';
font-family: 'Montserrat-Bold';
width: 98%;
margin: 1rem auto 0;
}
@@ -3567,7 +3513,7 @@ video img {
font-size: 0.875;
line-height: 1.5rem;
color: #707070;
font-family: 'HarmonyOS-Regular';
font-family: 'Montserrat-Regular';
width: 98%;
margin: 1rem auto;
}
@@ -3585,7 +3531,7 @@ video img {
}
.brand_title {
font-size: 1.125rem;
font-family: 'HarmonyOS-Bold';
font-family: 'Montserrat-Bold';
width: 98%;
margin: 1rem auto 0;
position: relative;
@@ -3603,7 +3549,7 @@ video img {
font-size: 0.875;
line-height: 1.5rem;
color: #000000;
font-family: 'HarmonyOS-Regular';
font-family: 'Montserrat-Regular';
width: 98%;
margin: 1rem auto;
}
@@ -3656,7 +3602,7 @@ video::-webkit-media-controls-current-time-display {
}
.m_ach .title {
font-size: 1.125rem;
font-family: 'HarmonyOS-Bold';
font-family: 'Montserrat-Bold';
width: 98%;
margin: 1rem auto 0;
position: relative;
@@ -3681,7 +3627,7 @@ video::-webkit-media-controls-current-time-display {
}
.m_ach .list-num li p {
color: #707070;
font-family: 'HarmonyOS-Regular';
font-family: 'Montserrat-Regular';
}
/*新闻评测*/
.news-vertu {
@@ -3977,7 +3923,7 @@ video::-webkit-media-controls-current-time-display {
border-radius: 8px;
height: 48px;
box-shadow: none;
font-family: HarmonyOS-Regular, HarmonyOS;
font-family: Montserrat-Regular, Montserrat;
}
.comment_area {
width: 100% !important;

View File

@@ -1,40 +0,0 @@
.amd-box {
width: 100%;
position: relative;
max-width: 6.82rem;
margin: 0 auto;
margin-top: -0.86rem;
z-index: 1;
}
.amd-img-header,
.amd-img-main,
.amd-img-footer {
width: 100%;
max-width: 6.82rem;
}
.amd-img-main {
display: flex;
justify-content: space-between;
}
.amd-img-main-left,
.amd-img-main-right {
flex: 1;
max-width: 3.36rem;
display: block;
}
.amd-img-main-left img,
.amd-img-main-right img {
width: 3.36rem;
display: block;
margin-top: 0.1rem;
}
.amd-img-header img {
width: 6.82rem;
display: block;
}
.amd-img-footer img {
width: 6.82rem;
margin-top: 0.1rem;
display: block;
}

View File

@@ -1,50 +0,0 @@
.bly {
margin: 0 0.34rem;
aspect-ratio: 682/338;
/* max-height: 6.97rem; */
padding-top: 1.5rem;
}
.bly .ba-slider .handle:after {
position: absolute;
top: 50%;
/* 1. 缩小宽高从48px改为32px可根据需求再调比如28px/30px */
width: 0.32rem;
height: 0.32rem;
/* 2. 同步调整margin宽高的一半保证居中48px对应-24px32px对应-16px */
margin: -0.16rem 0 0 -0.16rem;
content: '';
display: flex;
align-items: center;
justify-content: center;
background: #fff
url('https://dev.ow.f2b211.com/static/index/pc/images/ba-arrow.png')
/* 3. 缩小背景箭头从22px改为16px匹配整体尺寸 */ center center /
0.16rem 0.16rem no-repeat;
border: 1px solid #fff;
border-radius: 50%;
transition: all 0.3s ease;
transform: scale(1);
z-index: 5;
box-shadow: none;
}
.bly .ba-slider .handle.ba-draggable:after {
transform: scale(0.8);
}
.bly-t {
font-size: 0.48rem;
color: #fff;
text-align: center;
width: 100%;
}
.bly-p {
font-size: 0.20rem;
color: #cbcfd8;
text-align: center;
width: 100%;
padding-top: 0.37rem;
padding-bottom: 0.56rem;
font-family: 'HarmonyOS-Light';
line-height: 1.5;
}

View File

@@ -1,50 +0,0 @@
.cpu {
margin-top: 1.5rem;
width: 100%;
aspect-ratio: 750/882;
position: relative;
}
.cpu-main {
width: 100%;
aspect-ratio: 750/882;
}
.cpu-texts-t {
color: #fff;
font-size: 0.48rem;
line-height: 1;
text-align: center;
padding-top: 0.19rem;
}
.cpu-texts-p {
color: #cbcfd8;
font-size: 0.20rem;
margin-top: 0.37rem;
line-height: 1;
text-align: center;
}
.cpu-footer {
position: absolute;
bottom: 0;
width: 100%;
display: flex;
flex-direction: column;
align-items: center;
}
.cpu-footer-img {
display: flex;
gap: 0.1rem;
}
.cpu-footer img {
width: 100%;
max-width: 1.48rem;
display: block;
}
.cpu-footer-desc {
font-size: 0.16rem;
color: #cbcfd8;
text-align: center;
margin-top: 0.38rem;
margin-bottom: 0.51rem;
width: 100%;
}

View File

@@ -1,59 +0,0 @@
.endurance {
position: relative;
width: 100%;
margin-top: 1.78rem;
aspect-ratio: 750/778;
}
.endurance-texts {
width: 100%;
display: flex;
flex-direction: column;
justify-content: center;
position: absolute;
top: -0.4rem;
}
.endurance-t {
width: 100%;
font-size: 0.5rem;
color: #fff;
text-align: center;
}
.endurance-t span:nth-child(1) {
font-size: 0.4rem;
line-height: 1;
}
.endurance-t span:nth-child(2) {
font-size: 0.48rem;
margin-left: 0.11rem;
line-height: 1;
}
.endurance-p {
font-size: 0.20rem;
color: #cbcfd8;
text-align: center;
padding-top: 0.37rem;
font-family: 'HarmonyOS-Light';
}
.endurance-img {
width: 100%;
position: absolute;
bottom: 0.62rem;
display: flex;
justify-content: center;
gap: 0.1rem;
}
.endurance-img img {
width: 2.46rem;
display: block;
}
.endurance-footer-p {
color: #ffffff;
font-size: 0.18rem;
position: absolute;
bottom: 0;
text-align: center;
left: 50%;
transform: translateX(-50%);
width: 100%;
}

View File

@@ -1,161 +0,0 @@
.footer-imgs {
width: 6.8rem;
margin: 0 auto;
margin-top: 1.5rem;
display: flex;
justify-content: space-between;
flex-wrap: wrap;
}
.footer-imgs img {
width: 2.22rem;
}
.footer-imgs img:nth-child(4),
.footer-imgs img:nth-child(5),
.footer-imgs img:nth-child(6) {
margin-top: 0.09rem;
}
.footer-texts {
width: 6.8rem;
margin: 1.5rem 0.35rem;
/* font-size: 0.16rem; */
color: #909399;
/* white-space: normal; */
/* margin-top: 1.5rem;
margin-bottom: 1.5rem; */
box-sizing: border-box;
}
.footer-texts p {
width: 6.8rem;
font-size: 0.16rem;
padding-left: 0.1rem;
text-indent: -0.2rem;
/* line-height: 1.5;
margin-bottom: 0.1rem; */
font-family: 'HarmonyOS-Light';
letter-spacing: 1px;
}
.footer-texts-en {
width: 6.8rem;
margin: 1.5rem 0.35rem;
/* font-size: 0.16rem; */
color: #909399;
/* white-space: normal; */
/* margin-top: 1.5rem;
margin-bottom: 1.5rem; */
box-sizing: border-box;
}
.footer-texts-en p {
width: 6.8rem;
font-size: 0.16rem;
padding-left: 0.1rem;
text-indent: -0.1rem;
/* line-height: 1.5;
margin-bottom: 0.1rem; */
font-family: 'HarmonyOS-Light';
/* letter-spacing: 1px; */
}
.oircoEgapp-foot .logo-white img {
margin: 0 auto;
}
.oircoEgapp-foot .m_footer {
display: flex;
/* flex-direction: row; */
align-items: center;
justify-content: center;
margin:0 4%;
padding-top: 0 !important;
}
/* .oircoEgapp-foot .m_footer .left,
.oircoEgapp-foot .foot-con {
display: flex;
flex-direction: row;
align-items: center;
} */
.oircoEgapp-foot .m_footer .right {
flex:1;
width: 50% !important;
display: flex !important;
justify-content: end !important;
/* max-width: 55%; */
}
.oircoEgapp-foot .m_footer .left {
flex:1 !important;
/* max-width: 40%;
justify-content: end;
margin-right: 4%; */
width: 50% !important;
display: flex;
justify-content: space-between;
}
.oircoEgapp-foot .foot-con span {
width: auto;
padding: 0 0.625rem;
}
.oircoEgapp-foot .foot-cate .clearfix li h3 {
margin-bottom: 10px;
}
.oircoEgapp-foot .foot-cate .clearfix li p,
.oircoEgapp-foot .foot-cate .clearfix li p a {
font-size: 12px;
}
.logo-white {
text-align: center;
padding: 1rem 0 0;
display: flex;
align-items: center;
}
.foot-cate {
padding: 0.16rem;
}
.foot-cate h3 {
font-size: 0.28rem;
}
.foot-cate li {
padding: 0.16rem 0;
min-height: 276px;
}
.foot-cate li p {
line-height: 40px;
}
.m_footer .right {
float: right;
width: 57%;
text-align: left;
}
.foot-con span {
font-size:14px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
-webkit-line-clamp: 1;
width: 100%;
height: auto;
cursor: pointer;
font-family: 'HarmonyOS-Medium';
}
.oircoEgapp-foot .foot-con span {
width: auto;
padding: 0 0.125rem;
}
.m_footer .left a{
display: flex;
align-items: center;
}
.m_footer .left img {
width: 30px;
padding-right:0 !important;
padding-top: 0;
}
/* .oircoEgapp-foot .m_footer .right {
max-width: 50%;
} */
.m_footer .right {
padding: 0 !important;
}

View File

@@ -1,69 +0,0 @@
.fs {
width: 100%;
}
.fs-box {
width: 100%;
aspect-ratio: 16/9;
}
.fs-img,
.fs-video {
backface-visibility: hidden; /* 开启硬件加速 */
transform: translateZ(0); /* 硬件加速 */
}
.fs-box img {
width: 100%;
}
.fs-box-img {
display: flex;
flex-wrap: wrap;
}
.fs-h-img {
width: 100%;
display: flex;
justify-content: center;
gap: 0.11rem;
}
.fs-h-img img {
width: 3.35rem;
aspect-ratio: 335/95;
}
.fs-b-img {
width: 100%;
display: flex;
justify-content: center;
margin-top: 0.1rem;
aspect-ratio: 681/122;
}
.fs-b-img img {
width: 6.81rem;
}
.fs-ts {
font-size: 0.18rem;
text-align: center;
color: #cbcfd8;
padding: 0.4rem 0;
}
.dl {
width: 100%;
padding-top: 1.01rem;
}
.dl-t {
color: #fff;
font-size: 0.48rem;
width: 100%;
text-align: center;
line-height: 1.5;
}
.dl-p {
color: #cbcfd8;
font-size: 0.20rem;
width: 100%;
text-align: center;
padding-top: 0.37rem;
/* padding-bottom: 0.37rem; */
line-height: 1.5;
font-family: 'HarmonyOS-Light';
}

View File

@@ -1,44 +0,0 @@
.gpu {
width: 100%;
position: relative;
box-sizing: border-box;
}
.gpu-texts {
color: #fff;
font-size: 0.48rem;
margin: 0 0.34rem;
}
.gpu-texts-t {
line-height: 1.5;
}
.gpu-texts-p {
font-size: 0.20rem;
color: #cbcfd8;
line-height: 1.5;
margin-top: 0.37rem;
}
.gpu-main-img {
width: 100%;
aspect-ratio: 750/780;
}
.gpu-amd-img {
width: 100%;
}
.gpu-amd-img img {
max-width: 2.26rem;
width: 100%;
margin-top: 2.39rem;
margin-left: 0.45rem;
}
.gpu-footer-imgs {
display: flex;
position: absolute;
bottom: 0.61rem;
gap: 0.1rem;
left: 50%;
transform: translateX(-50%);
}
.gpu-footer-imgs img {
max-width: 1.63rem;
}

View File

@@ -1,233 +0,0 @@
.oircoEgapp-head {
display: flex;
flex-direction: column;
width: 100%;
height: auto;
position: fixed;
top: 0;
z-index: 1000;
width: -webkit-fill-available;
}
.oircoEgapp-head .headtop {
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
padding: 0 0.16rem;
height:60px;
background: #fff;
}
.oircoEgapp-head .headtop .headerlogimg {
max-width: 140px;
min-width: 123px;
height: auto !important;
display: block;
/* height: 2.25rem; */
}
.oircoEgapp-head .top-menu {
background-color: #fff;
overflow: hidden;
width: 100%;
color: #000;
display: none;
}
.oircoEgapp-head .top-menu .it-ct {
font-family: "HarmonyOS-SemiBold";
font-weight: bold;
}
.oircoEgapp-head .top-menu .it-ct .it-1 {
padding: 0.16rem 3.5% 0.2rem;
border-bottom: 1px solid #e5e5e5;
font-size: 14px;
position: relative;
}
.oircoEgapp-head .top-menu .it-ct .it-1-more {
display: flex;
flex-direction: row;
justify-content: space-between;
padding-bottom: 1.5%;
}
.oircoEgapp-head .top-menu .it-ct .it-1-more i {
font-weight: bold;
}
.oircoEgapp-head .top-menu .it-ct .it-1-2 {
padding-left: 0.16rem;
font-size: 13px;
line-height: 1.8;
font-weight: 100;
font-weight: bold;
display: none;
}
.oircoEgapp-head .top-menu .it-ct .it-1-2 a {
color: #666;
}
.cursor_p span {
font-size: 22px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
-webkit-line-clamp: 1;
width: 100%;
/* height: 1.2rem; */
padding-left: 0.2rem;
}
.cursor_p span:hover {
font-size:22px;
white-space: normal;
width: 100%;
overflow: inherit;
line-height: 1.5;
}
/* .cursor_p {
height: 0.38rem !important;
} */
.img-responsive {
display: flex !important;
justify-content: center !important;
align-items: center !important;
}
.img-responsive span {
display: flex !important;
align-items: center !important;
}
.action-sheet {
border-top-left-radius: 10px;
border-top-right-radius: 10px;
display: none;
background: #fff;
width: 100%;
position: fixed;
bottom: 0;
z-index: 11111;
left: 0;
}
.menu-name {
text-indent: 0.2rem;
font-size: 14px;
font-weight: 700;
color: #000;
}
.action-sheet ul li {
margin: 0 10px;
color: #333;
font-size: 12px;
text-align: left;
border-bottom: 1px solid #eee;
padding: 12px 14px;
}
.action-sheet ul li a {
color: #333;
display: flex;
flex-direction: row;
align-items: center;
}
.action-sheet ul li img {
margin-right: 14px;
}
.menu-title {
display: flex;
align-items: center;
margin: 0 10px;
justify-content: space-between;
background: #fff;
border-top-left-radius: 6px;
border-top-right-radius:6px;
padding: 5px 0;
}
.close-icon {
width: 24px;
display: flex;
align-items: center;
}
.close-icon img {
width: 24px !important;
}
.title-text {
padding-top: 0.24rem;
color: #333;
font-size: 14px;
}
.title-text p {
line-height: 2;
}
.title-text p a {
color: #989898;
}
.title-text p a:hover {
color: #989898;
}
.marsk-container {
background: rgba(0, 0, 0, 0.8);
display: none;
position: absolute;
position: fixed;
top: 0;
right: 0;
left: 0;
bottom: 0px;
z-index: 9999;
}
.marsk-container-detail {
background: rgba(0, 0, 0, 0.8);
display: none;
position: absolute;
position: fixed;
top: 0;
right: 0;
left: 0;
bottom: 0px;
z-index: 9999;
}
.search-in {
margin-top:0.8rem;
}
.search-in input {
width: 70% !important;
height: 0.8rem;
background: #ffffff;
border: 1px solid #d6d6d6;
opacity: 1;
border-radius: 20px;
padding: 0 14px;
font-size: 14px;
}
::-webkit-input-placeholder {
color: #989898;
}
.search-button {
border: none;
font-size: 14px;
color: #fff;
position: absolute;
right: 10px;
cursor: pointer;
background: #0060ff;
height:0.7rem;
border-radius: 20px;
padding: 0 14px;
width: 22%;
}
.search-in form{
display: flex;
flex-direction: row;
align-items: center;
}
.search-in .title-text p a{
font-size: 14px;
}
/*头部搜索弹窗*/
.popup-quick {
width: 86%;
background-color: #fff;
z-index: 9999;
box-shadow: 0px 2px 5px rgba(255, 255, 255, 0.2);
color: #333;
padding: 14px;
border-radius: 5px;
margin: 14px auto 0;
position: relative;
margin-top: 1rem;
}

View File

@@ -1,42 +0,0 @@
* {
margin: 0;
padding: 0;
}
html {
width: 100% !important;
overflow-x: hidden;
margin: 0 !important;
padding: 0 !important;
max-width: 100vw !important;
}
body {
width: 100%;
background: #000;
overflow-x: hidden;
margin: 0 !important;
padding: 0 !important;
max-width: 100vw !important;
}
.f36{
font-size: 0.36rem !important;
font-family: "HarmonyOS-Medium" !important;
/* line-height: 1 !important; */
}
.f18{
font-size: 0.18rem !important;
line-height: 1.5 !important;
}
.lh1 {
line-height: 1 !important;
}
.f28 {
font-size: 0.28rem !important;
font-family: "HarmonyOS-Medium" !important;
}
.f48 {
font-size: 0.48rem !important;
line-height: 1 !important;
margin-bottom: 0.6rem !important;
font-family: "HarmonyOS-Medium" !important;
}

View File

@@ -1,43 +0,0 @@
.ips {
position: relative;
}
.ips-t {
font-size: 0.48rem;
color: #fff;
line-height: 1.5;
margin-top: 1.5rem;
margin-left: 0.38rem;
margin-right: 0.38rem;
margin-bottom: 0.46rem;
}
.ips-bg {
aspect-ratio: 750/678;
position: relative;
}
.ips-bg p {
font-size: 0.20rem;
color: #cbcfd8;
line-height: 1.5;
margin-left: 0.38rem;
margin-right: 0.38rem;
position: absolute;
top: -0.3rem;
}
.ips-imgs {
width: 6.8rem;
flex-wrap: wrap;
gap: 0.1rem;
position: absolute;
left: 50%;
transform: translateX(-50%);
bottom: -3rem;
display: flex;
}
.ips-imgs img {
width: 3.35rem;
display: block;
}
/* .ips-imgs img:nth-child(3),
.ips-imgs img:nth-child(4) {
margin-top: 0.1rem;
} */

View File

@@ -1,37 +0,0 @@
.m2 {
width: 100%;
margin-top: 1.09rem;
}
.m2-bg {
position: relative;
width: 100%;
aspect-ratio: 750/846;
}
.m2-bg-t1 {
font-size: 0.48rem;
color: #fff;
width: 100%;
text-align: center;
line-height: 1.5;
padding-top: 1.3rem;
}
.m2-bg-p {
color: #CBCFD8ff;
font-size: 0.18rem;
padding-top:0.37rem;
width: 100%;
text-align: center;
}
.m2-img-box {
position: absolute;
bottom: 0.66rem;
width: 100%;
display: flex;
justify-content: center;
gap: 0.11rem;
}
.m2-img-box img {
width: 2.22rem;
}

View File

@@ -1,39 +0,0 @@
.memory {
width: 100%;
}
.memory-t {
font-size: 0.48rem;
color: #fff;
width: 100%;
text-align: center;
padding-bottom: 0.37rem;
line-height: 1.5;
}
.memory-img {
width: 100%;
aspect-ratio: 750/727;
position: relative;
}
.memory-p {
width: 100%;
font-size: 0.20rem;
color: #cbcfd8;
text-align: center;
line-height: 1.5;
}
.memory-footer-img {
position: absolute;
left: 50%;
transform: translateX(-50%);
bottom: -0.74rem;
width: 6.83rem;
}
.memory-footer-img p {
height:0;
}
.memory-footer-img img {
width: 6.83rem;
display: block;
aspect-ratio: 683/148;
}

Some files were not shown because too many files have changed in this diff Show More