1 Commits

Author SHA1 Message Date
1fd727cffc refactor: think-orm回退版本 2025-05-30 13:37:23 +08:00
327 changed files with 3617 additions and 17792 deletions

5
.env Normal file
View File

@@ -0,0 +1,5 @@
[JWT]
TTL=3600
REFRESH_TTL=20160
SECRET=b43e6276644ed60e65c50d1b324ba10b

32
.env.dev Normal file
View File

@@ -0,0 +1,32 @@
APP_DEBUG = true
DB_TYPE = mysql
DB_HOST = localhost
DB_NAME = orico-official-website
DB_USER = orico-ow
DB_PASS = 14Xi17NIK8V2qAXE8oMataHEsaR8lE
DB_PORT = 3306
DB_CHARSET = utf8mb4
DB_PREFIX = ow_
DEFAULT_LANG = zh-cn
# 前端代理服务器ip影响使用代理访问情况下的客户端ip获取
PROXY_SERVER_IP[] = 120.79.27.160
[JWT]
TTL=3600
REFRESH_TTL=20160
SECRET=b43e6276644ed60e65c50d1b324ba10b
# 后台不需要登录的接口
[ADMIN_AUTH]
WHITE_LIST[] = v1/user/login
WHITE_LIST[] = v1/user/captcha
# 不需记录日志的接口
[ADMIN_API]
IGNORE_LOGGING_LIST[] = v1/OperateLog/index
MAX_IMAGE_SIZE = 5mb # 图片上传最大限制
MAX_VIDEO_SIZE = 150mb # 视频上传最大限制
MAX_ATTACHMENT_SIZE = 100mb # 附件上传最大限制

26
.env.local Normal file
View File

@@ -0,0 +1,26 @@
APP_DEBUG = true
DB_TYPE = mysql
DB_HOST = 127.0.0.1
DB_NAME = orico-official-website
DB_USER = orico-official-website
DB_PASS = 14Xi17NIK8V2qAXE8oMataHEsaR8lE
DB_PORT = 3306
DB_CHARSET = utf8mb4
DB_PREFIX = ow_
DEFAULT_LANG = zh-cn
[JWT]
TTL=3600
REFRESH_TTL=20160
SECRET=b43e6276644ed60e65c50d1b324ba10b
# 后台不需要登录的接口
[ADMIN_AUTH]
WHITE_LIST[] = v1/user/login
WHITE_LIST[] = v1/user/captcha
# 不需记录日志的接口
[ADMIN_API]
IGNORE_LOGGING_LIST[] = v1/OperateLog/index

View File

@@ -1,96 +1,11 @@
APP_DEBUG = true APP_DEBUG = true
DB_TYPE = mysql DB_TYPE = mysql
DB_HOST = localhost DB_HOST = 127.0.0.1
DB_NAME = orico-official-website DB_NAME = test
DB_USER = orico-ow DB_USER = username
DB_PASS = 14Xi17NIK8V2qAXE8oMataHEsaR8lE DB_PASS = password
DB_PORT = 3306 DB_PORT = 3306
DB_CHARSET = utf8mb4 DB_CHARSET = utf8
DB_PREFIX = ow_
DB_VERSION = 8
DEFAULT_LANG = zh-cn DEFAULT_LANG = zh-cn
# 前端代理服务器ip影响使用代理访问情况下的客户端ip获取
PROXY_SERVER_IP[] = 120.79.27.160
# redis 配置
REDIS_HOST = 127.0.0.1
REDIS_PORT = 6379
REDIS_PASSWORD = ''
REDIS_PREFIX = ow:
[JWT]
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
WHITE_LIST[] = v1/user/captcha
WHITE_LIST[] = receive_sync/category
WHITE_LIST[] = receive_sync/product
# 不需记录日志的接口
[ADMIN_API]
IGNORE_LOGGING_LIST[] = v1/OperateLog/index
MAX_IMAGE_SIZE = 5mb; # 图片上传最大限制
MAX_VIDEO_SIZE = 150mb; # 视频上传最大限制
MAX_ATTACHMENT_SIZE = 100mb; # 附件上传最大限制
# 开放API
[OPENAPI]
ACCESS_TOKEN_LIFETIME = 3600; # 访问令牌有效期
REFRESH_TOKEN_LIFETIME = 1209600; # 刷新令牌有效期
RESOURCE_IMAGES_DOMAIN = http://local.orico.com; # 图片资源服务器地址
RESOURCE_VIDEOS_DOMAIN = http://local.orico.com; # 视频资源服务器地址
# 七牛云存储配置
[QINUI]
BUCKET = orico
BASE_URL = http://local.orico.com
ACCESS_KEY = 1234567890
SECRET_KEY = 1234567890
# 前台视图模板规则配置
[INDEX_VIEW_TPL]
# 视图目录
# query 规则URL参数 mtpl=1 表示移动端访问
# 例如http://xxxx.com?mtpl=1
# domain 规则:根据特定域名,判断是否移动端访问
# 例如http://mobile.orico.cn
RULE = query
# query 规则参数名
RULE_QUERY_NAME = mtpl
# query 规则参数值
RULE_QUERY_VALUE = 1
# domain 规则协议
RULE_DOMAIN_SCHEME[] = http
RULE_DOMAIN_SCHEME[] = https
# domain 规则域名
RULE_DOMAIN_HOST = mobile.orico.cn
# 前台语言检测配置
[INDEX_LANG_DETECT]
# 是否启用域名检测方式来检测语言
DOMAIN_DETECT = true
# 域名规则
# 格式:域名=语言
# 例如mobile.orico.cn=zh-cn
DOMAIN_RULE[] = orico.cn=zh-cn
DOMAIN_RULE[] = orico.com.cn=zh-cn
DOMAIN_RULE[] = www.orico.cn=zh-cn
DOMAIN_RULE[] = www.orico.com.cn=zh-cn
DOMAIN_RULE[] = ow.f2b211.com=zh-cn
DOMAIN_RULE[] = orico.cc=en-us
DOMAIN_RULE[] = www.orico.cc=en-us
DOMAIN_RULE[] = ow.us.f2b211.com=en-us

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

15
.gitignore vendored
View File

@@ -3,23 +3,10 @@ composer.phar
composer.lock composer.lock
.DS_Store .DS_Store
Thumbs.db Thumbs.db
.env
.env.dev
.env.local
.env.prod
.htaccess
.user.ini
404.html
index.html
public/dist*
public/opendoc
public/logo.png
public/.well-known
/.idea /.idea
/.vscode /.vscode
/.zed
/vendor /vendor
/.settings /.settings
/.buildpath /.buildpath
/.project /.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

@@ -1,219 +0,0 @@
<?php
declare (strict_types = 1);
namespace app\admin\controller;
use app\admin\model\v1\LanguageModel;
use app\admin\model\v1\ProductCategoryModel;
use app\admin\model\v1\ProductModel;
use app\admin\model\v1\ProductTcoCategoryModel;
use think\facade\Db;
class Operate_Of_ReceiveSync
{
const Add = 'add';
const Update = 'update';
const Enable = 'enable';
const Disable = 'disable';
}
/**
* 接收产品相关同步数据
*/
class ReceiveProductSync
{
// 接收产品目录分类同步数据
public function category()
{
$data = request()->post();
if (empty($data)) return error('请确认同步数据');
$validate = validate([
'name|分类名称' => 'require',
'erp_code|分类ERP编码' => 'require',
]);
if (!$validate->check($data)) {
return error((string)$validate->getError());
}
// 获取对应语言ID
$lang_id = LanguageModel::where('code', $data['lang'])->value('id');
if (empty($lang_id)) {
return error('语言不存在');
}
Db::startTrans();
try {
$tco_category_data = [
'language_id' => $lang_id,
'name' => $data['name'],
'tco_id' => $data['tco_id'],
'tco_pid' => $data['tco_pid'],
'tco_path' => $data['tco_path'],
'erp_id' => $data['erp_id'],
'erp_pid' => $data['erp_pid'],
'erp_code' => $data['erp_code'],
'erp_path' => $data['erp_path'],
'disabled' => Operate_Of_ReceiveSync::Disable == $data['operate'] ? 1 : 0,
'sync_time' => strtotime($data['created_at'])
];
$tco_category = ProductTcoCategoryModel::language($lang_id)->erpCode($tco_category_data['erp_code'])->find();
if (empty($tco_category)) {
$tco_category = ProductTcoCategoryModel::create($tco_category_data);
if ($tco_category->isEmpty()) {
throw new \Exception('产品目录分类创建失败');
}
$category_data = [
'language_id' => $lang_id,
'unique_id' => uniqid('PRO_CATE_'),
'pid' => 0,
'path' => '',
'name' => $tco_category_data['name'],
'icon' => '',
'desc' => '',
'related_tco_category' => $tco_category['id'],
'sort' => 0,
'level' => 1,
'is_show' => 1,
];
$tco_parent = ProductTcoCategoryModel::language($lang_id)->tcoId($tco_category['tco_pid'])->find();
if (!empty($tco_parent)) {
$parent = ProductCategoryModel::language($lang_id)->tcoId($tco_parent['id'])->find();
if ($parent->isEmpty()) {
throw new \Exception('产品分类父级不存在');
}
$category_data['pid'] = $parent['id'];
$category_data['path'] = $parent['path'] . $parent['pid'];
$category_data['level'] = $parent['level'] + 1;
}
$category = ProductCategoryModel::create($category_data);
if ($category->isEmpty()) {
throw new \Exception('产品分类创建失败');
}
}
else if ($tco_category['sync_time'] < $tco_category_data['sync_time']) {
$success = $tco_category->save($tco_category_data);
if (!$success) {
throw new \Exception('产品目录分类更新失败');
}
$category = ProductCategoryModel::language($lang_id)->tcoId($tco_category['id'])->find();
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('产品分类更新失败');
}
}
}
Db::commit();
} catch (\Throwable $th) {
Db::rollback();
return error(sprintf('%s %s:%d', $th->getMessage(), $th->getFile(), $th->getLine()));
}
return success('同步成功');
}
// 接收产品同步数据
public function product()
{
$data = request()->post();
if (empty($data)) {
return error('请确认同步数据');
}
$validate = validate([
'spu' => 'require',
'name' => 'require',
'category_erp_code' => 'require',
'lang' => 'require',
'created_at' => 'require',
]);
if (!$validate->check($data)) {
return error((string)$validate->getError());
}
// 获取对应语言ID
$lang_id = LanguageModel::where('code', $data['lang'])->value('id');
if (empty($lang_id)) {
return error('语言不存在');
}
// 如果 spu_before_modification 存在则根据 spu_before_modification 更新型号
$product = null;
if (!empty($data['spu_before_modification'])) {
$product = ProductModel::language($lang_id)->spu($data['spu_before_modification'])->find();
}
if (
(empty($data['spu_before_modification']) && !empty($data['spu']))
// 避免 spu_before_modification 更新型号时,人为删除了旧型号导致的新增,从而出现重复型号问题,而进行再次验证
|| (!empty($data['spu_before_modification']) && empty($product))
) {
$product = ProductModel::language($lang_id)->spu($data['spu'])->find();
}
try {
$product_tco_category = ProductTcoCategoryModel::language($lang_id)->erpCode($data['category_erp_code'])->find();
if (empty($product_tco_category)) {
throw new \Exception('官网未找到产品目录同步分类');
}
$product_category = ProductCategoryModel::language($lang_id)->tcoId($product_tco_category['id'])->find();
if (empty($product_category)) {
throw new \Exception('官网未找到产品目录同步分类关联的分类');
}
if (empty($product)) {
$product = ProductModel::create([
'language_id' => $lang_id,
'category_id' => $product_category['id'],
'spu' => $data['spu'],
'name' => $data['name'],
'short_name' => '',
'cover_image' => '',
'desc' => '',
'video_img' => '',
'video_url' => '',
'is_sale' => 1,
'is_new' => 0,
'is_hot' => 0,
'is_show' => 0,
'sort' => 0,
'detail' => '',
'status' => Operate_Of_ReceiveSync::Disable == $data['operate'] ? -1 : 1,
'seo_title' => '',
'seo_keywords' => '',
'seo_desc' => '',
'updated_at' => $data['created_at'],
]);
if ($product->isEmpty()) {
throw new \Exception('产品创建失败');
}
}
else if (strtotime($product['updated_at']) < strtotime($data['created_at'])) {
$product->spu = $data['spu'];
$product->name = $data['name'];
$product->category_id = $product_category['id'];
$product->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()));
}
return success('同步成功');
}
}

View File

@@ -39,11 +39,7 @@ class Article
->language(request()->lang_id) ->language(request()->lang_id)
->where(function($query) use($param) { ->where(function($query) use($param) {
if (isset($param['category_id'])) { if (isset($param['category_id'])) {
if (str_contains($param['category_id'], ',') || is_array($param['category_id'])) { $query->where('category_id', '=', $param['category_id']);
$query->whereIn('category_id', $param['category_id']);
} else {
$query->where('category_id', '=', $param['category_id']);
}
} }
}) })
->withSearch(['title', 'release_time'], [ ->withSearch(['title', 'release_time'], [
@@ -59,8 +55,7 @@ class Article
'category', 'category',
'category_id' 'category_id'
]) ])
->bindAttr('category', ['category_name' => 'name']) ->bindAttr('category', ['category_name' => 'name']);
->each(fn($item) => $item->image = thumb($item->image));
return success('获取成功', $article); return success('获取成功', $article);
} }
@@ -228,7 +223,7 @@ class Article
private function getExportArticleData() private function getExportArticleData()
{ {
$server = request()->server(); $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']); $param = request()->param(['title', 'category_id', 'release_time']);
$data = ArticleModel::field([ $data = ArticleModel::field([
'*', '*',
@@ -253,7 +248,7 @@ class Article
]) ])
->bindAttr('category', ['category_name' => 'name']) ->bindAttr('category', ['category_name' => 'name'])
->each(function ($item) use($image_host) { ->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; return $item;
}); });

View File

@@ -39,8 +39,7 @@ class ArticleTrash
'list_rows' => $param['size'] 'list_rows' => $param['size']
]) ])
->hidden(['category_id', 'category']) ->hidden(['category_id', 'category'])
->bindAttr('category', ['category_name' => 'name']) ->bindAttr('category', ['category_name' => 'name']);
?->each(fn($item) => $item->image = thumb($item->image));
return success('获取成功', $data); return success('获取成功', $data);
} }

View File

@@ -48,8 +48,7 @@ class Attachment
'page' => $params['page'] 'page' => $params['page']
]) ])
->bindAttr('category', ['category_name']) ->bindAttr('category', ['category_name'])
->hidden(['category_id', 'category']) ->hidden(['category_id', 'category']);
?->each(fn($item) => $item->image = thumb($item->image));
return success('获取成功', $attachments); return success('获取成功', $attachments);
} }

View File

@@ -46,8 +46,7 @@ class AttachmentTrash
'page' => $params['page'] 'page' => $params['page']
]) ])
->bindAttr('category', ['category_name']) ->bindAttr('category', ['category_name'])
->hidden(['category_id', 'category']) ->hidden(['category_id', 'category']);
?->each(fn($item) => $item->image = thumb($item->image));
return success('获取成功', $attachments); return success('获取成功', $attachments);
} }

View File

