61 Commits

Author SHA1 Message Date
80291c6a6a refactor: 优化图片迁移脚本
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 4s
2026-05-09 11:53:07 +08:00
3d7ed2c16b 跳轉调整
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 5s
2026-05-08 09:30:38 +08:00
ade2c6bea8 添加懒加载
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 4s
2026-05-06 15:37:45 +08:00
2f4b0f8b76 mobile - topic ssd
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 4s
2026-05-06 14:39:04 +08:00
9fcdea0061 移动端闪存
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 4s
2026-05-06 13:37:29 +08:00
d7d8e2aa77 外边距设置
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 3s
2026-05-06 11:50:06 +08:00
cfe07c9df5 换背景色
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 4s
2026-05-06 11:48:51 +08:00
5eb49defe1 admin - system 内页
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 3s
2026-05-06 11:39:11 +08:00
00e8eed191 topic ssd data
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 5s
2026-05-06 11:34:57 +08:00
aeec3e4f0d 闪存
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 3s
2026-05-06 10:50:48 +08:00
251a13c368 feat: topic ssd
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 4s
2026-05-06 10:28:46 +08:00
b75a159d70 修复蒙版遮盖下划线
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 4s
2026-04-17 12:28:21 +08:00
40d4a41461 优化产品列表右侧图片间距
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 2s
2026-04-17 10:45:26 +08:00
456b2ede8a 产品列表图片间距
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 3s
2026-04-17 10:31:33 +08:00
322cfad5d9 调整弹窗和防抖
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 3s
2026-04-17 10:08:15 +08:00
9b732b19dc 修改变量重名
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 3s
2026-04-16 15:57:48 +08:00
1d62a64014 删除无用备份
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 3s
2026-04-16 15:02:02 +08:00
4447aa4a39 整体滚动
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 4s
2026-04-16 14:42:13 +08:00
53a317c8cf 侧边栏圆角动画
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 3s
2026-04-16 11:03:14 +08:00
b269e18547 fix: 系统商城购买入口地址必须是有效url
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 3s
2026-04-16 09:35:01 +08:00
04efd7ef4a 修改圆角和背景色
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 3s
2026-04-16 09:30:37 +08:00
dc74a1ee10 修复样式问题
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 2s
2026-04-15 17:10:45 +08:00
9b661405c9 refactor: mobile 产品classify.html
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 3s
2026-04-15 16:41:33 +08:00
1ed900d2b5 修改移动端样式
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 3s
2026-04-15 16:37:32 +08:00
d6ce8aa2be refactor: pc header.html
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 3s
2026-04-15 14:19:44 +08:00
4b5dae8714 fix: pc header修复产品分类关联推荐产品未过滤已禁用的
Some checks failed
Gitea Actions Official-website / deploy-dev (push) Failing after 3s
2026-04-15 14:05:56 +08:00
cf670b24f8 refactor: pc header 一级产品分类添加点击跳转链接
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 2s
2026-04-15 11:08:55 +08:00
cf1c78c882 跳转
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 2s
2026-04-15 11:05:47 +08:00
adef3c1e2e 样式调整
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 3s
2026-04-15 11:00:27 +08:00
180b5db570 refactor: pc header 三级产品分类改为显示5个
Some checks failed
Gitea Actions Official-website / deploy-dev (push) Failing after 4s
2026-04-15 10:52:02 +08:00
a18ff844a4 调整产品列表
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 4s
2026-04-14 17:35:27 +08:00
80d3aa8160 refactor: pc header数据改两列显示
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 4s
2026-04-14 16:57:19 +08:00
d79b418310 样式调整
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 4s
2026-04-14 16:23:17 +08:00
816d85a744 购买弹窗交互修改
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 3s
2026-04-14 10:45:22 +08:00
2d078033fa 悬浮图判断
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 4s
2026-04-13 15:15:29 +08:00
d430f04b41 定位层级调整
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 3s
2026-04-11 15:30:57 +08:00
aaf73a0803 修复下划线不显示
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 3s
2026-04-11 11:34:58 +08:00
7baac33d0d 弹窗关闭
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 3s
2026-04-11 11:11:48 +08:00
f2f59e9528 隐藏下拉框
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 3s
2026-04-11 10:54:53 +08:00
a9abb16fcb 样式调整
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 2s
2026-04-11 10:45:49 +08:00
7ff746267b 产品列表图片倒序调整
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 3s
2026-04-11 10:27:20 +08:00
bc9f233cb2 修改边距
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 3s
2026-04-11 10:12:00 +08:00
2c4eb38495 调整列表
Some checks failed
Gitea Actions Official-website / deploy-dev (push) Failing after 3s
2026-04-11 10:11:25 +08:00
347ebddb97 移动端header间距兼容
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 2s
2026-04-10 15:27:36 +08:00
93a72c7826 兼容header
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 4s
2026-04-10 15:18:53 +08:00
9748a3008e fix: pc header
Some checks failed
Gitea Actions Official-website / deploy-dev (push) Failing after 3s
2026-04-10 09:26:02 +08:00
2c20bd2649 返回功能
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 4s
2026-04-09 13:58:36 +08:00
ff8e23766a 固定图片宽高
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 3s
2026-04-09 11:45:15 +08:00
81f01e1424 替换pc图片
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 3s
2026-04-09 10:52:52 +08:00
b6b5ea5308 拆分css样式
Some checks failed
Gitea Actions Official-website / deploy-dev (push) Failing after 2s
2026-04-09 10:52:13 +08:00
62db7e8cb2 分离css代码
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 3s
2026-04-09 10:38:17 +08:00
ba2b343d0a 添加箭头
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 3s
2026-04-08 17:40:31 +08:00
83be5a7c0b feat: mobile端classify页面
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 4s
2026-04-08 16:26:29 +08:00
ce38172cd6 样式合并
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 2s
2026-04-08 14:26:50 +08:00
5262ece276 产品分类
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 3s
2026-04-08 14:25:09 +08:00
86cc41b78c logo跳首页
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 2s
2026-04-08 13:59:22 +08:00
f5a891e00e 菜单固定定位
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 2s
2026-04-08 13:55:52 +08:00
184e81737e header搜索框样式错乱调整
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 4s
2026-04-08 13:54:02 +08:00
eb015c552f header悬浮图
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 3s
2026-04-08 11:28:21 +08:00
685cd53b1a refactor: mobile header
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 4s
2026-04-08 11:20:54 +08:00
2c3e309d2a fix: pc header 2026-04-08 11:20:39 +08:00
53 changed files with 3430 additions and 2915 deletions

View File

@@ -366,6 +366,18 @@ class System
'url' => (string)url('/index/topic/laptop/index')
],
]
],
[
'id' => 9,
'name' => '闪存SSD专题',
'url' => '',
'children' => [
[
'id' => 101,
'name' => '首页',
'url' => (string)url('/index/topic/ssd/index')
],
]
]
];
}
@@ -413,7 +425,7 @@ class System
break;
}
if (empty($data)) return [];
return [
'id' => $data['id'],
'name' => $data['name'],
@@ -438,4 +450,4 @@ class System
return [];
}
}
}

View File

