Compare commits
496 Commits
474ea78de5
...
font
| Author | SHA1 | Date | |
|---|---|---|---|
| de87a4b237 | |||
| 32ab01bfb8 | |||
| 30f4f0761a | |||
| df2ccc288c | |||
| d5acd5a025 | |||
| 39cd6137b3 | |||
| 8f03cb8f99 | |||
| 5a1d69a836 | |||
| de0f1f34ce | |||
| 6af605bc6f | |||
| 362a7f5a65 | |||
| dafeb04f65 | |||
| 7b5cac6874 | |||
| 4942e5d78e | |||
| b35f1f9ed4 | |||
| 7a987cd672 | |||
| 7c87ea07ed | |||
| 45aaa0c35e | |||
| 23aed15ada | |||
| 325fab3d27 | |||
| 5c1f4a0a73 | |||
| fa4dcf313a | |||
| 1c098304f9 | |||
| c72cfa2e43 | |||
| fec6dca03d | |||
| fdb673d174 | |||
| 6daac314dd | |||
|
|
9d8e22d270 | ||
|
|
f154f3ddf6 | ||
|
|
2073a27ef7 | ||
|
|
e301fc7e94 | ||
|
|
f9251d944e | ||
|
|
1e6187801d | ||
|
|
346dcebba3 | ||
| ab7b23e5d1 | |||
| 325221bd67 | |||
|
|
721e91dc31 | ||
|
|
12e51c6f46 | ||
|
|
8ba9006173 | ||
|
|
a7d413871b | ||
|
|
ce6a882c17 | ||
|
|
7e7cfeacbc | ||
|
|
e1961d2a83 | ||
|
|
d313617e2b | ||
|
|
f0c82c848f | ||
|
|
f606dc64a5 | ||
|
|
39dc3c4e1a | ||
|
|
52b265f36e | ||
|
|
5f9fb74696 | ||
|
|
b251c78b2f | ||
|
|
2e1c83d46d | ||
|
|
0265cb0629 | ||
|
|
68d66b2925 | ||
|
|
601403bf3e | ||
|
|
bbe2197b38 | ||
|
|
ee955a3674 | ||
|
|
e45df84312 | ||
|
|
4e0891da97 | ||
|
|
f9b895732e | ||
|
|
e72ecd55f4 | ||
|
|
558b418d18 | ||
|
|
78cbc5de6e | ||
|
|
f7b610df72 | ||
|
|
b1522a365b | ||
|
|
48906ec9cd | ||
|
|
b57cb8dfd6 | ||
|
|
7d70c55557 | ||
|
|
4fdda8435d | ||
|
|
7a96809bfe | ||
|
|
62b3e2798f | ||
|
|
bfeac736ea | ||
|
|
74ea50b7e4 | ||
|
|
8a617c06e9 | ||
|
|
efa8acaf12 | ||
|
|
d3ff726e90 | ||
|
|
7880c18e85 | ||
|
|
e80ba5ac7d | ||
| 20b5fd901b | |||
| e38c00f59c | |||
| a18706f7d4 | |||
| 4ff2ee4a76 | |||
| 2ca708fd4a | |||
| 29761f551d | |||
| fdb75e4888 | |||
| 5fde7159e0 | |||
| 6068efa03f | |||
| 738b293ea2 | |||
| a1be105c31 | |||
| 03374856e4 | |||
| f07741ff19 | |||
| c64450d74c | |||
| e462b38ff9 | |||
| b96021d21d | |||
| 12d6fdc3a6 | |||
| cd3f651a2a | |||
| 1e4b416cac | |||
| e38446f3fd | |||
| 06b9d42ae4 | |||
| 99d78069d5 | |||
| 342a3754aa | |||
| 51e9c8ced1 | |||
| b13d481e1e | |||
| da8f204167 | |||
| c1979da1af | |||
| 1802f57906 | |||
| 3fa3b8fb63 | |||
| fb2b1455bc | |||
| cc497b2ebc | |||
| 2b450a2e9c | |||
| e266e89a97 | |||
| 2a94a7ecec | |||
| 9137335ce3 | |||
| b8946f223a | |||
| 3a8440c2b9 | |||
| c2bba7fb56 | |||
| 052570fefa | |||
| 09b1f9f14c | |||
| 37825f88ba | |||
| 1c7434b591 | |||
| 585da730ea | |||
| 2ecc51d8a9 | |||
| ad7148ccfc | |||
| 1e00db6c97 | |||
| 5ed692a672 | |||
| 5f7156470e | |||
| 3aafcd3f3b | |||
| 9b339d6364 | |||
| 09f9bfd301 | |||
| 910a07ea47 | |||
| c27d529b82 | |||
| b6724c0361 | |||
| d4fa15f671 | |||
| 60229ae058 | |||
| 6cf27d8b9c | |||
| 6ba7181e3f | |||
| 4334c2db66 | |||
| d7e93567d9 | |||
| e19ba6a315 | |||
| a8e7ad2430 | |||
| 55c8762255 | |||
| 43a4f5f706 | |||
| c6cff2e97d | |||
| 5d53c26c5c | |||
| 857bb4ad21 | |||
| b3dfb8655b | |||
| 10c1f86708 | |||
| 62a67bf7a0 | |||
| 4dc4932ac7 | |||
| b99c07ef4a | |||
| f8dc645048 | |||
| 051b4ed7e7 | |||
| 142e29f131 | |||
| 7f58f1ff83 | |||
| 5650ccfb87 | |||
| 439c9073b8 | |||
| f78f164326 | |||
| 5fb2abe818 | |||
| 1f3b646495 | |||
| a1ea5c6752 | |||
| beb86140a6 | |||
| 0d442fb63a | |||
| af139f6bf4 | |||
| 1d79ea5186 | |||
| de02e59b0e | |||
| f4fa5afcfa | |||
| 2c40c95794 | |||
| 70534f2a97 | |||
| 4515939fcf | |||
| b16971e6f1 | |||
| 3840206e7c | |||
| ef1f786417 | |||
| 745671bd33 | |||
| a13ea053e3 | |||
| 0725cd779f | |||
| 47caddad60 | |||
| 5db4263f67 | |||
| 9887bd1045 | |||
| 768e1ed786 | |||
| f211f58068 | |||
| e7e7386054 | |||
| 9c7f2d394b | |||
| a1f1716f5c | |||
| 250f78593a | |||
| 2c0b8161a5 | |||
| 83fa83e00d | |||
| 176b25b631 | |||
| 4b2566b762 | |||
| a25f87de9f | |||
| ec6fa7fe77 | |||
| 0ba299ee05 | |||
| d06002d95c | |||
| 1758fb8995 | |||
| 52259d573c | |||
| a680391d86 | |||
| 0e0ed64b38 | |||
| 5221b43c01 | |||
| a373ee7163 | |||
| 07692a2a29 | |||
| 3c7bdd8ac9 | |||
| db3b704d89 | |||
| 6e3e0d59db | |||
| f8884aa736 | |||
| 8e62d95864 | |||
| 7bf88fd578 | |||
| a4330c1216 | |||
| 6c80dbabeb | |||
| e0009fb8fa | |||
| 66da36a907 | |||
| 702e874e08 | |||
| 7e486e463c | |||
| df482bbcdd | |||
| 7651b056b6 | |||
| 877c8835d9 | |||
| 67865d64cd | |||
| 699e55ffa1 | |||
| 4ca9a84d14 | |||
| ac5d0143ac | |||
| 6434d031ca | |||
| 8f2dbf8798 | |||
| 7a0c3af1e9 | |||
| 7879f7914b | |||
| 99a69bad5f | |||
| 38783d80a0 | |||
| b37ed217cd | |||
| dd687120cc | |||
| 004a007148 | |||
| 5018a59045 | |||
| 8fa1399902 | |||
| e781887d16 | |||
| 55d72124a0 | |||
| 3eda90f2d1 | |||
| 6b815ea414 | |||
| df8001d43e | |||
| 7f8ad55c97 | |||
| 14f0f1609e | |||
| 6c176a1039 | |||
| bffe804a7b | |||
| a9beb0dda6 | |||
| 3c72fa125f | |||
| 81df05e0f9 | |||
| e0fd77837d | |||
| 7344691613 | |||
| fe697df167 | |||
| b743688d99 | |||
| 51b6841a3a | |||
| 768ed5b0fb | |||
| 0c2f96fd49 | |||
| 40c8385776 | |||
| 80c6647a0c | |||
| 187a0affcc | |||
| a35288dd0b | |||
| b36627ec25 | |||
| eb2a98e7fe | |||
| 5c79e33ce1 | |||
| 341e1f54fb | |||
| 78925fbbab | |||
| d9e056972c | |||
| b09f7d1e6f | |||
| ad0f7f4b87 | |||
| 61e4ac1fb3 | |||
| 728730433b | |||
| 3a50a23cfa | |||
| 1dc03040f1 | |||
| 900d73d389 | |||
| 5b69987d6e | |||
| 512c07b5a8 | |||
| 885b86ded9 | |||
| c04b7cae38 | |||
| 3ff0137e4b | |||
| 15c18d5fc1 | |||
| 91b083f0e5 | |||
| a3dccb8b19 | |||
| 974f561c5a | |||
| 8fd52854cc | |||
| b9b865ece0 | |||
| acc39f4580 | |||
| e82c201a2b | |||
| 6927bdbc42 | |||
| 3db7e42e71 | |||
| 12bd511d0b | |||
| 4a52be183c | |||
| 58324ebb33 | |||
| 8ccca36e44 | |||
| d6c7a0f11e | |||
| 858468b72b | |||
| 3eadc5c3eb | |||
| fe324bc62f | |||
| 2329b1bbe6 | |||
| 134c75cc4b | |||
| 3b737b0bd0 | |||
| 2da153e935 | |||
| 271f22ea18 | |||
| 4a56e7e980 | |||
| b3475a7d06 | |||
| 988bdde6f1 | |||
| 456209121e | |||
| 8186a424de | |||
| ebc8c6431a | |||
| 7cbb6adb5d | |||
| 4b8963161f | |||
| eeb79e8c56 | |||
| 2a503cbf68 | |||
| aed2ce4655 | |||
| 70b524ce04 | |||
| db82564148 | |||
| 386cd613ee | |||
| dc8a3dc5da | |||
| 4ec2985468 | |||
| 796231a50e | |||
| 6b082f2de9 | |||
|
|
83287098ee | ||
|
|
b67959163b | ||
| ba04d6d220 | |||
| 457c06948c | |||
| c0b6ddf11b | |||
| a8960c3c81 | |||
| d4be3ff937 | |||
| 751d4ce12d | |||
| 9c6e26ce05 | |||
| 25a55ba9f5 | |||
| b8b8d8d58f | |||
| 31d747a0b0 | |||
| 0025b0a5bb | |||
| 002c4055eb | |||
| 738986d715 | |||
| 673f4d101a | |||
| 553c010dc2 | |||
| c18ba2dbc2 | |||
| 13eec27ea9 | |||
| 84e41958c9 | |||
| 7045bd7b7d | |||
| cbb0699fae | |||
| e1b4266513 | |||
| c109748c79 | |||
| 87b4917120 | |||
| 48e3ec7c2c | |||
| 92679d3ebc | |||
| dc94ec5f5f | |||
| c67ae635d8 | |||
| 4233efe422 | |||
| 28e3e08f86 | |||
| be7f4edff5 | |||
| 3d777043e8 | |||
| 9aafb6321b | |||
| 942a5706ca | |||
| 73b8562d71 | |||
| c3733e24a7 | |||
| eeaa27d0b4 | |||
| a5e20a3840 | |||
| d809690724 | |||
| 447885529e | |||
| 89e46189bd | |||
| 29ea63199c | |||
| 3ef1fc634a | |||
| 4d988c316b | |||
| 9182ed29d9 | |||
| e1388c63b7 | |||
| a0d53c6e0e | |||
| 6603af60ef | |||
| 336f27bc23 | |||
| 65ccd97e32 | |||
| 256975b592 | |||
| 90508c8c37 | |||
| f7ced51c4d | |||
| aee2f81601 | |||
| cc85925f37 | |||
| 8897a3bbda | |||
| 9292e40053 | |||
| 57058dd150 | |||
| 8237fb50ce | |||
| 6e2800f361 | |||
| 8bb323f3f5 | |||
| c85cb4af54 | |||
| 5d4baf4383 | |||
| dbf0a65ee7 | |||
| 46c72f1146 | |||
| 2a1c9f7825 | |||
| 878885377c | |||
| 8841bc9819 | |||
| bde8ef0bb3 | |||
| 8e78f95002 | |||
| 77706e5bcb | |||
| 1100e347bd | |||
| de44890014 | |||
| f970f22539 | |||
| 90c1be254b | |||
| 87c3180229 | |||
| 74942de6db | |||
| 04fb5cd3b1 | |||
| 52a1756d5b | |||
| ecd2602d35 | |||
| 0de7fce26d | |||
| 46b85b090d | |||
| 1074b99bb8 | |||
| 11091d46e9 | |||
| 4836f113fa | |||
| 9b7679af30 | |||
| cc8258c764 | |||
| f8734366f1 | |||
| b625a23856 | |||
| 6d2135b862 | |||
| 927c4c65a9 | |||
| 1295706704 | |||
| 50dade9517 | |||
| 26af0577ad | |||
| ec20bd3741 | |||
| c13fcc2cb9 | |||
| 74e7e145af | |||
| b68c56cfdc | |||
| e60b2a02a1 | |||
| 9a9b714aad | |||
| 9ab935e1ff | |||
| c5e28d153d | |||
| 023ebf775d | |||
| f086dd0239 | |||
| 69e45a8044 | |||
| bdd6a7ba34 | |||
| cbb6bc144b | |||
| 304f7c460d | |||
| 163de38bb2 | |||
| 62baecc835 | |||
| 1dd37485a2 | |||
| 6eca3790d3 | |||
| 61c7d32f50 | |||
| 35e11d7d8f | |||
| 999bb94f70 | |||
| bd9e6009ad | |||
| 47d9be28fa | |||
| e765dd4153 | |||
| 207106c34c | |||
| 2af9f63b83 | |||
| dd3672c93a | |||
| 9fb3d8f874 | |||
| 519160218f | |||
| 81ec4a84a8 | |||
| a29e95a951 | |||
| 239bb64e9a | |||
| 774954c70b | |||
| a3f8668b60 | |||
| 3cb48fd462 | |||
| 778e7180d7 | |||
| 1eecd80340 | |||
| 0ba42e2a20 | |||
| 55e8e914fb | |||
| 37828dafca | |||
| 043bac94ec | |||
| e7b76ea68b | |||
| e9a2165b10 | |||
| 93bf23f307 | |||
| fcd562595d | |||
| 4444875e48 | |||
| 5e8f7549e0 | |||
| f0ea57c19f | |||
| ed8ae64cac | |||
| 4b3f626443 | |||
| d06378e264 | |||
| 0ea2fbeb1f | |||
| cb5f4a6148 | |||
| fed50a9f4c | |||
| d94ceb2a9c | |||
| 307c80e5e9 | |||
| 873d043e45 | |||
| dd328e5b9e | |||
| fb135cd1dc | |||
| 65b1fcd992 | |||
| 7ac132a182 | |||
| 929608b9b9 | |||
| cdd4d0d09f | |||
| 9c4cccbeb0 | |||
| 34866fd9fe | |||
| c9107fce72 | |||
| 4953163892 | |||
| cb87b3203c | |||
| 35329b25e8 | |||
| 6dd714dce7 | |||
| 80dbc75c73 | |||
| e76fcf2822 | |||
| b4b36aa988 | |||
| 20deefdd5f | |||
|
|
475fe19d84 | ||
|
|
eba4a1c96e | ||
| b4903854c1 | |||
| 44057cb26d | |||
| c5f88098f5 | |||
| 9a220bbb97 | |||
| 8ec4fd9dce | |||
|
|
2566538006 | ||
|
|
64ff307d57 | ||
| e7a232ac9c | |||
| 4f3c5fdee2 | |||
| eea5f83afc | |||
| 53086a83d1 | |||
| 96d693af64 | |||
|
|
70266967e1 | ||
|
|
24959571b7 | ||
|
|
5c4aa9e21d |
5
.env
5
.env
@@ -1,5 +0,0 @@
|
|||||||
|
|
||||||
[JWT]
|
|
||||||
TTL=3600
|
|
||||||
REFRESH_TTL=20160
|
|
||||||
SECRET=b43e6276644ed60e65c50d1b324ba10b
|
|
||||||
32
.env.dev
32
.env.dev
@@ -1,32 +0,0 @@
|
|||||||
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 # 附件上传最大限制
|
|
||||||
37
.env.local
37
.env.local
@@ -1,37 +0,0 @@
|
|||||||
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
|
|
||||||
|
|
||||||
# 前端代理服务器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; # 附件上传最大限制
|
|
||||||
|
|
||||||
# 开放API
|
|
||||||
[OPENAPI]
|
|
||||||
RESOURCE_IMAGES_DOMAIN = http://local.orico.com; # 图片资源服务器地址
|
|
||||||
RESOURCE_VIDEOS_DOMAIN = http://local.orico.com; # 视频资源服务器地址
|
|
||||||
95
.example.env
95
.example.env
@@ -1,11 +1,96 @@
|
|||||||
APP_DEBUG = true
|
APP_DEBUG = true
|
||||||
|
|
||||||
DB_TYPE = mysql
|
DB_TYPE = mysql
|
||||||
DB_HOST = 127.0.0.1
|
DB_HOST = localhost
|
||||||
DB_NAME = test
|
DB_NAME = orico-official-website
|
||||||
DB_USER = username
|
DB_USER = orico-ow
|
||||||
DB_PASS = password
|
DB_PASS = 14Xi17NIK8V2qAXE8oMataHEsaR8lE
|
||||||
DB_PORT = 3306
|
DB_PORT = 3306
|
||||||
DB_CHARSET = utf8
|
DB_CHARSET = utf8mb4
|
||||||
|
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
|
||||||
|
|||||||
26
.gitea/workflows/dev-ci.yaml
Normal file
26
.gitea/workflows/dev-ci.yaml
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
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
15
.gitignore
vendored
@@ -3,10 +3,23 @@ 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
|
||||||
|
|||||||
24
.zed/settings.json
Normal file
24
.zed/settings.json
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
// 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"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
219
app/admin/controller/ReceiveProductSync.php
Normal file
219
app/admin/controller/ReceiveProductSync.php
Normal file
@@ -0,0 +1,219 @@
|
|||||||
|
<?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('同步成功');
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -228,7 +228,7 @@ class Article
|
|||||||
private function getExportArticleData()
|
private function getExportArticleData()
|
||||||
{
|
{
|
||||||
$server = request()->server();
|
$server = request()->server();
|
||||||
$image_host = $server['REQUEST_SCHEME'] . "://" . $server['SERVER_NAME'] . config('filesystem.disks.public.url') . '/';
|
$image_host = $server['REQUEST_SCHEME'] . "://" . $server['SERVER_NAME'] . '/';
|
||||||
$param = request()->param(['title', 'category_id', 'release_time']);
|
$param = request()->param(['title', 'category_id', 'release_time']);
|
||||||
$data = ArticleModel::field([
|
$data = ArticleModel::field([
|
||||||
'*',
|
'*',
|
||||||
@@ -253,7 +253,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) ? $image_host . $item->image : '';
|
$item->image = !empty($item->image) ? url_join($image_host, $item->image) : '';
|
||||||
return $item;
|
return $item;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -34,12 +34,12 @@ class Banner
|
|||||||
$datas = [];
|
$datas = [];
|
||||||
if (!$banners->isEmpty()) {
|
if (!$banners->isEmpty()) {
|
||||||
$temp = [];
|
$temp = [];
|
||||||
$map = ['pc' => 'PC端', 'mobile' => '移动端'];
|
$map = ['pc' => ['id' => -1, 'name' => 'PC端'], 'mobile' => ['id' => -2, 'name' => '移动端']];
|
||||||
foreach ($banners as $banner) {
|
foreach ($banners as $banner) {
|
||||||
if (!isset($temp[$banner->at_platform])) {
|
if (!isset($temp[$banner->at_platform])) {
|
||||||
$temp[$banner->at_platform] = [
|
$temp[$banner->at_platform] = [
|
||||||
'id' => 0,
|
'id' => $map[$banner->at_platform]['id'] ?? 0,
|
||||||
'name' => $map[$banner->at_platform] ?? '未知平台',
|
'name' => $map[$banner->at_platform]['name'] ?? '未知平台',
|
||||||
'children' => []
|
'children' => []
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -101,10 +101,13 @@ 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',
|
||||||
@@ -155,10 +158,13 @@ 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',
|
||||||
@@ -206,7 +212,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('操作成功');
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -238,10 +244,12 @@ 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' => '链接地址',
|
||||||
@@ -259,21 +267,21 @@ class BannerItem
|
|||||||
// 获取导出数据
|
// 获取导出数据
|
||||||
private function getBannerExportData()
|
private function getBannerExportData()
|
||||||
{
|
{
|
||||||
$param = request()->param([
|
$server = request()->server();
|
||||||
'title',
|
$image_host = $server['REQUEST_SCHEME'] . "://" . $server['SERVER_NAME'] . '/';
|
||||||
'banner_id',
|
$param = request()->param(['title', 'banner_id', 'created_at']);
|
||||||
'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',
|
||||||
@@ -307,7 +315,13 @@ 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;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// 删除
|
// 删除
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ 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', 'id' => 'desc'])
|
->order(['sort' => 'asc', 'created_at' => 'desc', 'id' => 'desc'])
|
||||||
->paginate([
|
->paginate([
|
||||||
'list_rows' => $param['size'],
|
'list_rows' => $param['size'],
|
||||||
'page' => $param['page'],
|
'page' => $param['page'],
|
||||||
@@ -171,7 +171,7 @@ class Product
|
|||||||
// 更新产品参数
|
// 更新产品参数
|
||||||
if ($put['params'] != "") {
|
if ($put['params'] != "") {
|
||||||
ProductParamsModel::productId($id)->delete();
|
ProductParamsModel::productId($id)->delete();
|
||||||
if (preg_match_all('/(\S+):(.[^\s]+)/', $put['params'], $match_result)) {
|
if (preg_match_all('/(.+):(.+)/', $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 +346,7 @@ class Product
|
|||||||
private function getExportProductData()
|
private function getExportProductData()
|
||||||
{
|
{
|
||||||
$server = request()->server();
|
$server = request()->server();
|
||||||
$image_host = $server['REQUEST_SCHEME'] . "://" . $server['SERVER_NAME'] . config('filesystem.disks.public.url') . '/';
|
$image_host = $server['REQUEST_SCHEME'] . "://" . $server['SERVER_NAME'] . '/';
|
||||||
$param = request()->param([
|
$param = request()->param([
|
||||||
'name',
|
'name',
|
||||||
'spu',
|
'spu',
|
||||||
@@ -360,10 +360,10 @@ class Product
|
|||||||
'spu',
|
'spu',
|
||||||
'name',
|
'name',
|
||||||
'short_name',
|
'short_name',
|
||||||
'CONCAT("' . $image_host . '", `cover_image`)' => 'cover_image',
|
'cover_image',
|
||||||
'desc',
|
'desc',
|
||||||
'CONCAT("' . $image_host . '", `video_img`)' => 'video_img',
|
'video_img',
|
||||||
'CONCAT("' . $image_host . '", `video_url`)' => '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,7 +390,18 @@ 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()) {
|
||||||
// 产品参数
|
// 产品参数
|
||||||
|
|||||||
@@ -16,8 +16,9 @@ class ProductTcoCategory
|
|||||||
$param = request()->param(['name']);
|
$param = request()->param(['name']);
|
||||||
|
|
||||||
$categorys = ProductTcoCategoryModel::field([
|
$categorys = ProductTcoCategoryModel::field([
|
||||||
'tco_id' => 'id',
|
'id',
|
||||||
'tco_pid' => 'pid',
|
'tco_id',
|
||||||
|
'tco_pid',
|
||||||
'name',
|
'name',
|
||||||
])
|
])
|
||||||
->withSearch(['name'], [
|
->withSearch(['name'], [
|
||||||
@@ -25,10 +26,10 @@ class ProductTcoCategory
|
|||||||
])
|
])
|
||||||
->language(request()->lang_id)
|
->language(request()->lang_id)
|
||||||
->enabled()
|
->enabled()
|
||||||
->order(['id' => 'asc'])
|
->order(['tco_id' => 'asc'])
|
||||||
->select()
|
->select()
|
||||||
->toArray();
|
->toArray();
|
||||||
|
|
||||||
return success('获取成功', array_to_tree($categorys, 0, 'pid', false));
|
return success('获取成功', array_to_tree($categorys, 0, 'tco_pid', false, true, 'tco_id'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -342,6 +342,18 @@ class System
|
|||||||
'url' => (string)url('/index/topic/nas/download')
|
'url' => (string)url('/index/topic/nas/download')
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'id' => 8,
|
||||||
|
'name' => '电力品线专题',
|
||||||
|
'url' => '',
|
||||||
|
'children' => [
|
||||||
|
[
|
||||||
|
'id' => 81,
|
||||||
|
'name' => '首页',
|
||||||
|
'url' => (string)url('/index/topic/power_prodline/index')
|
||||||
|
],
|
||||||
|
]
|
||||||
]
|
]
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
@@ -349,7 +361,7 @@ class System
|
|||||||
// 根据系统页面url获取回显数据项
|
// 根据系统页面url获取回显数据项
|
||||||
static public function getEchoDataBySystemPageUrl($link_to, $link)
|
static public function getEchoDataBySystemPageUrl($link_to, $link)
|
||||||
{
|
{
|
||||||
if ('custom' == $link_to) return [];
|
if ('custom' == $link_to || empty($link)) return [];
|
||||||
|
|
||||||
$data = [];
|
$data = [];
|
||||||
$params = [];
|
$params = [];
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ use app\admin\model\v1\SysAttachmentUploadRecordModel;
|
|||||||
use Intervention\Image\ImageManager;
|
use Intervention\Image\ImageManager;
|
||||||
use Intervention\Image\Typography\FontFactory;
|
use Intervention\Image\Typography\FontFactory;
|
||||||
use think\facade\Filesystem;
|
use think\facade\Filesystem;
|
||||||
|
use filesystem\Qiniu;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 文件上传控制器
|
* 文件上传控制器
|
||||||
@@ -31,7 +32,7 @@ class Upload
|
|||||||
$max_size = strtobytes(env('ADMIN_API.MAX_IMAGE_SIZE', '1mb'));
|
$max_size = strtobytes(env('ADMIN_API.MAX_IMAGE_SIZE', '1mb'));
|
||||||
$validate = validate([
|
$validate = validate([
|
||||||
'module' => 'require|max:64',
|
'module' => 'require|max:64',
|
||||||
'image' => "fileSize:$max_size|fileExt:jpg,jpeg,png,gif"
|
'image' => "fileSize:$max_size|fileExt:jpg,jpeg,png,gif,webp"
|
||||||
]);
|
]);
|
||||||
if (!$validate->check(['module' => $param['module'], 'image' => $file])) {
|
if (!$validate->check(['module' => $param['module'], 'image' => $file])) {
|
||||||
return error($validate->getError());
|
return error($validate->getError());
|
||||||
@@ -45,17 +46,39 @@ class Upload
|
|||||||
// 获取图片上传配置
|
// 获取图片上传配置
|
||||||
list(
|
list(
|
||||||
'filename_keep' => $filename_keep,
|
'filename_keep' => $filename_keep,
|
||||||
'filemd5_unique' => $filemd5_unique
|
'filemd5_unique' => $filemd5_unique,
|
||||||
|
'filetype_to' => $filetype_to,
|
||||||
) = $this->getUploadOptions('upload_image');
|
) = $this->getUploadOptions('upload_image');
|
||||||
|
|
||||||
|
// 获取文件大小
|
||||||
|
$file_size = $file->getSize();
|
||||||
|
// 获取文件mime类型
|
||||||
|
$mime_type = $file->getOriginalMime();
|
||||||
|
|
||||||
// 是否需要根据文件MD5值检查文件是否已存在
|
// 是否需要根据文件MD5值检查文件是否已存在
|
||||||
$image_model = $filemd5_unique ? SysImageUploadRecordModel::md5($filemd5)->find() : null;
|
$image_model = $filemd5_unique ? SysImageUploadRecordModel::md5($filemd5)->find() : null;
|
||||||
if (is_null($image_model)) {
|
if (is_null($image_model)) {
|
||||||
// 检查是否需要保留原文件名生成器
|
// 检查是否需要保留原文件名生成器
|
||||||
$name_rule = fn() => $filename_keep ? $this->filenameGenerator($file) : null;
|
$name_rule = fn() => $filename_keep ? $this->filenameGenerator($file) : null;
|
||||||
$filename = Filesystem::disk('image')->putFile($param['module'], $file, $name_rule());
|
|
||||||
// 处理图片
|
// 处理图片
|
||||||
$image_manager = ImageManager::imagick();
|
$image_manager = ImageManager::gd();
|
||||||
$image = $image_manager->read('.' . $storage . '/' . $filename);
|
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(
|
list(
|
||||||
@@ -126,15 +149,15 @@ class Upload
|
|||||||
$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 = $filename;
|
$image_model->image_path = $storage . '/' . $filename;
|
||||||
$image_model->image_thumb = $thumb_filename;
|
$image_model->image_thumb = $storage . '/' . $thumb_filename;
|
||||||
$image_model->file_size = $file->getSize();
|
$image_model->file_size = $file_size;
|
||||||
$image_model->file_type = $file->getOriginalMime();
|
$image_model->file_type = $mime_type;
|
||||||
$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()) {
|
||||||
@@ -143,8 +166,8 @@ class Upload
|
|||||||
}
|
}
|
||||||
|
|
||||||
return success('操作成功', [
|
return success('操作成功', [
|
||||||
'path' => $storage . '/' . $image_model->image_path,
|
'path' => $image_model->image_path,
|
||||||
'thumb_path' => $storage . '/' . $image_model->image_thumb,
|
'thumb_path' => $image_model->image_thumb,
|
||||||
'filemd5' => $image_model->file_md5,
|
'filemd5' => $image_model->file_md5,
|
||||||
'filesha1' => $image_model->file_sha1
|
'filesha1' => $image_model->file_sha1
|
||||||
]);
|
]);
|
||||||
@@ -154,6 +177,30 @@ 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("上传目标目录不可用");
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* 文件名生成回调
|
* 文件名生成回调
|
||||||
*
|
*
|
||||||
@@ -175,10 +222,12 @@ class Upload
|
|||||||
$config_model = new \app\admin\controller\v1\SiteConfig;
|
$config_model = new \app\admin\controller\v1\SiteConfig;
|
||||||
$config = $config_model->getByGroupUniqueLabel('upload');
|
$config = $config_model->getByGroupUniqueLabel('upload');
|
||||||
$options = data_get($config, $module, []);
|
$options = data_get($config, $module, []);
|
||||||
throw_if(empty($options), '上传配置错误');
|
|
||||||
return [
|
return [
|
||||||
'filename_keep' => (int)data_get($options, 'filename_keep.value', 0) == 1,
|
'filename_keep' => (int)data_get($options, 'filename_keep.value', 0) == 1,
|
||||||
'filemd5_unique' => (int)data_get($options, 'filemd5_unique.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'),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
@@ -220,7 +269,7 @@ class Upload
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* 计算文体水印偏移量
|
* 计算文本水印偏移量
|
||||||
*
|
*
|
||||||
* @param string $position
|
* @param string $position
|
||||||
* @param integer $offset_x
|
* @param integer $offset_x
|
||||||
@@ -298,20 +347,35 @@ class Upload
|
|||||||
// 获取视频上传配置
|
// 获取视频上传配置
|
||||||
list(
|
list(
|
||||||
'filename_keep' => $filename_keep,
|
'filename_keep' => $filename_keep,
|
||||||
'filemd5_unique' => $filemd5_unique
|
'filemd5_unique' => $filemd5_unique,
|
||||||
|
'save_to' => $save_to,
|
||||||
) = $this->getUploadOptions('upload_video');
|
) = $this->getUploadOptions('upload_video');
|
||||||
// 是否需要根据文件MD5值检查文件是否已存在
|
// 是否需要根据文件MD5值检查文件是否已存在
|
||||||
$video = $filemd5_unique ? SysVideoUploadRecordModel::md5($filemd5)->find() : null;
|
$video = $filemd5_unique ? SysVideoUploadRecordModel::md5($filemd5)->find() : null;
|
||||||
if (is_null($video)) {
|
if (is_null($video)) {
|
||||||
|
// 保存位置配置 key
|
||||||
|
$disk = 'video';
|
||||||
// 检查是否需要保留原文件名
|
// 检查是否需要保留原文件名
|
||||||
$name_rule = fn() => $filename_keep ? $this->filenameGenerator($file) : null;
|
$name_rule = fn() => $filename_keep ? $this->filenameGenerator($file) : null;
|
||||||
$filename = Filesystem::disk('video')->putFile($param['module'], $file, $name_rule());
|
|
||||||
|
// 保存到七牛云
|
||||||
|
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 = $filename;
|
$video->video_path = $video_path;
|
||||||
$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;
|
||||||
@@ -322,7 +386,7 @@ class Upload
|
|||||||
}
|
}
|
||||||
|
|
||||||
return success('上传成功', [
|
return success('上传成功', [
|
||||||
'path' => $storage . '/' . $video->video_path,
|
'path' => $video->video_path,
|
||||||
'file_md5' => $video->file_md5,
|
'file_md5' => $video->file_md5,
|
||||||
'file_sha1' => $video->file_sha1
|
'file_sha1' => $video->file_sha1
|
||||||
]);
|
]);
|
||||||
@@ -346,31 +410,48 @@ 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,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,webp,ttf"
|
||||||
]);
|
]);
|
||||||
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();
|
||||||
|
|
||||||
// 获取附件上传配置
|
// 获取附件上传配置
|
||||||
list(
|
list(
|
||||||
'filename_keep' => $filename_keep,
|
'filename_keep' => $filename_keep,
|
||||||
'filemd5_unique' => $filemd5_unique
|
'filemd5_unique' => $filemd5_unique,
|
||||||
|
'save_to' => $save_to
|
||||||
) = $this->getUploadOptions('upload_attachment');
|
) = $this->getUploadOptions('upload_attachment');
|
||||||
// 是否需要根据文件MD5值检查文件是否已存在
|
// 是否需要根据文件MD5值检查文件是否已存在
|
||||||
$attachment = $filemd5_unique ? SysAttachmentUploadRecordModel::md5($filemd5)->find() : null;
|
$attachment = $filemd5_unique ? SysAttachmentUploadRecordModel::md5($filemd5)->find() : null;
|
||||||
if (is_null($attachment)) {
|
if (is_null($attachment)) {
|
||||||
|
// 保存位置配置 key
|
||||||
|
$disk = 'public';
|
||||||
// 检查是否需要保留原文件名
|
// 检查是否需要保留原文件名
|
||||||
$name_rule = fn() => $filename_keep ? $this->filenameGenerator($file) : null;
|
$name_rule = fn() => $filename_keep ? $this->filenameGenerator($file) : null;
|
||||||
$filename = Filesystem::disk('public')->putFile('attachments', $file, $name_rule());
|
|
||||||
|
|
||||||
// 保存视频
|
// 保存到七牛云
|
||||||
|
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 = $filename;
|
$attachment->attachment_path = $attachment_path;
|
||||||
$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;
|
||||||
@@ -380,9 +461,8 @@ class Upload
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$storage = config('filesystem.disks.public.url');
|
|
||||||
return success('上传成功', [
|
return success('上传成功', [
|
||||||
'path' => $storage . '/' . $attachment->attachment_path,
|
'path' => $attachment->attachment_path,
|
||||||
'file_md5' => $attachment->file_md5,
|
'file_md5' => $attachment->file_md5,
|
||||||
'file_sha1' => $attachment->file_sha1
|
'file_sha1' => $attachment->file_sha1
|
||||||
]);
|
]);
|
||||||
|
|||||||
@@ -209,9 +209,6 @@ 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',
|
||||||
@@ -230,13 +227,9 @@ 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, $image_path, $video_path) {
|
->each(function ($item) use($domain) {
|
||||||
if (!empty($item->image)) {
|
$item->image = !empty($item->image) ? url_join($domain, $item->image) : '';
|
||||||
$item->image = $domain . $image_path . '/' . $item->image;
|
$item->video = !empty($item->video) ? url_join($domain, $item->video) : '';
|
||||||
}
|
|
||||||
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;
|
||||||
|
|||||||
@@ -29,6 +29,12 @@ class ProductCategoryModel extends ProductCategoryBaseModel
|
|||||||
$query->where('language_id', '=', $value);
|
$query->where('language_id', '=', $value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 所属产品目录分类id查询
|
||||||
|
public function scopeTcoId($query, $value)
|
||||||
|
{
|
||||||
|
$query->where('related_tco_category', '=', $value);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据是否显示查询
|
* 根据是否显示查询
|
||||||
* @param $query
|
* @param $query
|
||||||
|
|||||||
@@ -80,6 +80,12 @@ class ProductModel extends ProductBaseModel
|
|||||||
$query->where('category_id', '=', $value);
|
$query->where('category_id', '=', $value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 规格型号查询
|
||||||
|
public function scopeSpu($query, $spu)
|
||||||
|
{
|
||||||
|
$query->where('spu', '=', $spu);
|
||||||
|
}
|
||||||
|
|
||||||
// 启用状态查询
|
// 启用状态查询
|
||||||
public function scopeEnabled($query)
|
public function scopeEnabled($query)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -23,6 +23,18 @@ class ProductTcoCategoryModel extends ProductTcoCategoryBaseModel
|
|||||||
$query->where('language_id', '=', $value);
|
$query->where('language_id', '=', $value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 根据 tco_id 查询
|
||||||
|
public function scopeTcoId($query, $value)
|
||||||
|
{
|
||||||
|
$query->where('tco_id', '=', $value);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 根据ERP Code查询
|
||||||
|
public function scopeErpCode($query, $value)
|
||||||
|
{
|
||||||
|
$query->where('erp_code', '=', $value);
|
||||||
|
}
|
||||||
|
|
||||||
// 按分类名称搜索
|
// 按分类名称搜索
|
||||||
public function searchNameAttr($query, $value, $data)
|
public function searchNameAttr($query, $value, $data)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -616,6 +616,12 @@ 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!';
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -64,19 +64,36 @@ 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();
|
||||||
$children = Db::query(
|
if (env('DB_VERSION', '5') == '8') {
|
||||||
preg_replace(
|
$children = Db::query(
|
||||||
'/\s+/u',
|
preg_replace(
|
||||||
' ',
|
'/\s+/u',
|
||||||
"WITH RECURSIVE article_tree_by AS (
|
' ',
|
||||||
SELECT a.id, a.pid FROM $table_name a WHERE a.id = {$data['id']}
|
"WITH RECURSIVE article_tree_by AS (
|
||||||
UNION ALL
|
SELECT a.id, a.pid FROM $table_name a WHERE a.id = {$data['id']}
|
||||||
SELECT k.id, k.pid FROM $table_name k INNER JOIN article_tree_by t ON t.id = k.pid
|
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 <> {$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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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:255',
|
'seo_title' => 'max:512',
|
||||||
'seo_keywords' => 'max:255',
|
'seo_keywords' => 'max:512',
|
||||||
'seo_desc' => 'max:255'
|
'seo_desc' => 'max:1024'
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -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标题长度不能超过255个字符',
|
'seo_title.max' => 'SEO标题长度不能超过512个字符',
|
||||||
'seo_keywords.max' => 'SEO关键字长度不能超过255个字符',
|
'seo_keywords.max' => 'SEO关键字长度不能超过512个字符',
|
||||||
'seo_desc.max' => 'SEO描述长度不能超过255个字符'
|
'seo_desc.max' => 'SEO描述长度不能超过1024个字符'
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -49,19 +49,36 @@ 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();
|
||||||
$children = Db::query(
|
if (env('DB_VERSION', '5') == '8') {
|
||||||
preg_replace(
|
$children = Db::query(
|
||||||
'/\s+/u',
|
preg_replace(
|
||||||
' ',
|
'/\s+/u',
|
||||||
"WITH RECURSIVE attachment_tree_by AS (
|
' ',
|
||||||
SELECT a.id, a.pid FROM $table_name a WHERE a.id = {$data['id']}
|
"WITH RECURSIVE attachment_tree_by AS (
|
||||||
UNION ALL
|
SELECT a.id, a.pid FROM $table_name a WHERE a.id = {$data['id']}
|
||||||
SELECT k.id, k.pid FROM $table_name k INNER JOIN attachment_tree_by t ON t.id = k.pid
|
UNION ALL
|
||||||
|
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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -61,19 +61,36 @@ 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();
|
||||||
$children = Db::query(
|
if (env('DB_VERSION', '5') == '8') {
|
||||||
preg_replace(
|
$children = Db::query(
|
||||||
'/\s+/u',
|
preg_replace(
|
||||||
' ',
|
'/\s+/u',
|
||||||
"WITH RECURSIVE tree_by AS (
|
' ',
|
||||||
SELECT a.id, a.pid FROM $table_name a WHERE a.id = {$data['id']}
|
"WITH RECURSIVE tree_by AS (
|
||||||
UNION ALL
|
SELECT a.id, a.pid FROM $table_name a WHERE a.id = {$data['id']}
|
||||||
SELECT k.id, k.pid FROM $table_name k INNER JOIN tree_by t ON t.id = k.pid
|
UNION ALL
|
||||||
|
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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,16 +15,17 @@ class SysBannerItemValidate extends Validate
|
|||||||
*/
|
*/
|
||||||
protected $rule = [
|
protected $rule = [
|
||||||
'id' => 'require|integer',
|
'id' => 'require|integer',
|
||||||
'banner_id' => 'require|integer',
|
'banner_id' => 'require|integer|gt:0',
|
||||||
'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,system_page,custom',
|
||||||
'link' => 'max:255',
|
'link' => 'max:510',
|
||||||
'sort' => 'integer',
|
'sort' => 'integer',
|
||||||
'status' => 'in:-1,1'
|
'status' => 'in:-1,1'
|
||||||
];
|
];
|
||||||
@@ -40,6 +41,7 @@ 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个字符',
|
||||||
@@ -47,11 +49,12 @@ 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,system_page,custom中之一',
|
||||||
'link.max' => '链接最多不能超过255个字符',
|
'link.max' => '链接最多不能超过512个字符',
|
||||||
'sort.integer' => '排序值必须是整数',
|
'sort.integer' => '排序值必须是整数',
|
||||||
'status.in' => '状态必须是-1或1'
|
'status.in' => '状态必须是-1或1'
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -74,19 +74,36 @@ 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();
|
||||||
$children = Db::query(
|
if (env('DB_VERSION', '5') == '8') {
|
||||||
preg_replace(
|
$children = Db::query(
|
||||||
'/\s+/u',
|
preg_replace(
|
||||||
' ',
|
'/\s+/u',
|
||||||
"WITH RECURSIVE menu_tree_by AS (
|
' ',
|
||||||
SELECT a.id, a.pid FROM $table_name a WHERE a.id = {$data['id']}
|
"WITH RECURSIVE menu_tree_by AS (
|
||||||
UNION ALL
|
SELECT a.id, a.pid FROM $table_name a WHERE a.id = {$data['id']}
|
||||||
SELECT k.id, k.pid FROM $table_name k INNER JOIN menu_tree_by t ON t.id = k.pid
|
UNION ALL
|
||||||
|
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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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:64',
|
'name' => 'require|max:128',
|
||||||
'desc' => 'max:255',
|
'desc' => 'max:512',
|
||||||
'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' => '名称不能超过64个字符',
|
'name.max' => '名称不能超过128个字符',
|
||||||
'desc.max' => '描述不能超过255个字符',
|
'desc.max' => '描述不能超过512个字符',
|
||||||
'image.max' => '图片不能超过125个字符',
|
'image.max' => '图片不能超过125个字符',
|
||||||
'video.max' => '视频不能超过125个字符',
|
'video.max' => '视频不能超过125个字符',
|
||||||
'link.url' => '链接格式错误',
|
'link.url' => '链接格式错误',
|
||||||
|
|||||||
@@ -61,6 +61,9 @@ 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,
|
||||||
@@ -290,14 +293,15 @@ 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', '>', 15789)
|
->where('id', 'in', array_unique(array_column($arr, 'cod_product_id')))
|
||||||
->order(['id' => 'asc'])
|
->order(['id' => 'asc'])
|
||||||
->cursor();
|
->cursor();
|
||||||
|
|
||||||
@@ -374,7 +378,16 @@ 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,
|
||||||
];
|
];
|
||||||
// 保存产品数据
|
// 保存产品数据
|
||||||
$id = Db::name('product')->insertGetId($item);
|
$prod = Db::name('product')
|
||||||
|
->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'])) {
|
||||||
@@ -387,7 +400,21 @@ class DataMigration extends Command
|
|||||||
'value' => $p['desc_desc']
|
'value' => $p['desc_desc']
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
Db::name('product_params')->insertAll($prarms);
|
$old_params = Db::name('product_params')
|
||||||
|
->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数据
|
||||||
@@ -444,7 +471,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;
|
||||||
@@ -468,7 +495,7 @@ class DataMigration extends Command
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
$attr_arr = [
|
$attr_arr = [
|
||||||
'attr_id' => $attrs_map[$v['country_code']]['颜色'],
|
'attr_id' => $attrs_map[$v['country_code']][$v['country_code'] == 'ZH' ? '颜色' : 'Color'],
|
||||||
'attr_value' => $attr_value,
|
'attr_value' => $attr_value,
|
||||||
];
|
];
|
||||||
if (
|
if (
|
||||||
@@ -514,7 +541,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']]['颜色'],
|
'attr_id' => $attrs_map[$v['country_code']][$v['country_code'] == 'ZH' ? '颜色' : 'Color'],
|
||||||
'attr_value' => $ti['image_color'],
|
'attr_value' => $ti['image_color'],
|
||||||
]],
|
]],
|
||||||
'pkey' => $tpkey
|
'pkey' => $tpkey
|
||||||
@@ -575,6 +602,7 @@ 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']??'',
|
||||||
@@ -584,6 +612,7 @@ 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'],
|
||||||
@@ -601,7 +630,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'], 0, round(microtime(true) - $start, 2) . 's'));
|
$this->println(sprintf('迁移产品ID:%s => %s 【耗时:%s】', $v['id'], $id, round(microtime(true) - $start, 2) . 's'));
|
||||||
} catch (\Throwable $th) {
|
} catch (\Throwable $th) {
|
||||||
Db::rollback();
|
Db::rollback();
|
||||||
file_put_contents(
|
file_put_contents(
|
||||||
@@ -694,9 +723,12 @@ 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();
|
||||||
|
|
||||||
@@ -745,7 +777,16 @@ 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
|
||||||
];
|
];
|
||||||
$id = Db::name('article')->insertGetId($item);
|
$ret = Db::name('article')
|
||||||
|
->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));
|
||||||
}
|
}
|
||||||
@@ -779,7 +820,15 @@ 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']
|
||||||
];
|
];
|
||||||
Db::name('faq')->insert($item);
|
$ret = Db::name('faq')
|
||||||
|
->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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -881,7 +930,8 @@ 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();
|
||||||
@@ -921,7 +971,16 @@ 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
|
||||||
];
|
];
|
||||||
Db::name('video')->insert($item);
|
$ret = Db::name('video')
|
||||||
|
->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']);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -929,7 +988,7 @@ class DataMigration extends Command
|
|||||||
|
|
||||||
class UploadMannager
|
class UploadMannager
|
||||||
{
|
{
|
||||||
const UPLOAD_BASE_API = 'http://dev.ow.f2b211.com';
|
const UPLOAD_BASE_API = 'http://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';
|
||||||
@@ -942,7 +1001,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');
|
||||||
}
|
}
|
||||||
|
|
||||||
// 下载图片
|
// 下载图片
|
||||||
@@ -1062,6 +1121,7 @@ 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);
|
||||||
|
|||||||
42
app/command/OpenApiMgr/AddClient.php
Normal file
42
app/command/OpenApiMgr/AddClient.php
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
<?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");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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)
|
function array_to_tree(array $data, int $pid, string $with = 'pid', int|bool $level = 1, bool $keep_pid = true, $with_ref = 'id')
|
||||||
{
|
{
|
||||||
$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['id'], $with, $lv, $keep_pid);
|
$children = array_to_tree($data, $item[$with_ref], $with, $lv, $keep_pid, $with_ref);
|
||||||
if ($children) {
|
if ($children) {
|
||||||
$item['children'] = $children;
|
$item['children'] = $children;
|
||||||
}
|
}
|
||||||
@@ -144,4 +144,91 @@ if (!function_exists('thumb')) {
|
|||||||
|
|
||||||
return mb_substr($url, 0, $idx, 'utf-8') . '_thumb' . mb_substr($url, $idx, $len - $idx, '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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -17,21 +17,24 @@ 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',
|
||||||
'desc' => 'string',
|
'short_title' => 'string',
|
||||||
'desc_txt_color' => 'string',
|
'short_title_txt_color' => 'string',
|
||||||
'type' => 'string',
|
'desc' => 'string',
|
||||||
'image' => 'string',
|
'desc_txt_color' => 'string',
|
||||||
'video' => 'string',
|
'type' => 'string',
|
||||||
'link_to' => 'string',
|
'image' => 'string',
|
||||||
'link' => 'string',
|
'extra_image' => 'string',
|
||||||
'sort' => 'int',
|
'video' => 'string',
|
||||||
'status' => 'int',
|
'link_to' => 'string',
|
||||||
'created_at' => 'datetime',
|
'link' => 'string',
|
||||||
'updated_at' => 'datetime',
|
'sort' => 'int',
|
||||||
'deleted_at' => 'datetime'
|
'status' => 'int',
|
||||||
|
'created_at' => 'datetime',
|
||||||
|
'updated_at' => 'datetime',
|
||||||
|
'deleted_at' => 'datetime'
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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' => 'int',
|
'permission' => 'string',
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -111,3 +111,133 @@ if (!function_exists('lang_i18n')) {
|
|||||||
return Lang::get($lang_key, $vars, $lang);
|
return Lang::get($lang_key, $vars, $lang);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!function_exists('date_format_i18n')) {
|
||||||
|
/**
|
||||||
|
* 格式化日期时间为指定语言
|
||||||
|
* @param int|string $datetime 要格式化的日期时间字符串
|
||||||
|
* @param string $lang 语言标识
|
||||||
|
* @param bool $keep_time 是否保留时间
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function date_format_i18n(int|string|null $datetime, string $lang = '', bool $keep_time = false): string
|
||||||
|
{
|
||||||
|
// 处理语言标识,若未提供则使用当前语言设置,并转换为小写
|
||||||
|
$lang = $lang ?: Lang::getLangSet();
|
||||||
|
$lang = strtolower($lang);
|
||||||
|
|
||||||
|
// 处理日期时间输入
|
||||||
|
if (is_numeric($datetime)) {
|
||||||
|
// 若输入为数字,直接作为时间戳处理
|
||||||
|
$timestamp = (int)$datetime;
|
||||||
|
} elseif (is_string($datetime)) {
|
||||||
|
// 尝试将字符串转换为时间戳
|
||||||
|
$timestamp = strtotime($datetime);
|
||||||
|
if ($timestamp === false) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
// 根据$datetime传值决定格式
|
||||||
|
$date_parts = [];
|
||||||
|
if (is_numeric($datetime)) {
|
||||||
|
$date_str = date('Y-m-d', $timestamp);
|
||||||
|
$date_parts = explode('-', $date_str);
|
||||||
|
} elseif (is_string($datetime)) {
|
||||||
|
if (preg_match('/^\d{4}$/', $datetime)) {
|
||||||
|
$date_parts = [$datetime];
|
||||||
|
} elseif (preg_match('/^\d{4}-\d{1,2}$/', $datetime)) {
|
||||||
|
$date_parts = explode('-', $datetime);
|
||||||
|
} elseif (preg_match('/^\d{4}-\d{1,2}-\d{1,2}(.{1,9})?$/', $datetime)) {
|
||||||
|
$date_parts = explode('-', $datetime);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 定义默认格式
|
||||||
|
$fmt = '';
|
||||||
|
|
||||||
|
// 根据语言和日期部分数量设置日期格式
|
||||||
|
$format = [
|
||||||
|
'zh-cn' => [0 => '', 1 => 'Y', 2 => 'Y-m', 3 => 'Y-m-d'],
|
||||||
|
'en-us' => [0 => '', 1 => 'Y', 2 => 'F Y', 3 => 'F j, Y'],
|
||||||
|
'default' => [0 => '', 1 => 'Y', 2 => 'Y-m', 3 => 'Y-m-d']
|
||||||
|
];
|
||||||
|
$fmt = $format[$lang][count($date_parts)] ?? $format['default'][count($date_parts)];
|
||||||
|
|
||||||
|
// 若需要保留时间
|
||||||
|
if ($keep_time) {
|
||||||
|
if ($lang === 'en-us') {
|
||||||
|
$fmt .= ', g:i A';
|
||||||
|
} else {
|
||||||
|
$fmt .= ' H:i:s';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return date($fmt, $timestamp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!function_exists('get_platform')) {
|
||||||
|
/**
|
||||||
|
* 获取平台
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function get_platform(): string
|
||||||
|
{
|
||||||
|
$detect = new \Detection\MobileDetect();
|
||||||
|
$platform = 'pc';
|
||||||
|
|
||||||
|
if ($detect->isMobile() || $detect->isTablet()) {
|
||||||
|
$platform = 'mobile';
|
||||||
|
} else {
|
||||||
|
// 在非移动端环境,根据配置规则判断是否要显示移动端
|
||||||
|
$view_cfg = $view_cfg = [
|
||||||
|
'rule' => env('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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ return [
|
|||||||
// 扩展语言包
|
// 扩展语言包
|
||||||
'extend_list' => [
|
'extend_list' => [
|
||||||
'en-us' => [
|
'en-us' => [
|
||||||
app()->getAppPath() . '/lang/en-us/' . (request()->isMobile() ? 'mobile' : 'pc') . '.php',
|
app()->getAppPath() . '/lang/en-us/' . get_platform() . '.php',
|
||||||
app()->getAppPath() . '/lang/en-us/validate.php',
|
app()->getAppPath() . '/lang/en-us/validate.php',
|
||||||
],
|
],
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -3,13 +3,7 @@
|
|||||||
// | 模板设置
|
// | 模板设置
|
||||||
// +----------------------------------------------------------------------
|
// +----------------------------------------------------------------------
|
||||||
|
|
||||||
use Detection\MobileDetect;
|
$view_device_name = get_platform();
|
||||||
|
|
||||||
$detect = new MobileDetect();
|
|
||||||
$view_device_name = 'pc';
|
|
||||||
if ($detect->isMobile() || $detect->isTablet()) {
|
|
||||||
$view_device_name = 'mobile';
|
|
||||||
}
|
|
||||||
|
|
||||||
return [
|
return [
|
||||||
// 模板引擎类型使用Think
|
// 模板引擎类型使用Think
|
||||||
|
|||||||
@@ -93,12 +93,6 @@ class Article extends Common
|
|||||||
])
|
])
|
||||||
->bypk($id)
|
->bypk($id)
|
||||||
->find();
|
->find();
|
||||||
if (!$detail->isEmpty()) {
|
|
||||||
$detail->release_time = date('Y-m-d H:i:s', strtotime($detail->release_time));
|
|
||||||
if (cookie('think_lang') == 'en-us') {
|
|
||||||
$detail->release_time = 'Posted on ' . date('F j, Y', strtotime($detail->release_time));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
View::assign('detail', $detail);
|
View::assign('detail', $detail);
|
||||||
|
|
||||||
// 获取分享配置相关
|
// 获取分享配置相关
|
||||||
@@ -121,13 +115,18 @@ class Article extends Common
|
|||||||
View::assign('comments', $comments);
|
View::assign('comments', $comments);
|
||||||
|
|
||||||
// 获取倒序或发布时间倒序3篇文章做为推荐文章
|
// 获取倒序或发布时间倒序3篇文章做为推荐文章
|
||||||
$recommends = ArticleModel::field([
|
$category_model = new ArticleCategoryModel;
|
||||||
|
$parent_id = $category_model->bypk($detail['category_id'])->value('pid');
|
||||||
|
$categorys = $category_model->child($parent_id)->column('id');
|
||||||
|
$recommends = ArticleModel::field([
|
||||||
'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();
|
||||||
@@ -171,9 +170,9 @@ class Article extends Common
|
|||||||
]);
|
]);
|
||||||
$ret = ArticleLeaveMessageModel::create($data);
|
$ret = ArticleLeaveMessageModel::create($data);
|
||||||
if ($ret->isEmpty()) {
|
if ($ret->isEmpty()) {
|
||||||
return error(lang('留言提交失败'));
|
return error(lang('信息提交失败!'));
|
||||||
}
|
}
|
||||||
|
|
||||||
return success(lang('留言提交成功'));
|
return success(lang('信息已成功提交!'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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' => $param['keyword']??null])
|
->withSearch(['name'], ['name' => !empty($param['keyword']) ? trim($param['keyword']) : null])
|
||||||
->language($this->lang_id)
|
->language($this->lang_id)
|
||||||
->category($param['id']??null)
|
->category(!empty($param['id']) ? $param['id'] : $categorys[0]['id']??null)
|
||||||
->order(['sort' => 'asc', 'id' => 'desc'])
|
->order(['sort' => 'asc', 'id' => 'desc'])
|
||||||
->paginate([
|
->paginate([
|
||||||
'list_rows' => $param['size'],
|
'list_rows' => $param['size'],
|
||||||
@@ -59,6 +59,16 @@ 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());
|
||||||
|
|
||||||
@@ -109,9 +119,9 @@ class Attachment extends Common
|
|||||||
'video',
|
'video',
|
||||||
'link'
|
'link'
|
||||||
])
|
])
|
||||||
->withSearch(['name'], ['name' => $param['keyword']??null])
|
->withSearch(['name'], ['name' => !empty($param['keyword']) ? trim($param['keyword']) : null])
|
||||||
->language($this->lang_id)
|
->language($this->lang_id)
|
||||||
->category($param['id']??$video_categorys[0]['id']??null)
|
->category(!empty($param['id']) ? $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'],
|
||||||
@@ -122,6 +132,9 @@ 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);
|
||||||
|
|||||||
@@ -106,6 +106,7 @@ 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()) {
|
||||||
|
|||||||
@@ -45,14 +45,7 @@ class ContactUs extends Common
|
|||||||
$banner_map[$v->unique_label] = $v;
|
$banner_map[$v->unique_label] = $v;
|
||||||
}
|
}
|
||||||
$focus_image = data_get($banner_map, 'BANNER_6805e3d32dcc2')?->items->first()?->toArray();
|
$focus_image = data_get($banner_map, 'BANNER_6805e3d32dcc2')?->items->first()?->toArray();
|
||||||
$info_datas = data_get($banner_map, 'BANNER_6806090c1838f')?->items->each(function($item) {
|
$info_datas = data_get($banner_map, 'BANNER_6806090c1838f')?->items->toArray();
|
||||||
if (Str::contains($item->title, '<br/>')) {
|
|
||||||
$title = explode('<br/>', $item->title);
|
|
||||||
$item->title = $title[0];
|
|
||||||
$item->title_short = $title[1];
|
|
||||||
}
|
|
||||||
return $item;
|
|
||||||
})->toArray();
|
|
||||||
}
|
}
|
||||||
View::assign('focus_image', $focus_image);
|
View::assign('focus_image', $focus_image);
|
||||||
View::assign('info_datas', $info_datas);
|
View::assign('info_datas', $info_datas);
|
||||||
@@ -136,6 +129,7 @@ class ContactUs extends Common
|
|||||||
'corp_name',
|
'corp_name',
|
||||||
'email',
|
'email',
|
||||||
'phone',
|
'phone',
|
||||||
|
'website_url',
|
||||||
'business_type',
|
'business_type',
|
||||||
'enterprise_size',
|
'enterprise_size',
|
||||||
'address',
|
'address',
|
||||||
@@ -155,7 +149,7 @@ class ContactUs extends Common
|
|||||||
'email' => $form_data['email'],
|
'email' => $form_data['email'],
|
||||||
'phone' => $form_data['phone'],
|
'phone' => $form_data['phone'],
|
||||||
'referer_url' => request()->header('referer'),
|
'referer_url' => request()->header('referer'),
|
||||||
'website_url' => request()->header('host'),
|
'website_url' => $form_data['website_url'],
|
||||||
'business_type' => $form_data['business_type'],
|
'business_type' => $form_data['business_type'],
|
||||||
'enterprise_size' => $form_data['enterprise_size'],
|
'enterprise_size' => $form_data['enterprise_size'],
|
||||||
'address' => $form_data['address'],
|
'address' => $form_data['address'],
|
||||||
|
|||||||
@@ -104,7 +104,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', 'id' => 'desc'])
|
->order(['sort' => 'asc', 'created_at' => 'desc', '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 +126,7 @@ class Product extends Common
|
|||||||
->enabled(true)
|
->enabled(true)
|
||||||
->onSale(true)
|
->onSale(true)
|
||||||
->onShelves(true)
|
->onShelves(true)
|
||||||
->order(['sort' => 'asc', 'id' => 'desc'])
|
->order(['sort' => 'asc', 'created_at' => 'desc', 'id' => 'desc'])
|
||||||
->limit(5);
|
->limit(5);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -192,7 +192,7 @@ class Product extends Common
|
|||||||
->enabled(true)
|
->enabled(true)
|
||||||
->onSale(true)
|
->onSale(true)
|
||||||
->onShelves(true)
|
->onShelves(true)
|
||||||
->order(['sort' => 'asc', 'id' => 'desc'])
|
->order(['sort' => 'asc', 'created_at' => 'desc', 'id' => 'desc'])
|
||||||
->select();
|
->select();
|
||||||
if (!$products->isEmpty()) {
|
if (!$products->isEmpty()) {
|
||||||
// 获取sku信息
|
// 获取sku信息
|
||||||
@@ -223,7 +223,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 +231,7 @@ class Product extends Common
|
|||||||
$attr = $sku_attrs_map[$v['id']]?? [];
|
$attr = $sku_attrs_map[$v['id']]?? [];
|
||||||
if (!empty($attr)) {
|
if (!empty($attr)) {
|
||||||
foreach ($attr as $at) {
|
foreach ($attr as $at) {
|
||||||
if ($at['attr_name'] == '颜色') {
|
if (in_array($at['attr_name'], ['颜色', 'Color'])) {
|
||||||
$color_map[$v['product_id']][] = $at;
|
$color_map[$v['product_id']][] = $at;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -277,7 +277,7 @@ class Product extends Common
|
|||||||
'page/d' => 1,
|
'page/d' => 1,
|
||||||
'size/d' => 10
|
'size/d' => 10
|
||||||
]);
|
]);
|
||||||
$keywords = $param['keywords'] ?? '';
|
$keywords = !empty($param['keywords']) ? trim($param['keywords']) : '';
|
||||||
|
|
||||||
// 关键词搜索
|
// 关键词搜索
|
||||||
$products = ProductModel::field([
|
$products = ProductModel::field([
|
||||||
@@ -299,9 +299,10 @@ class Product extends Common
|
|||||||
'query' => request()->param()
|
'query' => request()->param()
|
||||||
])
|
])
|
||||||
->each(function ($item) use($keywords) {
|
->each(function ($item) use($keywords) {
|
||||||
$item['spu'] = str_replace($keywords, '<strong class="redpoint">'.$keywords.'</strong>', $item['spu']);
|
$replace = fn($txt) => '<strong class="redpoint">' . $txt . '</strong>';
|
||||||
$item['name'] = str_replace($keywords, '<strong class="redpoint">'.$keywords.'</strong>', $item['name']);
|
$item['spu'] = highlight_keywords($item['spu'], $keywords, $replace);
|
||||||
$item['short_name'] = str_replace($keywords, '<strong class="redpoint">'.$keywords.'</strong>', $item['short_name']);
|
$item['name'] = highlight_keywords($item['name'], $keywords, $replace);
|
||||||
|
$item['short_name'] = highlight_keywords($item['short_name'], $keywords, $replace);
|
||||||
return $item;
|
return $item;
|
||||||
});
|
});
|
||||||
View::assign('products', $products);
|
View::assign('products', $products);
|
||||||
@@ -373,10 +374,12 @@ 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'],
|
||||||
@@ -393,8 +396,11 @@ 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'])
|
->bindAttr('platform', ['platform_name' => 'platform', 'platform_sort' => 'sort'])
|
||||||
->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) {
|
||||||
@@ -457,9 +463,9 @@ class Product extends Common
|
|||||||
'message' => $post['message'],
|
'message' => $post['message'],
|
||||||
]);
|
]);
|
||||||
if ($ret->isEmpty()) {
|
if ($ret->isEmpty()) {
|
||||||
return error(lang('提交成功'));
|
return error(lang('提交失败'));
|
||||||
}
|
}
|
||||||
return success(lang('提交失败'));
|
return success(lang('提交成功'));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ class TopicNas extends Common
|
|||||||
// 获取国家/语言列表
|
// 获取国家/语言列表
|
||||||
$languages = $this->getLanguages();
|
$languages = $this->getLanguages();
|
||||||
// 输出国家/语言列表
|
// 输出国家/语言列表
|
||||||
if (request()->isMobile()) {
|
if (get_platform() == 'mobile') {
|
||||||
View::assign('header_languages', $languages);
|
View::assign('header_languages', $languages);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -192,6 +192,8 @@ 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'])
|
||||||
->order(['sort' => 'asc', 'id' => 'desc'])
|
->order(['sort' => 'asc', 'id' => 'desc'])
|
||||||
@@ -199,14 +201,48 @@ class TopicNas extends Common
|
|||||||
}])
|
}])
|
||||||
->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数据
|
||||||
@@ -245,19 +281,46 @@ 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'])->order(['sort' => 'asc', 'id' => 'desc']);
|
$query->field(['id', 'title', 'category_id'])->order(['sort' => 'asc', 'id' => 'desc']);
|
||||||
}])
|
}])
|
||||||
->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);
|
// dump($article_categorys->toArray());exit;
|
||||||
|
//查询三级分类
|
||||||
|
$article_categorys_new = [];
|
||||||
|
$article_categorys_two = [];
|
||||||
|
if (!$article_categorys->isEmpty()) {
|
||||||
|
foreach ($article_categorys->toArray() as $kk=>$vv) {
|
||||||
|
if ( $parent == $vv['pid'] ) {
|
||||||
|
$vv['child'] = '';
|
||||||
|
array_push($article_categorys_new,$vv);
|
||||||
|
} else {
|
||||||
|
$article_categorys_two[$vv['pid']][] = $vv;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( !empty($article_categorys_two) ) {
|
||||||
|
foreach ($article_categorys_new as &$vvv) {
|
||||||
|
$vvv['child'] = isset($article_categorys_two[$vvv['id']])?$article_categorys_two[$vvv['id']]:'';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// dump($article_categorys_new);exit;
|
||||||
|
// dump($article_categorys_two);exit;
|
||||||
|
|
||||||
|
View::assign('article_categorys', $article_categorys_new);
|
||||||
|
|
||||||
return View::fetch('help_detail');
|
return View::fetch('help_detail');
|
||||||
}
|
}
|
||||||
@@ -274,22 +337,39 @@ class TopicNas extends Common
|
|||||||
->value('id');
|
->value('id');
|
||||||
|
|
||||||
// 获取帮且中心分类子分类
|
// 获取帮且中心分类子分类
|
||||||
|
$categorys = [];
|
||||||
$table_name = (new ArticleCategoryModel)->getTable();
|
$table_name = (new ArticleCategoryModel)->getTable();
|
||||||
$categorys = \think\facade\Db::query(preg_replace(
|
if (env('DB_VERSION', '5') == '8') {
|
||||||
'/\s+/u',
|
$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}
|
"WITH RECURSIVE article_tree_by AS (
|
||||||
UNION ALL
|
SELECT a.id, a.pid FROM $table_name a WHERE a.id = {$parent}
|
||||||
SELECT k.id, k.pid FROM $table_name k INNER JOIN article_tree_by t ON t.id = k.pid
|
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}"
|
)
|
||||||
));
|
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', []);
|
if (empty($categorys)) return success('success', []);
|
||||||
|
|
||||||
// 获取文章数据
|
// 获取文章数据
|
||||||
$articles = ArticleModel::field([
|
$articles = ArticleModel::field([
|
||||||
'id',
|
'id',
|
||||||
|
'category_id',
|
||||||
'title'
|
'title'
|
||||||
])
|
])
|
||||||
->withSearch(['title'], [
|
->withSearch(['title'], [
|
||||||
@@ -298,8 +378,18 @@ class TopicNas extends Common
|
|||||||
->language($this->lang_id)
|
->language($this->lang_id)
|
||||||
->where('category_id', 'IN', array_column($categorys, '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->toArray());
|
return success('success', $articles_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
127
app/index/controller/TopicPowerProdline.php
Normal file
127
app/index/controller/TopicPowerProdline.php
Normal file
@@ -0,0 +1,127 @@
|
|||||||
|
<?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');
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -39,6 +39,7 @@ return [
|
|||||||
'电子邮箱' => 'Email',
|
'电子邮箱' => 'Email',
|
||||||
'您的电子邮件地址不会被公开' => 'Your email address will not be pulished.',
|
'您的电子邮件地址不会被公开' => 'Your email address will not be pulished.',
|
||||||
'留言内容' => 'Comment',
|
'留言内容' => 'Comment',
|
||||||
|
'评论' => 'COMMENT',
|
||||||
'提交留言' => 'POST COMMENT',
|
'提交留言' => 'POST COMMENT',
|
||||||
'你可能还喜欢' => 'Recommended for you',
|
'你可能还喜欢' => 'Recommended for you',
|
||||||
'链接复制成功' => 'Link copied successfully',
|
'链接复制成功' => 'Link copied successfully',
|
||||||
@@ -52,6 +53,7 @@ return [
|
|||||||
'product/search' => [
|
'product/search' => [
|
||||||
'搜索' => 'Search',
|
'搜索' => 'Search',
|
||||||
'请搜索' => 'Please search...',
|
'请搜索' => 'Please search...',
|
||||||
|
'暂无数据' => 'No data',
|
||||||
],
|
],
|
||||||
// 产品详情
|
// 产品详情
|
||||||
'product/detail' => [
|
'product/detail' => [
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
return [
|
return [
|
||||||
|
'首页' => 'Home',
|
||||||
'产品列表' => 'Products',
|
'产品列表' => 'Products',
|
||||||
'店铺' => 'Store',
|
'店铺' => 'Store',
|
||||||
'搜索记录' => 'Search History',
|
'搜索记录' => 'Search History',
|
||||||
@@ -35,6 +36,7 @@ return [
|
|||||||
'电子邮箱' => 'Email',
|
'电子邮箱' => 'Email',
|
||||||
'您的电子邮件地址不会被公开' => 'Your email address will not be pulished.',
|
'您的电子邮件地址不会被公开' => 'Your email address will not be pulished.',
|
||||||
'留言内容' => 'Comment',
|
'留言内容' => 'Comment',
|
||||||
|
'评论' => 'COMMENT',
|
||||||
'提交留言' => 'POST COMMENT',
|
'提交留言' => 'POST COMMENT',
|
||||||
'你可能还喜欢' => 'Recommended for you',
|
'你可能还喜欢' => 'Recommended for you',
|
||||||
'链接复制成功' => 'Link copied successfully',
|
'链接复制成功' => 'Link copied successfully',
|
||||||
@@ -159,6 +161,7 @@ return [
|
|||||||
// 产品 - 产品详情页
|
// 产品 - 产品详情页
|
||||||
'product/detail' => [
|
'product/detail' => [
|
||||||
'首页' => 'Home',
|
'首页' => 'Home',
|
||||||
|
'型号' => 'Product Model',
|
||||||
'产品详情' => 'Product Description',
|
'产品详情' => 'Product Description',
|
||||||
'相关产品' => 'Related Products',
|
'相关产品' => 'Related Products',
|
||||||
'发送查询' => 'Send Inquiry',
|
'发送查询' => 'Send Inquiry',
|
||||||
@@ -175,6 +178,11 @@ return [
|
|||||||
'提交' => 'SUBMIT',
|
'提交' => 'SUBMIT',
|
||||||
],
|
],
|
||||||
|
|
||||||
|
// 产品 - 搜索
|
||||||
|
'product/search' => [
|
||||||
|
'暂无数据' => 'No data',
|
||||||
|
],
|
||||||
|
|
||||||
// 产品 - 分类
|
// 产品 - 分类
|
||||||
'product/category' => [
|
'product/category' => [
|
||||||
'查看全部' => 'View All',
|
'查看全部' => 'View All',
|
||||||
|
|||||||
@@ -9,17 +9,20 @@ return [
|
|||||||
'姓名不能超过:rule个字符' => 'Name cannot exceed :rule characters',
|
'姓名不能超过:rule个字符' => 'Name cannot exceed :rule characters',
|
||||||
'电话号码不能为空' => 'Phone Number is required',
|
'电话号码不能为空' => 'Phone Number is required',
|
||||||
'电话号码不能超过:rule个字符' => 'Phone number cannot exceed :rule characters',
|
'电话号码不能超过:rule个字符' => 'Phone number cannot exceed :rule characters',
|
||||||
|
'感兴趣的产品种类不能为空' => 'Interested product categories is required',
|
||||||
'感兴趣的产品种类不能超过:rule个字符' => 'Interested product categories cannot exceed :rule characters',
|
'感兴趣的产品种类不能超过:rule个字符' => 'Interested product categories cannot exceed :rule characters',
|
||||||
'邮箱不能为空' => 'Email is required',
|
'邮箱不能为空' => 'Email is required',
|
||||||
'邮箱格式不正确' => 'Email format is incorrect',
|
'邮箱格式不正确' => 'Email format is incorrect',
|
||||||
'邮箱不能超过:rule个字符' => 'Email cannot exceed :rule characters',
|
'邮箱不能超过:rule个字符' => 'Email cannot exceed :rule characters',
|
||||||
'国家不能为空' => 'Country is required',
|
'国家不能为空' => 'Country is required',
|
||||||
'国家不能超过:rule个字符' => 'Country cannot exceed :rule characters',
|
'国家不能超过:rule个字符' => 'Country cannot exceed :rule characters',
|
||||||
|
'网址格式不正确' => 'URL format is incorrect',
|
||||||
'网址不能超过:rule个字符' => 'URL cannot exceed :rule characters',
|
'网址不能超过:rule个字符' => 'URL cannot exceed :rule characters',
|
||||||
'公司名称不能为空' => 'Company Name is required',
|
'公司名称不能为空' => 'Company Name is required',
|
||||||
'公司名称不能超过:rule个字符' => 'Company name cannot exceed :rule characters',
|
'公司名称不能超过:rule个字符' => 'Company name cannot exceed :rule characters',
|
||||||
'公司地址不能为空' => 'Company Address is required',
|
'公司地址不能为空' => 'Company Address is required',
|
||||||
'公司地址不能超过:rule个字符' => 'Company Address cannot exceed :rule characters',
|
'公司地址不能超过:rule个字符' => 'Company Address cannot exceed :rule characters',
|
||||||
|
'留言不能为空' => 'Message is required',
|
||||||
'企业规模不能为空' => 'Enterprise Size is required',
|
'企业规模不能为空' => 'Enterprise Size is required',
|
||||||
'企业规模不能超过:rule个字符' => 'Enterprise Size cannot exceed :rule characters',
|
'企业规模不能超过:rule个字符' => 'Enterprise Size cannot exceed :rule characters',
|
||||||
'业务类型不能为空' => 'Type of Business is required',
|
'业务类型不能为空' => 'Type of Business is required',
|
||||||
|
|||||||
@@ -2,7 +2,8 @@
|
|||||||
// 这是系统自动生成的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,
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -15,10 +15,7 @@ class ConfirmRequestFrom
|
|||||||
public function handle($request, \Closure $next)
|
public function handle($request, \Closure $next)
|
||||||
{
|
{
|
||||||
// 确认请求来源
|
// 确认请求来源
|
||||||
$request->from = 'pc';
|
$request->from = get_platform();
|
||||||
if ($request->isMobile()) {
|
|
||||||
$request->from = 'mobile';
|
|
||||||
}
|
|
||||||
|
|
||||||
return $next($request);
|
return $next($request);
|
||||||
}
|
}
|
||||||
|
|||||||
39
app/index/middleware/LoadLangPack.php
Normal file
39
app/index/middleware/LoadLangPack.php
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
<?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()] ?? '';
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -46,6 +46,38 @@ 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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -32,6 +32,11 @@ class ArticleModel extends ArticleBaseModel
|
|||||||
// 文章分类范围查询
|
// 文章分类范围查询
|
||||||
public function scopeCategory($query, $category)
|
public function scopeCategory($query, $category)
|
||||||
{
|
{
|
||||||
|
if (is_null($category)) return;
|
||||||
|
if (is_array($category)) {
|
||||||
|
$query->where('category_id', 'in', $category);
|
||||||
|
return;
|
||||||
|
}
|
||||||
$query->where('category_id', '=', $category);
|
$query->where('category_id', '=', $category);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -79,6 +79,6 @@ class ProductModel extends ProductBaseModel
|
|||||||
// 关键词搜索
|
// 关键词搜索
|
||||||
public function searchKeywordsAttr($query, string $keywords)
|
public function searchKeywordsAttr($query, string $keywords)
|
||||||
{
|
{
|
||||||
$query->whereRaw('BINARY spu LIKE "%' . $keywords . '%" OR BINARY name LIKE "%' . $keywords . '%" OR BINARY short_name LIKE "%' . $keywords . '%"');
|
$query->whereRaw('spu LIKE "%' . $keywords . '%" OR name LIKE "%' . $keywords . '%" OR short_name LIKE "%' . $keywords . '%"');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -105,6 +105,12 @@ 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');
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
// 数据迁移
|
// 数据迁移
|
||||||
|
|||||||
@@ -15,12 +15,12 @@ class ContactUsBulkBuyValidate extends Validate
|
|||||||
*/
|
*/
|
||||||
protected $rule = [
|
protected $rule = [
|
||||||
'corp_name' => 'require|max:128',
|
'corp_name' => 'require|max:128',
|
||||||
'url' => 'max:255',
|
'url' => 'url|max:255',
|
||||||
'first_name' => 'require|max:64',
|
'first_name' => 'require|max:64',
|
||||||
'last_name' => 'require|max:64',
|
'last_name' => 'require|max:64',
|
||||||
'email' => 'require|email|max:128',
|
'email' => 'require|email|max:128',
|
||||||
'phone' => 'max:32',
|
'phone' => 'max:32',
|
||||||
'interested' => 'max:255',
|
'interested' => 'require|max:255',
|
||||||
'message' => 'require|max:1024',
|
'message' => 'require|max:1024',
|
||||||
];
|
];
|
||||||
|
|
||||||
@@ -33,6 +33,7 @@ class ContactUsBulkBuyValidate extends Validate
|
|||||||
protected $message = [
|
protected $message = [
|
||||||
'corp_name.require' => '公司名称不能为空',
|
'corp_name.require' => '公司名称不能为空',
|
||||||
'corp_name.max' => '公司名称不能超过:rule个字符',
|
'corp_name.max' => '公司名称不能超过:rule个字符',
|
||||||
|
'url.url' => '网址格式不正确',
|
||||||
'url.max' => '网址不能超过:rule个字符',
|
'url.max' => '网址不能超过:rule个字符',
|
||||||
'first_name.require' => '名不能为空',
|
'first_name.require' => '名不能为空',
|
||||||
'first_name.max' => '名不能超过:rule个字符',
|
'first_name.max' => '名不能超过:rule个字符',
|
||||||
@@ -42,6 +43,7 @@ class ContactUsBulkBuyValidate extends Validate
|
|||||||
'email.email' => '邮箱格式不正确',
|
'email.email' => '邮箱格式不正确',
|
||||||
'email.max' => '邮箱不能超过:rule个字符',
|
'email.max' => '邮箱不能超过:rule个字符',
|
||||||
'phone.max' => '电话号码不能超过:rule个字符',
|
'phone.max' => '电话号码不能超过:rule个字符',
|
||||||
|
'interested.require' => '感兴趣的产品种类不能为空',
|
||||||
'interested.max' => '感兴趣的产品种类不能超过:rule个字符',
|
'interested.max' => '感兴趣的产品种类不能超过:rule个字符',
|
||||||
'message.require' => '留言内容不能为空',
|
'message.require' => '留言内容不能为空',
|
||||||
'message.max' => '留言内容不能超过:rule个字符',
|
'message.max' => '留言内容不能超过:rule个字符',
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ class ContactUsDistributorValidate extends Validate
|
|||||||
'corp_name' => 'require|max:64',
|
'corp_name' => 'require|max:64',
|
||||||
'email' => 'require|email|max:128',
|
'email' => 'require|email|max:128',
|
||||||
'phone' => 'require|max:64',
|
'phone' => 'require|max:64',
|
||||||
|
'website_url' => 'url|max:255',
|
||||||
'business_type' => 'require|max:128',
|
'business_type' => 'require|max:128',
|
||||||
'enterprise_size' => 'require|max:128',
|
'enterprise_size' => 'require|max:128',
|
||||||
'address' => 'require|max:255',
|
'address' => 'require|max:255',
|
||||||
@@ -37,6 +38,8 @@ class ContactUsDistributorValidate extends Validate
|
|||||||
'email.max' => '邮箱不能超过:rule个字符',
|
'email.max' => '邮箱不能超过:rule个字符',
|
||||||
'phone.require' => '电话号码不能为空',
|
'phone.require' => '电话号码不能为空',
|
||||||
'phone.max' => '电话号码不能超过:rule个字符',
|
'phone.max' => '电话号码不能超过:rule个字符',
|
||||||
|
'website_url.url' => '网址格式不正确',
|
||||||
|
'website_url.max' => '网址不能超过:rule个字符',
|
||||||
'business_type.require' => '业务类型不能为空',
|
'business_type.require' => '业务类型不能为空',
|
||||||
'business_type.max' => '业务类型不能超过:rule个字符',
|
'business_type.max' => '业务类型不能超过:rule个字符',
|
||||||
'enterprise_size.require' => '企业规模不能为空',
|
'enterprise_size.require' => '企业规模不能为空',
|
||||||
|
|||||||
@@ -21,10 +21,23 @@
|
|||||||
<div class="blog_detail">
|
<div class="blog_detail">
|
||||||
<div class="blog_title">
|
<div class="blog_title">
|
||||||
<h2>{$detail.title}</h2>
|
<h2>{$detail.title}</h2>
|
||||||
<p>{$detail.release_time}</p>
|
<p>{$detail.release_time|date_format_i18n}</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="blog_content">{$detail.content|raw}</div>
|
<div class="blog_content">{$detail.content|raw}</div>
|
||||||
</div>
|
</div>
|
||||||
|
{notempty name="comments"}
|
||||||
|
<div class="pl_box">
|
||||||
|
<div class="blog_pl">
|
||||||
|
<h3>{:lang_i18n('评论')}</h3>
|
||||||
|
{volist name="comments" id="cm"}
|
||||||
|
<div class="plitem">
|
||||||
|
<div class="pl_name">{$cm.name}:</div>
|
||||||
|
<div class="pl_text">{$cm.content}</div>
|
||||||
|
</div>
|
||||||
|
{/volist}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{/notempty}
|
||||||
<div class="share_box">
|
<div class="share_box">
|
||||||
{notempty name="share_config"}
|
{notempty name="share_config"}
|
||||||
<div class="blog_share">
|
<div class="blog_share">
|
||||||
@@ -37,7 +50,7 @@
|
|||||||
{notempty name="sc.url.value"}href="{$sc.url.value}"{/notempty}>
|
{notempty name="sc.url.value"}href="{$sc.url.value}"{/notempty}>
|
||||||
{eq name=":array_key_exists('triggered_qrcode', $sc)" value="true"}
|
{eq name=":array_key_exists('triggered_qrcode', $sc)" value="true"}
|
||||||
<img class="toggle_qrcode" src="{$sc.image.value}" />
|
<img class="toggle_qrcode" src="{$sc.image.value}" />
|
||||||
<div class="triggered_qrcode">
|
<div class="triggered_qrcode wechat_code">
|
||||||
<img src="{$sc.triggered_qrcode.value}" />
|
<img src="{$sc.triggered_qrcode.value}" />
|
||||||
</div>
|
</div>
|
||||||
{else /}
|
{else /}
|
||||||
@@ -73,7 +86,7 @@
|
|||||||
<p class="thtitle">{:lang_i18n('你可能还喜欢')}</p>
|
<p class="thtitle">{:lang_i18n('你可能还喜欢')}</p>
|
||||||
<p><img src="__IMAGES__/1line.webp"></p>
|
<p><img src="__IMAGES__/1line.webp"></p>
|
||||||
</div>
|
</div>
|
||||||
<div class="swiper-container loveswiper">
|
<div class="swiper loveswiper">
|
||||||
<div class="swiper-wrapper">
|
<div class="swiper-wrapper">
|
||||||
{volist name="recommends" id="vo"}
|
{volist name="recommends" id="vo"}
|
||||||
<div class="swiper-slide">
|
<div class="swiper-slide">
|
||||||
@@ -115,18 +128,15 @@
|
|||||||
})
|
})
|
||||||
|
|
||||||
$('.toggle_qrcode').click(function() {
|
$('.toggle_qrcode').click(function() {
|
||||||
$(this).siblings('.triggered_qrcode').toggle();
|
const qrcode = $(this).siblings('.triggered_qrcode');
|
||||||
})
|
qrcode.css('display', qrcode.css('display') === 'none' ? 'flex' : 'none');
|
||||||
|
});
|
||||||
})
|
})
|
||||||
//banner轮播
|
//banner轮播
|
||||||
var loveswiper = new Swiper('.loveswiper', {
|
var loveswiper = new Swiper('.loveswiper', {
|
||||||
// 配置选项
|
// 配置选项
|
||||||
slidesPerView: 2,
|
slidesPerView: 2,
|
||||||
spaceBetween: 30,
|
spaceBetween: 30,
|
||||||
loop: true,
|
|
||||||
autoplay: {
|
|
||||||
delay: 3000,
|
|
||||||
},
|
|
||||||
pagination: {
|
pagination: {
|
||||||
el: '.swiper-pagination',
|
el: '.swiper-pagination',
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,7 +32,7 @@
|
|||||||
<form action="{:url('article/index', ['pid' => $Request.param.pid])}" method="get" autocomplete="off">
|
<form action="{:url('article/index', ['pid' => $Request.param.pid])}" method="get" autocomplete="off">
|
||||||
<input type="text" class="search" id="article-blog-in" name="keywords" value="">
|
<input type="text" class="search" id="article-blog-in" name="keywords" value="">
|
||||||
<input type="hidden" class="search" id="article-blog-in" name="cid" value="{$Request.get.cid}">
|
<input type="hidden" class="search" id="article-blog-in" name="cid" value="{$Request.get.cid}">
|
||||||
<button id="blog-btnput" class="search-button-blog" style="padding:5px 12px;">{:lang_i18n('搜索')}</button>
|
<button id="blog-btnput" class="search-button-blog">{:lang_i18n('搜索')}</button>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
{notempty name="articles"}
|
{notempty name="articles"}
|
||||||
@@ -45,7 +45,7 @@
|
|||||||
<h3>{$ar.title}</h3>
|
<h3>{$ar.title}</h3>
|
||||||
<p>{$ar.desc|raw}</p>
|
<p>{$ar.desc|raw}</p>
|
||||||
</a>
|
</a>
|
||||||
<span class="blue">{$ar.release_time|default=''|date='Y-m-d'}</span>
|
<span class="blue">{$ar.release_time|date_format_i18n}</span>
|
||||||
</li>
|
</li>
|
||||||
{/volist}
|
{/volist}
|
||||||
</ul>
|
</ul>
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
<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/index', ['id' => $va.id])}"><div class="tabit active">{$va.name}</div></a>
|
<a href="{:url('attachment/video', ['id' => $va.id])}"><div class="tabit active">{$va.name}</div></a>
|
||||||
{/volist}
|
{/volist}
|
||||||
{/notempty}
|
{/notempty}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -44,7 +44,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="theit">
|
<div class="theit">
|
||||||
<div class="bditem bditem1">
|
<div class="bditem bditem1">
|
||||||
<label class="itlable">{:lang_i18n('您对哪个产品品类感兴趣?')}</label>
|
<label class="itlable">{:lang_i18n('您对哪个产品品类感兴趣?')}<span class="redtag">*</span></label>
|
||||||
<div class="sfbchecks">
|
<div class="sfbchecks">
|
||||||
{notempty name="interested"}
|
{notempty name="interested"}
|
||||||
{volist name="interested" id="it"}
|
{volist name="interested" id="it"}
|
||||||
|
|||||||
@@ -19,19 +19,19 @@
|
|||||||
<div class="theit">
|
<div class="theit">
|
||||||
<div class="bditem">
|
<div class="bditem">
|
||||||
<label class="itlable">{:lang_i18n('公司名称')}<span class="redtag">*</span></label>
|
<label class="itlable">{:lang_i18n('公司名称')}<span class="redtag">*</span></label>
|
||||||
<input type="text" class="form-control itinp companyName" placeholder="{:lang_i18n('请输入公司名称')}" />
|
<input type="text" name="corp_name" class="form-control itinp companyName" placeholder="{:lang_i18n('请输入公司名称')}" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="theit">
|
<div class="theit">
|
||||||
<div class="bditem">
|
<div class="bditem">
|
||||||
<label class="itlable">{:lang_i18n('电子邮件')}<span class="redtag">*</span></label>
|
<label class="itlable">{:lang_i18n('电子邮件')}<span class="redtag">*</span></label>
|
||||||
<input type="text" class="form-control itinp email" placeholder="{:lang_i18n('请输入邮箱')}" />
|
<input type="text" name="email" class="form-control itinp email" placeholder="{:lang_i18n('请输入邮箱')}" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="theit">
|
<div class="theit">
|
||||||
<div class="bditem bditem1">
|
<div class="bditem bditem1">
|
||||||
<label class="itlable">{:lang_i18n('电话号码')}<span class="redtag">*</span></label>
|
<label class="itlable">{:lang_i18n('电话号码')}<span class="redtag">*</span></label>
|
||||||
<input type="text" class="form-control itinp mphone" placeholder="{:lang_i18n('请输入电话号码')}" />
|
<input type="text" name="phone" class="form-control itinp mphone" placeholder="{:lang_i18n('请输入电话号码')}" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="theit">
|
<div class="theit">
|
||||||
@@ -47,7 +47,7 @@
|
|||||||
<div class="theit">
|
<div class="theit">
|
||||||
<div class="bditem">
|
<div class="bditem">
|
||||||
<label class="itlable">{:lang_i18n('在线商店网址')}</label>
|
<label class="itlable">{:lang_i18n('在线商店网址')}</label>
|
||||||
<input type="text" class="form-control itinp url" placeholder="{:lang_i18n('请输入网址')}" />
|
<input type="text" name="website_url" class="form-control itinp url" placeholder="{:lang_i18n('请输入网址')}" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="theit">
|
<div class="theit">
|
||||||
@@ -63,13 +63,13 @@
|
|||||||
<div class="theit">
|
<div class="theit">
|
||||||
<div class="bditem bditem1">
|
<div class="bditem bditem1">
|
||||||
<label class="itlable">{:lang_i18n('公司地址')}<span class="redtag">*</span></label>
|
<label class="itlable">{:lang_i18n('公司地址')}<span class="redtag">*</span></label>
|
||||||
<input type="text" class="form-control itinp address" placeholder="{:lang_i18n('请输入地址')}">
|
<input type="text" name="address" class="form-control itinp address" placeholder="{:lang_i18n('请输入地址')}">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="theit">
|
<div class="theit">
|
||||||
<div class="bditem bditem1">
|
<div class="bditem bditem1">
|
||||||
<label class="itlable">{:lang_i18n('留言')}<span class="redtag">*</span></label>
|
<label class="itlable">{:lang_i18n('留言')}<span class="redtag">*</span></label>
|
||||||
<textarea class="ittextarea message" placeholder="{:lang_i18n('请输入留言')}"></textarea>
|
<textarea name="message" class="ittextarea message" placeholder="{:lang_i18n('请输入留言')}"></textarea>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -23,14 +23,14 @@
|
|||||||
{volist name="ch" id="item"}
|
{volist name="ch" id="item"}
|
||||||
<div class="narskfit" {notempty name="item.link"}onclick="location.href='{$item.link}'"{/notempty}>
|
<div class="narskfit" {notempty name="item.link"}onclick="location.href='{$item.link}'"{/notempty}>
|
||||||
<img src="{$item.image}" class="narskico-img" />
|
<img src="{$item.image}" class="narskico-img" />
|
||||||
<span class="narskf-title">{$item.title}</span>
|
<span class="narskf-title" {:style(['color' => $item['title_txt_color']])}>{$item.title}</span>
|
||||||
{notempty name="item.title_short"}
|
|
||||||
<span class="narskf-sm">{$item.title_short}</span>
|
|
||||||
{/notempty}
|
|
||||||
{notempty name="item.desc"}
|
{notempty name="item.desc"}
|
||||||
{if condition="str_contains($item.desc, '<img')"}
|
<span class="narskf-sm" {:style(['color' => $item['desc_txt_color']])}>{$item.desc|raw}</span>
|
||||||
<div class="narskfactive-ewm" style="display: none;">{$item.desc|raw}</div>
|
{/notempty}
|
||||||
{/if}
|
{notempty name="item.extra_image"}
|
||||||
|
<div class="narskfactive-ewm" style="display: none;">
|
||||||
|
<img src="{$item.extra_image}" alt="" />
|
||||||
|
</div>
|
||||||
{/notempty}
|
{/notempty}
|
||||||
</div>
|
</div>
|
||||||
{/volist}
|
{/volist}
|
||||||
@@ -41,8 +41,8 @@
|
|||||||
<div class="narskfit narskfit2">
|
<div class="narskfit narskfit2">
|
||||||
<img src="{$item.image}" class="narskico-img">
|
<img src="{$item.image}" class="narskico-img">
|
||||||
<div class="narskfit2-ct">
|
<div class="narskfit2-ct">
|
||||||
<span class="narskf-title">{$item.title}</span>
|
<span class="narskf-title" {:style(['color' => $item['title_txt_color']])}>{$item.title}</span>
|
||||||
<span class="narskf-sm">{$item.desc|raw}</span>
|
<span class="narskf-sm" {:style(['color' => $item['desc_txt_color']])}>{$item.desc|raw}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -63,7 +63,7 @@
|
|||||||
<div class="question">
|
<div class="question">
|
||||||
<div class="title">{:lang_i18n('您的问题')} <span class="red">*</span></div>
|
<div class="title">{:lang_i18n('您的问题')} <span class="red">*</span></div>
|
||||||
<div class="des">
|
<div class="des">
|
||||||
<textarea rows="6" name="message" id="message" class="ittextarea message" placeholder="{:lang_i18n('请输入内容...')}"></textarea>
|
<textarea rows="6" name="content" id="message" class="ittextarea message" placeholder="{:lang_i18n('请输入内容...')}"></textarea>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="question">
|
<div class="question">
|
||||||
|
|||||||
@@ -101,8 +101,8 @@
|
|||||||
<a href="{$sc.link}"><img src="{$sc.image}" /></a>
|
<a href="{$sc.link}"><img src="{$sc.image}" /></a>
|
||||||
<div class="position_a text_center wow animated bounceInLeft">
|
<div class="position_a text_center wow animated bounceInLeft">
|
||||||
<p class="f_weight_500 timetitle" {:style(['color'=>$sc['title_txt_color']])}>{$sc.title}</p>
|
<p class="f_weight_500 timetitle" {:style(['color'=>$sc['title_txt_color']])}>{$sc.title}</p>
|
||||||
<p class=" margin-top-14 f_weight_100 timedesin" {:style(['color'=>$sc['desc_txt_color']])}>{$sc.desc}</p>
|
<p class=" margin-top-14 f_weight_400 timedesin" {:style(['color'=>$sc['desc_txt_color']])}>{$sc.desc|raw}</p>
|
||||||
<p class=" margin-top-20 f_weight_100">
|
<p class=" margin-top-20 f_weight_400">
|
||||||
<a href="{$sc.link}" class="timeblue"> {:lang_i18n('了解更多')} <img src="__IMAGES__/more-r.png"></a>
|
<a href="{$sc.link}" class="timeblue"> {:lang_i18n('了解更多')} <img src="__IMAGES__/more-r.png"></a>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
@@ -141,8 +141,8 @@
|
|||||||
<img src="{$bs.image}">
|
<img src="{$bs.image}">
|
||||||
<div class="position_a text_center">
|
<div class="position_a text_center">
|
||||||
<p class=" timetitle" {:style(['color'=>$bs['title_txt_color']])}>{$bs.title} </p>
|
<p class=" timetitle" {:style(['color'=>$bs['title_txt_color']])}>{$bs.title} </p>
|
||||||
<p class=" margin-top-14 f_weight_100 timedesin" {:style(['color'=>$bs['desc_txt_color']])}>{$bs.desc}</p>
|
<p class=" margin-top-14 f_weight_400 timedesin" {:style(['color'=>$bs['desc_txt_color']])}>{$bs.desc|raw}</p>
|
||||||
<p class=" margin-top-20 f_weight_100">
|
<p class=" margin-top-20 f_weight_400">
|
||||||
<span class=" timeblue">
|
<span class=" timeblue">
|
||||||
<a href="{$bs.link}">{:lang_i18n('了解更多')}<img src="__IMAGES__/more-r.png"></a>
|
<a href="{$bs.link}">{:lang_i18n('了解更多')}<img src="__IMAGES__/more-r.png"></a>
|
||||||
</span>
|
</span>
|
||||||
@@ -310,6 +310,16 @@
|
|||||||
icon.removeClass('icon-jian-svg').addClass('icon-add-svg');
|
icon.removeClass('icon-jian-svg').addClass('icon-add-svg');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// 判断年份
|
||||||
|
// 计算.timeline下的li元素数量
|
||||||
|
var liCount = $('.timeline ol li').length;
|
||||||
|
|
||||||
|
// 如果有li元素,则设置a标签的宽度
|
||||||
|
if (liCount > 0) {
|
||||||
|
var widthPerItem = (100 / liCount-0.3) + '%';
|
||||||
|
$('.timeline ol li a').css('width', widthPerItem);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
{/block}
|
{/block}
|
||||||
@@ -9,7 +9,7 @@
|
|||||||
<div>
|
<div>
|
||||||
{volist name="focus_image" id="fi"}
|
{volist name="focus_image" id="fi"}
|
||||||
<a {notempty name="fi.link" }href="{$fi.link}"{/notempty}>
|
<a {notempty name="fi.link" }href="{$fi.link}"{/notempty}>
|
||||||
<img src="{$fi.image}" />
|
<img src="{$fi.image}" style="width: 100%;margin-top: 3.5rem;"/>
|
||||||
</a>
|
</a>
|
||||||
{/volist}
|
{/volist}
|
||||||
</div>
|
</div>
|
||||||
@@ -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="{$pro.cover_image}">
|
<img src="{:thumb($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>
|
||||||
|
|||||||
@@ -22,7 +22,11 @@
|
|||||||
<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>
|
||||||
@@ -37,6 +41,13 @@
|
|||||||
<img src="{$photo}" alt="" />
|
<img src="{$photo}" alt="" />
|
||||||
</div>
|
</div>
|
||||||
{/volist}
|
{/volist}
|
||||||
|
{if condition="!empty($product.video_img) && !empty($product.video_url) && $idx == 1"}
|
||||||
|
<div class="swiper-slide">
|
||||||
|
<video poster="{$product.video_img}" autoplay="autoplay" muted="muted" loop="loop" id="video" controls>
|
||||||
|
<source src="{$product.video_url}" type="video/mp4"/>
|
||||||
|
</video>
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
<!-- 如果需要分页器 -->
|
<!-- 如果需要分页器 -->
|
||||||
<div class="swiper-pagination"></div>
|
<div class="swiper-pagination"></div>
|
||||||
@@ -44,9 +55,9 @@
|
|||||||
{/volist}
|
{/volist}
|
||||||
</div>
|
</div>
|
||||||
{/notempty}
|
{/notempty}
|
||||||
<!-- 规格参数-->
|
<!-- 规格参数 -->
|
||||||
<div class="m_Container">
|
<div class="m_Container">
|
||||||
<!--多颜色-->
|
<!-- 颜色/属性 -->
|
||||||
{notempty name="product_sku_attrs"}
|
{notempty name="product_sku_attrs"}
|
||||||
<div class="slideTxtBox">
|
<div class="slideTxtBox">
|
||||||
<div class="hd clearfix">
|
<div class="hd clearfix">
|
||||||
@@ -57,7 +68,11 @@
|
|||||||
<ul class="hd clearfix">
|
<ul class="hd clearfix">
|
||||||
{volist name="ps.attr_values" id="pv" key="pk"}
|
{volist name="ps.attr_values" id="pv" key="pk"}
|
||||||
{assign name="attr_value_type" value=":rgb_or_image($pv.attr_value)" /}
|
{assign name="attr_value_type" value=":rgb_or_image($pv.attr_value)" /}
|
||||||
|
{between name="ps.attr_id" value="1,2"}
|
||||||
<li class="attr_value tip1 attr_item" data-index="{$pk}">
|
<li class="attr_value tip1 attr_item" data-index="{$pk}">
|
||||||
|
{else/}
|
||||||
|
<li class="attr_value tip1 attr_item_defalut" data-index="{$pk}">
|
||||||
|
{/between}
|
||||||
{eq name="attr_value_type" value="IMAGE"}
|
{eq name="attr_value_type" value="IMAGE"}
|
||||||
<span class="co-bg"><img src="{$pv.attr_value}" /></span>
|
<span class="co-bg"><img src="{$pv.attr_value}" /></span>
|
||||||
{elseif condition="$attr_value_type == 'RGB'" /}
|
{elseif condition="$attr_value_type == 'RGB'" /}
|
||||||
@@ -96,7 +111,9 @@
|
|||||||
</div>
|
</div>
|
||||||
{/notempty}
|
{/notempty}
|
||||||
<div class="platform_buy">
|
<div class="platform_buy">
|
||||||
|
{eq name=":cookie('think_lang')" value="en-us"}
|
||||||
<a class="btn-blue-detail business-button">{:lang_i18n('发送查询')}</a>
|
<a class="btn-blue-detail business-button">{:lang_i18n('发送查询')}</a>
|
||||||
|
{/eq}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!-- 产品描述 -->
|
<!-- 产品描述 -->
|
||||||
@@ -104,7 +121,7 @@
|
|||||||
<ul class="cpa des cursor_p">
|
<ul class="cpa des cursor_p">
|
||||||
<li class="active" id="one">{:lang_i18n('产品描述')}</li>
|
<li class="active" id="one">{:lang_i18n('产品描述')}</li>
|
||||||
{notempty name="product_related"}
|
{notempty name="product_related"}
|
||||||
<li>{:lang_i18n('关联产品')}</li>
|
<li onclick="javascript:location.href='#related'">{:lang_i18n('关联产品')}</li>
|
||||||
{/notempty}
|
{/notempty}
|
||||||
<div class="clear"></div>
|
<div class="clear"></div>
|
||||||
</ul>
|
</ul>
|
||||||
@@ -112,13 +129,19 @@
|
|||||||
<!-- 产品图片-->
|
<!-- 产品图片-->
|
||||||
<div class="goods_des img-responsives" id="description-tab">{$product.detail|raw}</div>
|
<div class="goods_des img-responsives" id="description-tab">{$product.detail|raw}</div>
|
||||||
<!-- 关联产品-->
|
<!-- 关联产品-->
|
||||||
<div class="glcplist" id="related-tab" style="display: none;">
|
{notempty name="product_related"}
|
||||||
<div class="glcpitem" >
|
<div class="glcplist" id="related">
|
||||||
<img src="indeximg/i560-800-1.png" src="glcpimg" />
|
{volist name="product_related" id="rel"}
|
||||||
<span class="glt1" >98系列多盘位DAS桌面阵列存储系统</span>
|
<div class="glcpitem">
|
||||||
<span class="glt2">ORICO-9858RU3</span>
|
<a href="{:url('product/detail', ['id'=>$rel.id])}">
|
||||||
</div>
|
<img src="{:thumb($rel.cover_image)}" class="glcpimg" />
|
||||||
</div>
|
<span class="glt1">{$rel.name}</span>
|
||||||
|
<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">
|
||||||
@@ -212,9 +235,7 @@
|
|||||||
$('.tab-pane').hide();
|
$('.tab-pane').hide();
|
||||||
if (targetTab === 'description') {
|
if (targetTab === 'description') {
|
||||||
$('#description-tab').show();
|
$('#description-tab').show();
|
||||||
$('#related-tab').hide();
|
|
||||||
} else if (targetTab === 'related') {
|
} else if (targetTab === 'related') {
|
||||||
$('#related-tab').show();
|
|
||||||
$('#description-tab').hide();
|
$('#description-tab').hide();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -223,8 +244,8 @@
|
|||||||
var index = $(this).data('index');
|
var index = $(this).data('index');
|
||||||
$('.pdetailswiper').hide();
|
$('.pdetailswiper').hide();
|
||||||
$('.pdetailswiper[data-index="' + index + '"]').show();
|
$('.pdetailswiper[data-index="' + index + '"]').show();
|
||||||
$('.attr_value').removeClass('active');
|
$('.attr_value').removeClass('attr_item_on');
|
||||||
$(this).addClass('active');
|
$(this).addClass('attr_item_on');
|
||||||
});
|
});
|
||||||
|
|
||||||
// 提交产品询价查询
|
// 提交产品询价查询
|
||||||
|
|||||||
@@ -16,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">
|
<a class="pritem" href="{:url('product/detail',['id'=>$pro.id])}">
|
||||||
<img src="{$pro.cover_image}" class="primg"/>
|
<img src="{:thumb($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,6 +27,8 @@
|
|||||||
</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>
|
||||||
|
|||||||
@@ -19,6 +19,7 @@
|
|||||||
<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"}
|
||||||
@@ -55,6 +56,7 @@
|
|||||||
</li>
|
</li>
|
||||||
{/volist}
|
{/volist}
|
||||||
</ul>
|
</ul>
|
||||||
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
{/notempty}
|
{/notempty}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -11,15 +11,34 @@
|
|||||||
<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="https://unpkg.com/swiper@9/swiper-bundle.min.css">
|
<link rel="stylesheet" href="__JS__/swiper-bundle9.4.1.min.css" />
|
||||||
<script type="text/javascript" src='https://code.jquery.com/jquery-3.6.0.min.js'></script>
|
<script src="__JS__/jquery-3.6.0.min.js"></script>
|
||||||
<script type="text/javascript" src="https://unpkg.com/swiper@9.4.1/swiper-bundle.min.js"></script>
|
<script type="text/javascript" src="__JS__/swiper-bundle9.4.1.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&rec=1" style="border:0" alt="" />
|
||||||
|
<!-- End Matomo -->
|
||||||
|
</noscript>
|
||||||
{block name="header"}
|
{block name="header"}
|
||||||
{include file="public/header"/}
|
{include file="public/header"/}
|
||||||
{/block}
|
{/block}
|
||||||
@@ -28,5 +47,31 @@
|
|||||||
{include file="public/footer"/}
|
{include file="public/footer"/}
|
||||||
{/block}
|
{/block}
|
||||||
{block name="script"}{/block}
|
{block name="script"}{/block}
|
||||||
|
<script>
|
||||||
|
$(window).ready(function () {
|
||||||
|
// 为所有站内链接,添加标识
|
||||||
|
// 使用mtpl=1参数标识解决ipad访问站点时,从pc重定向到mobile每次页面都会pc - mobile闪现问题
|
||||||
|
var LURL = new URL(window.location.href);
|
||||||
|
if (LURL.searchParams.get('mtpl') == 1) {
|
||||||
|
$('a').each(function () {
|
||||||
|
var href = $(this).attr('href');
|
||||||
|
if (href) {
|
||||||
|
var origin = LURL.origin;
|
||||||
|
if (href.indexOf('http') == -1) {
|
||||||
|
href = new URL(href, origin);
|
||||||
|
href.searchParams.set('mtpl', '1');
|
||||||
|
$(this).attr('href', href);
|
||||||
|
} else {
|
||||||
|
href = new URL(href);
|
||||||
|
if (href.origin == origin) {
|
||||||
|
href.searchParams.set('mtpl', '1');
|
||||||
|
$(this).attr('href', href);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
</script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
@@ -18,7 +18,9 @@
|
|||||||
{notempty name="fn.children"}
|
{notempty name="fn.children"}
|
||||||
{volist name="fn.children" id="fnc"}
|
{volist name="fn.children" id="fnc"}
|
||||||
<p>
|
<p>
|
||||||
<a href="{$fnc.link}" target="_blank" class="inline-block link-faded break-all">{$fnc.name}</a>
|
<a href="{$fnc.link}" {eq name="fnc.link" value="1"}target="_blank"{/eq} class="inline-block link-faded break-all">
|
||||||
|
{$fnc.name}
|
||||||
|
</a>
|
||||||
</p>
|
</p>
|
||||||
{/volist}
|
{/volist}
|
||||||
{/notempty}
|
{/notempty}
|
||||||
@@ -27,12 +29,13 @@
|
|||||||
{/notempty}
|
{/notempty}
|
||||||
<li>
|
<li>
|
||||||
<h3>{:lang_i18n('联系方式')}</h3>
|
<h3>{:lang_i18n('联系方式')}</h3>
|
||||||
{notempty name="contact_config.website_email"}
|
{if condition="!empty($contact_config)"}
|
||||||
<p>{$contact_config.website_email.title}: {$contact_config.website_email.value}</p>
|
{volist name="contact_config" id="vo"}
|
||||||
{/notempty}
|
{if condition="$vo.type != 'image'"}
|
||||||
{notempty name="contact_config.website_hotline_office_hours"}
|
<p>{$vo.value}</p>
|
||||||
<p>{$contact_config.website_hotline_office_hours.title}: {$contact_config.website_hotline_office_hours.value}</p>
|
{/if}
|
||||||
{/notempty}
|
{/volist}
|
||||||
|
{/if}
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
@@ -62,7 +65,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})</a>
|
<a href="https://beian.miit.gov.cn/" style="color:white;">{$basic_config.website_icp.value|raw}</a>
|
||||||
{/notempty}
|
{/notempty}
|
||||||
</div>
|
</div>
|
||||||
{/notempty}
|
{/notempty}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<header class="oircoEgapp-head">
|
<header class="oircoEgapp-head">
|
||||||
<div class="headtop">
|
<div class="headtop">
|
||||||
<a><img src="__IMAGES__/logo.png" class="headerlogimg" /></a>
|
<a href="/"><img src="__IMAGES__/logo.png" class="headerlogimg" /></a>
|
||||||
<div class="action-r">
|
<div class="action-r">
|
||||||
<div class="right img-responsive cursor_p">
|
<div class="right img-responsive cursor_p">
|
||||||
<span class="icon-category cursor_p top-menu-toggle"><i class="icon-menu-svg"></i></span>
|
<span class="icon-category cursor_p top-menu-toggle"><i class="icon-menu-svg"></i></span>
|
||||||
@@ -53,6 +53,7 @@
|
|||||||
</form>
|
</form>
|
||||||
<div class="title-text">
|
<div class="title-text">
|
||||||
<p><a href="#">{:lang_i18n('搜索历史')}</a></p>
|
<p><a href="#">{:lang_i18n('搜索历史')}</a></p>
|
||||||
|
<div id="history"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -107,20 +108,54 @@
|
|||||||
$('.top-country .close-icon').click(function(){
|
$('.top-country .close-icon').click(function(){
|
||||||
$(".mask,.action-sheet").hide();
|
$(".mask,.action-sheet").hide();
|
||||||
})
|
})
|
||||||
var sUserAgent = navigator.userAgent.toLowerCase();
|
|
||||||
var bIsIpad = sUserAgent.match(/ipad/i) == "ipad";//判断是否为iPad
|
// 移动端顶部宽度设置和主体内容宽度一致
|
||||||
var bIsIphoneOs = sUserAgent.match(/iphone os/i) == "iphone os";//判断是否为iPhone用户
|
var pageWidth = $('.oricoEGapp').outerWidth();
|
||||||
var bIsMidp = sUserAgent.match(/midp/i) == "midp";
|
// 设置.header-PC元素的宽度
|
||||||
var bIsUc7 = sUserAgent.match(/rv:1.2.3.4/i) == "rv:1.2.3.4";
|
$('.oircoEgapp-head').css('width', pageWidth + 'px');
|
||||||
var bIsUc = sUserAgent.match(/ucweb/i) == "ucweb";
|
// 可选:监听窗口大小变化,实时更新宽度
|
||||||
var bIsAndroid = sUserAgent.match(/android/i) == "android";
|
$(window).resize(function() {
|
||||||
var bIsCE = sUserAgent.match(/windows ce/i) == "windows ce";
|
var newWidth = $('.oricoEGapp').outerWidth();
|
||||||
var bIsWM = sUserAgent.match(/windows mobile/i) == "windows mobile";
|
$('.oircoEgapp-head').css('width', newWidth + 'px');
|
||||||
|
});
|
||||||
if (!(bIsIpad || bIsIphoneOs || bIsMidp || bIsUc7 || bIsUc || bIsAndroid || bIsCE || bIsWM)) {
|
|
||||||
alert("当前是电脑打开")
|
// 回显搜索历史记录
|
||||||
}else{
|
history();
|
||||||
alert("当前是手机打开")
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
|
|
||||||
|
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>
|
||||||
126
app/index/view/mobile/public/nas_header.html
Normal file
126
app/index/view/mobile/public/nas_header.html
Normal file
@@ -0,0 +1,126 @@
|
|||||||
|
<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>
|
||||||
@@ -2,13 +2,17 @@
|
|||||||
{block name="style"}
|
{block name="style"}
|
||||||
<link rel="stylesheet" href="__CSS__/topic_nas_cooperation.css">
|
<link rel="stylesheet" href="__CSS__/topic_nas_cooperation.css">
|
||||||
{/block}
|
{/block}
|
||||||
|
{block name="header"}
|
||||||
|
{include file="public/nas_header" /}
|
||||||
|
{/block}
|
||||||
{block name="main"}
|
{block name="main"}
|
||||||
<div class="oricoEGapp">
|
<div class="oricoEGapp">
|
||||||
<div class="narshzhbMbpage">
|
<div class="narshzhbMbpage">
|
||||||
<!-- banner -->
|
<!-- banner -->
|
||||||
{notempty name="focus_image"}
|
{notempty name="focus_image"}
|
||||||
<div class="narshzhb-banner" style="margin-top: 13%; background: url({$focus_image.image});background-repeat: no-repeat;background-size: 100% 100%;">
|
<div class="narshzhb-banner">
|
||||||
<div class="narshzhb-banner-content">
|
<img src="{$focus_image.image}" style="margin-top: 3.7rem;">
|
||||||
|
<!-- <div class="narshzhb-banner-content">
|
||||||
<span class="t1">{:lang_i18n('成为ORICO合作伙伴')}</span>
|
<span class="t1">{:lang_i18n('成为ORICO合作伙伴')}</span>
|
||||||
<h2><strong style="color: #004BFA;">NAS</strong>{:lang_i18n('合作伙伴招募')}</h2>
|
<h2><strong style="color: #004BFA;">NAS</strong>{:lang_i18n('合作伙伴招募')}</h2>
|
||||||
<div class="narshzhb-banner-btct">
|
<div class="narshzhb-banner-btct">
|
||||||
@@ -17,7 +21,7 @@
|
|||||||
<span>{:lang_i18n('代理经销合作')}</span>
|
<span>{:lang_i18n('代理经销合作')}</span>
|
||||||
<span>{:lang_i18n('ODM合作')}</span>
|
<span>{:lang_i18n('ODM合作')}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div> -->
|
||||||
</div>
|
</div>
|
||||||
{/notempty}
|
{/notempty}
|
||||||
<!-- top 介绍 -->
|
<!-- top 介绍 -->
|
||||||
|
|||||||
@@ -2,19 +2,22 @@
|
|||||||
{block name="style"}
|
{block name="style"}
|
||||||
<link rel="stylesheet" href="__CSS__/topic_nas_download.css" />
|
<link rel="stylesheet" href="__CSS__/topic_nas_download.css" />
|
||||||
{/block}
|
{/block}
|
||||||
|
{block name="header"}
|
||||||
|
{include file="public/nas_header" /}
|
||||||
|
{/block}
|
||||||
{block name="main"}
|
{block name="main"}
|
||||||
<div class="oricoEGapp">
|
<div class="oricoEGapp">
|
||||||
<div class="narsDowloadPc">
|
<div class="narsDowloadPc">
|
||||||
|
{egt name=":count($data)" value="2"}
|
||||||
<div class="narsDtabs">
|
<div class="narsDtabs">
|
||||||
{egt name=":count($data)" value="2"}
|
|
||||||
{notempty name="data.cyber"}
|
{notempty name="data.cyber"}
|
||||||
<div class="narsDtabIt narsDtabIt_active">{:lang_i18n('CyberData赛博云空间')}</div>
|
<div class="narsDtabIt narsDtabIt_active">{:lang_i18n('CyberData赛博云空间')}</div>
|
||||||
{/notempty}
|
{/notempty}
|
||||||
{notempty name="data.weline"}
|
{notempty name="data.weline"}
|
||||||
<div class="narsDtabIt">{:lang_i18n('Weline微链接')}</div>
|
<div class="narsDtabIt">{:lang_i18n('Weline微链接')}</div>
|
||||||
{/notempty}
|
{/notempty}
|
||||||
{/egt}
|
|
||||||
</div>
|
</div>
|
||||||
|
{/egt}
|
||||||
<!-- 赛博云 -->
|
<!-- 赛博云 -->
|
||||||
{notempty name="data.cyber"}
|
{notempty name="data.cyber"}
|
||||||
<div class="nDtopCtMian narssbshow" style="display: block;">
|
<div class="nDtopCtMian narssbshow" style="display: block;">
|
||||||
|
|||||||
@@ -9,7 +9,11 @@
|
|||||||
<div class="oricoEGapp">
|
<div class="oricoEGapp">
|
||||||
<div class="narshelpCenterPc-app">
|
<div class="narshelpCenterPc-app">
|
||||||
<div class="headtop">
|
<div class="headtop">
|
||||||
|
{eq name=":cookie('think_lang')" value="zh-cn"}
|
||||||
<a href="{:url('/index/topic/nas/index')}">
|
<a href="{:url('/index/topic/nas/index')}">
|
||||||
|
{else/}
|
||||||
|
<a>
|
||||||
|
{/eq}
|
||||||
<img src="__IMAGES__/logo.png" class="logoicoimg">
|
<img src="__IMAGES__/logo.png" class="logoicoimg">
|
||||||
</a>
|
</a>
|
||||||
<img src="__IMAGES__/ssapp.png" class="ssicoimg">
|
<img src="__IMAGES__/ssapp.png" class="ssicoimg">
|
||||||
@@ -33,7 +37,7 @@
|
|||||||
</a>
|
</a>
|
||||||
{/volist}
|
{/volist}
|
||||||
{if condition="count($vo.article) >= 3"}
|
{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])}">
|
<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>
|
<div class="ckgdbt">{:lang_i18n('查看更多')} <img src="__IMAGES__/nars-jt.png"></div>
|
||||||
</a>
|
</a>
|
||||||
{/if}
|
{/if}
|
||||||
@@ -45,8 +49,9 @@
|
|||||||
{notempty name="contacts"}
|
{notempty name="contacts"}
|
||||||
<h1 class="nhlpapp-title">{:lang_i18n('联系我们')}</h1>
|
<h1 class="nhlpapp-title">{:lang_i18n('联系我们')}</h1>
|
||||||
<div class="nhlpapp-row">
|
<div class="nhlpapp-row">
|
||||||
|
{assign name="first_section" value=":array_splice($contacts, 0, count($contacts) - 3)"}
|
||||||
<div class="sec-1">
|
<div class="sec-1">
|
||||||
{volist name="contacts" id="co" key="idx" offset="0" length="4"}
|
{volist name="first_section" id="co"}
|
||||||
<a class="nhlplxwmit" {notempty name="co.link"}href="{$co.link}"{/notempty}>
|
<a class="nhlplxwmit" {notempty name="co.link"}href="{$co.link}"{/notempty}>
|
||||||
<img src="{$co.image}" class="lximg">
|
<img src="{$co.image}" class="lximg">
|
||||||
<span class="t1" {:style(['color'=>$co.title_txt_color])}>{$co.title}</span>
|
<span class="t1" {:style(['color'=>$co.title_txt_color])}>{$co.title}</span>
|
||||||
@@ -57,7 +62,7 @@
|
|||||||
{/volist}
|
{/volist}
|
||||||
</div>
|
</div>
|
||||||
<div class="sec-2">
|
<div class="sec-2">
|
||||||
{volist name="contacts" id="co" key="idx" offset="4"}
|
{volist name="contacts" id="co"}
|
||||||
<a class="nhlplxwmit nhlplxwmit-w1" {notempty name="co.link"}href="{$co.link}"{/notempty}>
|
<a class="nhlplxwmit nhlplxwmit-w1" {notempty name="co.link"}href="{$co.link}"{/notempty}>
|
||||||
<img src="{$co.image}" class="lximg">
|
<img src="{$co.image}" class="lximg">
|
||||||
<span class="t1" {:style(['color'=>$co.title_txt_color])}>{$co.title}<br></span>
|
<span class="t1" {:style(['color'=>$co.title_txt_color])}>{$co.title}<br></span>
|
||||||
|
|||||||
@@ -20,23 +20,30 @@
|
|||||||
<div class="oricoEGapp">
|
<div class="oricoEGapp">
|
||||||
<div class="narshelpCenterdetail-app">
|
<div class="narshelpCenterdetail-app">
|
||||||
<div class="headtop">
|
<div class="headtop">
|
||||||
|
{eq name=":cookie('think_lang')" value="zh-cn"}
|
||||||
<a href="{:url('/index/topic/nas/index')}">
|
<a href="{:url('/index/topic/nas/index')}">
|
||||||
<img src="__IMAGES__/logo.png" class="logoicoimg">
|
{else/}
|
||||||
</a>
|
<a>
|
||||||
<div style="display: flex;">
|
{/eq}
|
||||||
<img src="__IMAGES__/fenlei.png" class="ssicoimg" id="flico">
|
<img src="__IMAGES__/logo.png" class="logoicoimg">
|
||||||
<img src="__IMAGES__/sousuo.png" class="ssicoimg" id="ssico" style="margin-right:32px">
|
</a>
|
||||||
</div>
|
<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>
|
||||||
<!-- 文章内容 -->
|
<!-- 文章内容 -->
|
||||||
<div id="rendered-content" class="nhlp-app-content">
|
<div class="ql-container">
|
||||||
{$article.content|raw|default=''}
|
<div id="rendered-content" class="nhlp-app-content ql-editor">
|
||||||
|
{$article.content|raw|default=''}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!-- 搜索 -->
|
<!-- 搜索 -->
|
||||||
<div class="nhlpapp-search">
|
<div class="nhlpapp-search">
|
||||||
<div class="nhlpappshtop">
|
<div class="nhlpappshtop">
|
||||||
<div class="nhlpapp-shdiv">
|
<div class="nhlpapp-shdiv">
|
||||||
<input class="nhlp-ipt" id="search-input" placeholder="{:lang_i18n('请输入搜索关键字,如安装赛博云空间,影视库')}" autocomplete="off">
|
<input class="nhlp-ipt" id="search-input" placeholder="{:lang_i18n('请输入搜索关键字,如安装赛博云空间,影视库')}"
|
||||||
|
autocomplete="off">
|
||||||
<img src="__IMAGES__/ssapp.png" class="searchimg">
|
<img src="__IMAGES__/ssapp.png" class="searchimg">
|
||||||
</div>
|
</div>
|
||||||
<span class="closetx">{:lang_i18n('取消')}</span>
|
<span class="closetx">{:lang_i18n('取消')}</span>
|
||||||
@@ -46,22 +53,44 @@
|
|||||||
<div class="dropdown" id="dropdown"></div>
|
<div class="dropdown" id="dropdown"></div>
|
||||||
</div>
|
</div>
|
||||||
<!-- 分类文章目录 -->
|
<!-- 分类文章目录 -->
|
||||||
<div class="nhlpapp-pagescate" style="display: none;">
|
<div class="nhlpapp-pagescate" {:style(['display'=> $Request.get.view == 'more' ? 'block' : 'none'])}>
|
||||||
<div class="nars-hlpdt-ml">
|
<div class="nars-hlpdt-ml">
|
||||||
{notempty name="article_categorys"}
|
{notempty name="article_categorys"}
|
||||||
<div class="nav-tree">
|
<div class="nav-tree">
|
||||||
|
|
||||||
|
|
||||||
{volist name="article_categorys" id="ac" key="idx"}
|
{volist name="article_categorys" id="ac" key="idx"}
|
||||||
<div class="categoryhelp">
|
<div class="categoryhelp">
|
||||||
<div class="categoryhelp-title">
|
<div class="categoryhelp-title">
|
||||||
<div>
|
<div>
|
||||||
<img src="__IMAGES__/nars-jt.png" class="arrow {if condition='$ac.id == $Request.get.cid'}rotate{/if}">
|
<img src="__IMAGES__/nars-jt.png"
|
||||||
|
class="arrow {if condition='$ac.id == $Request.get.cid'}rotate{/if}">
|
||||||
</div>
|
</div>
|
||||||
<span>{$ac.name}</span>
|
<span>{$ac.name}</span>
|
||||||
</div>
|
</div>
|
||||||
<ul class="sub-list" {if condition='$ac.id == $Request.get.cid'}style="display: block;"{/if}>
|
<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"}
|
{volist name="ac.article" id="ar"}
|
||||||
<li>
|
<li>
|
||||||
<a href="{:url('/index/topic/nas/help_detail', ['id' => $ar.id])}" style="padding-top: 6px;">
|
<a href="{:url('/index/topic/nas/help_detail', ['cid' => $ac.id , 'id' => $ar.id])}"
|
||||||
|
style="padding-top: 6px;">
|
||||||
{$ar.title}
|
{$ar.title}
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
@@ -69,10 +98,34 @@
|
|||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
{/volist}
|
{/volist}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
{/notempty}
|
{/notempty}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<!-- 顶部国家选择-->
|
||||||
|
<div class="top-country">
|
||||||
|
<div class="mask"></div>
|
||||||
|
<div class="action-sheet">
|
||||||
|
<div class="menu-title">
|
||||||
|
<div class="menu-name">{:lang_i18n('请择地区')}</div>
|
||||||
|
<div class="close-icon">
|
||||||
|
<img src="__IMAGES__/close.png">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<ul>
|
||||||
|
{volist name="header_languages" id="la"}
|
||||||
|
<li>
|
||||||
|
<a href="{$la.lang_url}" target="_blank">
|
||||||
|
<img src="{$la.lang_icon}">{$la.country_en_name} - {$la.lang_en_name}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{/volist}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{/block}
|
{/block}
|
||||||
@@ -98,6 +151,17 @@
|
|||||||
$(this).next('.sub-list').slideToggle();
|
$(this).next('.sub-list').slideToggle();
|
||||||
$(this).find('.arrow').toggleClass('rotate');
|
$(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 () {
|
$('#ssico').click(function () {
|
||||||
$('.nhlpapp-pagescate').hide();
|
$('.nhlpapp-pagescate').hide();
|
||||||
@@ -106,6 +170,13 @@
|
|||||||
$('.closetx').click(function () {
|
$('.closetx').click(function () {
|
||||||
$('.nhlpapp-search').hide();
|
$('.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;
|
var timeout = null;
|
||||||
$('#search-input').on('focus input', function () {
|
$('#search-input').on('focus input', function () {
|
||||||
@@ -138,6 +209,27 @@
|
|||||||
})
|
})
|
||||||
}, 300);
|
}, 300);
|
||||||
});
|
});
|
||||||
|
// 英文截断处理
|
||||||
|
// 目标容器:富文本内容所在的元素
|
||||||
|
const contentContainer = $('#rendered-content');
|
||||||
|
|
||||||
|
// 遍历所有包含文本内容的标签(p、h1-h6、strong等)
|
||||||
|
contentContainer.find('*').each(function () {
|
||||||
|
const $element = $(this);
|
||||||
|
const htmlContent = $element.html();
|
||||||
|
|
||||||
|
// 条件1:排除内容仅为一个 的标签(如<p> </p>)
|
||||||
|
if (htmlContent.trim() === ' ') {
|
||||||
|
return; // 不处理,继续下一个元素
|
||||||
|
}
|
||||||
|
|
||||||
|
// 条件2:检查是否包含 且有实际文本内容
|
||||||
|
if (htmlContent.includes(' ')) {
|
||||||
|
// 将所有 替换为普通空格(有效占位符,支持单词完整换行)
|
||||||
|
const newContent = htmlContent.replace(/ /g, ' ');
|
||||||
|
$element.html(newContent);
|
||||||
|
}
|
||||||
|
});
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
{/block}
|
{/block}
|
||||||
@@ -2,6 +2,9 @@
|
|||||||
{block name="style"}
|
{block name="style"}
|
||||||
<link rel="stylesheet" href="__CSS__/topic_nas_index.css">
|
<link rel="stylesheet" href="__CSS__/topic_nas_index.css">
|
||||||
{/block}
|
{/block}
|
||||||
|
{block name="header"}
|
||||||
|
{include file="public/nas_header" /}
|
||||||
|
{/block}
|
||||||
{block name="main"}
|
{block name="main"}
|
||||||
<div class="oricoEGapp">
|
<div class="oricoEGapp">
|
||||||
<!-- 首页 -->
|
<!-- 首页 -->
|
||||||
|
|||||||
@@ -2,6 +2,9 @@
|
|||||||
{block name="style"}
|
{block name="style"}
|
||||||
<link rel="stylesheet" type="text/css" href="__CSS__/topic_nas_product.css" />
|
<link rel="stylesheet" type="text/css" href="__CSS__/topic_nas_product.css" />
|
||||||
{/block}
|
{/block}
|
||||||
|
{block name="header"}
|
||||||
|
{include file="public/nas_header" /}
|
||||||
|
{/block}
|
||||||
{block name="main"}
|
{block name="main"}
|
||||||
<div class="narsZTPC">
|
<div class="narsZTPC">
|
||||||
<div class="nZTtopCtMian narssbshow">
|
<div class="nZTtopCtMian narssbshow">
|
||||||
|
|||||||
740
app/index/view/mobile/topic_power_prodline/index.html
Normal file
740
app/index/view/mobile/topic_power_prodline/index.html
Normal file
@@ -0,0 +1,740 @@
|
|||||||
|
{extend name="public/base" /}
|
||||||
|
{block name="style"}
|
||||||
|
<link rel="stylesheet" href="__CSS__/topic_power_prodline/index.css">
|
||||||
|
<link rel="stylesheet" href="__CSS__/topic_power_prodline/swiper.css">
|
||||||
|
<link rel="stylesheet" href="__CSS__/topic_power_prodline/nav.css">
|
||||||
|
<link rel="stylesheet" href="__CSS__/topic_power_prodline/advantage.css">
|
||||||
|
<link rel="stylesheet" href="__CSS__/topic_power_prodline/mask.css">
|
||||||
|
<link rel="stylesheet" href="__CSS__/topic_power_prodline/product.css">
|
||||||
|
<link rel="stylesheet" href="__CSS__/topic_power_prodline/product_list.css">
|
||||||
|
<link rel="stylesheet" href="__CSS__/topic_power_prodline/product_card.css">
|
||||||
|
<link rel="stylesheet" href="__CSS__/topic_power_prodline/footer.css">
|
||||||
|
{/block}
|
||||||
|
{block name="header"}
|
||||||
|
<!-- 重置header头为空 -->
|
||||||
|
{/block}
|
||||||
|
{block name="main"}
|
||||||
|
<a class="header" href="/">
|
||||||
|
<div class="header-img">
|
||||||
|
<img src="__IMAGES__/logo.png" alt="">
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
<!-- 轮播核心容器 -->
|
||||||
|
<div class="swiper-container auto-swiper-container" >
|
||||||
|
{notempty name="data.focus_image"}
|
||||||
|
<div class="swiper-wrapper">
|
||||||
|
{volist name="data.focus_image" id="fo"}
|
||||||
|
<a class="swiper-slide auto-swiper-slide" href="{$fo.link}">
|
||||||
|
<img src="{$fo.image}" alt="{$fo.title}" />
|
||||||
|
</a>
|
||||||
|
{/volist}
|
||||||
|
</div>
|
||||||
|
<div class="swiper-pagination"></div>
|
||||||
|
{/notempty}
|
||||||
|
</div>
|
||||||
|
<!-- 分类 -->
|
||||||
|
{notempty name="data.category"}
|
||||||
|
<div class="nav-box">
|
||||||
|
{volist name="data.category" id="ca"}
|
||||||
|
<a class="nav-item" href="{$ca.link}">
|
||||||
|
<img src="{$ca.image}" alt="{$ca.title}">
|
||||||
|
<p {:style(['color'=>$ca.title_txt_color])}>{$ca.title}</p>
|
||||||
|
</a>
|
||||||
|
{/volist}
|
||||||
|
</div>
|
||||||
|
{/notempty}
|
||||||
|
<!-- 500万 -->
|
||||||
|
{notempty name="data.why_choose"}
|
||||||
|
<div class="advantage-section">
|
||||||
|
{assign name="why_choose_title" value=":array_shift($data.why_choose)" /}
|
||||||
|
<h2 class="advantage-section__title">{$why_choose_title.title|default=''|raw}</h2>
|
||||||
|
<div class="advantage-section__list">
|
||||||
|
{volist name="data.why_choose" id="ch"}
|
||||||
|
<div class="advantage-card-wrap">
|
||||||
|
<div class="advantage-card" data-target="design">
|
||||||
|
<img src="{$ch.image}" alt="{$ch.title}:{$ch.short_title}" class="advantage-card__img">
|
||||||
|
<div class="advantage-card__content">
|
||||||
|
<!-- 标题+箭头容器:水平+垂直双居中,内部文字左、箭头右 -->
|
||||||
|
<div class="advantage-card__heading-wrap">
|
||||||
|
<div class="advantage-card__heading" {:style(['color'=>$ch.title_txt_color])}>{$ch.title}</div>
|
||||||
|
<img src="__IMAGES__/jiant.png" alt="" class="card-arrow">
|
||||||
|
</div>
|
||||||
|
<div class="advantage-card__description" {:style(['color'=>$ch.short_title_txt_color])}>{$ch.short_title}</div>
|
||||||
|
<div style="display:none;" class="mack-conten-text">{$ch.desc|raw}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{/volist}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{/notempty}
|
||||||
|
<!-- 产品差旅充 -->
|
||||||
|
{notempty name="data.travel_charger"}
|
||||||
|
<div class="product-box">
|
||||||
|
{assign name="tc_title" value=":array_shift($data.travel_charger)" /}
|
||||||
|
<div class="product-title">
|
||||||
|
<h2 class="product-title-h2">{$tc_title.title|default=''}</h2>
|
||||||
|
<p class="product-title-p">{$tc_title.short_title|default=''}</p>
|
||||||
|
</div>
|
||||||
|
<div class="product-container" >
|
||||||
|
{assign name="tc_first_section_lf" value=":array_shift($data.travel_charger)" /}
|
||||||
|
{notempty name="tc_first_section_lf"}
|
||||||
|
<a class="product-left" href="{$tc_first_section_lf.link}">
|
||||||
|
<img src="{$tc_first_section_lf.image}" alt="{$tc_first_section_lf.title}" class="product-img">
|
||||||
|
<!-- 公共类+定位类:尺寸统一,定位不同 -->
|
||||||
|
<div class="product-img-hover product-img-1">
|
||||||
|
<img src="{$tc_first_section_lf.extra_image}" alt="{$tc_first_section_lf.short_title}">
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
{/notempty}
|
||||||
|
{assign name="tc_first_section_lr" value=":array_shift($data.travel_charger)" /}
|
||||||
|
{notempty name="tc_first_section_lr"}
|
||||||
|
<div class="product-right">
|
||||||
|
<img src="{$tc_first_section_lr.image}" alt="{$tc_first_section_lr.title}" class="right-content right-img">
|
||||||
|
<video src="{$tc_first_section_lr.video}" class="right-content right-video" muted loop playsinline>
|
||||||
|
您的浏览器不支持HTML5视频播放,请升级浏览器
|
||||||
|
</video>
|
||||||
|
<button class="video-play-btn">
|
||||||
|
<span class="play-icon">
|
||||||
|
<svg width="40" height="40" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<circle cx="12" cy="12" r="10" fill="rgba(0,0,0,0.5)" />
|
||||||
|
<path d="M9 7L16 12L9 17V7Z" fill="white" />
|
||||||
|
</svg>
|
||||||
|
</span>
|
||||||
|
<!-- 暂停图标(默认隐藏) -->
|
||||||
|
<span class="pause-icon">
|
||||||
|
<svg width="40" height="40" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<circle cx="12" cy="12" r="10" fill="rgba(0,0,0,0.5)" />
|
||||||
|
<rect x="8" y="7" width="3" height="10" fill="white" />
|
||||||
|
<rect x="13" y="7" width="3" height="10" fill="white" />
|
||||||
|
</svg>
|
||||||
|
</span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
{/notempty}
|
||||||
|
</div>
|
||||||
|
{assign name="tc_second_section" value=":array_splice($data.travel_charger, 0, 4)" /}
|
||||||
|
{notempty name="tc_second_section"}
|
||||||
|
<div class="product-card-box">
|
||||||
|
<div class="product-card-container">
|
||||||
|
{volist name="tc_second_section" id="tss"}
|
||||||
|
<a class="product-card-wrap" href="{$tss.link}">
|
||||||
|
<div class="product-card" >
|
||||||
|
<div class="product-card-img">
|
||||||
|
<img src="{$tss.image}" alt="{$tss.title}">
|
||||||
|
</div>
|
||||||
|
<div class="product-card-text">
|
||||||
|
<div class="product-card-title" {:style(['color'=>$tss.title_txt_color])}>{$tss.title}</div>
|
||||||
|
<div class="product-card-desc" {:style(['color'=>$tss.short_title_txt_color])}>{$tss.short_title}</div>
|
||||||
|
</div>
|
||||||
|
<div class="product-card-link">
|
||||||
|
<img src="__IMAGES__/ljgd.png" alt="查看更多">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
{/volist}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{assign name="tc_three_section" value=":array_shift($data.travel_charger)" /}
|
||||||
|
{notempty name="tc_three_section"}
|
||||||
|
<a href="{$tc_three_section.link}" class="more">
|
||||||
|
<div class="more-img">
|
||||||
|
{$tc_three_section.title}
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
{/notempty}
|
||||||
|
{/notempty}
|
||||||
|
</div>
|
||||||
|
{/notempty}
|
||||||
|
<!-- 产品 家居充-->
|
||||||
|
{notempty name="data.home_charger"}
|
||||||
|
<div class="product-box">
|
||||||
|
{assign name="hc_title" value=":array_shift($data.home_charger)" /}
|
||||||
|
<div class="product-title">
|
||||||
|
<h2 class="product-title-h2">{$hc_title.title|default=''}</h2>
|
||||||
|
<p class="product-title-p">{$hc_title.short_title|default=''}</p>
|
||||||
|
</div>
|
||||||
|
<div class="product-container">
|
||||||
|
{assign name="hc_first_section_lf" value=":array_shift($data.home_charger)" /}
|
||||||
|
{notempty name="hc_first_section_lf"}
|
||||||
|
<a class="product-left" href="{$hc_first_section_lf.link}">
|
||||||
|
<img src="{$hc_first_section_lf.image}" alt="{$hc_first_section_lf.title}" class="product-img">
|
||||||
|
<!-- 公共类+定位类:尺寸统一,定位不同 -->
|
||||||
|
<div class="product-img-hover product-img-1">
|
||||||
|
<img src="{$hc_first_section_lf.extra_image}" alt="{$hc_first_section_lf.short_title}">
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
{/notempty}
|
||||||
|
{assign name="hc_first_section_lr" value=":array_shift($data.home_charger)" /}
|
||||||
|
{notempty name="hc_first_section_lr"}
|
||||||
|
<div class="product-right">
|
||||||
|
<img src="{$hc_first_section_lr.image}" alt="{$hc_first_section_lr.title}" class="right-content right-img">
|
||||||
|
<video src="{$hc_first_section_lr.video}" class="right-content right-video" muted loop playsinline >
|
||||||
|
您的浏览器不支持HTML5视频播放,请升级浏览器
|
||||||
|
</video>
|
||||||
|
<button class="video-play-btn">
|
||||||
|
<span class="play-icon">
|
||||||
|
<svg width="40" height="40" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<circle cx="12" cy="12" r="10" fill="rgba(0,0,0,0.5)" />
|
||||||
|
<path d="M9 7L16 12L9 17V7Z" fill="white" />
|
||||||
|
</svg>
|
||||||
|
</span>
|
||||||
|
<!-- 暂停图标(默认隐藏) -->
|
||||||
|
<span class="pause-icon">
|
||||||
|
<svg width="40" height="40" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<circle cx="12" cy="12" r="10" fill="rgba(0,0,0,0.5)" />
|
||||||
|
<rect x="8" y="7" width="3" height="10" fill="white" />
|
||||||
|
<rect x="13" y="7" width="3" height="10" fill="white" />
|
||||||
|
</svg>
|
||||||
|
</span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
{/notempty}
|
||||||
|
</div>
|
||||||
|
{assign name="hc_second_section" value=":array_splice($data.home_charger, 0, 4)" /}
|
||||||
|
{notempty name="hc_second_section"}
|
||||||
|
<div class="product-card-box">
|
||||||
|
<div class="product-card-container">
|
||||||
|
{volist name="hc_second_section" id="hcs"}
|
||||||
|
<a class="product-card-wrap" href="{$hcs.link}">
|
||||||
|
<div class="product-card" href="#">
|
||||||
|
<div class="product-card-img">
|
||||||
|
<img src="{$hcs.image}" alt="{$hcs.short_title}">
|
||||||
|
</div>
|
||||||
|
<div class="product-card-text">
|
||||||
|
<div class="product-card-title">{$hcs.title}</div>
|
||||||
|
<div class="product-card-desc">{$hcs.short_title}</div>
|
||||||
|
</div>
|
||||||
|
<div class="product-card-link">
|
||||||
|
<img src="__IMAGES__/ljgd.png" alt="查看更多">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
{/volist}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{/notempty}
|
||||||
|
{assign name="hc_three_section" value=":array_shift($data.home_charger)" /}
|
||||||
|
{notempty name="hc_three_section"}
|
||||||
|
<a href="{$hc_three_section.link}" class="more">
|
||||||
|
<div class="more-img">
|
||||||
|
{$hc_three_section.title}
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
{/notempty}
|
||||||
|
</div>
|
||||||
|
{/notempty}
|
||||||
|
<!-- 产品 桌面充(悬浮图上右超出)底部列表样式不一样(左文右图) -->
|
||||||
|
<div class="product-box">
|
||||||
|
{assign name="dc_title" value=":array_shift($data.desktop_charger)" /}
|
||||||
|
<div class="product-title">
|
||||||
|
<h2 class="product-title-h2">{$dc_title.title|default=''}</h2>
|
||||||
|
<p class="product-title-p">{$dc_title.short_title|default=''}</p>
|
||||||
|
</div>
|
||||||
|
<div class="product-container">
|
||||||
|
{assign name="dc_first_section_lf" value=":array_shift($data.desktop_charger)" /}
|
||||||
|
{notempty name="dc_first_section_lf"}
|
||||||
|
<a class="product-left" href="{$dc_first_section_lf.link}">
|
||||||
|
<img src="{$dc_first_section_lf.image}" alt="{$dc_first_section_lf.short_title}" class="product-img">
|
||||||
|
<!-- 公共类+定位类:尺寸和第一个完全一致,仅定位不同 -->
|
||||||
|
<div class="product-img-hover product-img-2" >
|
||||||
|
<img src="{$dc_first_section_lf.extra_image}" alt="{$dc_first_section_lf.short_title}">
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
{/notempty}
|
||||||
|
{assign name="dc_first_section_lr" value=":array_shift($data.desktop_charger)" /}
|
||||||
|
{notempty name="dc_first_section_lr"}
|
||||||
|
<div class="product-right">
|
||||||
|
<img src="{$dc_first_section_lr.image}"
|
||||||
|
alt="使用场景" class="right-content right-img">
|
||||||
|
<!--muted loop playsinline controls-->
|
||||||
|
<video
|
||||||
|
src="{$dc_first_section_lr.video}"
|
||||||
|
class="right-content right-video" muted loop playsinline >
|
||||||
|
您的浏览器不支持HTML5视频播放,请升级浏览器
|
||||||
|
</video>
|
||||||
|
<button class="video-play-btn">
|
||||||
|
<span class="play-icon">
|
||||||
|
<svg width="40" height="40" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<circle cx="12" cy="12" r="10" fill="rgba(0,0,0,0.5)" />
|
||||||
|
<path d="M9 7L16 12L9 17V7Z" fill="white" />
|
||||||
|
</svg>
|
||||||
|
</span>
|
||||||
|
<!-- 暂停图标(默认隐藏) -->
|
||||||
|
<span class="pause-icon">
|
||||||
|
<svg width="40" height="40" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<circle cx="12" cy="12" r="10" fill="rgba(0,0,0,0.5)" />
|
||||||
|
<rect x="8" y="7" width="3" height="10" fill="white" />
|
||||||
|
<rect x="13" y="7" width="3" height="10" fill="white" />
|
||||||
|
</svg>
|
||||||
|
</span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
{/notempty}
|
||||||
|
</div>
|
||||||
|
{assign name="dc_second_section" value=":array_splice($data.desktop_charger, 0, 2)" /}
|
||||||
|
{notempty name="dc_second_section"}
|
||||||
|
<div class="product-card-box">
|
||||||
|
<div class="product-card-container2">
|
||||||
|
{volist name="dc_second_section" id="dcs"}
|
||||||
|
<a class="product-card2" href="{$dcs.link}">
|
||||||
|
<div class="product-text2">
|
||||||
|
<!-- 新增内部容器,确保所有内容左对齐一致性 -->
|
||||||
|
<div class="product-text-content2">
|
||||||
|
<div class="product-card-title2">{$dcs.title}</div> <!-- 测试超出一行省略 -->
|
||||||
|
<div class="product-card-desc2">{$dcs.short_title}</div> <!-- 测试超出2行省略 -->
|
||||||
|
<div class="product-card-link2">
|
||||||
|
<img src="__IMAGES__/ljgd.png" alt="了解更多">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="product-card-img2">
|
||||||
|
<img src="{$dcs.image}" alt="{$dcs.title}">
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
{/volist}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{/notempty}
|
||||||
|
{assign name="dc_three_section" value=":array_shift($data.desktop_charger)" /}
|
||||||
|
{notempty name="dc_three_section"}
|
||||||
|
<a href="{$dc_three_section.link}" class="more">
|
||||||
|
<div class="more-img">
|
||||||
|
{$dc_three_section.title}
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
{/notempty}
|
||||||
|
</div>
|
||||||
|
<!-- 墙插 -->
|
||||||
|
{notempty name="data.wall_charger"}
|
||||||
|
<div class="product-box">
|
||||||
|
{assign name="wc_title" value=":array_shift($data.wall_charger)" /}
|
||||||
|
<div class="product-title">
|
||||||
|
<h2 class="product-title-h2">{$wc_title.title|default=''}</h2>
|
||||||
|
<p class="product-title-p">{$wc_title.short_title|default=''}</p>
|
||||||
|
</div>
|
||||||
|
<div class="product-container">
|
||||||
|
{assign name="wc_first_section_lf" value=":array_shift($data.wall_charger)" /}
|
||||||
|
{notempty name="wc_first_section_lf"}
|
||||||
|
<a class="product-left" href="{$wc_first_section_lf.link}">
|
||||||
|
<img src="{$wc_first_section_lf.image}" alt="{$wc_first_section_lf.title}" class="product-img">
|
||||||
|
<!-- 公共类+定位类:尺寸统一,定位不同 -->
|
||||||
|
<div class="product-img-hover product-img-1">
|
||||||
|
<img src="{$wc_first_section_lf.extra_image}" alt="{$wc_first_section_lf.title}">
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
{/notempty}
|
||||||
|
{assign name="wc_first_section_lr" value=":array_shift($data.wall_charger)" /}
|
||||||
|
{notempty name="wc_first_section_lr"}
|
||||||
|
<div class="product-right">
|
||||||
|
<img src="{$wc_first_section_lr.image}" alt="{$wc_first_section_lr.title}" class="right-content right-img">
|
||||||
|
<video src="{$wc_first_section_lr.video}" class="right-content right-video" muted loop playsinline>
|
||||||
|
您的浏览器不支持HTML5视频播放,请升级浏览器
|
||||||
|
</video>
|
||||||
|
<button class="video-play-btn">
|
||||||
|
<span class="play-icon">
|
||||||
|
<svg width="40" height="40" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<circle cx="12" cy="12" r="10" fill="rgba(0,0,0,0.5)" />
|
||||||
|
<path d="M9 7L16 12L9 17V7Z" fill="white" />
|
||||||
|
</svg>
|
||||||
|
</span>
|
||||||
|
<!-- 暂停图标(默认隐藏) -->
|
||||||
|
<span class="pause-icon">
|
||||||
|
<svg width="40" height="40" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<circle cx="12" cy="12" r="10" fill="rgba(0,0,0,0.5)" />
|
||||||
|
<rect x="8" y="7" width="3" height="10" fill="white" />
|
||||||
|
<rect x="13" y="7" width="3" height="10" fill="white" />
|
||||||
|
</svg>
|
||||||
|
</span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
{/notempty}
|
||||||
|
</div>
|
||||||
|
{assign name="wc_more_section" value=":array_shift($data.wall_charger)" /}
|
||||||
|
{notempty name="wc_more_section"}
|
||||||
|
<a href="{$wc_more_section.link}" class="more">
|
||||||
|
<div class="more-img">
|
||||||
|
{$wc_more_section.title}
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
{/notempty}
|
||||||
|
</div>
|
||||||
|
{/notempty}
|
||||||
|
{notempty name="data.converter"}
|
||||||
|
<!-- 转换器 -->
|
||||||
|
<div class="product-box">
|
||||||
|
{assign name="ct_title" value=":array_shift($data.converter)" /}
|
||||||
|
<div class="product-title">
|
||||||
|
<h2 class="product-title-h2">{$ct_title.title|default=''}</h2>
|
||||||
|
<p class="product-title-p">{$ct_title.short_title|default=''}</p>
|
||||||
|
</div>
|
||||||
|
{assign name="ct_more_section" value=":array_pop($data.converter)" /}
|
||||||
|
{assign name="ct_chunk_section" value=":array_chunk($data.converter, 2)" /}
|
||||||
|
{assign name="ct_chunk_section_len" value=":count($ct_chunk_section)" /}
|
||||||
|
{volist name="ct_chunk_section" id="cts" key="k"}
|
||||||
|
<div class="product-container">
|
||||||
|
{assign name="cts_lf" value=":array_shift($cts)" /}
|
||||||
|
{notempty name="cts_lf"}
|
||||||
|
<a class="product-left" href="{$cts_lf.link}">
|
||||||
|
<img src="{$cts_lf.image}" alt="{$cts_lf.title}" class="product-img">
|
||||||
|
<!-- 公共类+定位类:尺寸统一,定位不同 -->
|
||||||
|
<!--style="display:flex;justify-content: center;"-->
|
||||||
|
<div class="product-img-hover product-img-1" >
|
||||||
|
<!-- style="width:70%"-->
|
||||||
|
<img src="{$cts_lf.extra_image}" alt="{$cts_lf.title}">
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
{/notempty}
|
||||||
|
{assign name="cts_lr" value=":array_shift($cts)" /}
|
||||||
|
{notempty name="cts_lr"}
|
||||||
|
<div class="product-right">
|
||||||
|
<img src="{$cts_lr.image}" alt="{$cts_lr.title}" class="right-content right-img">
|
||||||
|
<video src="{$cts_lr.video}" class="right-content right-video" muted loop playsinline>
|
||||||
|
您的浏览器不支持HTML5视频播放,请升级浏览器
|
||||||
|
</video>
|
||||||
|
<!-- 播放图标 -->
|
||||||
|
<button class="video-play-btn">
|
||||||
|
<span class="play-icon">
|
||||||
|
<svg width="40" height="40" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<circle cx="12" cy="12" r="10" fill="rgba(0,0,0,0.5)" />
|
||||||
|
<path d="M9 7L16 12L9 17V7Z" fill="white" />
|
||||||
|
</svg>
|
||||||
|
</span>
|
||||||
|
<!-- 暂停图标(默认隐藏) -->
|
||||||
|
<span class="pause-icon">
|
||||||
|
<svg width="40" height="40" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<circle cx="12" cy="12" r="10" fill="rgba(0,0,0,0.5)" />
|
||||||
|
<rect x="8" y="7" width="3" height="10" fill="white" />
|
||||||
|
<rect x="13" y="7" width="3" height="10" fill="white" />
|
||||||
|
</svg>
|
||||||
|
</span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
{/notempty}
|
||||||
|
</div>
|
||||||
|
{neq name="k" value="$ct_chunk_section_len"}
|
||||||
|
<div class="line"></div>
|
||||||
|
{/neq}
|
||||||
|
{/volist}
|
||||||
|
{notempty name="ct_more_section"}
|
||||||
|
<a href="{$ct_more_section.link}" class="more">
|
||||||
|
<div class="more-img">
|
||||||
|
{$ct_more_section.title}
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
{/notempty}
|
||||||
|
</div>
|
||||||
|
{/notempty}
|
||||||
|
{notempty name="data.footer_info"}
|
||||||
|
<!-- 底部 -->
|
||||||
|
<div class="prodline-footer-box">
|
||||||
|
<div class="prodline-footer-box-img">
|
||||||
|
<img src="{$data.footer_info.0.image}" alt="">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{/notempty}
|
||||||
|
<!-- 蒙版 -->
|
||||||
|
<div class="mask" id="mask">
|
||||||
|
<div class="mask-content" >
|
||||||
|
<span class="close-btn">×</span>
|
||||||
|
<div class="mask-scroll-content"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{/block}
|
||||||
|
{block name="script"}
|
||||||
|
<script type="text/javascript">
|
||||||
|
let swiper=null;
|
||||||
|
const advantageItems = document.querySelectorAll('.advantage-card');
|
||||||
|
let scrollTop = 0; // 保存页面滚动位置
|
||||||
|
let closeBtnHtml = null; // 关闭按钮元素(全局变量,避免重复创建)
|
||||||
|
const mask = document.getElementById('mask');
|
||||||
|
const maskContent = document.querySelector('.mask-content');
|
||||||
|
const maskScrollContent = document.querySelector('.mask-scroll-content'); // 滚动容器(关键!)
|
||||||
|
const closeBtn = document.querySelector('.close-btn')
|
||||||
|
// 初始化:确保 maskScrollContent 存在于 maskContent 中(避免被清空)
|
||||||
|
if (!maskScrollContent) {
|
||||||
|
// 如果页面没有 mask-scroll-content,动态创建(确保结构稳定)
|
||||||
|
const scrollContent = document.createElement('div');
|
||||||
|
scrollContent.className = 'mask-scroll-content';
|
||||||
|
maskContent.appendChild(scrollContent);
|
||||||
|
}
|
||||||
|
|
||||||
|
function createCloseBtn() {
|
||||||
|
if (closeBtnHtml) {
|
||||||
|
closeBtnHtml.remove();
|
||||||
|
}
|
||||||
|
|
||||||
|
closeBtnHtml = document.createElement('span');
|
||||||
|
closeBtnHtml.className = 'close-btn';
|
||||||
|
closeBtnHtml.innerHTML = '×';
|
||||||
|
|
||||||
|
closeBtnHtml.addEventListener('click', hideMask);
|
||||||
|
|
||||||
|
// 挂载到 maskContent(而非 scrollContent),避免被滚动影响位置
|
||||||
|
maskContent.prepend(closeBtnHtml);
|
||||||
|
}
|
||||||
|
|
||||||
|
function showMask(contentHtml) {
|
||||||
|
// 保存页面滚动位置
|
||||||
|
scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;
|
||||||
|
|
||||||
|
// 关键:将内容填充到 scrollContent 中(而非直接替换 maskContent)
|
||||||
|
maskScrollContent.innerHTML = contentHtml;
|
||||||
|
createCloseBtn();
|
||||||
|
|
||||||
|
// 显示蒙版
|
||||||
|
mask.style.display = 'flex';
|
||||||
|
|
||||||
|
// 禁止滚动(复用你的逻辑)
|
||||||
|
document.documentElement.classList.add('no-scroll');
|
||||||
|
document.body.classList.add('no-scroll');
|
||||||
|
document.body.style.top = `-${scrollTop}px`;
|
||||||
|
|
||||||
|
// 额外:打开蒙版时就重置滚动位置(避免残留上次滚动状态)
|
||||||
|
maskScrollContent.scrollTop = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function hideMask() {
|
||||||
|
// 关键步骤 1:先重置 scrollContent 的滚动位置(此时元素还未被销毁)
|
||||||
|
maskScrollContent.scrollTop = 0;
|
||||||
|
|
||||||
|
// 关键步骤 2:清空 scrollContent 的内容(而非 maskContent)
|
||||||
|
maskScrollContent.innerHTML = "";
|
||||||
|
|
||||||
|
// 隐藏蒙版
|
||||||
|
mask.style.display = 'none';
|
||||||
|
|
||||||
|
// 恢复滚动(复用你的逻辑)
|
||||||
|
document.documentElement.classList.remove('no-scroll');
|
||||||
|
document.body.classList.remove('no-scroll');
|
||||||
|
document.body.style.top = '';
|
||||||
|
|
||||||
|
// 还原页面滚动位置
|
||||||
|
window.scrollTo(0, scrollTop);
|
||||||
|
|
||||||
|
// 移除关闭按钮(可选,避免残留)
|
||||||
|
if (closeBtnHtml) {
|
||||||
|
closeBtnHtml.remove();
|
||||||
|
closeBtnHtml = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 点击卡片显示详情
|
||||||
|
advantageItems.forEach((item) => {
|
||||||
|
item.addEventListener('click', (e) => {
|
||||||
|
// 获取当前点击卡片内的.mack-conten-text元素
|
||||||
|
const currentMackContent = e.currentTarget.querySelector('.mack-conten-text');
|
||||||
|
if (currentMackContent) {
|
||||||
|
// 关键修改:获取该元素的子内容(innerHTML 本身就是内部HTML,不含当前元素标签)
|
||||||
|
// 若想更彻底,可遍历子节点拼接内容(兼容特殊场景)
|
||||||
|
let contentHtml = '';
|
||||||
|
Array.from(currentMackContent.childNodes).forEach(child => {
|
||||||
|
// 只保留元素节点和文本节点(过滤空节点)
|
||||||
|
if (child.nodeType === 1 || child.nodeType === 3) {
|
||||||
|
contentHtml += child.outerHTML || child.textContent;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
// 显示蒙版并传入纯净的子内容
|
||||||
|
showMask(contentHtml);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
// 关闭按钮事件
|
||||||
|
closeBtn.addEventListener('click', hideMask);
|
||||||
|
// 点击蒙版背景关闭(可选)
|
||||||
|
mask.addEventListener('click', (e) => {
|
||||||
|
if (e.target === mask) hideMask();
|
||||||
|
});
|
||||||
|
|
||||||
|
// ESC 键关闭(可选)
|
||||||
|
document.addEventListener('keydown', (e) => {
|
||||||
|
if (e.key === 'Escape' && mask.style.display === 'flex') hideMask();
|
||||||
|
});
|
||||||
|
|
||||||
|
// 关键:拦截蒙版的 touchmove 事件,阻止滚动穿透(移动端核心)
|
||||||
|
mask.addEventListener(
|
||||||
|
'touchmove',
|
||||||
|
(e) => {
|
||||||
|
// 只有点击蒙版背景(不是内容区域)才阻止滚动
|
||||||
|
if (e.target === mask) {
|
||||||
|
e.preventDefault(); // 阻止默认触摸滚动行为
|
||||||
|
e.stopPropagation(); // 阻止事件冒泡
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ passive: false }
|
||||||
|
); // passive: false 必须,否则 preventDefault 无效
|
||||||
|
document.addEventListener('DOMContentLoaded', () => {
|
||||||
|
// 初始化所有视频容器
|
||||||
|
function initVideoContainers() {
|
||||||
|
const productRights = document.querySelectorAll('.product-right');
|
||||||
|
// 支持的视频格式
|
||||||
|
const supportedVideoFormats = ['.mp4', '.webm', '.ogg', '.mov', '.avi', '.mkv', '.flv', '.wmv'];
|
||||||
|
productRights.forEach((container, index) => {
|
||||||
|
const video = container.querySelector('.right-video');
|
||||||
|
const btn = container.querySelector('.video-play-btn');
|
||||||
|
const img = container.querySelector('.right-img');
|
||||||
|
if (!video || !btn || !img) return;
|
||||||
|
const videoSrc = video.src.trim()
|
||||||
|
console.log(videoSrc,'=videoSrc=')
|
||||||
|
// 修复:正确检测有效视频地址
|
||||||
|
// 排除空字符串、null、undefined
|
||||||
|
const hasValidVideo = !!videoSrc && videoSrc.trim() !== '' && videoSrc !== 'undefined' && videoSrc !== 'null';
|
||||||
|
|
||||||
|
// 验证视频格式是否有效
|
||||||
|
const isValidFormat = supportedVideoFormats.some(format =>
|
||||||
|
videoSrc.toLowerCase().endsWith(format) ||
|
||||||
|
(videoSrc.includes('?') && videoSrc.toLowerCase().split('?')[0].endsWith(format))
|
||||||
|
);
|
||||||
|
|
||||||
|
// 初始化状态:无视频或格式无效则保持图片显示,永不切换
|
||||||
|
if (!hasValidVideo || !isValidFormat) {
|
||||||
|
img.style.display = 'block';
|
||||||
|
video.style.display = 'none';
|
||||||
|
btn.style.display = 'none';
|
||||||
|
// 绑定空方法,防止调用报错
|
||||||
|
video.switchMedia = function() {};
|
||||||
|
console.log(`容器${index}:无有效视频(src="${videoSrc}"),保持图片显示`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 有有效视频的情况
|
||||||
|
console.log(`容器${index}:有有效视频(src="${videoSrc}"),初始化播放逻辑`);
|
||||||
|
|
||||||
|
// 初始状态
|
||||||
|
video.style.display = 'none';
|
||||||
|
video.pause();
|
||||||
|
img.style.display = 'block';
|
||||||
|
btn.style.display = 'none';
|
||||||
|
btn.style.opacity = '0';
|
||||||
|
|
||||||
|
// 同步状态函数
|
||||||
|
function syncMediaState() {
|
||||||
|
if (img.style.display === 'block') {
|
||||||
|
btn.style.display = 'none';
|
||||||
|
btn.style.opacity = '0';
|
||||||
|
} else {
|
||||||
|
btn.style.display = 'block';
|
||||||
|
btn.style.opacity = '1';
|
||||||
|
btn.classList.toggle('paused', !video.paused && !video.ended);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 按钮点击事件
|
||||||
|
btn.addEventListener('click', () => {
|
||||||
|
if (video.paused) {
|
||||||
|
video.play().catch(() => syncMediaState());
|
||||||
|
} else {
|
||||||
|
video.pause();
|
||||||
|
}
|
||||||
|
syncMediaState();
|
||||||
|
});
|
||||||
|
|
||||||
|
// 视频事件监听
|
||||||
|
['play', 'pause', 'ended', 'playing', 'waiting'].forEach(event => {
|
||||||
|
video.addEventListener(event, syncMediaState);
|
||||||
|
});
|
||||||
|
|
||||||
|
// 滚动切换函数
|
||||||
|
video.switchMedia = function(showVideo) {
|
||||||
|
// 只处理有有效视频的情况
|
||||||
|
if (showVideo) {
|
||||||
|
img.style.display = 'none';
|
||||||
|
video.style.display = 'block';
|
||||||
|
video.play().catch(() => {
|
||||||
|
console.log(`容器${index}:自动播放失败,需要用户交互`);
|
||||||
|
syncMediaState();
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
video.pause();
|
||||||
|
img.style.display = 'block';
|
||||||
|
video.style.display = 'none';
|
||||||
|
}
|
||||||
|
syncMediaState();
|
||||||
|
};
|
||||||
|
|
||||||
|
// 初始同步
|
||||||
|
syncMediaState();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// 滚动监听 - 优化版
|
||||||
|
function setupScrollWatcher() {
|
||||||
|
let ticking = false;
|
||||||
|
|
||||||
|
function updateVideoVisibility() {
|
||||||
|
const productRights = document.querySelectorAll('.product-right');
|
||||||
|
|
||||||
|
productRights.forEach(container => {
|
||||||
|
const video = container.querySelector('.right-video');
|
||||||
|
if (!video || !video.switchMedia) return;
|
||||||
|
|
||||||
|
// 检查是否在视口中
|
||||||
|
const rect = container.getBoundingClientRect();
|
||||||
|
const viewHeight = window.innerHeight || document.documentElement.clientHeight;
|
||||||
|
const isInView = rect.top < viewHeight * 0.7 && rect.bottom > viewHeight * 0.3;
|
||||||
|
|
||||||
|
// 只对有有效视频的元素调用switchMedia
|
||||||
|
video.switchMedia(isInView);
|
||||||
|
});
|
||||||
|
|
||||||
|
ticking = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 使用requestAnimationFrame优化性能
|
||||||
|
window.addEventListener('scroll', () => {
|
||||||
|
if (!ticking) {
|
||||||
|
requestAnimationFrame(updateVideoVisibility);
|
||||||
|
ticking = true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// 初始化
|
||||||
|
initVideoContainers();
|
||||||
|
setupScrollWatcher();
|
||||||
|
|
||||||
|
// 初始检查一次
|
||||||
|
setTimeout(() => {
|
||||||
|
const event = new Event('scroll');
|
||||||
|
window.dispatchEvent(event);
|
||||||
|
}, 300);
|
||||||
|
});
|
||||||
|
|
||||||
|
window.onload = function () {
|
||||||
|
if (typeof Swiper === 'undefined') {
|
||||||
|
console.error('Swiper加载失败,请刷新页面重试');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
swiper = new Swiper('.auto-swiper-container', {
|
||||||
|
autoplay: {
|
||||||
|
delay: 3000, // 3秒切换
|
||||||
|
disableOnInteraction: false,
|
||||||
|
},
|
||||||
|
loop: false,
|
||||||
|
slidesPerView: 1,
|
||||||
|
spaceBetween: 0,
|
||||||
|
// 启用分页指示标(核心配置)
|
||||||
|
pagination: {
|
||||||
|
el: '.swiper-pagination', // 对应 HTML 中的指示标容器
|
||||||
|
clickable: true, // 允许点击指示标切换
|
||||||
|
// dynamicBullets: true, // 动态指示标(当前激活放大)
|
||||||
|
//dynamicMainBullets: 3, // 动态模式显示3个核心指示标
|
||||||
|
},
|
||||||
|
navigation: false,
|
||||||
|
scrollbar: false,
|
||||||
|
on: {
|
||||||
|
resize: function () {
|
||||||
|
this.update();
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
window.addEventListener('resize', function () {
|
||||||
|
swiper.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
// 初始化时触发滚动事件,确保状态正确
|
||||||
|
window.dispatchEvent(new Event('scroll'));
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
{/block}
|
||||||
@@ -5,7 +5,7 @@
|
|||||||
{block name="main"}
|
{block name="main"}
|
||||||
<div class="orico_Page_achievement">
|
<div class="orico_Page_achievement">
|
||||||
<div class="achievementMain">
|
<div class="achievementMain">
|
||||||
<img src="__IMAGES__/Achievement.png" class="acvImg" />
|
<img src="__IMAGES__/Achievement.webp" class="acvImg" />
|
||||||
<div class="achInfo">
|
<div class="achInfo">
|
||||||
<div class="title">{:lang_i18n('ORICO荣耀')}</div>
|
<div class="title">{:lang_i18n('ORICO荣耀')}</div>
|
||||||
{notempty name="achievement"}
|
{notempty name="achievement"}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
<div class="orico_Page_brand">
|
<div class="orico_Page_brand">
|
||||||
<!--内容 -->
|
<!--内容 -->
|
||||||
<div class="brandMain">
|
<div class="brandMain">
|
||||||
<img src="__IMAGES__/OurBrand.png" class="img-responsive" />
|
<img src="__IMAGES__/OurBrand.webp" class="img-responsive" />
|
||||||
{notempty name="banners"}
|
{notempty name="banners"}
|
||||||
<div class="our_brand_con">
|
<div class="our_brand_con">
|
||||||
{volist name="banners" id="ba" offset="0" length="2"}
|
{volist name="banners" id="ba" offset="0" length="2"}
|
||||||
|
|||||||
@@ -21,10 +21,12 @@
|
|||||||
<div class="ct">
|
<div class="ct">
|
||||||
<div class="blog_title">
|
<div class="blog_title">
|
||||||
<h2>{$detail.title}</h2>
|
<h2>{$detail.title}</h2>
|
||||||
<p>{$detail.release_time}</p>
|
<p>{$detail.release_time|date_format_i18n}</p>
|
||||||
</div>
|
</div>
|
||||||
<!-- 文本渲染-->
|
<!-- 文本渲染-->
|
||||||
<div class="blog_content">{$detail.content|raw}</div>
|
<div class="ql-container">
|
||||||
|
<div class="blog_content ql-editor">{$detail.content|raw}</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!-- 评论只显示前面五条--->
|
<!-- 评论只显示前面五条--->
|
||||||
{notempty name="comments"}
|
{notempty name="comments"}
|
||||||
|
|||||||
@@ -23,6 +23,7 @@
|
|||||||
<div class="categorySearch">
|
<div class="categorySearch">
|
||||||
<form action="{:url('article/index', ['pid' => $Request.param.pid])}" method="get">
|
<form action="{:url('article/index', ['pid' => $Request.param.pid])}" method="get">
|
||||||
<i class="search_icon"></i>
|
<i class="search_icon"></i>
|
||||||
|
<input type="hidden" name="cid" value="{$Request.param.cid}" />
|
||||||
<input type="text" class="search" id="article-search-in" name="keywords" value="">
|
<input type="text" class="search" id="article-search-in" name="keywords" value="">
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
@@ -36,13 +37,15 @@
|
|||||||
<img src="{$ar.image}" />
|
<img src="{$ar.image}" />
|
||||||
<h3>{$ar.title}</h3>
|
<h3>{$ar.title}</h3>
|
||||||
<p>{$ar.desc}</p>
|
<p>{$ar.desc}</p>
|
||||||
<p>{$ar.release_time}</p>
|
<p>{$ar.release_time|date_format_i18n}</p>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
{/volist}
|
{/volist}
|
||||||
</div>
|
</div>
|
||||||
<!-- 分页-->
|
<!-- 分页-->
|
||||||
<div>{$articles|raw}</div>
|
<div>{$articles|raw}</div>
|
||||||
|
{else/}
|
||||||
|
<div style="text-align: center; padding: 10%;">暂无数据</div>
|
||||||
</div>
|
</div>
|
||||||
{/notempty}
|
{/notempty}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -7,14 +7,14 @@
|
|||||||
<!-- 内容 -->
|
<!-- 内容 -->
|
||||||
<div class="downloadMain">
|
<div class="downloadMain">
|
||||||
<div class="topimg">
|
<div class="topimg">
|
||||||
<img src="__IMAGES__/banner_01.png" />
|
<img src="__IMAGES__/banner_01.webp" />
|
||||||
<div class="banner_title">{:lang_i18n('软件和驱动程序')}</div>
|
<div class="banner_title">{:lang_i18n('软件和驱动程序')}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="contact_c">
|
<div class="contact_c">
|
||||||
<!-- 搜索 -->
|
<!-- 搜索 -->
|
||||||
<form action="{:url('attachment/index')}" method="get">
|
<form action="{:url('attachment/index')}" method="get">
|
||||||
<div class="search_all">
|
<div class="search_all">
|
||||||
<input type="hidden" name="id" value="{$Request.get.id}" />
|
<input type="hidden" name="id" value="{$Request.get.id??$categorys[0]['id']??''}" />
|
||||||
<input type="text" name="keyword" placeholder="{:lang_i18n('搜索')}" />
|
<input type="text" name="keyword" placeholder="{:lang_i18n('搜索')}" />
|
||||||
<button class="searchbtn" type="submit"><img src="__IMAGES__/search_blue.png" /></button>
|
<button class="searchbtn" type="submit"><img src="__IMAGES__/search_blue.png" /></button>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -7,13 +7,14 @@
|
|||||||
<!-- 内容 -->
|
<!-- 内容 -->
|
||||||
<div class="downloadMain">
|
<div class="downloadMain">
|
||||||
<div class="topimg">
|
<div class="topimg">
|
||||||
<img src="__IMAGES__/banner_01.png" />
|
<img src="__IMAGES__/banner_01.webp" />
|
||||||
<div class="banner_title">{:lang_i18n('软件和驱动程序')}</div>
|
<div class="banner_title">{:lang_i18n('软件和驱动程序')}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="contact_c">
|
<div class="contact_c">
|
||||||
<!-- 搜索 -->
|
<!-- 搜索 -->
|
||||||
<form action="{:url('attachment/video')}" method="get">
|
<form action="{:url('attachment/video')}" method="get">
|
||||||
<div class="search_all">
|
<div class="search_all">
|
||||||
|
<input type="hidden" name="id" value="{$Request.get.id??$video_categorys[0]['id']??''}" />
|
||||||
<input type="text" name="keyword" placeholder="{:lang_i18n('搜索')}" />
|
<input type="text" name="keyword" placeholder="{:lang_i18n('搜索')}" />
|
||||||
<button class="searchbtn" type="submit"><img src="__IMAGES__/search_blue.png" /></button>
|
<button class="searchbtn" type="submit"><img src="__IMAGES__/search_blue.png" /></button>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -46,7 +46,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="bditem">
|
<div class="bditem">
|
||||||
<label class="itlable">{:lang_i18n('在线商店网址')}</label>
|
<label class="itlable">{:lang_i18n('在线商店网址')}</label>
|
||||||
<input type="text" class="form-control itinp" name="url" placeholder="{:lang_i18n('请输入网址')}" />
|
<input type="text" class="form-control itinp" name="website_url" placeholder="{:lang_i18n('请输入网址')}" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="theit">
|
<div class="theit">
|
||||||
|
|||||||
@@ -23,17 +23,13 @@
|
|||||||
{volist name="items" id="item"}
|
{volist name="items" id="item"}
|
||||||
<a class="narskfit" href="{$item.link}">
|
<a class="narskfit" href="{$item.link}">
|
||||||
<img src="{$item.image}" class="narskico-img" />
|
<img src="{$item.image}" class="narskico-img" />
|
||||||
<span class="narskf-title">{$item.title}</span>
|
<span class="narskf-title" {:style(['color' => $item['title_txt_color']])}>{$item.title}</span>
|
||||||
{notempty name="item.title_short"}
|
|
||||||
<span class="narskf-sm">{$item.title_short}</span>
|
|
||||||
{/notempty}
|
|
||||||
{notempty name="item.desc"}
|
{notempty name="item.desc"}
|
||||||
{if condition="str_contains($item.desc, '<img')"}
|
<span class="narskf-sm" {:style(['color' => $item['desc_txt_color']])}>{$item.desc|raw}</span>
|
||||||
|
{/notempty}
|
||||||
|
{notempty name="item.extra_image"}
|
||||||
<div class="narskfactive-ewm">
|
<div class="narskfactive-ewm">
|
||||||
{else/}
|
<img src="{$item.extra_image}" alt="" />
|
||||||
<div class="narskf-sm narskf-font-26">
|
|
||||||
{/if}
|
|
||||||
{$item.desc|raw}
|
|
||||||
</div>
|
</div>
|
||||||
{/notempty}
|
{/notempty}
|
||||||
</a>
|
</a>
|
||||||
@@ -43,8 +39,8 @@
|
|||||||
<div class="narskfit narskfit2">
|
<div class="narskfit narskfit2">
|
||||||
<img src="{$item.image}" class="narskico-img" />
|
<img src="{$item.image}" class="narskico-img" />
|
||||||
<div class="narskfit2-ct">
|
<div class="narskfit2-ct">
|
||||||
<span class="narskf-title">{$item.title}</span>
|
<span class="narskf-title" {:style(['color' => $item['title_txt_color']])}>{$item.title}</span>
|
||||||
<span class="narskf-sm">{$item.desc|raw}</span>
|
<span class="narskf-sm" {:style(['color' => $item['desc_txt_color']])}>{$item.desc|raw}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{/volist}
|
{/volist}
|
||||||
|
|||||||
@@ -104,7 +104,7 @@
|
|||||||
<div class="hotvideo">
|
<div class="hotvideo">
|
||||||
<video poster="{$video.image}" src="{$video.video}" style="max-height:50rem;z-index:9999;width: 100%;object-fit: cover;" autoplay loop controls id="oricoVideo"></video>
|
<video poster="{$video.image}" src="{$video.video}" style="max-height:50rem;z-index:9999;width: 100%;object-fit: cover;" autoplay loop controls id="oricoVideo"></video>
|
||||||
</div>
|
</div>
|
||||||
<img src="{$video.image}" class="hotImg" />
|
<!-- <img src="{$video.image}" class="hotImg" /> -->
|
||||||
</div>
|
</div>
|
||||||
{/notempty}
|
{/notempty}
|
||||||
<!-- 场景介绍 -->
|
<!-- 场景介绍 -->
|
||||||
@@ -112,13 +112,13 @@
|
|||||||
<div class="sceneIntroduction">
|
<div class="sceneIntroduction">
|
||||||
{volist name="scenes" id="scene"}
|
{volist name="scenes" id="scene"}
|
||||||
<div class="sceneitem">
|
<div class="sceneitem">
|
||||||
<div class="sceneInfo">
|
<a class="sceneInfo" href="{$scene.link}">
|
||||||
<p class="scenetitle" {notempty name="scene.title_txt_color" }style="color:{$scene.title_txt_color};" {/notempty}>{$scene.title}</p>
|
<!-- <p class="scenetitle" {notempty name="scene.title_txt_color" }style="color:{$scene.title_txt_color};" {/notempty}>{$scene.title}</p>
|
||||||
<p class="subtitle" {notempty name="scene.desc_txt_color" }style="color:{$scene.desc_txt_color};" {/notempty}>
|
<p class="subtitle" {notempty name="scene.desc_txt_color" }style="color:{$scene.desc_txt_color};" {/notempty}>
|
||||||
{$scene.desc|raw}</p>
|
{$scene.desc|raw}</p>
|
||||||
<a class="sceneMore" href="{$scene.link}">{:lang_i18n('了解更多')} ></a>
|
<a class="sceneMore" href="{$scene.link}">{:lang_i18n('了解更多')} ></a> -->
|
||||||
</div>
|
<div style="background-image: url('{$scene.image}');" class="sceneimg"></div>
|
||||||
<div style="background-image: url('{$scene.image}');" class="sceneimg"></div>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
{/volist}
|
{/volist}
|
||||||
</div>
|
</div>
|
||||||
@@ -129,10 +129,10 @@
|
|||||||
<span class="otsbtitle">{:lang_i18n('强大功能、简单使用')}</span>
|
<span class="otsbtitle">{:lang_i18n('强大功能、简单使用')}</span>
|
||||||
<div class="beforeafter ba-slider">
|
<div class="beforeafter ba-slider">
|
||||||
<!-- 对比前的图片 -->
|
<!-- 对比前的图片 -->
|
||||||
<img src="__IMAGES__/indeximg1.jpg">
|
<img src="__IMAGES__/indeximg1.webp">
|
||||||
<div class="resize">
|
<div class="resize">
|
||||||
<!-- 对比后的图片 -->
|
<!-- 对比后的图片 -->
|
||||||
<img src="__IMAGES__/indeximg2.jpg">
|
<img src="__IMAGES__/indeximg2.webp">
|
||||||
</div>
|
</div>
|
||||||
<!-- 可拖动的分隔条 -->
|
<!-- 可拖动的分隔条 -->
|
||||||
<span class="handle"></span>
|
<span class="handle"></span>
|
||||||
|
|||||||
@@ -22,7 +22,11 @@
|
|||||||
<a class="pathname" href="/">{:lang_i18n('首页')}</a>
|
<a class="pathname" href="/">{:lang_i18n('首页')}</a>
|
||||||
{volist name="product_categorys" id="ca"}
|
{volist name="product_categorys" id="ca"}
|
||||||
<div class="arrow"></div>
|
<div class="arrow"></div>
|
||||||
|
{eq name="ca.pid" value="0"}
|
||||||
<a class="pathname" href="{:url('product/category', ['id' => $ca.id])}">{$ca.name}</a>
|
<a class="pathname" href="{:url('product/category', ['id' => $ca.id])}">{$ca.name}</a>
|
||||||
|
{else /}
|
||||||
|
<a class="pathname" href="{:url('product/subcategory', ['id' => $ca.id])}">{$ca.name}</a>
|
||||||
|
{/eq}
|
||||||
{/volist}
|
{/volist}
|
||||||
</div>
|
</div>
|
||||||
<!-- 产品主图切换和参数详情-->
|
<!-- 产品主图切换和参数详情-->
|
||||||
@@ -35,33 +39,26 @@
|
|||||||
<!-- 左边切换按钮 -->
|
<!-- 左边切换按钮 -->
|
||||||
<div class="scrollbutton smallImgUp disabled"></div>
|
<div class="scrollbutton smallImgUp disabled"></div>
|
||||||
<!-- 小图片预览 -->
|
<!-- 小图片预览 -->
|
||||||
<div id="imageMenu">
|
<div id="imageMenu_{$sku.id}" class="imageMenu">
|
||||||
<ul class="image_list">
|
<ul class="image_list">
|
||||||
|
{volist name="sku.photo_album" id="photo"}
|
||||||
|
<li class="onlickImg"><img src="{:thumb($photo)}" data-url="{$photo}" /></li>
|
||||||
|
{/volist}
|
||||||
{if condition="!empty($product.video_img) && !empty($product.video_url) && $idx == 1"}
|
{if condition="!empty($product.video_img) && !empty($product.video_url) && $idx == 1"}
|
||||||
<!-- 产品视频 -->
|
<!-- 产品视频 -->
|
||||||
<li id="onlickImg"><img src="{:thumb($product.video_img)}" data-url="{$product.video_url}" /></li>
|
<li class="onlickImg"><img src="{:thumb($product.video_img)}" data-url="{$product.video_url}" /></li>
|
||||||
{/if}
|
{/if}
|
||||||
{volist name="sku.photo_album" id="photo"}
|
|
||||||
<li id="onlickImg"><img src="{:thumb($photo)}" data-url="{$photo}" /></li>
|
|
||||||
{/volist}
|
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<!-- 右边切换按钮 -->
|
<!-- 右边切换按钮 -->
|
||||||
<div class="scrollbutton smallImgDown"></div>
|
<div class="scrollbutton smallImgDown"></div>
|
||||||
</div>
|
</div>
|
||||||
<!-- 产品大图 -->
|
<!-- 产品大图 -->
|
||||||
<div class="bigImg" id="vertical">
|
<div class="bigImg" id="vertical" style="width: 75%;">
|
||||||
<!-- 主图 -->
|
<!-- 主图 -->
|
||||||
{if condition="!empty($product.video_img) && !empty($product.video_url) && $idx == 1"}
|
|
||||||
<!-- 如果有视频情况下默认先显示视频 -->
|
|
||||||
<video poster="{$product.video_img}" autoplay="autoplay" muted="muted" loop="loop" id="video" controls style="width: 510px;height: 510px; position: relative;z-index: 998;">
|
|
||||||
<source src="{$product.video_url}" type="video/mp4"/>
|
|
||||||
</video>
|
|
||||||
{else/}
|
|
||||||
{notempty name="sku.photo_album[0]"}
|
{notempty name="sku.photo_album[0]"}
|
||||||
<img src="{$sku.photo_album[0]}" id="midimg" />
|
<img src="{$sku.photo_album[0]}" id="midimg" />
|
||||||
{/notempty}
|
{/notempty}
|
||||||
{/if}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{/volist}
|
{/volist}
|
||||||
@@ -73,6 +70,11 @@
|
|||||||
<p>{$product.short_name|default=''}</p>
|
<p>{$product.short_name|default=''}</p>
|
||||||
<div class="proTfg">
|
<div class="proTfg">
|
||||||
<ul class="swt-Table">
|
<ul class="swt-Table">
|
||||||
|
<li class="Table-Row">
|
||||||
|
<div class="ms3 Table-Cell">{:lang_i18n('型号')}</div>
|
||||||
|
<div class="ms2 Table-Cell"></div>
|
||||||
|
<div class="ms4 Table-Cell">{$product.spu}</div>
|
||||||
|
</li>
|
||||||
{volist name="product_params" id="pp"}
|
{volist name="product_params" id="pp"}
|
||||||
<li class="Table-Row">
|
<li class="Table-Row">
|
||||||
<div class="ms3 Table-Cell">{$pp.name}</div>
|
<div class="ms3 Table-Cell">{$pp.name}</div>
|
||||||
@@ -82,7 +84,7 @@
|
|||||||
{/volist}
|
{/volist}
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<!-- 颜色-->
|
<!-- 颜色/属性 -->
|
||||||
{volist name="product_sku_attrs" id="ps"}
|
{volist name="product_sku_attrs" id="ps"}
|
||||||
<div class="prcolors">
|
<div class="prcolors">
|
||||||
<div class="dt">{$ps.attr_name}</div>
|
<div class="dt">{$ps.attr_name}</div>
|
||||||
@@ -114,7 +116,10 @@
|
|||||||
{volist name="product_purchase_links" id="ppp" key="k"}
|
{volist name="product_purchase_links" id="ppp" key="k"}
|
||||||
<a class="thebt bttype{$k}" href="{$ppp.link}">{$ppp.platform_name}</a>
|
<a class="thebt bttype{$k}" href="{$ppp.link}">{$ppp.platform_name}</a>
|
||||||
{/volist}
|
{/volist}
|
||||||
|
<br/>
|
||||||
|
{eq name=":cookie('think_lang')" value="en-us"}
|
||||||
<a class="thebt bttype3" id="open_form_modal">{:lang_i18n('发送查询')}</a>
|
<a class="thebt bttype3" id="open_form_modal">{:lang_i18n('发送查询')}</a>
|
||||||
|
{/eq}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -128,8 +133,10 @@
|
|||||||
{/notempty}
|
{/notempty}
|
||||||
</div>
|
</div>
|
||||||
<!-- 富文本渲染-->
|
<!-- 富文本渲染-->
|
||||||
<div class="products_des" id="detail">
|
<div class="ql-container">
|
||||||
{$product.detail|default=''|raw}
|
<div class="products_des ql-editor" id="detail">
|
||||||
|
{$product.detail|default=''|raw}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!-- 关联产品 -->
|
<!-- 关联产品 -->
|
||||||
@@ -223,7 +230,7 @@
|
|||||||
<textarea name="message" id="message"></textarea>
|
<textarea name="message" id="message"></textarea>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<button type="button" id="send" class="submit-btn">{:lang_i18n('提交')}</button>
|
<button type="submit" class="submit-btn">{:lang_i18n('提交')}</button>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -271,21 +278,12 @@
|
|||||||
// 处理表单提交
|
// 处理表单提交
|
||||||
modal.find("form").submit(function(e) {
|
modal.find("form").submit(function(e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
var form = $(this)
|
||||||
var formData = $(this).serialize();
|
var formData = $(this).serialize();
|
||||||
// 这里可以添加代码将formData发送到服务器
|
|
||||||
// 例如通过AJAX
|
|
||||||
console.log("提交的数据: " + formData);
|
|
||||||
// 提交成功后可以选择关闭模态框
|
|
||||||
modal.hide();
|
|
||||||
});
|
|
||||||
|
|
||||||
// 提交询盘
|
|
||||||
$('#send').click(function() {
|
|
||||||
var form = $(this).parents('form');
|
|
||||||
$.ajax({
|
$.ajax({
|
||||||
url: "{:url('product/inquiry')}",
|
url: "{:url('product/inquiry')}",
|
||||||
type: 'POST',
|
type: 'POST',
|
||||||
data: form.serialize(),
|
data: formData,
|
||||||
success: function(r) {
|
success: function(r) {
|
||||||
if (r.code == 0) {
|
if (r.code == 0) {
|
||||||
form[0].reset(); // 重置表单
|
form[0].reset(); // 重置表单
|
||||||
@@ -295,6 +293,7 @@
|
|||||||
},
|
},
|
||||||
error: function(e) {
|
error: function(e) {
|
||||||
console.error(e);
|
console.error(e);
|
||||||
|
modal.hide();
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
@@ -330,8 +329,6 @@
|
|||||||
slidesPerView: 3,
|
slidesPerView: 3,
|
||||||
spaceBetween: 30,
|
spaceBetween: 30,
|
||||||
slidesPerGroup: 3,
|
slidesPerGroup: 3,
|
||||||
loop: true,
|
|
||||||
loopFillGroupWithBlank: true,
|
|
||||||
navigation: {
|
navigation: {
|
||||||
nextEl: '.swiper-button-next',
|
nextEl: '.swiper-button-next',
|
||||||
prevEl: '.swiper-button-prev',
|
prevEl: '.swiper-button-prev',
|
||||||
|
|||||||
@@ -14,6 +14,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
<!-- 搜索结果列表-->
|
<!-- 搜索结果列表-->
|
||||||
|
{notempty name="products"}
|
||||||
<ul class="seul">
|
<ul class="seul">
|
||||||
{volist name="products" id="pro"}
|
{volist name="products" id="pro"}
|
||||||
<a href="{:url('product/detail', ['id' => $pro['id']])}">
|
<a href="{:url('product/detail', ['id' => $pro['id']])}">
|
||||||
@@ -32,6 +33,10 @@
|
|||||||
</a>
|
</a>
|
||||||
{/volist}
|
{/volist}
|
||||||
</ul>
|
</ul>
|
||||||
|
<div>{$page|raw}</div>
|
||||||
|
{else/}
|
||||||
|
<div style="text-align: center; padding: 10%;">{:lang_i18n('暂无数据')}</div>
|
||||||
|
{/notempty}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{/block}
|
{/block}
|
||||||
@@ -1,32 +1,136 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
|
||||||
<meta charset="utf-8" />
|
<head>
|
||||||
{block name="title"}<title>{$basic_config['website_seo_title']['value']}</title>{/block}
|
<meta charset="utf-8" />
|
||||||
{block name="seo"}
|
{block name="title"}<title>{$basic_config['website_seo_title']['value']}</title>{/block}
|
||||||
<meta name="keywords" content="{$basic_config['website_seo_keyword']['value']}" />
|
{block name="seo"}
|
||||||
<meta name="description" content="{$basic_config['website_seo_description']['value']}" />
|
<meta name="keywords" content="{$basic_config['website_seo_keyword']['value']}" />
|
||||||
{/block}
|
<meta name="description" content="{$basic_config['website_seo_description']['value']}" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
{/block}
|
||||||
<link rel="stylesheet" type="text/css" href="__CSS__/public.css" />
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
<link rel="stylesheet" type="text/css" href="__CSS__/fonts.css" />
|
<link rel="stylesheet" type="text/css" href="__CSS__/public.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="__CSS__/orico_header.css" />
|
<link rel="stylesheet" type="text/css" href="__CSS__/fonts.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="__CSS__/orico_footer.css" />
|
<link rel="stylesheet" type="text/css" href="__CSS__/orico_header.css" />
|
||||||
{block name="style"}{/block}
|
<link rel="stylesheet" type="text/css" href="__CSS__/orico_footer.css" />
|
||||||
<link rel="stylesheet" href="https://unpkg.com/swiper@9/swiper-bundle.min.css">
|
{block name="style"}{/block}
|
||||||
<script type="text/javascript" src='https://code.jquery.com/jquery-3.6.0.min.js'></script>
|
<script>
|
||||||
<script type="text/javascript" src="https://unpkg.com/swiper@9.4.1/swiper-bundle.min.js"></script>
|
// 增强型 UC 浏览器检测
|
||||||
<script type="text/javascript" src="__JS__/before-after.min.js"></script>
|
function isUCBrowser() {
|
||||||
<script type="text/javascript" src="__JS__/large.js"></script>
|
const ua = navigator.userAgent.toLowerCase();
|
||||||
</head>
|
return ua.includes('ubrowser');
|
||||||
<body>
|
}
|
||||||
{block name="header"}
|
|
||||||
{include file="public/header"/}
|
// 直接输出对应的 HTML 标签
|
||||||
{/block}
|
if (isUCBrowser()) {
|
||||||
{block name="main"}{/block}
|
document.write(`
|
||||||
{block name="footer"}
|
<link rel="stylesheet" href="__JS__/swiper-bundle8.4.7.min.css">
|
||||||
{include file="public/footer"/}
|
<script type="text/javascript" src="__JS__/swiper-bundle8.4.7.min.js"><\/script>
|
||||||
{/block}
|
`);
|
||||||
{block name="script"}{/block}
|
} else {
|
||||||
</body>
|
document.write(`
|
||||||
|
<link rel="stylesheet" href="__JS__/swiper-bundle9.4.1.min.css">
|
||||||
|
<script type="text/javascript" src="__JS__/swiper-bundle9.4.1.min.js"><\/script>
|
||||||
|
`);
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<!-- 你的 jQuery 和其他脚本 -->
|
||||||
|
<script src="__JS__/jquery-3.6.0.min.js"></script>
|
||||||
|
<script type="text/javascript" src="__JS__/before-after.min.js"></script>
|
||||||
|
<script type="text/javascript" src="__JS__/large.js"></script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
function detectDeviceByResolution() {
|
||||||
|
// 获取屏幕信息
|
||||||
|
const screenWidth = window.screen.width;
|
||||||
|
const screenHeight = window.screen.height;
|
||||||
|
const aspectRatio = screenWidth / screenHeight;
|
||||||
|
const pixelDensity = window.devicePixelRatio || 1;
|
||||||
|
|
||||||
|
// 计算物理屏幕尺寸(对角线英寸数)
|
||||||
|
// 注意:此计算依赖浏览器提供准确的 devicePixelRatio
|
||||||
|
const diagonalPixels = Math.sqrt(
|
||||||
|
Math.pow(screenWidth, 2) + Math.pow(screenHeight, 2)
|
||||||
|
);
|
||||||
|
const diagonalInches = diagonalPixels / pixelDensity / 96;
|
||||||
|
|
||||||
|
// 设备类型判断阈值
|
||||||
|
const isTabletSize = diagonalInches >= 7 && diagonalInches <= 13;
|
||||||
|
const isLaptopSize = diagonalInches > 13 && diagonalInches <= 17;
|
||||||
|
const isDesktopSize = diagonalInches > 17;
|
||||||
|
|
||||||
|
// 常见平板分辨率模式(非绝对标准)
|
||||||
|
const isTabletResolution = (
|
||||||
|
(screenWidth >= 768 && screenWidth <= 1100 && aspectRatio <= 1.7) || // 竖屏或方屏平板
|
||||||
|
(screenHeight >= 768 && screenHeight <= 1100 && aspectRatio >= 1.5) // 横屏平板
|
||||||
|
);
|
||||||
|
|
||||||
|
// 常见PC/笔记本分辨率模式
|
||||||
|
const isPcResolution = (
|
||||||
|
(screenWidth >= 1280 && aspectRatio >= 1.6) || // 宽屏笔记本/桌面
|
||||||
|
(screenWidth >= 1920) // 高分辨率桌面
|
||||||
|
);
|
||||||
|
|
||||||
|
if (isTabletSize && isTabletResolution) {
|
||||||
|
return 'tablet';
|
||||||
|
} else if (isLaptopSize && isPcResolution) {
|
||||||
|
return 'laptop';
|
||||||
|
} else if (isDesktopSize && isPcResolution) {
|
||||||
|
return 'desktop';
|
||||||
|
} else {
|
||||||
|
return 'unknown';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// $(window).ready(function () {
|
||||||
|
// const deviceType = detectDeviceByResolution();
|
||||||
|
// if (deviceType=='tablet') {
|
||||||
|
// window.location.href = '?mtpl=1';
|
||||||
|
// }
|
||||||
|
// })
|
||||||
|
$(window).ready(function () {
|
||||||
|
if ($(window).width() < 1024) {
|
||||||
|
var locationURL = new URL(window.location.href);
|
||||||
|
var mtpl = locationURL.searchParams.get("mtpl");
|
||||||
|
if (mtpl == null) {
|
||||||
|
locationURL.searchParams.set("mtpl", "1");
|
||||||
|
window.location.href = locationURL.href;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<!-- Matomo -->
|
||||||
|
<script>
|
||||||
|
var _paq = window._paq = window._paq || [];
|
||||||
|
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
|
||||||
|
_paq.push(['trackPageView']);
|
||||||
|
_paq.push(['enableLinkTracking']);
|
||||||
|
(function() {
|
||||||
|
var u="//analytics.f2b211.com/";
|
||||||
|
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||||
|
_paq.push(['setSiteId', '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>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<noscript>
|
||||||
|
<!-- Matomo Image Tracker-->
|
||||||
|
<img referrerpolicy="no-referrer-when-downgrade" src="https://analytics.f2b211.com/matomo.php?idsite=2&rec=1" style="border:0" alt="" />
|
||||||
|
<!-- End Matomo -->
|
||||||
|
</noscript>
|
||||||
|
{block name="header"}
|
||||||
|
{include file="public/header"/}
|
||||||
|
{/block}
|
||||||
|
{block name="main"}{/block}
|
||||||
|
{block name="footer"}
|
||||||
|
{include file="public/footer"/}
|
||||||
|
{/block}
|
||||||
|
{block name="script"}{/block}
|
||||||
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
@@ -27,7 +27,9 @@
|
|||||||
<p class="ftitle">{:lang_i18n('产品')}</p>
|
<p class="ftitle">{:lang_i18n('产品')}</p>
|
||||||
<ul>
|
<ul>
|
||||||
{volist name="header_categorys" id="vo"}
|
{volist name="header_categorys" id="vo"}
|
||||||
<li><a href="{:url('product/category', ['id' => $vo.id])}" class="fline">{$vo.name}</a></li>
|
{if condition="!empty($vo.name)"}
|
||||||
|
<li><a href="{:url('product/category', ['id' => $vo.id])}" class="fline">{$vo.name}</a></li>
|
||||||
|
{/if}
|
||||||
{/volist}
|
{/volist}
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
@@ -38,7 +40,7 @@
|
|||||||
{if condition="!empty($vo.children)"}
|
{if condition="!empty($vo.children)"}
|
||||||
<ul>
|
<ul>
|
||||||
{volist name="vo.children" id="vc"}
|
{volist name="vo.children" id="vc"}
|
||||||
<li><a href="{$vc.link}" class="fline">{$vc.name}</a></li>
|
<li><a href="{$vc.link}" class="fline" target="{$vc.blank==1?'_blank':'_self'}">{$vc.name}</a></li>
|
||||||
{/volist}
|
{/volist}
|
||||||
</ul>
|
</ul>
|
||||||
{/if}
|
{/if}
|
||||||
@@ -51,12 +53,12 @@
|
|||||||
<ul>
|
<ul>
|
||||||
{volist name="contact_config" id="vo"}
|
{volist name="contact_config" id="vo"}
|
||||||
<li>
|
<li>
|
||||||
|
{if condition="$vo.type == 'image'"}
|
||||||
|
<img src="{$vo.value}" {if condition="!empty($vo.extra)" }style="{$vo.extra}" {/if} />
|
||||||
|
{else/}
|
||||||
<a href="javascript:void(0);" class="fline">
|
<a href="javascript:void(0);" class="fline">
|
||||||
{if condition="$vo.type == 'image'"}
|
|
||||||
<img src="{$vo.value}" {if condition="!empty($vo.extra)" }style="{$vo.extra}" {/if} />
|
|
||||||
{else/}
|
|
||||||
{$vo.value}
|
{$vo.value}
|
||||||
{/if}
|
{/if}
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
{/volist}
|
{/volist}
|
||||||
@@ -70,7 +72,7 @@
|
|||||||
<ul>
|
<ul>
|
||||||
{volist name="media_config" id="vo"}
|
{volist name="media_config" id="vo"}
|
||||||
<a href="{$vo.url.value}">
|
<a href="{$vo.url.value}">
|
||||||
<img src="{$vo.image.value}" {if condition="!empty($vo.image.extra)"}style="{$vo.image.extra}" {/if} />
|
<img src="{$vo.image.value}" {if condition="!empty($vo.image.extra)" }style="{$vo.image.extra}" {/if} />
|
||||||
</a>
|
</a>
|
||||||
{/volist}
|
{/volist}
|
||||||
</ul>
|
</ul>
|
||||||
@@ -80,7 +82,7 @@
|
|||||||
<div class="ftcopyright">
|
<div class="ftcopyright">
|
||||||
<span>{$basic_config.website_powerby.value}</span>
|
<span>{$basic_config.website_powerby.value}</span>
|
||||||
{if condition="!empty($basic_config.website_icp)"}
|
{if condition="!empty($basic_config.website_icp)"}
|
||||||
<a href="https://beian.miit.gov.cn/">({$basic_config.website_icp.value})</a>
|
<a href="https://beian.miit.gov.cn/">{$basic_config.website_icp.value|raw}</a>
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
@@ -89,36 +91,33 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
{eq name=":cookie('think_lang')" value="zh-cn"}
|
|
||||||
<div class="backtop">
|
<div class="backtop">
|
||||||
<img src="__IMAGES__/ic-backtop.png" class="ictop"/>
|
<img src="__IMAGES__/ic-backtop.png" class="ictop" />
|
||||||
<span>返回顶部</span>
|
<span>{eq name=":cookie('think_lang')" value="en-us"}TOP{else /}返回顶部{/eq}</span>
|
||||||
</div>
|
</div>
|
||||||
{/eq}
|
|
||||||
<script>
|
<script>
|
||||||
$(document).ready(function () {
|
$(document).ready(function () {
|
||||||
// 获取窗口高度
|
// 获取窗口高度
|
||||||
var windowHeight = $(window).height();
|
var windowHeight = $(window).height();
|
||||||
// 监听滚动事件
|
// 监听滚动事件
|
||||||
$(window).scroll(function() {
|
$(window).scroll(function () {
|
||||||
console.log($(this).scrollTop(),windowHeight)
|
// 检查滚动距离是否超过一屏幕高度
|
||||||
// 检查滚动距离是否超过一屏幕高度
|
if ($(this).scrollTop() > windowHeight) {
|
||||||
if ($(this).scrollTop() > windowHeight) {
|
// 如果超过,显示返回顶部按钮
|
||||||
// 如果超过,显示返回顶部按钮
|
$('.backtop').fadeIn(300);
|
||||||
$('.backtop').fadeIn(300);
|
} else {
|
||||||
} else {
|
// 如果未超过,隐藏返回顶部按钮
|
||||||
// 如果未超过,隐藏返回顶部按钮
|
$('.backtop').fadeOut(300);
|
||||||
$('.backtop').fadeOut(300);
|
}
|
||||||
}
|
});
|
||||||
});
|
|
||||||
|
// 点击返回顶部按钮时的事件处理
|
||||||
// 点击返回顶部按钮时的事件处理
|
$('.backtop').click(function () {
|
||||||
$('.backtop').click(function() {
|
// 平滑滚动到页面顶部
|
||||||
// 平滑滚动到页面顶部
|
$('html, body').animate({
|
||||||
$('html, body').animate({
|
scrollTop: 0
|
||||||
scrollTop: 0
|
}, 800);
|
||||||
}, 800);
|
return false;
|
||||||
return false;
|
});
|
||||||
});
|
});
|
||||||
});
|
|
||||||
</script>
|
</script>
|
||||||
@@ -26,18 +26,22 @@
|
|||||||
<!-- 右边子菜单-->
|
<!-- 右边子菜单-->
|
||||||
{volist name="header_categorys" id="vo" key="idx"}
|
{volist name="header_categorys" id="vo" key="idx"}
|
||||||
<div class="navItem_cyright" {eq name="idx" value="1" }style="display: block;"{else/}style="display: none;"{/eq}>
|
<div class="navItem_cyright" {eq name="idx" value="1" }style="display: block;"{else/}style="display: none;"{/eq}>
|
||||||
|
{if condition="!empty($vo.children)"}
|
||||||
{volist name="vo.children" id="vc"}
|
{volist name="vo.children" id="vc"}
|
||||||
<dl class="nav_cyrightit">
|
<dl class="nav_cyrightit">
|
||||||
<dt>
|
<dt>
|
||||||
<a href="{:url('product/subcategory', ['id' => $vc.id])}">{$vc.name}</a>
|
<a href="{:url('product/subcategory', ['id' => $vc.id])}">{$vc.name}</a>
|
||||||
</dt>
|
</dt>
|
||||||
|
{if condition="!empty($vc.children)"}
|
||||||
{volist name="vc.children" id="vcc"}
|
{volist name="vc.children" id="vcc"}
|
||||||
<dd>
|
<dd>
|
||||||
<a href="{:url('product/subcategory', ['id' => $vcc.id])}">{$vcc.name}</a>
|
<a href="{:url('product/subcategory', ['id' => $vcc.id])}">{$vcc.name}</a>
|
||||||
</dd>
|
</dd>
|
||||||
{/volist}
|
{/volist}
|
||||||
|
{/if}
|
||||||
</dl>
|
</dl>
|
||||||
{/volist}
|
{/volist}
|
||||||
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
{/volist}
|
{/volist}
|
||||||
</ol>
|
</ol>
|
||||||
@@ -88,7 +92,7 @@
|
|||||||
</div>
|
</div>
|
||||||
{eq name=":cookie('think_lang')" value="en-us"}
|
{eq name=":cookie('think_lang')" value="en-us"}
|
||||||
{notempty name="basic_config['navigation_store_url']['value']"}
|
{notempty name="basic_config['navigation_store_url']['value']"}
|
||||||
<a class="storetopbt" href="{$basic_config['navigation_store_url']['value']}">
|
<a class="storetopbt" href="{$basic_config['navigation_store_url']['value']}" target="_blank">
|
||||||
<img src="__IMAGES__/shopico.png" class="storeImgico" />{:lang_i18n('店铺')}
|
<img src="__IMAGES__/shopico.png" class="storeImgico" />{:lang_i18n('店铺')}
|
||||||
</a>
|
</a>
|
||||||
{/notempty}
|
{/notempty}
|
||||||
@@ -111,7 +115,7 @@
|
|||||||
<div class="popmain">
|
<div class="popmain">
|
||||||
{volist name="header_hot_products" id="vo"}
|
{volist name="header_hot_products" id="vo"}
|
||||||
<div class="popitem">
|
<div class="popitem">
|
||||||
<a href="{:url('product/detail', ['id' => $vo.id])}"><img src="{$vo.cover_image}" class="popimg" /></a>
|
<a href="{:url('product/detail', ['id' => $vo.id])}"><img src="{:thumb($vo.cover_image)}" class="popimg" /></a>
|
||||||
<div class="productName">{$vo.name}</div>
|
<div class="productName">{$vo.name}</div>
|
||||||
<div class="produc-dec">{$vo.short_name}</div>
|
<div class="produc-dec">{$vo.short_name}</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -151,26 +155,53 @@
|
|||||||
|
|
||||||
return history;
|
return history;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 封装一个函数用于处理鼠标悬停显示和隐藏内容
|
// 封装一个函数用于处理鼠标悬停显示和隐藏内容
|
||||||
function handleHover($element, $content) {
|
function handleHover($element, $content) {
|
||||||
$element.mouseenter(function () {
|
// 同时支持鼠标悬停和点击事件
|
||||||
$content.stop(true, true).slideDown(60);
|
$element
|
||||||
}).mouseleave(function () {
|
.mouseenter(function () {
|
||||||
$content.stop(true, true).slideUp(60);
|
$content.stop(true, true).slideDown(60);
|
||||||
});
|
})
|
||||||
|
.mouseleave(function () {
|
||||||
|
$content.stop(true, true).slideUp(60);
|
||||||
|
})
|
||||||
|
.click(function (e) {
|
||||||
|
// 阻止链接默认跳转(如果有链接的话)
|
||||||
|
if ($content.is(':visible')) {
|
||||||
|
$content.stop(true, true).slideUp(60);
|
||||||
|
} else {
|
||||||
|
$content.stop(true, true).slideDown(60);
|
||||||
|
}
|
||||||
|
// 防止点击事件冒泡到a标签
|
||||||
|
e.preventDefault();
|
||||||
|
e.stopPropagation();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
// 处理第一个导航项
|
|
||||||
handleHover($('.navItem').eq(0), $('.navItem').eq(0).find('.navItemConten'));
|
// 处理产品列表的下拉菜单
|
||||||
// 鼠标移入navItem_cyleft里面的li标签添加类,移除其他li的类
|
var $firstNav = $('.navItem').eq(0);
|
||||||
|
if ($firstNav.find('.navItemConten').length) {
|
||||||
|
handleHover($firstNav, $firstNav.find('.navItemConten'));
|
||||||
|
}
|
||||||
|
|
||||||
|
// 鼠标移入左侧子菜单切换显示
|
||||||
$('.navItem_cyleft li').mouseenter(function () {
|
$('.navItem_cyleft li').mouseenter(function () {
|
||||||
$(this).addClass('it_active').siblings().removeClass('it_active');
|
$(this).addClass('it_active').siblings().removeClass('it_active');
|
||||||
$('.navItem_cyright').hide();
|
$('.navItem_cyright').hide();
|
||||||
$('.navItem_cyright').eq($(this).index()).show();
|
$('.navItem_cyright').eq($(this).index()).show();
|
||||||
});
|
});
|
||||||
// 处理第5 - 8个导航项
|
|
||||||
for (let i = 4; i < 8; i++) {
|
// 动态处理所有带有navItemConten1的导航项
|
||||||
handleHover($('.navItem').eq(i), $('.navItem').eq(i).find('.navItemConten1'));
|
$('.navItem').each(function () {
|
||||||
}
|
var $this = $(this);
|
||||||
|
var $dropdown = $this.find('.navItemConten1');
|
||||||
|
// 只给有下拉菜单的导航项绑定事件
|
||||||
|
if ($dropdown.length) {
|
||||||
|
handleHover($this, $dropdown);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// 点击搜索
|
// 点击搜索
|
||||||
$('#openModalBtn').click(function () {
|
$('#openModalBtn').click(function () {
|
||||||
$('#scmodal').toggle();
|
$('#scmodal').toggle();
|
||||||
@@ -178,8 +209,20 @@
|
|||||||
$('.close-btn').click(function () {
|
$('.close-btn').click(function () {
|
||||||
$('#scmodal').hide();
|
$('#scmodal').hide();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// 点击空白处关闭下拉菜单
|
||||||
|
$(document).click(function () {
|
||||||
|
$('.navItemConten, .navItemConten1, #top-country').slideUp(60);
|
||||||
|
});
|
||||||
|
|
||||||
|
// 防止下拉菜单内部点击触发空白处关闭事件
|
||||||
|
$('.navItemConten, .navItemConten1, #top-country').click(function (e) {
|
||||||
|
e.stopPropagation();
|
||||||
|
});
|
||||||
|
|
||||||
// 搜索历史记录回显
|
// 搜索历史记录回显
|
||||||
history();
|
history();
|
||||||
|
|
||||||
// 执行搜索
|
// 执行搜索
|
||||||
$('#serrchinput').keydown(function (event) {
|
$('#serrchinput').keydown(function (event) {
|
||||||
if (event.originalEvent.keyCode == 13) {
|
if (event.originalEvent.keyCode == 13) {
|
||||||
@@ -194,14 +237,14 @@
|
|||||||
window.location.href = "{:url('product/search')}" + '?keywords=' + keywords;
|
window.location.href = "{:url('product/search')}" + '?keywords=' + keywords;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// 点击选择国家
|
// 点击选择国家
|
||||||
$('#countrycheck').click(function () {
|
$('#countrycheck').click(function (e) {
|
||||||
$('#top-country').toggle();
|
$('#top-country').toggle();
|
||||||
|
e.stopPropagation();
|
||||||
});
|
});
|
||||||
$('.closecountrybt').click(function () {
|
$('.closecountrybt').click(function () {
|
||||||
$('#top-country').hide();
|
$('#top-country').hide();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
@@ -13,9 +13,61 @@
|
|||||||
<link rel="stylesheet" type="text/css" href="__CSS__/topic_nas_header.css" />
|
<link rel="stylesheet" type="text/css" href="__CSS__/topic_nas_header.css" />
|
||||||
<link rel="stylesheet" type="text/css" href="__CSS__/orico_footer.css" />
|
<link rel="stylesheet" type="text/css" href="__CSS__/orico_footer.css" />
|
||||||
{block name="style"}{/block}
|
{block name="style"}{/block}
|
||||||
<script type="text/javascript" src='https://code.jquery.com/jquery-3.6.0.min.js'></script>
|
<script src="__JS__/jquery-3.6.0.min.js"></script>
|
||||||
|
<script>
|
||||||
|
// 增强型 UC 浏览器检测
|
||||||
|
function isUCBrowser() {
|
||||||
|
const ua = navigator.userAgent.toLowerCase();
|
||||||
|
return ua.includes('ubrowser');
|
||||||
|
}
|
||||||
|
|
||||||
|
// 直接输出对应的 HTML 标签
|
||||||
|
if (isUCBrowser()) {
|
||||||
|
document.write(`
|
||||||
|
<link rel="stylesheet" href="__JS__/swiper-bundle8.4.7.min.css">
|
||||||
|
<script type="text/javascript" src="__JS__/swiper-bundle8.4.7.min.js"><\/script>
|
||||||
|
`);
|
||||||
|
} else {
|
||||||
|
document.write(`
|
||||||
|
<link rel="stylesheet" href="__JS__/swiper-bundle9.4.1.min.css">
|
||||||
|
<script type="text/javascript" src="__JS__/swiper-bundle9.4.1.min.js"><\/script>
|
||||||
|
`);
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<script>
|
||||||
|
$(window).ready(function () {
|
||||||
|
if ($(window).width() < 1024) {
|
||||||
|
var locationURL = new URL(window.location.href);
|
||||||
|
var mtpl = locationURL.searchParams.get("mtpl");
|
||||||
|
if (mtpl == null) {
|
||||||
|
locationURL.searchParams.set("mtpl", "1");
|
||||||
|
window.location.href = locationURL.href;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
<!-- Matomo -->
|
||||||
|
<script>
|
||||||
|
var _paq = window._paq = window._paq || [];
|
||||||
|
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
|
||||||
|
_paq.push(['trackPageView']);
|
||||||
|
_paq.push(['enableLinkTracking']);
|
||||||
|
(function() {
|
||||||
|
var u="//analytics.f2b211.com/";
|
||||||
|
_paq.push(['setTrackerUrl', u+'matomo.php']);
|
||||||
|
_paq.push(['setSiteId', '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&rec=1" style="border:0" alt="" />
|
||||||
|
<!-- End Matomo -->
|
||||||
|
</noscript>
|
||||||
{block name="header"}
|
{block name="header"}
|
||||||
{include file="public/nas_header"/}
|
{include file="public/nas_header"/}
|
||||||
{/block}
|
{/block}
|
||||||
|
|||||||
@@ -63,7 +63,7 @@
|
|||||||
<div class="ftcopyright">
|
<div class="ftcopyright">
|
||||||
<span>{$basic_config.website_powerby.value}</span>
|
<span>{$basic_config.website_powerby.value}</span>
|
||||||
{if condition="!empty($basic_config.website_icp)"}
|
{if condition="!empty($basic_config.website_icp)"}
|
||||||
<a href="https://beian.miit.gov.cn/">({$basic_config.website_icp.value})</a>
|
<a href="https://beian.miit.gov.cn/">{$basic_config.website_icp.value|raw}</a>
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
<header class="narsPage-head">
|
<header class="narsPage-head">
|
||||||
<div class="headcenter">
|
<div class="headcenter">
|
||||||
|
{eq name=":cookie('think_lang')" value="zh-cn"}
|
||||||
|
<a href="{:url('/index/topic/nas/index')}">
|
||||||
|
{else/}
|
||||||
<a>
|
<a>
|
||||||
|
{/eq}
|
||||||
<img class="logico" style="cursor:pointer;" src="__IMAGES__/logo_nas_{:cookie('think_lang')}.png" />
|
<img class="logico" style="cursor:pointer;" src="__IMAGES__/logo_nas_{:cookie('think_lang')}.png" />
|
||||||
</a>
|
</a>
|
||||||
{notempty name="header_navigation"}
|
{notempty name="header_navigation"}
|
||||||
@@ -17,9 +21,10 @@
|
|||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
$(function() {
|
$(function() {
|
||||||
$('.headnav .navitem').each(function(idx, item) {
|
$('.headnav .navitem').each(function(idx, item) {
|
||||||
$(item).removeClass('hover');
|
var _item = $(item);
|
||||||
if (compareUrls(location.href, item.href)) {
|
_item.removeClass('hover');
|
||||||
$(item).addClass('hover').siblings();
|
if (_item.attr('href') && compareUrls(location.href, _item.get(0).href)) {
|
||||||
|
_item.addClass('hover').siblings();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
<div class="narshelpCenterPc">
|
<div class="narshelpCenterPc">
|
||||||
<!-- banner-搜索 -->
|
<!-- banner-搜索 -->
|
||||||
<div class="pagetopbg">
|
<div class="pagetopbg">
|
||||||
<img src="__IMAGES__/nas_help_banner.jpg" class="hpbgimg" />
|
<img src="__IMAGES__/nas_help_banner.webp" class="hpbgimg" />
|
||||||
<div class='nhlp-search'>
|
<div class='nhlp-search'>
|
||||||
<input class="nhlp-ipt" id="search-input" placeholder="{:lang_i18n('请输入搜索关键字,如安装赛博云空间,影视库')}" autocomplete="off" />
|
<input class="nhlp-ipt" id="search-input" placeholder="{:lang_i18n('请输入搜索关键字,如安装赛博云空间,影视库')}" autocomplete="off" />
|
||||||
<img src="__IMAGES__/nas_help_search.png" class="searchimg" />
|
<img src="__IMAGES__/nas_help_search.png" class="searchimg" />
|
||||||
@@ -26,13 +26,13 @@
|
|||||||
<h1 class="helph1">{:lang_i18n('使用教程')}</h1>
|
<h1 class="helph1">{:lang_i18n('使用教程')}</h1>
|
||||||
<div class="nhlp-row">
|
<div class="nhlp-row">
|
||||||
{volist name="article_categorys" id="vo" key="idx"}
|
{volist name="article_categorys" id="vo" key="idx"}
|
||||||
<div class="nhlpit {gt name='idx' value='6'}nhlpit-w{/gt}">
|
<div class="nhlpit">
|
||||||
<div class="nhlptl">
|
<div class="nhlptl">
|
||||||
<img src="{$vo.icon}" class="bhlpicoimg" />{$vo.name}
|
<img src="{$vo.icon}" class="bhlpicoimg" />{$vo.name}
|
||||||
</div>
|
</div>
|
||||||
<div class="nhlp-tx-list">
|
<div class="nhlp-tx-list">
|
||||||
{volist name="vo.article" id="va" key="index"}
|
{volist name="vo.article" id="va" key="index"}
|
||||||
<a class="txrow" href="{:url('/index/topic/nas/help_detail', ['cid' => $vo.id, 'id' => $va.id])}">
|
<a class="txrow" href="{:url('/index/topic/nas/help_detail', ['pid' => $va.category_id,'cid' => $vo.id, 'id' => $va.id])}">
|
||||||
<div class="nhlp-point"></div>
|
<div class="nhlp-point"></div>
|
||||||
<span class="nhlpsp">{$va.title}</span>
|
<span class="nhlpsp">{$va.title}</span>
|
||||||
<span class="narhelpgoimg">
|
<span class="narhelpgoimg">
|
||||||
@@ -41,7 +41,7 @@
|
|||||||
</a>
|
</a>
|
||||||
{/volist}
|
{/volist}
|
||||||
{if condition="count($vo.article) >= 3"}
|
{if condition="count($vo.article) >= 3"}
|
||||||
<a class="ckgdbt" href="{:url('/index/topic/nas/help_detail', ['cid' => $vo.id, 'id' => isset($vo.article[0])?$vo.article[0]['id']:0])}">
|
<a class="ckgdbt" href="{:url('/index/topic/nas/help_detail', ['cid' => $vo.id, 'id' => isset($vo.article[0])?$vo.article[0]['id']:0,'pid' => isset($vo.article[0])?$vo.article[0]['category_id']:0])}">
|
||||||
{:lang_i18n('查看更多')} >
|
{:lang_i18n('查看更多')} >
|
||||||
</a>
|
</a>
|
||||||
{/if}
|
{/if}
|
||||||
@@ -57,33 +57,37 @@
|
|||||||
<h1 class="lxwmtitle">{:lang_i18n('联系我们')}</h1>
|
<h1 class="lxwmtitle">{:lang_i18n('联系我们')}</h1>
|
||||||
<div class="nhlp-row">
|
<div class="nhlp-row">
|
||||||
<div class="nhlp-row-content">
|
<div class="nhlp-row-content">
|
||||||
{volist name="contacts" id="co" key="idx" offset="0" length="3"}
|
{assign name="fist_section" value=":array_splice($contacts, 0, 3)" /}
|
||||||
<a class="nhlplxwmit nhlplxwmit-w1" {notempty name="co.link"}href="{$co.link}"{/notempty} {eq name="idx" value="3"}style="margin-right: 0;"{/eq}>
|
{volist name="fist_section" id="co"}
|
||||||
|
<a class="nhlplxwmit nhlplxwmit-w1" {notempty name="co.link"}href="{$co.link}"{/notempty}>
|
||||||
<img src="{$co.image}" class="lximg" />
|
<img src="{$co.image}" class="lximg" />
|
||||||
{if condition="!empty($co.desc) && str_contains($co.desc, '<img')"}
|
{notempty name="co.extra_image"}
|
||||||
<img src="{:get_path_from_img_tag($co.desc)}" class="lxewmimg" />
|
<img src="{$co.extra_image}" class="lxewmimg" />
|
||||||
<span class="t1" {:style(['color'=>$co.title_txt_color])}>{$co.title}</span>
|
{/notempty}
|
||||||
{else/}
|
|
||||||
<span class="t1" {:style(['color'=>$co.title_txt_color])}>{$co.title}</span>
|
<span class="t1" {:style(['color'=>$co.title_txt_color])}>{$co.title}</span>
|
||||||
|
{notempty name="co.desc"}
|
||||||
<span class="t2" {:style(['color'=>$co.desc_txt_color])}>{$co.desc|raw}</span>
|
<span class="t2" {:style(['color'=>$co.desc_txt_color])}>{$co.desc|raw}</span>
|
||||||
{/if}
|
{/notempty}
|
||||||
</a>
|
</a>
|
||||||
{/volist}
|
{/volist}
|
||||||
</div>
|
</div>
|
||||||
|
{assign name="second_section" value=":array_chunk($contacts, 4)" /}
|
||||||
|
{volist name="second_section" id="chunk"}
|
||||||
<div class="nhlp-row-content">
|
<div class="nhlp-row-content">
|
||||||
{volist name="contacts" id="co" key="idx" offset="3"}
|
{volist name="chunk" id="co"}
|
||||||
<a class="nhlplxwmit nhlplxwmit-w2" {notempty name="co.link"}href="{$co.link}"{/notempty} {eq name="idx%4" value="0"}style="margin-right: 0;"{/eq}>
|
<a class="nhlplxwmit nhlplxwmit-w2" {notempty name="co.link"}href="{$co.link}"{/notempty}>
|
||||||
<img src="{$co.image}" class="lximg" />
|
<img src="{$co.image}" class="lximg" />
|
||||||
{if condition="!empty($co.desc) && str_contains($co.desc, '<img')"}
|
{notempty name="co.extra_image"}
|
||||||
<img src="{:get_path_from_img_tag($co.desc)}" class="lxewmimg" />
|
<img src="{$co.extra_image}" class="lxewmimg" />
|
||||||
<span class="t1" {:style(['color'=>$co.title_txt_color])}>{$co.title}</span>
|
{/notempty}
|
||||||
{else/}
|
|
||||||
<span class="t1" {:style(['color'=>$co.title_txt_color])}>{$co.title}</span>
|
<span class="t1" {:style(['color'=>$co.title_txt_color])}>{$co.title}</span>
|
||||||
|
{notempty name="co.desc"}
|
||||||
<span class="t2" {:style(['color'=>$co.desc_txt_color])}>{$co.desc|raw}</span>
|
<span class="t2" {:style(['color'=>$co.desc_txt_color])}>{$co.desc|raw}</span>
|
||||||
{/if}
|
{/notempty}
|
||||||
</a>
|
</a>
|
||||||
{/volist}
|
{/volist}
|
||||||
</div>
|
</div>
|
||||||
|
{/volist}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{/notempty}
|
{/notempty}
|
||||||
@@ -132,7 +136,7 @@
|
|||||||
$('#dropdown').hide();
|
$('#dropdown').hide();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
$('.nhlplxwmit:not(:first)').hover(function () {
|
$('.nhlplxwmit').hover(function () {
|
||||||
// 当鼠标移入时,显示.lxewmimg 并隐藏.lximg
|
// 当鼠标移入时,显示.lxewmimg 并隐藏.lximg
|
||||||
var lxe = $(this).find('.lxewmimg');
|
var lxe = $(this).find('.lxewmimg');
|
||||||
var lxi = $(this).find('.lximg');
|
var lxi = $(this).find('.lximg');
|
||||||
|
|||||||
@@ -1,17 +1,17 @@
|
|||||||
{extend name="public/nas_base" /}
|
{extend name="public/nas_base" /}
|
||||||
{block name="title"}
|
{block name="title"}
|
||||||
{notempty name="article.seo_title"}<title>{$article.seo_title}</title>{else /}{__BLOCK__}{/notempty}
|
{notempty name="article.seo_title"}<title>{$article.seo_title}</title>{else /}{__BLOCK__}{/notempty}
|
||||||
{/block}
|
{/block}
|
||||||
{block name="seo"}
|
{block name="seo"}
|
||||||
{notempty name="article.seo_keywords"}
|
{notempty name="article.seo_keywords"}
|
||||||
<meta name="keywords" content="{$article.seo_keywords}" />
|
<meta name="keywords" content="{$article.seo_keywords}" />
|
||||||
<meta name="description" content="{$article.seo_desc}" />
|
<meta name="description" content="{$article.seo_desc}" />
|
||||||
{else /}
|
{else /}
|
||||||
{__BLOCK__}
|
{__BLOCK__}
|
||||||
{/notempty}
|
{/notempty}
|
||||||
{/block}
|
{/block}
|
||||||
{block name="style"}
|
{block name="style"}
|
||||||
<link rel="stylesheet" href="__CSS__/topic_nas_help-detail.css"/>
|
<link rel="stylesheet" href="__CSS__/topic_nas_help-detail.css" />
|
||||||
{/block}
|
{/block}
|
||||||
{block name="main"}
|
{block name="main"}
|
||||||
<div class="orico_Page_index">
|
<div class="orico_Page_index">
|
||||||
@@ -32,26 +32,49 @@
|
|||||||
<div class="nars-hlpdt-ml">
|
<div class="nars-hlpdt-ml">
|
||||||
{notempty name="article_categorys"}
|
{notempty name="article_categorys"}
|
||||||
<div class="nav-tree">
|
<div class="nav-tree">
|
||||||
|
|
||||||
|
<!-- start 三级菜单 -->
|
||||||
{volist name="article_categorys" id="ac"}
|
{volist name="article_categorys" id="ac"}
|
||||||
<div class="category">
|
<div class="category">
|
||||||
|
<!-- 一级 -->
|
||||||
<div class="category-title">
|
<div class="category-title">
|
||||||
<div class="arrow {if condition='$ac.id == $Request.get.cid'}rotate{/if}">
|
<div class="arrow {if condition='$ac.id == $Request.get.cid'}rotate{/if}"><img src="__IMAGES__/nas-jt.png" class="arrow {if condition='$ac.id == $Request.get.cid'}rotate{/if}" /></div>
|
||||||
<img src="__IMAGES__/nas-jt.png" class="arrow {if condition='$ac.id == $Request.get.cid'}rotate{/if}" />
|
|
||||||
</div>
|
|
||||||
<span>{$ac.name}</span>
|
<span>{$ac.name}</span>
|
||||||
</div>
|
</div>
|
||||||
<ul class="sub-list" {if condition='$ac.id == $Request.get.cid'}style="display: block;"{/if}>
|
<!-- 二级-->
|
||||||
{volist name="ac.article" id="ar"}
|
<ul class="sub-list" {if condition='$ac.id == $Request.get.cid' }style="display: block;" {/if}>
|
||||||
<li><a href="{:url('/index/topic/nas/help_detail', ['id' => $ar.id])}" style="padding-top: 6px;">{$ar.title}</a></li>
|
{volist name="ac.child" id="ad"}
|
||||||
|
<li class="two-mues">
|
||||||
|
<a href="#" class="two-a">
|
||||||
|
<div class="arrow {if condition='$ad.id == $Request.get.pid'}rotate{/if}"><img src="__IMAGES__/nas-jt.png" class="arrow {if condition='$ad.id == $Request.get.pid'}rotate{/if}" /></div>
|
||||||
|
<span>{$ad.name}</span>
|
||||||
|
</a>
|
||||||
|
<ul class="thress-mues" {if condition='$ad.id == $Request.get.pid' }style="display: block;" {/if}>
|
||||||
|
{volist name="ad.article" id="ae"}
|
||||||
|
<li style="margin-left: 30px;"><a href="{:url('/index/topic/nas/help_detail', ['cid' => $ac.id,'pid' => $ad.id, 'id' => $ae.id])}" style="padding-top: 6px;" {eq
|
||||||
|
name="ae.id" value="$Request.get.id" }class="active" {/eq}>{$ae.title}</a></li>
|
||||||
|
{/volist}
|
||||||
|
</ul>
|
||||||
|
<!-- 三级-->
|
||||||
|
</li>
|
||||||
{/volist}
|
{/volist}
|
||||||
|
{volist name="ac.article" id="ar"}
|
||||||
|
<li><a href="{:url('/index/topic/nas/help_detail', ['cid' => $ac.id, 'id' => $ar.id])}" style="padding-top: 6px;" {eq
|
||||||
|
name="ar.id" value="$Request.get.id" }class="active" {/eq}>{$ar.title}</a></li>
|
||||||
|
{/volist}
|
||||||
|
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
{/volist}
|
{/volist}
|
||||||
|
<!-- end 三级菜单 -->
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
{/notempty}
|
{/notempty}
|
||||||
</div>
|
</div>
|
||||||
<!--文章详情 -->
|
<!--文章详情 -->
|
||||||
<div class="nars-hlpdt-mm" id="rendered-content">{$article.content|raw|default=''}</div>
|
<div class="ql-container ">
|
||||||
|
<div class="nars-hlpdt-mm ql-editor" id="rendered-content">{$article.content|raw|default=''}</div>
|
||||||
|
</div>
|
||||||
<!--锚点定位 -->
|
<!--锚点定位 -->
|
||||||
<div class="nars-hlpdt-mr">
|
<div class="nars-hlpdt-mr">
|
||||||
<div id="title-list">
|
<div id="title-list">
|
||||||
@@ -66,10 +89,22 @@
|
|||||||
{block name="script"}
|
{block name="script"}
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
$(document).ready(function () {
|
$(document).ready(function () {
|
||||||
|
// 一级菜单点击事件
|
||||||
$('.category-title').click(function () {
|
$('.category-title').click(function () {
|
||||||
$(this).next('.sub-list').slideToggle();
|
$(this).next('.sub-list').slideToggle();
|
||||||
$(this).find('.arrow').toggleClass('rotate');
|
$(this).find('.arrow').toggleClass('rotate');
|
||||||
});
|
});
|
||||||
|
// 二级菜单点击事件
|
||||||
|
$('.two-a').click(function(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
e.stopPropagation(); // 阻止事件冒泡
|
||||||
|
|
||||||
|
// 切换当前二级菜单的箭头方向
|
||||||
|
$(this).find('.arrow').toggleClass('rotate');
|
||||||
|
|
||||||
|
// 切换对应的三级菜单显示/隐藏
|
||||||
|
$(this).siblings('.thress-mues').slideToggle();
|
||||||
|
});
|
||||||
// 搜索
|
// 搜索
|
||||||
$(document).on('click', function (e) {
|
$(document).on('click', function (e) {
|
||||||
var target = $(e.target);
|
var target = $(e.target);
|
||||||
@@ -100,7 +135,7 @@
|
|||||||
html = '<ul>'
|
html = '<ul>'
|
||||||
$.each(r.data, function (k, v) {
|
$.each(r.data, function (k, v) {
|
||||||
html +=
|
html +=
|
||||||
'<li><a href="{:url(\'/index/topic/nas/help_detail\')}?id=' + v.id + '">' + v.title + '</a></li>'
|
'<li><a href="{:url(\'/index/topic/nas/help_detail\')}?cid=' + v.category_id + '&id=' + v.id + '&pid=' + v.pid + '">' + v.title + '</a></li>'
|
||||||
})
|
})
|
||||||
html += '</ul>'
|
html += '</ul>'
|
||||||
}
|
}
|
||||||
@@ -112,21 +147,27 @@
|
|||||||
// 内容
|
// 内容
|
||||||
// 清空标题列表
|
// 清空标题列表
|
||||||
$("#title-list ul").empty();
|
$("#title-list ul").empty();
|
||||||
// 提取 h1 标题
|
// 提取 h3 标题
|
||||||
var h1Titles = $("#rendered-content").find("h3");
|
var h1Titles = $("#rendered-content").find("h3");
|
||||||
h1Titles.each(function (index) {
|
// 只有当找到h3标题且内容不为空时才进行处理
|
||||||
var title = $(this);
|
if (h1Titles.length > 0) {
|
||||||
var titleText = title.text();
|
h1Titles.each(function (index) {
|
||||||
var titleId = "title-" + index;
|
var title = $(this);
|
||||||
title.attr("id", titleId);
|
var titleText = title.text().trim(); // 使用trim()去除空白字符
|
||||||
var listItem = $("<li>");
|
// 只有当标题文本不为空时才添加到列表
|
||||||
var link = $("<a>", {
|
if (titleText) {
|
||||||
href: "#" + titleId,
|
var titleId = "title-" + index;
|
||||||
text: titleText
|
title.attr("id", titleId);
|
||||||
|
var listItem = $("<li>");
|
||||||
|
var link = $("<a>", {
|
||||||
|
href: "#" + titleId,
|
||||||
|
text: titleText
|
||||||
|
});
|
||||||
|
listItem.append(link);
|
||||||
|
$("#title-list ul").append(listItem);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
listItem.append(link);
|
}
|
||||||
$("#title-list ul").append(listItem);
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
{/block}
|
{/block}
|
||||||
@@ -113,7 +113,7 @@
|
|||||||
</div>
|
</div>
|
||||||
{/block}
|
{/block}
|
||||||
{block name="script"}
|
{block name="script"}
|
||||||
<script type="text/javascript" src="https://unpkg.com/swiper@9.4.1/swiper-bundle.min.js"></script>
|
<!-- <script type="text/javascript" src="https://unpkg.com/swiper@9.4.1/swiper-bundle.min.js"></script> -->
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
$(document).ready(function () {
|
$(document).ready(function () {
|
||||||
// banner轮播
|
// banner轮播
|
||||||
|
|||||||
581
app/index/view/pc/topic_power_prodline/index.html
Normal file
581
app/index/view/pc/topic_power_prodline/index.html
Normal file
@@ -0,0 +1,581 @@
|
|||||||
|
{extend name="public/nas_base" /}
|
||||||
|
{block name="style"}
|
||||||
|
<link rel="stylesheet" href="__CSS__/topic_power_prodline/index.css">
|
||||||
|
<link rel="stylesheet" href="__CSS__/topic_power_prodline/swiper.css">
|
||||||
|
<link rel="stylesheet" href="__CSS__/topic_power_prodline/nav.css">
|
||||||
|
<link rel="stylesheet" href="__CSS__/topic_power_prodline/advantage.css">
|
||||||
|
<link rel="stylesheet" href="__CSS__/topic_power_prodline/mask.css">
|
||||||
|
<link rel="stylesheet" href="__CSS__/topic_power_prodline/product.css">
|
||||||
|
<link rel="stylesheet" href="__CSS__/topic_power_prodline/product_list.css">
|
||||||
|
<link rel="stylesheet" href="__CSS__/topic_power_prodline/product_card.css">
|
||||||
|
<link rel="stylesheet" href="__CSS__/topic_power_prodline/footer.css">
|
||||||
|
{/block}
|
||||||
|
{block name="header"}
|
||||||
|
<!-- 重置header头为空 -->
|
||||||
|
{/block}
|
||||||
|
{block name="main"}
|
||||||
|
<a class="header" href="/">
|
||||||
|
<div class="header-img">
|
||||||
|
<img src="__IMAGES__/logo.png" alt="">
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
<!-- 轮播核心容器 -->
|
||||||
|
<div class="swiper-container auto-swiper-container" >
|
||||||
|
{notempty name="data.focus_image"}
|
||||||
|
<div class="swiper-wrapper">
|
||||||
|
{volist name="data.focus_image" id="fo"}
|
||||||
|
<a class="swiper-slide auto-swiper-slide" href="{$fo.link}">
|
||||||
|
<img src="{$fo.image}" alt="{$fo.title}" />
|
||||||
|
</a>
|
||||||
|
{/volist}
|
||||||
|
</div>
|
||||||
|
<div class="swiper-pagination"></div>
|
||||||
|
{/notempty}
|
||||||
|
</div>
|
||||||
|
<!-- 分类 -->
|
||||||
|
{notempty name="data.category"}
|
||||||
|
<div class="nav-box">
|
||||||
|
{volist name="data.category" id="ca"}
|
||||||
|
<a class="nav-item" href="{$ca.link}">
|
||||||
|
<img src="{$ca.image}" alt="{$ca.title}">
|
||||||
|
<p {:style(['color'=>$ca.title_txt_color])}>{$ca.title}</p>
|
||||||
|
</a>
|
||||||
|
{/volist}
|
||||||
|
</div>
|
||||||
|
{/notempty}
|
||||||
|
<!-- 500万 -->
|
||||||
|
{notempty name="data.why_choose"}
|
||||||
|
<div class="advantage-section">
|
||||||
|
{assign name="why_choose_title" value=":array_shift($data.why_choose)" /}
|
||||||
|
<h2 class="advantage-section__title">{$why_choose_title.title|default=''|raw}</h2>
|
||||||
|
<div class="advantage-section__list">
|
||||||
|
{volist name="data.why_choose" id="ch"}
|
||||||
|
<div class="advantage-card-wrap">
|
||||||
|
<div class="advantage-card" data-target="design">
|
||||||
|
<img src="{$ch.image}" alt="{$ch.title}:{$ch.short_title}" class="advantage-card__img">
|
||||||
|
<div class="advantage-card__content">
|
||||||
|
<!-- 标题+箭头容器:水平+垂直双居中,内部文字左、箭头右 -->
|
||||||
|
<div class="advantage-card__heading-wrap">
|
||||||
|
<div class="advantage-card__heading" {:style(['color'=>$ch.title_txt_color])}>{$ch.title}</div>
|
||||||
|
<img src="__IMAGES__/jiant.png" alt="" class="card-arrow">
|
||||||
|
</div>
|
||||||
|
<div class="advantage-card__description" {:style(['color'=>$ch.short_title_txt_color])}>{$ch.short_title}</div>
|
||||||
|
<div style="display:none;" class="mack-conten-text">{$ch.desc|raw}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{/volist}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{/notempty}
|
||||||
|
<!-- 产品差旅充 -->
|
||||||
|
{notempty name="data.travel_charger"}
|
||||||
|
<div class="product-box">
|
||||||
|
{assign name="tc_title" value=":array_shift($data.travel_charger)" /}
|
||||||
|
<div class="product-title">
|
||||||
|
<h2 class="product-title-h2">{$tc_title.title|default=''}</h2>
|
||||||
|
<p class="product-title-p">{$tc_title.short_title|default=''}</p>
|
||||||
|
</div>
|
||||||
|
<div class="product-container" >
|
||||||
|
{assign name="tc_first_section_lf" value=":array_shift($data.travel_charger)" /}
|
||||||
|
{notempty name="tc_first_section_lf"}
|
||||||
|
<a class="product-left" href="{$tc_first_section_lf.link}">
|
||||||
|
<img src="{$tc_first_section_lf.image}" alt="{$tc_first_section_lf.title}" class="product-img">
|
||||||
|
<!-- 公共类+定位类:尺寸统一,定位不同 -->
|
||||||
|
<div class="product-img-hover product-img-1">
|
||||||
|
<img src="{$tc_first_section_lf.extra_image}" alt="{$tc_first_section_lf.short_title}">
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
{/notempty}
|
||||||
|
{assign name="tc_first_section_lr" value=":array_shift($data.travel_charger)" /}
|
||||||
|
{notempty name="tc_first_section_lr"}
|
||||||
|
<div class="product-right">
|
||||||
|
<img src="{$tc_first_section_lr.image}" alt="{$tc_first_section_lr.title}" class="right-content right-img">
|
||||||
|
<video src="{$tc_first_section_lr.video}" class="right-content right-video" muted loop playsinline controls>
|
||||||
|
您的浏览器不支持HTML5视频播放,请升级浏览器
|
||||||
|
</video>
|
||||||
|
</div>
|
||||||
|
{/notempty}
|
||||||
|
</div>
|
||||||
|
{assign name="tc_second_section" value=":array_splice($data.travel_charger, 0, 4)" /}
|
||||||
|
{notempty name="tc_second_section"}
|
||||||
|
<div class="product-card-box">
|
||||||
|
<div class="product-card-container">
|
||||||
|
{volist name="tc_second_section" id="tss"}
|
||||||
|
<a class="product-card-wrap" href="{$tss.link}">
|
||||||
|
<div class="product-card" >
|
||||||
|
<div class="product-card-img">
|
||||||
|
<img src="{$tss.image}" alt="{$tss.title}">
|
||||||
|
</div>
|
||||||
|
<div class="product-card-text">
|
||||||
|
<div class="product-card-title" {:style(['color'=>$tss.title_txt_color])}>{$tss.title}</div>
|
||||||
|
<div class="product-card-desc" {:style(['color'=>$tss.short_title_txt_color])}>{$tss.short_title}</div>
|
||||||
|
</div>
|
||||||
|
<div class="product-card-link">
|
||||||
|
<img src="__IMAGES__/ljgd.png" alt="查看更多">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
{/volist}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{assign name="tc_three_section" value=":array_shift($data.travel_charger)" /}
|
||||||
|
{notempty name="tc_three_section"}
|
||||||
|
<a href="{$tc_three_section.link}" class="more">
|
||||||
|
<div class="more-img">
|
||||||
|
{$tc_three_section.title}
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
{/notempty}
|
||||||
|
{/notempty}
|
||||||
|
</div>
|
||||||
|
{/notempty}
|
||||||
|
<!-- 产品 家居充-->
|
||||||
|
{notempty name="data.home_charger"}
|
||||||
|
<div class="product-box">
|
||||||
|
{assign name="hc_title" value=":array_shift($data.home_charger)" /}
|
||||||
|
<div class="product-title">
|
||||||
|
<h2 class="product-title-h2">{$hc_title.title|default=''}</h2>
|
||||||
|
<p class="product-title-p">{$hc_title.short_title|default=''}</p>
|
||||||
|
</div>
|
||||||
|
<div class="product-container">
|
||||||
|
{assign name="hc_first_section_lf" value=":array_shift($data.home_charger)" /}
|
||||||
|
{notempty name="hc_first_section_lf"}
|
||||||
|
<a class="product-left" href="{$hc_first_section_lf.link}">
|
||||||
|
<img src="{$hc_first_section_lf.image}" alt="{$hc_first_section_lf.title}" class="product-img">
|
||||||
|
<!-- 公共类+定位类:尺寸统一,定位不同 -->
|
||||||
|
<div class="product-img-hover product-img-1">
|
||||||
|
<img src="{$hc_first_section_lf.extra_image}" alt="{$hc_first_section_lf.short_title}">
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
{/notempty}
|
||||||
|
{assign name="hc_first_section_lr" value=":array_shift($data.home_charger)" /}
|
||||||
|
{notempty name="hc_first_section_lr"}
|
||||||
|
<div class="product-right">
|
||||||
|
<img src="{$hc_first_section_lr.image}" alt="{$hc_first_section_lr.title}" class="right-content right-img">
|
||||||
|
<video src="{$hc_first_section_lr.video}" class="right-content right-video" muted loop playsinline controls>
|
||||||
|
您的浏览器不支持HTML5视频播放,请升级浏览器
|
||||||
|
</video>
|
||||||
|
</div>
|
||||||
|
{/notempty}
|
||||||
|
</div>
|
||||||
|
{assign name="hc_second_section" value=":array_splice($data.home_charger, 0, 4)" /}
|
||||||
|
{notempty name="hc_second_section"}
|
||||||
|
<div class="product-card-box">
|
||||||
|
<div class="product-card-container">
|
||||||
|
{volist name="hc_second_section" id="hcs"}
|
||||||
|
<a class="product-card-wrap" href="{$hcs.link}">
|
||||||
|
<div class="product-card" href="#">
|
||||||
|
<div class="product-card-img">
|
||||||
|
<img src="{$hcs.image}" alt="{$hcs.short_title}">
|
||||||
|
</div>
|
||||||
|
<div class="product-card-text">
|
||||||
|
<div class="product-card-title">{$hcs.title}</div>
|
||||||
|
<div class="product-card-desc">{$hcs.short_title}</div>
|
||||||
|
</div>
|
||||||
|
<div class="product-card-link">
|
||||||
|
<img src="__IMAGES__/ljgd.png" alt="查看更多">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
{/volist}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{/notempty}
|
||||||
|
{assign name="hc_three_section" value=":array_shift($data.home_charger)" /}
|
||||||
|
{notempty name="hc_three_section"}
|
||||||
|
<a href="{$hc_three_section.link}" class="more">
|
||||||
|
<div class="more-img">
|
||||||
|
{$hc_three_section.title}
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
{/notempty}
|
||||||
|
</div>
|
||||||
|
{/notempty}
|
||||||
|
<!-- 产品 桌面充(悬浮图上右超出)底部列表样式不一样(左文右图) -->
|
||||||
|
<div class="product-box">
|
||||||
|
{assign name="dc_title" value=":array_shift($data.desktop_charger)" /}
|
||||||
|
<div class="product-title">
|
||||||
|
<h2 class="product-title-h2">{$dc_title.title|default=''}</h2>
|
||||||
|
<p class="product-title-p">{$dc_title.short_title|default=''}</p>
|
||||||
|
</div>
|
||||||
|
<div class="product-container">
|
||||||
|
{assign name="dc_first_section_lf" value=":array_shift($data.desktop_charger)" /}
|
||||||
|
{notempty name="dc_first_section_lf"}
|
||||||
|
<a class="product-left" href="{$dc_first_section_lf.link}">
|
||||||
|
<img src="{$dc_first_section_lf.image}" alt="{$dc_first_section_lf.short_title}" class="product-img">
|
||||||
|
<!-- 公共类+定位类:尺寸和第一个完全一致,仅定位不同 -->
|
||||||
|
<div class="product-img-hover product-img-2" >
|
||||||
|
<img src="{$dc_first_section_lf.extra_image}" alt="{$dc_first_section_lf.short_title}">
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
{/notempty}
|
||||||
|
{assign name="dc_first_section_lr" value=":array_shift($data.desktop_charger)" /}
|
||||||
|
{notempty name="dc_first_section_lr"}
|
||||||
|
<div class="product-right">
|
||||||
|
<img src="{$dc_first_section_lr.image}"
|
||||||
|
alt="使用场景" class="right-content right-img">
|
||||||
|
<!--muted loop playsinline controls-->
|
||||||
|
<video
|
||||||
|
src="{$dc_first_section_lr.video}"
|
||||||
|
class="right-content right-video" muted loop playsinline controls>
|
||||||
|
您的浏览器不支持HTML5视频播放,请升级浏览器
|
||||||
|
</video>
|
||||||
|
</div>
|
||||||
|
{/notempty}
|
||||||
|
|
||||||
|
</div>
|
||||||
|
{assign name="dc_second_section" value=":array_splice($data.desktop_charger, 0, 2)" /}
|
||||||
|
{notempty name="dc_second_section"}
|
||||||
|
<div class="product-card-box">
|
||||||
|
<div class="product-card-container2">
|
||||||
|
{volist name="dc_second_section" id="dcs"}
|
||||||
|
<a class="product-card2" href="{$dcs.link}">
|
||||||
|
<div class="product-text2">
|
||||||
|
<!-- 新增内部容器,确保所有内容左对齐一致性 -->
|
||||||
|
<div class="product-text-content2">
|
||||||
|
<div class="product-card-title2">{$dcs.title}</div> <!-- 测试超出一行省略 -->
|
||||||
|
<div class="product-card-desc2">{$dcs.short_title}</div> <!-- 测试超出2行省略 -->
|
||||||
|
<div class="product-card-link2">
|
||||||
|
<img src="__IMAGES__/ljgd.png" alt="了解更多">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="product-card-img2">
|
||||||
|
<img src="{$dcs.image}" alt="{$dcs.title}">
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
{/volist}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{/notempty}
|
||||||
|
{assign name="dc_three_section" value=":array_shift($data.desktop_charger)" /}
|
||||||
|
{notempty name="dc_three_section"}
|
||||||
|
<a href="{$dc_three_section.link}" class="more">
|
||||||
|
<div class="more-img">
|
||||||
|
{$dc_three_section.title}
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
{/notempty}
|
||||||
|
</div>
|
||||||
|
<!-- 墙插 -->
|
||||||
|
{notempty name="data.wall_charger"}
|
||||||
|
<div class="product-box">
|
||||||
|
{assign name="wc_title" value=":array_shift($data.wall_charger)" /}
|
||||||
|
<div class="product-title">
|
||||||
|
<h2 class="product-title-h2">{$wc_title.title|default=''}</h2>
|
||||||
|
<p class="product-title-p">{$wc_title.short_title|default=''}</p>
|
||||||
|
</div>
|
||||||
|
<div class="product-container">
|
||||||
|
{assign name="wc_first_section_lf" value=":array_shift($data.wall_charger)" /}
|
||||||
|
{notempty name="wc_first_section_lf"}
|
||||||
|
<a class="product-left" href="{$wc_first_section_lf.link}">
|
||||||
|
<img src="{$wc_first_section_lf.image}" alt="{$wc_first_section_lf.title}" class="product-img">
|
||||||
|
<!-- 公共类+定位类:尺寸统一,定位不同 -->
|
||||||
|
<div class="product-img-hover product-img-1">
|
||||||
|
<img src="{$wc_first_section_lf.extra_image}" alt="{$wc_first_section_lf.title}">
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
{/notempty}
|
||||||
|
{assign name="wc_first_section_lr" value=":array_shift($data.wall_charger)" /}
|
||||||
|
{notempty name="wc_first_section_lr"}
|
||||||
|
<div class="product-right">
|
||||||
|
<img src="{$wc_first_section_lr.image}" alt="{$wc_first_section_lr.title}" class="right-content right-img">
|
||||||
|
<video src="{$wc_first_section_lr.video}" class="right-content right-video" muted loop playsinline controls>
|
||||||
|
您的浏览器不支持HTML5视频播放,请升级浏览器
|
||||||
|
</video>
|
||||||
|
</div>
|
||||||
|
{/notempty}
|
||||||
|
</div>
|
||||||
|
{assign name="wc_more_section" value=":array_shift($data.wall_charger)" /}
|
||||||
|
{notempty name="wc_more_section"}
|
||||||
|
<a href="{$wc_more_section.link}" class="more">
|
||||||
|
<div class="more-img">
|
||||||
|
{$wc_more_section.title}
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
{/notempty}
|
||||||
|
</div>
|
||||||
|
{/notempty}
|
||||||
|
{notempty name="data.converter"}
|
||||||
|
<!-- 转换器 -->
|
||||||
|
<div class="product-box">
|
||||||
|
{assign name="ct_title" value=":array_shift($data.converter)" /}
|
||||||
|
<div class="product-title">
|
||||||
|
<h2 class="product-title-h2">{$ct_title.title|default=''}</h2>
|
||||||
|
<p class="product-title-p">{$ct_title.short_title|default=''}</p>
|
||||||
|
</div>
|
||||||
|
{assign name="ct_more_section" value=":array_pop($data.converter)" /}
|
||||||
|
{assign name="ct_chunk_section" value=":array_chunk($data.converter, 2)" /}
|
||||||
|
{assign name="ct_chunk_section_len" value=":count($ct_chunk_section)" /}
|
||||||
|
{volist name="ct_chunk_section" id="cts" key="k"}
|
||||||
|
<div class="product-container">
|
||||||
|
{assign name="cts_lf" value=":array_shift($cts)" /}
|
||||||
|
{notempty name="cts_lf"}
|
||||||
|
<a class="product-left" href="{$cts_lf.link}">
|
||||||
|
<img src="{$cts_lf.image}" alt="{$cts_lf.title}" class="product-img">
|
||||||
|
<!-- 公共类+定位类:尺寸统一,定位不同 -->
|
||||||
|
<!--style="display:flex;justify-content: center;"-->
|
||||||
|
<div class="product-img-hover product-img-1" >
|
||||||
|
<!-- style="width:70%"-->
|
||||||
|
<img src="{$cts_lf.extra_image}" alt="{$cts_lf.title}">
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
{/notempty}
|
||||||
|
{assign name="cts_lr" value=":array_shift($cts)" /}
|
||||||
|
{notempty name="cts_lr"}
|
||||||
|
<div class="product-right">
|
||||||
|
<img src="{$cts_lr.image}" alt="{$cts_lr.title}" class="right-content right-img">
|
||||||
|
<video src="{$cts_lr.video}" class="right-content right-video" muted loop playsinline controls>
|
||||||
|
您的浏览器不支持HTML5视频播放,请升级浏览器
|
||||||
|
</video>
|
||||||
|
</div>
|
||||||
|
{/notempty}
|
||||||
|
</div>
|
||||||
|
{neq name="k" value="$ct_chunk_section_len"}
|
||||||
|
<div class="line"></div>
|
||||||
|
{/neq}
|
||||||
|
{/volist}
|
||||||
|
{notempty name="ct_more_section"}
|
||||||
|
<a href="{$ct_more_section.link}" class="more" style="padding: clamp(1.5rem, 3vw, 3rem) 0">
|
||||||
|
<div class="more-img">
|
||||||
|
{$ct_more_section.title}
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
{/notempty}
|
||||||
|
</div>
|
||||||
|
{/notempty}
|
||||||
|
{notempty name="data.footer_info"}
|
||||||
|
<!-- 底部 -->
|
||||||
|
<div class="prodline-footer-box">
|
||||||
|
<div class="prodline-footer-box-img">
|
||||||
|
<img src="{$data.footer_info.0.image}" alt="">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{/notempty}
|
||||||
|
<!-- 蒙版 -->
|
||||||
|
<div class="mask" id="mask">
|
||||||
|
<div class="mask-content" >
|
||||||
|
<span class="close-btn">×</span>
|
||||||
|
<div class="mask-scroll-content"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{/block}
|
||||||
|
{block name="script"}
|
||||||
|
<script type="text/javascript">
|
||||||
|
let swiper=null;
|
||||||
|
const advantageItems = document.querySelectorAll('.advantage-card');
|
||||||
|
let scrollTop = 0; // 保存页面滚动位置
|
||||||
|
let closeBtnHtml = null; // 关闭按钮元素(全局变量,避免重复创建)
|
||||||
|
const mask = document.getElementById('mask');
|
||||||
|
const maskContent = document.querySelector('.mask-content');
|
||||||
|
const maskScrollContent = document.querySelector('.mask-scroll-content'); // 滚动容器(关键!)
|
||||||
|
const closeBtn = document.querySelector('.close-btn')
|
||||||
|
// 初始化:确保 maskScrollContent 存在于 maskContent 中(避免被清空)
|
||||||
|
if (!maskScrollContent) {
|
||||||
|
// 如果页面没有 mask-scroll-content,动态创建(确保结构稳定)
|
||||||
|
const scrollContent = document.createElement('div');
|
||||||
|
scrollContent.className = 'mask-scroll-content';
|
||||||
|
maskContent.appendChild(scrollContent);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function createCloseBtn() {
|
||||||
|
if (closeBtnHtml) {
|
||||||
|
closeBtnHtml.remove();
|
||||||
|
}
|
||||||
|
|
||||||
|
closeBtnHtml = document.createElement('span');
|
||||||
|
closeBtnHtml.className = 'close-btn';
|
||||||
|
closeBtnHtml.innerHTML = '×';
|
||||||
|
|
||||||
|
closeBtnHtml.addEventListener('click', hideMask);
|
||||||
|
|
||||||
|
// 挂载到 maskContent(而非 scrollContent),避免被滚动影响位置
|
||||||
|
maskContent.prepend(closeBtnHtml);
|
||||||
|
}
|
||||||
|
|
||||||
|
function showMask(contentHtml) {
|
||||||
|
// 保存页面滚动位置
|
||||||
|
scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;
|
||||||
|
|
||||||
|
// 关键:将内容填充到 scrollContent 中(而非直接替换 maskContent)
|
||||||
|
maskScrollContent.innerHTML = contentHtml;
|
||||||
|
createCloseBtn();
|
||||||
|
|
||||||
|
// 显示蒙版
|
||||||
|
mask.style.display = 'flex';
|
||||||
|
|
||||||
|
// 禁止滚动(复用你的逻辑)
|
||||||
|
document.documentElement.classList.add('no-scroll');
|
||||||
|
document.body.classList.add('no-scroll');
|
||||||
|
document.body.style.top = `-${scrollTop}px`;
|
||||||
|
|
||||||
|
// 额外:打开蒙版时就重置滚动位置(避免残留上次滚动状态)
|
||||||
|
maskScrollContent.scrollTop = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function hideMask() {
|
||||||
|
// 关键步骤 1:先重置 scrollContent 的滚动位置(此时元素还未被销毁)
|
||||||
|
maskScrollContent.scrollTop = 0;
|
||||||
|
|
||||||
|
// 关键步骤 2:清空 scrollContent 的内容(而非 maskContent)
|
||||||
|
maskScrollContent.innerHTML = "";
|
||||||
|
|
||||||
|
// 隐藏蒙版
|
||||||
|
mask.style.display = 'none';
|
||||||
|
|
||||||
|
// 恢复滚动(复用你的逻辑)
|
||||||
|
document.documentElement.classList.remove('no-scroll');
|
||||||
|
document.body.classList.remove('no-scroll');
|
||||||
|
document.body.style.top = '';
|
||||||
|
|
||||||
|
// 还原页面滚动位置
|
||||||
|
window.scrollTo(0, scrollTop);
|
||||||
|
|
||||||
|
// 移除关闭按钮(可选,避免残留)
|
||||||
|
if (closeBtnHtml) {
|
||||||
|
closeBtnHtml.remove();
|
||||||
|
closeBtnHtml = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 点击卡片显示详情
|
||||||
|
advantageItems.forEach((item) => {
|
||||||
|
item.addEventListener('click', (e) => {
|
||||||
|
// 获取当前点击卡片内的.mack-conten-text元素
|
||||||
|
const currentMackContent = e.currentTarget.querySelector('.mack-conten-text');
|
||||||
|
if (currentMackContent) {
|
||||||
|
// 关键修改:获取该元素的子内容(innerHTML 本身就是内部HTML,不含当前元素标签)
|
||||||
|
// 若想更彻底,可遍历子节点拼接内容(兼容特殊场景)
|
||||||
|
let contentHtml = '';
|
||||||
|
Array.from(currentMackContent.childNodes).forEach(child => {
|
||||||
|
// 只保留元素节点和文本节点(过滤空节点)
|
||||||
|
if (child.nodeType === 1 || child.nodeType === 3) {
|
||||||
|
contentHtml += child.outerHTML || child.textContent;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
// 显示蒙版并传入纯净的子内容
|
||||||
|
showMask(contentHtml);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
// 关闭按钮事件
|
||||||
|
closeBtn.addEventListener('click', hideMask);
|
||||||
|
// 点击蒙版背景关闭(可选)
|
||||||
|
mask.addEventListener('click', (e) => {
|
||||||
|
if (e.target === mask) hideMask();
|
||||||
|
});
|
||||||
|
|
||||||
|
// ESC 键关闭(可选)
|
||||||
|
document.addEventListener('keydown', (e) => {
|
||||||
|
if (e.key === 'Escape' && mask.style.display === 'flex') hideMask();
|
||||||
|
});
|
||||||
|
|
||||||
|
// 关键:拦截蒙版的 touchmove 事件,阻止滚动穿透(移动端核心)
|
||||||
|
mask.addEventListener(
|
||||||
|
'touchmove',
|
||||||
|
(e) => {
|
||||||
|
// 只有点击蒙版背景(不是内容区域)才阻止滚动
|
||||||
|
if (e.target === mask) {
|
||||||
|
e.preventDefault(); // 阻止默认触摸滚动行为
|
||||||
|
e.stopPropagation(); // 阻止事件冒泡
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ passive: false }
|
||||||
|
); // passive: false 必须,否则 preventDefault 无效
|
||||||
|
|
||||||
|
const allVideos = document.querySelectorAll('.right-video');
|
||||||
|
// 停止所有视频播放
|
||||||
|
function stopAllVideos() {
|
||||||
|
allVideos.forEach((video) => {
|
||||||
|
video.pause();
|
||||||
|
video.style.display = 'none';
|
||||||
|
// 显示对应图片
|
||||||
|
const img = video.parentElement.querySelector('.right-img');
|
||||||
|
if (img) img.style.display = 'block';
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// 滚动切换图片/视频(核心逻辑)
|
||||||
|
window.addEventListener('scroll', function () {
|
||||||
|
const productRights = document.querySelectorAll('.product-right');
|
||||||
|
let activeVideo = null;
|
||||||
|
// 找出当前在视口中的视频容器
|
||||||
|
productRights.forEach((rightContainer) => {
|
||||||
|
const img = rightContainer.querySelector('.right-img');
|
||||||
|
const video = rightContainer.querySelector('.right-video');
|
||||||
|
const videoSrc = video.src.trim()
|
||||||
|
if (!img || !video) return;
|
||||||
|
if(!videoSrc) return;
|
||||||
|
const rect = rightContainer.getBoundingClientRect();
|
||||||
|
// 视口判断:容器进入视口50%以上视为活跃
|
||||||
|
const isInView =
|
||||||
|
rect.top < window.innerHeight * 0.7 &&
|
||||||
|
rect.bottom > window.innerHeight * 0.3;
|
||||||
|
|
||||||
|
if (isInView) {
|
||||||
|
activeVideo = video;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// 处理活跃视频
|
||||||
|
if (activeVideo) {
|
||||||
|
stopAllVideos(); // 先停止其他视频
|
||||||
|
const img = activeVideo.parentElement.querySelector('.right-img');
|
||||||
|
img.style.display = 'none';
|
||||||
|
activeVideo.style.display = 'block';
|
||||||
|
|
||||||
|
// 自动播放(兼容原生控制栏,用户手动暂停后不会强制播放)
|
||||||
|
if (activeVideo.paused) {
|
||||||
|
activeVideo.play().catch((err) => {
|
||||||
|
console.log('视频播放失败(浏览器限制):', err);
|
||||||
|
// 播放失败时回退到图片
|
||||||
|
activeVideo.style.display = 'none';
|
||||||
|
img.style.display = 'block';
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
stopAllVideos(); // 无活跃视频时停止所有播放
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
window.onload = function () {
|
||||||
|
if (typeof Swiper === 'undefined') {
|
||||||
|
console.error('Swiper加载失败,请刷新页面重试');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
swiper = new Swiper('.auto-swiper-container', {
|
||||||
|
autoplay: {
|
||||||
|
delay: 3000, // 3秒切换
|
||||||
|
disableOnInteraction: false,
|
||||||
|
},
|
||||||
|
loop: false,
|
||||||
|
slidesPerView: 1,
|
||||||
|
spaceBetween: 0,
|
||||||
|
// 启用分页指示标(核心配置)
|
||||||
|
pagination: {
|
||||||
|
el: '.swiper-pagination', // 对应 HTML 中的指示标容器
|
||||||
|
clickable: true, // 允许点击指示标切换
|
||||||
|
// dynamicBullets: true, // 动态指示标(当前激活放大)
|
||||||
|
//dynamicMainBullets: 3, // 动态模式显示3个核心指示标
|
||||||
|
},
|
||||||
|
navigation: false,
|
||||||
|
scrollbar: false,
|
||||||
|
on: {
|
||||||
|
resize: function () {
|
||||||
|
this.update();
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
window.addEventListener('resize', function () {
|
||||||
|
swiper.update();
|
||||||
|
});
|
||||||
|
|
||||||
|
// 初始化时触发滚动事件,确保状态正确
|
||||||
|
window.dispatchEvent(new Event('scroll'));
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
{/block}
|
||||||
@@ -18,7 +18,7 @@ if (!function_exists('image_domain_concat')) {
|
|||||||
return $path;
|
return $path;
|
||||||
}
|
}
|
||||||
|
|
||||||
return rtrim($domain, '/') . '/' . ltrim($path, '/');
|
return url_join($domain, $path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -39,7 +39,7 @@ if (!function_exists('video_domain_concat')) {
|
|||||||
return $path;
|
return $path;
|
||||||
}
|
}
|
||||||
|
|
||||||
return rtrim($domain, '/') . '/' . ltrim($path, '/');
|
return url_join($domain, $path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -15,8 +15,8 @@ class Article
|
|||||||
$params = request()->get([
|
$params = request()->get([
|
||||||
'category_id',
|
'category_id',
|
||||||
'language' => 'zh-cn',
|
'language' => 'zh-cn',
|
||||||
'page/d' => 1,
|
'page/d' => 1,
|
||||||
'size/d' => 50
|
'size/d' => 50
|
||||||
]);
|
]);
|
||||||
|
|
||||||
if ($params['size'] > 200) {
|
if ($params['size'] > 200) {
|
||||||
@@ -66,6 +66,8 @@ class Article
|
|||||||
])
|
])
|
||||||
->withoutField([
|
->withoutField([
|
||||||
'language_id',
|
'language_id',
|
||||||
|
'author',
|
||||||
|
'source',
|
||||||
'seo_title',
|
'seo_title',
|
||||||
'seo_keywords',
|
'seo_keywords',
|
||||||
'seo_desc',
|
'seo_desc',
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user