@@ -34,12 +34,12 @@ class Banner
$datas = []; $datas = [];
if (!$banners->isEmpty()) { if (!$banners->isEmpty()) {
$temp = []; $temp = [];
$map = ['pc' => ['id' => -1, 'name' => 'PC端'], 'mobile' => ['id' => -2, 'name' => '移动端']]; $map = ['pc' => 'PC端', 'mobile' => '移动端'];
foreach ($banners as $banner) { foreach ($banners as $banner) {
if (!isset($temp[$banner->at_platform])) { if (!isset($temp[$banner->at_platform])) {
$temp[$banner->at_platform] = [ $temp[$banner->at_platform] = [
'id' => $map[$banner->at_platform]['id'] ?? 0, 'id' => 0,
'name' => $map[$banner->at_platform]['name'] ?? '未知平台', 'name' => $map[$banner->at_platform] ?? '未知平台',
'children' => [] 'children' => []
]; ];
} }

View File

@@ -33,17 +33,13 @@ class BannerItem
'item.sort', 'item.sort',
'item.status', 'item.status',
'item.created_at', 'item.created_at',
'bnr.name' => 'banner_name' 'banner.name' => 'banner_name'
]) ])
->join('sys_banner bnr', 'bnr.id = item.banner_id') ->join('sys_banner banner', 'banner.id = item.banner_id')
->where('bnr.language_id', '=', request()->lang_id) ->where('banner.language_id', '=', request()->lang_id)
->where(function($query) use($param){ ->where(function($query) use($param){
if (!empty($param['banner_id'])) { if (!empty($param['banner_id'])) {
if (is_array($param['banner_id']) || str_contains($param['banner_id'], ',')) { $query->where('item.banner_id', '=', $param['banner_id']);
$query->whereIn('item.banner_id', $param['banner_id']);
} else {
$query->where('item.banner_id', '=', $param['banner_id']);
}
} }
if (!empty($param['title'])) { if (!empty($param['title'])) {
$query->where('item.title', 'like', "%{$param['title']}%"); $query->where('item.title', 'like', "%{$param['title']}%");
@@ -64,8 +60,7 @@ class BannerItem
->paginate([ ->paginate([
'list_rows' => $param['size'], 'list_rows' => $param['size'],
'page' => $param['page'] 'page' => $param['page']
]) ]);
->each(fn($item) => $item->image = thumb($item->image));
return success('获取成功', $banner_items); return success('获取成功', $banner_items);
} }
@@ -81,7 +76,6 @@ class BannerItem
'updated_at', 'updated_at',
'deleted_at' 'deleted_at'
]) ])
->append(['rel_prod_cate_id', 'rel_prod_cate_name']) // 绑定产品分类关联模型中字段到父模型中
->find($id); ->find($id);
if (empty($banner_item)) { if (empty($banner_item)) {
return error('横幅不存在'); return error('横幅不存在');
@@ -101,13 +95,10 @@ class BannerItem
'rel_prod_cate_id', 'rel_prod_cate_id',
'title', 'title',
'title_txt_color', 'title_txt_color',
'short_title',
'short_title_txt_color',
'desc', 'desc',
'desc_txt_color', 'desc_txt_color',
'type', 'type',
'image', 'image',
'extra_image',
'video', 'video',
'link_to' => 'custom', 'link_to' => 'custom',
'link', 'link',
@@ -158,13 +149,10 @@ class BannerItem
'rel_prod_cate_id', 'rel_prod_cate_id',
'title', 'title',
'title_txt_color', 'title_txt_color',
'short_title',
'short_title_txt_color',
'desc', 'desc',
'desc_txt_color', 'desc_txt_color',
'type', 'type',
'image', 'image',
'extra_image',
'video', 'video',
'link_to', 'link_to',
'link', 'link',
@@ -193,7 +181,10 @@ class BannerItem
// 更新关联的产品分类 // 更新关联的产品分类
if (!empty($put['rel_prod_cate_id'])) { if (!empty($put['rel_prod_cate_id'])) {
SysBannerProdCateMappingModel::where('banner_item_id', '=', $id)->delete(); $ok = SysBannerProdCateMappingModel::where('banner_item_id', '=', $id)->delete();
if (!$ok) {
throw new InvalidOperateException('更新横幅与产品分类关联失败');
}
$mapping = SysBannerProdCateMappingModel::create([ $mapping = SysBannerProdCateMappingModel::create([
'banner_item_id' => $id, 'banner_item_id' => $id,
'product_category_id' => $put['rel_prod_cate_id'] 'product_category_id' => $put['rel_prod_cate_id']
@@ -212,7 +203,7 @@ class BannerItem
Log::error(sprintf('%s:%s %s', $th->getFile(), $th->getLine(), $th->getMessage())); Log::error(sprintf('%s:%s %s', $th->getFile(), $th->getLine(), $th->getMessage()));
return error('操作失败'); return error('操作失败');
} }
return success('操作成功'); return success('操作成功');
} }
@@ -244,12 +235,10 @@ class BannerItem
'banner_name' => '分类名称', 'banner_name' => '分类名称',
'title' => '横幅名称', 'title' => '横幅名称',
'title_txt_color' => '横幅名称字体颜色', 'title_txt_color' => '横幅名称字体颜色',
'short_title' => '横幅简称',
'desc' => '描述', 'desc' => '描述',
'desc_txt_color' => '描述字体颜色', 'desc_txt_color' => '描述字体颜色',
'type' => '前台显示类型', 'type' => '前台显示类型',
'image' => '图片地址', 'image' => '图片地址',
'extra_image' => '额外图片地址',
'video' => '视频地址', 'video' => '视频地址',
'link_to' => '链接类型', 'link_to' => '链接类型',
'link' => '链接地址', 'link' => '链接地址',
@@ -267,21 +256,21 @@ class BannerItem
// 获取导出数据 // 获取导出数据
private function getBannerExportData() private function getBannerExportData()
{ {
$server = request()->server(); $param = request()->param([
$image_host = $server['REQUEST_SCHEME'] . "://" . $server['SERVER_NAME'] . '/'; 'title',
$param = request()->param(['title', 'banner_id', 'created_at']); 'banner_id',
'created_at'
]);
return SysBannerItemModel::alias('item') return SysBannerItemModel::alias('item')
->field([ ->field([
'item.id', 'item.id',
'banner.name' => 'banner_name', 'banner.name' => 'banner_name',
'item.title', 'item.title',
'item.title_txt_color', 'item.title_txt_color',
'item.short_title',
'item.desc', 'item.desc',
'item.desc_txt_color', 'item.desc_txt_color',
'item.type', 'item.type',
'item.image', 'item.image',
'item.extra_image',
'item.video', 'item.video',
'item.link_to', 'item.link_to',
'item.link', 'item.link',
@@ -293,11 +282,7 @@ class BannerItem
->where('banner.language_id', '=', request()->lang_id) ->where('banner.language_id', '=', request()->lang_id)
->where(function($query) use($param){ ->where(function($query) use($param){
if (!empty($param['banner_id'])) { if (!empty($param['banner_id'])) {
if (is_array($param['banner_id']) || str_contains($param['banner_id'], ',')) { $query->where('item.banner_id', '=', $param['banner_id']);
$query->whereIn('item.banner_id', $param['banner_id']);
} else {
$query->where('item.banner_id', '=', $param['banner_id']);
}
} }
if (!empty($param['title'])) { if (!empty($param['title'])) {
$query->where('item.title', 'like', "%{$param['title']}%"); $query->where('item.title', 'like', "%{$param['title']}%");
@@ -315,13 +300,7 @@ class BannerItem
} }
}) })
->order(['item.sort' => 'asc', 'item.id' => 'desc']) ->order(['item.sort' => 'asc', 'item.id' => 'desc'])
->select() ->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;
});
} }
// 删除 // 删除

View File

@@ -38,8 +38,7 @@ class Faq
->paginate([ ->paginate([
'list_rows' => $param['size'], 'list_rows' => $param['size'],
'page' => $param['page'], 'page' => $param['page'],
]) ]);
?->each(fn($item) => $item->image = thumb($item->image));
return success('获取成功', $faqs); return success('获取成功', $faqs);
} }

View File

@@ -4,7 +4,6 @@ declare (strict_types = 1);
namespace app\admin\controller\v1; namespace app\admin\controller\v1;
use app\admin\model\v1\SysOperateLog; use app\admin\model\v1\SysOperateLog;
use app\admin\model\v1\SysUserModel;
/** /**
* 操作日志控制器 * 操作日志控制器
@@ -22,15 +21,11 @@ class OperateLog
'size/d' 'size/d'
]); ]);
$logs = SysOperateLog::field([ $logs = SysOperateLog::hasWhere('user', function($query) use($param) {
'SysOperateLog.*',
'SysUserModel.username'
])
->hasWhere('user', function($query) use($param) {
if (!empty($param['operator'])) { if (!empty($param['operator'])) {
$query->where('username', 'like', "%{$param['operator']}%"); $query->where('username', 'like', "{$param['operator']}");
} }
$query->withTrashed()->field(['id', 'username']); $query->field(['id', 'username']);
}) })
->withSearch(['title', 'created_at'], [ ->withSearch(['title', 'created_at'], [
'title' => $param['title'] ?? null, 'title' => $param['title'] ?? null,
@@ -41,6 +36,7 @@ class OperateLog
'list_rows' => $param['size'] ?? 10, 'list_rows' => $param['size'] ?? 10,
'page' => $param['page'] ?? 1, 'page' => $param['page'] ?? 1,
]) ])
->bindAttr('user', ['username'])
->hidden(['user_id', 'user']); ->hidden(['user_id', 'user']);
return success('获取成功', $logs); return success('获取成功', $logs);

View File

@@ -57,14 +57,13 @@ class Product
]) ])
->categoryNullable($param['category_id']??null) ->categoryNullable($param['category_id']??null)
->isShowNullable(isset($param['is_show']) ? (bool)$param['is_show'] : null) ->isShowNullable(isset($param['is_show']) ? (bool)$param['is_show'] : null)
->order(['sort' => 'asc', 'created_at' => 'desc', 'id' => 'desc']) ->order(['sort' => 'asc', 'id' => 'desc'])
->paginate([ ->paginate([
'list_rows' => $param['size'], 'list_rows' => $param['size'],
'page' => $param['page'], 'page' => $param['page'],
]) ])
->bindAttr('category', ['category_name' => 'name']) ->bindAttr('category', ['category_name' => 'name'])
->hidden(['category_id', 'category']) ->hidden(['category_id', 'category']);
?->each(fn($item) => $item->cover_image = thumb($item->cover_image));
return success('获取成功', $products); return success('获取成功', $products);
} }
@@ -171,7 +170,7 @@ class Product
// 更新产品参数 // 更新产品参数
if ($put['params'] != "") { if ($put['params'] != "") {
ProductParamsModel::productId($id)->delete(); ProductParamsModel::productId($id)->delete();
if (preg_match_all('/(.+):(.+)/', $put['params'], $match_result)) { if (preg_match_all('/(\S+):(.[^\s]+)/', $put['params'], $match_result)) {
$params = []; $params = [];
for ($i = 0; $i < count($match_result[0]); $i++) { for ($i = 0; $i < count($match_result[0]); $i++) {
$params[] = [ $params[] = [
@@ -346,7 +345,7 @@ class Product
private function getExportProductData() private function getExportProductData()
{ {
$server = request()->server(); $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([ $param = request()->param([
'name', 'name',
'spu', 'spu',
@@ -360,10 +359,10 @@ class Product
'spu', 'spu',
'name', 'name',
'short_name', 'short_name',
'cover_image', 'CONCAT("' . $image_host . '", `cover_image`)' => 'cover_image',
'desc', 'desc',
'video_img', 'CONCAT("' . $image_host . '", `video_img`)' => 'video_img',
'video_url', 'CONCAT("' . $image_host . '", `video_url`)' => 'video_url',
'CASE WHEN is_new = 1 THEN "是" ELSE "否" END' => 'is_new', 'CASE WHEN is_new = 1 THEN "是" ELSE "否" END' => 'is_new',
'CASE WHEN is_hot = 1 THEN "是" ELSE "否" END' => 'is_hot', 'CASE WHEN is_hot = 1 THEN "是" ELSE "否" END' => 'is_hot',
'CASE WHEN is_sale = 1 THEN "是" ELSE "否" END' => 'is_sale', 'CASE WHEN is_sale = 1 THEN "是" ELSE "否" END' => 'is_sale',
@@ -390,18 +389,7 @@ class Product
->order(['id' => 'asc']) ->order(['id' => 'asc'])
->select() ->select()
->bindAttr('category', ['category_name' => 'name']) ->bindAttr('category', ['category_name' => 'name'])
->hidden(['category_id', 'category']) ->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"]);
}
});
if (!$products->isEmpty()) { if (!$products->isEmpty()) {
// 产品参数 // 产品参数

View File

@@ -16,9 +16,8 @@ class ProductTcoCategory
$param = request()->param(['name']); $param = request()->param(['name']);
$categorys = ProductTcoCategoryModel::field([ $categorys = ProductTcoCategoryModel::field([
'id', 'tco_id' => 'id',
'tco_id', 'tco_pid' => 'pid',
'tco_pid',
'name', 'name',
]) ])
->withSearch(['name'], [ ->withSearch(['name'], [
@@ -26,10 +25,10 @@ class ProductTcoCategory
]) ])
->language(request()->lang_id) ->language(request()->lang_id)
->enabled() ->enabled()
->order(['tco_id' => 'asc']) ->order(['id' => 'asc'])
->select() ->select()
->toArray(); ->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

@@ -55,8 +55,7 @@ class ProductTrash
'page' => $param['page'], 'page' => $param['page'],
]) ])
->bindAttr('category', ['category_name' => 'name']) ->bindAttr('category', ['category_name' => 'name'])
->hidden(['category_id', 'category']) ->hidden(['category_id', 'category']);
?->each(fn($item) => $item->cover_image = thumb($item->cover_image));
return success('获取成功', $products); return success('获取成功', $products);
} }

View File

@@ -141,61 +141,6 @@ class SiteConfig
return $ret; return $ret;
} }
// 根据分组获取配置
public function getByGroupUniqueLabel($unique_label)
{
$configs = SysConfigModel::alias('c')
->field([
'c.id',
'c.title',
'c.name',
'c.value',
])
->join(SysConfigGroupModel::getTable(). ' g', 'g.id = c.group_id')
->where('g.language_id', '=', request()->lang_id)
->where('g.unique_label', '=', $unique_label)
->where('g.status', '=', 1)
->order(['c.sort' => 'asc', 'c.id' => 'desc'])
->select()
->each(function ($item) {
// 修改字段为null的输出为空字符串
$keys = array_keys($item->toArray());
foreach ($keys as $key) {
if (is_null($item[$key])) {
$item[$key] = '';
}
}
return $item;
})
->toArray();
if (!empty($configs)) {
$configs_map = [];
foreach ($configs as $cfg) {
$current = &$configs_map;
// 根据name中"."拆分为多维数组
$parts = explode('.', $cfg['name']);
foreach ($parts as $part) {
if (!isset($current[$part])) {
$current[$part] = [];
}
$current = &$current[$part];
}
$current = [
'id' => $cfg['id'],
'title' => $cfg['title'],
'name' => $cfg['name'],
'value' => $cfg['value']
];
}
unset($current);
return $configs_map;
}
return [];
}
// 更新配置 // 更新配置
public function update() public function update()
{ {

View File

@@ -8,6 +8,7 @@ use app\admin\model\v1\ArticleModel;
use app\admin\model\v1\ProductCategoryModel; use app\admin\model\v1\ProductCategoryModel;
use app\admin\model\v1\ProductModel; use app\admin\model\v1\ProductModel;
use think\facade\Db; use think\facade\Db;
use think\facade\Route;
class System class System
{ {
@@ -146,11 +147,7 @@ class System
'name' => '产品分类', 'name' => '产品分类',
'link_to' => 'product_category', 'link_to' => 'product_category',
'data' => array_to_tree(array_map(function($item) { 'data' => array_to_tree(array_map(function($item) {
if ($item['pid'] == 0) { $item['url'] = (string)url('/index/product/category/' . $item['id']);
$item['url'] = (string)url('/index/product/category/'. $item['id']);
} else {
$item['url'] = (string)url('/index/product/subcategory/' . $item['id']);
}
return $item; return $item;
}, $product_category), 0, 'pid', false, false) }, $product_category), 0, 'pid', false, false)
], ],
@@ -158,11 +155,6 @@ class System
'name' => '产品', 'name' => '产品',
'link_to' => 'product', 'link_to' => 'product',
'data' => array_to_tree($product_category, 0, 'pid', false, false) 'data' => array_to_tree($product_category, 0, 'pid', false, false)
],
[
'name' => '其他内页',
'link_to' => 'system_page',
'data' => self::getSystemOtherPages()
] ]
]; ];
@@ -228,140 +220,10 @@ class System
return $data->toArray(); return $data->toArray();
} }
// 获取系统其他内页
static private function getSystemOtherPages()
{
return [
[
'id' => 1,
'name' => '首页',
'url' => (string)url('/index/index/index')
],
[
'id' => 2,
'name' => '新品上市',
'url' => (string)url('/index/product/newpro')
],
[
'id' => 3,
'name' => '附件下载',
'url' => (string)url('/index/attachment/index')
],
[
'id' => 4,
'name' => '问答中心',
'url' => (string)url('/index/faq/index')
],
[
'id' => 5,
'name' => '关于我们',
'url' => '',
'children' => [
[
'id' => 51,
'name' => '品牌介绍',
'url' => (string)url('/index/aboutus/introduction')
],
[
'id' => 52,
'name' => '品牌故事',
'url' => (string)url('/index/aboutus/story')
],
[
'id' => 53,
'name' => '品牌历程',
'url' => (string)url('/index/aboutus/mileage')
],
[
'id' => 54,
'name' => '文化介绍',
'url' => (string)url('/index/aboutus/culture')
],
[
'id' => 55,
'name' => '售后政策',
'url' => (string)url('/index/aboutus/policy')
]
]
],
[
'id' => 6,
'name' => '联系我们',
'url' => '',
'children' => [
[
'id' => 61,
'name' => '联系我们',
'url' => (string)url('/index/contactus/index')
],
[
'id' => 62,
'name' => '留言联系我们',
'url' => (string)url('/index/contactus/message')
],
[
'id' => 63,
'name' => '留言成为分销商',
'url' => (string)url('/index/contactus/distributor')
],
[
'id' => 64,
'name' => '留言批量购买',
'url' => (string)url('/index/contactus/bulkbuy')
]
]
],
[
'id' => 7,
'name' => 'NAS专题',
'url' => '',
'children' => [
[
'id' => 71,
'name' => '首页',
'url' => (string)url('/index/topic/nas/index')
],
[
'id' => 72,
'name' => '产品体验',
'url' => (string)url('/index/topic/nas/product')
],
[
'id' => 73,
'name' => '客户合作',
'url' => (string)url('/index/topic/nas/cooperation')
],
[
'id' => 74,
'name' => '帮助中心',
'url' => (string)url('/index/topic/nas/help')
],
[
'id' => 75,
'name' => '软件下载',
'url' => (string)url('/index/topic/nas/download')
]
]
],
[
'id' => 8,
'name' => '电力品线专题',
'url' => '',
'children' => [
[
'id' => 81,
'name' => '首页',
'url' => (string)url('/index/topic/power_prodline/index')
],
]
]
];
}
// 根据系统页面url获取回显数据项 // 根据系统页面url获取回显数据项
static public function getEchoDataBySystemPageUrl($link_to, $link) static public function getEchoDataBySystemPageUrl($link_to, $link)
{ {
if ('custom' == $link_to || empty($link)) return []; if ('custom' == $link_to) return [];
$data = []; $data = [];
$params = []; $params = [];
@@ -373,29 +235,21 @@ class System
parse_str($url, $params); parse_str($url, $params);
} }
if (empty($params['id'])) return [];
switch ($link_to) { switch ($link_to) {
case 'article_category': case 'article_category':
if (empty($params['id'])) return [];
$data = ArticleCategoryModel::field(['id', 'name'])->bypk($params['id'])->find(); $data = ArticleCategoryModel::field(['id', 'name'])->bypk($params['id'])->find();
break; break;
case 'article': case 'article':
if (empty($params['id'])) return [];
$data = ArticleModel::field(['id', 'title' => 'name'])->bypk($params['id'])->find(); $data = ArticleModel::field(['id', 'title' => 'name'])->bypk($params['id'])->find();
break; break;
case 'product_category': case 'product_category':
if (empty($params['id'])) return [];
$data = ProductCategoryModel::field(['id', 'name'])->bypk($params['id'])->find(); $data = ProductCategoryModel::field(['id', 'name'])->bypk($params['id'])->find();
break; break;
case 'product': case 'product':
if (empty($params['id'])) return [];
$data = ProductModel::field(['id', 'name'])->bypk($params['id'])->find(); $data = ProductModel::field(['id', 'name'])->bypk($params['id'])->find();
break; break;
case 'system_page':
$data = self::filterSystemOtherPage(self::getSystemOtherPages(), function($item) use ($params, $link) {
if (empty($params['id'])) return $item['url'] == $link;
return $item['id'] == $params['id'];
});
break;
default: default:
return []; return [];
break; break;
@@ -408,22 +262,4 @@ class System
'link' => $link 'link' => $link
]; ];
} }
// 根据条件过滤结果
static private function filterSystemOtherPage(array $data, callable $callback): array
{
foreach ($data as $it) {
if ($callback($it)) {
return $it;
}
if (isset($it['children'])) {
$child = self::filterSystemOtherPage($it['children'], $callback);
if (!empty($child)) {
return $child;
}
}
}
return [];
}
} }

View File

@@ -7,9 +7,7 @@ use app\admin\model\v1\SysImageUploadRecordModel;
use app\admin\model\v1\SysVideoUploadRecordModel; use app\admin\model\v1\SysVideoUploadRecordModel;
use app\admin\model\v1\SysAttachmentUploadRecordModel; use app\admin\model\v1\SysAttachmentUploadRecordModel;
use Intervention\Image\ImageManager; use Intervention\Image\ImageManager;
use Intervention\Image\Typography\FontFactory;
use think\facade\Filesystem; use think\facade\Filesystem;
use filesystem\Qiniu;
/** /**
* 文件上传控制器 * 文件上传控制器
@@ -32,7 +30,7 @@ class Upload
$max_size = strtobytes(env('ADMIN_API.MAX_IMAGE_SIZE', '1mb')); $max_size = strtobytes(env('ADMIN_API.MAX_IMAGE_SIZE', '1mb'));
$validate = validate([ $validate = validate([
'module' => 'require|max:64', 'module' => 'require|max:64',
'image' => "fileSize:$max_size|fileExt:jpg,jpeg,png,gif,webp" 'image' => "fileSize:$max_size|fileExt:jpg,jpeg,png,gif"
]); ]);
if (!$validate->check(['module' => $param['module'], 'image' => $file])) { if (!$validate->check(['module' => $param['module'], 'image' => $file])) {
return error($validate->getError()); return error($validate->getError());
@@ -43,121 +41,25 @@ class Upload
$filemd5 = $file->md5(); $filemd5 = $file->md5();
$filesha1 = $file->sha1(); $filesha1 = $file->sha1();
// 获取图片上传配置 $image_model = SysImageUploadRecordModel::md5($filemd5)->find();
list(
'filename_keep' => $filename_keep,
'filemd5_unique' => $filemd5_unique,
'filetype_to' => $filetype_to,
) = $this->getUploadOptions('upload_image');
// 获取文件大小
$file_size = $file->getSize();
// 获取文件mime类型
$mime_type = $file->getOriginalMime();
// 是否需要根据文件MD5值检查文件是否已存在
$image_model = $filemd5_unique ? SysImageUploadRecordModel::md5($filemd5)->find() : null;
if (is_null($image_model)) { if (is_null($image_model)) {
// 检查是否需要保留原文件名生成器 $filename = Filesystem::disk('image')->putFile($param['module'], $file);
$name_rule = fn() => $filename_keep ? $this->filenameGenerator($file) : null; // 生成缩略图
$image_manager = new ImageManager(new \Intervention\Image\Drivers\Imagick\Driver());
// 处理图片 $image = $image_manager->read('.' . $storage . '/' . $filename);
$image_manager = ImageManager::gd();
if ($filetype_to == 'original') {
$filename = Filesystem::disk('image')->putFile($param['module'], $file, $name_rule());
$image = $image_manager->read('.' . $storage . '/' . $filename);
}
else if ($filetype_to == 'webp') {
$image = $image_manager->read($file->getRealPath());
// 转换为webp格式
$webp = $image->toWebp(75);
$root = config('filesystem.disks.image.root');
$filename = $param['module'] . '/' . ($name_rule() ? $name_rule()() : date('Ymd') . '/' . md5((string)time() . random_str(8))) . '.webp';
$webp->save($this->checkPath($root . '/' . $filename));
// 获取webp文件大小
$file_size = $webp->size();
// 获取webp文件mime类型
$mime_type = $webp->mimetype();
}
// 水印
list(
'enabled' => $enabled,
'type' => $type,
'text_options' => $text_options,
'image_options' => $image_options
) = $this->getWatermarkOptions();
if ($enabled) {
// 图片水印
if ($type == 'IMAGE' && $image_options['image'] != '') {
// 读取水印图片
$watermark_image = $image_manager->read(public_path() . $image_options['image']);
// 缩放水印图片
$watermark_image->scale($image_options['width'], $image_options['height']);
// 绘制水印图片
$image->place(
$watermark_image,
$image_options['position'],
$image_options['offset_x'],
$image_options['offset_y'],
$image_options['opacity']
);
}
// 文字水印
else if ($type == 'TEXT' && $text_options['txt'] != '') {
// 原图宽度
$origin_width = $image->width();
// 原图高度
$origin_height = $image->height();
$font_factory = new FontFactory(function(FontFactory $font) use($text_options) {
// 设置字体
$font->filename(public_path() . $text_options['font']);
// 设置字体大小
$font->size($text_options['size']);
// 设置字体颜色及透明度
$opacity = $text_options['opacity'] > 0 ? dechex((int)ceil(255 * ($text_options['opacity'] / 100))) : '00';
$font->color($text_options['color'] . $opacity);
$font->align('left');
$font->valign('top');
});
// 文字尺寸
$font_rect = $image->driver()->fontProcessor()->boxSize($text_options['txt'], $font_factory());
// 计算偏移量
list($offset_x, $offset_y) = $this->scaleTxtOffsetXYByPosition(
$text_options['position'],
$text_options['offset_x'],
$text_options['offset_y'],
$origin_width,
$origin_height,
$font_rect->width(),
$font_rect->height()
);
// 绘制文字
$image->text(
$text_options['txt'],
$offset_x,
$offset_y,
$font_factory()
);
}
$image->save('.'. $storage. '/'. $filename);
}
// 缩略图
$image->scale(200, 200); $image->scale(200, 200);
$idx = strrpos($filename, '.'); $idx = strrpos($filename, '.');
$thumb_filename = mb_substr($filename, 0, $idx) . '_thumb.' . mb_substr($filename, $idx + 1); $thumb_filename = mb_substr($filename, 0, $idx) . '_thumb.' . mb_substr($filename, $idx + 1);
$image->save('.' . $storage . '/' . $thumb_filename); $image->save('.' . $storage . '/' . $thumb_filename);
// 保存图片 // 保存图片
$image_model = new SysImageUploadRecordModel(); $image_model = new SysImageUploadRecordModel();
$image_model->language_id = request()->lang_id; $image_model->language_id = request()->lang_id;
$image_model->module = $param['module']; $image_model->module = $param['module'];
$image_model->image_path = $storage . '/' . $filename; $image_model->image_path = $filename;
$image_model->image_thumb = $storage . '/' . $thumb_filename; $image_model->image_thumb = $thumb_filename;
$image_model->file_size = $file_size; $image_model->file_size = $file->getSize();
$image_model->file_type = $mime_type; $image_model->file_type = $file->getOriginalMime();
$image_model->file_md5 = $filemd5; $image_model->file_md5 = $filemd5;
$image_model->file_sha1 = $filesha1; $image_model->file_sha1 = $filesha1;
if (!$image_model->save()) { if (!$image_model->save()) {
@@ -166,8 +68,8 @@ class Upload
} }
return success('操作成功', [ return success('操作成功', [
'path' => $image_model->image_path, 'path' => $storage . '/' . $image_model->image_path,
'thumb_path' => $image_model->image_thumb, 'thumb_path' => $storage . '/' . $image_model->image_thumb,
'filemd5' => $image_model->file_md5, 'filemd5' => $image_model->file_md5,
'filesha1' => $image_model->file_sha1 'filesha1' => $image_model->file_sha1
]); ]);
@@ -177,143 +79,6 @@ class Upload
return error('上传失败'); return error('上传失败');
} }
/**
* 检查路径
*
* @param string $path
* @return string
*/
private function checkPath($path): string
{
$ok = true;
$filename = basename($path);
$dirname = dirname($path);
if (!is_dir($dirname)) {
$ok = @mkdir($dirname, 0755, true);
}
else if (!is_writable($dirname)) {
$ok = @chmod($dirname,0755);
}
if ($ok) {
return $dirname . '/' . $filename;
}
throw new \Exception("上传目标目录不可用");
}
/**
* 文件名生成回调
*
* @param \think\file\UploadedFile $file
* @return callable
*/
private function filenameGenerator(\think\file\UploadedFile $file): callable
{
return fn() => date('Ymd') . '/' . pathinfo($file->getOriginalName(), PATHINFO_FILENAME);
}
/**
* 获取上传配置
*
* @param string $module
* @return array
*/
private function getUploadOptions($module)
{
$config_model = new \app\admin\controller\v1\SiteConfig;
$config = $config_model->getByGroupUniqueLabel('upload');
$options = data_get($config, $module, []);
return [
'filename_keep' => (int)data_get($options, 'filename_keep.value', 0) == 1,
'filemd5_unique' => (int)data_get($options, 'filemd5_unique.value', 0) == 1,
'filetype_to' => data_get($options, 'filetype_to.value', 'original'),
'save_to' => data_get($options, 'save_to.value', 'local'),
];
}
/**
* 获取水印配置
*
* @return array
*/
private function getWatermarkOptions(): array
{
$config_model = new \app\admin\controller\v1\SiteConfig;
$watermark_config = $config_model->getByGroupUniqueLabel('watermark');
$opacity = data_get($watermark_config, 'watermark_opacity.value', 100);
if ($opacity == '') {
$opacity = 100;
}
return [
'enabled' => data_get($watermark_config, 'watermark_enabled.value', 0) == 1,
'type' => data_get($watermark_config, 'watermark_type.value', ''),
'text_options' => [
'txt' => data_get($watermark_config, 'watermark_text_value.value', ''),
'font' => data_get($watermark_config, 'watermark_text_font.value', ''),
'size' => (float)data_get($watermark_config, 'watermark_text_size.value', 12)?:12,
'color' => data_get($watermark_config, 'watermark_text_color.value', '#000000')?:'#000000',
'position' => data_get($watermark_config, 'watermark_position.value', 'top-left')?:'top-left',
'offset_x' => (int)data_get($watermark_config, 'watermark_offset_x.value', 0),
'offset_y' => (int)data_get($watermark_config, 'watermark_offset_y.value', 0),
'opacity' => (int)$opacity,
],
'image_options' => [
'image' => data_get($watermark_config, 'watermark_image_value.value', ''),
'width' => (int)data_get($watermark_config, 'watermark_image_width.value')?:null,
'height' => (int)data_get($watermark_config, 'watermark_image_height.value')?:null,
'position' => data_get($watermark_config, 'watermark_position.value', 'top-left')?:'top-left',
'offset_x' => (int)data_get($watermark_config, 'watermark_offset_x.value', 0),
'offset_y' => (int)data_get($watermark_config, 'watermark_offset_y.value', 0),
'opacity' => (int)$opacity,
]
];
}
/**
* 计算文本水印偏移量
*
* @param string $position
* @param integer $offset_x
* @param integer $offset_y
* @param integer $image_width
* @param integer $image_height
* @param integer $txt_width
* @param integer $txt_height
* @return array
*/
private function scaleTxtOffsetXYByPosition(string $position, int $offset_x, int $offset_y, int $image_width, int $image_height, int $txt_width, int $txt_height)
{
switch ($position) {
case 'top-left':
// top-left:左上角
return [$offset_x, $offset_y];
case 'top-right':
// top-right:右上角
return [(int)($image_width-$txt_width-$offset_x), $offset_y];
case 'top':
// top:上 - 水平居中
return [(int)(($image_width-$txt_width+$offset_x)/2), $offset_y];
case 'left':
// left:左 - 垂直居中
return [$offset_x, (int)(($image_height-$txt_height)/2+$offset_y)];
case 'center':
// center:水平垂直居中
return [(int)(($image_width-$txt_width)/2+$offset_x), (int)(($image_height-$txt_height)/2+$offset_y)];
case 'right':
// right:右 - 垂直居中
return [(int)($image_width-$txt_width-$offset_x), (int)(($image_height-$txt_height)/2+$offset_y)];
case'bottom':
// bottom:下 - 水平居中
return [(int)(($image_width-$txt_width+$offset_x)/2), (int)($image_height-$txt_height-$offset_y)];
case'bottom-left':
// bottom-left:左下角
return [$offset_x, (int)($image_height-$txt_height-$offset_y)];
case'bottom-right':
// bottom-right:右下角
return [(int)($image_width-$txt_width-$offset_x), (int)($image_height-$txt_height-$offset_y)];
default:
throw new \InvalidArgumentException('Invalid position');
}
}
/** /**
* 上传视频 * 上传视频
@@ -344,38 +109,15 @@ class Upload
$filemd5 = $file->md5(); $filemd5 = $file->md5();
$filesha1 = $file->sha1(); $filesha1 = $file->sha1();
// 获取视频上传配置 $video = SysVideoUploadRecordModel::md5($filemd5)->find();
list(
'filename_keep' => $filename_keep,
'filemd5_unique' => $filemd5_unique,
'save_to' => $save_to,
) = $this->getUploadOptions('upload_video');
// 是否需要根据文件MD5值检查文件是否已存在
$video = $filemd5_unique ? SysVideoUploadRecordModel::md5($filemd5)->find() : null;
if (is_null($video)) { if (is_null($video)) {
// 保存位置配置 key $filename = Filesystem::disk('video')->putFile($param['module'], $file);
$disk = 'video';
// 检查是否需要保留原文件名
$name_rule = fn() => $filename_keep ? $this->filenameGenerator($file) : null;
// 保存到七牛云
if ($save_to == 'qiniu_cloud') {
$disk = 'video_qiniu';
$storage = config('filesystem.disks.video_qiniu.path_prefix');
}
$filename = Filesystem::disk($disk)->putFile($param['module'], $file, $name_rule());
// 组装视频路径
$video_path = $storage . '/' . $filename;
if ($save_to == 'qiniu_cloud') {
$video_path = Filesystem::disk($disk)->url($filename);
}
// 保存视频 // 保存视频
$video = new SysVideoUploadRecordModel(); $video = new SysVideoUploadRecordModel();
$video->language_id = request()->lang_id; $video->language_id = request()->lang_id;
$video->module = $param['module']; $video->module = $param['module'];
$video->video_path = $video_path; $video->video_path = $filename;
$video->file_size = $file->getSize(); $video->file_size = $file->getSize();
$video->file_type = $file->getOriginalMime(); $video->file_type = $file->getOriginalMime();
$video->file_md5 = $filemd5; $video->file_md5 = $filemd5;
@@ -386,7 +128,7 @@ class Upload
} }
return success('上传成功', [ return success('上传成功', [
'path' => $video->video_path, 'path' => $storage . '/' . $video->video_path,
'file_md5' => $video->file_md5, 'file_md5' => $video->file_md5,
'file_sha1' => $video->file_sha1 'file_sha1' => $video->file_sha1
]); ]);
@@ -410,48 +152,23 @@ class Upload
try { try {
$max_size = strtobytes(env('ADMIN_API.MAX_ATTACHMENT_SIZE', '100mb')); $max_size = strtobytes(env('ADMIN_API.MAX_ATTACHMENT_SIZE', '100mb'));
$validate = validate([ $validate = validate([
'attachment' => "fileSize:$max_size|fileExt:biz,bz,bz2,gz,tgz,zip,rar,7z,doc,docx,xls,xlsx,csv,ppt,pptx,pdf,txt,jpg,jpeg,png,webp,ttf" 'attachment' => "fileSize:$max_size|fileExt:biz,bz,bz2,gz,tgz,zip,rar,7z,doc,docx,xls,xlsx,csv,ppt,pptx,pdf,txt,jpg,jpeg,png"
]); ]);
if (!$validate->check(['attachment' => $file])) { if (!$validate->check(['attachment' => $file])) {
return error($validate->getError()); return error($validate->getError());
} }
$storage = config('filesystem.disks.public.url');
$filemd5 = $file->md5(); $filemd5 = $file->md5();
$filesha1 = $file->sha1(); $filesha1 = $file->sha1();
// 获取附件上传配置 $attachment = SysAttachmentUploadRecordModel::md5($filemd5)->find();
list(
'filename_keep' => $filename_keep,
'filemd5_unique' => $filemd5_unique,
'save_to' => $save_to
) = $this->getUploadOptions('upload_attachment');
// 是否需要根据文件MD5值检查文件是否已存在
$attachment = $filemd5_unique ? SysAttachmentUploadRecordModel::md5($filemd5)->find() : null;
if (is_null($attachment)) { if (is_null($attachment)) {
// 保存位置配置 key $filename = Filesystem::disk('public')->putFile('attachments', $file);
$disk = 'public';
// 检查是否需要保留原文件名
$name_rule = fn() => $filename_keep ? $this->filenameGenerator($file) : null;
// 保存到七牛云 // 保存视频
if ($save_to == 'qiniu_cloud') {
$disk = 'public_qiniu';
$storage = config('filesystem.disks.public_qiniu.path_prefix');
}
$filename = Filesystem::disk($disk)->putFile('attachments', $file, $name_rule());
// 组装附件路径
$attachment_path = $storage . '/' . $filename;
if ($save_to == 'qiniu_cloud') {
$attachment_path = Filesystem::disk($disk)->url($filename);
}
// 保存附件
$attachment = new SysAttachmentUploadRecordModel(); $attachment = new SysAttachmentUploadRecordModel();
$attachment->language_id = request()->lang_id; $attachment->language_id = request()->lang_id;
$attachment->attachment_path = $attachment_path; $attachment->attachment_path = $filename;
$attachment->file_size = $file->getSize(); $attachment->file_size = $file->getSize();
$attachment->file_type = $file->getOriginalMime(); $attachment->file_type = $file->getOriginalMime();
$attachment->file_md5 = $filemd5; $attachment->file_md5 = $filemd5;
@@ -461,8 +178,9 @@ class Upload
} }
} }
$storage = config('filesystem.disks.public.url');
return success('上传成功', [ return success('上传成功', [
'path' => $attachment->attachment_path, 'path' => $storage . '/' . $attachment->attachment_path,
'file_md5' => $attachment->file_md5, 'file_md5' => $attachment->file_md5,
'file_sha1' => $attachment->file_sha1 'file_sha1' => $attachment->file_sha1
]); ]);

View File

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

View File

@@ -47,8 +47,7 @@ class VideoTrash
'page' => $params['page'], 'page' => $params['page'],
]) ])
->bindAttr('category', ['category_name']) ->bindAttr('category', ['category_name'])
->hidden(['category_id', 'category']) ->hidden(['category_id', 'category']);
?->each(fn($item) => $item->image = thumb($item->image));
return success('获取成功', $videos); return success('获取成功', $videos);
} }

View File

@@ -85,10 +85,6 @@ class ArticleModel extends ArticleBaseModel
// 分类查询 // 分类查询
public function scopeCategory($query, $value) public function scopeCategory($query, $value)
{ {
if (is_array($value) || str_contains($value, ',')) {
$query->whereIn('category_id', $value);
return;
}
$query->where('category_id', '=', $value); $query->where('category_id', '=', $value);
} }
public function scopeCategoryNullable($query, $value) public function scopeCategoryNullable($query, $value)
@@ -96,10 +92,6 @@ class ArticleModel extends ArticleBaseModel
if (is_null($value)) { if (is_null($value)) {
return; return;
} }
if (is_array($value) || str_contains($value, ',')) {
$query->whereIn('category_id', $value);
return;
}
$query->where('category_id', '=', $value); $query->where('category_id', '=', $value);
} }
} }

View File

@@ -58,10 +58,6 @@ class AttachmentModel extends AttachmentBaseModel
public function scopeCategoryId($query, $value) public function scopeCategoryId($query, $value)
{ {
if (empty($value)) return; if (empty($value)) return;
if (is_array($value) || str_contains($value, ',')) {
$query->whereIn('category_id', $value);
return;
}
$query->where('category_id', '=', $value); $query->where('category_id', '=', $value);
} }
} }

View File

@@ -29,12 +29,6 @@ class ProductCategoryModel extends ProductCategoryBaseModel
$query->where('language_id', '=', $value); $query->where('language_id', '=', $value);
} }
// 所属产品目录分类id查询
public function scopeTcoId($query, $value)
{
$query->where('related_tco_category', '=', $value);
}
/** /**
* 根据是否显示查询 * 根据是否显示查询
* @param $query * @param $query

View File

@@ -65,27 +65,13 @@ class ProductModel extends ProductBaseModel
if (is_null($value)) { if (is_null($value)) {
return; return;
} }
if (is_array($value) || str_contains($value, ',')) {
$query->whereIn('category_id', $value);
return;
}
$query->where('category_id', '=', $value); $query->where('category_id', '=', $value);
} }
public function scopeCategory($query, $value) public function scopeCategory($query, $value)
{ {
if (is_array($value) || str_contains($value, ',')) {
$query->whereIn('category_id', $value);
return;
}
$query->where('category_id', '=', $value); $query->where('category_id', '=', $value);
} }
// 规格型号查询
public function scopeSpu($query, $spu)
{
$query->where('spu', '=', $spu);
}
// 启用状态查询 // 启用状态查询
public function scopeEnabled($query) public function scopeEnabled($query)
{ {

View File

@@ -23,18 +23,6 @@ class ProductTcoCategoryModel extends ProductTcoCategoryBaseModel
$query->where('language_id', '=', $value); $query->where('language_id', '=', $value);
} }
// 根据 tco_id 查询
public function scopeTcoId($query, $value)
{
$query->where('tco_id', '=', $value);
}
// 根据ERP Code查询
public function scopeErpCode($query, $value)
{
$query->where('erp_code', '=', $value);
}
// 按分类名称搜索 // 按分类名称搜索
public function searchNameAttr($query, $value, $data) public function searchNameAttr($query, $value, $data)
{ {

View File

@@ -17,6 +17,8 @@ class SysBannerItemModel extends SysBannerItemBaseModel
// 软删除字段 // 软删除字段
protected $deleteTime = 'deleted_at'; protected $deleteTime = 'deleted_at';
// 绑定产品分类关联模型中字段到父模型
protected $append = ['rel_prod_cate_id', 'rel_prod_cate_name'];
// 要隐藏的字段或关联模型数据字段 // 要隐藏的字段或关联模型数据字段
protected $hidden = ['prodMapping']; protected $hidden = ['prodMapping'];
@@ -60,7 +62,7 @@ class SysBannerItemModel extends SysBannerItemBaseModel
} }
if (is_array($value)) { if (is_array($value)) {
if (count($value) > 1) { if (count($value) > 1) {
$query->whereBetweenTime('created_at', $value[0], $value[1]); $query->whereBetweenTime ('created_at', $value[0], $value[1]);
} else { } else {
$query->whereTime('created_at', '>=', $value[0]); $query->whereTime('created_at', '>=', $value[0]);
} }
@@ -71,10 +73,6 @@ class SysBannerItemModel extends SysBannerItemBaseModel
public function scopeBannerId($query, $value) public function scopeBannerId($query, $value)
{ {
if (is_null($value)) return; if (is_null($value)) return;
if (is_array($value) || str_contains($value, ',')) {
$query->whereIn('banner_id', $value);
return;
}
$query->where('banner_id', '=', $value); $query->where('banner_id', '=', $value);
} }
} }

View File

@@ -62,10 +62,6 @@ class VideoModel extends VideoBaseModel
if (empty($value)) { if (empty($value)) {
return; return;
} }
if (is_array($value) || str_contains($value, ',')) {
$query->whereIn('category_id', $value);
return;
}
$query->where('category_id', '=', $value); $query->where('category_id', '=', $value);
} }
} }

View File

@@ -616,12 +616,6 @@ Route::group('v1', function () {
}); });
})->prefix('v1.'); })->prefix('v1.');
// 接收产品目录同步数据
Route::group('receive_sync', function () {
Route::post('category', 'ReceiveProductSync/category');
Route::post('product', 'ReceiveProductSync/product');
});
Route::miss(function() { Route::miss(function() {
return '404 Not Found!'; return '404 Not Found!';
}); });

View File

@@ -64,36 +64,19 @@ class ArticleCategoryValidate extends Validate
if ($value == 0) { if ($value == 0) {
return true; return true;
} }
$children = [];
$table_name = (new ArticleCategoryModel)->getTable(); $table_name = (new ArticleCategoryModel)->getTable();
if (env('DB_VERSION', '5') == '8') { $children = Db::query(
$children = Db::query( preg_replace(
preg_replace( '/\s+/u',
'/\s+/u', ' ',
' ', "WITH RECURSIVE article_tree_by AS (
"WITH RECURSIVE article_tree_by AS ( SELECT a.id, a.pid FROM $table_name a WHERE a.id = {$data['id']}
SELECT a.id, a.pid FROM $table_name a WHERE a.id = {$data['id']} UNION ALL
UNION ALL SELECT k.id, k.pid FROM $table_name k INNER JOIN article_tree_by t ON t.id = k.pid
SELECT k.id, k.pid FROM $table_name k INNER JOIN article_tree_by t ON t.id = k.pid
)
SELECT id FROM article_tree_by WHERE id <> {$data['id']};"
) )
); SELECT id FROM article_tree_by WHERE id <> {$data['id']};"
} else { )
$children = \think\facade\Db::query(" );
SELECT t2.id
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
ON FIND_IN_SET(t2.pid, t1._id)
ORDER BY t2.id;
");
}
if (!empty($children) && in_array($data['pid'], array_column($children, 'id'))) { if (!empty($children) && in_array($data['pid'], array_column($children, 'id'))) {
return false; return false;
} }

View File

@@ -23,9 +23,9 @@ class ArticleValidate extends Validate
'sort' => 'integer', 'sort' => 'integer',
'recommend' => 'require|in:0,1', 'recommend' => 'require|in:0,1',
'release_time' => 'dateFormat:Y-m-d H:i:s', 'release_time' => 'dateFormat:Y-m-d H:i:s',
'seo_title' => 'max:512', 'seo_title' => 'max:255',
'seo_keywords' => 'max:512', 'seo_keywords' => 'max:255',
'seo_desc' => 'max:1024' 'seo_desc' => 'max:255'
]; ];
/** /**
@@ -48,8 +48,8 @@ class ArticleValidate extends Validate
'recommend.require' => '推荐状态不能为空', 'recommend.require' => '推荐状态不能为空',
'recommend.in' => '推荐状态的值必须是0或1', 'recommend.in' => '推荐状态的值必须是0或1',
'release_time.dateFormat' => '发布时间格式不正确', 'release_time.dateFormat' => '发布时间格式不正确',
'seo_title.max' => 'SEO标题长度不能超过512个字符', 'seo_title.max' => 'SEO标题长度不能超过255个字符',
'seo_keywords.max' => 'SEO关键字长度不能超过512个字符', 'seo_keywords.max' => 'SEO关键字长度不能超过255个字符',
'seo_desc.max' => 'SEO描述长度不能超过1024个字符' 'seo_desc.max' => 'SEO描述长度不能超过255个字符'
]; ];
} }

View File

@@ -49,36 +49,19 @@ class AttachmentCategoryValidate extends Validate
if ($value == 0) { if ($value == 0) {
return true; return true;
} }
$children = [];
$table_name = (new AttachmentCategoryModel)->getTable(); $table_name = (new AttachmentCategoryModel)->getTable();
if (env('DB_VERSION', '5') == '8') { $children = Db::query(
$children = Db::query( preg_replace(
preg_replace( '/\s+/u',
'/\s+/u', ' ',
' ', "WITH RECURSIVE attachment_tree_by AS (
"WITH RECURSIVE attachment_tree_by AS ( SELECT a.id, a.pid FROM $table_name a WHERE a.id = {$data['id']}
SELECT a.id, a.pid FROM $table_name a WHERE a.id = {$data['id']} UNION ALL
UNION ALL SELECT k.id, k.pid FROM $table_name k INNER JOIN attachment_tree_by t ON t.id = k.pid
SELECT k.id, k.pid FROM $table_name k INNER JOIN attachment_tree_by t ON t.id = k.pid
)
SELECT id FROM attachment_tree_by WHERE id <> {$data['id']};"
) )
); SELECT id FROM attachment_tree_by WHERE id <> {$data['id']};"
} else { )
$children = \think\facade\Db::query(" );
SELECT t2.id
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
ON FIND_IN_SET(t2.pid, t1._id)
ORDER BY t2.id;
");
}
if (!empty($children) && in_array($data['pid'], array_column($children, 'id'))) { if (!empty($children) && in_array($data['pid'], array_column($children, 'id'))) {
return false; return false;
} }

View File

@@ -21,7 +21,7 @@ class NavigationItemValidate extends Validate
'pid' => 'integer|different:id|checkPidNotBeChildren', 'pid' => 'integer|different:id|checkPidNotBeChildren',
'name' => 'require|max:64', 'name' => 'require|max:64',
'icon' => 'max:64', 'icon' => 'max:64',
'link_to' => 'require|max:64|in:article,article_category,product,product_category,system_page,custom', 'link_to' => 'require|max:64|in:article,article_category,product,product_category,custom',
'link' => 'max:255', 'link' => 'max:255',
'sort' => 'integer', 'sort' => 'integer',
'blank' => 'in:0,1', 'blank' => 'in:0,1',
@@ -47,7 +47,7 @@ class NavigationItemValidate extends Validate
'icon.max' => '图标最多不能超过64个字符', 'icon.max' => '图标最多不能超过64个字符',
'link_to.require' => '链接类型不能为空', 'link_to.require' => '链接类型不能为空',
'link_to.max' => '链接类型最多不能超过64个字符', 'link_to.max' => '链接类型最多不能超过64个字符',
'link_to.in' => '链接类型必须是article,article_category,product_category,product,system_page,custom中之一', 'link_to.in' => '链接类型必须是article,goods_category,goods,custom中之一',
'link.max' => '链接最多不能超过255个字符', 'link.max' => '链接最多不能超过255个字符',
'sort.integer' => '排序必须为整数', 'sort.integer' => '排序必须为整数',
'blank.in' => '是否新窗口打开只能是0或1', 'blank.in' => '是否新窗口打开只能是0或1',
@@ -61,36 +61,19 @@ class NavigationItemValidate extends Validate
if ($value == 0) { if ($value == 0) {
return true; return true;
} }
$children = [];
$table_name = (new SysNavigationItemModel)->getTable(); $table_name = (new SysNavigationItemModel)->getTable();
if (env('DB_VERSION', '5') == '8') { $children = Db::query(
$children = Db::query( preg_replace(
preg_replace( '/\s+/u',
'/\s+/u', ' ',
' ', "WITH RECURSIVE tree_by AS (
"WITH RECURSIVE tree_by AS ( SELECT a.id, a.pid FROM $table_name a WHERE a.id = {$data['id']}
SELECT a.id, a.pid FROM $table_name a WHERE a.id = {$data['id']} UNION ALL
UNION ALL SELECT k.id, k.pid FROM $table_name k INNER JOIN tree_by t ON t.id = k.pid
SELECT k.id, k.pid FROM $table_name k INNER JOIN tree_by t ON t.id = k.pid
)
SELECT id FROM tree_by WHERE id <> {$data['id']};"
) )
); SELECT id FROM tree_by WHERE id <> {$data['id']};"
} else { )
$children = \think\facade\Db::query(" );
SELECT t2.id
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
ON FIND_IN_SET(t2.pid, t1._id)
ORDER BY t2.id;
");
}
if (!empty($children) && in_array($data['pid'], array_column($children, 'id'))) { if (!empty($children) && in_array($data['pid'], array_column($children, 'id'))) {
return false; return false;
} }

View File

@@ -15,17 +15,16 @@ class SysBannerItemValidate extends Validate
*/ */
protected $rule = [ protected $rule = [
'id' => 'require|integer', 'id' => 'require|integer',
'banner_id' => 'require|integer|gt:0', 'banner_id' => 'require|integer',
'title' => 'require|max:256', 'title' => 'require|max:256',
'title_txt_color' => 'max:7', 'title_txt_color' => 'max:7',
'desc' => 'max:1024', 'desc' => 'max:1024',
'desc_txt_color' => 'max:7', 'desc_txt_color' => 'max:7',
'type' => 'in:image,video', 'type' => 'in:image,video',
'image' => 'max:255', 'image' => 'max:255',
'extra_image' => 'max:255',
'video' => 'max:255', 'video' => 'max:255',
'link_to' => 'requireIf:type,image|max:64|in:article,article_category,product,product_category,system_page,custom', 'link_to' => 'requireIf:type,image|max:64|in:article,article_category,product,product_category,custom',
'link' => 'max:510', 'link' => 'max:255',
'sort' => 'integer', 'sort' => 'integer',
'status' => 'in:-1,1' 'status' => 'in:-1,1'
]; ];
@@ -41,7 +40,6 @@ class SysBannerItemValidate extends Validate
'id.integer' => 'ID必须是整数', 'id.integer' => 'ID必须是整数',
'banner_id.require' => '横幅项分类不能为空', 'banner_id.require' => '横幅项分类不能为空',
'banner_id.integer' => '横幅项分类必须是整数', 'banner_id.integer' => '横幅项分类必须是整数',
'banner_id.gt' => '该横幅分类不可选',
'title.require' => '名称不能为空', 'title.require' => '名称不能为空',
'title.max' => '名称最多不能超过256个字符', 'title.max' => '名称最多不能超过256个字符',
'title_txt_color.max' => '名称字体颜色最多不能超过7个字符', 'title_txt_color.max' => '名称字体颜色最多不能超过7个字符',
@@ -49,12 +47,11 @@ class SysBannerItemValidate extends Validate
'desc_txt_color.max' => '描述字体颜色最多不能超过7个字符', 'desc_txt_color.max' => '描述字体颜色最多不能超过7个字符',
'type.in' => '显示类型必须是image或video', 'type.in' => '显示类型必须是image或video',
'image.max' => '图片地址最多不能超过255个字符', 'image.max' => '图片地址最多不能超过255个字符',
'extra_image.max' => '额外图片地址最多不能超过255个字符',
'video.max' => '视频地址最多不能超过255个字符', 'video.max' => '视频地址最多不能超过255个字符',
'link_to.requireIf' => '链接类型不能为空', 'link_to.requireIf' => '链接类型不能为空',
'link_to.max' => '链接类型最多不能超过64个字符', 'link_to.max' => '链接类型最多不能超过64个字符',
'link_to.in' => '链接类型必须是article,article_category,product,product_category,system_page,custom中之一', 'link_to.in' => '链接类型必须是article,article_category,product,product_category,custom中之一',
'link.max' => '链接最多不能超过512个字符', 'link.max' => '链接最多不能超过255个字符',
'sort.integer' => '排序值必须是整数', 'sort.integer' => '排序值必须是整数',
'status.in' => '状态必须是-1或1' 'status.in' => '状态必须是-1或1'
]; ];

View File

@@ -74,36 +74,19 @@ class SysMenuValidate extends Validate
if ($value == 0) { if ($value == 0) {
return true; return true;
} }
$children = [];
$table_name = (new SysMenuModel)->getTable(); $table_name = (new SysMenuModel)->getTable();
if (env('DB_VERSION', '5') == '8') { $children = Db::query(
$children = Db::query( preg_replace(
preg_replace( '/\s+/u',
'/\s+/u', ' ',
' ', "WITH RECURSIVE menu_tree_by AS (
"WITH RECURSIVE menu_tree_by AS ( SELECT a.id, a.pid FROM $table_name a WHERE a.id = {$data['id']}
SELECT a.id, a.pid FROM $table_name a WHERE a.id = {$data['id']} UNION ALL
UNION ALL SELECT k.id, k.pid FROM $table_name k INNER JOIN menu_tree_by t ON t.id = k.pid
SELECT k.id, k.pid FROM $table_name k INNER JOIN menu_tree_by t ON t.id = k.pid
)
SELECT id FROM menu_tree_by WHERE id <> {$data['id']};"
) )
); SELECT id FROM menu_tree_by WHERE id <> {$data['id']};"
} else { )
$children = \think\facade\Db::query(" );
SELECT t2.id
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
ON FIND_IN_SET(t2.pid, t1._id)
ORDER BY t2.id;
");
}
if (!empty($children) && in_array($data['pid'], array_column($children, 'id'))) { if (!empty($children) && in_array($data['pid'], array_column($children, 'id'))) {
return false; return false;
} }

View File

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

View File

@@ -61,9 +61,6 @@ class DataMigration extends Command
// 迁移文章 // 迁移文章
// $this->migrateArticle([ // $this->migrateArticle([
// 16 => 7,
// 31 => 9,
// 32 => 8,
// 68 => 10, // 68 => 10,
// 69 => 11, // 69 => 11,
// 70 => 12, // 70 => 12,
@@ -293,15 +290,14 @@ class DataMigration extends Command
$old_db = Db::connect('old'); $old_db = Db::connect('old');
$success_map = []; $success_map = [];
$success_arr = []; // include_once(runtime_path() . 'product_success.php'); $success_arr = include_once(runtime_path() . 'product_success.php');
foreach ($success_arr as $so) { foreach ($success_arr as $so) {
$success_map['p_' . $so['cod_product_id']] = $so; $success_map['p_' . $so['cod_product_id']] = $so;
} }
$arr = include_once(runtime_path() . 'product_ids.php');
$products = $old_db->name('product') $products = $old_db->name('product')
->where('country_code', 'in', ['ZH', 'US']) ->where('country_code', 'in', ['ZH', 'US'])
->where('id', 'in', array_unique(array_column($arr, 'cod_product_id'))) ->where('id', '>', 15789)
->order(['id' => 'asc']) ->order(['id' => 'asc'])
->cursor(); ->cursor();
@@ -378,16 +374,7 @@ class DataMigration extends Command
'deleted_at' => $v['stat'] == -1 ? date('Y-m-d H:i:s') : null, 'deleted_at' => $v['stat'] == -1 ? date('Y-m-d H:i:s') : null,
]; ];
// 保存产品数据 // 保存产品数据
$prod = Db::name('product') $id = Db::name('product')->insertGetId($item);
->where('language_id', '=', $item['language_id'])
->where('spu', '=', $item['spu'])
->find();
if (!empty($prod)) {
$id = $prod['id'];
Db::name('product')->where('id', '=', $prod['id'])->update($item);
} else {
$id = Db::name('product')->insertGetId($item);
}
// 保存产品参数数据 // 保存产品参数数据
if (!empty($v['product_view'])) { if (!empty($v['product_view'])) {
@@ -400,21 +387,7 @@ class DataMigration extends Command
'value' => $p['desc_desc'] 'value' => $p['desc_desc']
]; ];
} }
$old_params = Db::name('product_params') Db::name('product_params')->insertAll($prarms);
->where('product_id', '=', $id)
->select();
if ($old_params->isEmpty()) {
Db::name('product_params')->insertAll($prarms);
} else {
foreach ($old_params as $op) {
Db::name('product_params')
->where('product_id', '=', $id)
->where('name', '=', $op['name'])
->update([
'value' => $op['value']
]);
}
}
} }
// 保存sku数据 // 保存sku数据
@@ -471,7 +444,7 @@ class DataMigration extends Command
if ($k != 'sort') { if ($k != 'sort') {
$attr_value = $at; $attr_value = $at;
if (in_array($k, ['颜色', 'Color'])) { if (in_array($k, ['颜色', 'Color'])) {
// if ($k == 'Color') $k = '颜色'; if ($k == 'Color') $k = '颜色';
$attr_value = '/static/common/images/colors/' . $at . '.png'; $attr_value = '/static/common/images/colors/' . $at . '.png';
} }
$images[$pkey]['color'] = $at; $images[$pkey]['color'] = $at;
@@ -495,7 +468,7 @@ class DataMigration extends Command
} }
} }
$attr_arr = [ $attr_arr = [
'attr_id' => $attrs_map[$v['country_code']][$v['country_code'] == 'ZH' ? '颜色' : 'Color'], 'attr_id' => $attrs_map[$v['country_code']]['颜色'],
'attr_value' => $attr_value, 'attr_value' => $attr_value,
]; ];
if ( if (
@@ -541,7 +514,7 @@ class DataMigration extends Command
$skus[] = [ $skus[] = [
'main_image' => $ti['image_url'], 'main_image' => $ti['image_url'],
'attrs' => [[ 'attrs' => [[
'attr_id' => $attrs_map[$v['country_code']][$v['country_code'] == 'ZH' ? '颜色' : 'Color'], 'attr_id' => $attrs_map[$v['country_code']]['颜色'],
'attr_value' => $ti['image_color'], 'attr_value' => $ti['image_color'],
]], ]],
'pkey' => $tpkey 'pkey' => $tpkey
@@ -602,7 +575,6 @@ class DataMigration extends Command
} }
foreach ($skus as $sku) { foreach ($skus as $sku) {
Db::name('product_sku')->where('product_id', '=', $sku['product_id'])->delete();
$sku_id = Db::name('product_sku')->insertGetId([ $sku_id = Db::name('product_sku')->insertGetId([
'product_id' => $sku['product_id'], 'product_id' => $sku['product_id'],
'sku' => $sku['sku']??'', 'sku' => $sku['sku']??'',
@@ -612,7 +584,6 @@ class DataMigration extends Command
if (!empty($sku['attrs'])) { if (!empty($sku['attrs'])) {
foreach ($sku['attrs'] as $attr) { foreach ($sku['attrs'] as $attr) {
if (!empty($sku_id)) { if (!empty($sku_id)) {
Db::name('product_sku_attr')->where('sku_id', '=', $sku_id)->delete();
Db::name('product_sku_attr')->insert([ Db::name('product_sku_attr')->insert([
'sku_id' => $sku_id, 'sku_id' => $sku_id,
'attr_id' => $attr['attr_id'], 'attr_id' => $attr['attr_id'],
@@ -630,7 +601,7 @@ class DataMigration extends Command
sprintf('["ow_product_id" => %d, "cod_product_id" => %d]'.PHP_EOL, $id, $v['id']), sprintf('["ow_product_id" => %d, "cod_product_id" => %d]'.PHP_EOL, $id, $v['id']),
FILE_APPEND FILE_APPEND
); );
$this->println(sprintf('迁移产品ID%s => %s 【耗时:%s】', $v['id'], $id, round(microtime(true) - $start, 2) . 's')); $this->println(sprintf('迁移产品ID%s => %s 【耗时:%s】', $v['id'], 0, round(microtime(true) - $start, 2) . 's'));
} catch (\Throwable $th) { } catch (\Throwable $th) {
Db::rollback(); Db::rollback();
file_put_contents( file_put_contents(
@@ -723,12 +694,9 @@ class DataMigration extends Command
throw new \Exception('请确认分类ID'); throw new \Exception('请确认分类ID');
} }
// 1634
$article = Db::connect('old') $article = Db::connect('old')
->name('article') ->name('article')
->where('country_code', 'in', ['ZH', 'US'])
->where('cid', 'in', array_keys($category_map)) ->where('cid', 'in', array_keys($category_map))
->where('id', '=', 351)
->order(['id' => 'asc']) ->order(['id' => 'asc'])
->cursor(); ->cursor();
@@ -777,16 +745,7 @@ class DataMigration extends Command
'release_time' => date('Y-m-d H:i:s', $v['createtime']), 'release_time' => date('Y-m-d H:i:s', $v['createtime']),
'deleted_at' => $v['stat'] == -1 ? date('Y-m-d H:i:s') : null 'deleted_at' => $v['stat'] == -1 ? date('Y-m-d H:i:s') : null
]; ];
$ret = Db::name('article') $id = Db::name('article')->insertGetId($item);
->where('language_id', '=', $item['language_id'])
->where('title', '=', $item['title'])
->find();
if (empty($ret)) {
$id = Db::name('article')->insertGetId($item);
} else {
$id = $ret['id'];
Db::name('article')->where('id', '=', $ret['id'])->update($item);
}
$this->println(sprintf('迁移文章ID%s => %s', $v['id'], $id)); $this->println(sprintf('迁移文章ID%s => %s', $v['id'], $id));
} }
@@ -820,15 +779,7 @@ class DataMigration extends Command
'recommend' => $val['is_home'], 'recommend' => $val['is_home'],
'sort' => $val['sort'] == 9999 ? 0 : $val['sort'] 'sort' => $val['sort'] == 9999 ? 0 : $val['sort']
]; ];
$ret = Db::name('faq') Db::name('faq')->insert($item);
->where('language_id', '=', $item['language_id'])
->where('question', '=', $item['question'])
->find();
if (empty($ret)) {
Db::name('faq')->insert($item);
} else {
Db::name('faq')->where('id', '=', $ret['id'])->update($item);
}
} }
} }
@@ -930,8 +881,7 @@ class DataMigration extends Command
{ {
$videos = Db::connect('old') $videos = Db::connect('old')
->name('video') ->name('video')
// ->where('id', '>', 844) ->where('id', '>', 844)
->where('cid', 'in', array_keys($category_map))
->where('country_code', 'in', ['ZH', 'US']) ->where('country_code', 'in', ['ZH', 'US'])
->order(['id' => 'asc']) ->order(['id' => 'asc'])
->cursor(); ->cursor();
@@ -971,16 +921,7 @@ class DataMigration extends Command
'seo_desc' => $val['seo_description'], 'seo_desc' => $val['seo_description'],
'deleted_at' => $val['stat'] == -1 ? date('Y-m-d H:i:s') : null 'deleted_at' => $val['stat'] == -1 ? date('Y-m-d H:i:s') : null
]; ];
$ret = Db::name('video') Db::name('video')->insert($item);
->where('language_id', '=', $item['language_id'])
->where('name', '=', $item['name'])
->find();
if (empty($ret)) {
Db::name('video')->insert($item);
} else {
Db::name('video')->where('id', '=', $ret['id'])->update($item);
}
$this->println('迁移视频ID' . $val['id']); $this->println('迁移视频ID' . $val['id']);
} }
} }
@@ -988,7 +929,7 @@ class DataMigration extends Command
class UploadMannager class UploadMannager
{ {
const UPLOAD_BASE_API = 'http://ow.f2b211.com'; const UPLOAD_BASE_API = 'http://dev.ow.f2b211.com';
const DOWNLOAD_BASE_API = 'http://www.orico.com.cn'; const DOWNLOAD_BASE_API = 'http://www.orico.com.cn';
const DOWNLOAD_TEMP_PATH = '/var/www/html/orico-official-website/public/migrate_temp_images'; const DOWNLOAD_TEMP_PATH = '/var/www/html/orico-official-website/public/migrate_temp_images';
private $username = 'admin'; private $username = 'admin';
@@ -1001,7 +942,7 @@ class UploadMannager
{ {
// 登录获取token // 登录获取token
$this->token = $this->getAuthorization(); $this->token = $this->getAuthorization();
$this->maps = []; // include_once(runtime_path() . 'fiber_product_image_mapping.php'); $this->maps = include_once(runtime_path() . 'fiber_product_image_mapping.php');
} }
// 下载图片 // 下载图片
@@ -1121,7 +1062,6 @@ class UploadMannager
print($http_code . PHP_EOL); print($http_code . PHP_EOL);
} }
file_put_contents(runtime_path() . 'upload.txt', $response . PHP_EOL, FILE_APPEND);
$ret = json_decode($response, true); $ret = json_decode($response, true);
if (empty($ret)) { if (empty($ret)) {
throw new \Exception($response); throw new \Exception($response);

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 * @param bool $keep_pid 是否保留pid
* @return array * @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 = []; $ret = [];
foreach ($data as $item) { foreach ($data as $item) {
@@ -93,7 +93,7 @@ if (!function_exists('array_to_tree')) {
if ($keep_pid === false) { if ($keep_pid === false) {
unset($item[$with]); 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) { if ($children) {
$item['children'] = $children; $item['children'] = $children;
} }
@@ -102,133 +102,4 @@ if (!function_exists('array_to_tree')) {
} }
return $ret; return $ret;
} }
}
if (!function_exists('array_flatten')) {
/**
* 将多维数组转换为一维数组
* @param array $array
* @return array
*/
function array_flatten(array $array, int $depth = 1): array
{
return \think\helper\Arr::flatten($array, $depth);
}
}
if (!function_exists('thumb')) {
/**
* 获取缩略图
* @param string $url 图片地址
* @return string
*/
function thumb(?string $url): string
{
if (empty($url)) {
return '';
}
if (
str_contains($url, '_thumb') ||
\think\helper\Str::startsWith($url, ['http://', 'https://']) ||
!\think\helper\Str::endsWith($url, ['.png', '.jpg', '.jpeg', '.gif', '.tif', '.svg', '.webp', '.bmp'])
) {
return $url;
}
$idx = mb_strripos($url, '.', 0, 'utf-8');
if ($idx === false) {
return $url;
}
$len = mb_strlen($url, 'utf-8');
return mb_substr($url, 0, $idx, 'utf-8') . '_thumb' . mb_substr($url, $idx, $len - $idx, 'utf-8');
}
}
if (!function_exists('get_filesystem_url')) {
/**
* 获取文件系统的访问 URL
* @param string $url 文件地址
* @param string $disk 磁盘配置 key
* @return string
*/
function get_filesystem_url(string|null $url, string $disk): string
{
if (is_null($url)) {
return '';
}
if (\think\helper\Str::startsWith($url, ['http://', 'https://', '//'])) {
return $url;
}
if (empty($disk)) {
return '';
}
return \think\facade\Filesystem::disk($disk)->url($url);
}
}
if (!function_exists('url_filesystem_detect')) {
/**
* 检测文件地址并根据情况转换为文件系统地址
* @param string $url 文件地址
* @return string
*/
function url_filesystem_detect(string|null $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')
];
foreach ($disks as $disk => $marker) {
if (str_ends_with(mb_substr($url, 0, $idx), $marker)) {
return get_filesystem_url($url, $disk);
}
}
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

@@ -25,7 +25,6 @@ class ProductTcoCategoryBaseModel extends BaseModel
'tco_path' => 'string', 'tco_path' => 'string',
'erp_id' => 'int', 'erp_id' => 'int',
'erp_pid' => 'int', 'erp_pid' => 'int',
'erp_code' => 'string',
'erp_path' => 'string', 'erp_path' => 'string',
'disabled' => 'int', 'disabled' => 'int',
'sync_time' => 'int', 'sync_time' => 'int',

View File

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

View File

@@ -17,14 +17,13 @@ class SysConfigGroupBaseModel extends BaseModel
// 字段信息 // 字段信息
protected $schema = [ protected $schema = [
'id' => 'int', 'id' => 'int',
'language_id' => 'int', 'language_id' => 'int',
'unique_label' => 'string', 'name' => 'string',
'name' => 'string', 'sort' => 'int',
'sort' => 'int', 'status' => 'int',
'status' => 'int', 'created_at' => 'datetime',
'created_at' => 'datetime', 'updated_at' => 'datetime',
'updated_at' => 'datetime', 'deleted_at' => 'datetime',
'deleted_at' => 'datetime',
]; ];
} }

View File

@@ -18,6 +18,6 @@ class SysRoleAuthorityBaseModel extends Model
protected $schema = [ protected $schema = [
'role_id' => 'int', 'role_id' => 'int',
'menu_id' => 'int', 'menu_id' => 'int',
'permission' => 'string', 'permission' => 'int',
]; ];
} }

View File

@@ -71,6 +71,36 @@ if (!function_exists('style')) {
} }
} }
if (!function_exists('thumb')) {
/**
* 获取缩略图
* @param string $url 图片地址
* @return string
*/
function thumb(string $url): string
{
if (empty($url)) {
return '';
}
if (
str_contains($url, '_thumb') ||
\think\helper\Str::startsWith($url, ['http://', 'https://']) ||
!\think\helper\Str::endsWith($url, ['.png', '.jpg', '.jpeg', '.gif', '.tif', '.svg', '.webp', '.bmp'])
) {
return $url;
}
$idx = mb_strripos($url, '.', 0, 'utf-8');
if ($idx === false) {
return $url;
}
$len = mb_strlen($url, 'utf-8');
return mb_substr($url, 0, $idx, 'utf-8') . '_thumb' . mb_substr($url, $idx, $len - $idx, 'utf-8');
}
}
if (!function_exists('get_path_from_img_tag')) { if (!function_exists('get_path_from_img_tag')) {
/** /**
* 从img标签中获取图片路径 * 从img标签中获取图片路径
@@ -98,8 +128,7 @@ if (!function_exists('lang_i18n')) {
* @param string $lang 语言标识 * @param string $lang 语言标识
* @return string * @return string
*/ */
function lang_i18n(string $name, array $vars = [], string $lang = ''): string function lang_i18n(string $name, array $vars = [], string $lang = '') {
{
if (is_null($name)) { if (is_null($name)) {
return ''; return '';
} }
@@ -111,133 +140,3 @@ if (!function_exists('lang_i18n')) {
return Lang::get($lang_key, $vars, $lang); return Lang::get($lang_key, $vars, $lang);
} }
} }
if (!function_exists('date_format_i18n')) {
/**
* 格式化日期时间为指定语言
* @param int|string $datetime 要格式化的日期时间字符串
* @param string $lang 语言标识
* @param bool $keep_time 是否保留时间
* @return string
*/
function date_format_i18n(int|string|null $datetime, string $lang = '', bool $keep_time = false): string
{
// 处理语言标识,若未提供则使用当前语言设置,并转换为小写
$lang = $lang ?: Lang::getLangSet();
$lang = strtolower($lang);
// 处理日期时间输入
if (is_numeric($datetime)) {
// 若输入为数字,直接作为时间戳处理
$timestamp = (int)$datetime;
} elseif (is_string($datetime)) {
// 尝试将字符串转换为时间戳
$timestamp = strtotime($datetime);
if ($timestamp === false) {
return '';
}
} else {
return '';
}
// 根据$datetime传值决定格式
$date_parts = [];
if (is_numeric($datetime)) {
$date_str = date('Y-m-d', $timestamp);
$date_parts = explode('-', $date_str);
} elseif (is_string($datetime)) {
if (preg_match('/^\d{4}$/', $datetime)) {
$date_parts = [$datetime];
} elseif (preg_match('/^\d{4}-\d{1,2}$/', $datetime)) {
$date_parts = explode('-', $datetime);
} elseif (preg_match('/^\d{4}-\d{1,2}-\d{1,2}(.{1,9})?$/', $datetime)) {
$date_parts = explode('-', $datetime);
}
}
// 定义默认格式
$fmt = '';
// 根据语言和日期部分数量设置日期格式
$format = [
'zh-cn' => [0 => '', 1 => 'Y', 2 => 'Y-m', 3 => 'Y-m-d'],
'en-us' => [0 => '', 1 => 'Y', 2 => 'F Y', 3 => 'F j, Y'],
'default' => [0 => '', 1 => 'Y', 2 => 'Y-m', 3 => 'Y-m-d']
];
$fmt = $format[$lang][count($date_parts)] ?? $format['default'][count($date_parts)];
// 若需要保留时间
if ($keep_time) {
if ($lang === 'en-us') {
$fmt .= ', g:i A';
} else {
$fmt .= ' H:i:s';
}
}
return date($fmt, $timestamp);
}
}
if (!function_exists('get_platform')) {
/**
* 获取平台
* @return string
*/
function get_platform(): string
{
$detect = new \Detection\MobileDetect();
$platform = 'pc';
if ($detect->isMobile() || $detect->isTablet()) {
$platform = 'mobile';
} else {
// 在非移动端环境,根据配置规则判断是否要显示移动端
$view_cfg = $view_cfg = [
'rule' => env('INDEX_VIEW_TPL.RULE', 'query'),
'query' => [
'name' => env('INDEX_VIEW_TPL.RULE_QUERY_NAME', 'mtpl'),
'value' => env('INDEX_VIEW_TPL.RULE_QUERY_VALUE', '1'),
],
'domain' => [
'scheme' => env('INDEX_VIEW_TPL.RULE_DOMAIN_SCHEME', ['http']),
'host' => env('INDEX_VIEW_TPL.RULE_DOMAIN_HOST'),
],
];
if ($view_cfg['rule'] == 'query') {
$name = $view_cfg['query']['name'];
$value = $view_cfg['query']['value'];
if (request()->get($name) == $value) {
$platform = 'mobile';
}
} elseif ($view_cfg['rule'] == 'domain') {
$scheme = $view_cfg['domain']['scheme'];
$host = $view_cfg['domain']['host'];
if (in_array(request()->scheme(), $scheme) && $host == request()->host()) {
$platform = 'mobile';
}
}
}
return $platform;
}
}
if (!function_exists('highlight_keywords')) {
/**
* 高亮关键词
* @param string $text // 要处理的文本
* @param string $keyword // 关键词
* @param string|callable $repalce // 替换函数或字符串
* @return string
*/
function highlight_keywords(string $text, string $keyword, string|callable $replace): string
{
return preg_replace_callback('/' . preg_quote($keyword, '/') . '+/i', function($match) use($text, $replace) {
if (empty($match)) return $text;
if (is_string($replace)) return '<strong>' . $match[0] . '</strong>';
if (is_callable($replace)) return $replace($match[0]);
return $match[0];
}, $text);
}
}

View File

@@ -19,9 +19,10 @@ return [
// 扩展语言包 // 扩展语言包
'extend_list' => [ 'extend_list' => [
'en-us' => [ 'en-us' => [
app()->getAppPath() . '/lang/en-us/' . get_platform() . '.php', app()->getAppPath() . '/lang/en-us/' . (request()->isMobile() ? 'mobile' : 'pc') . '.php',
app()->getAppPath() . '/lang/en-us/validate.php', app()->getAppPath() . '/lang/en-us/validate.php',
], ],
'zh-cn' => app()->getAppPath() . '/lang/zh-cn/' . (request()->isMobile() ? 'mobile' : 'pc') . '.php',
], ],
// Accept-Language转义为对应语言包名称 // Accept-Language转义为对应语言包名称
'accept_language' => [ 'accept_language' => [

View File

@@ -2,8 +2,10 @@
// +---------------------------------------------------------------------- // +----------------------------------------------------------------------
// | 模板设置 // | 模板设置
// +---------------------------------------------------------------------- // +----------------------------------------------------------------------
$view_device_name = 'pc';
$view_device_name = get_platform(); if (request()->isMobile()) {
$view_device_name = 'mobile';
}
return [ return [
// 模板引擎类型使用Think // 模板引擎类型使用Think

View File

@@ -27,7 +27,6 @@ class AboutUs extends Common
->where('status', '=', 1) ->where('status', '=', 1)
->order(['sort' => 'asc', 'id' => 'desc']); ->order(['sort' => 'asc', 'id' => 'desc']);
}]) }])
->atPlatform(request()->from)
->uniqueLabel([ ->uniqueLabel([
"BANNER_680744b1d0000", "BANNER_680744b1d0000",
"BANNER_680744e7cacb3", "BANNER_680744e7cacb3",
@@ -63,8 +62,7 @@ class AboutUs extends Common
// 获取品牌故事banner // 获取品牌故事banner
$banners = SysBannerItemModel::hasWhere('banner', [ $banners = SysBannerItemModel::hasWhere('banner', [
'language_id' => $this->lang_id, 'language_id' => $this->lang_id,
'unique_label' => 'BANNER_67ff632a5f7aa', 'unique_label' => 'BANNER_67ff632a5f7aa'
'at_platform' => request()->from,
]) ])
->type('image') ->type('image')
->enabled(true) ->enabled(true)
@@ -89,7 +87,6 @@ class AboutUs extends Common
$banner = SysBannerModel::with(['items' => function($query) { $banner = SysBannerModel::with(['items' => function($query) {
$query->where('status', '=', 1)->order(['sort' => 'asc', 'id' => 'desc']); $query->where('status', '=', 1)->order(['sort' => 'asc', 'id' => 'desc']);
}]) }])
->atPlatform(request()->from)
->uniqueLabel([ ->uniqueLabel([
'BANNER_67ff786dc9c8d', 'BANNER_67ff786dc9c8d',
'BANNER_67ff7ef1354cf', 'BANNER_67ff7ef1354cf',
@@ -127,7 +124,6 @@ class AboutUs extends Common
->where('status', '=', 1) ->where('status', '=', 1)
->order(['sort' => 'asc', 'id' => 'desc']); ->order(['sort' => 'asc', 'id' => 'desc']);
}]) }])
->atPlatform(request()->from)
->uniqueLabel([ ->uniqueLabel([
"BANNER_68075a636e648", "BANNER_68075a636e648",
"BANNER_68075bf4dd0f5", "BANNER_68075bf4dd0f5",
@@ -161,7 +157,6 @@ class AboutUs extends Common
->where('status', '=', 1) ->where('status', '=', 1)
->order(['sort' => 'asc', 'id' => 'desc']); ->order(['sort' => 'asc', 'id' => 'desc']);
}]) }])
->atPlatform(request()->from)
->uniqueLabel([ ->uniqueLabel([
"BANNER_6806f5f19c3d6", "BANNER_6806f5f19c3d6",
"BANNER_6806f609b9fe9", "BANNER_6806f609b9fe9",

View File

@@ -32,12 +32,10 @@ class Article extends Common
// 获取banner焦点图 // 获取banner焦点图
$banner = SysBannerItemModel::hasWhere('banner', [ $banner = SysBannerItemModel::hasWhere('banner', [
'language_id' => $this->lang_id, 'language_id' => $this->lang_id,
'unique_label' => 'BANNER_67f9fc71e27db', 'unique_label' => 'BANNER_67f9fc71e27db'
'at_platform' => request()->from
]) ])
->type('image') ->type('image')
->visible(['id', 'title', 'image', 'link']) ->visible(['id', 'title', 'image', 'link'])
->enabled()
->find(); ->find();
View::assign('banner', $banner); View::assign('banner', $banner);
@@ -60,21 +58,17 @@ class Article extends Common
'id', 'id',
'title', 'title',
'desc', 'desc',
'image', 'image'
'release_time'
]) ])
->withSearch(['title'], ['title' => $param['keywords']??null]) ->withSearch(['title'], ['title' => $param['keywords']??null])
->category($param['cid']??$categorys[0]['id']) ->category($param['cid']??$categorys[0]['id'])
->where('release_time', '<=', date('Y-m-d H:i:s'))
->order(['sort' => 'asc', 'release_time' => 'desc', 'id' => 'desc']) ->order(['sort' => 'asc', 'release_time' => 'desc', 'id' => 'desc'])
->paginate([ ->paginate([
'list_rows' => $param['size'], 'list_rows' => $param['size'],
'page' => $param['page'], 'page' => $param['page'],
'query' => request()->param([
'cid',
'keywords',
]) // 保留查询参数,防止分页丢失
]); ]);
} }
View::assign('articles', $articles??[]); View::assign('articles', $articles??[]);
return View::fetch('index'); return View::fetch('index');
@@ -99,34 +93,14 @@ class Article extends Common
$share_config = $this->getSysConfig($this->lang_id, ['article_share']); $share_config = $this->getSysConfig($this->lang_id, ['article_share']);
View::assign('share_config', $share_config['article_share']); View::assign('share_config', $share_config['article_share']);
// 获取文章评论数据
$comments = ArticleLeaveMessageModel::field([
'id',
'name',
'email',
'content',
'created_at'
])
->article($id)
->audited(true)
->order(['id' => 'desc'])
->limit(5)
->select();
View::assign('comments', $comments);
// 获取倒序或发布时间倒序3篇文章做为推荐文章 // 获取倒序或发布时间倒序3篇文章做为推荐文章
$category_model = new ArticleCategoryModel; $recommends = ArticleModel::field([
$parent_id = $category_model->bypk($detail['category_id'])->value('pid');
$categorys = $category_model->child($parent_id)->column('id');
$recommends = ArticleModel::field([
'id', 'id',
'title', 'title',
'desc', 'desc',
'image' 'image'
]) ])
->where('id', '<>', $id) ->where('id', '<>', $id)
->language($this->lang_id)
->category($categorys)
->order(['release_time' => 'desc', 'id' => 'desc']) ->order(['release_time' => 'desc', 'id' => 'desc'])
->limit(3) ->limit(3)
->select(); ->select();
@@ -149,14 +123,12 @@ class Article extends Common
// 验证字段 // 验证字段
$validate = Validate::rule([ $validate = Validate::rule([
'name' => 'require|max:64', 'name' => 'max:64',
'email' => 'require|email' 'email' => 'email'
]) ])
->message([ ->message([
'name.require' => '姓名不能为空', 'name.max' => '姓名不能超过64个字符',
'name.max' => '姓名不能超过:rule个字符', 'email' => '请输入正确的邮箱'
'email.require' => '邮箱不能为空',
'email.email' => '邮箱格式不正确'
]); ]);
if (!$validate->check($post)) { if (!$validate->check($post)) {
return error($validate->getError()); return error($validate->getError());
@@ -170,9 +142,9 @@ class Article extends Common
]); ]);
$ret = ArticleLeaveMessageModel::create($data); $ret = ArticleLeaveMessageModel::create($data);
if ($ret->isEmpty()) { if ($ret->isEmpty()) {
return error(lang('信息提交失败')); return error('留言提交失败');
} }
return success(lang('信息已成功提交!')); return success('留言提交成功');
} }
} }