@@ -19,7 +19,7 @@ class SysMallStoreEntranceValidate extends Validate
'name' => 'require|max:255',
'image' => 'require|max:255',
'hover_image' => 'max:255',
'link' => 'max:500',
'link' => 'url|max:500',
'sort' => 'require|integer',
'disabled' => 'in:0,1',
];
@@ -40,6 +40,7 @@ class SysMallStoreEntranceValidate extends Validate
'image.require' => '图片不能为空',
'image.max' => '图片长度不能超过:rule个字符',
'hover_image.max' => '悬浮图长度不能超过:rule个字符',
'link.url' => '链接地址必须是有效的URL',
'link.max' => '链接地址长度不能超过:rule个字符',
'sort.require' => '排序不能为空',
'sort.integer' => '排序必须是整数',

View File

@@ -93,7 +93,7 @@ abstract class Common extends BaseController
])
->when($with_recommends, function($query) {
$query->with(['recommends' => function($query) {
$query->field(['id', 'category_id', 'title', 'image', 'desc', 'link'])
$query->field(['id', 'category_id', 'title', 'image', 'desc', 'link'])->disabled(false)
->order(['sort' => 'asc', 'id' => 'desc']);
}]);
})
@@ -120,7 +120,13 @@ abstract class Common extends BaseController
}
$children = $this->toTreeAndChunk($categorys, $item['id'], $lv);
if (!empty($children)) {
$item['children'] = $item['level'] == 1 ? array_chunk($children, 2) : $children;
if ($lv == 1) {
$item['children'] = array_chunk($children, 2);
} else if ($lv == 2) {
$item['children'] = array_chunk($children, 3);
} else {
$item['children'] = $children;
}
}
$ret[] = $item;
}

View File

@@ -149,7 +149,7 @@ class Product extends Common
}
}
View::assign('list', $list);
return View::fetch('category');
}
// 产品分类 - 查看子类
@@ -267,6 +267,59 @@ class Product extends Common
return View::fetch('subcategory');
}
/**
* 单纯分类页
*/
public function classify()
{
$pid = request()->param('id/d', 0);
// 获取当前选中的父分类
$parent = ProductCategoryModel::field(['id', 'name'])->find($pid);
View::assign('parent', $parent);
// 获取分类及产品信息
$categorys = ProductCategoryModel::field(['id', 'pid', 'name', 'path', 'level'])
->language($this->lang_id)
->displayed(true)
->children($pid)
->order(['pid' => 'asc', 'sort' => 'asc', 'id' => 'desc'])
->select()
->toArray();
// 组装第三级分类所属产品数据
$lv3_id_arr = array_column(array_filter($categorys, fn($item)=> $item['level'] === 3), 'id');
$products = ProductModel::field([
'id',
'category_id',
'name',
'short_name',
'cover_image',
'spu'
])
->byCategory($lv3_id_arr)
->language($this->lang_id)
->enabled(true)
->onSale(true)
->onShelves(true)
->select()
->toArray();
$product_groups = [];
foreach ($products as $product) {
$product_groups[$product['category_id']][] = $product;
}
foreach ($categorys as $key => $category) {
if ($category['level'] < 3) continue;
$categorys[$key]['products'] = $product_groups[$category['id']] ?? [];
}
$tree = array_to_tree($categorys, $pid);
View::assign('categorys', $tree);
return View::fetch('classify');
}
/**
* 产品搜索
*/
@@ -329,7 +382,7 @@ class Product extends Common
->bypk($param['id'])
->find();
View::assign('product', $product);
$product_categorys = [];
$product_params = [];
$product_skus = [];
@@ -352,7 +405,7 @@ class Product extends Common
->order(['id' => 'asc'])
->select()
->toArray();
// 获取产品参数信息
$product_params = ProductParamsModel::field(['id', 'name', 'value'])
->byProductId($product['id'])
@@ -375,7 +428,7 @@ class Product extends Common
$attrs = ProductAttrModel::bypks(array_unique(Arr::pluck($sku_attrs, 'attr_id')))->column(['attr_name'], 'id');
foreach ($sku_attrs as $v) {
if (empty($v['attr_value'])) continue;
$v['attr_name'] = $attrs[$v['attr_id']]?? '';
// 按属性分组
$product_sku_attrs[$v['attr_id']]['attr_id'] = $v['attr_id'];
@@ -422,8 +475,8 @@ class Product extends Common
// 获取询盘可选国家
$config = $this->basic_config['optional_country_for_product_inquiry'];
View::assign('country_list', explode(',', preg_replace('/\r?\n/', ',', $config['value']?? '')));
View::assign('country_list', explode(',', preg_replace('/\r?\n/', ',', $config['value']?? '')));
return View::fetch('detail');
}
@@ -535,7 +588,7 @@ class Product extends Common
if ($val['level'] != 2) {
continue;
}
foreach ($pro_map as $k => $pro) {
if (in_array($val['id'], explode(',', strval($k)))) {
$newpros[] = [
@@ -549,7 +602,7 @@ class Product extends Common
}
}
View::assign('newpros', $newpros);
return View::fetch('newpro');
}
}

View File

@@ -0,0 +1,52 @@
<?php
declare (strict_types = 1);
namespace app\index\controller;
use app\index\model\SysBannerModel;
use think\facade\View;
/**
* 专题 - SSD
*/
class TopicSsd extends Common
{
/**
* 专题 - SSD首页
*/
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_69faaf8582967', // 专题 - 闪存SSD首页 - 焦点图
'BANNER_69fab1bed8f71', // 专题 - 闪存SSD首页 - 产品
])
->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_69faaf8582967')?->items->toArray();
// 产品
$data['products'] = data_get($banners_map, 'BANNER_69fab1bed8f71')?->items->toArray();
}
View::assign('data', $data);
return View::fetch('index');
}
}

View File

@@ -6,6 +6,9 @@ return [
'产品列表' => 'Products',
'搜索' => 'Search',
'搜索历史' => 'Search History',
'请输入搜索关键词' => 'Please enter a search keyword',
'搜索记录' => 'Search History',
'清空' => 'Clear',
'请择地区' => 'SELECT A REGION',
'产品' => 'Product',
'联系方式' => 'Contact',

View File

@@ -22,4 +22,9 @@ class ProductCategoryRecommendModel extends ProductCategoryRecommendBaseModel
{
$query->where($this->getTable() . '.language_id', '=', $language);
}
public function scopeDisabled($query, $disabled = true)
{
$query->where($this->getTable() . '.disabled', '=', (int)$disabled);
}
}

View File

@@ -18,6 +18,8 @@ Route::group('product', function () {
Route::get('category/:id', 'Product/category');
// 产品分类 - 查看子类
Route::get('subcategory/:id', 'Product/subcategory');
// 单纯分类页
Route::get('classify/:id', 'Product/classify');
// 产品详情页
Route::get('detail/:id', 'Product/detail');
// 产品询盘
@@ -117,6 +119,12 @@ Route::group('topic', function () {
// 专题 - 笔记本电脑首页
Route::get('index', 'TopicLaptop/index');
});
// 专题 - SSD
Route::group('ssd', function() {
// 专题 - SSD首页
Route::get('index', 'TopicSsd/index');
});
});
// 数据迁移

View File

@@ -9,7 +9,7 @@
<!-- banner-->
<div class="oidx-banner">
{notempty name="focus_images"}
<div class="swiper-container bannerswiper">
<div class="swiper-container bannerswiper" style="background: #fff;">
<div class="swiper-wrapper">
{volist name="focus_images" id="fi"}
<div class="swiper-slide">