View File

@@ -21,9 +21,9 @@ class Attachment extends Common
{ {
$param = request()->param([ $param = request()->param([
'id', 'id',
'keyword' => '', 'keyword',
'page/d' => 1, 'page/d' => 1,
'size/d' => 12, 'size/d' => 12,
]); ]);
// 获取附件分类 // 获取附件分类
@@ -48,9 +48,9 @@ class Attachment extends Common
'support_platform', 'support_platform',
'attach', 'attach',
]) ])
->withSearch(['name'], ['name' => !empty($param['keyword']) ? trim($param['keyword']) : null]) ->withSearch(['name'], ['name' => $param['keyword']??null])
->language($this->lang_id) ->language($this->lang_id)
->category(!empty($param['id']) ? $param['id'] : $categorys[0]['id']??null) ->category($param['id']??null)
->order(['sort' => 'asc', 'id' => 'desc']) ->order(['sort' => 'asc', 'id' => 'desc'])
->paginate([ ->paginate([
'list_rows' => $param['size'], 'list_rows' => $param['size'],
@@ -59,16 +59,6 @@ class Attachment extends Common
'id' => $param['id']??null 'id' => $param['id']??null
] ]
]); ]);
if (!$attachements->isEmpty()) {
$attachements->each(function($item) {
if (is_array($item->attach)) {
$item->attach = array_map(function($v) {
$v['file_path'] = url_filesystem_detect($v['file_path']);
return $v;
}, $item->attach);
}
});
}
View::assign('attachements', $attachements); View::assign('attachements', $attachements);
View::assign('page', $attachements->render()); View::assign('page', $attachements->render());
@@ -119,9 +109,9 @@ class Attachment extends Common
'video', 'video',
'link' 'link'
]) ])
->withSearch(['name'], ['name' => !empty($param['keyword']) ? trim($param['keyword']) : null]) ->withSearch(['name'], ['name' => $param['keyword']??null])
->language($this->lang_id) ->language($this->lang_id)
->category(!empty($param['id']) ? $param['id'] : $video_categorys[0]['id']??null) ->category($param['id']??$video_categorys[0]['id']??null)
->order(['sort' => 'asc', 'id' => 'desc']) ->order(['sort' => 'asc', 'id' => 'desc'])
->paginate([ ->paginate([
'list_rows' => $param['size'], 'list_rows' => $param['size'],
@@ -132,9 +122,6 @@ class Attachment extends Common
]); ]);
if (!$videos->isEmpty()) { if (!$videos->isEmpty()) {
$videos->each(function($item) {
$item->video = url_filesystem_detect($item->video);
});
$videos->setCollection($videos->getCollection()->chunk(2)); $videos->setCollection($videos->getCollection()->chunk(2));
} }
View::assign('videos', $videos); View::assign('videos', $videos);