View File

@@ -0,0 +1,225 @@
{extend name="public/base" /}
{block name="style"}
<link rel="stylesheet" href="__CSS__/category.css">
<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 / 8.04; // 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>
{/block}
{block name="main"}
<!-- 顶部返回栏(已完全按图纸修改) -->
<div class="top-box">
<div class="top-bar">
<div class="back">
<image src="__IMAGES__/left.png"></image>
</div>
<div class="title">{$parent.name|default=''}</div>
</div>
</div>
<div class="main">
<!-- 左侧导航 -->
{if condition="!empty($categorys)"}
<ul class="sidebar">
{volist name="categorys" id="category"}
<li class="nav-item {eq name='$key' value='0'}active{/eq}" data-tab="tab{$category.id}">{$category.name}</li>
{/volist}
<li style="background: #fff;" class="li-bottom"></li>
</ul>
<!-- 右侧分区内容 -->
<div class="right-content">
{volist name="categorys" id="category"}
<div class="tab-pane {eq name='$key' value='0'}active{/eq}" id="tab{$category.id}">
{if condition="!empty($category.children)"}
{volist name="$category.children" id="child"}
<section class="sec-box">
<div class="sec-header">
<div class="sec-title">{$child.name}</div>
<a class="sec-arrow" href="{:url('product/subcategory', ['id' => $child.id])}" target="_self">
<img src="__IMAGES__/y.png" alt="">
</a>
</div>
{if condition="!empty($child.products)"}
<div class="scroll-box">
{volist name="$child.products" id="pro"}
<a class="card" href="{:url('product/detail', ['id' => $pro.id])}" style="background: #fff;">
<div class="card-img">
<img src="{$pro.cover_image}" alt="">
</div>
<div class="card-info">
<div class="card-name">{$pro.name}</div>
<div class="card-model">{$pro.spu}</div>
</div>
</a>
{/volist}
</div>
{/if}
</section>
{/volist}
{/if}
</div>
{/volist}
</div>
{/if}
</div>
{/block}
{block name="script"}
<script>
// 点击右侧箭头滚动
function scrollNext (el)
{
const box = el.closest('section')?.querySelector('.scroll-box')
|| el.parentElement.nextElementSibling
if (box) box.scrollBy({ left: 150, behavior: 'smooth' })
}
const back = document.querySelector('.back')
// 左侧Tab切换
const navItems = document.querySelectorAll('.nav-item')
const tabPanes = document.querySelectorAll('.tab-pane')
navItems.forEach(item =>
{
item.addEventListener('click', () =>
{
// 切换左侧激活状态
navItems.forEach(i => i.classList.remove('active'))
item.classList.add('active')
// 切换右侧内容
const target = item.dataset.tab
tabPanes.forEach(p => p.classList.remove('active'))
document.getElementById(target)?.classList.add('active')
})
})
back.addEventListener('click',()=>{
window.location.href = document.referrer;
})
// 更新侧边栏相邻元素的圆角
function updateSidebarAdjacentRadius() {
const sidebarItems = document.querySelectorAll('.sidebar li');
// 先移除所有相邻类名
sidebarItems.forEach(item => {
item.classList.remove('active-prev', 'active-next');
});
// 找到当前激活的项
let activeIndex = -1;
sidebarItems.forEach((item, index) => {
if (item.classList.contains('active')) {
activeIndex = index;
}
});
// 添加上一个和下一个的类名使用requestAnimationFrame确保DOM更新
requestAnimationFrame(() => {
if (activeIndex > 0) {
sidebarItems[activeIndex - 1].classList.add('active-prev');
}
if (activeIndex < sidebarItems.length - 1) {
sidebarItems[activeIndex + 1].classList.add('active-next');
}
});
}
// 绑定点击事件
document.querySelectorAll('.sidebar li').forEach(item => {
item.addEventListener('click', function() {
// 移除所有active
document.querySelectorAll('.sidebar li').forEach(li => {
li.classList.remove('active');
});
// 添加active
this.classList.add('active');
// 更新相邻圆角
updateSidebarAdjacentRadius();
});
});
// 页面初始化时调用
if (document.querySelector('.sidebar li.active')) {
updateSidebarAdjacentRadius();
}
// 动态计算 li-bottom 的高度
function setLiBottomHeight() {
const sidebar = document.querySelector('.sidebar');
const liBottom = document.querySelector('.sidebar .li-bottom');
const sidebarItems = document.querySelectorAll('.sidebar li:not(.li-bottom)');
if (!sidebar || !liBottom || sidebarItems.length === 0) return;
// 计算所有正常li的总高度
let totalHeight = 0;
sidebarItems.forEach(item => {
totalHeight += item.offsetHeight;
});
// 获取sidebar的高度
const sidebarHeight = sidebar.offsetHeight;
// 计算剩余高度
const remainingHeight = sidebarHeight - totalHeight;
// 赋值给 li-bottom
if (remainingHeight > 0) {
liBottom.style.height = remainingHeight + 'px';
} else {
liBottom.style.height = '0px';
liBottom.style.display = 'none';
}
}
// 页面加载时执行
window.addEventListener('load', function() {
setLiBottomHeight();
});
// 窗口大小改变时重新计算
window.addEventListener('resize', function() {
console.log('切换了吗')
setLiBottomHeight();
});
// 如果侧边栏内容有动态变化,使用 MutationObserver 监听
const observer = new MutationObserver(function() {
setLiBottomHeight();
});
// 监听侧边栏变化
const sidebar = document.querySelector('.sidebar');
if (sidebar) {
observer.observe(sidebar, {
childList: true,
subtree: true,
attributes: true
});
}
</script>
{/block}

File diff suppressed because it is too large Load Diff

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>

View File

@@ -48,7 +48,7 @@
{block name="main"}
{notempty name="data.top_focus_images"}
<!-- 顶部轮播 -->
<div class="swiper-container auto-swiper-container" style="margin-top:60px;">
<div class="swiper-container auto-swiper-container" style="margin-top:42px;">
<div class="swiper-wrapper">
{volist name="data.top_focus_images" id="tfi"}
<div class="swiper-slide auto-swiper-slide">

View File

@@ -31,15 +31,13 @@
<link rel="stylesheet" href="__CSS__/topic_power_prodline/footer.css">
{/block}
{block name="header"}
<!-- 重置header头为空 -->
{/block}
{block name="main"}
<a class="header" href="/">
<!-- <a class="header" href="/">
<div class="header-img">
<img src="__IMAGES__/logo.png" alt="">
</div>
</a>
</a> -->
<!-- 轮播核心容器 -->
<div class="swiper-container auto-swiper-container" >
{notempty name="data.focus_image"}

View File

@@ -0,0 +1,43 @@
{extend name="public/base" /}
{block name="style"}
<link rel="stylesheet" href="__CSS__/topic_laptop/header.css">
<link rel="stylesheet" href="__CSS__/topic_laptop/footer.css">
<link rel="stylesheet" href="__CSS__/topic_ssd/index.css">
<!-- 将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;
// 直接修改内联样式,优先级最高
docEl.setAttribute('style', 'font-size: ' + fontSize + 'px !important;');
}
setRootFontSize();
win.addEventListener(resizeEvt, setRootFontSize);
doc.addEventListener('DOMContentLoaded', setRootFontSize);
})(document, window);
</script>
{/block}
{block name="main"}
<div class="m-sc-main" style="margin-top:42px;">
{volist name="data.top_focus_images" id="item"}
<a href="{$item.link}" class="m-sc-mt20">
<img src="{$item.image}" alt="" class="m-sc-main-img" loading="lazy">
</a>
{/volist}
<div class="m-sc-main-imgs m-sc-mt20 m-sc-mb34">
{volist name="data.products" id="item"}
<a href="{$item.link}" class="">
<img src="{$item.image}" alt="" class="m-sc-main-img1" loading="lazy">
</a>
{/volist}
</div>
</div>
{/block}