View File

@@ -106,7 +106,6 @@ abstract class Common extends BaseController
'language_id' => $language, 'language_id' => $language,
'status' => 1 'status' => 1
]) ])
->where('status', '=', 1)
->order(['sort' => 'asc', 'id' => 'asc']) ->order(['sort' => 'asc', 'id' => 'asc'])
->select(); ->select();
if ($nav->isEmpty()) { if ($nav->isEmpty()) {

View File

@@ -45,7 +45,14 @@ class ContactUs extends Common
$banner_map[$v->unique_label] = $v; $banner_map[$v->unique_label] = $v;
} }
$focus_image = data_get($banner_map, 'BANNER_6805e3d32dcc2')?->items->first()?->toArray(); $focus_image = data_get($banner_map, 'BANNER_6805e3d32dcc2')?->items->first()?->toArray();
$info_datas = data_get($banner_map, 'BANNER_6806090c1838f')?->items->toArray(); $info_datas = data_get($banner_map, 'BANNER_6806090c1838f')?->items->each(function($item) {
if (Str::contains($item->title, '<br/>')) {
$title = explode('<br/>', $item->title);
$item->title = $title[0];
$item->title_short = $title[1];
}
return $item;
})->toArray();
} }
View::assign('focus_image', $focus_image); View::assign('focus_image', $focus_image);
View::assign('info_datas', $info_datas); View::assign('info_datas', $info_datas);
@@ -129,7 +136,6 @@ class ContactUs extends Common
'corp_name', 'corp_name',
'email', 'email',
'phone', 'phone',
'website_url',
'business_type', 'business_type',
'enterprise_size', 'enterprise_size',
'address', 'address',
@@ -149,7 +155,7 @@ class ContactUs extends Common
'email' => $form_data['email'], 'email' => $form_data['email'],
'phone' => $form_data['phone'], 'phone' => $form_data['phone'],
'referer_url' => request()->header('referer'), 'referer_url' => request()->header('referer'),
'website_url' => $form_data['website_url'], 'website_url' => request()->header('host'),
'business_type' => $form_data['business_type'], 'business_type' => $form_data['business_type'],
'enterprise_size' => $form_data['enterprise_size'], 'enterprise_size' => $form_data['enterprise_size'],
'address' => $form_data['address'], 'address' => $form_data['address'],
@@ -206,7 +212,7 @@ class ContactUs extends Common
'last_name' => $form_data['last_name'], 'last_name' => $form_data['last_name'],
'email' => $form_data['email'], 'email' => $form_data['email'],
'phone' => $form_data['phone'], 'phone' => $form_data['phone'],
'interested' => is_array($form_data['interested']) ? implode(',', $form_data['interested']) : $form_data['interested'], 'interested' => $form_data['interested'],
'referer_url' => request()->header('referer'), 'referer_url' => request()->header('referer'),
'website_url' => request()->header('host'), 'website_url' => request()->header('host'),
'message' => $form_data['message'], 'message' => $form_data['message'],

View File

@@ -25,11 +25,9 @@ class Faq extends Common
// 获取banner焦点图 // 获取banner焦点图
$banner = SysBannerItemModel::hasWhere('banner', [ $banner = SysBannerItemModel::hasWhere('banner', [
'language_id' => $this->lang_id, 'language_id' => $this->lang_id,
'unique_label' => 'BANNER_67fa37f30e151', 'unique_label' => 'BANNER_67fa37f30e151'
'at_platform' => request()->from
]) ])
->type('image') ->type('image')
->enabled()
->visible(['id', 'title', 'image', 'link']) ->visible(['id', 'title', 'image', 'link'])
->find(); ->find();
View::assign('banner', $banner); View::assign('banner', $banner);

View File