View File

@@ -9,7 +9,7 @@
<div class="pageMain">
<!-- banner -->
{notempty name="focus_images"}
<div class="swiper-container bannerswiper">
<div class="swiper-container bannerswiper" style="background: #fff;">
<div class="swiper-wrapper">
{volist name="focus_images" id="focus"}
<div class="swiper-slide">

View File

@@ -6,7 +6,7 @@
<div class="orico_Page_category">
<!-- banner轮播 -->
{notempty name="focus_image"}
<div class="opdBanner">
<div class="opdBanner" >
{volist name="focus_image" id="fi"}
<a {notempty name="fi.link" }href="{$fi.link}" {/notempty}>
<img src="{$fi.image}" class="opdbannerImg" />

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>

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
{extend name="public/base" /}
{block name="style"}
<!--<link rel="stylesheet" href="__CSS__/topic_laptop/header.css">-->
<link rel="stylesheet" href="__CSS__/topic_laptop/header.css">
<link rel="stylesheet" href="__CSS__/before-after.min.css">
<link rel="stylesheet" href="__CSS__/topic_laptop/swiper.css">
<link rel="stylesheet" href="__CSS__/topic_laptop/footer.css">
@@ -52,7 +52,7 @@
{/block}
{block name="main"}
{notempty name="data.top_focus_images"}
<div class="swiper-container auto-swiper-container" style="margin-top:60px;">
<div class="swiper-container auto-swiper-container">
<div class="swiper-wrapper">
{volist name="data.top_focus_images" id="tfi"}
<div class="swiper-slide auto-swiper-slide">

View File

@@ -12,7 +12,7 @@
{/block}
{block name="main"}
<!-- 轮播核心容器 -->
<div class="swiper-container auto-swiper-container" >
<div class="swiper-container auto-swiper-container">
{notempty name="data.focus_image"}
<div class="swiper-wrapper">
{volist name="data.focus_image" id="fo"}

View File

@@ -0,0 +1,44 @@
{extend name="public/base" /}
{block name="style"}
<link rel="stylesheet" href="__CSS__/topic_laptop/header.css">
<link rel="stylesheet" href="__CSS__/topic_laptop/footer.css">
<link rel="stylesheet" href="__CSS__/topic_ssd/index.css">
<script type="text/javascript">
(function (doc, win)
{
var docEl = doc.documentElement;
var resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize';
var designWidth = 2560;
var designRemPx = 100;
function setRootFontSize ()
{
var clientWidth = docEl.clientWidth;
if (!clientWidth) return;
var fontSize = (clientWidth / designWidth) * designRemPx;
fontSize = Math.max(fontSize, 20);
fontSize = Math.min(fontSize, designRemPx);
docEl.style.fontSize = fontSize + 'px';
}
setRootFontSize();
win.addEventListener(resizeEvt, setRootFontSize);
doc.addEventListener('DOMContentLoaded', setRootFontSize);
})(document, window);
</script>
{/block}
{block name="main"}
<div class="sc-main">
{volist name="data.top_focus_images" id="item"}
<a href="{$item.link}" class="sc-mt20">
<img src="{$item.image}" alt="" class="sc-main-img" loading="lazy">
</a>
{/volist}
<div class="sc-main-imgs sc-mt20 sc-mb-78">
{volist name="data.products" id="item"}
<a href="{$item.link}" class="">
<img src="{$item.image}" alt="" class="sc-main-img1" loading="lazy">
</a>
{/volist}
</div>
</div>
{/block}

View File

@@ -6,7 +6,7 @@
align-items: center;
position: relative;
overflow: auto;
padding-top: 50px;
padding-top: 46px;
}
.iotb_bgw {

View File

@@ -0,0 +1,246 @@
* {
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: sans-serif;
font-size: inherit !important;
/* font-size:100% !important; */
}
body {
background: #f5f5f5;
font-size: inherit !important;
/* font-size:100% !important; */
height: 100vh;
overflow: hidden;
max-width: 100vw !important;
}
.top-box {
width: 100%;
box-sizing: border-box;
padding: 20px 22px;
background: #fff;
margin-top: 46px;
/* border-bottom: 1px solid #f0f0f0; */
box-shadow: 0 2px 8px rgba(217, 217, 217, 0.2);
}
.top-bar {
display: flex;
align-items: center;
height: 0.82rem;
background: #F1F2F5;
justify-content: space-between;
border-radius: 0.2rem;
padding: 0 16px;
}
.back {
width: 0.28rem;
height: 0.28rem;
color: #333;
cursor: pointer;
display: flex;
align-items: center;
}
.back img {
width: 0.28rem;
height: 0.28rem;
}
.title {
font-size: 0.32rem !important;
font-weight: 500;
}
/* 主体布局 */
.main {
display: flex;
height: calc(100% - 46px);
margin-top:0.018rem;
}
/* 左侧菜单 #FAFAFA;*/
.sidebar {
width: 114px;
background:#fafafa;
overflow-y: auto;
box-sizing: border-box;
}
.sidebar li {
list-style: none;
padding: 24px 16px;
text-align: center;
font-size: 0.28rem !important;
color:#686A70; /* #686A70;*/
cursor: pointer;
background:#fff;
/* 分别控制上下圆角的过渡 */
border-top-right-radius: 0;
border-bottom-right-radius: 0;
transition: border-radius 1s cubic-bezier(0.4, 0, 0.2, 1);
}
.sidebar li.active {
color: #004BFA;
background: #fafafa;
}
.sidebar li.active-prev {
border-bottom-right-radius: 0.17rem !important;
}
.sidebar li.active-next {
border-top-right-radius: 0.17rem !important;
}
/* 右侧内容 */
.right-content {
flex: 1;
overflow-y: auto;
padding-left: 12px;
background: #fafafa;
/* padding-bottom: 100px; */
}
.right-content {
flex: 1;
overflow-y: auto;
padding-left: 12px;
background: #fafafa;
position: relative;
}
/* 在底部添加占位元素 */
.right-content::after {
content: '';
display: block;
height: 80px; /* 根据需要调整 */
width: 100%;
flex-shrink: 0;
}
/* 最后一个元素底部留白 */
.sec-box:last-child {
margin-bottom: 80px;
}
.sec-header {
display: flex;
justify-content: space-between;
align-items: center;
padding-top: 24px;
padding-right: 17px;
padding-bottom: 12px;
}
.sec-title {
font-size: 0.28rem !important;
color: #686A70;
font-weight: 500
}
.sec-arrow {
width: 0.28rem;
height: 0.28rem;
display: flex;
align-items: center;
justify-content: center;
color: #666;
font-size: 20px;
cursor: pointer;
}
.sec-arrow img {
width: 0.28rem;
height: 0.28rem;
}
/* 横向滚动容器 */
.scroll-box {
display: flex;
gap: 10px;
overflow-x: auto;
scroll-behavior: smooth;
scrollbar-width: none;
}
.scroll-box::-webkit-scrollbar {
display: none
}
.right-card {
flex-shrink: 0;
background: #fff;
border-radius: 8px;
overflow: hidden;
box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
display: flex;
flex-direction: column;
align-items: center;
padding-top: 8px;
}
.card {
display: flex;
flex-direction: column;
align-items: center;
border-radius: 12px;
padding-left: 19px;
padding-right: 19px;
}
.card-img {
width: 1.52rem;
background: #f1f1f1;
display: flex;
align-items: center;
justify-content: center;
color: #999;
margin-top: 8px;
}
.card-img img {
width: 100%;
}
.card-info {
text-align: center;
padding-top: 8px;
padding-bottom: 10px;
}
.card-name {
font-size: 0.2rem !important;
width: 1.52rem;
height: auto;
color: #1D1D1F;
line-height: 1.4;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
}
.card-model {
font-size: 0.16rem !important;
color: #686A70;
margin-top: 4px
}
/* 内容区块默认隐藏 */
.tab-pane {
display: none
}
/* 激活时显示 */
.tab-pane.active {
display: block;
}

View File

@@ -156,7 +156,7 @@
align-items: center;
position: relative;
overflow: auto;
padding-top: 50px;
padding-top: 46px;
}
.iotb_bgw {

View File

@@ -156,7 +156,7 @@
align-items: center;
position: relative;
overflow: auto;
padding-top: 50px;
padding-top: 46px;
}
.iotb_bgw {

View File

@@ -13,7 +13,7 @@
overflow-x: hidden;
}
.oricoEGapp .oricoEGapp-index .oidx-banner {
margin-top: 3.5rem;
margin-top: 46px;
z-index: 9;
}
.oricoEGapp .oricoEGapp-index .oidx-banner .swiper-container {

View File

@@ -0,0 +1,457 @@
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
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; */
position: fixed;
top:0;
left:0;
z-index: 100;
width: 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: fixed;
top: 46px;
left: 0;
z-index: 99;
}
.nav-dropdown-menu.show {
display: block;
}
/* 所有菜单项统一用 div */
.menu-item {
margin: 0 22px;
font-size: 15px !important;
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 {
display: none;
/* height: 100vh; */
/* overflow-y: auto;
overflow-x: hidden;
-webkit-overflow-scrolling: touch; */
}
/* .sub-menu-overflow {
max-height: calc(100vh - 180px);
overflow-y: auto;
overflow-x: hidden;
-webkit-overflow-scrolling: touch;
} */
.sub-menu.show {
display: block;
}
.sub-item {
padding: 0 16px;
font-size: 14px !important;
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 !important;
color: #1D1D1F;
margin-top: 10px;
}
.sub-item-card-name {
font-size: 14px !important;
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 !important;
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 !important;
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 !important;
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 {
border: none;
outline: none;
background: transparent;
font-size: 14px !important;
padding: 10px 0;
flex:1;
}
.search-input-box input::placeholder {
color: #aaa;
}
.search-input-box .search-clear-btn {
width: 14px;
height: 14px;
cursor: pointer;
opacity: 0.6;
}
.search-clear-box {
padding-right: 10px;
padding-left: 10px;
}
/* .search-clear-btn {
border-right: 1px solid #eee;
} */
.search-input-box .search-clear-btn:hover {
opacity: 1;
}
.search-input-box .search-submit-icon {
width: 18px;
height: 18px;
cursor: pointer;
box-sizing: border-box;
}
.search-submit-box {
border-left: 1px solid #d9d9d9;
padding-left:10px;
padding-right: 13px;
max-height: 18px;
}
.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 !important;
color: #888;
}
.search-history-clear {
font-size: 12px !important;
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 !important;
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 !important;
color: #aaa;
}
.mobile-header-right {
display: flex;
align-items: center;
}
/* 产品列表的子菜单不需要滚动 */
.menu-item:first-child .sub-menu {
max-height: none !important;
overflow-y: visible !important;
}
/* 其他导航的子菜单使用JS动态设置高度
.has-child:not(:first-child) .sub-menu {
overflow-y: auto;
overflow-x: hidden;
-webkit-overflow-scrolling: touch;
} */

View File

@@ -2,7 +2,7 @@
position: relative;
display: flex;
flex-direction: column;
margin-top: 3.4rem;
margin-top:46px;
}
.oricoEGapp-newarrival .ona-topimg {
max-width: 100%;

View File

@@ -9,7 +9,7 @@
/* max-height: 900px; */
min-height: 300px;
position: relative;
margin-top:60px;
margin-top:46px;
}
/* 轮播项 - 填充容器高度 */

View File