@@ -45,7 +45,6 @@ class Product extends Common
->where('status', '=', 1) ->where('status', '=', 1)
->order(['sort' => 'asc', 'id' => 'desc']); ->order(['sort' => 'asc', 'id' => 'desc']);
}]) }])
->atPlatform(request()->from)
->uniqueLabel(['BANNER_6808abd813d78']) ->uniqueLabel(['BANNER_6808abd813d78'])
->language($this->lang_id) ->language($this->lang_id)
->enabled(true) ->enabled(true)
@@ -104,7 +103,7 @@ class Product extends Common
->onSale(true) ->onSale(true)
->onShelves(true) ->onShelves(true)
->append(['p' => $list[0]['id']]) ->append(['p' => $list[0]['id']])
->order(['sort' => 'asc', 'created_at' => 'desc', 'id' => 'desc']) ->order(['sort' => 'asc', 'id' => 'desc'])
->limit(5) ->limit(5)
->buildSql(); ->buildSql();
$query = \think\facade\Db::table("($sql) as a"); $query = \think\facade\Db::table("($sql) as a");
@@ -126,7 +125,7 @@ class Product extends Common
->enabled(true) ->enabled(true)
->onSale(true) ->onSale(true)
->onShelves(true) ->onShelves(true)
->order(['sort' => 'asc', 'created_at' => 'desc', 'id' => 'desc']) ->order(['sort' => 'asc', 'id' => 'desc'])
->limit(5); ->limit(5);
}); });
} }
@@ -192,7 +191,7 @@ class Product extends Common
->enabled(true) ->enabled(true)
->onSale(true) ->onSale(true)
->onShelves(true) ->onShelves(true)
->order(['sort' => 'asc', 'created_at' => 'desc', 'id' => 'desc']) ->order(['sort' => 'asc', 'id' => 'desc'])
->select(); ->select();
if (!$products->isEmpty()) { if (!$products->isEmpty()) {
// 获取sku信息 // 获取sku信息
@@ -223,7 +222,7 @@ class Product extends Common
foreach ($skus as $v) { foreach ($skus as $v) {
// 找到相应产品的sku图片信息 // 找到相应产品的sku图片信息
$skus_map[$v['product_id']][] = [ $skus_map[$v['product_id']][] = [
'id' => $v['id'], 'id' => $v['id'],
'sku' => $v['sku'], 'sku' => $v['sku'],
'main_image' => $v['main_image'], 'main_image' => $v['main_image'],
]; ];
@@ -231,7 +230,7 @@ class Product extends Common
$attr = $sku_attrs_map[$v['id']]?? []; $attr = $sku_attrs_map[$v['id']]?? [];
if (!empty($attr)) { if (!empty($attr)) {
foreach ($attr as $at) { foreach ($attr as $at) {
if (in_array($at['attr_name'], ['颜色', 'Color'])) { if ($at['attr_name'] == '颜色') {
$color_map[$v['product_id']][] = $at; $color_map[$v['product_id']][] = $at;
} }
} }
@@ -254,11 +253,7 @@ class Product extends Common
]; ];
} }
foreach ($categorys_data as $k => $v) { foreach ($categorys_data as $k => $v) {
if (!isset($products_map[$v['id']])) { $categorys_data[$k]['products'] = $products_map[$v['id']] ?? [];
unset($categorys_data[$k]);
continue;
}
$categorys_data[$k]['products'] = $products_map[$v['id']];
} }
} }
} }
@@ -277,7 +272,7 @@ class Product extends Common
'page/d' => 1, 'page/d' => 1,
'size/d' => 10 'size/d' => 10
]); ]);
$keywords = !empty($param['keywords']) ? trim($param['keywords']) : ''; $keywords = $param['keywords'] ?? '';
// 关键词搜索 // 关键词搜索
$products = ProductModel::field([ $products = ProductModel::field([
@@ -299,10 +294,9 @@ class Product extends Common
'query' => request()->param() 'query' => request()->param()
]) ])
->each(function ($item) use($keywords) { ->each(function ($item) use($keywords) {
$replace = fn($txt) => '<strong class="redpoint">' . $txt . '</strong>'; $item['spu'] = str_replace($keywords, '<strong class="redpoint">'.$keywords.'</strong>', $item['spu']);
$item['spu'] = highlight_keywords($item['spu'], $keywords, $replace); $item['name'] = str_replace($keywords, '<strong class="redpoint">'.$keywords.'</strong>', $item['name']);
$item['name'] = highlight_keywords($item['name'], $keywords, $replace); $item['short_name'] = str_replace($keywords, '<strong class="redpoint">'.$keywords.'</strong>', $item['short_name']);
$item['short_name'] = highlight_keywords($item['short_name'], $keywords, $replace);
return $item; return $item;
}); });
View::assign('products', $products); View::assign('products', $products);
@@ -374,12 +368,10 @@ class Product extends Common
// 获取属性名称 // 获取属性名称
$attrs = ProductAttrModel::bypks(array_unique(Arr::pluck($sku_attrs, 'attr_id')))->column(['attr_name'], 'id'); $attrs = ProductAttrModel::bypks(array_unique(Arr::pluck($sku_attrs, 'attr_id')))->column(['attr_name'], 'id');
foreach ($sku_attrs as $v) { foreach ($sku_attrs as $v) {
if (empty($v['attr_value'])) continue;
$v['attr_name'] = $attrs[$v['attr_id']]?? ''; $v['attr_name'] = $attrs[$v['attr_id']]?? '';
// 按属性分组 // 按属性分组
$product_sku_attrs[$v['attr_id']]['attr_id'] = $v['attr_id']; $product_sku_attrs[$v['attr_id']]['attr_id'] = $v['attr_id'];
$product_sku_attrs[$v['attr_id']]['attr_name'] = $v['attr_name']; $product_sku_attrs[$v['attr_id']]['attr_name'] = $v['attr_name'];
$product_sku_attrs[$v['attr_id']]['attr_values'][] = [ $product_sku_attrs[$v['attr_id']]['attr_values'][] = [
'sku_id' => $v['sku_id'], 'sku_id' => $v['sku_id'],
'attr_value' => $v['attr_value'], 'attr_value' => $v['attr_value'],
@@ -396,11 +388,8 @@ class Product extends Common
->order(['sort' => 'asc', 'id' => 'desc']) ->order(['sort' => 'asc', 'id' => 'desc'])
->select() ->select()
->hidden(['platform']) ->hidden(['platform'])
->bindAttr('platform', ['platform_name' => 'platform', 'platform_sort' => 'sort']) ->bindAttr('platform', ['platform_name' => 'platform'])
->toArray(); ->toArray();
// 根据购买链接平台排序
$sort_by_arr = array_column($product_purchase_links, 'platform_sort');
array_multisort($sort_by_arr, SORT_ASC, $product_purchase_links);
// 获取相关产品信息 // 获取相关产品信息
$related = ProductRelatedModel::with(['product' => function($query) { $related = ProductRelatedModel::with(['product' => function($query) {
@@ -463,9 +452,9 @@ class Product extends Common
'message' => $post['message'], 'message' => $post['message'],
]); ]);
if ($ret->isEmpty()) { if ($ret->isEmpty()) {
return error(lang('提交失败')); return error(lang('product_detail.send_fail'));
} }
return success(lang('提交成功')); return success(lang('product_detail.send_success'));
} }
/** /**
@@ -485,7 +474,6 @@ class Product extends Common
->where('status', '=', 1) ->where('status', '=', 1)
->order(['sort' => 'asc', 'id' => 'desc']); ->order(['sort' => 'asc', 'id' => 'desc']);
}]) }])
->atPlatform(request()->from)
->uniqueLabel(['BANNER_680dd7ceaa529']) ->uniqueLabel(['BANNER_680dd7ceaa529'])
->language($this->lang_id) ->language($this->lang_id)
->enabled(true) ->enabled(true)

View File

@@ -20,10 +20,6 @@ class TopicNas extends Common
{ {
// 获取国家/语言列表 // 获取国家/语言列表
$languages = $this->getLanguages(); $languages = $this->getLanguages();
// 输出国家/语言列表
if (get_platform() == 'mobile') {
View::assign('header_languages', $languages);
}
// 获取当前语言 // 获取当前语言
$current_language = $this->getCurrentLanguage($languages); $current_language = $this->getCurrentLanguage($languages);
@@ -65,11 +61,8 @@ class TopicNas extends Common
$nas_software = []; $nas_software = [];
// 获取banner数据 // 获取banner数据
$banners = SysBannerModel::with(['items' => function($query) { $banners = SysBannerModel::with(['items' => function($query) {
$query->withoutField(['sort', 'created_at', 'updated_at', 'deleted_at']) $query->withoutField(['sort', 'created_at', 'updated_at', 'deleted_at']);
->order(['sort' => 'asc', 'id' => 'desc'])
->enabled(true);
}]) }])
->atPlatform(request()->from)
->uniqueLabel([ ->uniqueLabel([
'BANNER_680f156a805a8', 'BANNER_680f156a805a8',
'BANNER_680f15ca5482f', 'BANNER_680f15ca5482f',
@@ -111,11 +104,8 @@ class TopicNas extends Common
$trial_instructions = []; $trial_instructions = [];
// 获取banner数据 // 获取banner数据
$banners = SysBannerModel::with(['items' => function($query) { $banners = SysBannerModel::with(['items' => function($query) {
$query->withoutField(['sort', 'created_at', 'updated_at', 'deleted_at']) $query->withoutField(['sort', 'created_at', 'updated_at', 'deleted_at']);
->order(['sort' => 'asc', 'id' => 'desc'])
->enabled(true);
}]) }])
->atPlatform(request()->from)
->uniqueLabel([ ->uniqueLabel([
'BANNER_68103aaebe4c4', 'BANNER_68103aaebe4c4',
'BANNER_68103acd1a8b9', 'BANNER_68103acd1a8b9',
@@ -152,11 +142,8 @@ class TopicNas extends Common
$cooperation_cotacts = []; $cooperation_cotacts = [];
// 获取banner数据 // 获取banner数据
$banners = SysBannerModel::with(['items' => function($query) { $banners = SysBannerModel::with(['items' => function($query) {
$query->withoutField(['sort', 'created_at', 'updated_at', 'deleted_at']) $query->withoutField(['sort', 'created_at', 'updated_at', 'deleted_at']);
->order(['sort' => 'asc', 'id' => 'desc'])
->enabled(true);
}]) }])
->atPlatform(request()->from)
->uniqueLabel([ ->uniqueLabel([
'BANNER_6810670b8ef17', 'BANNER_6810670b8ef17',
'BANNER_681067451b78f', 'BANNER_681067451b78f',
@@ -192,66 +179,25 @@ class TopicNas extends Common
{ {
// 获取文章分类及文章数据 // 获取文章分类及文章数据
$parent = ArticleCategoryModel::uniqueLabel('CATEGORY_681182e0a4529')->language($this->lang_id)->value('id'); $parent = ArticleCategoryModel::uniqueLabel('CATEGORY_681182e0a4529')->language($this->lang_id)->value('id');
$parent_two = ArticleCategoryModel::parent($parent)->language($this->lang_id)->column('id');//二级分类id
array_push($parent_two,$parent);
$article_categorys = ArticleCategoryModel::with(['article' => function($query) { $article_categorys = ArticleCategoryModel::with(['article' => function($query) {
$query->field(['id', 'title', 'category_id']) $query->field(['id', 'title', 'category_id'])->limit(3);
->order(['sort' => 'asc', 'id' => 'desc'])
->limit(3);
}]) }])
->field([ ->field([
'id', 'id',
'pid',
'name', 'name',
'icon' 'icon'
]) ])
->language($this->lang_id) ->language($this->lang_id)
// ->parent($parent) ->parent($parent)
->parentChild($parent_two)
->isShow(true) ->isShow(true)
->order(['sort' => 'asc', 'id' => 'desc'])
->select(); ->select();
//查询三级分类 View::assign('article_categorys', $article_categorys);
$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);
$contacts = []; $contacts = [];
// 获取banner数据 // 获取banner数据
$banners = SysBannerModel::with(['items' => function ($query) { $banners = SysBannerModel::with(['items' => function ($query) {
$query->withoutField(['sort', 'created_at', 'updated_at', 'deleted_at']) $query->withoutField(['sort', 'created_at', 'updated_at', 'deleted_at']);
->order(['sort' => 'asc', 'id' => 'desc'])
->enabled(true);
}]) }])
->atPlatform(request()->from)
->uniqueLabel(['BANNER_6819754be2dc6']) ->uniqueLabel(['BANNER_6819754be2dc6'])
->language($this->lang_id) ->language($this->lang_id)
->enabled(true) ->enabled(true)
@@ -280,47 +226,20 @@ class TopicNas extends Common
View::assign('article', $article); View::assign('article', $article);
// 获取文章分类及文章数据 // 获取文章分类及文章数据
$parent = ArticleCategoryModel::uniqueLabel('CATEGORY_681182e0a4529')->language($this->lang_id)->value('id'); $parent = ArticleCategoryModel::uniqueLabel('CATEGORY_681182e0a4529')->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) { $article_categorys = ArticleCategoryModel::with(['article' => function ($query) {
$query->field(['id', 'title', 'category_id'])->order(['sort' => 'asc', 'id' => 'desc']); $query->field(['id', 'title', 'category_id']);
}]) }])
->field([ ->field([
'id', 'id',
'pid',
'name', 'name',
'icon' 'icon'
]) ])
->language($this->lang_id) ->language($this->lang_id)
// ->parent($parent) ->parent($parent)
->parentChild($parent_two)
->isShow(true) ->isShow(true)
->order(['sort' => 'asc', 'id' => 'desc'])
->select(); ->select();
// dump($article_categorys->toArray());exit; View::assign('article_categorys', $article_categorys);
//查询三级分类
$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);
return View::fetch('help_detail'); return View::fetch('help_detail');
} }
@@ -332,64 +251,17 @@ class TopicNas extends Common
{ {
$keywords = request()->post('keywords'); $keywords = request()->post('keywords');
// 根据关键词查询文章 // 根据关键词查询文章
$parent = ArticleCategoryModel::uniqueLabel('CATEGORY_681182e0a4529')
->language($this->lang_id)
->value('id');
// 获取帮且中心分类子分类
$categorys = [];
$table_name = (new ArticleCategoryModel)->getTable();
if (env('DB_VERSION', '5') == '8') {
$categorys = \think\facade\Db::query(preg_replace(
'/\s+/u',
' ',
"WITH RECURSIVE article_tree_by AS (
SELECT a.id, a.pid FROM $table_name a WHERE a.id = {$parent}
UNION ALL
SELECT k.id, k.pid FROM $table_name k INNER JOIN article_tree_by t ON t.id = k.pid
)
SELECT id FROM article_tree_by WHERE id <> {$parent}"
));
} else {
$categorys = \think\facade\Db::query("
SELECT t2.id
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 := $parent) vars, $table_name h
WHERE @r <> 0) t1
JOIN $table_name t2
ON FIND_IN_SET(t2.pid, t1._id)
ORDER BY t2.id;
");
}
if (empty($categorys)) return success('success', []);
// 获取文章数据
$articles = ArticleModel::field([ $articles = ArticleModel::field([
'id', 'id',
'category_id',
'title' 'title'
]) ])
->withSearch(['title'], [ ->withSearch(['title'], [
'title' => $keywords??null 'title' => $keywords??null
]) ])
->language($this->lang_id) ->language($this->lang_id)
->where('category_id', 'IN', array_column($categorys, 'id'))
->select(); ->select();
//查询上级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());
} }
/** /**
@@ -400,11 +272,8 @@ class TopicNas extends Common
$data = []; $data = [];
// 获取banner数据 // 获取banner数据
$banners = SysBannerModel::with(['items' => function($query) { $banners = SysBannerModel::with(['items' => function($query) {
$query->withoutField(['sort', 'created_at', 'updated_at', 'deleted_at']) $query->withoutField(['sort', 'created_at', 'updated_at', 'deleted_at']);
->order(['sort' => 'asc', 'id' => 'desc'])
->enabled(true);
}]) }])
->atPlatform(request()->from)
->uniqueLabel([ ->uniqueLabel([
'BANNER_6810798e6e828', 'BANNER_6810798e6e828',
'BANNER_68107a0a63910', 'BANNER_68107a0a63910',

View File

@@ -1,127 +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 initialize()
{
// 获取国家/语言列表
$languages = $this->getLanguages();
// 输出国家/语言列表
if (get_platform() == 'mobile') {
View::assign('header_languages', $languages);
}
// 获取当前语言
$current_language = $this->getCurrentLanguage($languages);
if (!empty($current_language)) {
$this->lang_id = $current_language['id'];
}
// 获取产品分类
$categorys = $this->getProductCategory($this->lang_id);
// 输出产品分类
View::assign('header_categorys', $categorys);
// 获取系统配置
$configs = $this->getSysConfig($this->lang_id, ['basic', 'contact', 'media']);
$this->basic_config = $configs['basic'];
// 输出系统配置
View::assign('basic_config', $configs['basic']);
View::assign('contact_config', $configs['contact']);
View::assign('media_config', $configs['media']);
// 获取底部导航
$footer_navigation = $this->getNavigation('NAV_67f60be43df8d', $this->lang_id);
// 输出底部导航
View::assign('footer_navigation', $footer_navigation);
}
/**
* 专题 - 电力品线首页
*/
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

@@ -11,13 +11,8 @@ return [
'联系方式' => 'Contact', '联系方式' => 'Contact',
// 返回文本 // 返回文本
'提交成功' => 'success',
'提交失败' => 'fail',
'信息已成功提交!' => 'Add Success', '信息已成功提交!' => 'Add Success',
'信息提交失败!' => 'Add Fail', '信息提交失败!' => 'Add Fail',
'留言提交失败' => 'Message submit failed',
'留言提交成功' => 'Message submit success',
'当前选定语言的采购可选品类配置出错' => 'Current language configuration of purchase optional categories is incorrect',
// 首页 // 首页
'index/index' => [ 'index/index' => [
@@ -31,20 +26,6 @@ return [
'客服团队的工作时间周一到周五早9点到晚6点 平均应答时间24小时内' => 'Our customer support is available Monday to Friday: 9am-6:00pm. Average answer time: 24h', '客服团队的工作时间周一到周五早9点到晚6点 平均应答时间24小时内' => 'Our customer support is available Monday to Friday: 9am-6:00pm. Average answer time: 24h',
], ],
// 文章详情页
'article/detail' => [
'分享' => 'SHARE',
'留言' => 'Leave a Reply',
'名称' => 'Name',
'电子邮箱' => 'Email',
'您的电子邮件地址不会被公开' => 'Your email address will not be pulished.',
'留言内容' => 'Comment',
'评论' => 'COMMENT',
'提交留言' => 'POST COMMENT',
'你可能还喜欢' => 'Recommended for you',
'链接复制成功' => 'Link copied successfully',
],
// 产品分类 // 产品分类
'product/category' => [ 'product/category' => [
'查看全部' => 'View All', '查看全部' => 'View All',
@@ -53,7 +34,6 @@ return [
'product/search' => [ 'product/search' => [
'搜索' => 'Search', '搜索' => 'Search',
'请搜索' => 'Please search...', '请搜索' => 'Please search...',
'暂无数据' => 'No data',
], ],
// 产品详情 // 产品详情
'product/detail' => [ 'product/detail' => [
@@ -75,12 +55,6 @@ return [
'提交' => 'SUBMIT', '提交' => 'SUBMIT',
], ],
// 常见问题
'faq/index' => [
'常见FQ_下载与服务_中文官网帮助信息_ORICO/奥睿科官网' => 'FAQ',
'常见问题解答' => 'Frequently asked questions',
],
// 附件下载 // 附件下载
'attachment/index' => [ 'attachment/index' => [
'软件下载' => 'Software download', '软件下载' => 'Software download',
@@ -144,79 +118,4 @@ return [
'发送' => 'SEND', '发送' => 'SEND',
'成为经销商' => 'Become a Distributor', '成为经销商' => 'Become a Distributor',
], ],
// 关于我们 - 品牌介绍
'aboutus/introduction' => [
'品牌介绍' => 'Introduction of the Brand',
'选择我们的理由' => 'Why Choose Us',
'为您提供专属定制服务' => 'How We Can Help with Customization',
'对于不同的情况' => 'For Different Situation',
],
// 关于我们 - 文化介绍
'aboutus/culture' => [
'文化介绍' => 'Culture Introduction',
],
// 关于我们 - 品牌历程
'aboutus/mileage' => [
'ORICO荣耀' => 'Our Achievement',
'品牌里程' => 'Brand Events',
'品牌活动' => 'Tech Development',
],
// 关于我们 - 售后政策
'aboutus/policy' => [
'售后政策_注意事项' => 'After-Sales Policy',
'售后政策' => 'After-sale Policy',
'ORICO/奥睿科商城为您提供七天包退、15天换新、1年保修、终身维护的服务承诺' => 'ORICO commits to provide 7-day Refund, 15-day Exchange, 1-year Quality Warranty. ',
'为了保障您的合法权益,敬请关注以下信息' => 'For your own benefits, please mind the following information',
'为了得到深圳市元创时代科技有限公司给予您的“包修、包换、包退”的权益,请您:' => 'For a smooth return and refund, quality warranty, please follow these steps:',
'特别说明' => 'ORICO is not liable for:'
],
// nas主题 - 首页
'topicnas/index' => [
'网络存储解决方案' => 'Network Storage Solutions',
'配套软件' => 'Software',
],
// nas主题 - 客户合作页
'topicnas/cooperation' => [
'成为ORICO合作伙伴' => 'Be an ORICO partner',
'合作伙伴招募' => 'Partner recruitment',
'广告代理' => 'Advertising Agency',
'抖音销售' => 'Douyin Sales',
'代理经销合作' => 'Proxy and distribution cooperation',
'ODM合作' => 'ODM cooperation',
'合作优势' => 'Cooperation advantages',
'期待与您的合作' => 'Looking forward to working with you'
],
// nas主题 - 下载页
'topicnas/download' => [
'CyberData赛博云空间' => 'CyberData',
'Weline微链接' => 'Weline'
],
// nas主题 - 帮助页
'topicnas/help' => [
'帮助中心' => 'Quick Start Guide',
'请输入搜索关键字,如安装赛博云空间,影视库' => 'What are you looking for?',
'取消' => 'Cancel',
'使用教程' => 'User\' s Guide',
'查看更多' => 'Click to view more',
'联系我们' => 'Contact US',
'目录' => 'Content'
],
// nas主题 - 帮助详情页
'topicnas/helpdetail' => [
'帮助中心' => 'Quick Start Guide',
'请输入搜索关键字,如安装赛博云空间,影视库' => 'What are you looking for?',
'取消' => 'Cancel',
'使用教程' => 'User\' s Guide',
'联系我们' => 'Contact US',
'目录' => 'Content'
],
]; ];

View File

@@ -1,227 +1,226 @@
<?php <?php
return [ return [
'首页' => 'Home', 'header_navigation' => [
'产品列表' => 'Products', 'product_categorys' => 'Products',
'店铺' => 'Store', 'store' => 'Store'
'搜索记录' => 'Search History',
'热销产品' => 'Popular Products',
'产品' => 'Product',
'联系我们' => 'Contact',
// 返回文本
'提交成功' => 'success',
'提交失败' => 'fail',
'信息已成功提交!' => 'Add Success',
'信息提交失败!' => 'Add Fail',
'当前选定语言的采购可选品类配置出错' => 'Current language configuration of purchase optional categories is incorrect',
// 首页
'index/index' => [
'查看所有' => 'View All',
'明星产品/热点产品' => 'Featured Products',
'了解更多' => 'Learn More',
'ORICO 技术' => 'ORICO Technology',
'强大功能、简单使用' => 'Designed to be just as easy to learn as iPhone.Chatting with friends.',
'常见问题' => 'FAQ',
'回答您最关心的问题' => 'What are you most concerned about',
'客服团队的工作时间周一到周五早9点到晚6点 平均应答时间24小时内' => 'Our customer support is available Manday to Friday 9am600pmAverage arswer time 24h',
], ],
'header_search' => [
// 文章详情页 'history' => 'Search History',
'article/detail' => [ 'hot_product' => 'Popular Products',
'分享' => 'SHARE',
'留言' => 'Leave a Reply',
'名称' => 'Name',
'电子邮箱' => 'Email',
'您的电子邮件地址不会被公开' => 'Your email address will not be pulished.',
'留言内容' => 'Comment',
'评论' => 'COMMENT',
'提交留言' => 'POST COMMENT',
'你可能还喜欢' => 'Recommended for you',
'链接复制成功' => 'Link copied successfully',
], ],
'footer_navigation' => [
// 常见问题 'product_categorys' => 'Product'
'faq/index' => [
'常见FQ_下载与服务_中文官网帮助信息_ORICO/奥睿科官网' => 'FAQ',
], ],
'footer_contact' => 'Contact',
// 附件页 - 软件下载 'index' => [
'attachment/index' => [ 'featured_products' => 'Featured Products',
'软件和驱动程序' => 'Software and Drivers', 'view_all' => 'View All',
'视频' => 'Videos', 'learn_more' => 'Learn More',
'支持型号' => 'Supported Models', 'orico_technology' => 'ORICO Technology',
'支持系统' => 'Supported Systems', 'orico_technology_desc' => 'Designed to be just as easy to learn as iPhone.Chatting with friends.',
'搜索' => 'Search', 'faq' => 'FAQ',
'查询无结果!' => 'No Result', 'faq_short_desc' => 'What are you most concerned about',
'faq_desc' => 'Our customer support is available Manday to Friday 9am600pmAverage arswer time 24h',
], ],
'article' => [
// 附件页 - 视频 'detail_share' => 'SHARE',
'attachment/video' => [ 'detail_leave_reply' => 'Leave a Reply',
'软件和驱动程序' => 'Software and Drivers', 'detail_leave_reply_name' => 'Name',
'搜索' => 'Search', 'detail_leave_reply_email' => 'Email',
'视频' => 'Videos', 'detail_leave_reply_email_tip' => 'Your email address will not be pulished.',
'查询无此视频!' => 'No Video', 'detail_leave_reply_comment' => 'Comment',
'detail_leave_reply_submit' => 'POST COMMENT',
'detail_recommend' => 'Recommended for you',
], ],
'attachment' => [
// 关于我们 - 品牌介绍 'software_drives' => 'Software and Drivers',
'aboutus/introduction' => [ 'video' => 'Videos',
'品牌介绍' => 'Introduction of the Brand', 'support_model' => 'Supported Models',
'选择我们的理由' => 'Why Choose Us', 'support_platform' => 'Supported Systems',
'为您提供专属定制服务' => 'How We Can Help with Customization', 'search_placeholder' => 'Search model',
'对于不同的情况' => 'For Different Situation', 'no_data' => 'No Result',
'no_video' => 'No Video',
], ],
'aboutus_introduction' => [
// 关于我们 - 品牌历程 'title' => 'Introduction of the Brand',
'aboutus/mileage' => [ 'section_why_title' => 'Why Choose Us',
'ORICO荣耀' => 'Our Achievement', 'section_service_title' => 'How We Can Help with Customization',
'品牌里程' => 'Brand Events', 'section_difference_title' => 'For Different Situation',
'品牌活动' => 'Tech Development',
], ],
'aboutus_mileage' => [
// 关于我们 - 售后政策 'achievement' => 'Our Achievement',
'aboutus/policy' => [ 'events' => 'Brand Events',
'售后政策_注意事项' => 'After-Sales Policy', 'development' => 'Tech Development',
'售后政策' => 'After-sale Policy',
'ORICO/奥睿科商城为您提供七天包退、15天换新、1年保修、终身维护的服务承诺' => 'ORICO commits to provide 7-day Refund, 15-day Exchange, 1-year Quality Warranty. ',
'为了保障您的合法权益,敬请关注以下信息' => 'For your own benefits, please mind the following information',
'为了得到深圳市元创时代科技有限公司给予您的“包修、包换、包退”的权益,请您:' => 'For a smooth return and refund, quality warranty, please follow these steps:',
'特别说明' => 'ORICO is not liable for:'
], ],
'aboutus_policy' => [
// 关于我们 - 文化介绍 'title' => 'After-Sales Policy',
'aboutus/culture' => [ 'banner_1_title' => 'After-sale Policy',
'文化介绍' => 'Culture Introduction', 'banner_1_desc' => 'ORICO commits to provide 7-day Refund, 15-day Exchange, 1-year Quality Warranty. ',
'banner_3_title' => 'For your own benefits, please mind the following information',
'banner_3_desc' => 'For a smooth return and refund, quality warranty, please follow these steps:',
'banner_5_title' => 'ORICO is not liable for:'
], ],
'contact_index' => [
// 联系我们 'title' => 'contact us',
'contactus/index' => [
'客户服务' => 'contact us',
], ],
'contact_message' => [
// 联系我们 - 留言 'title' => 'contact us',
'contactus/message' => [ 'our_information' => 'Our Information',
'联系我们' => 'contact us', 'send_question' => 'Send Us Your Question',
'我们的信息' => 'Our Information', 'form_name' => 'Yuor Name',
'提交您的问题' => 'Send Us Your Question', 'form_name_placeholder' => 'This is your placeholder text',
'姓名' => 'Yuor Name', 'form_email' => 'Your Email',
'请输入你的姓名' => 'This is your placeholder text', 'form_email_placeholder' => 'This is your placeholder text',
'电子邮箱' => 'Your Email', 'form_question' => 'Your Message',
'请输入你的邮箱' => 'This is your placeholder text', 'form_question_placeholder' => 'This is your placeholder text',
'您的问题' => 'Your Message', 'form_submit' => 'SEND',
'请输入你的问题' => 'This is your placeholder text', 'become_a_distributor' => 'Become a Distributor',
'发送' => 'SEND', // 验证器中文本
'成为经销商' => 'Become a Distributor', 'validate_name_required' => 'Name is required',
'validate_name_max' => 'Name cannot exceed 64 characters',
'validate_email_required' => 'Email is required',
'validate_email_email' => 'Email format is incorrect',
'validate_email_max' => 'Email cannot exceed 128 characters',
'validate_content_required' => 'Message is required',
'validate_content_max' => 'Message cannot exceed 1024 characters',
// 返回文本
'send_success' => 'success',
'send_fail' => 'fail',
], ],
'contact_distributor' => [
// 联系我们 - 成为经销商 'title' => 'Become a Distributor',
'contactus/distributor' => [ 'section_title' => 'To Be Our Distributor',
'成为经销商' => 'To Be Our Distributor', 'section_desc_1' => 'Ready to join us?',
'准备好加入我们了吗?' => 'Ready to join us?', 'section_desc_2' => 'Enter your details below and our Sales team will get back to you within 2 business days.',
'在下面输入您的详细信息我们的销售团队将在2个工作日内回复您。' => 'Enter your details below and our Sales team will get back to you within 2 business days.', 'form_corp_name' => 'Company Name',
'公司名称' => 'Company Name', 'form_corp_name_placeholder' => 'Enter your Company Name',
'请输入公司名称' => 'Enter your Company Name', 'form_email' => 'Contact Email',
'电子邮箱' => 'Contact Email', 'form_email_placeholder' => 'Enter your Email',
'请输入邮箱' => 'Enter your Email', 'form_phone' => 'Phone Number',
'电话号码' => 'Phone Number', 'form_phone_placeholder' => 'This is your placeholder text',
'请输入电话号码' => 'This is your placeholder text', 'form_business_type' => 'Type of Business',
'业务类型' => 'Type of Business', 'form_online_shop_url' => 'Online Shop URL',
'在线商店网址' => 'Online Shop URL', 'form_online_shop_url_placeholder' => 'This is your placeholder URL',
'请输入网址' => 'This is your placeholder URL', 'form_enterprise_size' => 'Enterprise size',
'企业规模' => 'Enterprise size', 'form_corp_address' => 'Company Address',
'公司地址' => 'Company Address', 'form_corp_address_placeholder' => 'Enter Address',
'请输入地址' => 'Enter Address', 'form_message' => 'Message',
'留言' => 'Message', 'form_message_placeholder' => 'Enter your message',
'请输入留言' => 'Enter your message', 'form_submit' => 'SUBMIT',
'提交' => 'SUBMIT', // 验证器中文本
'validate_name_required' => 'Company Name is required',
'validate_name_max' => 'Company Name cannot exceed 64 characters',
'validate_email_required' => 'Email is required',
'validate_email_email' => 'Email format is incorrect',
'validate_email_max' => 'Email cannot exceed 128 characters',
'validate_phone_required' => 'Phone Number is required',
'validate_phone_max' => 'Phone Number cannot exceed 64 characters',
'validate_business_type_required' => 'Type of Business is required',
'validate_business_type_max' => 'Type of Business cannot exceed 128 characters',
'validate_enterprise_size_required' => 'Enterprise size is required',
'validate_enterprise_size_max' => 'Enterprise size cannot exceed 128 characters',
'validate_address_required' => 'Company Address is required',
'validate_address_max' => 'Company Address cannot exceed 255 characters',
'validate_message_required' => 'Message is required',
// 返回文本
'send_success' => 'Add Success',
'send_fail' => 'Add Fail',
], ],
'contact_bulkbuy' => [
// 联系我们 - 批量购买 'title' => '',
'contactus/bulkbuy' => [ 'form_title' => 'Bulk Buy',
'商务订单' => 'Bulk Buy', 'form_corp_name_label' => 'Company Name',
'批量购买' => 'Bulk Buy', 'form_corp_name_placeholder' => 'Legal business name',
'公司名称' => 'Company Name', 'form_website_url_label' => 'Official website',
'法定营业名称' => 'Legal business name', 'form_website_url_placeholder' => 'Please paste the URL',
'官方网站' => 'Official website', 'form_username_label' => 'Your Name',
'请粘贴网址' => 'Please paste the URL', 'form_firstname_placeholder' => 'First name',
'姓名' => 'Your Name', 'form_lastname_placeholder' => 'Last name',
'名' => 'First name', 'form_email_label' => 'Email',
'姓' => 'Last name', 'form_email_placeholder' => 'Please enter your email',
'电子邮箱' => 'Email', 'form_phone_label' => 'Phone Numbe',
'请输入邮箱' => 'Please enter your email', 'form_phone_placeholder' => 'Please enter your phone number',
'电话号码' => 'Phone Numbe', 'form_checkbox_label' => 'Products you are interested in?',
'请输入电话号码' => 'Please enter your phone number', 'form_message_label' => 'Message',
'您对哪个产品品类感兴趣?' => 'Products you are interested in?', 'form_message_placeholder' => 'Methods used',
'留言' => 'Message', 'form_submit' => 'SUBMIT',
'请输入留言' => 'Methods used', // 验证器中文本
'提交' => 'SUBMIT', 'validate_corp_name_require' => 'Company Name is required',
'validate_corp_name_max' => 'Company Name cannot exceed 128 characters',
'validate_url_max' => 'URL cannot exceed 255 characters',
'validate_first_name_require' => 'First Name is required',
'validate_first_name_max' => 'First Name cannot exceed 64 characters',
'validate_last_name_require' => 'Last Name is required',
'validate_last_name_max' => 'Last Name cannot exceed 64 characters',
'validate_email_require' => 'Email is required',
'validate_email_email' => 'Email format is incorrect',
'validate_email_max' => 'Email cannot exceed 128 characters',
'validate_phone_max' => 'Phone Number cannot exceed 32 characters',
'validate_interested_max' => 'Interested in cannot exceed 255 characters',
'validate_message_require' => 'Message is required',
'validate_message_max' => 'Message cannot exceed 1024 characters',
// 返回文本
'send_success' => 'Add Success',
'send_fail' => 'Add Fail',
], ],
'product_newpro' => [
// 产品 - 产品详情页 'view_all' => 'View all'
'product/detail' => [
'首页' => 'Home',
'型号' => 'Product Model',
'产品详情' => 'Product Description',
'相关产品' => 'Related Products',
'发送查询' => 'Send Inquiry',
'姓名' => 'Name',
'请输入您的姓' => 'First name',
'请输入您的名' => 'Last name',
'公司/组织' => 'Company/Organization',
'电子邮箱' => 'Email Address',
'电话号码' => 'Phone Number',
'国家' => 'Country',
'请选择所属国家' => '--- Select your country ---',
'行业' => 'Industry',
'询问内容' => 'Inquiry',
'提交' => 'SUBMIT',
], ],
'product_detail' => [
// 产品 - 搜索 'detail_section_title' => 'Product Description',
'product/search' => [ 'related_products' => 'Related Products',
'暂无数据' => 'No data', 'display_form' => 'Send Inquiry',
'form_name' => 'Name',
'form_first_name_placeholder' => 'First name',
'form_last_name_placeholder' => 'Last name',
'form_corp' => 'Company/Organization',
'form_email' => 'Email Address',
'form_phone' => 'Phone Number',
'form_country' => 'Country',
'form_country_placeholder' => '--- Select your country ---',
'form_industry' => 'Industry',
'form_inquiry' => 'Inquiry',
'form_submit' => 'SUBMIT',
// 验证器中文本
'validate_first_name_require' => 'First Name is required',
'validate_first_name_max' => 'First Name cannot exceed 64 characters',
'validate_last_name_require' => 'Last Name is required',
'validate_last_name_max' => 'Last Name cannot exceed 64 characters',
'validate_email_require' => 'Email is required',
'validate_email_email' => 'Email format is incorrect',
'validate_email_max' => 'Email cannot exceed 128 characters',
'validate_phone_max' => 'Phone Number cannot exceed 32 characters',
'validate_country_name_require' => 'Country is required',
'validate_country_name_max' => 'Country cannot exceed 128 characters',
'validate_corp_name_require' => 'Company/Organization is required',
'validate_corp_name_max' => 'Company/Organization cannot exceed 128 characters',
'validate_industry_require' => 'Industry is required',
'validate_industry_max' => 'Industry cannot exceed 64 characters',
'validate_message_require' => 'Message is required',
'validate_message_max' => 'Message cannot exceed 1024 characters',
// 返回文本
'send_success' => 'Add Success',
'send_fail' => 'Add Fail',
], ],
'topic_nas_index' => [
// 产品 - 分类 'solution_section_title' => '<span style="color:#004BFA;">ORICO</span>网络存储解决方案',
'product/category' => [ 'software_section_title' => '<span style="color:#004BFA">NAS</span>配套软件',
'查看全部' => 'View All',
], ],
'topic_nas_cooperation' => [
// nas主题 - 首页 'advantages_section_title' => 'Cooperation advantages',
'topicnas/index' => [ 'contacts_section_title' => 'Looking forward to working with you'
'网络存储解决方案' => 'Network Storage Solutions',
'配套软件' => 'Software',
], ],
'topic_nas_download' => [
// nas主题 - 客户合作页 'cyber_tab_title' => 'CyberData',
'topicnas/cooperation' => [ 'weline_tab_title' => 'Weline'
'合作优势' => 'Cooperation advantages',
'期待与您的合作' => 'Looking forward to working with you'
],
// nas主题 - 下载页
'topicnas/download' => [
'CyberData赛博云空间' => 'CyberData',
'Weline微链接' => 'Weline'
],
// nas主题 - 帮助页
'topicnas/help' => [
'帮助中心' => 'Quick Start Guide',
'请输入搜索关键字,如安装赛博云空间,影视库' => 'What are you looking for?',
'使用教程' => 'User\' s Guide',
'查看更多' => 'Click to view more',
'联系我们' => 'Contact US',
'目录' => 'Content'
],
// nas主题 - 帮助详情页
'topicnas/helpdetail' => [
'帮助中心' => 'Quick Start Guide',
'请输入搜索关键字,如安装赛博云空间,影视库' => 'What are you looking for?',
'使用教程' => 'User\' s Guide',
'联系我们' => 'Contact US',
'目录' => 'Content'
], ],
'topic_nas_help' => [
'module_title' => 'Quick Start Guide',
'search_input_placeholder' => 'What are you looking for?',
'article_section_title' => 'User\' s Guide',
'contact_section_title' => 'Contact US',
'view_more' => 'Click to view more',
'content' => 'Content'
]
]; ];

View File

@@ -9,20 +9,17 @@ return [
'姓名不能超过:rule个字符' => 'Name cannot exceed :rule characters', '姓名不能超过:rule个字符' => 'Name cannot exceed :rule characters',
'电话号码不能为空' => 'Phone Number is required', '电话号码不能为空' => 'Phone Number is required',
'电话号码不能超过:rule个字符' => 'Phone number cannot exceed :rule characters', '电话号码不能超过:rule个字符' => 'Phone number cannot exceed :rule characters',
'感兴趣的产品种类不能为空' => 'Interested product categories is required',
'感兴趣的产品种类不能超过:rule个字符' => 'Interested product categories cannot exceed :rule characters', '感兴趣的产品种类不能超过:rule个字符' => 'Interested product categories cannot exceed :rule characters',
'邮箱不能为空' => 'Email is required', '邮箱不能为空' => 'Email is required',
'邮箱格式不正确' => 'Email format is incorrect', '邮箱格式不正确' => 'Email format is incorrect',
'邮箱不能超过:rule个字符' => 'Email cannot exceed :rule characters', '邮箱不能超过:rule个字符' => 'Email cannot exceed :rule characters',
'国家不能为空' => 'Country is required', '国家不能为空' => 'Country is required',
'国家不能超过:rule个字符' => 'Country cannot exceed :rule characters', '国家不能超过:rule个字符' => 'Country cannot exceed :rule characters',
'网址格式不正确' => 'URL format is incorrect',
'网址不能超过:rule个字符' => 'URL cannot exceed :rule characters', '网址不能超过:rule个字符' => 'URL cannot exceed :rule characters',
'公司名称不能为空' => 'Company Name is required', '公司名称不能为空' => 'Company Name is required',
'公司名称不能超过:rule个字符' => 'Company name cannot exceed :rule characters', '公司名称不能超过:rule个字符' => 'Company name cannot exceed :rule characters',
'公司地址不能为空' => 'Company Address is required', '公司地址不能为空' => 'Company Address is required',
'公司地址不能超过:rule个字符' => 'Company Address cannot exceed :rule characters', '公司地址不能超过:rule个字符' => 'Company Address cannot exceed :rule characters',
'留言不能为空' => 'Message is required',
'企业规模不能为空' => 'Enterprise Size is required', '企业规模不能为空' => 'Enterprise Size is required',
'企业规模不能超过:rule个字符' => 'Enterprise Size cannot exceed :rule characters', '企业规模不能超过:rule个字符' => 'Enterprise Size cannot exceed :rule characters',
'业务类型不能为空' => 'Type of Business is required', '业务类型不能为空' => 'Type of Business is required',

226
app/index/lang/zh-cn/pc.php Normal file
View File

@@ -0,0 +1,226 @@
<?php
return [
'header_navigation' => [
'product_categorys' => '产品列表',
'store' => '店铺'
],
'header_search' => [
'hot_product' => '热销产品',
'history' => '搜索记录',
],
'footer_navigation' => [
'product_categorys' => '产品'
],
'footer_contact' => '联系我们',
'index' => [
'featured_products' => '明星产品/热点产品',
'view_all' => '查看所有',
'learn_more' => '了解更多',
'orico_technology' => 'ORICO 技术',
'orico_technology_desc' => '强大功能、简单使用',
'faq' => '常见问题',
'faq_short_desc' => '回答您最关心的问题',
'faq_desc' => '客服团队的工作时间周一到周五早9点到晚6点 平均应答时间24小时内',
],
'article' => [
'detail_share' => '分享',
'detail_leave_reply' => '留言',
'detail_leave_reply_name' => '名称',
'detail_leave_reply_email' => '电子邮箱',
'detail_leave_reply_email_tip' => '您的电子邮件地址不会被公开',
'detail_leave_reply_comment' => '留言',
'detail_leave_reply_submit' => '提交留言',
'detail_recommend' => '你可能还喜欢',
],
'attachment' => [
'software_drives' => '软件和驱动程序',
'video' => '视频',
'support_model' => '支持型号',
'support_platform' => '支持系统',
'search_placeholder' => '搜索型号',
'no_data' => '查询无结果!',
'no_video' => '查询无此视频!',
],
'aboutus_introduction' => [
'title' => '品牌介绍',
'section_why_title' => '选择我们的理由',
'section_service_title' => '为您提供专属定制服务',
'section_difference_title' => '对于不同的情况',
],
'aboutus_mileage' => [
'achievement' => 'ORICO荣耀',
'events' => '品牌里程',
'development' => '品牌活动',
],
'aboutus_policy' => [
'title' => '售后政策_注意事项',
'banner_1_title' => '售后政策',
'banner_1_desc' => 'ORICO/奥睿科商城为您提供七天包退、15天换新、1年保修、终身维护的服务承诺',
'banner_3_title' => '为了保障您的合法权益,敬请关注以下信息',
'banner_3_desc' => '为了得到深圳市元创时代科技有限公司给予您的“包修、包换、包退”的权益,请您:',
'banner_5_title' => '特别说明'
],
'contact_index' => [
'title' => '客户服务',
],
'contact_message' => [
'title' => '联系我们',
'our_information' => '我们的信息',
'send_question' => '提交您的问题',
'form_name' => '姓名',
'form_name_placeholder' => '请输入你的姓名',
'form_email' => '电子邮箱',
'form_email_placeholder' => '请输入你的邮箱',
'form_question' => '您的问题',
'form_question_placeholder' => '请输入你的问题',
'form_submit' => '发送',
'become_a_distributor' => '成为经销商',
// 验证器中文本
'validate_name_required' => '姓名不能为空',
'validate_name_max' => '姓名不能超过64个字符',
'validate_email_required' => '邮箱不能为空',
'validate_email_email' => '邮箱格式不正确',
'validate_email_max' => '邮箱不能超过128个字符',
'validate_content_required' => '问题不能为空',
'validate_content_max' => '问题不能超过1024个字符',
// 返回文本
'send_success' => '提交成功',
'send_fail' => '提交失败',
],
'contact_distributor' => [
'title' => '成为经销商',
'section_title' => '成为经销商',
'section_desc_1' => '准备好加入我们了吗?',
'section_desc_2' => '在下面输入您的详细信息我们的销售团队将在2个工作日内回复您。',
'form_corp_name' => '公司名称',
'form_corp_name_placeholder' => '请输入公司名称',
'form_email' => '电子邮箱',
'form_email_placeholder' => '请输入邮箱',
'form_phone' => '电话号码',
'form_phone_placeholder' => '请输入电话号码',
'form_business_type' => '业务类型',
'form_online_shop_url' => '在线商店网址',
'form_online_shop_url_placeholder' => '请输入网址',
'form_enterprise_size' => '企业规模',
'form_corp_address' => '公司地址',
'form_corp_address_placeholder' => '请输入地址',
'form_message' => '留言',
'form_message_placeholder' => '请输入留言',
'form_submit' => '提交',
// 验证器中文本
'validate_name_required' => '公司名称不能为空',
'validate_name_max' => '公司名称不能超过64个字符',
'validate_email_required' => '邮箱不能为空',
'validate_email_email' => '邮箱格式不正确',
'validate_email_max' => '邮箱不能超过128个字符',
'validate_phone_required' => '电话号码不能为空',
'validate_phone_max' => '电话号码不能超过64个字符',
'validate_business_type_required' => '业务类型不能为空',
'validate_business_type_max' => '业务类型不能超过128个字符',
'validate_enterprise_size_required' => '企业规模不能为空',
'validate_enterprise_size_max' => '企业规模不能超过128个字符',
'validate_address_required' => '公司地址不能为空',
'validate_address_max' => '公司地址不能超过255个字符',
'validate_message_required' => '留言内容不能为空',
// 返回文本
'send_success' => '信息已成功提交',
'send_fail' => '信息提交失败',
],
'contact_bulkbuy' => [
'title' => '商务订单',
'form_title' => '批量购买',
'form_corp_name_label' => '公司名称',
'form_corp_name_placeholder' => '法定营业名称',
'form_website_url_label' => '官方网站',
'form_website_url_placeholder' => '请粘贴网址',
'form_username_label' => '姓名',
'form_firstname_placeholder' => '名',
'form_lastname_placeholder' => '姓',
'form_email_label' => '电子邮箱',
'form_email_placeholder' => '请输入邮箱',
'form_phone_label' => '电话号码',
'form_phone_placeholder' => '请输入电话号码',
'form_checkbox_label' => '您对哪个产品品类感兴趣?',
'form_message_label' => '留言',
'form_message_placeholder' => '请输入留言',
'form_submit' => '提交',
// 验证器中文本
'validate_corp_name_require' => '公司名称不能为空',
'validate_corp_name_max' => '公司名称不能超过128个字符',
'validate_url_max' => '网址不能超过255个字符',
'validate_first_name_require' => '名不能为空',
'validate_first_name_max' => '名不能超过64个字符',
'validate_last_name_require' => '姓不能为空',
'validate_last_name_max' => '姓不能超过64个字符',
'validate_email_require' => '邮箱不能为空',
'validate_email_email' => '邮箱格式不正确',
'validate_email_max' => '邮箱不能超过128个字符',
'validate_phone_max' => '电话号码不能超过32个字符',
'validate_interested_max' => '感兴趣的产品种类不能超过255个字符',
'validate_message_require' => '留言内容不能为空',
'validate_message_max' => '留言内容不能超过1024个字符',
// 返回文本
'send_success' => '信息已成功提交',
'send_fail' => '信息提交失败',
],
'product_newpro' => [
'view_all' => '查看全部'
],
'product_detail' => [
'detail_section_title' => '产品详情',
'related_products' => '相关产品',
'display_form' => '发送查询',
'form_name' => '姓名',
'form_first_name_placeholder' => '请输入您的姓',
'form_last_name_placeholder' => '请输入您的名',
'form_corp' => '公司/组织',
'form_email' => '电子邮箱',
'form_phone' => '电话号码',
'form_country' => '国家',
'form_country_placeholder' => '请选择所属国家',
'form_industry' => '行业',
'form_inquiry' => '询问内容',
'form_submit' => '提交',
// 验证器中文本
'validate_first_name_require' => '名不能为空',
'validate_first_name_max' => '名不能超过64个字符',
'validate_last_name_require' => '姓不能为空',
'validate_last_name_max' => '姓不能超过64个字符',
'validate_email_require' => '邮箱不能为空',
'validate_email_email' => '邮箱格式不正确',
'validate_email_max' => '邮箱不能超过128个字符',
'validate_phone_max' => '电话号码不能超过32个字符',
'validate_country_name_require' => '国家不能为空',
'validate_country_name_max' => '国家不能超过128个字符',
'validate_corp_name_require' => '公司/组织不能为空',
'validate_corp_name_max' => '公司/组织不能超过128个字符',
'validate_industry_require' => '行业不能为空',
'validate_industry_max' => '行业不能超过64个字符',
'validate_message_require' => '询问内容不能为空',
'validate_message_max' => '询问内容不能超过1024个字符',
// 返回文本
'send_success' => '信息已成功提交',
'send_fail' => '信息提交失败',
],
'topic_nas_index' => [
'solution_section_title' => '<span style="color:#004BFA;">ORICO</span>网络存储解决方案',
'software_section_title' => '<span style="color:#004BFA">NAS</span>配套软件',
],
'topic_nas_cooperation' => [
'advantages_section_title' => '合作优势',
'contacts_section_title' => '期待与您的合作'
],
'topic_nas_download' => [
'cyber_tab_title' => 'CyberData赛博云空间',
'weline_tab_title' => 'Weline微链接'
],
'topic_nas_help' => [
'module_title' => '帮助中心',
'search_input_placeholder' => '请输入搜索关键字,如安装赛博云空间,影视库',
'article_section_title' => '使用教程',
'contact_section_title' => '联系我们',
'view_more' => '查看更多',
'content' => '目录'
]
];

View File

@@ -2,8 +2,7 @@
// 这是系统自动生成的middleware定义文件 // 这是系统自动生成的middleware定义文件
return [ return [
// 启用多语言支持 // 启用多语言支持
// think\middleware\LoadLangPack::class, think\middleware\LoadLangPack::class,
app\index\middleware\LoadLangPack::class,
// 确认请求来源 // 确认请求来源
app\index\middleware\ConfirmRequestFrom::class, app\index\middleware\ConfirmRequestFrom::class,
]; ];

View File

@@ -15,7 +15,10 @@ class ConfirmRequestFrom
public function handle($request, \Closure $next) public function handle($request, \Closure $next)
{ {
// 确认请求来源 // 确认请求来源
$request->from = get_platform(); $request->from = 'pc';
if ($request->isMobile()) {
$request->from = 'mobile';
}
return $next($request); return $next($request);
} }

View File

@@ -1,39 +0,0 @@
<?php
declare (strict_types = 1);
namespace app\index\middleware;
use think\Request;
class LoadLangPack extends \think\middleware\LoadLangPack
{
// 重写检测语言方法
protected function detect(Request $request): string
{
$domain_detect = env('INDEX_LANG_DETECT.DOMAIN_DETECT', false);
if ($domain_detect) {
$lang = $this->getLangSet($request, env('INDEX_LANG_DETECT.DOMAIN_RULE', []));
if ($lang != '') {
return $lang;
}
}
return parent::detect($request);
}
// 根据请求及规则获取语言
private function getLangSet(Request $request, array $rules): string
{
$map = [];
foreach ($rules as $v) {
$val = str_replace('', ',', $v);
$item = explode(',', $v);
foreach ($item as $val) {
$it = explode('=', $val);
$map[$it[0]] = $it[1];
}
}
return $map[$request->host()] ?? '';
}
}

View File

@@ -46,38 +46,6 @@ class ArticleCategoryModel extends ArticleCategoryBaseModel
$query->where('pid', '=', $parent); $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)
{
$query->where(function($q) use($id, $merge_self) {
$q->where('pid', '=', $id);
if ($merge_self) {
$q->whereOr('id', '=', $id);
}
});
}
// 是否显示状态范围查询 // 是否显示状态范围查询
public function scopeIsShow($query, bool $is_show) public function scopeIsShow($query, bool $is_show)
{ {

View File

@@ -16,16 +16,4 @@ class ArticleLeaveMessageModel extends ArticleLeaveMessageBaseModel
use SoftDelete; use SoftDelete;
// 软删除字段 // 软删除字段
protected $deleteTime = 'deleted_at'; protected $deleteTime = 'deleted_at';
// 文章文章范围查询
public function scopeArticle($query, $article_id)
{
$query->where('article_id', '=', $article_id);
}
// 审核状态范围查询
public function scopeAudited($query, bool $is_audited = true)
{
$query->where('is_audited', '=', (int)$is_audited);
}
} }

View File

@@ -32,11 +32,6 @@ class ArticleModel extends ArticleBaseModel
// 文章分类范围查询 // 文章分类范围查询
public function scopeCategory($query, $category) public function scopeCategory($query, $category)
{ {
if (is_null($category)) return;
if (is_array($category)) {
$query->where('category_id', 'in', $category);
return;
}
$query->where('category_id', '=', $category); $query->where('category_id', '=', $category);
} }

View File

@@ -79,6 +79,6 @@ class ProductModel extends ProductBaseModel
// 关键词搜索 // 关键词搜索
public function searchKeywordsAttr($query, string $keywords) public function searchKeywordsAttr($query, string $keywords)
{ {
$query->whereRaw('spu LIKE "%' . $keywords . '%" OR name LIKE "%' . $keywords . '%" OR short_name LIKE "%' . $keywords . '%"'); $query->whereRaw('BINARY spu LIKE "%' . $keywords . '%" OR BINARY name LIKE "%' . $keywords . '%" OR BINARY short_name LIKE "%' . $keywords . '%"');
} }
} }

View File

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

View File

@@ -15,12 +15,12 @@ class ContactUsBulkBuyValidate extends Validate
*/ */
protected $rule = [ protected $rule = [
'corp_name' => 'require|max:128', 'corp_name' => 'require|max:128',
'url' => 'url|max:255', 'url' => 'max:255',
'first_name' => 'require|max:64', 'first_name' => 'require|max:64',
'last_name' => 'require|max:64', 'last_name' => 'require|max:64',
'email' => 'require|email|max:128', 'email' => 'require|email|max:128',
'phone' => 'max:32', 'phone' => 'max:32',
'interested' => 'require|max:255', 'interested' => 'max:255',
'message' => 'require|max:1024', 'message' => 'require|max:1024',
]; ];
@@ -33,7 +33,6 @@ class ContactUsBulkBuyValidate extends Validate
protected $message = [ protected $message = [
'corp_name.require' => '公司名称不能为空', 'corp_name.require' => '公司名称不能为空',
'corp_name.max' => '公司名称不能超过:rule个字符', 'corp_name.max' => '公司名称不能超过:rule个字符',
'url.url' => '网址格式不正确',
'url.max' => '网址不能超过:rule个字符', 'url.max' => '网址不能超过:rule个字符',
'first_name.require' => '名不能为空', 'first_name.require' => '名不能为空',
'first_name.max' => '名不能超过:rule个字符', 'first_name.max' => '名不能超过:rule个字符',
@@ -43,7 +42,6 @@ class ContactUsBulkBuyValidate extends Validate
'email.email' => '邮箱格式不正确', 'email.email' => '邮箱格式不正确',
'email.max' => '邮箱不能超过:rule个字符', 'email.max' => '邮箱不能超过:rule个字符',
'phone.max' => '电话号码不能超过:rule个字符', 'phone.max' => '电话号码不能超过:rule个字符',
'interested.require' => '感兴趣的产品种类不能为空',
'interested.max' => '感兴趣的产品种类不能超过:rule个字符', 'interested.max' => '感兴趣的产品种类不能超过:rule个字符',
'message.require' => '留言内容不能为空', 'message.require' => '留言内容不能为空',
'message.max' => '留言内容不能超过:rule个字符', 'message.max' => '留言内容不能超过:rule个字符',

View File

@@ -17,7 +17,6 @@ class ContactUsDistributorValidate extends Validate
'corp_name' => 'require|max:64', 'corp_name' => 'require|max:64',
'email' => 'require|email|max:128', 'email' => 'require|email|max:128',
'phone' => 'require|max:64', 'phone' => 'require|max:64',
'website_url' => 'url|max:255',
'business_type' => 'require|max:128', 'business_type' => 'require|max:128',
'enterprise_size' => 'require|max:128', 'enterprise_size' => 'require|max:128',
'address' => 'require|max:255', 'address' => 'require|max:255',
@@ -38,8 +37,6 @@ class ContactUsDistributorValidate extends Validate
'email.max' => '邮箱不能超过:rule个字符', 'email.max' => '邮箱不能超过:rule个字符',
'phone.require' => '电话号码不能为空', 'phone.require' => '电话号码不能为空',
'phone.max' => '电话号码不能超过:rule个字符', 'phone.max' => '电话号码不能超过:rule个字符',
'website_url.url' => '网址格式不正确',
'website_url.max' => '网址不能超过:rule个字符',
'business_type.require' => '业务类型不能为空', 'business_type.require' => '业务类型不能为空',
'business_type.max' => '业务类型不能超过:rule个字符', 'business_type.max' => '业务类型不能超过:rule个字符',
'enterprise_size.require' => '企业规模不能为空', 'enterprise_size.require' => '企业规模不能为空',

View File

@@ -1,38 +0,0 @@
{extend name="public/base" /}
{block name="title"}
{notempty name=":lang_i18n('文化介绍')"}<title>{:lang_i18n('文化介绍')}</title>{else/}{__BLOCK__}{/notempty}
{/block}
{block name="style"}
<link rel="stylesheet" type="text/css" href="__CSS__/aboutus_culture.css" />
{/block}
{block name="main"}
<div class="oricoEGapp">
<!-- 内容 -->
<div class="oricoEGapp-product">
{notempty name="focus_image"}
<div class="img-responsive">
<a {notempty name="focus_image.link"}href="{$focus_image.link}"{/notempty}>
<img src="{$focus_image.image}">
</a>
</div>
{/notempty}
<!-- 产品介绍 -->
{notempty name="culture"}
{volist name="culture" id="cul" offset="0" length="3"}
<div class="m_vision">
<div class="img-responsive "><img src="{$cul.image}"></div>
<div class="vision-title text_left margin-top-50">{$cul.title}</div>
<div class="vision-con text_gray text_left line-height-40 margin-top-40">{$cul.desc|raw}</div>
</div>
{/volist}
<div class="m_vision">
{volist name="culture" id="cul" offset="3"}
<div class="img-responsive"><img src="{$cul.image}"></div>
<div class="vision-title text_left margin-top-50">{$cul.title}</div>
<div class="vision-con text_gray text_left line-height-40 margin-top-40">{$cul.desc|raw}</div>
{/volist}
</div>
{/notempty}
</div>
</div>
{/block}

View File

@@ -1,58 +1,7 @@
{extend name="public/base" /} {extend name="public/base" /}
{block name="title"}
{notempty name=":lang_i18n('品牌介绍')"}<title>{:lang_i18n('品牌介绍')}</title>{else/}{__BLOCK__}{/notempty}
{/block}
{block name="style"} {block name="style"}
<link rel="stylesheet" type="text/css" href="__CSS__/aboutus_introduction.css" /> <link rel="stylesheet" type="text/css" href="css/introduction.css" />
{/block} {/block}
{block name="main"} {block name="main"}
<div class="oricoEGapp">
<div class="iotbpage">
{notempty name="focus_image"}
<img src="{$focus_image.image}" alt="" class="bdimg1">
{/notempty}
{notempty name="why"}
<div class="iotb_bgw">
<h1 class="iotbt1">{:lang_i18n('选择我们的理由')}</h1>
<div class="iotb_part1">
{volist name="why" id="wh"}
<div class="iotb_p1_item" style="margin-bottom: 30px;">
<img src="{$wh.image}" alt="" class="iotbic1">
<p class="iotbtp1">{$wh.title}</p>
<span class="iotbts1">{$wh.desc|raw}</span>
</div>
{/volist}
</div>
</div>
{/notempty}
{notempty name="service"}
<div class="iotb_part2 iotb_part22">
<h1 class="iotbt1">{:lang_i18n('为您提供专属定制服务')}</h1>
<div class="fdimgs wcu_list">
{assign name="flat_service" value=":array_flatten($service)" /}
{volist name="flat_service" id="fs"}
<div class="wcu_ltem">
<img src="{$fs.image}" alt="" class="fbit">
<span class="wcu_s1">{$fs.title}</span>
</div>
{/volist}
</div>
</div>
{/notempty}
{notempty name="difference"}
<div class="iotb_part2">
<h1 class="iotbt1">{:lang_i18n('对于不同的情况')}</h1>
<div class="fdimgs wcu_list">
{assign name="flat_difference" value=":array_flatten($difference)" /}
{volist name="flat_difference" id="di"}
<div class="wcu_ltem">
<img src="{$di.image}" alt="" class="fbit">
<span class="wcu_s1">{$di.title}</span>
</div>
{/volist}
</div>
</div>
{/notempty}
</div>
</div>
{/block} {/block}

View File

@@ -1,106 +0,0 @@
{extend name="public/base"/}
{block name="style"}
<link rel="stylesheet" href="__CSS__/aboutus_mileage.css">
{/block}
{block name="main"}
<div class="oricoEGapp">
<!--公司里程 -->
<div class="oricoCnLc">
<div class="margin-top-60"></div>
<div class="m_ach">
<div class="img-responsive ">
<img src="__IMAGES__/achievement.jpg">
</div>
<div class="title">{:lang_i18n('ORICO荣耀')}</div>
<div class="list-num clearfix">
{notempty name="achievement"}
<ul>
{volist name="achievement" id="ac"}
<li>
<h4 {:style(['color' => $ac['desc_txt_color']])}>{$ac.desc|raw}</h4>
<p {:style(['color' => $ac['title_txt_color']])}>{$ac.title}</p>
</li>
{/volist}
</ul>
{/notempty}
</div>
</div>
{notempty name="events"}
<div class="m_ach-b">
<div class="title">{:lang_i18n('品牌里程')}</div>
</div>
<div class="contain">
<!-- 导航 -->
<div class="nav">
<div class="swiper-container gallery-thumbs">
<div class="swiper-wrapper">
{volist name="events" id="ev"}
<div class="swiper-slide" {:style(['color' => $ev['title_txt_color']])}>{$ev.title}</div>
{/volist}
</div>
<span class="swiper-notification" aria-live="assertive" aria-atomic="true"></span>
</div>
<!-- 切换按钮 -->
<div class="swiper-button-next swiper-button-white" tabindex="0" role="button" aria-label="Next slide" aria-disabled="false">
<img src="__IMAGES__/ach-right.webp">
</div>
<div class="swiper-button-prev swiper-button-white swiper-button-disabled" tabindex="0" role="button" aria-label="Previous slide" aria-disabled="true">
<img src="__IMAGES__/ach-left.webp">
</div>
</div>
<!-- 内容 -->
<div class="swiper-container gallery-top">
<div class="swiper-wrapper">
{volist name="events" id="ev" key="k"}
<div class="swiper-slide info">
<h5 {:style(['color' => $ev['title_txt_color']])}>{$ev.title}</h5>
<p {:style(['color' => $ev['desc_txt_color']])}>{$ev.desc|raw}</p>
</div>
{/volist}
</div>
<span class="swiper-notification" aria-live="assertive" aria-atomic="true"></span>
</div>
</div>
{/notempty}
{notempty name="development"}
<div class="m_ch">
<div class="m_ach-b">
<div class="chtitle">{:lang_i18n('品牌活动')}</div>
</div>
{volist name="development" id="de"}
<div class="ach-bg">
<div class="img-responsive ">
<img src="{$de.image}">
</div>
<div class="m_ch-title text_left margin-top-50">
<img src="__IMAGES__/ach-icon.png">{$de.title}
</div>
<div class="m_ch-con text_gray text_left line-height-40 margin-top-40">{$de.desc|raw}</div>
</div>
{/volist}
</div>
{/notempty}
</div>
</div>
{/block}
{block name="script"}
<script type="text/javascript">
var galleryThumbs = new Swiper('.gallery-thumbs', {
spaceBetween: 10,
slidesPerView: 5,
freeMode: true,
watchSlidesVisibility: true,
watchSlidesProgress: true
})
var galleryTop = new Swiper('.gallery-top', {
spaceBetween: 10,
thumbs: {
swiper: galleryThumbs
},
navigation: {
nextEl: '.swiper-button-next',
prevEl: '.swiper-button-prev'
}
})
</script>
{/block}

View File

@@ -1,84 +0,0 @@
{extend name="public/base"/}
{block name="title"}
<title>{:lang_i18n('售后政策_注意事项')}</title>
{/block}
{block name="style"}
<link rel="stylesheet" href="__CSS__/aboutus_policy.css">
{/block}
{block name="main"}
<div class="oricoEGapp">
<!-- 内容 -->
<div class="oricoEGapp-policy">
{notempty name="policy.focus_image"}
<a {notempty name="policy.focus_image.link"}href="{$policy.focus_image.link}"{/notempty}>
<img src="{$policy.focus_image.image}" class="pl-img" />
</a>
{/notempty}
<div class="m_Container">
<strong class="textpoint">{:lang_i18n('售后政策')}</strong>
<p class="decs">{:lang_i18n('ORICO/奥睿科商城为您提供七天包退、15天换新、1年保修、终身维护的服务承诺')}</p>
</div>
{notempty name="policy.banner_1"}
{volist name="policy.banner_1" id="b1"}
<div class="m_Container">
<strong class="textpoint">{$b1.title}</strong>
<div class="decs">{$b1.desc|raw}</div>
</div>
{/volist}
{/notempty}
{notempty name="policy.banner_2"}
{volist name="policy.banner_2" id="b2"}
<img src="{$b2.image}" class="pl-img m-t" />
<div class="m_Container">
<strong class="textpoint">{$b2.title}</strong>
<div class="decs decs-left">{$b2.desc|raw}</div>
</div>
{/volist}
{/notempty}
{notempty name="policy.banner_3"}
<div class="m_Container">
<strong class="textpoint">{:lang_i18n('为了保障您的合法权益,敬请关注以下信息')}</strong>
<p class="decs">{:lang_i18n('为了得到深圳市元创时代科技有限公司给予您的“包修、包换、包退”的权益,请您:')}</p>
<div class="decs decs-left">
{volist name="policy.banner_3" id="b3"}
{$b3.title}<br/>
{/volist}
</div>
</div>
{/notempty}
{notempty name="policy.banner_4"}
{volist name="policy.banner_4" id="b4"}
<img src="{$b4.image}" class="pl-img m-t" />
<div class="m_Container">
<strong class="textpoint">{$b4.title}</strong>
<div class="decs decs-left">{$b4.desc|raw}</div>
</div>
{/volist}
{/notempty}
{notempty name="policy.banner_5"}
<div class="m_Container">
<strong class="textpoint">{:lang_i18n('特别说明')}</strong>
<p class="decs decs-left">
{volist name="policy.banner_5" id="b5" key="k"}
{$k+1}、{$b5.title}<br/>
{/volist}
</p>
</div>
{/notempty}
{notempty name="policy.banner_6"}
{volist name="policy.banner_6" id="b6"}
<img src="{$b6.image}" class="pl-img m-t" />
<div class="m_Container">
<strong class="textpoint">{$b6.title}</strong>
<div class="decs decs-left">{$b6.desc|raw}</div>
</div>
{/volist}
{/notempty}
</div>
</div>
{/block}

View File

@@ -1,32 +0,0 @@
{extend name="public/base" /}
{block name="style"}
<link rel="stylesheet" href="__CSS__/aboutus_story.css" />
{/block}
{block name="main"}
<div class="oricoEGapp">
<!-- 内容-->
<div class="oricoEGapp-brand">
<div class="video-right img-responsive">
<img src="__IMAGES__/brand-banner.webp">
</div>
{notempty name="banners"}
<div class="m_brand">
{volist name="banners" id="ba" offset="0" length="2"}
<div class="brand_title text_left">{$ba.title}</div>
<div class="brand-con text_gray text_left line-height-40 margin-top-40">{$ba.desc|raw}</div>
<div class="img-responsive">
<img src="{$ba.image}">
</div>
{/volist}
{volist name="banners" id="ba" offset="2" length="3"}
<div class="img-responsive text-center margin-4">
<img src="{$ba.image}">
</div>
<div class="vision-title text_center margin-top-50">{$ba.title}</div>
<div class="brand-con text_gray text_center line-height-40 margin-top-40">{$ba.desc|raw}</div>
{/volist}
</div>
{/notempty}
</div>
</div>
{/block}

View File

@@ -1,159 +0,0 @@
{extend name="public/base" /}
{block name="title"}
{notempty name="detail.seo_title"}<title>{$detail.seo_title}</title>{else /}{__BLOCK__}{/notempty}
{/block}
{block name="seo"}
{notempty name="detail.seo_keywords"}
<meta name="keywords" content="{$detail.seo_keywords}" />
<meta name="description" content="{$detail.seo_desc}" />
{else /}
{__BLOCK__}
{/notempty}
{/block}
{block name="style"}
<link rel="stylesheet" href="__CSS__/article_detail.css">
{/block}
{block name="main"}
<div class="oricoEGapp">
<!-- 内容 -->
<div class="oricoEGapp-articledetail">
<div class="content">
<div class="blog_detail">
<div class="blog_title">
<h2>{$detail.title}</h2>
<p>{$detail.release_time|date_format_i18n}</p>
</div>
<div class="blog_content">{$detail.content|raw}</div>
</div>
{notempty name="comments"}
<div class="pl_box">
<div class="blog_pl">
<h3>{:lang_i18n('评论')}</h3>
{volist name="comments" id="cm"}
<div class="plitem">
<div class="pl_name">{$cm.name}:</div>
<div class="pl_text">{$cm.content}</div>
</div>
{/volist}
</div>
</div>
{/notempty}
<div class="share_box">
{notempty name="share_config"}
<div class="blog_share">
<h3>{:lang_i18n('分享')}</h3>
<ul class="share_list">
{volist name="share_config" id="sc"}
<li>
<a
{if condition="!empty($sc.is_blank) && $sc.is_blank.value == 1"}target="_blank"{/if}
{notempty name="sc.url.value"}href="{$sc.url.value}"{/notempty}>
{eq name=":array_key_exists('triggered_qrcode', $sc)" value="true"}
<img class="toggle_qrcode" src="{$sc.image.value}" />
<div class="triggered_qrcode wechat_code">
<img src="{$sc.triggered_qrcode.value}" />
</div>
{else /}
<img src="{$sc.image.value}" />
{/eq}
</a>
</li>
{/volist}
</ul>
</div>
{/notempty}
<div class="comment">
<h3>{:lang_i18n('留言')}</h3>
<form action="{:url('article/comment', ['id' => $detail.id])}" method="POST" class="comment_form clearfix" autocomplete="off">
<div style="margin-right: 0.625rem; margin-bottom: 0.5rem;">{:lang_i18n('名称')}:<br>
<input class="form-control itinp new_name" type="text" name="name">
</div>
<div>{:lang_i18n('电子邮箱')}:<br>
<input class="form-control itinp new_email" type="email" name="email">
<p style="color: #C6C7C9; font-size: 0.75rem; margin-bottom: 0.5rem; ">
{:lang_i18n('您的电子邮件地址不会被公开')}
</p>
</div>
<div class="comment_area">{:lang_i18n('留言内容')}:<br>
<textarea class="form-control itinp new_comment" style="height: 3rem;border: 1px solid #DBDBDB;" name="content"></textarea>
</div>
</form>
<div class="comment_btn" style="color:#ffffff;">{:lang_i18n('提交留言')}</div>
</div>
{notempty name="$recommends"}
<div class="mblove">
<div class="mianct">
<p class="thtitle">{:lang_i18n('你可能还喜欢')}</p>
<p><img src="__IMAGES__/1line.webp"></p>
</div>
<div class="swiper loveswiper">
<div class="swiper-wrapper">
{volist name="recommends" id="vo"}
<div class="swiper-slide">
<a href="{:url('article/detail', ['id' => $vo.id])}">
<img src="{$vo.image}" alt="{$vo.title}">
<p class="lvtit">{$vo.title}</p>
</a>
</div>
{/volist}
</div>
<!-- 如果需要分页器 -->
<div class="swiper-pagination"></div>
</div>
</div>
{/notempty}
</div>
</div>
</div>
</div>
{/block}
{block name="script"}
<script type="text/javascript">
$(function() {
$('.comment_btn').click(function() {
var form = $('.comment_form');
var form_data = form.serialize();
$.ajax({
url: form.attr('action'),
type: 'POST',
data: form_data,
dataType: 'json',
success: function(data) {
alert(data.msg);
if (data.code == 0) {
window.location.reload();
}
}
})
})
$('.toggle_qrcode').click(function() {
const qrcode = $(this).siblings('.triggered_qrcode');
qrcode.css('display', qrcode.css('display') === 'none' ? 'flex' : 'none');
});
})
//banner轮播
var loveswiper = new Swiper('.loveswiper', {
// 配置选项
slidesPerView: 2,
spaceBetween: 30,
pagination: {
el: '.swiper-pagination',
}
});
function shareCustomers(){
// 复制到粘贴板
const input = document.createElement('input')
input.setAttribute('readonly', 'readonly')
let url=window.location.href
input.setAttribute('value', url)
document.body.appendChild(input)
input.select()
if (document.execCommand('copy')) {
document.execCommand('copy')
alert("{:lang_i18n('链接复制成功')}")
}
document.body.removeChild(input)
}
</script>
{/block}

View File

@@ -1,62 +0,0 @@
{extend name="public/base" /}
{block name="style"}
<link rel="stylesheet" type="text/css" href="__CSS__/article_index.css" />
{/block}
{block name="main"}
<div class="oricoEGapp">
<!-- 内容 -->
<div class="oricoEGapp-article">
<!-- banner -->
{notempty name="banner.image"}
<div class="banner img-responsive">
<img src="{$banner.image}">
</div>
{/notempty}
<!-- 新闻列表 -->
<div class="swt-Container">
<div class="news-vertu">
<div class="tab">
{volist name="categorys" id="ca"}
{if condition="$Request.get.cid == $ca.id || (!$Request.has.cid && $key == 0)"}
<a class="on" href="{:url('article/index', ['pid' => $ca.pid, 'cid' => $ca.id])}">
{else/}
<a class="" href="{:url('article/index', ['pid' => $ca.pid, 'cid' => $ca.id])}">
{/if}
{$ca.name}
</a>
{/volist}
</div>
<div class="m_Container">
<!-- Blog列表 s -->
<div class="search_box">
<form action="{:url('article/index', ['pid' => $Request.param.pid])}" method="get" autocomplete="off">
<input type="text" class="search" id="article-blog-in" name="keywords" value="">
<input type="hidden" class="search" id="article-blog-in" name="cid" value="{$Request.get.cid}">
<button id="blog-btnput" class="search-button-blog">{:lang_i18n('搜索')}</button>
</form>
</div>
{notempty name="articles"}
<div class="blog_list">
<ul class="clearfix">
{volist name="articles" id="ar"}
<li>
<a href="{:url('article/detail', ['id' => $ar.id])}">
<img src="{$ar.image}">
<h3>{$ar.title}</h3>
<p>{$ar.desc|raw}</p>
</a>
<span class="blue">{$ar.release_time|date_format_i18n}</span>
</li>
{/volist}
</ul>
</div>
<!-- 分页 s -->
<div>{$articles|raw}</div>
<!-- 分页 e -->
{/notempty}
</div>
</div>
</div>
</div>
</div>
{/block}

View File

@@ -14,13 +14,13 @@
<div class="tabs"> <div class="tabs">
{notempty name="video_categorys"} {notempty name="video_categorys"}
{volist name="video_categorys" id="va"} {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} {/volist}
{/notempty} {/notempty}
</div> </div>
<div class="infolist"> <div class="infolist">
{notempty name="videos"} {notempty name="videos"}
{assign name="flat_videos" value=":array_flatten($videos->items())" /} {assign name="flat_videos" value=":\think\helper\Arr::flatMap(fn($item) => $item->toArray(), $videos->items())" /}
{volist name="flat_videos" id="vo"} {volist name="flat_videos" id="vo"}
<div class="vd-item"> <div class="vd-item">
<video controls="" poster="{$vo.image|default=''}"> <video controls="" poster="{$vo.image|default=''}">

View File

@@ -44,12 +44,12 @@
</div> </div>
<div class="theit"> <div class="theit">
<div class="bditem bditem1"> <div class="bditem bditem1">
<label class="itlable">{:lang_i18n('您对哪个产品品类感兴趣?')}<span class="redtag">*</span></label> <label class="itlable">{:lang_i18n('您对哪个产品品类感兴趣?')}</label>
<div class="sfbchecks"> <div class="sfbchecks">
{notempty name="interested"} {notempty name="interested"}
{volist name="interested" id="it"} {volist name="interested" id="it"}
<label class="cit"> <label class="cit">
<input name="interested[]" type="checkbox" value="{$it}" class="sfbcheckboxit" />{$it} <input name="interested" type="checkbox" value="{$it}" class="sfbcheckboxit" />{$it}
</label> </label>
{/volist} {/volist}
{/notempty} {/notempty}

View File

@@ -6,7 +6,7 @@
<div class="oricoEGapp"> <div class="oricoEGapp">
<!-- 内容--> <!-- 内容-->
<div class="cooperapp_bdpage" style="background:#F2F2F2;"> <div class="cooperapp_bdpage" style="background:#F2F2F2;">
<div class="cooperapp_bd_main" style="margin-top: 3.75rem;"> <div class="cooperapp_bd_main" style="margin-top: 60px;">
<form action="" method="post"> <form action="" method="post">
<h1 class="cooperapp_t1">{:lang_i18n('成为经销商')}</h1> <h1 class="cooperapp_t1">{:lang_i18n('成为经销商')}</h1>
<p class="cooperapp_s1">{:lang_i18n('准备好加入我们了吗?<br> 在下面输入您的详细信息我们的销售团队将在2个工作日内回复您。')}</p> <p class="cooperapp_s1">{:lang_i18n('准备好加入我们了吗?<br> 在下面输入您的详细信息我们的销售团队将在2个工作日内回复您。')}</p>
@@ -19,19 +19,19 @@
<div class="theit"> <div class="theit">
<div class="bditem"> <div class="bditem">
<label class="itlable">{:lang_i18n('公司名称')}<span class="redtag">*</span></label> <label class="itlable">{:lang_i18n('公司名称')}<span class="redtag">*</span></label>
<input type="text" name="corp_name" class="form-control itinp companyName" placeholder="{:lang_i18n('请输入公司名称')}" /> <input type="text" class="form-control itinp companyName" placeholder="{:lang_i18n('请输入公司名称')}" />
</div> </div>
</div> </div>
<div class="theit"> <div class="theit">
<div class="bditem"> <div class="bditem">
<label class="itlable">{:lang_i18n('电子邮件')}<span class="redtag">*</span></label> <label class="itlable">{:lang_i18n('电子邮件')}<span class="redtag">*</span></label>
<input type="text" name="email" class="form-control itinp email" placeholder="{:lang_i18n('请输入邮箱')}" /> <input type="text" class="form-control itinp email" placeholder="{:lang_i18n('请输入邮箱')}" />
</div> </div>
</div> </div>
<div class="theit"> <div class="theit">
<div class="bditem bditem1"> <div class="bditem bditem1">
<label class="itlable">{:lang_i18n('电话号码')}<span class="redtag">*</span></label> <label class="itlable">{:lang_i18n('电话号码')}<span class="redtag">*</span></label>
<input type="text" name="phone" class="form-control itinp mphone" placeholder="{:lang_i18n('请输入电话号码')}" /> <input type="text" class="form-control itinp mphone" placeholder="{:lang_i18n('请输入电话号码')}" />
</div> </div>
</div> </div>
<div class="theit"> <div class="theit">
@@ -47,7 +47,7 @@
<div class="theit"> <div class="theit">
<div class="bditem"> <div class="bditem">
<label class="itlable">{:lang_i18n('在线商店网址')}</label> <label class="itlable">{:lang_i18n('在线商店网址')}</label>
<input type="text" name="website_url" class="form-control itinp url" placeholder="{:lang_i18n('请输入网址')}" /> <input type="text" class="form-control itinp url" placeholder="{:lang_i18n('请输入网址')}" />
</div> </div>
</div> </div>
<div class="theit"> <div class="theit">
@@ -63,13 +63,13 @@
<div class="theit"> <div class="theit">
<div class="bditem bditem1"> <div class="bditem bditem1">
<label class="itlable">{:lang_i18n('公司地址')}<span class="redtag">*</span></label> <label class="itlable">{:lang_i18n('公司地址')}<span class="redtag">*</span></label>
<input type="text" name="address" class="form-control itinp address" placeholder="{:lang_i18n('请输入地址')}"> <input type="text" class="form-control itinp address" placeholder="{:lang_i18n('请输入地址')}">
</div> </div>
</div> </div>
<div class="theit"> <div class="theit">
<div class="bditem bditem1"> <div class="bditem bditem1">
<label class="itlable">{:lang_i18n('留言')}<span class="redtag">*</span></label> <label class="itlable">{:lang_i18n('留言')}<span class="redtag">*</span></label>
<textarea name="message" class="ittextarea message" placeholder="{:lang_i18n('请输入留言')}"></textarea> <textarea class="ittextarea message" placeholder="{:lang_i18n('请输入留言')}"></textarea>
</div> </div>
</div> </div>
</div> </div>

View File

@@ -23,14 +23,14 @@
{volist name="ch" id="item"} {volist name="ch" id="item"}
<div class="narskfit" {notempty name="item.link"}onclick="location.href='{$item.link}'"{/notempty}> <div class="narskfit" {notempty name="item.link"}onclick="location.href='{$item.link}'"{/notempty}>
<img src="{$item.image}" class="narskico-img" /> <img src="{$item.image}" class="narskico-img" />
<span class="narskf-title" {:style(['color' => $item['title_txt_color']])}>{$item.title}</span> <span class="narskf-title">{$item.title}</span>
{notempty name="item.desc"} {notempty name="item.title_short"}
<span class="narskf-sm" {:style(['color' => $item['desc_txt_color']])}>{$item.desc|raw}</span> <span class="narskf-sm">{$item.title_short}</span>
{/notempty} {/notempty}
{notempty name="item.extra_image"} {notempty name="item.desc"}
<div class="narskfactive-ewm" style="display: none;"> {if condition="str_contains($item.desc, '<img')"}
<img src="{$item.extra_image}" alt="" /> <div class="narskfactive-ewm" style="display: none;">{$item.desc|raw}</div>
</div> {/if}
{/notempty} {/notempty}
</div> </div>
{/volist} {/volist}
@@ -41,8 +41,8 @@
<div class="narskfit narskfit2"> <div class="narskfit narskfit2">
<img src="{$item.image}" class="narskico-img"> <img src="{$item.image}" class="narskico-img">
<div class="narskfit2-ct"> <div class="narskfit2-ct">
<span class="narskf-title" {:style(['color' => $item['title_txt_color']])}>{$item.title}</span> <span class="narskf-title">{$item.title}</span>
<span class="narskf-sm" {:style(['color' => $item['desc_txt_color']])}>{$item.desc|raw}</span> <span class="narskf-sm">{$item.desc|raw}</span>
</div> </div>
</div> </div>
</div> </div>

View File

@@ -63,7 +63,7 @@
<div class="question"> <div class="question">
<div class="title">{:lang_i18n('您的问题')} <span class="red">*</span></div> <div class="title">{:lang_i18n('您的问题')} <span class="red">*</span></div>
<div class="des"> <div class="des">
<textarea rows="6" name="content" id="message" class="ittextarea message" placeholder="{:lang_i18n('请输入内容...')}"></textarea> <textarea rows="6" name="message" id="message" class="ittextarea message" placeholder="{:lang_i18n('请输入内容...')}"></textarea>
</div> </div>
</div> </div>
<div class="question"> <div class="question">

View File

@@ -1,34 +0,0 @@
{extend name="public/base" /}
{block name="title"}
<title>{:lang_i18n('常见FQ_下载与服务_中文官网帮助信息_ORICO/奥睿科官网')}</title>
{/block}
{block name="style"}
<link rel="stylesheet" href="__CSS__/faq.css">
{/block}
{block name="main"}
<div class="oricoEGapp">
<!-- 内容-->
<div class="oricoEGapp-fq">
<!--banner-->
{notempty name="banner.image"}
<div class="banner">
<img src="{$banner.image}">
</div>
{/notempty}
<!--常见问题解答-->
{notempty name="faq"}
<div class="m_Container">
<div class="title text_center margin-top-50 text_black"><strong>{:lang_i18n('常见问题解答')}</strong>
</div>
{volist name="faq" id="vo"}
<div class="img-responsives margin-top-40"><img src="{$vo.image}"></div>
<div class="subtitle text_black text_center margin-top-30">{$vo.question}</div>
<div class="des text_gray line-height-40 margin-top-40">{$vo.answer|raw}</div>
{/volist}
</div>
<!-- 分页-->
<div >{$faq|raw}</div>
{/notempty}
</div>
</div>
{/block}

View File

@@ -101,8 +101,8 @@
<a href="{$sc.link}"><img src="{$sc.image}" /></a> <a href="{$sc.link}"><img src="{$sc.image}" /></a>
<div class="position_a text_center wow animated bounceInLeft"> <div class="position_a text_center wow animated bounceInLeft">
<p class="f_weight_500 timetitle" {:style(['color'=>$sc['title_txt_color']])}>{$sc.title}</p> <p class="f_weight_500 timetitle" {:style(['color'=>$sc['title_txt_color']])}>{$sc.title}</p>
<p class=" margin-top-14 f_weight_400 timedesin" {:style(['color'=>$sc['desc_txt_color']])}>{$sc.desc|raw}</p> <p class=" margin-top-14 f_weight_100 timedesin" {:style(['color'=>$sc['desc_txt_color']])}>{$sc.desc}</p>
<p class=" margin-top-20 f_weight_400"> <p class=" margin-top-20 f_weight_100">
<a href="{$sc.link}" class="timeblue"> {:lang_i18n('了解更多')} <img src="__IMAGES__/more-r.png"></a> <a href="{$sc.link}" class="timeblue"> {:lang_i18n('了解更多')} <img src="__IMAGES__/more-r.png"></a>
</p> </p>
</div> </div>
@@ -141,8 +141,8 @@
<img src="{$bs.image}"> <img src="{$bs.image}">
<div class="position_a text_center"> <div class="position_a text_center">
<p class=" timetitle" {:style(['color'=>$bs['title_txt_color']])}>{$bs.title} </p> <p class=" timetitle" {:style(['color'=>$bs['title_txt_color']])}>{$bs.title} </p>
<p class=" margin-top-14 f_weight_400 timedesin" {:style(['color'=>$bs['desc_txt_color']])}>{$bs.desc|raw}</p> <p class=" margin-top-14 f_weight_100 timedesin" {:style(['color'=>$bs['desc_txt_color']])}>{$bs.desc}</p>
<p class=" margin-top-20 f_weight_400"> <p class=" margin-top-20 f_weight_100">
<span class=" timeblue"> <span class=" timeblue">
<a href="{$bs.link}">{:lang_i18n('了解更多')}<img src="__IMAGES__/more-r.png"></a> <a href="{$bs.link}">{:lang_i18n('了解更多')}<img src="__IMAGES__/more-r.png"></a>
</span> </span>
@@ -310,16 +310,6 @@
icon.removeClass('icon-jian-svg').addClass('icon-add-svg'); icon.removeClass('icon-jian-svg').addClass('icon-add-svg');
} }
}); });
// 判断年份
// 计算.timeline下的li元素数量
var liCount = $('.timeline ol li').length;
// 如果有li元素则设置a标签的宽度
if (liCount > 0) {
var widthPerItem = (100 / liCount-0.3) + '%';
$('.timeline ol li a').css('width', widthPerItem);
}
}); });
</script> </script>
{/block} {/block}

View File

@@ -9,7 +9,7 @@
<div> <div>
{volist name="focus_image" id="fi"} {volist name="focus_image" id="fi"}
<a {notempty name="fi.link" }href="{$fi.link}"{/notempty}> <a {notempty name="fi.link" }href="{$fi.link}"{/notempty}>
<img src="{$fi.image}" style="width: 100%;margin-top: 3.5rem;"/> <img src="{$fi.image}" />
</a> </a>
{/volist} {/volist}
</div> </div>
@@ -46,7 +46,7 @@
{volist name="vo.products" id="pro" length="4"} {volist name="vo.products" id="pro" length="4"}
<li class="img-responsive"> <li class="img-responsive">
<a href="{:url('product/detail', ['id' => $pro.id])}"> <a href="{:url('product/detail', ['id' => $pro.id])}">
<img src="{:thumb($pro.cover_image)}"> <img src="{$pro.cover_image}">
<span class="title">{$pro.name}</span> <span class="title">{$pro.name}</span>
<span class="subtitle">{$pro.spu}</span> <span class="subtitle">{$pro.spu}</span>
</a> </a>

View File

@@ -22,11 +22,7 @@
<a class="href_01">{:lang_i18n('首页')}</a> <a class="href_01">{:lang_i18n('首页')}</a>
{volist name="product_categorys" id="ca"} {volist name="product_categorys" id="ca"}
<span class="icon-arrow arrow_address"></span> <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> <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} {/volist}
</div> </div>
</div> </div>
@@ -41,13 +37,6 @@
<img src="{$photo}" alt="" /> <img src="{$photo}" alt="" />
</div> </div>
{/volist} {/volist}
{if condition="!empty($product.video_img) && !empty($product.video_url) && $idx == 1"}
<div class="swiper-slide">
<video poster="{$product.video_img}" autoplay="autoplay" muted="muted" loop="loop" id="video" controls>
<source src="{$product.video_url}" type="video/mp4"/>
</video>
</div>
{/if}
</div> </div>
<!-- 如果需要分页器 --> <!-- 如果需要分页器 -->
<div class="swiper-pagination"></div> <div class="swiper-pagination"></div>
@@ -55,9 +44,9 @@
{/volist} {/volist}
</div> </div>
{/notempty} {/notempty}
<!-- 规格参数 --> <!-- 规格参数-->
<div class="m_Container"> <div class="m_Container">
<!-- 颜色/属性 --> <!--颜色-->
{notempty name="product_sku_attrs"} {notempty name="product_sku_attrs"}
<div class="slideTxtBox"> <div class="slideTxtBox">
<div class="hd clearfix"> <div class="hd clearfix">
@@ -68,11 +57,7 @@
<ul class="hd clearfix"> <ul class="hd clearfix">
{volist name="ps.attr_values" id="pv" key="pk"} {volist name="ps.attr_values" id="pv" key="pk"}
{assign name="attr_value_type" value=":rgb_or_image($pv.attr_value)" /} {assign name="attr_value_type" value=":rgb_or_image($pv.attr_value)" /}
{between name="ps.attr_id" value="1,2"}
<li class="attr_value tip1 attr_item" data-index="{$pk}"> <li class="attr_value tip1 attr_item" data-index="{$pk}">
{else/}
<li class="attr_value tip1 attr_item_defalut" data-index="{$pk}">
{/between}
{eq name="attr_value_type" value="IMAGE"} {eq name="attr_value_type" value="IMAGE"}
<span class="co-bg"><img src="{$pv.attr_value}" /></span> <span class="co-bg"><img src="{$pv.attr_value}" /></span>
{elseif condition="$attr_value_type == 'RGB'" /} {elseif condition="$attr_value_type == 'RGB'" /}
@@ -111,9 +96,7 @@
</div> </div>
{/notempty} {/notempty}
<div class="platform_buy"> <div class="platform_buy">
{eq name=":cookie('think_lang')" value="en-us"}
<a class="btn-blue-detail business-button">{:lang_i18n('发送查询')}</a> <a class="btn-blue-detail business-button">{:lang_i18n('发送查询')}</a>
{/eq}
</div> </div>
</div> </div>
<!-- 产品描述 --> <!-- 产品描述 -->
@@ -121,7 +104,7 @@
<ul class="cpa des cursor_p"> <ul class="cpa des cursor_p">
<li class="active" id="one">{:lang_i18n('产品描述')}</li> <li class="active" id="one">{:lang_i18n('产品描述')}</li>
{notempty name="product_related"} {notempty name="product_related"}
<li onclick="javascript:location.href='#related'">{:lang_i18n('关联产品')}</li> <li>{:lang_i18n('关联产品')}</li>
{/notempty} {/notempty}
<div class="clear"></div> <div class="clear"></div>
</ul> </ul>
@@ -129,19 +112,13 @@
<!-- 产品图片--> <!-- 产品图片-->
<div class="goods_des img-responsives" id="description-tab">{$product.detail|raw}</div> <div class="goods_des img-responsives" id="description-tab">{$product.detail|raw}</div>
<!-- 关联产品--> <!-- 关联产品-->
{notempty name="product_related"} <div class="glcplist" id="related-tab" style="display: none;">
<div class="glcplist" id="related"> <div class="glcpitem" >
{volist name="product_related" id="rel"} <img src="indeximg/i560-800-1.png" src="glcpimg" />
<div class="glcpitem"> <span class="glt1" >98系列多盘位DAS桌面阵列存储系统</span>
<a href="{:url('product/detail', ['id'=>$rel.id])}"> <span class="glt2">ORICO-9858RU3</span>
<img src="{:thumb($rel.cover_image)}" class="glcpimg" /> </div>
<span class="glt1">{$rel.name}</span> </div>
<span class="glt2">{$rel.spu}</span>
</a>
</div>
{/volist}
</div>
{/notempty}
<!-- 弹窗--> <!-- 弹窗-->
<div class="marsk-container-detail"> <div class="marsk-container-detail">
<div class="popup-quick"> <div class="popup-quick">
@@ -235,7 +212,9 @@
$('.tab-pane').hide(); $('.tab-pane').hide();
if (targetTab === 'description') { if (targetTab === 'description') {
$('#description-tab').show(); $('#description-tab').show();
$('#related-tab').hide();
} else if (targetTab === 'related') { } else if (targetTab === 'related') {
$('#related-tab').show();
$('#description-tab').hide(); $('#description-tab').hide();
} }
}); });
@@ -244,8 +223,8 @@
var index = $(this).data('index'); var index = $(this).data('index');
$('.pdetailswiper').hide(); $('.pdetailswiper').hide();
$('.pdetailswiper[data-index="' + index + '"]').show(); $('.pdetailswiper[data-index="' + index + '"]').show();
$('.attr_value').removeClass('attr_item_on'); $('.attr_value').removeClass('active');
$(this).addClass('attr_item_on'); $(this).addClass('active');
}); });
// 提交产品询价查询 // 提交产品询价查询