@@ -0,0 +1,65 @@
* {
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: #fff;
overflow-x: hidden;
margin: 0 !important;
padding: 0 !important;
max-width: 100vw !important;
}
.m-sc-main {
width: 100%;
height: 100%;
}
a {
text-decoration: none;
display: block;
}
img {
display: block;
}
.m-sc-main-img {
width: 100%;
/* max-width: 2560px; */
}
.m-sc-mt20 {
margin-top: 0.1rem;
}
.m-sc-mt20:first-child {
margin-top: 0 !important;
}
.m-sc-mb34 {
margin-bottom: 0.34rem;
}
.m-sc-main-imgs {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 0.1rem;
list-style: none;
/* 去除列表样式(如果有) */
}
.m-sc-main-imgs a {
display: block;
}
.m-sc-main-img1 {
width: 100%;
height: auto;
/* 保持比例 */
display: block;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 262 B

After

Width:  |  Height:  |  Size: 356 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 520 B

After

Width:  |  Height:  |  Size: 991 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 868 B

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 205 B

After

Width:  |  Height:  |  Size: 211 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 514 B

After

Width:  |  Height:  |  Size: 1021 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 326 B

After

Width:  |  Height:  |  Size: 521 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 271 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 301 B

File diff suppressed because it is too large Load Diff

View File

@@ -17,7 +17,6 @@
width: 100%;
height: auto;
position: relative;
margin-top: 3.75rem;
}
.orico_Page_index .pageMain .bannerswiper .swiper-slide img {

View File

@@ -36,7 +36,7 @@
flex-direction: column;
padding: 2.5rem 0 1.375rem 0;
position: relative;
margin-top: 3%;
/* margin-top: 3%; */
}
.orico_Page_prdetail .oriprdetail .product_address {
width: 70%;

View File

@@ -27,7 +27,7 @@
}
.orico_Page_subcategory .pageMain {
width: 85%;
padding: 7.5rem 0 10px;
padding: 54px 0 10px;
margin: 0 auto;
display: flex;
flex-direction: column;

View File

@@ -1,406 +1,13 @@
@charset "UTF-8";
/* 全局文字最小尺寸兜底 */
.header-PC {
width: 100%;
height: 60px;
background: #fff;
display: flex;
justify-content: center;
position: fixed;
top: 0;
z-index: 100;
.header {
max-width: 100% !important;
width: 100% !important;
display: flex;
justify-content: center;
}
.header-PC * {
min-font-size: 16px !important; /* 强制最小16px */
box-sizing: border-box;
.header-nav-outer {
max-width: 1920px;
width: 100%;
margin:auto 0 !important;
}
.header-PC #header {
margin: 0 auto;
height: 60px; /* 0.6rem*100=60px */
max-width: var(--max-width);
/* position: fixed;
top: 0; */
display: flex;
flex-direction: row;
align-items: center;
z-index: 999;
background: white;
color: black;
width: 100%;
font-size: 16px; /* 基础字号16px */
}
.header-PC #header .nav1 {
position: relative;
width: 20%;
}
.header-PC #header .nav1 img {
width: 45%;
margin-left: 40%;
}
.header-PC #header .nav2 {
position: relative;
width: 60%;
}
.header-PC #header .nav2 .navItem {
font-size: 16px; /* 强制16px */
position: relative;
display: flex;
flex-direction: row;
align-items: center;
flex-wrap: wrap;
justify-content: center;
width: 12.5%;
height: 60px; /* 0.6rem*100=60px */
text-align: center;
float: left;
text-decoration: none;
transition: all 0.3s ease;
-webkit-transition: all 0.5s ease;
}
.header-PC #header .nav2 .navItem a {
padding-right: 5px; /* 0.05rem*100=5px */
padding-left: 20px; /* 0.2rem*100=20px */
text-decoration: none;
word-break: keep-all;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
word-wrap: break-word;
text-wrap: nowrap;
font-size: 16px; /* 确保16px */
}
.header-PC #header .nav2 .navItem .downimg {
height: 12px; /* 0.12rem*100=12px */
}
.header-PC #header .nav2 .navItem .navItemConten {
width: 100%;
z-index: 999;
background-color: #f2f2f2;
max-height: 660px; /* 6.6rem*100=660px */
box-shadow: 3px 5px 60px -20px #88909a; /* 0.03/0.05/0.6/-0.2rem 转px */
position: fixed;
border: 1px solid lightgray;
top: 60px; /* 0.6rem*100=60px */
transition: max-height 0.5s ease-out, opacity 0.5s ease-out;
left: 0;
display: none;
font-size: 16px; /* 基础字号16px */
}
.header-PC #header .nav2 .navItem .navItemConten .navItem_cyleft {
float: left;
text-align: center;
width: 20%;
max-height: 660px; /* 6.6rem*100=660px */
font-size: 16px; /* 强制16px */
}
.header-PC #header .nav2 .navItem .navItemConten .navItem_cyleft li {
cursor: pointer;
zoom: 1;
clear: both;
border: 1px solid transparent;
}
.header-PC #header .nav2 .navItem .navItemConten .navItem_cyleft li a {
line-height: 44px; /* 0.44rem*100=44px */
color: #656a6d;
font-size: 16px; /* 确保16px */
}
.header-PC #header .nav2 .navItem .navItemConten .navItem_cyleft li a:hover {
color: #004bfa;
}
.header-PC #header .nav2 .navItem .navItemConten .navItem_cyleft li.it_active {
border-color: #dddddd;
background-color: #ffffff;
}
.header-PC #header .nav2 .navItem .navItemConten .navItem_cyright {
max-height: 660px; /* 6.6rem*100=660px */
min-height: 460px; /* 4.6rem*100=460px */
overflow-y: auto;
border-left: 1px solid #dddddd;
font-weight: normal;
background-color: #fff;
margin: 0 auto;
box-shadow: -3px 0 0px #f3f3f3; /* -0.03rem*100=-3px */
text-align: left;
}
.header-PC #header .nav2 .navItem .navItemConten .navItem_cyright .nav_cyrightit dt {
font-size: 16px; /* 原0.14rem=14px → 提升至16px */
line-height: 16px; /* 0.16rem*100=16px */
margin-inline-start: 20px; /* 0.2rem*100=20px */
font-weight: 600;
border-bottom: 1px solid rgba(225, 225, 225, 0.5);
padding-bottom: 13px; /* 0.13rem*100=13px */
padding-top: 16px; /* 0.16rem*100=16px */
}
.header-PC #header .nav2 .navItem .navItemConten .navItem_cyright .nav_cyrightit dt img {
height: 16px; /* 0.16rem*100=16px */
max-width: 100%;
}
.header-PC #header .nav2 .navItem .navItemConten .navItem_cyright .nav_cyrightit dt a {
color: #333;
text-decoration: none;
word-break: keep-all;
overflow: hidden;
text-overflow: ellipsis;
word-wrap: break-word;
text-wrap: nowrap;
font-size: 16px; /* 确保16px */
}
.header-PC #header .nav2 .navItem .navItemConten .navItem_cyright .nav_cyrightit dd {
font-size: 16px; /* 原0.14rem=14px → 提升至16px */
line-height: 40px; /* 0.4rem*100=40px */
padding-top: 0vw;
font-weight: 100;
display: inline-block;
margin-right: 3%;
margin-inline-start: 40px; /* 0.4rem*100=40px */
}
.header-PC #header .nav2 .navItem .navItemConten .navItem_cyright .nav_cyrightit dd a {
font-size: 16px; /* 确保16px */
}
.header-PC #header .nav2 .navItem .navItemConten .navItem_cyright .nav_cyrightit dd a:hover {
color: #004bf9;
font-weight: 600;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
-webkit-transition: all 0.2s linear;
}
.header-PC #header .nav2 .navItem .navItemConten.active {
max-height: 660px; /* 6.6rem*100=660px */
opacity: 1;
}
.header-PC #header .nav2 .navItem .navItemConten1 {
background-color: #fff;
color: black;
position: absolute;
top: 60px; /* 0.6rem*100=60px */
left: 20px; /* 0.2rem*100=20px */
width: auto;
height: auto;
z-index: 9999;
border-radius: 5px; /* 0.05rem*100=5px */
box-shadow: 0 0 1px 0 #88909a; /* 0.01rem*100=1px */
display: none;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 8px 0; /* 0.08rem*100=8px */
font-size: 16px; /* 基础字号16px */
}
.header-PC #header .nav2 .navItem .navItemConten1 li {
color: #fff;
float: left;
text-align: center;
line-height: 24px; /* 0.24rem*100=24px */
padding: 8px 32px; /* 0.08/0.32rem*100=8/32px */
display: list-item;
}
.header-PC #header .nav2 .navItem .navItemConten1 li a {
cursor: pointer;
padding-left: 0;
white-space: nowrap;
font-size: 16px; /* 确保16px */
}
.header-PC #header .nav2 .navItem > a.active,
.header-PC #header .nav2 .navItem .navItemConten1 li a:hover {
color: #004bfa;
}
.header-PC #header .nav3 {
position: relative;
width: 20%;
background-color: transparent;
display: flex;
align-items: center;
cursor: pointer;
font-size: 16px; /* 基础字号16px */
}
.header-PC #header .nav3 .searchimg {
margin-left: 10%;
}
.header-PC #header .nav3 .storetopbt {
background: #004cfa;
color: #fff;
padding: 0 15px; /* 0.15rem*100=15px */
border-radius: 20px; /* 0.2rem*100=20px */
height: 38px; /* 0.38rem*100=38px */
line-height: 40px; /* 0.4rem*100=40px */
margin-left: 15%;
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
font-size: 16px; /* 强制16px */
}
.header-PC #header .nav3 .storetopbt .storeImgico {
width: 20px; /* 0.2rem*100=20px */
margin-right: 8px; /* 0.08rem*100=8px */
}
.header-PC #header .nav3 .choesCountry {
position: relative;
margin-left: 15%;
display: flex;
}
.header-PC #header .nav3 .choesCountry .topCountry {
display: none;
width: 340px; /* 3.4rem*100=340px */
background-color: white;
/* position: fixed; */
position: absolute;
right: -150px;
top: 50px; /* 0.8rem*100=80px */
border-radius: 15px; /* 0.15rem*100=15px */
box-shadow: 2px 2px 10px 1px #88909a; /* 0.02/0.02/0.1/0.01rem 转px */
font-size: 16px; /* 基础字号16px */
}
.header-PC #header .nav3 .choesCountry .topCountry li {
width: 100%;
height: 50px; /* 0.5rem*100=50px */
line-height: 50px; /* 0.5rem*100=50px */
text-align: center;
display: flex;
}
.header-PC #header .nav3 .choesCountry .topCountry li .countryName {
width: 70%;
text-align: left;
margin-left: 10px; /* 0.1rem*100=10px */
font-size: 16px; /* 强制16px */
}
.header-PC #header .nav3 .choesCountry .topCountry li .cico {
width: 18%;
margin-left: 0;
}
.header-PC #header .nav3 .choesCountry .topCountry li .cico .countryimg {
margin-left: 0;
margin-left: 20px; /* 0.2rem*100=20px */
margin-top: 15px; /* 0.15rem*100=15px */
vertical-align: top;
}
.header-PC #header .nav3 .choesCountry .topCountry li.closec {
display: flex;
flex-direction: row;
justify-content: end;
height: 30px; /* 0.3rem*100=30px */
}
.header-PC #header .nav3 .choesCountry .topCountry .closecountrybt {
color: #aaa;
margin-top: -5px; /* 0.05rem*100=5px */
cursor: pointer;
height: 20px; /* 0.2rem*100=20px */
width: 20px; /* 0.2rem*100=20px */
margin-right: 10px; /* 0.1rem*100=10px */
font-size: 16px; /* 确保关闭按钮文字16px */
}
.header-PC .searchmodalMian {
position: fixed;
z-index: 999;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.7);
z-index: 998;
display: none;
}
.header-PC .searchmodalMian .searchmodalct {
background-color: #fff;
padding: 20px; /* 0.2rem*100=20px */
border-radius: 20px; /* 0.2rem*100=20px */
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); /* 0.04/0.08rem 转px */
border: 1px solid rgba(0, 0, 0, 0.2);
position: fixed;
right: 2%;
width: 33%;
top: 80px; /* 0.8rem*100=80px */
height: 80%;
overflow-y: auto;
z-index: 998;
font-size: 16px; /* 基础字号16px */
}
.header-PC .searchmodalMian .searchmodalct .close-btn {
color: #aaa;
float: right;
font-size: 24px; /* 0.24rem*100=24px */
cursor: pointer;
}
.header-PC .searchmodalMian .searchmodalct #serrchinput {
margin-left: 10%;
margin-top: 5%;
width: 80%;
height: 44px; /* 0.44rem*100=44px */
border: 1px solid grey;
border-radius: 22px; /* 0.22rem*100=22px */
background-position: 95% 50%;
padding-left: 5%;
font-size: 16px; /* 输入框文字16px */
}
.header-PC .searchmodalMian .searchmodalct .searchhistory,
.header-PC .searchmodalMian .searchmodalct .popProduct {
margin-top: 5%;
margin-left: 10%;
width: 80%;
display: flex;
position: relative;
}
.header-PC .searchmodalMian .searchmodalct .searchhistory .h_title,
.header-PC .searchmodalMian .searchmodalct .popProduct .h_title {
position: absolute;
left: 0;
top: 1%;
font-size: 16px; /* 保持16px */
color: #989898;
}
.header-PC .searchmodalMian .searchmodalct .searchhistory ul,
.header-PC .searchmodalMian .searchmodalct .popProduct ul {
margin-top: 10%;
margin-left: 1%;
}
.header-PC .searchmodalMian .searchmodalct .popProduct .popmain{
width: 100%;
}
.header-PC .searchmodalMian .searchmodalct .searchhistory .popmain,
.header-PC .searchmodalMian .searchmodalct .popProduct .popmain {
display: flex;
flex-direction: row;
flex-wrap: wrap;
}
.header-PC .searchmodalMian .searchmodalct .searchhistory .popmain .popitem,
.header-PC .searchmodalMian .searchmodalct .popProduct .popmain .popitem {
text-align: center;
margin-top: 7%;
margin-left: 1%;
display: flex;
flex-direction: column;
justify-content: center;
width: 30%;
align-items: center;
overflow: hidden;
}
.header-PC .searchmodalMian .searchmodalct .searchhistory .popmain .popitem .popimg,
.header-PC .searchmodalMian .searchmodalct .popProduct .popmain .popitem .popimg {
width: 115px; /* 1.15rem*100=115px */
height: 115px; /* 1.15rem*100=115px */
margin: 0 auto;
}
.header-PC .searchmodalMian .searchmodalct .searchhistory .popmain .popitem .productName,
.header-PC .searchmodalMian .searchmodalct .popProduct .popmain .popitem .productName {
font-weight: 600;
display: -webkit-box;
-webkit-line-clamp: 1;
text-overflow: ellipsis;
font-size: 16px; /* 原0.128rem=12.8px → 提升至16px */
margin-top: 10%;
}
.header-PC .searchmodalMian .searchmodalct .popProduct .popmain .popitem .productName
{
width: 100%;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
display: block;
font-size: 16px; /* 原14px → 提升至16px */
}
.header-PC .searchmodalMian .searchmodalct .popProduct .popmain .popitem .produc-dec{
font-size: 16px; /* 原10px → 提升至16px */
color: #000000;
margin-top: 1%;
}