View File

@@ -16,8 +16,8 @@
{notempty name="products"} {notempty name="products"}
<div class="prlist"> <div class="prlist">
{volist name="products" id="pro"} {volist name="products" id="pro"}
<a class="pritem" href="{:url('product/detail',['id'=>$pro.id])}"> <a class="pritem">
<img src="{:thumb($pro.cover_image)}" class="primg"/> <img src="{$pro.cover_image}" class="primg"/>
<div class="prinfo"> <div class="prinfo">
<span class="t1">{$pro.name|raw}</span> <span class="t1">{$pro.name|raw}</span>
<span class="t2">{$pro.spu|raw}</span> <span class="t2">{$pro.spu|raw}</span>
@@ -27,8 +27,6 @@
</div> </div>
<!-- 分页 --> <!-- 分页 -->
<div>{$page|raw}</div> <div>{$page|raw}</div>
{else/}
<div style="text-align: center; padding: 10%;">{:lang_i18n('暂无数据')}</div>
{/notempty} {/notempty}
</div> </div>
</div> </div>

View File

@@ -19,7 +19,6 @@
<div class="m_Container"> <div class="m_Container">
{notempty name="categorys_data"} {notempty name="categorys_data"}
<div class="product_list"> <div class="product_list">
{if condition="in_array('products', array_keys($categorys_data[0]))"}
<ul> <ul>
{assign name="products" value=":\think\helper\Arr::flatMap(fn($pro) => $pro['products'], $categorys_data)" /} {assign name="products" value=":\think\helper\Arr::flatMap(fn($pro) => $pro['products'], $categorys_data)" /}
{volist name="products" id="pr"} {volist name="products" id="pr"}
@@ -56,7 +55,6 @@
</li> </li>
{/volist} {/volist}
</ul> </ul>
{/if}
</div> </div>
{/notempty} {/notempty}
</div> </div>

View File

@@ -11,34 +11,15 @@
<link rel="stylesheet" type="text/css" href="__CSS__/public.css" /> <link rel="stylesheet" type="text/css" href="__CSS__/public.css" />
<link rel="stylesheet" type="text/css" href="__CSS__/font.css" /> <link rel="stylesheet" type="text/css" href="__CSS__/font.css" />
<link rel="stylesheet" type="text/css" href="__CSS__/style.css" /> <link rel="stylesheet" type="text/css" href="__CSS__/style.css" />
<!-- <link rel="stylesheet" type="text/css" href="__CSS__/fonts.css" /> -->
<link rel="stylesheet" type="text/css" href="__CSS__/header.css" /> <link rel="stylesheet" type="text/css" href="__CSS__/header.css" />
<link rel="stylesheet" type="text/css" href="__CSS__/footer.css" /> <link rel="stylesheet" type="text/css" href="__CSS__/footer.css" />
{block name="style"}{/block} {block name="style"}{/block}
<link rel="stylesheet" href="__JS__/swiper-bundle9.4.1.min.css" /> <link rel="stylesheet" href="https://unpkg.com/swiper@9/swiper-bundle.min.css">
<script src="__JS__/jquery-3.6.0.min.js"></script> <script type="text/javascript" src='https://code.jquery.com/jquery-3.6.0.min.js'></script>
<script type="text/javascript" src="__JS__/swiper-bundle9.4.1.min.js"></script> <script type="text/javascript" src="https://unpkg.com/swiper@9.4.1/swiper-bundle.min.js"></script>
<!-- Matomo -->
<script>
var _paq = window._paq = window._paq || [];
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u="//analytics.f2b211.com/";
_paq.push(['setTrackerUrl', u+'matomo.php']);
_paq.push(['setSiteId', '2']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
})();
</script>
<!-- End Matomo Code -->
</head> </head>
<body> <body>
<noscript>
<!-- Matomo Image Tracker-->
<img referrerpolicy="no-referrer-when-downgrade" src="https://analytics.f2b211.com/matomo.php?idsite=2&amp;rec=1" style="border:0" alt="" />
<!-- End Matomo -->
</noscript>
{block name="header"} {block name="header"}
{include file="public/header"/} {include file="public/header"/}
{/block} {/block}
@@ -47,31 +28,5 @@
{include file="public/footer"/} {include file="public/footer"/}
{/block} {/block}
{block name="script"}{/block} {block name="script"}{/block}
<script>
$(window).ready(function () {
// 为所有站内链接,添加标识
// 使用mtpl=1参数标识解决ipad访问站点时从pc重定向到mobile每次页面都会pc - mobile闪现问题
var LURL = new URL(window.location.href);
if (LURL.searchParams.get('mtpl') == 1) {
$('a').each(function () {
var href = $(this).attr('href');
if (href) {
var origin = LURL.origin;
if (href.indexOf('http') == -1) {
href = new URL(href, origin);
href.searchParams.set('mtpl', '1');
$(this).attr('href', href);
} else {
href = new URL(href);
if (href.origin == origin) {
href.searchParams.set('mtpl', '1');
$(this).attr('href', href);
}
}
}
})
}
})
</script>
</body> </body>
</html> </html>

View File

@@ -18,9 +18,7 @@
{notempty name="fn.children"} {notempty name="fn.children"}
{volist name="fn.children" id="fnc"} {volist name="fn.children" id="fnc"}
<p> <p>
<a href="{$fnc.link}" {eq name="fnc.link" value="1"}target="_blank"{/eq} class="inline-block link-faded break-all"> <a href="{$fnc.link}" target="_blank" class="inline-block link-faded break-all">{$fnc.name}</a>
{$fnc.name}
</a>
</p> </p>
{/volist} {/volist}
{/notempty} {/notempty}
@@ -29,13 +27,12 @@
{/notempty} {/notempty}
<li> <li>
<h3>{:lang_i18n('联系方式')}</h3> <h3>{:lang_i18n('联系方式')}</h3>
{if condition="!empty($contact_config)"} {notempty name="contact_config.website_email"}
{volist name="contact_config" id="vo"} <p>{$contact_config.website_email.title} {$contact_config.website_email.value}</p>
{if condition="$vo.type != 'image'"} {/notempty}
<p>{$vo.value}</p> {notempty name="contact_config.website_hotline_office_hours"}
{/if} <p>{$contact_config.website_hotline_office_hours.title} {$contact_config.website_hotline_office_hours.value}</p>
{/volist} {/notempty}
{/if}
</li> </li>
</ul> </ul>
</div> </div>
@@ -65,7 +62,7 @@
<div class="copy-text"> <div class="copy-text">
{$basic_config.website_powerby.value} {$basic_config.website_powerby.value}
{notempty name="$basic_config.website_icp"} {notempty name="$basic_config.website_icp"}
<a href="https://beian.miit.gov.cn/" style="color:white;">{$basic_config.website_icp.value|raw}</a> <a href="https://beian.miit.gov.cn/" style="color:white;">{$basic_config.website_icp.value}</a>
{/notempty} {/notempty}
</div> </div>
{/notempty} {/notempty}

View File

@@ -1,6 +1,6 @@
<header class="oircoEgapp-head"> <header class="oircoEgapp-head">
<div class="headtop"> <div class="headtop">
<a href="/"><img src="__IMAGES__/logo.png" class="headerlogimg" /></a> <a><img src="__IMAGES__/logo.png" class="headerlogimg" /></a>
<div class="action-r"> <div class="action-r">
<div class="right img-responsive cursor_p"> <div class="right img-responsive cursor_p">
<span class="icon-category cursor_p top-menu-toggle"><i class="icon-menu-svg"></i></span> <span class="icon-category cursor_p top-menu-toggle"><i class="icon-menu-svg"></i></span>
@@ -53,7 +53,6 @@
</form> </form>
<div class="title-text"> <div class="title-text">
<p><a href="#">{:lang_i18n('搜索历史')}</a></p> <p><a href="#">{:lang_i18n('搜索历史')}</a></p>
<div id="history"></div>
</div> </div>
</div> </div>
</div> </div>
@@ -108,54 +107,5 @@
$('.top-country .close-icon').click(function(){ $('.top-country .close-icon').click(function(){
$(".mask,.action-sheet").hide(); $(".mask,.action-sheet").hide();
}) })
// 移动端顶部宽度设置和主体内容宽度一致
var pageWidth = $('.oricoEGapp').outerWidth();
// 设置.header-PC元素的宽度
$('.oircoEgapp-head').css('width', pageWidth + 'px');
// 可选:监听窗口大小变化,实时更新宽度
$(window).resize(function() {
var newWidth = $('.oricoEGapp').outerWidth();
$('.oircoEgapp-head').css('width', newWidth + 'px');
});
// 回显搜索历史记录
history();
}) })
function history() {
var keywords = new URL(window.location.href).searchParams.get('keywords')
var history_keywords = localStorage.getItem('header_search_keywords');
if (!history_keywords) {
history_keywords = [];
} else {
history_keywords = JSON.parse(history_keywords);
}
// 记录搜索关键词
if (keywords) {
if (history_keywords.includes(keywords)) {
history_keywords.splice(history_keywords.indexOf(keywords), 1);
}
history_keywords.unshift(keywords);
if (history_keywords.length > 3) {
history_keywords.pop();
}
localStorage.setItem('header_search_keywords', JSON.stringify(history_keywords));
}
// 回显搜索历史
history_keywords.forEach(function(item) {
$('#history').append(
$('<a>')
.css({
'margin-right': '10px'
})
.attr('href', '{:url("product/search")}?keywords=' + item)
.text(item)
);
});
return history_keywords;
}
</script> </script>

View File

@@ -1,126 +0,0 @@
<header class="oircoEgapp-head">
<div class="headtop">
{eq name=":cookie('think_lang')" value="zh-cn"}
<a href="{:url('/index/topic/nas/index')}">
{else/}
<a>
{/eq}
<img src="__IMAGES__/logo.png" class="headerlogimg" />
</a>
<div class="action-r">
<div class="right img-responsive cursor_p">
<span class="icon-category cursor_p top-menu-toggle"><i class="icon-menu-svg"></i></span>
</div>
</div>
</div>
<!-- 顶部国家选择-->
<div class="top-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>
<!-- 顶部菜单-->
<div class="top-menu">
{notempty name="header_navigation"}
{volist name="header_navigation" id="nav"}
<div class="it-ct">
<div class="it-1">
{empty name="nav.children"}
<a href="{$nav.link}">{$nav.name}</a>
{else/}
<div class="it-1-more">{$nav.name}<i class="icon-arrow"></i></div>
{volist name="nav.children" id="ch"}
<div class="it-1-2"><a href="{$ch.link}">{$ch.name}</a></div>
{/volist}
{/empty}
</div>
</div>
{/volist}
{/notempty}
</div>
</header>
<script type="text/javascript">
$(function() {
// 点击顶部菜单
$(".top-menu-toggle").click(function() {
$(".top-menu").slideToggle(800);
})
// 点击一级菜单显示二级菜单
$(".it-1-more").on("click", function() {
$('.it-1-2').hide();
$('.icon-arrow').removeClass('rotate');
$(this).siblings('.it-1-2').slideToggle(800);
$(this).find('.icon-arrow').addClass('rotate');
});
// 顶部国家选择
$('.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

@@ -1,69 +0,0 @@
{extend name="public/base" /}
{block name="style"}
<link rel="stylesheet" href="__CSS__/topic_nas_cooperation.css">
{/block}
{block name="header"}
{include file="public/nas_header" /}
{/block}
{block name="main"}
<div class="oricoEGapp">
<div class="narshzhbMbpage">
<!-- banner -->
{notempty name="focus_image"}
<div class="narshzhb-banner">
<img src="{$focus_image.image}" style="margin-top: 3.7rem;">
<!-- <div class="narshzhb-banner-content">
<span class="t1">{:lang_i18n('成为ORICO合作伙伴')}</span>
<h2><strong style="color: #004BFA;">NAS</strong>{:lang_i18n('合作伙伴招募')}</h2>
<div class="narshzhb-banner-btct">
<span>{:lang_i18n('广告代理')}</span>
<span>{:lang_i18n('抖音销售')}</span>
<span>{:lang_i18n('代理经销合作')}</span>
<span>{:lang_i18n('ODM合作')}</span>
</div>
</div> -->
</div>
{/notempty}
<!-- top 介绍 -->
{notempty name="cooperation_methods"}
{volist name="cooperation_methods" id="method" key="idx"}
<div class="narshzhbmb-cttop-it {neq name='idx' value='1'}narshzhbmb-cttop-it2{/neq}">
<img src="{$method.image}">
<div class="cts" {:style(['color' => $method.desc_txt_color])}>{$method.desc|raw}</div>
{eq name="idx" value="1"}
<h2 {:style(['color' => $method.title_txt_color])}>{$method.title}</h2>
{/eq}
</div>
{/volist}
{/notempty}
{notempty name="cooperation_advantages"}
<h2 class="narshzhb-title">{:lang_i18n('合作优势')}</h2>
{assign name="cooperation_advantages_chunk" value=":array_chunk($cooperation_advantages, 2)" /}
{volist name="cooperation_advantages_chunk" id="adv"}
<div class="narshzhbmb-rowits">
{volist name="adv" id="it"}
<div class="narshzhbmb-item">
<img src="{$it.image}" class="hzhbappico">
<h3 class="hzhbapptitle" {:style(['color' => $it.title_txt_color])}>{$it.title}</h3>
<div class="srt" {:style(['color' => $it.desc_txt_color])}>{$it.desc|raw}</div>
</div>
{/volist}
</div>
{/volist}
{/notempty}
<!-- 期待与您的合作 -->
{notempty name="cooperation_cotacts"}
<h2 class="narshzhb-title">{:lang_i18n('期待与您的合作')}</h2>
{assign name="cooperation_cotacts_flat" value=":array_flatten($cooperation_cotacts)" /}
{volist name="cooperation_cotacts_flat" id="ct" key="idx"}
<div class="narshzhbmb-rowits">
<div class="narshzhbmb-item narshzhbmb-item2">
<img src="{$ct.image}" class="hzhbappico">
<span class="srt" {:style(['color'=>$ct.title_txt_color])}>{$ct.title}</span>
</div>
</div>
{/volist}
{/notempty}
</div>
</div>
{/block}

View File

@@ -1,89 +0,0 @@
{extend name="public/base" /}
{block name="style"}
<link rel="stylesheet" href="__CSS__/topic_nas_download.css" />
{/block}
{block name="header"}
{include file="public/nas_header" /}
{/block}
{block name="main"}
<div class="oricoEGapp">
<div class="narsDowloadPc">
{egt name=":count($data)" value="2"}
<div class="narsDtabs">
{notempty name="data.cyber"}
<div class="narsDtabIt narsDtabIt_active">{:lang_i18n('CyberData赛博云空间')}</div>
{/notempty}
{notempty name="data.weline"}
<div class="narsDtabIt">{:lang_i18n('Weline微链接')}</div>
{/notempty}
</div>
{/egt}
<!-- 赛博云 -->
{notempty name="data.cyber"}
<div class="nDtopCtMian narssbshow" style="display: block;">
{notempty name="data.cyber.focus_image"}
<div class="nDtopIt">
<img src="{$data.cyber.focus_image.image}" class="tpimg">
</div>
{/notempty}
{notempty name="data.cyber.down_items"}
<div class="nDtopIt2">
{volist name="data.cyber.down_items" id="it" length="4"}
<a class="nDitImg" {notempty name="it.link"}href="{$it.link}"{/notempty}>
<div class="nDitImg"><img src="{$it.image}"></div>
{eq name=":cookie('think_lang')" value="en-us"}
<div class="yy_name" {:style(['color'=>$it.title_txt_color])}>{$it.title}</div>
<div class="dwbt">Download</div>
{/eq}
</a>
{/volist}
</div>
{volist name="data.cyber.down_items" id="it" offset="4"}
<a {notempty name="it.link"}href="{$it.link}"{/notempty}>
<div class="nDitImg nrowimg" style="margin-bottom: 25px;">
<img src="{$it.image}">
</div>
</a>
{/volist}
{/notempty}
</div>
{/notempty}
<!-- 微链接 -->
{notempty name="data.weline"}
<div class="nDtopCtMian narswljshow">
{notempty name="data.weline.focus_image"}
<div class="nDtopIt">
<img src="{$data.weline.focus_image.image}" class="tpimg">
</div>
{/notempty}
{notempty name="data.weline.down_items"}
<div class="nDtopIt2" style="margin-bottom: 25px;">
{volist name="data.weline.down_items" id="it"}
<a class="nDitImg" {notempty name="it.link"}href="{$it.link}"{/notempty}>
<div class="nDitImg"><img src="{$it.image}"></div>
</a>
{/volist}
</div>
{/notempty}
</div>
{/notempty}
</div>
</div>
{/block}
{block name="script"}
<script type="text/javascript">
$(document).ready(function () {
$('.narsDtabIt').click(function () {
$('.narsDtabIt').removeClass('narsDtabIt_active');
$(this).addClass('narsDtabIt_active');
if ($(this).index() === 0) {
$('.narssbshow').show();
$('.narswljshow').hide();
} else {
$('.narssbshow').hide();
$('.narswljshow').show();
}
});
});
</script>
{/block}

View File

@@ -1,137 +0,0 @@
{extend name="public/base" /}
{block name="style"}
<link rel="stylesheet" href="__CSS__/topic_nas_help.css" />
{/block}
{block name="header"}
<!-- 重置header头为空 -->
{/block}
{block name="main"}
<div class="oricoEGapp">
<div class="narshelpCenterPc-app">
<div class="headtop">
{eq name=":cookie('think_lang')" value="zh-cn"}
<a href="{:url('/index/topic/nas/index')}">
{else/}
<a>
{/eq}
<img src="__IMAGES__/logo.png" class="logoicoimg">
</a>
<img src="__IMAGES__/ssapp.png" class="ssicoimg">
</div>
<!-- banner -->
<img src="__IMAGES__/nhlpapp-banner.webp" class="nhlpbner">
<!-- 使用教程 -->
{notempty name="article_categorys"}
<h1 class="nhlpapp-title">{:lang_i18n('使用教程')}</h1>
{volist name="article_categorys" id="vo" key="idx"}
<div class="nhlpappit">
<div class="nhlptl">
<img src="{$vo.icon}" class="bhlpicoimg">{$vo.name}
</div>
<div class="nhlp-tx-list">
{volist name="vo.article" id="va"}
<a class="txrow" href="{:url('/index/topic/nas/help_detail', ['cid' => $vo.id,'id' => $va.id])}">
<div class="nhlp-point"></div>
<span class="nhlpsp">{$va.title}</span>
<span class="narhelpgoimg"><img src="__IMAGES__/nars-jt.png"></span>
</a>
{/volist}
{if condition="count($vo.article) >= 3"}
<a href="{:url('/index/topic/nas/help_detail', ['cid' => $vo.id, 'id' => isset($vo.article[0])?$vo.article[0]['id']:0, 'view' => 'more'])}">
<div class="ckgdbt">{:lang_i18n('查看更多')} <img src="__IMAGES__/nars-jt.png"></div>
</a>
{/if}
</div>
</div>
{/volist}
{/notempty}
<!-- 联系我们 -->
{notempty name="contacts"}
<h1 class="nhlpapp-title">{:lang_i18n('联系我们')}</h1>
<div class="nhlpapp-row">
{assign name="first_section" value=":array_splice($contacts, 0, count($contacts) - 3)"}
<div class="sec-1">
{volist name="first_section" id="co"}
<a class="nhlplxwmit" {notempty name="co.link"}href="{$co.link}"{/notempty}>
<img src="{$co.image}" class="lximg">
<span class="t1" {:style(['color'=>$co.title_txt_color])}>{$co.title}</span>
{notempty name="co.desc"}
<span class="t2" {:style(['color'=>$co.desc_txt_color])}>{$co.desc|raw}</span>
{/notempty}
</a>
{/volist}
</div>
<div class="sec-2">
{volist name="contacts" id="co"}
<a class="nhlplxwmit nhlplxwmit-w1" {notempty name="co.link"}href="{$co.link}"{/notempty}>
<img src="{$co.image}" class="lximg">
<span class="t1" {:style(['color'=>$co.title_txt_color])}>{$co.title}<br></span>
</a>
{/volist}
</div>
</div>
{/notempty}
<!-- 搜索 -->
<div class="nhlpapp-search">
<div class="nhlpappshtop">
<div class="nhlpapp-shdiv">
<input class="nhlp-ipt" id="search-input" placeholder="{:lang_i18n('请输入搜索关键字,如安装赛博云空间,影视库')}" autocomplete="off">
<img src="__IMAGES__/ssapp.png" class="searchimg">
</div>
<span class="closetx">{:lang_i18n('取消')}</span>
</div>
<div class="nhlpappline"></div>
<!-- 下拉搜索框 -->
<div class="dropdown" id="dropdown"></div>
</div>
</div>
</div>
{/block}
{block name="script"}
<script type="text/javascript">
$(document).ready(function () {
$('.closetx').click(function () {
$('.nhlpapp-search').hide();
});
$('.ssicoimg').click(function () {
$('.nhlpapp-search').show();
});
// 搜索
var timeout = null;
$('#search-input').on('focus input', function () {
clearTimeout(timeout);
var _this = this;
timeout = setTimeout(function () {
var keywords = $(_this).val();
if (keywords == '') {
$('#dropdown').hide().html('');
return;
}
$.ajax({
url: "{:url('/index/topic/nas/help_search')}",
type: 'POST',
data: { keywords: keywords },
dataType: 'JSON',
success: function (r) {
var html = '';
if (r.code == 0) {
html = '<ul>'
$.each(r.data, function (k, v) {
html += '<li><a class="search-item" href="{:url(\'/index/topic/nas/help_detail\')}?id=' + v.id + '">' + v.title + '</a></li>'
})
html += '</ul>'
}
$('#dropdown').show().html(html);
}
})
}, 300);
});
$('.nhlplxwmit:not(:first)').hover(function () {
$(this).find('.lximg').show();
}, function () {
$(this).find('.lximg').show();
});
});
</script>
{/block}

View File

@@ -1,235 +0,0 @@
{extend name="public/base" /}
{block name="title"}
{notempty name="article.seo_title"}<title>{$article.seo_title}</title>{else /}{__BLOCK__}{/notempty}
{/block}
{block name="seo"}
{notempty name="article.seo_keywords"}
<meta name="keywords" content="{$article.seo_keywords}" />
<meta name="description" content="{$article.seo_desc}" />
{else /}
{__BLOCK__}
{/notempty}
{/block}
{block name="style"}
<link rel="stylesheet" href="__CSS__/topic_nas_help-detail.css" />
{/block}
{block name="header"}
<!-- 重置header头为空 -->
{/block}
{block name="main"}
<div class="oricoEGapp">
<div class="narshelpCenterdetail-app">
<div class="headtop">
{eq name=":cookie('think_lang')" value="zh-cn"}
<a href="{:url('/index/topic/nas/index')}">
{else/}
<a>
{/eq}
<img src="__IMAGES__/logo.png" class="logoicoimg">
</a>
<div style="display: flex;">
<img src="__IMAGES__/fenlei.png" class="ssicoimg" id="flico">
<img src="__IMAGES__/sousuo.png" class="ssicoimg" id="ssico" style="margin-right:32px">
</div>
</div>
<!-- 文章内容 -->
<div class="ql-container">
<div id="rendered-content" class="nhlp-app-content ql-editor">
{$article.content|raw|default=''}
</div>
</div>
<!-- 搜索 -->
<div class="nhlpapp-search">
<div class="nhlpappshtop">
<div class="nhlpapp-shdiv">
<input class="nhlp-ipt" id="search-input" placeholder="{:lang_i18n('请输入搜索关键字,如安装赛博云空间,影视库')}"
autocomplete="off">
<img src="__IMAGES__/ssapp.png" class="searchimg">
</div>
<span class="closetx">{:lang_i18n('取消')}</span>
</div>
<div class="nhlpappline"></div>
<!-- 下拉搜索框 -->
<div class="dropdown" id="dropdown"></div>
</div>
<!-- 分类文章目录 -->
<div class="nhlpapp-pagescate" {:style(['display'=> $Request.get.view == 'more' ? 'block' : 'none'])}>
<div class="nars-hlpdt-ml">
{notempty name="article_categorys"}
<div class="nav-tree">
{volist name="article_categorys" id="ac" key="idx"}
<div class="categoryhelp">
<div class="categoryhelp-title">
<div>
<img src="__IMAGES__/nars-jt.png"
class="arrow {if condition='$ac.id == $Request.get.cid'}rotate{/if}">
</div>
<span>{$ac.name}</span>
</div>
<ul class="sub-list" {if condition='$ac.id == $Request.get.cid' }style="display: block;" {/if}>
{volist name="ac.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])}"
style="padding-top: 6px;">
{$ar.title}
</a>
</li>
{/volist}
</ul>
</div>
{/volist}
</div>
{/notempty}
</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>
</div>
</div>
{/block}
{block name="script"}
<script type="text/javascript">
$(document).ready(function () {
// 点击顶部分类图标
$('#flico').click(function () {
$('.nhlpapp-pagescate').toggle();
// 检查分类菜单是否显示
if ($('.nhlpapp-pagescate').is(':visible')) {
// 如果分类菜单显示,则隐藏文章内容
$('#rendered-content').hide();
$('.footer').hide()
} else {
// 如果分类菜单隐藏,则显示文章内容
$('#rendered-content').show();
$('.footer').show()
}
});
// 点击分类的交互
$('.categoryhelp-title').click(function () {
$(this).next('.sub-list').slideToggle();
$(this).find('.arrow').toggleClass('rotate');
});
//分类二三级交互
$('.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();
$('.nhlpapp-search').show();
});
$('.closetx').click(function () {
$('.nhlpapp-search').hide();
});
// 顶部国家选择
$('.top-country-toggle').click(function () {
$(".mask,.action-sheet").show();
})
$('.top-country .close-icon').click(function () {
$(".mask,.action-sheet").hide();
})
// 搜索
var timeout = null;
$('#search-input').on('focus input', function () {
clearTimeout(timeout);
var _this = this;
timeout = setTimeout(function () {
var keywords = $(_this).val();
if (keywords == '') {
$('#dropdown').hide().html('');
return;
}
$.ajax({
url: "{:url('/index/topic/nas/help_search')}",
type: 'POST',
data: {
keywords: keywords
},
dataType: 'JSON',
success: function (r) {
var html = '';
if (r.code == 0) {
html = '<ul>'
$.each(r.data, function (k, v) {
html += '<li><a class="search-item" href="{:url(\'/index/topic/nas/help_detail\')}?id=' + v.id + '">' + v.title + '</a></li>'
})
html += '</ul>'
}
$('#dropdown').show().html(html);
}
})
}, 300);
});
// 英文截断处理
// 目标容器:富文本内容所在的元素
const contentContainer = $('#rendered-content');
// 遍历所有包含文本内容的标签p、h1-h6、strong等
contentContainer.find('*').each(function () {
const $element = $(this);
const htmlContent = $element.html();
// 条件1排除内容仅为一个&nbsp;的标签(如<p>&nbsp;</p>
if (htmlContent.trim() === '&nbsp;') {
return; // 不处理,继续下一个元素
}
// 条件2检查是否包含&nbsp;且有实际文本内容
if (htmlContent.includes('&nbsp;')) {
// 将所有&nbsp;替换为普通空格(有效占位符,支持单词完整换行)
const newContent = htmlContent.replace(/&nbsp;/g, ' ');
$element.html(newContent);
}
});
});
</script>
{/block}

View File

@@ -1,153 +0,0 @@
{extend name="public/base"/}
{block name="style"}
<link rel="stylesheet" href="__CSS__/topic_nas_index.css">
{/block}
{block name="header"}
{include file="public/nas_header" /}
{/block}
{block name="main"}
<div class="oricoEGapp">
<!-- 首页 -->
<div class="oricoCN-nasindex">
<div class="narsMBpage">
<!-- 轮播 banner -->
{notempty name="focus_image"}
<div class="narsMB-banner">
<div class="swiper-container narsMBbannerSwiper">
<div class="swiper-wrapper">
{volist name="focus_image" id="fo"}
<div class="swiper-slide">
<div class="narsMB-banner-st">
<h2></h2>
<span class="narsMB-bannersm"></span>
</div>
<a href="{$fo.link}"><img src="{$fo.image}" class="narsmb-img" /></a>
</div>
{/volist}
</div>
<!-- Add Pagination -->
<div class="swiper-pagination"></div>
</div>
</div>
{/notempty}
<!-- 九大模块分类 -->
{notempty name="nas_category"}
{assign name="categories" value=":array_flatten($nas_category)"/}
<div class="narsmb-cate">
{assign name="categories_idx1" value=":array_shift($categories)"/}
{notempty name="categories_idx1"}
<a class="{$categories_idx1.link}">
<img src="{$categories_idx1.image}" style="width:100%" />
</a>
{/notempty}
{assign name="categories_chunk" value=":array_chunk($categories, 2)"/}
{volist name="categories_chunk" id="chunk"}
<div class="narsmbcateits">
{volist name="chunk" id="cc"}
<a class="narsmbcate-it" href="{$cc.link}">
<img src="{$cc.image}" style="width:100%" />
</a>
{/volist}
</div>
{/volist}
</div>
{/notempty}
<!-- 视频 -->
{notempty name="nas_video"}
<div class="narsmbvd">
<video class="narsmbvideo" poster="{$nas_video.image}" controls autoplay loop muted>
<source type="video/mp4" src="{$nas_video.video}">
</video>
</div>
{/notempty}
<!-- 解决方案 -->
{notempty name="nas_solution"}
<div class="narsmb-jjfa">
<span class="narsmbjjfa-title"><span style="color:#084BFA">ORICO</span>{:lang_i18n('网络存储解决方案')}</span>
<div class="swiper narsmbjjfaSwiper">
<div class="swiper-wrapper">
{volist name="nas_solution" id="so"}
<div class="swiper-slide narsmbjjfa-slide">
<div class="narsmb-jjfa-ct" {:style(['color' => $so.title_txt_color])}>{$so.title}</div>
<img src="{$so.image}" class="narsmb-jjfabgimg" />
<!-- 点击移入效果-->
<div class="narsmb-jjfa-info" style="text-align:left;white-space:pre-line;">
<div class="box">
<p {:style(['color' => $so.title_txt_color])}>{$so.title}</p>
<div {:style(['color' => $so.desc_txt_color])}>{$so.desc|raw}</div>
</div>
</div>
</div>
{/volist}
</div>
</div>
</div>
{/notempty}
<!-- 微链接 -->
{notempty name="nas_software"}
<div class="narsmb-wlj">
<span class="narsmbwlj-title"><span style="color:#084BFA">NAS</span> {:lang_i18n('配套软件')}</span>
{volist name="nas_software" id="soft" offset="0" length="3"}
<div class="narsmbwltitem">
<div class="narsmbwljcp">
<img src="{$soft.image}" class="narsmbwljimg" />
</div>
<div class="narsmbwljcpinfo">
<span class="narsmbif-title" {:style(['color' => $soft.title_txt_color])}>{$soft.title}</span>
<span class="narsmbif-info" {:style(['color' => $soft.desc_txt_color])}>{$soft.desc|raw}</span>
</div>
</div>
{/volist}
{volist name="nas_software" id="soft" offset="3"}
<div class="narsmbwltitem">
<a style="height:100%;width:100%" {notempty name="soft.link"}href="{$soft.link}"{/notempty}>
<img src="{$soft.image}" style="height:100%;width:100%" />
</a>
</div>
{/volist}
</div>
{/notempty}
</div>
</div>
</div>
{/block}
{block name="script"}
<script type="text/javascript">
$(document).ready(function () {
// banner轮播
var bannerswiper = new Swiper('.narsMBbannerSwiper', {
// 配置选项
loop: true,
autoplay: {
delay: 3000,
},
pagination: {
el: '.swiper-pagination',
}
});
// 解决方案轮播
var swiper1 = new Swiper(".narsmbjjfaSwiper", {
slidesPerView: "auto",
spaceBetween: 6,
freeMode: true,
autoplay: 5000,
loop: true
});
// 解决方案轮播点击显示文案
var swiperSlides = document.querySelectorAll('.narsmbjjfa-slide');
// 为每个 swiper-slide 添加点击事件
swiperSlides.forEach(function (slide) {
slide.addEventListener('click', function () {
var infoElement = this.querySelector('.narsmb-jjfa-info');
if (window.getComputedStyle(infoElement).display === 'none') {
infoElement.style.display = 'flex';
swiper1.stopAutoplay()
} else {
infoElement.style.display = 'none';
swiper1.startAutoplay()
}
});
});
});
</script>
{/block}

View File

@@ -1,61 +0,0 @@
{extend name="public/base" /}
{block name="style"}
<link rel="stylesheet" type="text/css" href="__CSS__/topic_nas_product.css" />
{/block}
{block name="header"}
{include file="public/nas_header" /}
{/block}
{block name="main"}
<div class="narsZTPC">
<div class="nZTtopCtMian narssbshow">
{notempty name="focus_image"}
<a {notempty name="focus_image.link"}href="{$focus_image.link}"{/notempty}>
<img src="{$focus_image.image}" class="narsZCimg">
</a>
{/notempty}
{notempty name="step"}
<div class="narsZTicos">
{volist name="step" id="st"}
<div class="nztit">
<img src="{$st.image}" class="narsicimg">
<span class="narsstep">{$st.title}</span>
<span class="narszttext">{$st.desc|raw}</span>
</div>
{/volist}
</div>
{/notempty}
{notempty name="trial_instructions"}
<div class="narsZTinfo">
<div class="nztif-left">
{volist name="trial_instructions" id="trial" offset="0" length="2"}
<div class="narsztewmit">
<a {notempty name="trial.link"}href="{$trial.link}" target="_blank"{/notempty}>
<img src="{$trial.image}" class="nztewmimg">
</a>
<p {:style(["color"=>$trial.title_txt_color])}>{$trial.title}</p>
<span {:style(["color"=>$trial.desc_txt_color])}>{$trial.desc|raw}</span>
</div>
{/volist}
</div>
<div class="nztif-right">
{notempty name="trial_instructions.2"}
<span class="sysmtxt" {:style(["color"=>$trial_instructions.2.title_txt_color])}>
{$trial_instructions.2.title|default=''}
</span>
<div class="sminfo" {:style(["color"=>$trial_instructions.2.desc_txt_color])}>
{$trial_instructions.2.desc|raw|default=''}
</div>
{/notempty}
<div class="nztbzyj">
{volist name="trial_instructions" id="trial" offset="3"}
<a {notempty name="trial.link"}href="{$trial.link}" target="_blank"{/notempty}>
<span {:style(["color"=>$trial.title_txt_color])}>{$trial.title}</span>
</a>
{/volist}
</div>
</div>
</div>
{/notempty}
</div>
</div>
{/block}

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