View File

@@ -9,13 +9,6 @@ body {
overflow-x: hidden;
scroll-behavior: smooth !important;
-webkit-overflow-scrolling: touch !important;
/* padding: 0 !important;
margin:0 !important; */
/* max-width:100% !important;
width: 100vw !important;
margin:0 auto; */
/* max-width:100vw !important */
/* margin:0 auto !important; */
}
/* 当视口宽度大于1920px时生效 */
@media screen and (min-width: 1920px) {
@@ -39,7 +32,3 @@ body {
transform 1.2s ease-in-out,
visibility 1.2s ease-in-out;
}
/* 18-19号防卡顿延迟19号动画 */
/* [data-order="19"] {
transition: all 0.3s ease-out 0.2s !important;
} */

View File

@@ -63,12 +63,12 @@ a {
width: 100%;
height: clamp(2.5rem, 5vw, 15rem);
}
.header {
/* .header {
width: 100%;
background: #fff;
height: 60px;
}
.header-img {
} */
/* .header-img {
margin: 0 auto;
width: 90%;
display: flex;
@@ -76,4 +76,4 @@ a {
padding-top: 0.5rem;
padding-bottom: 0.5rem;
}
} */

View File

@@ -0,0 +1,68 @@
html {
width: 100%;
}
body {
/* width: 100vw;
height: 100vh; */
background: #fff;
overflow-x: hidden;
scroll-behavior: smooth !important;
-webkit-overflow-scrolling: touch !important;
}
/* 当视口宽度大于1920px时生效 */
@media screen and (min-width: 1920px) {
/* 这里写你的样式 */
body {
max-width:100% !important;
width: 100vw !important;
}
}
.sc-main {
width: 100%;
height: 100%;
max-width: 2560px;
margin: 0 auto;
}
a {
text-decoration: none;
display: block;
}
img {
display: block;
}
.sc-main-img {
width: 100%;
max-width: 2560px;
}
.sc-mt20:first-child {
margin-top: 0 !important;
}
.sc-mt20 {
margin-top: 0.2rem;
}
.sc-mb-78 {
margin-bottom: 0.78rem;
}
.sc-main-imgs {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 0.2rem;
list-style: none;
/* 去除列表样式(如果有) */
}
.sc-main-imgs a {
display: block;
}
.sc-main-img1 {
width: 100%;
height: auto;
/* 保持比例 */
display: block;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 379 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 868 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 578 B

View File

@@ -147,46 +147,6 @@ class ImageMigrator:
# 确保paramiko已导入
ensure_paramiko()
# 连接目标服务器必须为SSH
if self.target_config.is_local():
print("错误: 目标服务器必须为SSH服务器不能是本地目录")
return False
self.target_client = paramiko.SSHClient()
self.target_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
if self.verbose:
print(
f"连接到目标服务器: {self.target_config.host}:{self.target_config.port}"
)
if self.target_config.key_file:
key = paramiko.RSAKey.from_private_key_file(self.target_config.key_file)
self.target_client.connect(
hostname=self.target_config.host,
port=self.target_config.port,
username=self.target_config.username,
pkey=key,
)
else:
self.target_client.connect(
hostname=self.target_config.host,
port=self.target_config.port,
username=self.target_config.username,
password=self.target_config.password,
)
self.target_sftp = self.target_client.open_sftp()
# 检查SFTP服务器的工作目录
if self.verbose:
try:
cwd = self.target_sftp.getcwd()
print(f"DEBUG: 目标SFTP服务器当前工作目录: {cwd}")
except Exception as e:
print(f"DEBUG: 无法获取目标SFTP服务器工作目录: {e}")
# 连接源服务器如果是SSH类型
if not self.source_config.is_local():
self.source_client = paramiko.SSHClient()
@@ -218,11 +178,61 @@ class ImageMigrator:
self.source_sftp = self.source_client.open_sftp()
# 检查SFTP服务器的工作目录
if self.verbose:
try:
cwd = self.source_sftp.getcwd()
print(f"DEBUG: 源SFTP服务器当前工作目录: {cwd}")
except Exception as e:
print(f"DEBUG: 无法获取源SFTP服务器工作目录: {e}")
# 连接目标服务器如果为SSH
if not self.target_config.is_local():
self.target_client = paramiko.SSHClient()
self.target_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
if self.verbose:
print(
f"连接到目标服务器: {self.target_config.host}:{self.target_config.port}"
)
if self.target_config.key_file:
key = paramiko.RSAKey.from_private_key_file(
self.target_config.key_file
)
self.target_client.connect(
hostname=self.target_config.host,
port=self.target_config.port,
username=self.target_config.username,
pkey=key,
)
else:
self.target_client.connect(
hostname=self.target_config.host,
port=self.target_config.port,
username=self.target_config.username,
password=self.target_config.password,
)
self.target_sftp = self.target_client.open_sftp()
# 检查SFTP服务器的工作目录
if self.verbose:
try:
cwd = self.target_sftp.getcwd()
print(f"DEBUG: 目标SFTP服务器当前工作目录: {cwd}")
except Exception as e:
print(f"DEBUG: 无法获取目标SFTP服务器工作目录: {e}")
if self.verbose:
source_type = (
"本地目录" if self.source_config.is_local() else "SSH服务器"
)
print(f"连接成功! 源: {source_type}, 目标: SSH服务器")
target_type = (
"本地目录" if self.target_config.is_local() else "SSH服务器"
)
print(f"连接成功! 源: {source_type}, 目标: {target_type}")
return True
except Exception as e:
@@ -718,7 +728,7 @@ def read_image_paths(image_list_file: str) -> List[str]:
def main():
parser = argparse.ArgumentParser(
description="本地目录或SSH服务器迁移图片到远程SSH服务器保持相对路径结构",
description="本地目录之间迁移图片,本地目录或SSH服务器迁移图片到远程SSH服务器保持相对路径结构",
formatter_class=argparse.RawDescriptionHelpFormatter,
epilog="""
示例:
@@ -756,8 +766,7 @@ def main():
parser.add_argument(
"--source-type",
choices=["local", "ssh"],
default="local",
help="源服务器类型: local(本地目录) 或 ssh(SSH服务器),默认: local",
help="源服务器类型: local(本地目录) 或 ssh(SSH服务器)",
)
parser.add_argument("--source-host", help="源服务器地址仅SSH类型需要")
parser.add_argument(
@@ -772,6 +781,11 @@ def main():
parser.add_argument("--source-dir", help="源服务器图片基础目录")
# 目标服务器选项
parser.add_argument(
"--target-type",
choices=["local", "ssh"],
help="目标服务器类型: local(本地目录) 或 ssh(SSH服务器)",
)
parser.add_argument("--target-host", help="目标服务器地址")
parser.add_argument(
"--target-port", type=int, default=22, help="目标服务器端口(默认: 22"
@@ -859,23 +873,38 @@ def main():
# 构建目标服务器配置
target_config_data = config.get("target", {})
target_config_data["type"] = "ssh" # 目标必须是SSH
ssh_config = target_config_data.get("ssh", {})
# 命令行参数覆盖配置文件
if args.target_host:
ssh_config["host"] = args.target_host
if args.target_port:
ssh_config["port"] = args.target_port
if args.target_user:
ssh_config["username"] = args.target_user
if args.target_password:
ssh_config["password"] = args.target_password
if args.target_key:
ssh_config["key_file"] = args.target_key
if args.target_type:
target_config_data["type"] = args.target_type
target_config_data["ssh"] = ssh_config
# 命令行参数覆盖配置文件
if args.target_type == "ssh" or target_config_data.get("type") == "ssh":
ssh_config = target_config_data.get("ssh", {})
if args.target_host:
ssh_config["host"] = args.target_host
if args.target_port:
ssh_config["port"] = args.target_port
if args.target_user:
ssh_config["username"] = args.target_user
if args.target_password:
ssh_config["password"] = args.target_password
if args.target_key:
ssh_config["key_file"] = args.target_key
target_config_data["ssh"] = ssh_config
# 检查必要的目标SSH参数
if not ssh_config.get("host"):
print("错误: 必须指定目标服务器地址 (--target-host)")
sys.exit(1)
if not ssh_config.get("username"):
print("错误: 必须指定目标服务器用户名 (--target-user)")
sys.exit(1)
else:
# 本地类型不需要SSH配置
target_config_data.pop("ssh", None)
# 设置基础目录
if args.target_dir:
@@ -884,14 +913,6 @@ def main():
print("错误: 必须指定目标服务器图片基础目录 (--target-dir)")
sys.exit(1)
# 检查必要的目标SSH参数
if not ssh_config.get("host"):
print("错误: 必须指定目标服务器地址 (--target-host)")
sys.exit(1)
if not ssh_config.get("username"):
print("错误: 必须指定目标服务器用户名 (--target-user)")
sys.exit(1)
# 创建服务器配置对象
try:
source_config = ServerConfig.from_dict(source_config_data)