675 Commits

Author SHA1 Message Date
c9bc2022e6 笔记本
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 4s
2025-12-05 09:56:55 +08:00
8311181967 rerfactor: 电力pc 导航
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 5s
2025-12-04 15:30:22 +08:00
99d49ee8a2 删除header
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 4s
2025-12-04 15:03:11 +08:00
4035fe4751 refactor: 把字体等大文件放入lfs管理
All checks were successful
Gitea Actions Official-website / deploy-dev (push) Successful in 10s
2025-12-04 14:34:12 +08:00
634a758aff refactor: lfs大文件管理 2025-12-04 14:04:23 +08:00
8ea03656d9 refactor: lfs管理 2025-12-04 14:01:34 +08:00
37023c6949 refactor: lfs管理字体 2025-12-04 13:54:59 +08:00
4fa32b56fe rrefactor: 修改字体文件为lfs管理 2025-12-04 13:53:23 +08:00
06078cf312 删除注释 2025-12-04 11:34:43 +08:00
578ad475b7 底部样式 2025-12-04 11:34:20 +08:00
8ced45364b 底部 2025-12-04 11:33:20 +08:00
9db66b7429 七牛云引入字体 2025-12-03 17:56:08 +08:00
c91895f57f 删除备份文件 2025-12-03 17:03:57 +08:00
42d9efdc02 移动端尺寸字体调整 2025-12-03 15:30:19 +08:00
e16b8b6b41 字体切换 2025-12-02 16:33:24 +08:00
8e4befc0ea Merge branch 'font' into dev 2025-12-02 16:12:06 +08:00
1a43ad30fb 移动端 2025-12-02 16:11:12 +08:00
c28b945858 font 2025-12-01 15:33:55 +08:00
9845883d8e refactor: 专题 - 电力品线 2025-11-28 16:23:21 +08:00
5d44c45c13 footer 2025-11-28 15:45:20 +08:00
7f472b0351 refactor: 专题 - 电力品线 2025-11-28 15:36:12 +08:00
14df140847 refactor: 专题 - 电力品线 2025-11-28 15:23:29 +08:00
13e58c33a2 refactor: 专题 - 电力品线 2025-11-28 14:51:30 +08:00
88e307a10e feat: 添加电力品线专题url 2025-11-28 14:43:17 +08:00
ca3c00f396 电力 2025-11-28 14:18:19 +08:00
c8d5661856 尺寸调整 2025-11-27 18:38:58 +08:00
288c86ffbc 修复bug 2025-11-27 09:42:18 +08:00
ccc551dcba refactor: 专题 - 电力品线 修改 2025-11-26 17:46:09 +08:00
b6e8aa7880 refactor: 专题 - 电力品线 mobile 修改 2025-11-26 17:29:45 +08:00
cc2bb999c0 refactor: 删除gitea webhook文件 2025-11-25 17:45:32 +08:00
e7009c8a49 refactor: migration文件添加banner简称相关 2025-11-25 17:43:09 +08:00
2a8f88637c refactor: .gitignore 2025-11-25 17:38:57 +08:00
1fc6f9067c refactor: 专题 - 电力品线 2025-11-25 17:36:09 +08:00
ffa6f29af8 refactor: 专题 - 电力品线mobile端 2025-11-25 16:15:42 +08:00
476a238d27 refactor: 专题 - 电力品线pc端 2025-11-25 14:56:57 +08:00
18862c584f refactor: banner加入"banner简称"问题修改 2025-11-25 14:05:01 +08:00
ee9174e801 refactor: .gitignore 2025-11-25 14:01:08 +08:00
4c13d31cb9 feat: banner添加/编辑时加入“banner简称”字段 2025-11-25 14:00:06 +08:00
3ed8e1f8fc refactor: 主题 - 电力品线 2025-11-25 13:48:59 +08:00
1c998a4be1 feat: 添加dev-ci.yaml 2025-11-24 15:43:38 +08:00
c3c67c9e59 feat: 专题 - 电力品线首页 2025-11-20 14:29:30 +08:00
ef5d2c6ab9 refactor: 修改.gitignore 2025-11-20 11:00:35 +08:00
80678c23e2 Merge branch 'dev' of https://gitea.f2b211.com/jsasg/orico-official-website into dev 2025-09-19 15:22:25 +08:00
53e56b4649 1 2025-09-19 15:22:22 +08:00
ouzhiqiang
75977040f1 修改分类 2025-09-19 15:14:55 +08:00
ouzhiqiang
cf5a1280ee 修改分类 2025-09-19 14:59:45 +08:00
ouzhiqiang
30d99619b2 修改分类 2025-09-19 14:48:10 +08:00
ouzhiqiang
7e877920ee 修改分类 2025-09-19 14:47:05 +08:00
ouzhiqiang
04ede65c93 修改分类 2025-09-19 14:36:08 +08:00
ouzhiqiang
7524a9d572 Merge branch 'dev' of https://gitea.f2b211.com/jsasg/orico-official-website into dev 2025-09-19 14:32:27 +08:00
ouzhiqiang
9b5cf2147d 修改分类 2025-09-19 14:31:56 +08:00
9d898b1be3 Merge branch 'dev' of https://gitea.f2b211.com/jsasg/orico-official-website into dev 2025-09-19 14:13:56 +08:00
834114261c 1 2025-09-19 14:13:53 +08:00
ouzhiqiang
2dc787bbfd 修改分类 2025-09-19 11:37:41 +08:00
ouzhiqiang
5d61b4995f 修改分类 2025-09-19 11:22:25 +08:00
ouzhiqiang
6800332b5b 修改分类 2025-09-19 11:17:49 +08:00
ouzhiqiang
1c1d075f5e 修改分类 2025-09-19 11:09:29 +08:00
ouzhiqiang
34821fd0bc 修改分类 2025-09-19 10:41:41 +08:00
ouzhiqiang
3492d55707 修改分类 2025-09-19 10:36:26 +08:00
ouzhiqiang
5b901fe43c 修改分类 2025-09-19 10:29:25 +08:00
ouzhiqiang
e6d299df83 修改分类 2025-09-19 10:23:02 +08:00
ouzhiqiang
5d5a338b55 修改分类 2025-09-19 10:04:47 +08:00
ouzhiqiang
4cd2f4ad26 修改分类 2025-09-19 09:53:40 +08:00
ouzhiqiang
14f899bf62 修改分类 2025-09-19 09:51:29 +08:00
ouzhiqiang
f82888c8e3 Merge branch 'ozq-dev' into dev 2025-09-18 17:50:21 +08:00
ouzhiqiang
43c61a1ab5 修改分类 2025-09-18 17:50:05 +08:00
ouzhiqiang
4f2edf5d30 Merge branch 'ozq-dev' into dev 2025-09-18 17:47:43 +08:00
ouzhiqiang
4ca59e81e3 修改分类 2025-09-18 17:47:22 +08:00
ouzhiqiang
9cd7b4f508 Merge branch 'ozq-dev' into dev 2025-09-18 17:23:25 +08:00
ouzhiqiang
e02ad39620 修改分类 2025-09-18 17:23:07 +08:00
ouzhiqiang
0ce0c0a27a Merge branch 'ozq-dev' into dev 2025-09-18 17:16:43 +08:00
ouzhiqiang
db72a5643c 修改分类 2025-09-18 17:16:24 +08:00
ouzhiqiang
60fb6a5336 Merge branch 'ozq-dev' into dev 2025-09-18 17:13:22 +08:00
ouzhiqiang
987e98279a 修改分类 2025-09-18 17:13:04 +08:00
ouzhiqiang
9b926f1bf8 Merge branch 'ozq-dev' into dev 2025-09-18 17:04:44 +08:00
ouzhiqiang
810b581d87 修改分类 2025-09-18 17:04:29 +08:00
ouzhiqiang
6bbc7c55c9 Merge branch 'ozq-dev' into dev 2025-09-18 17:01:25 +08:00
ouzhiqiang
36de45c2e8 修改分类 2025-09-18 17:01:08 +08:00
ouzhiqiang
fd7e136c3a Merge branch 'ozq-dev' into dev 2025-09-18 16:56:01 +08:00
ouzhiqiang
c9987373a4 修改分类 2025-09-18 16:55:47 +08:00
ouzhiqiang
5386610bf9 Merge branch 'ozq-dev' into dev 2025-09-18 16:53:26 +08:00
ouzhiqiang
f1696a88d2 修改分类 2025-09-18 16:53:06 +08:00
ouzhiqiang
7e96a0e538 Merge branch 'ozq-dev' into dev 2025-09-18 16:49:16 +08:00
ouzhiqiang
1f1cc6145d 修改分类 2025-09-18 16:48:45 +08:00
ouzhiqiang
610377172a Merge branch 'ozq-dev' into dev 2025-09-18 16:11:52 +08:00
ouzhiqiang
0d5593e173 修改分类 2025-09-18 16:11:36 +08:00
ouzhiqiang
6dbeb59b36 Merge branch 'ozq-dev' into dev 2025-09-18 16:08:29 +08:00
ouzhiqiang
e54fccca65 修改分类 2025-09-18 16:08:05 +08:00
ouzhiqiang
1a92627ab9 Merge branch 'ozq-dev' into dev 2025-09-18 16:01:20 +08:00
ouzhiqiang
88a7f06499 修改分类 2025-09-18 16:00:49 +08:00
ouzhiqiang
d6e58c78d4 Merge branch 'ozq-dev' into dev 2025-09-18 15:39:28 +08:00
ouzhiqiang
46e78cff08 修改分类 2025-09-18 15:38:59 +08:00
ouzhiqiang
48c589babf Merge branch 'dev' of https://gitea.f2b211.com/jsasg/orico-official-website into dev 2025-09-18 15:26:19 +08:00
ouzhiqiang
72f974c083 修改分类 2025-09-18 15:25:29 +08:00
9def4960c4 1 2025-09-18 11:59:32 +08:00
622f9f1665 1 2025-09-18 11:57:52 +08:00
db7c34f4ad 分类补充 2025-09-18 11:56:48 +08:00
f79dbc1121 移动端帮助中心三级菜单 2025-09-18 11:52:52 +08:00
f3de8b4a26 帮助中心文档三级菜单 2025-09-18 11:21:50 +08:00
85ccecb5bf Merge branch 'dev' of https://gitea.f2b211.com/jsasg/orico-official-website into dev 2025-09-18 11:15:12 +08:00
fa60ec4fcb feat: 添加open api client管理命令 2025-09-17 17:48:27 +08:00
cb128a32a8 Merge branch 'dev' 2025-08-26 14:53:55 +08:00
705566b376 refactor: 去掉多余目录 2025-08-26 14:53:38 +08:00
0b13ec05dc fix: 修复“检测文件地址并根据情况转换为文件系统地址”url为null情况报错问题 2025-08-26 14:53:17 +08:00
7f765f40ee Merge branch 'dev' 2025-08-08 09:18:33 +08:00
2a9c3332f7 fix: 修复产品目录分类树数据问题 2025-08-08 09:18:13 +08:00
12822ccb6b Merge branch 'dev' 2025-08-07 17:08:12 +08:00
4872574eb0 fix: admapi - 产品目录同步分类更新时bug修复 2025-08-07 17:07:52 +08:00
fa893d6b53 Merge branch 'dev' 2025-08-07 11:38:17 +08:00
f9445b6f49 Merge branch 'dev' of https://gitea.f2b211.com/jsasg/orico-official-website into dev 2025-08-07 11:37:49 +08:00
fea5f233a9 style:底部样式修改 2025-08-07 11:36:56 +08:00
e2b65856d2 Merge branch 'dev' 2025-08-07 10:20:10 +08:00
3733ce720d fix: mobile - 底部“联系我们”取值问题 2025-08-07 10:19:45 +08:00
0b82dbbf5f Merge branch 'dev' 2025-08-07 10:18:06 +08:00
74d70fe815 fix: mobile - 底部“联系我们”取值问题 2025-08-07 10:17:24 +08:00
0f2dc12752 Merge branch 'dev' 2025-08-07 10:12:04 +08:00
499e86f52b fix: mobile - 底部“联系我们”取值问题 2025-08-07 10:03:50 +08:00
b24987fbd2 Merge branch 'dev' 2025-08-06 15:35:50 +08:00
19aecea497 perf openapi 图片地址拼接 2025-08-06 15:35:35 +08:00
9060ed8274 Merge branch 'dev' 2025-08-06 12:45:49 +08:00
54d15595ce fix: 后台 - 修改各导出图片等文件地址拼接问题 2025-08-06 11:56:53 +08:00
101c1ae807 fix: 后台 产品导出数据问题 2025-08-06 11:40:44 +08:00
ed7f274c6e fix: 后台 产品导出数据问题 2025-08-06 11:40:09 +08:00
1288ffd51b fix: mobile下视频分类地址错误 2025-07-31 10:55:26 +08:00
62e43375ab fix: 获取文件系统磁盘未判断“//”情况 2025-07-31 09:03:49 +08:00
9f01db7d54 fix: 首页“场景介绍”无法点击 2025-07-31 09:03:48 +08:00
ac06090792 1 2025-07-30 17:08:22 +08:00
6e6e4ac47c 1 2025-07-30 17:07:37 +08:00
8ccc4b0cd5 1 2025-07-30 16:48:54 +08:00
55cd7f2b62 1 2025-07-30 16:47:15 +08:00
43e1ae0422 1 2025-07-30 16:44:32 +08:00
7fcb78dde0 1 2025-07-30 16:40:36 +08:00
6872a13141 Merge branch 'dev' 2025-07-30 16:33:15 +08:00
234658f443 style:产品详情 2025-07-30 16:13:37 +08:00
9f9a384075 .ql-editor 2025-07-30 15:43:42 +08:00
047d7979ff .ql-editor 2025-07-30 15:42:52 +08:00
3544c08005 style:产品详情样式 2025-07-30 15:35:16 +08:00
2ff6d274d9 Merge branch 'dev' of https://gitea.f2b211.com/jsasg/orico-official-website into dev 2025-07-30 15:25:01 +08:00
d31d2359c6 style:详情样式 2025-07-30 15:24:58 +08:00
6f9c89da7b fix: 字段长度限制 2025-07-30 11:13:17 +08:00
9c6659830c fix: 字段长度限制 2025-07-30 11:12:13 +08:00
4c906723df Merge branch 'dev' 2025-07-29 17:52:13 +08:00
d93aa62fbf refactor: 修改后台banner的“链接地址”长度限制为510 2025-07-29 17:51:56 +08:00
f216ba82b4 Merge branch 'dev' 2025-07-29 16:48:16 +08:00
bcd537ef25 Merge branch 'dev' 2025-07-29 16:47:31 +08:00
589a099cdd 1 2025-07-29 14:16:51 +08:00
e13b30bbb2 Merge branch 'dev' of https://gitea.f2b211.com/jsasg/orico-official-website into dev 2025-07-29 14:14:29 +08:00
eb924d42d4 视频宽度限制 2025-07-29 14:14:27 +08:00
9378efe401 文章视频限制 2025-07-29 14:13:34 +08:00
84dd8ea84b fix: migrations/seeds 2025-07-29 14:08:30 +08:00
4c2441b1b6 fix: 产品详情-分类路径bug 2025-07-29 12:00:22 +08:00
db8e0803c1 文章详情样式调整 2025-07-28 14:50:26 +08:00
72b8230d5a Merge branch 'dev' of https://gitea.f2b211.com/jsasg/orico-official-website into dev 2025-07-28 14:34:41 +08:00
5a8f32e0f8 style:宽度调整 2025-07-28 14:25:01 +08:00
517c2e954b chore: composer.json 2025-07-28 11:13:56 +08:00
eee40e6010 perf: migrations/seeds 2025-07-28 10:33:44 +08:00
a7882da734 perf: 七牛云存储 2025-07-28 10:16:03 +08:00
64ea309b30 refactor: .gitignore 2025-07-25 18:00:14 +08:00
708fee0490 refactor: 七牛云上传 2025-07-25 17:57:31 +08:00
5623c4160e 文章详情样式调整 2025-07-25 13:47:37 +08:00
b660d82c94 Merge branch 'dev' of https://gitea.f2b211.com/jsasg/orico-official-website into dev 2025-07-24 10:00:18 +08:00
8f5d3ed60f 1 2025-07-24 10:00:14 +08:00
0f7e768bc4 feat: 七牛云上传开发 2025-07-23 17:55:34 +08:00
1d84ba373b perf: 自定义语言检测中间件 2025-07-23 17:55:34 +08:00
76e8372059 补充 2025-07-23 17:25:57 +08:00
fdb91466ca .ql-editor 关于tab切换的样式同步 2025-07-23 17:20:11 +08:00
133c58c268 样式修改 2025-07-22 16:48:22 +08:00
c2ad978614 Merge branch 'dev' 2025-07-21 17:32:36 +08:00
865fe2fc44 fix: pc 产品,附件,视频搜索去除首尾空格 2025-07-21 17:31:17 +08:00
0f4c7fec5d fix: pc 视频搜索 2025-07-21 16:55:06 +08:00
1cfae69a27 fix: pc 视频搜索 2025-07-21 16:54:43 +08:00
aa00a24b89 Merge branch 'dev' 2025-07-19 10:48:27 +08:00
0b2c408525 fix: 图片上传命名问题 2025-07-19 10:48:07 +08:00
e6b255b824 Merge branch 'master' of https://gitea.f2b211.com/jsasg/orico-official-website 2025-07-18 15:19:02 +08:00
d7e8fe1d6e 1 2025-07-18 15:16:09 +08:00
2a31e22ad8 标题提取空过滤 样式修改 2025-07-18 15:15:13 +08:00
99765a6112 Merge branch 'dev' of https://gitea.f2b211.com/jsasg/orico-official-website into dev 2025-07-18 14:42:10 +08:00
5ae6d5681d Merge branch 'dev' 2025-07-18 14:40:20 +08:00
d2b274b559 fix: nas 文章详情页分类排序问题 2025-07-18 14:40:02 +08:00
3cb4eacff4 Merge branch 'master' of https://gitea.f2b211.com/jsasg/orico-official-website 2025-07-18 14:39:33 +08:00
2a4349daab 1 2025-07-18 14:39:30 +08:00
4e8320e871 Merge branch 'dev' 2025-07-18 13:36:33 +08:00
3c8f9773be fix: 横幅分类不可小于0 2025-07-18 13:33:58 +08:00
d04343e9c8 fix: nas帮助中心文件分类未排序 2025-07-18 12:36:20 +08:00
ed24f4fcd0 Achievement 2025-07-18 10:29:26 +08:00
c340155bca nas_help_banner 格式修改 2025-07-18 10:16:58 +08:00
78616faa73 indeximg1 ,indeximg2压缩webp 2025-07-18 09:44:41 +08:00
abd3072ada 编辑器样式修改 2025-07-17 17:45:34 +08:00
17f11559d8 1 2025-07-17 17:04:16 +08:00
7b28b2ef20 1 2025-07-17 17:02:29 +08:00
3790816964 1 2025-07-17 17:01:17 +08:00
03fe4ee0ed Merge branch 'master' of https://gitea.f2b211.com/jsasg/orico-official-website 2025-07-17 16:49:08 +08:00
21f600270f 1 2025-07-17 16:49:03 +08:00
43d153c004 Merge branch 'dev' 2025-07-17 16:43:24 +08:00
83468671f1 perf: 优化openapi接口频率限制 2025-07-17 16:43:02 +08:00
f6e52294f0 1 2025-07-17 16:40:23 +08:00
fd64633761 1 2025-07-17 16:35:38 +08:00
19d6944c06 1 2025-07-17 16:31:42 +08:00
7e66a9ecfb 1还原 2025-07-17 16:27:14 +08:00
6925061380 还原 2025-07-17 16:25:01 +08:00
77b988c6b7 1 2025-07-17 16:22:28 +08:00
35723f59a4 1 2025-07-17 16:18:57 +08:00
567798643c 1 2025-07-17 16:11:01 +08:00
912d770c33 ·1 2025-07-17 16:02:31 +08:00
856ce0e7cc 1 2025-07-17 15:40:29 +08:00
7c3c75b22e 1 2025-07-17 15:39:17 +08:00
17ea1ea832 1 2025-07-17 15:32:22 +08:00
693c442060 1 2025-07-17 15:30:43 +08:00
4079574575 格式化 2025-07-17 15:22:56 +08:00
314fb66112 Merge branch 'dev' of https://gitea.f2b211.com/jsasg/orico-official-website into dev 2025-07-17 15:20:55 +08:00
d0b4d74b46 1 2025-07-17 15:19:56 +08:00
44e759564f 1 2025-07-17 15:18:38 +08:00
84bf7662e9 1 2025-07-17 15:13:01 +08:00
0b71bb0254 1 2025-07-17 15:08:52 +08:00
5f5c7d7cf4 1 2025-07-17 12:00:46 +08:00
5e9ace5832 Merge branch 'master' of https://gitea.f2b211.com/jsasg/orico-official-website 2025-07-17 11:49:33 +08:00
e00fb9eadb 1 2025-07-17 11:49:31 +08:00
99734ab92a fix: database/seeds 2025-07-17 11:44:00 +08:00
b1fb932aae 1 2025-07-17 11:42:38 +08:00
97b851e8a6 1 2025-07-17 11:30:52 +08:00
e736271536 英文单词不换行 2025-07-17 10:48:37 +08:00
74d1524d8d 1 2025-07-17 10:36:36 +08:00
3bb1909ecd 图片拉伸 2025-07-17 10:24:00 +08:00
2870cbb544 .header-PC #header .nav3 .choesCountry 2025-07-17 10:19:09 +08:00
710d6244d4 fix: database/seeds 2025-07-17 09:58:09 +08:00
b5b27f0555 1 2025-07-17 09:49:05 +08:00
3a2631b99a Merge branch 'master' of https://gitea.f2b211.com/jsasg/orico-official-website 2025-07-17 09:45:12 +08:00
6ddb7df8aa .ql-editor>* 2025-07-17 09:45:07 +08:00
09b28a1159 feat: 后台管理 产品列表添加按添加时间倒序 2025-07-16 18:12:11 +08:00
5949e576ed img {display: block;}注释 2025-07-16 17:44:55 +08:00
e04b66295f .narshelpCenterdetail-app .nhlpapp-search 2025-07-16 16:55:44 +08:00
7802c80009 Merge branch 'master' of https://gitea.f2b211.com/jsasg/orico-official-website 2025-07-16 16:53:03 +08:00
ce347c514b 移动端nas文章底部操作 2025-07-16 16:53:01 +08:00
3d991abcd5 fix: pc nas专题logo中文下要点击,英文下不要 2025-07-16 15:39:35 +08:00
fa1f6a70db fix: 产品分类排序 2025-07-16 15:32:38 +08:00
fb0a3f9371 fix: pc 产品详情添加型号 2025-07-16 15:24:22 +08:00
fc6079ef32 .ql-container 2025-07-16 14:51:07 +08:00
82a6b171b9 文章样式 2025-07-16 14:45:33 +08:00
4891b07ba2 Merge branch 'master' of https://gitea.f2b211.com/jsasg/orico-official-website 2025-07-16 14:14:05 +08:00
9789cec2bf 1 2025-07-16 14:13:13 +08:00
a59bb22c65 1 2025-07-16 14:11:52 +08:00
5b1a281e0f 还原footer 2025-07-16 14:07:43 +08:00
d168e5bb93 1 2025-07-16 14:02:32 +08:00
76685ce103 Merge branch 'dev' of https://gitea.f2b211.com/jsasg/orico-official-website into dev 2025-07-16 13:39:34 +08:00
db38224b14 Merge branch 'dev' 2025-07-16 13:39:07 +08:00
a52fb091a8 fix: 产品目录同步产品默认在售 2025-07-16 13:38:54 +08:00
13b4464473 Merge branch 'dev' 2025-07-16 11:52:05 +08:00
2b8f8c8294 fix: 后台管理 产品参数问题 2025-07-16 11:51:48 +08:00
f18afbe6ca Merge branch 'dev' 2025-07-16 10:31:39 +08:00
12422f06b4 fix: 产品搜索无数据语言问题 2025-07-16 10:31:14 +08:00
6b4612cd09 pc编辑文本样式 2025-07-16 10:19:42 +08:00
70ed7d917f 添加编辑器样式 2025-07-16 10:17:58 +08:00
3c994973c1 1 2025-07-16 10:12:28 +08:00
4672f76264 1 2025-07-16 10:10:36 +08:00
98ec9cdc49 1 2025-07-16 10:04:54 +08:00
0ad2a41ab3 1 2025-07-16 10:02:47 +08:00
1553a1f2ed 1 2025-07-16 09:56:05 +08:00
9bdb290760 1 2025-07-16 09:54:28 +08:00
b2014b104f Merge branch 'master' of https://gitea.f2b211.com/jsasg/orico-official-website 2025-07-16 09:51:31 +08:00
791380e53c 1 2025-07-16 09:51:26 +08:00
1c3aa90c3a Merge branch 'dev' 2025-07-15 15:00:51 +08:00
425140d4ac fix: openapi token有效期配置 2025-07-15 15:00:38 +08:00
e32f75234a fix: openapi token有效期配置 2025-07-15 14:59:25 +08:00
103fc4dd24 Merge branch 'dev' 2025-07-15 14:49:47 +08:00
6eac1e5d7b perf: openapi token有效期配置 2025-07-15 14:49:03 +08:00
c171073174 Merge branch 'dev' 2025-07-15 14:45:54 +08:00
5c0e96df27 perf: openapi token有效期配置 2025-07-15 14:45:16 +08:00
4a91a4f673 Merge branch 'dev' 2025-07-15 14:21:30 +08:00
9e22cde6ba perf: openapi client授权过期 2025-07-15 14:21:16 +08:00
7ee92398cf fix: admapi 角色菜单权力model 2025-07-15 14:21:04 +08:00
f2c09736de perf: openapi client授权过期 2025-07-15 14:20:36 +08:00
7957b56f29 fix: admapi 角色菜单权力model 2025-07-15 13:50:50 +08:00
dcfa73bdc1 Merge branch 'dev' 2025-07-15 10:48:30 +08:00
3b4f747cb1 perf: .gitignore 2025-07-15 10:46:17 +08:00
401683be6b fix: mobile subcategory.html 2025-07-15 09:54:58 +08:00
a8e80dfa26 fix: mobile subcategory.html 2025-07-15 09:54:38 +08:00
ca38a3a7b6 smallImgDown相对位置修改 2025-07-15 09:36:55 +08:00
6b1ec81bd0 bsImg 高度自适应 2025-07-15 09:32:07 +08:00
01952774b1 Merge branch 'master' of https://gitea.f2b211.com/jsasg/orico-official-website 2025-07-15 09:30:05 +08:00
ee35e2ce4b .bttj 修改 2025-07-15 09:30:02 +08:00
d20e703bfe fix: mobile subcategory.html 2025-07-15 09:25:25 +08:00
2ac0708ac1 perf: mobile 产品分类与搜索页改为缩略图 2025-07-15 09:22:21 +08:00
f292e68b5b Merge branch 'dev' of https://gitea.f2b211.com/jsasg/orico-official-website into dev 2025-07-15 09:19:14 +08:00
fe1a07f56a 顶部底部自适应 2025-07-15 09:18:11 +08:00
be7d256007 fix: mobile view问题 2025-07-15 09:16:01 +08:00
d3c8ffaeb1 Merge branch 'dev' of https://gitea.f2b211.com/jsasg/orico-official-website into dev 2025-07-14 17:18:35 +08:00
14f0cc0607 1 2025-07-14 17:06:45 +08:00
ae52ae7de5 去掉新品的标题和更多 2025-07-14 17:05:44 +08:00
510f89b84c sceneitem1 2025-07-14 16:41:58 +08:00
0aa4e82095 1 2025-07-14 16:39:59 +08:00
14e611d02e 1 2025-07-14 16:34:11 +08:00
8c1ff8da6e 1 2025-07-14 16:26:35 +08:00
bb37146be8 1 2025-07-14 16:25:49 +08:00
5fbdbda62d 1 2025-07-14 16:24:22 +08:00
3688c0efd4 1 2025-07-14 16:23:25 +08:00
1de9769edb 1 2025-07-14 16:09:53 +08:00
e0dd787bf3 1 2025-07-14 16:09:02 +08:00
a9681677a9 1 2025-07-14 16:08:13 +08:00
761a033b46 1 2025-07-14 16:07:06 +08:00
554a87d0cf Merge branch 'master' of https://gitea.f2b211.com/jsasg/orico-official-website 2025-07-14 16:02:37 +08:00
26c60ae751 样式修改6 2025-07-14 16:02:35 +08:00
902f40e28c fix: 底部备案信息 2025-07-14 15:52:13 +08:00
d8744d2070 fix: 底部备案信息 2025-07-14 15:51:22 +08:00
f23ab69761 fix: 底部备案信息 2025-07-14 15:50:13 +08:00
470a3e1687 pref: 数据同步 2025-07-14 15:50:13 +08:00
932f2b8705 fix: 底部备案信息 2025-07-14 15:49:50 +08:00
b14a75c3a2 1 2025-07-14 15:46:47 +08:00
f0b02ba83b 样式修改4 2025-07-14 15:46:18 +08:00
a36633a559 样式修改2 2025-07-14 15:35:57 +08:00
7daaf12908 Merge branch 'master' of https://gitea.f2b211.com/jsasg/orico-official-website 2025-07-14 15:13:12 +08:00
4111e05957 样式修改 2025-07-14 15:13:09 +08:00
ce665b9ea4 pref: 数据同步 2025-07-14 14:30:59 +08:00
082ed00d74 Merge branch 'dev' 2025-07-14 14:06:16 +08:00
6c3f6247f8 fix: 顶部搜索产品图片显示缩略图 2025-07-14 14:06:04 +08:00
881ce98a72 Merge branch 'dev' 2025-07-14 13:44:06 +08:00
51ceeff0d7 fix: 视频描述字段长度校验 2025-07-14 13:43:52 +08:00
c0bd15cbd9 perf: 数据同步 2025-07-14 13:42:50 +08:00
e26b0094ee Merge branch 'dev' 2025-07-14 11:47:51 +08:00
afc70e1b68 fix: 产品详情购买链接排序 2025-07-14 11:47:41 +08:00
a96e3780fb fix: pc 顶部“店铺”新标签打开 2025-07-14 11:27:59 +08:00
7c781f4eaa Merge branch 'master' of https://gitea.f2b211.com/jsasg/orico-official-website 2025-07-14 11:27:38 +08:00
c938438838 style 2025-07-14 11:27:34 +08:00
10024e40c2 fix: pc 顶部“店铺”新标签打开 2025-07-14 11:25:02 +08:00
612fb44215 fix: pc 底部导航新标签页打开无效 2025-07-14 11:04:34 +08:00
b9ed1a7328 perf: 数据同步 2025-07-14 11:04:34 +08:00
9c71a45f8b fix: pc 底部导航新标签页打开无效 2025-07-14 11:01:14 +08:00
a751f3aa97 perf: 数据同步 2025-07-14 11:00:43 +08:00
jsasg
bb8f42774f Merge branch 'dev' 2025-07-11 22:39:16 +08:00
jsasg
d902abe57d fix: 图片上传 2025-07-11 22:34:32 +08:00
873d873b4e fix: 底部 2025-07-11 20:15:38 +08:00
3dd4aa231e fix: 文章验证 2025-07-11 20:15:20 +08:00
87d943fc63 Merge branch 'dev' 2025-07-11 18:07:42 +08:00
d6f5c19616 fix: 底部 2025-07-11 18:07:25 +08:00
2fc9e7650a fix: 文章验证 2025-07-11 18:07:25 +08:00
0cc4ea2936 style:样式修改3 2025-07-11 17:15:44 +08:00
1ce367999e style:样式调整 2025-07-11 16:52:09 +08:00
f15f27e17a style:样式修改 2025-07-11 16:32:58 +08:00
31d4e641f8 fix:如果底部没有内容就不要显示li这个标签 2025-07-11 16:22:34 +08:00
9b211f804f style:样式修改 2025-07-11 16:13:49 +08:00
c3e1f08908 ljm master分支 2025-07-11 15:57:27 +08:00
76bd01e458 Merge branch 'dev' of https://gitea.f2b211.com/jsasg/orico-official-website into dev 2025-07-11 15:44:59 +08:00
7dbe56da33 fix:pc导航修改 2025-07-11 15:44:56 +08:00
f5bc3980dd fix: mobile下没有jquery 2025-07-11 15:22:01 +08:00
b37d795818 fix: 上传 2025-07-11 11:47:05 +08:00
4b64eb35aa fix: 导航未过滤已禁用 2025-07-11 10:32:05 +08:00
ee161ee7f6 add:本地添加jQuery和swiper文件,防止cdn失效 2025-07-10 17:38:17 +08:00
b0d241c22e perf: mysql递归查询兼容处理 2025-07-10 17:30:01 +08:00
9ac90d3fef perf: 修改analytics 2025-07-09 17:30:02 +08:00
17ce193e43 pref: think文件 2025-07-09 16:34:27 +08:00
8c64c35afd perf: redis env配置 2025-07-09 16:15:58 +08:00
8d4163ed88 perf: env 2025-07-09 13:58:59 +08:00
91a38dee28 fix: 同步产品目录产品分类及产品 2025-07-09 11:32:59 +08:00
ca6296a276 · 2025-07-09 10:25:02 +08:00
b1fd726226 样式修改 2025-07-09 10:21:48 +08:00
d924716d6a Merge branch 'dev' of https://gitea.f2b211.com/jsasg/orico-official-website into dev 2025-07-08 10:54:46 +08:00
a383d56291 style:样式修改 2025-07-08 10:54:43 +08:00
c1a443efba fix: 后台图片上传路径bug 2025-07-07 18:01:12 +08:00
e77b72381b fix: 后台图片上传路径bug 2025-07-07 17:50:52 +08:00
91883e132f pref: 图片大小调整 2025-07-07 16:39:02 +08:00
91b2474981 pref: 图片大小调整 2025-07-07 16:22:51 +08:00
a19e8f6e34 1 2025-07-07 15:27:22 +08:00
895f2040aa 1 2025-07-07 15:23:30 +08:00
b6174e1055 style:单词换行 2025-07-07 15:21:44 +08:00
040237447a Merge branch 'dev' of https://gitea.f2b211.com/jsasg/orico-official-website into dev 2025-07-07 15:15:32 +08:00
7df2727fed style:品类换行 2025-07-07 15:15:30 +08:00
0fb0c35d1d feat: migration/seed 2025-07-05 18:01:22 +08:00
db05632769 Merge branch 'dev' of https://gitea.f2b211.com/jsasg/orico-official-website into dev 2025-07-05 17:35:30 +08:00
f1af59b09a style:样式调整 2025-07-05 17:35:27 +08:00
861ecabcac feat: 后台 图片上传新增webp格式转换处理 2025-07-05 15:19:46 +08:00
3117a5b047 fix: openapi 文章详情取消author,source字段输出 2025-07-05 14:41:32 +08:00
d90acae078 fix: openapi 文章分类取消short_name, desc字段输出 2025-07-05 14:02:17 +08:00
26b1f21e86 fix: openapi 取消产品分类icon,desc字段输出 2025-07-05 14:01:51 +08:00
555996d72e fix: openapi取消产品详情sku->sort字段输出 2025-07-05 13:47:57 +08:00
9f9941f45d fix: openapi 产品接口取消desc输出 2025-07-05 11:49:55 +08:00
fd1db5134a 返回顶部 只要页面过长就显示 2025-07-05 11:12:52 +08:00
ff83880144 id修改为类,间距调整 2025-07-05 10:20:59 +08:00
21c295b26a Merge branch 'cssupdate' into dev 2025-07-05 09:53:30 +08:00
673f208792 产品详情切换问题修改 2025-07-05 09:51:50 +08:00
7a82081af2 doc: 注释 2025-07-05 09:18:24 +08:00
68e56eead0 fix: openapi 产品详情不输出links->platform问题 2025-07-04 17:42:29 +08:00
d8ac9530d8 Merge branch 'dev' of https://gitea.f2b211.com/jsasg/orico-official-website into dev 2025-07-04 17:17:41 +08:00
63c3d47f3d style:样式修改 2025-07-04 17:17:38 +08:00
8116315a6d fix: pc nas专题页 导航选中状态 2025-07-04 16:40:03 +08:00
b892a1346d fix: openapi 产品列表 2025-07-04 10:34:23 +08:00
4942af1fae fix: mobile 产品详情页图册中视频放第一个sku下最后一个 2025-07-03 14:01:34 +08:00
b0935db1b8 fix: pc 产品详情页图册中视频放第一个sku下最后一个 2025-07-03 13:56:57 +08:00
3d83c95a72 fix: mobile nas专题顶部导航 2025-07-02 15:30:25 +08:00
96bd1fc4c2 fix: pc 文章提交提示语言未区分语言 2025-07-02 15:06:28 +08:00
45218f85af pref: pc 产品详情表单提交 2025-07-02 14:44:35 +08:00
27f23cd321 fix: pc 产品搜索结果分布 2025-07-02 14:19:53 +08:00
aba102d63c perf: 关键词高亮 2025-07-02 10:59:01 +08:00
326ea8ae7e Merge branch 'dev' of https://gitea.f2b211.com/jsasg/orico-official-website into dev 2025-07-02 10:57:38 +08:00
bc87c88b25 swiper uc兼容 2025-07-02 10:57:35 +08:00
c08900c694 feat: 从产品目录同步产品相关数据 2025-07-02 10:44:55 +08:00
401658981c fix: pc nas专题页 联系我们第一项无js效果 2025-07-02 10:44:55 +08:00
b6115b7a16 style:样式问题修改8 2025-07-02 10:44:29 +08:00
e9d40dcd82 style:样式问题修改7 2025-07-02 10:44:29 +08:00
945fd88df4 feat: 同步数据接收 2025-07-01 17:15:40 +08:00
db3040c0b0 fix: 产品搜索关键词高亮 2025-07-01 17:14:04 +08:00
e36660c93e style:样式问题修改8 2025-07-01 17:03:46 +08:00
4a84558d2e Merge branch 'dev' of https://gitea.f2b211.com/jsasg/orico-official-website into dev 2025-07-01 16:43:00 +08:00
08862ff98e style:样式问题修改7 2025-07-01 16:42:57 +08:00
439d001ff0 fix: mobile nas专题header头 2025-07-01 16:04:35 +08:00
63357a0c0c fix: nas专题 head_languages变量报错 2025-07-01 16:04:35 +08:00
65e99ed675 style:样式问题修改6 2025-07-01 15:48:15 +08:00
291343aa56 Merge branch 'dev' of https://gitea.f2b211.com/jsasg/orico-official-website into dev 2025-07-01 15:42:07 +08:00
14f53e3709 style:样式问题修改6 2025-07-01 15:42:04 +08:00
7b893cf242 fix: nas专题 移动端去掉顶部搜索与语言切换 2025-07-01 15:26:53 +08:00
a0147dde8e Merge branch 'dev' of https://gitea.f2b211.com/jsasg/orico-official-website into dev 2025-07-01 15:24:21 +08:00
77ec576f8f style:样式问题修改5 2025-07-01 15:24:18 +08:00
e25add0ad9 fix: nas专题 移动端去掉顶部搜索与语言切换 2025-07-01 15:20:44 +08:00
e04fc650a4 style:样式问题修改4 2025-07-01 15:18:24 +08:00
cc5873294e 1 2025-07-01 15:14:53 +08:00
b60a3f4161 Merge branch 'dev' of https://gitea.f2b211.com/jsasg/orico-official-website into dev 2025-07-01 15:09:10 +08:00
1459a303d6 1 2025-07-01 15:09:07 +08:00
968a537576 fix: 后台banner分类接口 2025-07-01 15:08:22 +08:00
cd9c01ca41 Merge branch 'dev' of https://gitea.f2b211.com/jsasg/orico-official-website into dev 2025-07-01 15:03:28 +08:00
5bccb8e2c8 style:样式问题修改3 2025-07-01 15:03:25 +08:00
b31ce311b5 fix: mobile 产品详情页相关产品 2025-07-01 14:08:21 +08:00
4e99154ba4 fix: pc/mobile 联系我们页面文字颜色 2025-07-01 13:53:42 +08:00
75defa79ca style:样式问题修改2 2025-07-01 11:41:54 +08:00
8509607565 Merge branch 'dev' of https://gitea.f2b211.com/jsasg/orico-official-website into dev 2025-07-01 11:28:00 +08:00
123dc9c871 style:样式问题修改 2025-07-01 11:27:56 +08:00
8b65c6f9d4 feat: analytics代码添加 2025-07-01 09:47:21 +08:00
5f3cf4b58f fix: pc 视频搜索 2025-06-30 16:48:35 +08:00
b237ddb9a1 refactor: 修改各表user_agent字段长度 2025-06-30 15:18:54 +08:00
51450677e5 fix: pc/mobile banner的extra_image取值 2025-06-30 10:57:06 +08:00
6cd1b1ad76 refactor: 后台横幅添加extra_image字段 2025-06-30 09:24:44 +08:00
642b813a18 Merge branch 'dev' of https://gitea.f2b211.com/jsasg/orico-official-website into dev 2025-06-27 18:04:03 +08:00
487442a25e 样式修改 2025-06-27 18:04:00 +08:00
61bf02b031 fix: 产品分类颜色 2025-06-27 17:30:01 +08:00
7b069971a4 fix: pc 文章分类搜索 2025-06-27 17:17:26 +08:00
b16e6cf8ea fix: ipd访问时lang错误 2025-06-27 17:11:03 +08:00
59c1d46666 Merge branch 'dev' of https://gitea.f2b211.com/jsasg/orico-official-website into dev 2025-06-27 17:03:21 +08:00
ddbabe3985 判读uc浏览器swiper的问题 2025-06-27 17:03:18 +08:00
f03a2fef50 fix: 产品底盘提示语 2025-06-27 15:20:25 +08:00
697ae24a97 Merge branch 'dev' of https://gitea.f2b211.com/jsasg/orico-official-website into dev 2025-06-27 14:54:30 +08:00
173aed5442 富文本图片排版 2025-06-27 14:54:27 +08:00
d3b712fb88 fix: pc/mobile 产品详情页属性 2025-06-27 14:49:24 +08:00
ff0dbbcd55 样式优化 2025-06-27 11:42:01 +08:00
1e535b4b53 .hd .clearfix 2025-06-27 10:59:15 +08:00
d31e3dbc1d 还原 2025-06-27 10:58:14 +08:00
648d9fdad6 样式 2025-06-27 10:57:26 +08:00
8f0cd0f6dd 1 2025-06-27 10:44:55 +08:00
33ecd52e8d 1 2025-06-27 10:44:17 +08:00
88c8657014 1 2025-06-27 10:43:05 +08:00
1d92f276d6 1 2025-06-27 10:41:56 +08:00
65e6699dac 还原 2025-06-27 10:39:48 +08:00
e01e6f802c 样式优化 2025-06-27 10:29:25 +08:00
ae5009544f Merge branch 'dev' of https://gitea.f2b211.com/jsasg/orico-official-website into dev 2025-06-27 10:20:20 +08:00
49a2c4e669 style:样式优化,手机详情页测试 2025-06-27 10:20:17 +08:00
0c89324f2d fix: 后台附件上传修改webp格式 2025-06-27 09:55:20 +08:00
7916fff229 refactor: 后台图片上传添加允许webp格式 2025-06-27 09:54:30 +08:00
84ecfce5f6 fix: pc 去除多条console.log 2025-06-27 09:38:53 +08:00
58046f9be3 fix: mobile 产品搜索 2025-06-27 09:37:50 +08:00
fdc5e95f64 fix: mobile 底部导航 2025-06-27 09:37:32 +08:00
fbeab9b7a0 refactor: ipd平台访问重定向为mobile view改为可配置 2025-06-27 09:18:09 +08:00
c2b93bc290 Merge branch 'dev' of https://gitea.f2b211.com/jsasg/orico-official-website into dev 2025-06-26 16:31:59 +08:00
6721f9d1f3 视频被遮盖样式调整 2025-06-26 16:31:56 +08:00
9f78f9ecb5 fix: 跳转mtpl时会去掉正常参数导致无数据问题 2025-06-26 16:04:56 +08:00
78cf21b478 fix: mobile nas专题 下载页样式问题 2025-06-26 15:50:01 +08:00
439605c757 样式补充3 2025-06-26 15:40:56 +08:00
11098de5be 样式修改2补充 2025-06-26 15:38:13 +08:00
1f70f5fac2 样式修改2 2025-06-26 15:34:33 +08:00
18f2c18b4d 样式修改 2025-06-26 15:29:42 +08:00
fef235a8c4 Merge branch 'dev' of https://gitea.f2b211.com/jsasg/orico-official-website into dev 2025-06-26 15:22:31 +08:00
dd06b2f01a bug修改 2025-06-26 15:22:28 +08:00
d026ca2223 fix: mobile nas专题 下载页中英文样式区别 2025-06-26 15:07:51 +08:00
8f6d2beade style:样式修改 2025-06-26 15:02:10 +08:00
69b7c6cfb1 Merge branch 'dev' of https://gitea.f2b211.com/jsasg/orico-official-website into dev 2025-06-26 13:44:43 +08:00
094ebe0aae 还原 2025-06-26 13:44:40 +08:00
c2ba5ad88a fix: pc/mobile 产品详情“发送查询”按钮问题 2025-06-26 11:42:52 +08:00
37bb4aaf15 style: 代码格式 2025-06-26 11:40:05 +08:00
16b73d5bbf Merge branch 'dev' of https://gitea.f2b211.com/jsasg/orico-official-website into dev 2025-06-26 11:37:10 +08:00
6b1314d834 前端测试pad和pc 2025-06-26 11:36:30 +08:00
c59a81f316 style: openapi模块代码对齐 2025-06-26 10:52:55 +08:00
dd3e7fae96 fix: ipd中区分mobile与pc问题bug 2025-06-26 10:14:32 +08:00
1f5e0f7989 fix: mobile 非nas专题页顶部logo无法点击问题 2025-06-25 16:55:54 +08:00
76bca942aa fix: mobile 产品详情去除空字符串属性 2025-06-25 16:52:49 +08:00
3590a89a07 fix: mobile nas 专题相关页面Logo点击区分中英文 2025-06-25 16:46:10 +08:00
dd144e6925 fix: mobile nas专题 帮助中心去除logo点击链接 2025-06-25 13:37:48 +08:00
10792e10d9 fix: mobile 产品详情相关产品输出 2025-06-25 09:52:06 +08:00
6c5d19fbd3 fix: mobile 产品详情页属性选项 2025-06-25 09:44:47 +08:00
f320b3efbc fix: mobile 文章详情页评论记录 2025-06-25 09:27:12 +08:00
dd5d3498f2 fix: mobile 成功经销商校验bug 2025-06-24 18:02:56 +08:00
bdccb5b535 fix: mobile 批量购买提交bug 2025-06-24 18:00:43 +08:00
7b59120b5d fix: mobile 联系我们留言 2025-06-24 17:55:05 +08:00
a4175b450e Merge branch 'dev' of https://gitea.f2b211.com/jsasg/orico-official-website into dev 2025-06-24 17:52:08 +08:00
1f3f934ef0 fix: mobile 文章详情英文发布时间 2025-06-24 17:51:34 +08:00
011f6ced94 Merge branch 'dev' of https://gitea.f2b211.com/jsasg/orico-official-website into dev 2025-06-24 17:51:31 +08:00
c4bcf7d8a1 feat:样式bug移动端修改 2025-06-24 17:51:29 +08:00
5db73f2422 fix: mobile 产品搜索无数据情况 2025-06-24 17:50:07 +08:00
e72eb956b9 fix: mobile nas专题帮助中心 2025-06-24 17:29:03 +08:00
6012af9e75 fix: pc顶部导航 2025-06-24 14:22:38 +08:00
06b5d445f7 fix: 文章详情推荐文章 2025-06-24 14:13:55 +08:00
9a988de538 fix: 获取系统页面url 2025-06-24 13:52:41 +08:00
迷和油
0947daac64 Merge branch 'dev' of https://gitea.f2b211.com/jsasg/orico-official-website into dev 2025-06-21 15:21:59 +08:00
迷和油
7574322f95 style:样式修改 2025-06-21 15:21:56 +08:00
d98c26e562 fix: pc/mobile 批量够买问题 2025-06-21 14:12:04 +08:00
64d9b2129d fix: pc/mobile 成功经销商留言问题 2025-06-21 14:05:57 +08:00
1873e6ac3a fix: mobile 文章列表发布时间问题 2025-06-21 10:21:32 +08:00
72565683c8 fix: mobile 产品搜索页无法点击进入详情问题 2025-06-21 10:15:17 +08:00
7bbcc12003 fix: mobile搜索历史问题 2025-06-20 14:21:34 +08:00
迷和油
7928e5f1ac Merge branch 'dev' of https://gitea.f2b211.com/jsasg/orico-official-website into dev 2025-06-20 14:10:46 +08:00
迷和油
7380fb16d7 style:顶部宽度修改 2025-06-20 13:56:59 +08:00
8050a7857c refactor: cookir开启httponly 2025-06-20 13:43:20 +08:00
bc4f7422bc fix: 文章详情页推荐未区分中英文问题 2025-06-20 13:42:55 +08:00
ed02804587 fix: 屏幕宽度确定pc/mobile模板问题 2025-06-20 11:29:41 +08:00
1fec0dcc42 fix: pc nas专题帮助中心文件分类选中问题 2025-06-19 16:51:58 +08:00
446ec81410 fix: 文章列表及详情发布时间中英显示区分 2025-06-19 16:26:17 +08:00
迷和油
9e73e1341b reset:还原 2025-06-19 11:50:22 +08:00
迷和油
1c301cd3db test:环境测试2 2025-06-19 11:34:53 +08:00
迷和油
6f15b2e34c test:环境测试 2025-06-19 11:24:57 +08:00
迷和油
d9ae8e0dc1 test:测试环境 2025-06-19 11:07:24 +08:00
迷和油
59b6a6d797 测试环境 2025-06-19 11:06:31 +08:00
2446331890 fix: migrations seed命名错误 2025-06-19 11:02:33 +08:00
2615978b30 fix: 无法判断出是ipad的情况 2025-06-19 10:08:40 +08:00
ccd2a67932 docs: 修改migrations文件中的表注释 2025-06-16 15:04:26 +08:00
5e35359aa0 fix: “代理商企业规模类型表”migrations文件表命名错误 2025-06-13 14:44:54 +08:00
567b6e3c01 fix: 返回顶部按钮只在中文下显示 2025-06-13 14:22:55 +08:00
迷和油
2298d7aac7 add:新增一个中文官网返回顶部的功能 2025-06-13 11:44:10 +08:00
57c90c222a refactor: 上传 2025-06-12 17:56:20 +08:00
02aab16b4f refactor: 配置seeder 2025-06-12 17:51:52 +08:00
309e54ac4e fix: pc产品详情 2025-06-12 17:46:45 +08:00
7eac43e146 refactor: 处理优化migration文件与model文件字段不一致 2025-06-12 17:41:14 +08:00
736bf19cd6 feat: 系统用户seeder 2025-06-12 16:26:25 +08:00
3bae584f74 feat: 系统菜单seeder 2025-06-12 16:21:59 +08:00
cba2ca24a7 feat: 系统语言seeder 2025-06-12 16:04:35 +08:00
4be072c63b feat: 国家seeder 2025-06-12 16:00:08 +08:00
c45880d5a6 feat: 代理商企业规模类型seeder 2025-06-12 15:54:54 +08:00
56bc911062 feat: 代理商业务类型seeder 2025-06-12 15:50:21 +08:00
04f7600a79 feat: 产品属性特性seeder 2025-06-12 15:41:51 +08:00
eda9a7d925 feat: 产品购买平台seeder 2025-06-12 15:31:36 +08:00
b19dca206f feat: 配置项类型seeder 2025-06-12 15:20:27 +08:00
a71cd23bfb feat: 配置组/配置数据seeder 2025-06-12 15:09:59 +08:00
7526611f9c refactor: 上传相关优化 2025-06-12 14:50:20 +08:00
bc3fbdd492 fix: pc nas专题帮且中心 2025-06-11 18:14:00 +08:00
e85dc5886c fix: pc文章详情发布时间中英文区分 2025-06-11 18:09:08 +08:00
71f445395c fix: pc nas专题logo不需要点击 2025-06-11 18:02:12 +08:00
c311c6f270 fix: pc产品详情 2025-06-11 17:40:43 +08:00
314f39471c fix: pc产品详情 2025-06-11 17:32:57 +08:00
迷和油
e5da8e06c4 Merge branch 'dev' of https://gitea.f2b211.com/jsasg/orico-official-website into dev 2025-06-11 17:24:11 +08:00
迷和油
13bcfe2a67 style:搜索更改,样式更改 bug提交 2025-06-11 17:23:30 +08:00
0e9d1e39ac fix: 上传图片水印 2025-06-11 17:09:41 +08:00
5f6b8a20c9 fix: 上传图片水印 2025-06-11 16:59:02 +08:00
31a0dc25b3 fix: 上传图片水印处理 2025-06-11 16:51:13 +08:00
2ba2b5f1a7 fix: 上传 2025-06-11 15:40:37 +08:00
e47ee2e981 fix: 水印处理 2025-06-11 15:36:44 +08:00
c9aae780d5 fix: pc成功经销商 2025-06-11 15:17:14 +08:00
b0eea38244 refactor: 附件上传允许上传ttf字体 2025-06-11 14:47:21 +08:00
6b0bd13fb7 feat: 图片上传水印处理 2025-06-11 14:46:40 +08:00
613727fe44 fix: nas帮助中心搜索 2025-06-11 11:38:25 +08:00
4023d1f6d7 fix: 后台产品分类系统urls 2025-06-11 11:03:00 +08:00
c4a87bf22b fix: pc附件搜索placeholder 2025-06-11 10:55:55 +08:00
24212386bc refactor: 系统其他urls回显 2025-06-10 15:00:50 +08:00
1f81d2c8e4 refactor: 后台视频列表/回收站输出缩略图 2025-06-10 14:33:37 +08:00
793c670033 refactor: 添加其他内页系统urls 2025-06-10 14:31:06 +08:00
1ffb0f73c0 fix: 顶部“店铺”按钮不能显示在中文 2025-06-10 10:08:08 +08:00
d6d2e048bf fix: 首页热点产品无点击链接 2025-06-10 10:01:50 +08:00
272c0f7e99 fix: nas主题相关页排序bug 2025-06-10 09:58:22 +08:00
迷和油
1b5a02a5f4 Merge branch 'dev' of https://gitea.f2b211.com/jsasg/orico-official-website into dev 2025-06-09 16:42:40 +08:00
迷和油
8b306dae3c style:样式bug修改 2025-06-09 16:42:34 +08:00
ca5e69892d refactor: 修改样式文件命名 2025-06-09 14:58:39 +08:00
54cc9e692a style: mobile 语言文件 2025-06-09 14:50:59 +08:00
0a38b4246a feat: mobile nas主题客户合作页 2025-06-09 14:47:28 +08:00
e38ca41d11 feat: mobile nas主题下载页 2025-06-09 13:49:58 +08:00
3e821aba64 feat: mobile nas主题产品体验页 2025-06-09 10:56:54 +08:00
迷和油
6224e2b271 Merge branch 'dev' of https://gitea.f2b211.com/jsasg/orico-official-website into dev 2025-06-09 10:55:08 +08:00
迷和油
25f1a1e505 6.9 2025-06-09 10:55:02 +08:00
822ca9ec23 refactor: mobile nas主题帮助中心页 2025-06-09 10:37:20 +08:00
e62eb8e7ae feat: mobile nas主题帮助中心详情页 2025-06-09 10:29:50 +08:00
bf55bca148 fix: 横幅查询未过滤禁用的数据 2025-06-07 16:56:43 +08:00
f3545626c2 fix: 修复后台横幅关联产品分类提交 2025-06-07 16:48:01 +08:00
95403ad42e fix: nas 产品体验页焦点图bug 2025-06-07 16:41:51 +08:00
e59170969b feat: mobile nas主题帮助中心页 2025-06-07 16:36:44 +08:00
迷和油
01615c2f48 Merge branch 'dev' of https://gitea.f2b211.com/jsasg/orico-official-website into dev 2025-06-07 16:04:29 +08:00
迷和油
baa03203b8 优化 2025-06-07 16:04:25 +08:00
ffcf7f190c fix: mobile 修复获取产品分类焦点图未区分pc与mobile数据 2025-06-07 16:04:20 +08:00
迷和油
4165107a30 Merge branch 'dev' of https://gitea.f2b211.com/jsasg/orico-official-website into dev 2025-06-07 15:50:27 +08:00
迷和油
8347fbf6f6 评论样式修复 2025-06-07 15:50:22 +08:00
3bf6d43c97 fix: pc nas帮助页 2025-06-07 15:44:43 +08:00
迷和油
805fb07bdf Merge branch 'dev' of https://gitea.f2b211.com/jsasg/orico-official-website into dev 2025-06-07 15:15:20 +08:00
迷和油
f6acffbf84 优化 2025-06-07 15:14:44 +08:00
42ee0305f5 fix: 修复文章详情没有评论数据显示问题 2025-06-07 15:00:46 +08:00
3a29ed37e1 fix: 批量购买bug修复 2025-06-07 14:45:15 +08:00
迷和油
3a8df97d6c Merge branch 'dev' of https://gitea.f2b211.com/jsasg/orico-official-website into dev 2025-06-07 14:34:11 +08:00
迷和油
07606e63b7 style:bug样式修改 2025-06-07 14:32:56 +08:00
d35323dc98 fix: 产品分类bug修复 2025-06-07 14:27:32 +08:00
171510bee1 fix: 文章模块bug修复 2025-06-07 14:24:10 +08:00
09943775fd refactor: 修改array_flatten函数相关 2025-06-07 14:03:47 +08:00
6c5f66ef54 feat: mobile nas主题首页 2025-06-07 13:54:34 +08:00
c4e25484bf feat: mobile问答中心页 2025-06-06 16:28:01 +08:00
5277af0f53 feat: mobile文章详情页 2025-06-06 16:10:51 +08:00
e844cc3166 refactor: 修改接口记录表迁移文件及更新其数据 2025-06-06 15:10:27 +08:00
a821156077 refactor: 修改几在模块支持多分类筛选 2025-06-06 11:55:33 +08:00
732132f287 refactor: 优化横幅分页列表查询 2025-06-06 11:05:55 +08:00
d1711389dc refactor: 优化日志分页查询性能 2025-06-06 10:29:53 +08:00
5a4897ebb2 refactor: 后台问答分页图片改缩略图输出 2025-06-05 17:01:48 +08:00
f8d884b408 refactor: 后台产品分页图片改缩略图输出 2025-06-05 16:59:47 +08:00
f51f39c893 refactor: 后台文章回收站分页图片改为缩略图输出 2025-06-05 16:57:50 +08:00
6b4049ca62 refactor: 后台附件分页列表图片改缩略图输出 2025-06-05 16:53:49 +08:00
d7d8a9cfbf refactor: 后台文章列表图片改为缩略图输出 2025-06-05 16:50:19 +08:00
cd549aa32b feat: mobile文章首页 2025-06-05 16:34:23 +08:00
2ce5ef5169 feat: mobile联系我们 - 售后政策页 2025-06-05 15:54:09 +08:00
60af12a1a0 fix: pc产品详情页面“首页”文本多语言处理 2025-06-05 15:34:51 +08:00
11a1450ad5 feat: mobile联系我们 - 品牌故事页 2025-06-05 15:28:32 +08:00
20d2b34601 feat: mobile联系我们 - 品牌里程页 2025-06-05 15:01:24 +08:00
8c998eaef1 feat: mobile联系我们 - 文化介绍页 2025-06-05 12:01:15 +08:00
6d16d18ba7 refactor: pc联系我们 - 文化介绍页修改 2025-06-05 12:01:06 +08:00
4ed3aface4 feat: mobile联系我们 - 品牌介绍 2025-06-05 10:35:21 +08:00
eb8f115190 chore: 配置配置环境变量文件 2025-06-05 10:34:48 +08:00
d021962d0a refactor: 后面横幅分页接口图片输出修改为缩略图 2025-06-05 09:51:23 +08:00
迷和油
d146603812 style:样式修改 2025-06-04 18:01:01 +08:00
迷和油
a8fa9393a6 style:样式修改 2025-06-04 14:46:44 +08:00
迷和油
4e2d65a1e0 测试 2025-06-04 14:36:29 +08:00
杨丹华
a47a7ef095 Merge branch 'dev' of https://gitea.f2b211.com/jsasg/orico-official-website into dev 2025-06-04 14:25:32 +08:00
杨丹华
3923fbc4e6 撤销提交 2025-06-04 14:25:24 +08:00
杨丹华
232da86477 Merge branch 'dev' of https://gitea.f2b211.com/jsasg/orico-official-website into dev 2025-06-04 14:12:58 +08:00
杨丹华
6effd64f18 style:样式修改 2025-06-04 14:12:55 +08:00
181c4aab45 refactor: pc多语言 - 语言包调整 2025-06-03 11:43:19 +08:00
7a9230a049 fix: Nas专题 - 帮助中心详情bug 2025-06-03 11:43:19 +08:00
杨丹华
2ca2fa788a 补充 2025-05-30 16:05:26 +08:00
杨丹华
797a24fa5d Merge branch 'dev' of https://gitea.f2b211.com/jsasg/orico-official-website into dev 2025-05-30 15:28:42 +08:00
杨丹华
af0be49166 style:样式修改 2025-05-30 15:28:01 +08:00
f83eddf41a refactor: think-orm回退版本 2025-05-30 13:49:54 +08:00
216fa8d8e0 refactor: 修改验证多语言提示 2025-05-30 13:36:57 +08:00
0b20506cb8 refactor: 修改多语言相关 2025-05-30 10:30:34 +08:00
2416a5c8da feat: mobile视频页 2025-05-30 09:57:11 +08:00
2384529e35 refactor: 修改样式文件命名 2025-05-30 09:56:48 +08:00
2d9daffb0d refactor: 去除多余文件 2025-05-30 09:16:14 +08:00
407352adee feat: mobile 联系我们留言页 2025-05-30 09:12:48 +08:00
杨丹华
38df9799b7 style:去掉多余的样式 2025-05-28 11:47:44 +08:00
杨丹华
e94f59004b style:关联产品样式不从 2025-05-28 11:45:09 +08:00
e8905b3753 refactor: 修改验证器语言包提示 2025-05-28 10:47:01 +08:00
40852fcea4 feat: mobile批量购买留言页 2025-05-28 10:31:02 +08:00
fd28af12ed refactor: 修改横幅列表接口 2025-05-27 15:49:27 +08:00
7e22638c02 feat: mobile成功分销商页面 2025-05-27 15:37:51 +08:00
15743c6f53 refactor: 区分联系我们banner的pc与mobile数据 2025-05-27 14:13:06 +08:00
9fd3954b4f refactor: 进一步区分banner的pc与mobile 2025-05-27 14:02:14 +08:00
5b3a020b1a feat: mobile联系我们页 2025-05-27 11:13:03 +08:00
4228fec38b refactor: pc联系我们 2025-05-27 10:33:35 +08:00
125da615c7 refactor: mobile底部国家筛选 2025-05-26 17:54:23 +08:00
247085486e feat: mobile产品搜索页 2025-05-26 17:39:23 +08:00
8b0bca9e44 feat: mobile附件下载页 2025-05-26 17:13:51 +08:00
5b325656b2 feat: mobile新品上市页 2025-05-26 11:58:02 +08:00
4ad14d1847 feat: mobile产品详情 2025-05-26 11:40:02 +08:00
cdb27182d6 fix: pc产品详情 2025-05-26 11:40:02 +08:00
杨丹华
bf714afe7c stlye:首页样式底部调白 2025-05-26 11:00:14 +08:00
杨丹华
d2882291c1 Merge branch 'dev' of https://gitea.f2b211.com/jsasg/orico-official-website into dev 2025-05-24 18:08:03 +08:00
杨丹华
ce1d46aa2c stlye:产品指南样式调整 2025-05-24 18:06:43 +08:00
杨丹华
73e9e41fa9 stlye:样式修改 2025-05-24 18:05:42 +08:00
2c8cde6274 feat: mobile产品分类 2025-05-24 17:24:58 +08:00
3d3aab18a0 fix: 文章描述长度限制 2025-05-24 14:53:33 +08:00
17e85155aa fix: 文章标题长度限制 2025-05-24 14:53:33 +08:00
84ded1f544 feat: mobile首页 2025-05-24 14:53:33 +08:00
b48d6346c9 fix: pc首页推荐文章链接 2025-05-24 14:07:38 +08:00
f0a7b82179 fix: 获取系统url 2025-05-24 11:20:54 +08:00
e97b677d96 fix: pc index.html 2025-05-24 09:51:29 +08:00
650fcde169 refactor: hidden内容修改 2025-05-24 09:47:56 +08:00
7f4fccd209 refactor: 字段类型 2025-05-24 09:34:05 +08:00
f75f66f24d refactor: pc index.html 2025-05-23 14:46:05 +08:00
5893f6eeac refactor: 样式 2025-05-23 14:32:49 +08:00
ee20608dbe refactor: 去掉临时图片 2025-05-23 14:27:47 +08:00
2705bb9baa refactor: 调整图片目录 2025-05-23 14:25:33 +08:00
a8051c10de refactor: 调整图片目录 2025-05-23 14:12:46 +08:00
a5cf8018ad refactor: 调整图片目录 2025-05-23 14:11:22 +08:00
265c04c367 refactor: photo_album格式问题 2025-05-23 14:05:40 +08:00
693f0ecb4e refactor: 国家/语言图片调整目录 2025-05-23 11:22:35 +08:00
7390140671 refactor: 字体目录调整 2025-05-23 10:37:08 +08:00
00fee03979 feat: 模板区分pc与mobile 2025-05-23 10:37:08 +08:00
70e9c395b2 fix: 开放API鉴权 2025-05-23 10:37:08 +08:00
杨丹华
5d6a7c1324 style:zoom自适应 2025-05-23 10:13:50 +08:00
杨丹华
b9bc46d3d0 style:字体样式兼容修改 2025-05-22 17:33:10 +08:00
杨丹华
a302446964 . 2025-05-22 17:19:36 +08:00
杨丹华
c186cbceb4 stlye:首页 nas首页样式调整 2025-05-22 17:14:13 +08:00
475 changed files with 26050 additions and 3877 deletions

5
.env
View File

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

View File

@@ -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 # 附件上传最大限制

View File

@@ -1,26 +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
[JWT]
TTL=3600
REFRESH_TTL=20160
SECRET=b43e6276644ed60e65c50d1b324ba10b
# 后台不需要登录的接口
[ADMIN_AUTH]
WHITE_LIST[] = v1/user/login
WHITE_LIST[] = v1/user/captcha
# 不需记录日志的接口
[ADMIN_API]
IGNORE_LOGGING_LIST[] = v1/OperateLog/index

View File

@@ -1,11 +1,96 @@
APP_DEBUG = true
DB_TYPE = mysql
DB_HOST = 127.0.0.1
DB_NAME = test
DB_USER = username
DB_PASS = password
DB_HOST = localhost
DB_NAME = orico-official-website
DB_USER = orico-ow
DB_PASS = 14Xi17NIK8V2qAXE8oMataHEsaR8lE
DB_PORT = 3306
DB_CHARSET = utf8
DB_CHARSET = utf8mb4
DB_PREFIX = ow_
DB_VERSION = 8
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

4
.gitattributes vendored
View File

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

View File

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

13
.gitignore vendored
View File

@@ -3,9 +3,22 @@ composer.phar
composer.lock
.DS_Store
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
/.vscode
/.zed
/vendor
/.settings
/.buildpath

24
.zed/settings.json Normal file
View 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"
]
}
}
}
}

View 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('同步成功');
}
}

View File

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

View File

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

View File

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

View File

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

View File

@@ -20,7 +20,8 @@ class Banner
$banners = SysBannerModel::field([
'id',
'name'
'name',
'at_platform'
])
->withSearch(['name'], [
'name' => $param['name'] ?? null
@@ -30,7 +31,27 @@ class Banner
->order(['sort' => 'asc', 'id' => 'desc'])
->select();
return success('获取成功', $banners);
$datas = [];
if (!$banners->isEmpty()) {
$temp = [];
$map = ['pc' => ['id' => -1, 'name' => 'PC端'], 'mobile' => ['id' => -2, 'name' => '移动端']];
foreach ($banners as $banner) {
if (!isset($temp[$banner->at_platform])) {
$temp[$banner->at_platform] = [
'id' => $map[$banner->at_platform]['id'] ?? 0,
'name' => $map[$banner->at_platform]['name'] ?? '未知平台',
'children' => []
];
}
$temp[$banner->at_platform]['children'][] = [
'id' => $banner->id,
'name' => $banner->name
];
}
$datas = array_values($temp);
}
return success('获取成功', $datas);
}
// 分页

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -23,6 +23,18 @@ class ProductTcoCategoryModel extends ProductTcoCategoryBaseModel
$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)
{

View File

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

View File

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

View File

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

View File

@@ -64,7 +64,10 @@ class ArticleCategoryValidate extends Validate
if ($value == 0) {
return true;
}
$children = [];
$table_name = (new ArticleCategoryModel)->getTable();
if (env('DB_VERSION', '5') == '8') {
$children = Db::query(
preg_replace(
'/\s+/u',
@@ -77,6 +80,20 @@ class ArticleCategoryValidate extends Validate
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'))) {
return false;
}

View File

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

View File

@@ -49,7 +49,10 @@ class AttachmentCategoryValidate extends Validate
if ($value == 0) {
return true;
}
$children = [];
$table_name = (new AttachmentCategoryModel)->getTable();
if (env('DB_VERSION', '5') == '8') {
$children = Db::query(
preg_replace(
'/\s+/u',
@@ -62,6 +65,20 @@ class AttachmentCategoryValidate extends Validate
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'))) {
return false;
}

View File

@@ -21,7 +21,7 @@ class NavigationItemValidate extends Validate
'pid' => 'integer|different:id|checkPidNotBeChildren',
'name' => 'require|max:64',
'icon' => 'max:64',
'link_to' => 'require|max:64|in:article,article_category,product,product_category,custom',
'link_to' => 'require|max:64|in:article,article_category,product,product_category,system_page,custom',
'link' => 'max:255',
'sort' => 'integer',
'blank' => 'in:0,1',
@@ -47,7 +47,7 @@ class NavigationItemValidate extends Validate
'icon.max' => '图标最多不能超过64个字符',
'link_to.require' => '链接类型不能为空',
'link_to.max' => '链接类型最多不能超过64个字符',
'link_to.in' => '链接类型必须是article,goods_category,goods,custom中之一',
'link_to.in' => '链接类型必须是article,article_category,product_category,product,system_page,custom中之一',
'link.max' => '链接最多不能超过255个字符',
'sort.integer' => '排序必须为整数',
'blank.in' => '是否新窗口打开只能是0或1',
@@ -61,7 +61,10 @@ class NavigationItemValidate extends Validate
if ($value == 0) {
return true;
}
$children = [];
$table_name = (new SysNavigationItemModel)->getTable();
if (env('DB_VERSION', '5') == '8') {
$children = Db::query(
preg_replace(
'/\s+/u',
@@ -74,6 +77,20 @@ class NavigationItemValidate extends Validate
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'))) {
return false;
}

View File

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

View File

@@ -74,7 +74,10 @@ class SysMenuValidate extends Validate
if ($value == 0) {
return true;
}
$children = [];
$table_name = (new SysMenuModel)->getTable();
if (env('DB_VERSION', '5') == '8') {
$children = Db::query(
preg_replace(
'/\s+/u',
@@ -87,6 +90,20 @@ class SysMenuValidate extends Validate
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'))) {
return false;
}

View File

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

View File

@@ -61,6 +61,9 @@ class DataMigration extends Command
// 迁移文章
// $this->migrateArticle([
// 16 => 7,
// 31 => 9,
// 32 => 8,
// 68 => 10,
// 69 => 11,
// 70 => 12,
@@ -290,14 +293,15 @@ class DataMigration extends Command
$old_db = Db::connect('old');
$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) {
$success_map['p_' . $so['cod_product_id']] = $so;
}
$arr = include_once(runtime_path() . 'product_ids.php');
$products = $old_db->name('product')
->where('country_code', 'in', ['ZH', 'US'])
->where('id', '>', 15789)
->where('id', 'in', array_unique(array_column($arr, 'cod_product_id')))
->order(['id' => 'asc'])
->cursor();
@@ -374,7 +378,16 @@ class DataMigration extends Command
'deleted_at' => $v['stat'] == -1 ? date('Y-m-d H:i:s') : null,
];
// 保存产品数据
$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'])) {
@@ -387,7 +400,21 @@ class DataMigration extends Command
'value' => $p['desc_desc']
];
}
$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数据
@@ -444,7 +471,7 @@ class DataMigration extends Command
if ($k != 'sort') {
$attr_value = $at;
if (in_array($k, ['颜色', 'Color'])) {
if ($k == 'Color') $k = '颜色';
// if ($k == 'Color') $k = '颜色';
$attr_value = '/static/common/images/colors/' . $at . '.png';
}
$images[$pkey]['color'] = $at;
@@ -468,7 +495,7 @@ class DataMigration extends Command
}
}
$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,
];
if (
@@ -514,7 +541,7 @@ class DataMigration extends Command
$skus[] = [
'main_image' => $ti['image_url'],
'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'],
]],
'pkey' => $tpkey
@@ -575,6 +602,7 @@ class DataMigration extends Command
}
foreach ($skus as $sku) {
Db::name('product_sku')->where('product_id', '=', $sku['product_id'])->delete();
$sku_id = Db::name('product_sku')->insertGetId([
'product_id' => $sku['product_id'],
'sku' => $sku['sku']??'',
@@ -584,6 +612,7 @@ class DataMigration extends Command
if (!empty($sku['attrs'])) {
foreach ($sku['attrs'] as $attr) {
if (!empty($sku_id)) {
Db::name('product_sku_attr')->where('sku_id', '=', $sku_id)->delete();
Db::name('product_sku_attr')->insert([
'sku_id' => $sku_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']),
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) {
Db::rollback();
file_put_contents(
@@ -694,9 +723,12 @@ class DataMigration extends Command
throw new \Exception('请确认分类ID');
}
// 1634
$article = Db::connect('old')
->name('article')
->where('country_code', 'in', ['ZH', 'US'])
->where('cid', 'in', array_keys($category_map))
->where('id', '=', 351)
->order(['id' => 'asc'])
->cursor();
@@ -745,7 +777,16 @@ class DataMigration extends Command
'release_time' => date('Y-m-d H:i:s', $v['createtime']),
'deleted_at' => $v['stat'] == -1 ? date('Y-m-d H:i:s') : null
];
$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));
}
@@ -779,7 +820,15 @@ class DataMigration extends Command
'recommend' => $val['is_home'],
'sort' => $val['sort'] == 9999 ? 0 : $val['sort']
];
$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')
->name('video')
->where('id', '>', 844)
// ->where('id', '>', 844)
->where('cid', 'in', array_keys($category_map))
->where('country_code', 'in', ['ZH', 'US'])
->order(['id' => 'asc'])
->cursor();
@@ -921,7 +971,16 @@ class DataMigration extends Command
'seo_desc' => $val['seo_description'],
'deleted_at' => $val['stat'] == -1 ? date('Y-m-d H:i:s') : null
];
$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']);
}
}
@@ -929,7 +988,7 @@ class DataMigration extends Command
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_TEMP_PATH = '/var/www/html/orico-official-website/public/migrate_temp_images';
private $username = 'admin';
@@ -942,7 +1001,7 @@ class UploadMannager
{
// 登录获取token
$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);
}
file_put_contents(runtime_path() . 'upload.txt', $response . PHP_EOL, FILE_APPEND);
$ret = json_decode($response, true);
if (empty($ret)) {
throw new \Exception($response);

View 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");
}
}

View File

@@ -80,7 +80,7 @@ if (!function_exists('array_to_tree')) {
* @param bool $keep_pid 是否保留pid
* @return array
*/
function array_to_tree(array $data, int $pid, string $with = 'pid', int|bool $level = 1, bool $keep_pid = true)
function array_to_tree(array $data, int $pid, string $with = 'pid', int|bool $level = 1, bool $keep_pid = true, $with_ref = 'id')
{
$ret = [];
foreach ($data as $item) {
@@ -93,7 +93,7 @@ if (!function_exists('array_to_tree')) {
if ($keep_pid === false) {
unset($item[$with]);
}
$children = array_to_tree($data, $item['id'], $with, $lv, $keep_pid);
$children = array_to_tree($data, $item[$with_ref], $with, $lv, $keep_pid, $with_ref);
if ($children) {
$item['children'] = $children;
}
@@ -103,3 +103,132 @@ if (!function_exists('array_to_tree')) {
return $ret;
}
}
if (!function_exists('array_flatten')) {
/**
* 将多维数组转换为一维数组
* @param array $array
* @return array
*/
function array_flatten(array $array, int $depth = 1): array
{
return \think\helper\Arr::flatten($array, $depth);
}
}
if (!function_exists('thumb')) {
/**
* 获取缩略图
* @param string $url 图片地址
* @return string
*/
function thumb(?string $url): string
{
if (empty($url)) {
return '';
}
if (
str_contains($url, '_thumb') ||
\think\helper\Str::startsWith($url, ['http://', 'https://']) ||
!\think\helper\Str::endsWith($url, ['.png', '.jpg', '.jpeg', '.gif', '.tif', '.svg', '.webp', '.bmp'])
) {
return $url;
}
$idx = mb_strripos($url, '.', 0, 'utf-8');
if ($idx === false) {
return $url;
}
$len = mb_strlen($url, 'utf-8');
return mb_substr($url, 0, $idx, 'utf-8') . '_thumb' . mb_substr($url, $idx, $len - $idx, 'utf-8');
}
}
if (!function_exists('get_filesystem_url')) {
/**
* 获取文件系统的访问 URL
* @param string $url 文件地址
* @param string $disk 磁盘配置 key
* @return string
*/
function get_filesystem_url(string|null $url, string $disk): string
{
if (is_null($url)) {
return '';
}
if (\think\helper\Str::startsWith($url, ['http://', 'https://', '//'])) {
return $url;
}
if (empty($disk)) {
return '';
}
return \think\facade\Filesystem::disk($disk)->url($url);
}
}
if (!function_exists('url_filesystem_detect')) {
/**
* 检测文件地址并根据情况转换为文件系统地址
* @param string $url 文件地址
* @return string
*/
function url_filesystem_detect(string|null $url): string
{
if (is_null($url)) {
return '';
}
$idx = strrpos($url, '.');
if ($idx === false) {
return $url;
}
$disks = [
'public_qiniu' => '_' . base64_encode('public_qiniu'),
'video_qiniu' => '_' . base64_encode('video_qiniu')
];
foreach ($disks as $disk => $marker) {
if (str_ends_with(mb_substr($url, 0, $idx), $marker)) {
return get_filesystem_url($url, $disk);
}
}
return $url;
}
}
if (!function_exists('url_join')) {
/**
* 合并URL
* @param string $url 基础URL
* @param string $path 路径
* @param bool $remove_slash 是否移除首尾的斜杠
* @return string
*/
function url_join(string $url, string $path, bool $remove_slash = true): string
{
if (empty($url)) {
return $path;
}
if (empty($path)) {
return $url;
}
if (\think\helper\Str::startsWith($path, ['http://', 'https://', '//'])) {
return $path;
}
if ($remove_slash) {
if (str_ends_with($url, '/') && str_starts_with($path, '/')) {
return $url . substr($path, 1);
}
if (!str_ends_with($url, '/') && !str_starts_with($path, '/')) {
return $url . '/' . $path;
}
}
return $url . $path;
}
}

View File

@@ -21,7 +21,7 @@ class ProductSkuBaseModel extends BaseModel
'product_id' => 'int',
'sku' => 'string',
'main_image' => 'string',
'photo_album' => 'string',
'photo_album' => 'json',
'sort' => 'int',
'created_at' => 'datetime',
'updated_at' => 'datetime'

View File

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

View File

@@ -21,10 +21,13 @@ class SysBannerItemBaseModel extends BaseModel
'banner_id' => 'int',
'title' => 'string',
'title_txt_color' => 'string',
'short_title' => 'string',
'short_title_txt_color' => 'string',
'desc' => 'string',
'desc_txt_color' => 'string',
'type' => 'int',
'type' => 'string',
'image' => 'string',
'extra_image' => 'string',
'video' => 'string',
'link_to' => 'string',
'link' => 'string',

View File

@@ -19,6 +19,7 @@ class SysConfigGroupBaseModel extends BaseModel
protected $schema = [
'id' => 'int',
'language_id' => 'int',
'unique_label' => 'string',
'name' => 'string',
'sort' => 'int',
'status' => 'int',

View File

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

View File

@@ -1,6 +1,8 @@
<?php
// 这是系统自动生成的公共文件
use think\facade\Lang;
if (!function_exists('str_contains')) {
/**
* 检查字符串是否包含子字符串
@@ -69,38 +71,7 @@ if (!function_exists('style')) {
}
}
if (!function_exists('thumb')) {
/**
* 获取缩略图
* @param string $url 图片地址
* @return string
*/
function thumb(string $url): string
{
if (empty($url)) {
return '';
}
if (
str_contains($url, '_thumb') ||
\think\helper\Str::startsWith($url, ['http://', 'https://']) ||
!\think\helper\Str::endsWith($url, ['.png', '.jpg', '.jpeg', '.gif', '.tif', '.svg', '.webp', '.bmp'])
) {
return $url;
}
$idx = mb_strripos($url, '.', 0, 'utf-8');
if ($idx === false) {
return $url;
}
$len = mb_strlen($url, 'utf-8');
return mb_substr($url, 0, $idx, 'utf-8') . '_thumb' . mb_substr($url, $idx, $len - $idx, 'utf-8');
}
}
if (!function_exists('get_path_from_img_tag'))
{
if (!function_exists('get_path_from_img_tag')) {
/**
* 从img标签中获取图片路径
* @param string $img
@@ -116,3 +87,157 @@ if (!function_exists('get_path_from_img_tag'))
return '';
}
}
if (!function_exists('lang_i18n')) {
/**
* 获取国际化语言包
* 根据请求页面path获取分组语言对应值
*
* @param string $name 语言包名称
* @param array $vars 替换变量
* @param string $lang 语言标识
* @return string
*/
function lang_i18n(string $name, array $vars = [], string $lang = ''): string
{
if (is_null($name)) {
return '';
}
$path = strtolower(request()->controller() . '/' . request()->action());
$lang_key = "{$path}.{$name}";
if (!Lang::has($lang_key, $lang)) {
return Lang::get($name, $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);
}
}

32
app/index/config/lang.php Normal file
View File

@@ -0,0 +1,32 @@
<?php
// +----------------------------------------------------------------------
// | 多语言设置
// +----------------------------------------------------------------------
return [
// 默认语言
'default_lang' => env('DEFAULT_LANG', 'zh-cn'),
// 允许的语言列表
'allow_lang_list' => ['zh-cn', 'en-us'],
// 多语言自动侦测变量名
'detect_var' => 'lang',
// 是否使用Cookie记录
'use_cookie' => true,
// 多语言cookie变量
'cookie_var' => 'think_lang',
// 多语言header变量
'header_var' => 'think-lang',
// 扩展语言包
'extend_list' => [
'en-us' => [
app()->getAppPath() . '/lang/en-us/' . get_platform() . '.php',
app()->getAppPath() . '/lang/en-us/validate.php',
],
],
// Accept-Language转义为对应语言包名称
'accept_language' => [
'zh-hans-cn' => 'zh-cn',
],
// 是否支持语言分组
'allow_group' => true,
];

View File

@@ -3,13 +3,15 @@
// | 模板设置
// +----------------------------------------------------------------------
$view_device_name = get_platform();
return [
// 模板引擎类型使用Think
'type' => 'Think',
// 默认模板渲染规则 1 解析为小写+下划线 2 全部转换小写 3 保持操作方法
'auto_rule' => 1,
// 模板目录名
'view_dir_name' => 'view',
'view_dir_name' => "view/{$view_device_name}",
// 模板后缀
'view_suffix' => 'html',
// 模板文件名分隔符
@@ -24,8 +26,8 @@ return [
'taglib_end' => '}',
// 模板输出替换
'tpl_replace_string' => [
'__CSS__' => '/static/index/css',
'__JS__' => '/static/index/js',
'__IMAGES__' => '/static/index/images',
'__CSS__' => "/static/index/{$view_device_name}/css",
'__JS__' => "/static/index/{$view_device_name}/js",
'__IMAGES__' => "/static/index/{$view_device_name}/images",
]
];

View File

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

View File

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

View File

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

View File

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

View File

@@ -34,6 +34,7 @@ class ContactUs extends Common
->where('status', '=', 1)
->order(['sort' => 'asc', 'id' => 'desc']);
}])
->atPlatform(request()->from)
->uniqueLabel(['BANNER_6805e3d32dcc2', 'BANNER_6806090c1838f'])
->language($this->lang_id)
->enabled(true)
@@ -44,14 +45,7 @@ class ContactUs extends Common
$banner_map[$v->unique_label] = $v;
}
$focus_image = data_get($banner_map, 'BANNER_6805e3d32dcc2')?->items->first()?->toArray();
$info_datas = data_get($banner_map, 'BANNER_6806090c1838f')?->items->each(function($item) {
if (Str::contains($item->title, '<br/>')) {
$title = explode('<br/>', $item->title);
$item->title = $title[0];
$item->title_short = $title[1];
}
return $item;
})->chunk(4)->toArray();
$info_datas = data_get($banner_map, 'BANNER_6806090c1838f')?->items->toArray();
}
View::assign('focus_image', $focus_image);
View::assign('info_datas', $info_datas);
@@ -88,10 +82,10 @@ class ContactUs extends Common
'user_agent' => request()->header('user-agent'),
]);
if ($msg->isEmpty()) {
return error(lang('contact_message.send_fail'));
return error(lang('信息提交失败!'));
}
return success(lang('contact_message.send_success'));
return success(lang('信息已成功提交!'));
}
$focus_image = [];
@@ -102,6 +96,7 @@ class ContactUs extends Common
->where('status', '=', 1)
->order(['sort' => 'asc', 'id' => 'desc']);
}])
->atPlatform(request()->from)
->uniqueLabel([
'BANNER_6801be1e7d686',
'BANNER_6801c053ce12e',
@@ -134,6 +129,7 @@ class ContactUs extends Common
'corp_name',
'email',
'phone',
'website_url',
'business_type',
'enterprise_size',
'address',
@@ -153,7 +149,7 @@ class ContactUs extends Common
'email' => $form_data['email'],
'phone' => $form_data['phone'],
'referer_url' => request()->header('referer'),
'website_url' => request()->header('host'),
'website_url' => $form_data['website_url'],
'business_type' => $form_data['business_type'],
'enterprise_size' => $form_data['enterprise_size'],
'address' => $form_data['address'],
@@ -161,9 +157,9 @@ class ContactUs extends Common
'ip' => request()->ip(),
]);
if ($ret->isEmpty()) {
return error(lang('contact_distributor.send_fail'));
return error(lang('信息提交失败!'));
}
return success(lang('contact_distributor.send_success'));
return success(lang('信息已成功提交!'));
}
// 获取企业规模
@@ -210,16 +206,16 @@ class ContactUs extends Common
'last_name' => $form_data['last_name'],
'email' => $form_data['email'],
'phone' => $form_data['phone'],
'interested' => $form_data['interested'],
'interested' => is_array($form_data['interested']) ? implode(',', $form_data['interested']) : $form_data['interested'],
'referer_url' => request()->header('referer'),
'website_url' => request()->header('host'),
'message' => $form_data['message'],
'ip' => request()->ip(),
]);
if ($ret->isEmpty()) {
return error(lang('contact_bulkbuy.send_fail'));
return error(lang('信息提交失败!'));
}
return success(lang('contact_bulkbuy.send_success'));
return success(lang('信息已成功提交!'));
}
// 获取可选产品品类配置
@@ -229,7 +225,7 @@ class ContactUs extends Common
->byName('bulk_purchase_inquiry_interested')
->find();
if (empty($config)) {
return error('当前选定语言的采购可选品类配置出错');
return error(lang('当前选定语言的采购可选品类配置出错'));
}
View::assign('interested', explode(',', preg_replace('/\r?\n/', ',', $config->value)));

View File

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

View File

@@ -54,6 +54,7 @@ class Index extends Common
$banners = SysBannerModel::with(['items' => function($query) {
$query->where('type', 'IN', ['image', 'video'])->where('status', '=', 1)->order(['sort' => 'asc', 'id' => 'desc']);
}])
->atPlatform(request()->from)
->uniqueLabel([
'BANNER_67f61cd70e8e1',
'BANNER_67f633023a5b3',

View File

@@ -45,6 +45,7 @@ class Product extends Common
->where('status', '=', 1)
->order(['sort' => 'asc', 'id' => 'desc']);
}])
->atPlatform(request()->from)
->uniqueLabel(['BANNER_6808abd813d78'])
->language($this->lang_id)
->enabled(true)
@@ -103,7 +104,7 @@ class Product extends Common
->onSale(true)
->onShelves(true)
->append(['p' => $list[0]['id']])
->order(['sort' => 'asc', 'id' => 'desc'])
->order(['sort' => 'asc', 'created_at' => 'desc', 'id' => 'desc'])
->limit(5)
->buildSql();
$query = \think\facade\Db::table("($sql) as a");
@@ -125,7 +126,7 @@ class Product extends Common
->enabled(true)
->onSale(true)
->onShelves(true)
->order(['sort' => 'asc', 'id' => 'desc'])
->order(['sort' => 'asc', 'created_at' => 'desc', 'id' => 'desc'])
->limit(5);
});
}
@@ -191,7 +192,7 @@ class Product extends Common
->enabled(true)
->onSale(true)
->onShelves(true)
->order(['sort' => 'asc', 'id' => 'desc'])
->order(['sort' => 'asc', 'created_at' => 'desc', 'id' => 'desc'])
->select();
if (!$products->isEmpty()) {
// 获取sku信息
@@ -230,7 +231,7 @@ class Product extends Common
$attr = $sku_attrs_map[$v['id']]?? [];
if (!empty($attr)) {
foreach ($attr as $at) {
if ($at['attr_name'] == '颜色') {
if (in_array($at['attr_name'], ['颜色', 'Color'])) {
$color_map[$v['product_id']][] = $at;
}
}
@@ -253,7 +254,11 @@ class Product extends Common
];
}
foreach ($categorys_data as $k => $v) {
$categorys_data[$k]['products'] = $products_map[$v['id']] ?? [];
if (!isset($products_map[$v['id']])) {
unset($categorys_data[$k]);
continue;
}
$categorys_data[$k]['products'] = $products_map[$v['id']];
}
}
}
@@ -267,7 +272,12 @@ class Product extends Common
*/
public function search()
{
$keywords = request()->param('keywords', '');
$param = request()->param([
'keywords',
'page/d' => 1,
'size/d' => 10
]);
$keywords = !empty($param['keywords']) ? trim($param['keywords']) : '';
// 关键词搜索
$products = ProductModel::field([
@@ -283,14 +293,20 @@ class Product extends Common
->onSale(true)
->onShelves(true)
->order(['sort' => 'asc', 'id' => 'desc'])
->select()
->paginate([
'list_rows' => $param['size'],
'page' => $param['page'],
'query' => request()->param()
])
->each(function ($item) use($keywords) {
$item['spu'] = str_replace($keywords, '<strong class="redpoint">'.$keywords.'</strong>', $item['spu']);
$item['name'] = str_replace($keywords, '<strong class="redpoint">'.$keywords.'</strong>', $item['name']);
$item['short_name'] = str_replace($keywords, '<strong class="redpoint">'.$keywords.'</strong>', $item['short_name']);
$replace = fn($txt) => '<strong class="redpoint">' . $txt . '</strong>';
$item['spu'] = highlight_keywords($item['spu'], $keywords, $replace);
$item['name'] = highlight_keywords($item['name'], $keywords, $replace);
$item['short_name'] = highlight_keywords($item['short_name'], $keywords, $replace);
return $item;
});
View::assign('products', $products);
View::assign('page', $products->render());
return View::fetch('search');
}
@@ -358,6 +374,8 @@ class Product extends Common
// 获取属性名称
$attrs = ProductAttrModel::bypks(array_unique(Arr::pluck($sku_attrs, 'attr_id')))->column(['attr_name'], 'id');
foreach ($sku_attrs as $v) {
if (empty($v['attr_value'])) continue;
$v['attr_name'] = $attrs[$v['attr_id']]?? '';
// 按属性分组
$product_sku_attrs[$v['attr_id']]['attr_id'] = $v['attr_id'];
@@ -378,8 +396,11 @@ class Product extends Common
->order(['sort' => 'asc', 'id' => 'desc'])
->select()
->hidden(['platform'])
->bindAttr('platform', ['platform_name' => 'platform'])
->bindAttr('platform', ['platform_name' => 'platform', 'platform_sort' => 'sort'])
->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) {
@@ -442,9 +463,9 @@ class Product extends Common
'message' => $post['message'],
]);
if ($ret->isEmpty()) {
return error(lang('product_detail.send_fail'));
return error(lang('提交失败'));
}
return success(lang('product_detail.send_success'));
return success(lang('提交成功'));
}
/**
@@ -464,6 +485,7 @@ class Product extends Common
->where('status', '=', 1)
->order(['sort' => 'asc', 'id' => 'desc']);
}])
->atPlatform(request()->from)
->uniqueLabel(['BANNER_680dd7ceaa529'])
->language($this->lang_id)
->enabled(true)

View File

@@ -0,0 +1,20 @@
<?php
declare (strict_types = 1);
namespace app\index\controller;
use think\facade\View;
use think\Request;
class TopicLaptop extends Common
{
/**
* 专题 - 笔记本电脑首页
*/
public function index()
{
return View::fetch('index');
}
}

View File

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

View File

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

View File

@@ -1,226 +0,0 @@
<?php
return [
'header_navigation' => [
'product_categorys' => 'Products',
'store' => 'Store'
],
'header_search' => [
'history' => 'Search History',
'hot_product' => 'Popular Products',
],
'footer_navigation' => [
'product_categorys' => 'Product'
],
'footer_contact' => 'Contact',
'index' => [
'featured_products' => 'Featured Products',
'view_all' => 'View All',
'learn_more' => 'Learn More',
'orico_technology' => 'ORICO Technology',
'orico_technology_desc' => 'Designed to be just as easy to learn as iPhone.Chatting with friends.',
'faq' => 'FAQ',
'faq_short_desc' => 'What are you most concerned about',
'faq_desc' => 'Our customer support is available Manday to Friday 9am600pmAverage arswer time 24h',
],
'article' => [
'detail_share' => 'SHARE',
'detail_leave_reply' => 'Leave a Reply',
'detail_leave_reply_name' => 'Name',
'detail_leave_reply_email' => 'Email',
'detail_leave_reply_email_tip' => 'Your email address will not be pulished.',
'detail_leave_reply_comment' => 'Comment',
'detail_leave_reply_submit' => 'POST COMMENT',
'detail_recommend' => 'Recommended for you',
],
'attachment' => [
'software_drives' => 'Software and Drivers',
'video' => 'Videos',
'support_model' => 'Supported Models',
'support_platform' => 'Supported Systems',
'search_placeholder' => 'Search model',
'no_data' => 'No Result',
'no_video' => 'No Video',
],
'aboutus_introduction' => [
'title' => 'Introduction of the Brand',
'section_why_title' => 'Why Choose Us',
'section_service_title' => 'How We Can Help with Customization',
'section_difference_title' => 'For Different Situation',
],
'aboutus_mileage' => [
'achievement' => 'Our Achievement',
'events' => 'Brand Events',
'development' => 'Tech Development',
],
'aboutus_policy' => [
'title' => 'After-Sales Policy',
'banner_1_title' => 'After-sale Policy',
'banner_1_desc' => 'ORICO commits to provide 7-day Refund, 15-day Exchange, 1-year Quality Warranty. ',
'banner_3_title' => 'For your own benefits, please mind the following information',
'banner_3_desc' => 'For a smooth return and refund, quality warranty, please follow these steps:',
'banner_5_title' => 'ORICO is not liable for:'
],
'contact_index' => [
'title' => 'contact us',
],
'contact_message' => [
'title' => 'contact us',
'our_information' => 'Our Information',
'send_question' => 'Send Us Your Question',
'form_name' => 'Yuor Name',
'form_name_placeholder' => 'This is your placeholder text',
'form_email' => 'Your Email',
'form_email_placeholder' => 'This is your placeholder text',
'form_question' => 'Your Message',
'form_question_placeholder' => 'This is your placeholder text',
'form_submit' => 'SEND',
'become_a_distributor' => 'Become a Distributor',
// 验证器中文本
'validate_name_required' => 'Name is required',
'validate_name_max' => 'Name cannot exceed 64 characters',
'validate_email_required' => 'Email is required',
'validate_email_email' => 'Email format is incorrect',
'validate_email_max' => 'Email cannot exceed 128 characters',
'validate_content_required' => 'Message is required',
'validate_content_max' => 'Message cannot exceed 1024 characters',
// 返回文本
'send_success' => 'success',
'send_fail' => 'fail',
],
'contact_distributor' => [
'title' => 'Become a Distributor',
'section_title' => 'To Be Our Distributor',
'section_desc_1' => 'Ready to join us?',
'section_desc_2' => 'Enter your details below and our Sales team will get back to you within 2 business days.',
'form_corp_name' => 'Company Name',
'form_corp_name_placeholder' => 'Enter your Company Name',
'form_email' => 'Contact Email',
'form_email_placeholder' => 'Enter your Email',
'form_phone' => 'Phone Number',
'form_phone_placeholder' => 'This is your placeholder text',
'form_business_type' => 'Type of Business',
'form_online_shop_url' => 'Online Shop URL',
'form_online_shop_url_placeholder' => 'This is your placeholder URL',
'form_enterprise_size' => 'Enterprise size',
'form_corp_address' => 'Company Address',
'form_corp_address_placeholder' => 'Enter Address',
'form_message' => 'Message',
'form_message_placeholder' => 'Enter your message',
'form_submit' => 'SUBMIT',
// 验证器中文本
'validate_name_required' => 'Company Name is required',
'validate_name_max' => 'Company Name cannot exceed 64 characters',
'validate_email_required' => 'Email is required',
'validate_email_email' => 'Email format is incorrect',
'validate_email_max' => 'Email cannot exceed 128 characters',
'validate_phone_required' => 'Phone Number is required',
'validate_phone_max' => 'Phone Number cannot exceed 64 characters',
'validate_business_type_required' => 'Type of Business is required',
'validate_business_type_max' => 'Type of Business cannot exceed 128 characters',
'validate_enterprise_size_required' => 'Enterprise size is required',
'validate_enterprise_size_max' => 'Enterprise size cannot exceed 128 characters',
'validate_address_required' => 'Company Address is required',
'validate_address_max' => 'Company Address cannot exceed 255 characters',
'validate_message_required' => 'Message is required',
// 返回文本
'send_success' => 'Add Success',
'send_fail' => 'Add Fail',
],
'contact_bulkbuy' => [
'title' => '',
'form_title' => 'Bulk Buy',
'form_corp_name_label' => 'Company Name',
'form_corp_name_placeholder' => 'Legal business name',
'form_website_url_label' => 'Official website',
'form_website_url_placeholder' => 'Please paste the URL',
'form_username_label' => 'Your Name',
'form_firstname_placeholder' => 'First name',
'form_lastname_placeholder' => 'Last name',
'form_email_label' => 'Email',
'form_email_placeholder' => 'Please enter your email',
'form_phone_label' => 'Phone Numbe',
'form_phone_placeholder' => 'Please enter your phone number',
'form_checkbox_label' => 'Products you are interested in?',
'form_message_label' => 'Message',
'form_message_placeholder' => 'Methods used',
'form_submit' => 'SUBMIT',
// 验证器中文本
'validate_corp_name_require' => 'Company Name is required',
'validate_corp_name_max' => 'Company Name cannot exceed 128 characters',
'validate_url_max' => 'URL cannot exceed 255 characters',
'validate_first_name_require' => 'First Name is required',
'validate_first_name_max' => 'First Name cannot exceed 64 characters',
'validate_last_name_require' => 'Last Name is required',
'validate_last_name_max' => 'Last Name cannot exceed 64 characters',
'validate_email_require' => 'Email is required',
'validate_email_email' => 'Email format is incorrect',
'validate_email_max' => 'Email cannot exceed 128 characters',
'validate_phone_max' => 'Phone Number cannot exceed 32 characters',
'validate_interested_max' => 'Interested in cannot exceed 255 characters',
'validate_message_require' => 'Message is required',
'validate_message_max' => 'Message cannot exceed 1024 characters',
// 返回文本
'send_success' => 'Add Success',
'send_fail' => 'Add Fail',
],
'product_newpro' => [
'view_all' => 'View all'
],
'product_detail' => [
'detail_section_title' => 'Product Description',
'related_products' => 'Related Products',
'display_form' => 'Send Inquiry',
'form_name' => 'Name',
'form_first_name_placeholder' => 'First name',
'form_last_name_placeholder' => 'Last name',
'form_corp' => 'Company/Organization',
'form_email' => 'Email Address',
'form_phone' => 'Phone Number',
'form_country' => 'Country',
'form_country_placeholder' => '--- Select your country ---',
'form_industry' => 'Industry',
'form_inquiry' => 'Inquiry',
'form_submit' => 'SUBMIT',
// 验证器中文本
'validate_first_name_require' => 'First Name is required',
'validate_first_name_max' => 'First Name cannot exceed 64 characters',
'validate_last_name_require' => 'Last Name is required',
'validate_last_name_max' => 'Last Name cannot exceed 64 characters',
'validate_email_require' => 'Email is required',
'validate_email_email' => 'Email format is incorrect',
'validate_email_max' => 'Email cannot exceed 128 characters',
'validate_phone_max' => 'Phone Number cannot exceed 32 characters',
'validate_country_name_require' => 'Country is required',
'validate_country_name_max' => 'Country cannot exceed 128 characters',
'validate_corp_name_require' => 'Company/Organization is required',
'validate_corp_name_max' => 'Company/Organization cannot exceed 128 characters',
'validate_industry_require' => 'Industry is required',
'validate_industry_max' => 'Industry cannot exceed 64 characters',
'validate_message_require' => 'Message is required',
'validate_message_max' => 'Message cannot exceed 1024 characters',
// 返回文本
'send_success' => 'Add Success',
'send_fail' => 'Add Fail',
],
'topic_nas_index' => [
'solution_section_title' => '<span style="color:#004BFA;">ORICO</span>网络存储解决方案',
'software_section_title' => '<span style="color:#004BFA">NAS</span>配套软件',
],
'topic_nas_cooperation' => [
'advantages_section_title' => 'Cooperation advantages',
'contacts_section_title' => 'Looking forward to working with you'
],
'topic_nas_download' => [
'cyber_tab_title' => 'CyberData',
'weline_tab_title' => 'Weline'
],
'topic_nas_help' => [
'module_title' => 'Quick Start Guide',
'search_input_placeholder' => 'What are you looking for?',
'article_section_title' => 'User\' s Guide',
'contact_section_title' => 'Contact US',
'view_more' => 'Click to view more',
'content' => 'Content'
]
];

View File

@@ -0,0 +1,222 @@
<?php
return [
// 公共header/footer
'首页' => 'Home',
'产品列表' => 'Products',
'搜索' => 'Search',
'搜索历史' => 'Search History',
'请择地区' => 'SELECT A REGION',
'产品' => 'Product',
'联系方式' => 'Contact',
// 返回文本
'提交成功' => 'success',
'提交失败' => 'fail',
'信息已成功提交!' => 'Add Success',
'信息提交失败!' => 'Add Fail',
'留言提交失败' => 'Message submit failed',
'留言提交成功' => 'Message submit success',
'当前选定语言的采购可选品类配置出错' => 'Current language configuration of purchase optional categories is incorrect',
// 首页
'index/index' => [
'查看所有' => 'View All',
'明星产品/热点产品' => 'Featured Products',
'了解更多' => 'Learn More',
'Orico 技术' => 'ORICO Technology',
'强大功能、简单使用' => 'designed to be just as easy to learn as iPhone. chatting with friends.',
'常见问题' => 'FAQ',
'回答您最关心的问题' => 'What are you most concerned about',
'客服团队的工作时间周一到周五早9点到晚6点 平均应答时间24小时内' => 'Our customer support is available Monday to Friday: 9am-6:00pm. Average answer time: 24h',
],
// 文章详情页
'article/detail' => [
'分享' => 'SHARE',
'留言' => 'Leave a Reply',
'名称' => 'Name',
'电子邮箱' => 'Email',
'您的电子邮件地址不会被公开' => 'Your email address will not be pulished.',
'留言内容' => 'Comment',
'评论' => 'COMMENT',
'提交留言' => 'POST COMMENT',
'你可能还喜欢' => 'Recommended for you',
'链接复制成功' => 'Link copied successfully',
],
// 产品分类
'product/category' => [
'查看全部' => 'View All',
],
// 产品搜索
'product/search' => [
'搜索' => 'Search',
'请搜索' => 'Please search...',
'暂无数据' => 'No data',
],
// 产品详情
'product/detail' => [
'首页' => 'Home',
'型号' => 'Model',
'发送查询' => 'Send Inquiry',
'产品描述' => 'Product Description',
'关联产品' => 'Related Products',
'姓名' => 'Name',
'请输入您的名称' => 'First name',
'请输入您的姓氏' => 'Last name',
'公司/组织' => 'Company/Organization',
'邮箱' => 'Email',
'电话号码' => 'Phone Number',
'国家' => 'Country',
'请选择所属国家' => 'Select your country',
'行业' => 'Industry',
'询问内容' => 'Inquiry',
'提交' => 'SUBMIT',
],
// 常见问题
'faq/index' => [
'常见FQ_下载与服务_中文官网帮助信息_ORICO/奥睿科官网' => 'FAQ',
'常见问题解答' => 'Frequently asked questions',
],
// 附件下载
'attachment/index' => [
'软件下载' => 'Software download',
'支持型号' => 'Supported Models',
'支持系统' => 'Supported Systems',
'全站搜索' => 'Search',
'搜索' => 'Search',
'请搜索' => 'Please search...',
],
'attachment/video' => [
'软件和驱动程序' => 'Software and Drivers',
'您的浏览器不支持 video 标签。' => 'Your browser does not support HTML5 video.',
],
// 联系我们批量购买页面
'contactus/bulkbuy' => [
'批量购买' => 'Bulk Buy',
'公司名称' => 'Company Name',
'法定营业名称' => 'Legal business name',
'官方网站' => 'Official website',
'请粘贴网址' => 'Please paste the URL',
'姓名' => 'Your Name',
'姓' => 'Last name',
'名' => 'First name',
'邮箱' => 'Email',
'请输入邮箱' => 'Enter your Email',
'电话号码' => 'Phone Number',
'请输入电话号码' => 'Enter your Phone Number',
'您对哪个产品品类感兴趣?' => 'Products you are interested in?',
'留言' => 'Message',
'请输入留言' => 'Enter your message',
'提交' => 'SUBMIT',
],
// 联系我们成为分销商页面
'contactus/distributor' => [
'成为经销商' => 'Become a Distributor',
'准备好加入我们了吗?<br> 在下面输入您的详细信息我们的销售团队将在2个工作日内回复您。' => 'Ready to join us?<br/>Enter your details below and our Sales team will get back to you within 2 business days.',
'公司名称' => 'Company Name',
'请输入公司名称' => 'Enter your Company Name',
'电子邮件' => 'Contact Email',
'请输入邮箱' => 'Enter your Email',
'电话号码' => 'Phone Number',
'请输入电话号码' => 'Enter your Phone Number',
'业务类型' => 'Type of Business',
'在线商店网址' => 'Online Store URL',
'企业规模' => 'Enterprise Size',
'公司地址' => 'Company Address',
'请输入地址' => 'Enter Address',
'留言' => 'Message',
'请输入留言' => 'Enter your message',
'提交' => 'SUBMIT',
],
// 联系我们留言页
'contactus/message' => [
'我们的信息' => 'Our Information',
'姓名' => 'Your name',
'电子邮箱' => 'Your email',
'您的问题' => 'Your message',
'提交您的问题' => 'Send Us Your Question',
'请输入内容...' => 'This is your placeholder text',
'发送' => 'SEND',
'成为经销商' => 'Become a Distributor',
],
// 关于我们 - 品牌介绍
'aboutus/introduction' => [
'品牌介绍' => 'Introduction of the Brand',
'选择我们的理由' => 'Why Choose Us',
'为您提供专属定制服务' => 'How We Can Help with Customization',
'对于不同的情况' => 'For Different Situation',
],
// 关于我们 - 文化介绍
'aboutus/culture' => [
'文化介绍' => 'Culture Introduction',
],
// 关于我们 - 品牌历程
'aboutus/mileage' => [
'ORICO荣耀' => 'Our Achievement',
'品牌里程' => 'Brand Events',
'品牌活动' => 'Tech Development',
],
// 关于我们 - 售后政策
'aboutus/policy' => [
'售后政策_注意事项' => 'After-Sales Policy',
'售后政策' => 'After-sale Policy',
'ORICO/奥睿科商城为您提供七天包退、15天换新、1年保修、终身维护的服务承诺' => 'ORICO commits to provide 7-day Refund, 15-day Exchange, 1-year Quality Warranty. ',
'为了保障您的合法权益,敬请关注以下信息' => 'For your own benefits, please mind the following information',
'为了得到深圳市元创时代科技有限公司给予您的“包修、包换、包退”的权益,请您:' => 'For a smooth return and refund, quality warranty, please follow these steps:',
'特别说明' => 'ORICO is not liable for:'
],
// nas主题 - 首页
'topicnas/index' => [
'网络存储解决方案' => 'Network Storage Solutions',
'配套软件' => 'Software',
],
// nas主题 - 客户合作页
'topicnas/cooperation' => [
'成为ORICO合作伙伴' => 'Be an ORICO partner',
'合作伙伴招募' => 'Partner recruitment',
'广告代理' => 'Advertising Agency',
'抖音销售' => 'Douyin Sales',
'代理经销合作' => 'Proxy and distribution cooperation',
'ODM合作' => 'ODM cooperation',
'合作优势' => 'Cooperation advantages',
'期待与您的合作' => 'Looking forward to working with you'
],
// nas主题 - 下载页
'topicnas/download' => [
'CyberData赛博云空间' => 'CyberData',
'Weline微链接' => 'Weline'
],
// nas主题 - 帮助页
'topicnas/help' => [
'帮助中心' => 'Quick Start Guide',
'请输入搜索关键字,如安装赛博云空间,影视库' => 'What are you looking for?',
'取消' => 'Cancel',
'使用教程' => 'User\' s Guide',
'查看更多' => 'Click to view more',
'联系我们' => 'Contact US',
'目录' => 'Content'
],
// nas主题 - 帮助详情页
'topicnas/helpdetail' => [
'帮助中心' => 'Quick Start Guide',
'请输入搜索关键字,如安装赛博云空间,影视库' => 'What are you looking for?',
'取消' => 'Cancel',
'使用教程' => 'User\' s Guide',
'联系我们' => 'Contact US',
'目录' => 'Content'
],
];

227
app/index/lang/en-us/pc.php Normal file
View File

@@ -0,0 +1,227 @@
<?php
return [
'首页' => 'Home',
'产品列表' => 'Products',
'店铺' => 'Store',
'搜索记录' => 'Search History',
'热销产品' => 'Popular Products',
'产品' => 'Product',
'联系我们' => 'Contact',
// 返回文本
'提交成功' => 'success',
'提交失败' => 'fail',
'信息已成功提交!' => 'Add Success',
'信息提交失败!' => 'Add Fail',
'当前选定语言的采购可选品类配置出错' => 'Current language configuration of purchase optional categories is incorrect',
// 首页
'index/index' => [
'查看所有' => 'View All',
'明星产品/热点产品' => 'Featured Products',
'了解更多' => 'Learn More',
'ORICO 技术' => 'ORICO Technology',
'强大功能、简单使用' => 'Designed to be just as easy to learn as iPhone.Chatting with friends.',
'常见问题' => 'FAQ',
'回答您最关心的问题' => 'What are you most concerned about',
'客服团队的工作时间周一到周五早9点到晚6点 平均应答时间24小时内' => 'Our customer support is available Manday to Friday 9am600pmAverage arswer time 24h',
],
// 文章详情页
'article/detail' => [
'分享' => 'SHARE',
'留言' => 'Leave a Reply',
'名称' => 'Name',
'电子邮箱' => 'Email',
'您的电子邮件地址不会被公开' => 'Your email address will not be pulished.',
'留言内容' => 'Comment',
'评论' => 'COMMENT',
'提交留言' => 'POST COMMENT',
'你可能还喜欢' => 'Recommended for you',
'链接复制成功' => 'Link copied successfully',
],
// 常见问题
'faq/index' => [
'常见FQ_下载与服务_中文官网帮助信息_ORICO/奥睿科官网' => 'FAQ',
],
// 附件页 - 软件下载
'attachment/index' => [
'软件和驱动程序' => 'Software and Drivers',
'视频' => 'Videos',
'支持型号' => 'Supported Models',
'支持系统' => 'Supported Systems',
'搜索' => 'Search',
'查询无结果!' => 'No Result',
],
// 附件页 - 视频
'attachment/video' => [
'软件和驱动程序' => 'Software and Drivers',
'搜索' => 'Search',
'视频' => 'Videos',
'查询无此视频!' => 'No Video',
],
// 关于我们 - 品牌介绍
'aboutus/introduction' => [
'品牌介绍' => 'Introduction of the Brand',
'选择我们的理由' => 'Why Choose Us',
'为您提供专属定制服务' => 'How We Can Help with Customization',
'对于不同的情况' => 'For Different Situation',
],
// 关于我们 - 品牌历程
'aboutus/mileage' => [
'ORICO荣耀' => 'Our Achievement',
'品牌里程' => 'Brand Events',
'品牌活动' => 'Tech Development',
],
// 关于我们 - 售后政策
'aboutus/policy' => [
'售后政策_注意事项' => 'After-Sales Policy',
'售后政策' => 'After-sale Policy',
'ORICO/奥睿科商城为您提供七天包退、15天换新、1年保修、终身维护的服务承诺' => 'ORICO commits to provide 7-day Refund, 15-day Exchange, 1-year Quality Warranty. ',
'为了保障您的合法权益,敬请关注以下信息' => 'For your own benefits, please mind the following information',
'为了得到深圳市元创时代科技有限公司给予您的“包修、包换、包退”的权益,请您:' => 'For a smooth return and refund, quality warranty, please follow these steps:',
'特别说明' => 'ORICO is not liable for:'
],
// 关于我们 - 文化介绍
'aboutus/culture' => [
'文化介绍' => 'Culture Introduction',
],
// 联系我们
'contactus/index' => [
'客户服务' => 'contact us',
],
// 联系我们 - 留言
'contactus/message' => [
'联系我们' => 'contact us',
'我们的信息' => 'Our Information',
'提交您的问题' => 'Send Us Your Question',
'姓名' => 'Yuor Name',
'请输入你的姓名' => 'This is your placeholder text',
'电子邮箱' => 'Your Email',
'请输入你的邮箱' => 'This is your placeholder text',
'您的问题' => 'Your Message',
'请输入你的问题' => 'This is your placeholder text',
'发送' => 'SEND',
'成为经销商' => 'Become a Distributor',
],
// 联系我们 - 成为经销商
'contactus/distributor' => [
'成为经销商' => 'To Be Our Distributor',
'准备好加入我们了吗?' => 'Ready to join us?',
'在下面输入您的详细信息我们的销售团队将在2个工作日内回复您。' => 'Enter your details below and our Sales team will get back to you within 2 business days.',
'公司名称' => 'Company Name',
'请输入公司名称' => 'Enter your Company Name',
'电子邮箱' => 'Contact Email',
'请输入邮箱' => 'Enter your Email',
'电话号码' => 'Phone Number',
'请输入电话号码' => 'This is your placeholder text',
'业务类型' => 'Type of Business',
'在线商店网址' => 'Online Shop URL',
'请输入网址' => 'This is your placeholder URL',
'企业规模' => 'Enterprise size',
'公司地址' => 'Company Address',
'请输入地址' => 'Enter Address',
'留言' => 'Message',
'请输入留言' => 'Enter your message',
'提交' => 'SUBMIT',
],
// 联系我们 - 批量购买
'contactus/bulkbuy' => [
'商务订单' => 'Bulk Buy',
'批量购买' => 'Bulk Buy',
'公司名称' => 'Company Name',
'法定营业名称' => 'Legal business name',
'官方网站' => 'Official website',
'请粘贴网址' => 'Please paste the URL',
'姓名' => 'Your Name',
'名' => 'First name',
'姓' => 'Last name',
'电子邮箱' => 'Email',
'请输入邮箱' => 'Please enter your email',
'电话号码' => 'Phone Numbe',
'请输入电话号码' => 'Please enter your phone number',
'您对哪个产品品类感兴趣?' => 'Products you are interested in?',
'留言' => 'Message',
'请输入留言' => 'Methods used',
'提交' => 'SUBMIT',
],
// 产品 - 产品详情页
'product/detail' => [
'首页' => 'Home',
'型号' => 'Product Model',
'产品详情' => 'Product Description',
'相关产品' => 'Related Products',
'发送查询' => 'Send Inquiry',
'姓名' => 'Name',
'请输入您的姓' => 'First name',
'请输入您的名' => 'Last name',
'公司/组织' => 'Company/Organization',
'电子邮箱' => 'Email Address',
'电话号码' => 'Phone Number',
'国家' => 'Country',
'请选择所属国家' => '--- Select your country ---',
'行业' => 'Industry',
'询问内容' => 'Inquiry',
'提交' => 'SUBMIT',
],
// 产品 - 搜索
'product/search' => [
'暂无数据' => 'No data',
],
// 产品 - 分类
'product/category' => [
'查看全部' => 'View All',
],
// nas主题 - 首页
'topicnas/index' => [
'网络存储解决方案' => 'Network Storage Solutions',
'配套软件' => 'Software',
],
// nas主题 - 客户合作页
'topicnas/cooperation' => [
'合作优势' => 'Cooperation advantages',
'期待与您的合作' => 'Looking forward to working with you'
],
// nas主题 - 下载页
'topicnas/download' => [
'CyberData赛博云空间' => 'CyberData',
'Weline微链接' => 'Weline'
],
// nas主题 - 帮助页
'topicnas/help' => [
'帮助中心' => 'Quick Start Guide',
'请输入搜索关键字,如安装赛博云空间,影视库' => 'What are you looking for?',
'使用教程' => 'User\' s Guide',
'查看更多' => 'Click to view more',
'联系我们' => 'Contact US',
'目录' => 'Content'
],
// nas主题 - 帮助详情页
'topicnas/helpdetail' => [
'帮助中心' => 'Quick Start Guide',
'请输入搜索关键字,如安装赛博云空间,影视库' => 'What are you looking for?',
'使用教程' => 'User\' s Guide',
'联系我们' => 'Contact US',
'目录' => 'Content'
],
];

View File

@@ -0,0 +1,40 @@
<?php
return [
'姓不能为空' => 'Last name is required',
'姓不能超过:rule个字符' => 'Last name cannot exceed :rule characters',
'名不能为空' => 'First Name is required',
'名不能超过:rule个字符' => 'First name cannot exceed :rule characters',
'姓名不能为空' => 'Name is required',
'姓名不能超过:rule个字符' => 'Name cannot exceed :rule characters',
'电话号码不能为空' => 'Phone Number is required',
'电话号码不能超过:rule个字符' => 'Phone number cannot exceed :rule characters',
'感兴趣的产品种类不能为空' => 'Interested product categories is required',
'感兴趣的产品种类不能超过:rule个字符' => 'Interested product categories cannot exceed :rule characters',
'邮箱不能为空' => 'Email is required',
'邮箱格式不正确' => 'Email format is incorrect',
'邮箱不能超过:rule个字符' => 'Email cannot exceed :rule characters',
'国家不能为空' => 'Country is required',
'国家不能超过:rule个字符' => 'Country cannot exceed :rule characters',
'网址格式不正确' => 'URL format is incorrect',
'网址不能超过:rule个字符' => 'URL cannot exceed :rule characters',
'公司名称不能为空' => 'Company Name is required',
'公司名称不能超过:rule个字符' => 'Company name cannot exceed :rule characters',
'公司地址不能为空' => 'Company Address is required',
'公司地址不能超过:rule个字符' => 'Company Address cannot exceed :rule characters',
'留言不能为空' => 'Message is required',
'企业规模不能为空' => 'Enterprise Size is required',
'企业规模不能超过:rule个字符' => 'Enterprise Size cannot exceed :rule characters',
'业务类型不能为空' => 'Type of Business is required',
'业务类型不能超过:rule个字符' => 'Type of Business cannot exceed :rule characters',
'公司/组织不能为空' => 'Company/Organization is required',
'公司/组织不能超过:rule个字符' => 'Company/Organization cannot exceed :rule characters',
'行业不能为空' => 'Industry is required',
'行业不能超过:rule个字符' => 'Industry cannot exceed :rule characters',
'询问内容不能为空' => 'Inquiry is required',
'询问内容不能超过:rule个字符' => 'Inquiry cannot exceed :rule characters',
'留言内容不能为空' => 'Message content is required',
'留言内容不能超过:rule个字符' => 'Message content cannot exceed :rule characters',
'问题不能为空' => 'Question is required',
'问题不能超过:rule个字符' => 'Question cannot exceed :rule characters',
];

View File

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

View File

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

View File

@@ -0,0 +1,22 @@
<?php
declare (strict_types = 1);
namespace app\index\middleware;
class ConfirmRequestFrom
{
/**
* 处理请求
*
* @param \think\Request $request
* @param \Closure $next
* @return Response
*/
public function handle($request, \Closure $next)
{
// 确认请求来源
$request->from = get_platform();
return $next($request);
}
}

View 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()] ?? '';
}
}

View File

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

View File

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

View File

@@ -32,6 +32,11 @@ class ArticleModel extends ArticleBaseModel
// 文章分类范围查询
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);
}

View File

@@ -79,6 +79,6 @@ class ProductModel extends ProductBaseModel
// 关键词搜索
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 . '%"');
}
}

View File

@@ -23,6 +23,16 @@ class SysBannerModel extends SysBannerBaseModel
return $this->hasMany(SysBannerItemModel::class, 'banner_id', 'id');
}
// 所属平台范围查询
public function scopeAtPlatform($query, string|array $platform)
{
if (is_array($platform)) {
$query->whereIn('at_platform', $platform);
return;
}
$query->where('at_platform', '=', $platform);
}
// 唯一标识范围查询
public function scopeUniqueLabel($query, string|array $unique_label)
{

View File

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

View File

@@ -15,12 +15,12 @@ class ContactUsBulkBuyValidate extends Validate
*/
protected $rule = [
'corp_name' => 'require|max:128',
'url' => 'max:255',
'url' => 'url|max:255',
'first_name' => 'require|max:64',
'last_name' => 'require|max:64',
'email' => 'require|email|max:128',
'phone' => 'max:32',
'interested' => 'max:255',
'interested' => 'require|max:255',
'message' => 'require|max:1024',
];
@@ -31,19 +31,21 @@ class ContactUsBulkBuyValidate extends Validate
* @var array
*/
protected $message = [
'corp_name.require' => 'valudate_corp_name_require',
'corp_name.max' => 'valudate_corp_name_max',
'url.max' => 'valudate_url_max',
'first_name.require' => 'valudate_first_name_require',
'first_name.max' => 'valudate_first_name_max',
'last_name.require' => 'valudate_last_name_require',
'last_name.max' => 'valudate_last_name_max',
'email.require' => 'valudate_email_require',
'email.email' => 'valudate_email_email',
'email.max' => 'valudate_email_max',
'phone.max' => 'valudate_phone_max',
'interested.max' => 'valudate_interested_max' ,
'message.require' => 'valudate_message_require',
'message.max' => 'valudate_message_max',
'corp_name.require' => '公司名称不能为空',
'corp_name.max' => '公司名称不能超过:rule个字符',
'url.url' => '网址格式不正确',
'url.max' => '网址不能超过:rule个字符',
'first_name.require' => '名不能为空',
'first_name.max' => '名不能超过:rule个字符',
'last_name.require' => '姓不能为空',
'last_name.max' => '姓不能超过:rule个字符',
'email.require' => '邮箱不能为空',
'email.email' => '邮箱格式不正确',
'email.max' => '邮箱不能超过:rule个字符',
'phone.max' => '电话号码不能超过:rule个字符',
'interested.require' => '感兴趣的产品种类不能为空',
'interested.max' => '感兴趣的产品种类不能超过:rule个字符',
'message.require' => '留言内容不能为空',
'message.max' => '留言内容不能超过:rule个字符',
];
}

View File

@@ -17,6 +17,7 @@ class ContactUsDistributorValidate extends Validate
'corp_name' => 'require|max:64',
'email' => 'require|email|max:128',
'phone' => 'require|max:64',
'website_url' => 'url|max:255',
'business_type' => 'require|max:128',
'enterprise_size' => 'require|max:128',
'address' => 'require|max:255',
@@ -30,19 +31,21 @@ class ContactUsDistributorValidate extends Validate
* @var array
*/
protected $message = [
'corp_name.require' => 'contact_distributor.validate_name_required',
'corp_name.max' => 'contact_distributor.validate_name_max',
'email.require' => 'contact_distributor.validate_email_required',
'email.email' => 'contact_distributor.validate_email_email',
'email.max' => 'contact_distributor.validate_email_max',
'phone.require' => 'contact_distributor.validate_phone_required',
'phone.max' => 'contact_distributor.validate_phone_max',
'business_type.require' => 'contact_distributor.validate_business_type_required',
'business_type.max' => 'contact_distributor.validate_business_type_max',
'enterprise_size.require' => 'contact_distributor.validate_enterprise_size_required',
'enterprise_size.max' => 'contact_distributor.validate_enterprise_size_max',
'address.require' => 'contact_distributor.validate_address_required',
'address.max' => 'contact_distributor.validate_address_max',
'message.require' => 'contact_distributor.validate_message_required',
'corp_name.require' => '公司名称不能为空',
'corp_name.max' => '公司名称不能超过:rule个字符',
'email.require' => '邮箱不能为空',
'email.email' => '邮箱格式不正确',
'email.max' => '邮箱不能超过:rule个字符',
'phone.require' => '电话号码不能为空',
'phone.max' => '电话号码不能超过:rule个字符',
'website_url.url' => '网址格式不正确',
'website_url.max' => '网址不能超过:rule个字符',
'business_type.require' => '业务类型不能为空',
'business_type.max' => '业务类型不能超过:rule个字符',
'enterprise_size.require' => '企业规模不能为空',
'enterprise_size.max' => '企业规模不能超过:rule个字符',
'address.require' => '公司地址不能为空',
'address.max' => '公司地址不能超过:rule个字符',
'message.require' => '留言不能为空',
];
}

View File

@@ -26,12 +26,12 @@ class ContactUsMessageValidate extends Validate
* @var array
*/
protected $message = [
'name.require' => 'contact_message.validate_name_required',
'name.max' => 'contact_message.validate_name_max',
'email.require' => 'contact_message.validate_email_required',
'email.email' => 'contact_message.validate_email_email',
'email.max' => 'contact_message.validate_email_max',
'content.require' => 'contact_message.validate_content_required',
'content.max' => 'contact_message.validate_content_max'
'name.require' => '姓名不能为空',
'name.max' => '姓名不能超过:rule个字符',
'email.require' => '邮箱不能为空',
'email.email' => '邮箱格式不正确',
'email.max' => '邮箱不能超过:rule个字符',
'content.require' => '问题不能为空',
'content.max' => '问题不能超过:rule个字符'
];
}

View File

@@ -31,21 +31,21 @@ class ProductInquiryValidate extends Validate
* @var array
*/
protected $message = [
'first_name.require' => 'validate_first_name_require',
'first_name.max' => 'validate_first_name_max',
'last_name.require' => 'validate_last_name_require',
'last_name.max' => 'validate_last_name_max',
'email.require' => 'validate_email_require',
'email.email' => 'validate_email_email',
'email.max' => 'validate_email_max',
'phone.max' => 'validate_phone_max',
'country_name.require' => 'validate_country_name_require',
'country_name.max' => 'validate_country_name_max',
'corp_name.require' => 'validate_corp_name_require',
'corp_name.max' => 'validate_corp_name_max',
'industry.require' => 'validate_industry_require',
'industry.max' => 'validate_industry_max',
'message.require' => 'validate_message_require',
'message.max' => 'validate_message_max'
'first_name.require' => '名不能为空',
'first_name.max' => '名不能超过:rule个字符',
'last_name.require' => '姓不能为空',
'last_name.max' => '姓不能超过:rule个字符',
'email.require' => '邮箱不能为空',
'email.email' => '邮箱格式不正确',
'email.max' => '邮箱不能超过:rule个字符',
'phone.max' => '电话号码不能超过:rule个字符',
'country_name.require' => '国家不能为空',
'country_name.max' => '国家不能超过:rule个字符',
'corp_name.require' => '公司/组织不能为空',
'corp_name.max' => '公司/组织不能超过:rule个字符',
'industry.require' => '行业不能为空',
'industry.max' => '行业不能超过:rule个字符',
'message.require' => '询问内容不能为空',
'message.max' => '询问内容不能超过:rule个字符'
];
}

View File

@@ -1,99 +0,0 @@
{extend name="public/base" /}
{block name="title"}
{notempty name=":lang('aboutus_culture.title')"}<title>{:lang('aboutus_culture.title')}</title>
{else/}{__BLOCK__}{/notempty}
{/block}
{block name="style"}
<link rel="stylesheet" type="text/css" href="__CSS__/aboutus_culture.css" />
<link rel="stylesheet" type="text/css" href="__CSS__/animate.min.css" />
{/block}
{block name="main"}
<div class="culture_top">
{notempty name="focus_image"}
{notempty name="focus_image.link"}
<a href="{$focus_image.link}">
<img src="{$focus_image.image}" />
</a>
{else/}
<img src="{$focus_image.image}" />
{/notempty}
{notempty name="culture"}
<div class="culture_bril_con swt-Container">
{volist name="culture" id="cul" offset="0" length="3"}
<div class="culture_bril_div">
<div class="iconimg"><img src="{$cul.image}" /></div>
<div class="title">
<p>{$cul.title}</p>
</div>
<div class="subtitle">{$cul.desc|raw}</div>
</div>
{/volist}
</div>
{/notempty}
</div>
{notempty name="culture"}
<div class="culture_vision">
<div class="swt-Container">
<div class="title">
<!--Vision and Mission-->
</div>
{volist name="culture" id="cul" key="k" offset="3" mod="2"}
{eq name="mod" value="1"}
<div class="swt-Table img-responsive">
<div id="tab{$k}" class="Table-Row">
<div class="Table-Cell left"><img src="{$cul.image}" /></div>
<div class="Table-Cell center"></div>
<div class="Table-Cell right">
<p class="subtitle">{$cul.title}</p>
<p class="des">{$cul.desc|raw}</p>
</div>
</div>
</div>
{else /}
<div class="swt-Table img-responsive culture_vision_02">
<div id="tab{$k}" class="Table-Row">
<div class="Table-Cell left">
<p class="subtitle">{$cul.title}</p>
<p class="des">{$cul.desc|raw}</p>
</div>
<div class="Table-Cell center"></div>
<div class="Table-Cell right"><img src="{$cul.image}" /></div>
</div>
</div>
{/eq}
{/volist}
</div>
</div>
{/notempty}
{/block}
{block name="script"}
<script type="text/javascript">
$(document).ready(function() {
$('.culture_bril_div').addClass('animated fadeInUp');
var myelement = $('#tab1'); // the element to act on if viewable
goScroll(myelement);
var myelement2 = $('#tab2'); // the element to act on if viewable
goScroll(myelement2);
var myelement3 = $('#tab3'); // the element to act on if viewable
goScroll(myelement3);
function goScroll(obj){
$(window).scroll(function() {
if(isScrolledIntoView(obj)) {
$(obj).find('.left').addClass('animated fadeInLeft');
$(obj).find('.right').addClass('animated fadeInRight');
}
});
}
function isScrolledIntoView(elem) {
var docViewTop = $(window).scrollTop();
var docViewBottom = docViewTop + $(window).height();
var elemTop = $(elem).offset().top;
var elemBottom = elemTop + $(elem).height();
return (elemTop <= docViewBottom);
}
});
</script>
{/block}

View File

@@ -1,139 +0,0 @@
{extend name="public/base" /}
{block name="title"}
{notempty name="detail.seo_title"}<title>{$detail.seo_title}</title>{else /}{__BLOCK__}{/notempty}
{/block}
{block name="seo"}
{notempty name="detail.seo_keywords"}
<meta name="keywords" content="{$detail.seo_keywords}" />
<meta name="description" content="{$detail.seo_desc}" />
{else /}
{__BLOCK__}
{/notempty}
{/block}
{block name="style"}
<link rel="stylesheet" href="__CSS__/article_detail.css">
{/block}
{block name="main"}
<div class="orico_Page_articleDetail">
<!--内容 -->
<div class="articleDetailMain">
<div class="atmleft">
<div class="blog_title">
<h2>{$detail.title}</h2>
<p>{$detail.desc}</p>
</div>
<!-- 文本渲染-->
<div class="blog_content">{$detail.content|raw}</div>
</div>
<div class="atmright">
{notempty name="share_config"}
<div class="blog_share">
<h3>{:lang('article.detail_share')}</h3>
<div class="share_list">
{volist name="share_config" id="sc"}
<a class="atdit" {if condition="!empty($sc.is_blank) && $sc.is_blank.value == 1"}target="_blank"{/if} {notempty name="sc.url.value"}href="{$sc.url.value}"{/notempty}>
<img src="{$sc.image.value}" />
{eq name=":array_key_exists('triggered_qrcode', $sc)" value="true"}
<div class="triggered_qrcode">
<img src="{$sc.triggered_qrcode.value}" />
</div>
{/eq}
</a>
{/volist}
</div>
</div>
{/notempty}
<div class="repply">
<h3>{:lang('article.detail_leave_reply')}</h3>
<form action="{:url('article/comment', ['id' => $detail.id])}" method="POST" autocomplete="off">
<span>{:lang('article.detail_leave_reply_name')}</span>
<input class="form-control itinp new_name" type="text" name="name" style="text-indent: 10px;">
<span>{:lang('article.detail_leave_reply_email')}</span>
<input class="form-control itinp new_email" type="email" name="email" style="text-indent: 10px; margin-bottom:0;">
<p style="color: #C6C7C9; font-size: 0.75rem; margin-bottom: 0.625rem;">{:lang('article.detail_leave_reply_email_tip')}</p>
<span>{:lang('article.detail_leave_reply_comment')}</span>
<textarea class="form-control itinp new_comment" name="content" rows="3" style="text-indent: 10px;width: 98%; margin-top: 0.625rem;margin-bottom: 0.625rem;border: 1px solid #DBDBDB;"></textarea>
<div class="comment_btn" style="color:#ffffff;">{:lang('article.detail_leave_reply_submit')}</div>
</form>
</div>
</div>
</div>
{notempty name="$recommends"}
<div class="xq">
<!-- 猜您喜欢 -->
<div class="love">
<div class="love1">
<p class="tt">{:lang('article.detail_recommend')}</p>
<p><img src="__IMAGES__/1line.png" height="7"></p>
</div>
<ul class="love2">
{volist name="recommends" id="vo"}
<li>
<a href="{:url('article/detail', ['id' => $vo.id])}">
<div class="lvimg"><img src="{$vo.image}"></div>
<p class="lvtit">{$vo.title}</p>
</a>
</li>
{/volist}
<div class="clear"></div>
</ul>
</div>
</div>
{/notempty}
</div>
{/block}
{block name="script"}
<script type="text/javascript">
$(document).ready(function() {
$('.comment_btn').click(function() {
var form = $(this).parents('form');
var form_data = form.serialize();
$.ajax({
url: form.attr('action'),
type: 'POST',
data: form_data,
dataType: 'json',
success: function(data) {
alert(data.msg);
if (data.code == 0) {
window.location.reload();
}
}
})
})
// 滚动到猜你喜欢部分,右边提交信息不固定
$(window).scroll(function() {
// 获取元素引用
const blogContent = $('.blog_content');
const rightSidebar = $('.orico_Page_articleDetail .articleDetailMain .atmright');
// 计算 blog_content 底部位置
const contentBottom = blogContent.offset().top + blogContent.outerHeight();
// 计算视口底部位置
const windowBottom = $(window).scrollTop() + $(window).height();
// 当视口底部超过 blog_content 底部时
if (windowBottom >= contentBottom) {
rightSidebar.css('position', 'static'); // 移除固定定位
} else {
rightSidebar.css('position', 'fixed'); // 恢复固定定位
}
});
})
function shareCustomers(){
// 复制到粘贴板
const input = document.createElement('input')
input.setAttribute('readonly', 'readonly')
let url=window.location.href
input.setAttribute('value', url)
document.body.appendChild(input)
input.select()
if (document.execCommand('copy')) {
document.execCommand('copy')
alert('链接复制成功')
}
document.body.removeChild(input)
}
</script>
{/block}

View File

@@ -1,433 +0,0 @@
{extend name="public/base" /}
{block name="style"}
<link rel="stylesheet" type="text/css" href="__CSS__/index.css" />
<link rel="stylesheet" type="text/css" href="__CSS__/before-after.min.css" />
{/block}
{block name="main"}
<div class="orico_Page_index">
<div class="pageMain">
<!-- banner -->
{notempty name="focus_images"}
<div class="swiper-container bannerswiper">
<div class="swiper-wrapper">
{volist name="focus_images" id="focus"}
<div class="swiper-slide">
<a href="{$focus.link}" target="_blank"><img src="{$focus.image}" alt="{$focus.title}"></a>
</div>
{/volist}
</div>
<!-- 如果需要分页器 -->
<div class="swiper-pagination"></div>
<!-- 如果需要导航按钮 -->
<div class="swiper-button-prev"></div>
<div class="swiper-button-next"></div>
</div>
{/notempty}
<!-- 产品分类信息 -->
{notempty name="product_categorys"}
<div class="catMain">
{volist name="product_categorys" id="cate"}
<a class="catit" href="{$cate.link}">
<img src="{$cate.image}" src="catIcoImg" />
<span class="catName" {notempty name="cate.title_txt_color" }style="color:{$cate.title_txt_color};"
{/notempty}>{$cate.title}</span>
</a>
{/volist}
</div>
{/notempty}
<!-- 特色专题及公司实力 -->
{notempty name="featured_topics"}
<div class="featuredtopicsMain">
<div class="ftcontent">
{volist name="featured_topics" id="topic" mod="2"}
<a class="ftItme" href="{$topic.link}">
{if condition="$mod == '1'"}
<div class="ftItme_right">
<img src="{$topic.image}" />
</div>
<div class="ftItme_left">
<p>{$topic.title}</p>
<div class="subtitle">
<span>{:lang('index.view_all')} ></span>
<div class="tpicture"></div>
</div>
</div>
{else/}
<div class="ftItme_left">
<p>{$topic.title}</p>
<div class="subtitle">
<span>{:lang('index.view_all')}</span>
<div class="tpicture"></div>
</div>
</div>
<div class="ftItme_right">
<img src="{$topic.image}" />
</div>
{/if}
</a>
{/volist}
</div>
</div>
{/notempty}
<!-- 明星产品/热点产品 -->
{notempty name="featured_products"}
<div class="featuredProducts">
<p class="biaoti">{:lang('index.featured_products')}</p>
<div class="swiper fpSwiper">
<div class="swiper-wrapper">
{volist name="featured_products" id="product"}
<div class="swiper-slide picture">
<a class="primg">
<img src="{$product.cover_image}" />
</a>
<div class="fpptitle">{$product.name}</div>
<div class="subtitle">{$product.short_name}</div>
<a class="more">{:lang('index.learn_more')} ></a>
</div>
{/volist}
</div>
<div class="swiperasd">
<div class="swiper-container1">
<div class="slideshow-pag swiper-pagination"></div>
</div>
<div class="swiper-container swi1">
<img class="slideshow-btn swiper-button-next" src="static/index/temp_images/rightcheck.png">
<img class="slideshow-btn swiper-button-prev" src="static/index/temp_images/lefta.png">
</div>
</div>
</div>
</div>
{/notempty}
<!-- 视频宣传 -->
{notempty name="video"}
<div class="hotProduct">
<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>
</div>
<img src="{$video.image}" class="hotImg" />
</div>
{/notempty}
<!-- 场景介绍 -->
{notempty name="scenes"}
<div class="sceneIntroduction">
{volist name="scenes" id="scene"}
<div class="sceneitem">
<div class="sceneInfo">
<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}>
{$scene.desc|raw}</p>
<a class="sceneMore" href="{$scene.link}">{:lang('index.learn_more')} ></a>
</div>
<div style="background-image: url('{$scene.image}');" class="sceneimg"></div>
</div>
{/volist}
</div>
{/notempty}
<!-- orico科技 -->
<div class="oricoTechnology">
<p class="ottitle">{:lang('index.orico_technology')}</p>
<span class="otsbtitle">{:lang('index.orico_technology_desc')}</span>
<div class="beforeafter ba-slider">
<!-- 对比前的图片 -->
<img src="static/index/images/indeximg1.jpg">
<div class="resize">
<!-- 对比后的图片 -->
<img src="static/index/images/indeximg2.jpg">
</div>
<!-- 可拖动的分隔条 -->
<span class="handle"></span>
</div>
</div>
<!-- 品牌故事 -->
{notempty name="brand_story"}
<div class="brandStory">
<div class="swiper brandStoryswiper">
<div class="swiper-wrapper">
{volist name="brand_story" id="story"}
<div class="swiper-slide bsitem">
<div class="itmImg">
<img src="{$story.image}" class="bsImg" />
</div>
<div class="bsinf">
<div class="bstitle" {notempty name="story.title_txt_color" }style="color:{$story.title_txt_color};"
{/notempty}>{$story.title}</div>
<div class="bssubtitle" {notempty name="story.desc_txt_color" }style="color:{$story.desc_txt_color};"
{/notempty}>{$story.desc|raw}</div>
<a class="bsmore" href="{$story.link}">{:lang('index.learn_more')} ></a>
</div>
</div>
{/volist}
</div>
<div class="swiperasd bs_swiperasd" id="timeline">
<div class="bs_swcontainer">
<div class="swiper-pagination bs_pagination"></div>
<hr>
{volist name="brand_story" id="story" key="k"}
<span class="time">{$story.year}</span>
{/volist}
</div>
<div class="swiper-container bs_bts">
<img class="slideshow-btn swiper-button-next" src="static/index/temp_images/rightcheck.png" alt="" />
<img class="slideshow-btn swiper-button-prev " src="static/index/temp_images/lefta.png" alt="" />
</div>
</div>
</div>
</div>
{/notempty}
<!-- 数据统计-->
{notempty name="data_statistics"}
<div class="oricoDataStatistics">
<div class="odsmain">
{volist name="data_statistics" id="ods"}
<div class="odsItem">
<h1 {notempty name="ods.desc_txt_color" }style="color:{$ods.desc_txt_color};" {/notempty}>{$ods.desc|raw}</h1>
<h3 {notempty name="ods.title_txt_color" }style="color:{$ods.title_txt_color};" {/notempty}>{$ods.title}</h3>
</div>
{/volist}
</div>
</div>
{/notempty}
<!-- 文章轮播 -->
{notempty name="recommend_articles"}
<div class="oricoPub">
<div class="swiper pubswiper">
<div class="swiper-wrapper">
{volist name="recommend_articles" id="article"}
<div class="swiper-slide pubSwitem">
<a class="pubimgdiv" href="{:url('article/index', ['id' => $article.id])}">
<img src="{$article.image}" class="pubimg" />
</a>
<a class="pubinfo">
<span>{$article.title}</span>
</a>
</div>
{/volist}
</div>
<div class="swiperasd pubswiperasd">
<div class="swiper-container">
<img class="slideshow-btn swiper-button-next" src="static/index/temp_images/rightcheck.png">
<img class="slideshow-btn swiper-button-prev" src="static/index/temp_images/lefta.png">
</div>
</div>
</div>
</div>
{/notempty}
<!-- FAQ-->
{notempty name="recommend_faq"}
<div class="oricoFQA">
<div class="fqaleft">
<h1 class="title">{:lang('index.faq')}</h1>
<p class="dec">{:lang('index.faq_short_desc')}</p>
<p class="sudec">{:lang('index.faq_desc')}</p>
</div>
<div class="fqaright">
<ul class="accordion">
{volist name="recommend_faq" id="faq"}
<li class="fqali">
<div class="fqa-question">
<h3>{$faq.question} </h3>
<span class="xiala">+</span>
</div>
<div class="fqa-answer">
<p>{$faq.answer|raw}</p>
</div>
</li>
{/volist}
</ul>
</div>
</div>
{/notempty}
<!-- 底部固定提示 -->
{eq name="Request.cookie.think_lang" value="en-us"}
<div class="oricofixd-info">
<div class="ofiinfo">We use cookies to ensure you get the best experience on our website. By
continuing to browse, you agree to our use of cookies.</div>
<div class="ofibt"><button>OK,got it!</button></div>
<div class="oficlose"><span class="close-btn">×</span></div>
</div>
{/eq}
</div>
</div>
{/block}
{block name="script"}
<script>
$(document).ready(function () {
// 图片左右移动显示全部
$('.ba-slider').beforeAfter({
startPercent: 50, // 初始分隔条位置为 50%
handle: '.handle', // 指定分隔条元素的选择器
resize: '.resize' // 指定可调整大小部分的选择器
});
// 底部关闭
$(".oficlose").on("click", function () {
$(".oricofixd-info").hide();
});
// 视频
const video = $('#oricoVideo');
const videoContainer = $('.hotvideo');
const img = $('.hotImg');
// 监听视频加载完成事件
video.on('canplaythrough', function() {
// 显示视频容器,隐藏图片
videoContainer.css('display', 'block');
img.hide();
console.log('视频可以流畅播放');
});
// 处理视频加载失败(可选)
video.on('error', function() {
// 可在此添加失败提示,如显示错误信息或保留图片
img.show();
videoContainer.css('display', 'none');
console.log('视频加载或播放出错');
});
});
$(function () {
// banner轮播
var mySwiper = new Swiper('.bannerswiper', {
// 配置选项
loop: true,
autoplay: {
delay: 3000,
},
pagination: {
el: '.swiper-pagination',
},
navigation: {
nextEl: '.swiper-button-next',
prevEl: '.swiper-button-prev',
},
});
var fpSwiper = new Swiper(".fpSwiper", {
slidesPerView: 3,
spaceBetween: 30,
slidesPerGroup: 1,
loop: true,
autoplay: {
delay: 5000,
pauseOnMouseEnter: true,
disableOnInteraction: false,
},
slidesPerView: "auto",
centeredSlides: true,
loopFillGroupWithBlank: true,
loopAdditionalSlides: 3,
pagination: {
el: ".swiper-pagination",
type: "progressbar",
},
navigation: {
nextEl: ".swiper-button-next",
prevEl: ".swiper-button-prev",
},
});
//品牌故事轮播
var brandStoryswiper = new Swiper(".brandStoryswiper", {
pagination: {
el: ".swiper-pagination",
},
navigation: {
nextEl: ".swiper-button-next",
prevEl: ".swiper-button-prev",
},
});
// 计算品牌故事轮播个数样式调整
function calculateDisplayValue (n) {
return 8 - n;
}
// 动态调整分页点和年份位置
function adjustTimeline () {
const slideCount = brandStoryswiper.slides.length; // 获取轮播项个数
if (slideCount === 0) return;
// 计算分页点间距
const bulletMargin = ((100 / slideCount) - 2) + "%";
$(".orico_Page_index .pageMain .brandStory .bs_swiperasd .bs_swcontainer .bs_pagination .swiper-pagination-bullet")
.css("margin-right", bulletMargin);
// 计算年份位置固定间隔21%
const timeSpans = $(".orico_Page_index .pageMain .brandStory .bs_swiperasd .bs_swcontainer .time");
var tag = 0
var percent = 0
var basenum = calculateDisplayValue(slideCount)
timeSpans.each(function (index) {
if (index == 1) {
tag = ((100 / slideCount)) * index - (index > 0 ? basenum : 0)
percent = tag
}
if (index > 1) {
percent = tag * index
}
$(this).css("left", `${percent}%`);
});
}
// 初始化时调用
adjustTimeline();
// 窗口Resize时重新计算可选
$(window).on("resize", adjustTimeline);
// 宣传banner
var pubswiper = new Swiper(".pubswiper", {
loop: true,
autoplay: {
delay: 5000,
pauseOnMouseEnter: true,
disableOnInteraction: false,
},
//slidesPerView: 1,
slidesPerView: "auto",
centeredSlides: true,
spaceBetween: 32,
pagination: {
el: ".swiper-pagination",
click: true
},
navigation: {
nextEl: ".swiper-button-next",
prevEl: ".swiper-button-prev",
},
});
// FAQ问答展开收起
$(".fqali").on('click', function () {
if ($(this).children("div.fqa-answer").is(':visible')) {
$(".fqali").removeClass('active');
$(".fqa-answer").hide();
$(".text-name").addClass('text-hidden');
$(".xiala").text('+');
} else {
$(".fqali").removeClass('active');
$(".fqa-answer").hide();
$(".text-name").addClass('text-hidden')
$(".xiala").text('+');
$(this).addClass('active');
$(this).children('div.fqa-answer').show();
$(this).children('div.fqa-question').find('span').text('-');
$(this).children('div.fqa-question').find('h3').removeClass('text-hidden');
}
})
// 首先隐藏视频元素和加载中的图片 要放开注释
$("#hotvideo").hide();
// 监听视频的加载事件
setTimeout(function () {
$("#hotvideo").on("load", function () {
// 视频加载完成时,显示视频元素,隐藏加载中的图片
$("#hotvideo").show();
$("#hotImg").hide();
});
}, 1000);
// 监听视频的加载失败事件
setTimeout(function () {
$("#hotvideo").on("error", function () {
// 视频加载失败时,显示加载中的图片,隐藏视频元素
$("#hotImg").show();
$("#videoElement").hide();
});
}, 1500);
});
</script>
{/block}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -0,0 +1,53 @@
{extend name="public/base" /}
{block name="style"}
<link rel="stylesheet" type="text/css" href="__CSS__/attachment_index.css" />
{/block}
{block name="main"}
<div class="oricoEGapp">
<!-- 内容-->
<div class="margin-45"></div>
<!--search-->
<div class="menu mobile-search margin-top-90">
<div class="search">
<form action="{:url('attachment/index')}" method="get">
<div class="search margin-bottom-30">
<button class="updown_search_btn" type="sumbit">
<span class="icon-search-svg"></span>
</button>
<input class="form-control" name="keyword" placeholder="{:lang_i18n('全站搜索')}" value="" type="text" />
</div>
</form>
</div>
</div>
<!--软件下载-->
<div class="download-title">{:lang_i18n('软件下载')}</div>
<!--循环产品列表-->
{notempty name="attachements"}
{volist name="attachements" id="att"}
<div class="download-bg clearfix">
<div class="download-left">
<img src="{:thumb($att.image)}" alt="{$att.name}">
</div>
<div class="download-right">
<div class="font-48">{$att.name}</div>
<div class="down-gray">
<p>{:lang_i18n('支持型号')}: {$att.applicable_to}</p>
<p>{:lang_i18n('支持系统')}: {$att.support_platform}</p>
</div>
{notempty name="att.attach"}
{volist name="att.attach" id="ch"}
<div class="down-btn">
<a href="{$ch.file_path}" data-cod="dl" target="_blank">
<span class="l_button">{$ch.btn_name}</span>
</a>
</div>
{/volist}
{/notempty}
</div>
</div>
{/volist}
<!-- 分页-->
<div class="Pages">{$page|raw}</div>
{/notempty}
</div>
{/block}

View File

@@ -0,0 +1,41 @@
{extend name="public/base" /}
{block name="style"}
<link rel="stylesheet" type="text/css" href="__CSS__/attachment_video.css" />
{/block}
{block name="main"}
<div class="oricoEGapp">
<!-- 主体内容-->
<div class="oricoEGapp-softDrviersVideo">
<div class="topbanner">
<img src="__IMAGES__/video-banner.webp" class="bannerimg" />
<span class="bannertitle">{:lang_i18n('软件和驱动程序')}</span>
</div>
<!-- 分类切换-->
<div class="tabs">
{notempty name="video_categorys"}
{volist name="video_categorys" id="va"}
<a href="{:url('attachment/video', ['id' => $va.id])}"><div class="tabit active">{$va.name}</div></a>
{/volist}
{/notempty}
</div>
<div class="infolist">
{notempty name="videos"}
{assign name="flat_videos" value=":array_flatten($videos->items())" /}
{volist name="flat_videos" id="vo"}
<div class="vd-item">
<video controls="" poster="{$vo.image|default=''}">
<source src="{$vo.video}" type="video/mp4">
{:lang_i18n('您的浏览器不支持 video 标签。')}
</video>
<div class="texts">
<span class="t1">{$vo.name}</span>
<span class="t2">{$vo.desc}</span>
</div>
</div>
{/volist}
<div>{$page|raw}</div>
{/notempty}
</div>
</div>
</div>
{/block}

View File

@@ -0,0 +1,97 @@
{extend name="public/base" /}
{block name="style"}
<link rel="stylesheet" type="text/css" href="__CSS__/contactus_bulkbuy.css" />
{/block}
{block name="main"}
<div class="oricoEGapp">
<div class="bdpage" style="background: #fff;border-radius: 8px;padding-top: 50px;">
<div class="bd_main bd_main1 bd_main2">
<h1 class="t1 sfbt1">{:lang_i18n('批量购买')}</h1>
<form action="" method="post" autocomplete="off">
<!--内容-->
<div class="bd_ct ">
<div class="bd_from" style="padding: 0 16px;">
<div class="theit">
<div class="bditem">
<label class="itlable">{:lang_i18n('公司名称')}<span class="redtag">*</span></label>
<input type="text" name="corp_name" class="form-control itinp companyName" placeholder="{:lang_i18n('法定营业名称')}">
</div>
</div>
<div class="theit">
<div class="bditem">
<label class="itlable">{:lang_i18n('官方网站')}</label>
<input type="text" name="url" class="form-control itinp url" placeholder="{:lang_i18n('请粘贴网址')}">
</div>
</div>
<div class="theit">
<div class="bditem">
<label class="itlable">{:lang_i18n('姓名')}<span class="redtag">*</span></label>
<input type="text" name="first_name" class="form-control itinp firstname" placeholder="{:lang_i18n('名')}">
<input type="text" name="last_name" class="form-control itinp lastname" placeholder="{:lang_i18n('姓')}" style="margin-top: 8px;">
</div>
</div>
<div class="theit">
<div class="bditem">
<label class="itlable">{:lang_i18n('邮箱')}<span class="redtag">*</span></label>
<input type="text" name="email" class="form-control itinp email" placeholder="{:lang_i18n('请输入邮箱')}">
</div>
</div>
<div class="theit">
<div class="bditem bditem1">
<label class="itlable">{:lang_i18n('电话号码')}</label>
<input type="text" name="phone" class="form-control itinp phone" placeholder="{:lang_i18n('请输入电话号码')}">
</div>
</div>
<div class="theit">
<div class="bditem bditem1">
<label class="itlable">{:lang_i18n('您对哪个产品品类感兴趣?')}<span class="redtag">*</span></label>
<div class="sfbchecks">
{notempty name="interested"}
{volist name="interested" id="it"}
<label class="cit">
<input name="interested[]" type="checkbox" value="{$it}" class="sfbcheckboxit" />{$it}
</label>
{/volist}
{/notempty}
</div>
</div>
</div>
<div class="theit">
<div class="bditem bditem1">
<label class="itlable">{:lang_i18n('留言')}<span class="redtag">*</span></label>
<textarea name="message" class="ittextarea ittextarea2 message" placeholder="{:lang_i18n('请输入留言')}"></textarea>
</div>
</div>
</div>
</div>
<!-- 提交-->
<div class="bttj" id="send">{:lang_i18n('提交')}</div>
</form>
</div>
</div>
</div>
{/block}
{block name="script"}
<script type="text/javascript">
$(function(){
$("#send").click(function(){
var form = $(this).parents("form");
$.ajax({
url: "{:url('contactus/bulkbuy')}",
type: "post",
dataType: "json",
data: form.serialize(),
success: function(r){
if(r.code == 0){
form.get(0).reset();
}
alert(r.msg);
},
error: function(e){
console.error(e);
}
})
})
})
</script>
{/block}

View File

@@ -0,0 +1,107 @@
{extend name="public/base" /}
{block name="style"}
<link rel="stylesheet" type="text/css" href="__CSS__/contactus_distributor.css" />
{/block}
{block name="main"}
<div class="oricoEGapp">
<!-- 内容-->
<div class="cooperapp_bdpage" style="background:#F2F2F2;">
<div class="cooperapp_bd_main" style="margin-top: 3.75rem;">
<form action="" method="post">
<h1 class="cooperapp_t1">{:lang_i18n('成为经销商')}</h1>
<p class="cooperapp_s1">{:lang_i18n('准备好加入我们了吗?<br> 在下面输入您的详细信息我们的销售团队将在2个工作日内回复您。')}</p>
<!--内容-->
<div class="bd_ct cooperapp_bd_ct">
<div class="thimg">
<img src="__IMAGES__/distributor_focus_image.webp" alt="" srcset="" class="cooperapp_bdimg">
</div>
<div class="bd_from">
<div class="theit">
<div class="bditem">
<label class="itlable">{:lang_i18n('公司名称')}<span class="redtag">*</span></label>
<input type="text" name="corp_name" class="form-control itinp companyName" placeholder="{:lang_i18n('请输入公司名称')}" />
</div>
</div>
<div class="theit">
<div class="bditem">
<label class="itlable">{:lang_i18n('电子邮件')}<span class="redtag">*</span></label>
<input type="text" name="email" class="form-control itinp email" placeholder="{:lang_i18n('请输入邮箱')}" />
</div>
</div>
<div class="theit">
<div class="bditem bditem1">
<label class="itlable">{:lang_i18n('电话号码')}<span class="redtag">*</span></label>
<input type="text" name="phone" class="form-control itinp mphone" placeholder="{:lang_i18n('请输入电话号码')}" />
</div>
</div>
<div class="theit">
<div class="bditem">
<label class="itlable">{:lang_i18n('业务类型')}<span class="redtag">*</span></label>
<select name="business_type" class="form-control itinp business_type">
{volist name="types" id="ty"}
<option value="{$ty.value}">{$ty.name}</option>
{/volist}
</select>
</div>
</div>
<div class="theit">
<div class="bditem">
<label class="itlable">{:lang_i18n('在线商店网址')}</label>
<input type="text" name="website_url" class="form-control itinp url" placeholder="{:lang_i18n('请输入网址')}" />
</div>
</div>
<div class="theit">
<div class="bditem bditem1">
<label class="itlable">{:lang_i18n('企业规模')}<span class="redtag">*</span></label>
<select name="enterprise_size" data-pf-type="FormInput" class="form-control itinp enterprise_size">
{volist name="sizes" id="si"}
<option value="{$si.value}">{$si.name}</option>
{/volist}
</select>
</div>
</div>
<div class="theit">
<div class="bditem bditem1">
<label class="itlable">{:lang_i18n('公司地址')}<span class="redtag">*</span></label>
<input type="text" name="address" class="form-control itinp address" placeholder="{:lang_i18n('请输入地址')}">
</div>
</div>
<div class="theit">
<div class="bditem bditem1">
<label class="itlable">{:lang_i18n('留言')}<span class="redtag">*</span></label>
<textarea name="message" class="ittextarea message" placeholder="{:lang_i18n('请输入留言')}"></textarea>
</div>
</div>
</div>
</div>
<!-- 提交-->
<div class="bttj" id="send">{:lang_i18n('提交')}</div>
</form>
</div>
</div>
</div>
{/block}
{block name="script"}
<script type="text/javascript">
$(function () {
$("#send").click(function () {
var form = $(this).parents("form");
$.ajax({
url: "{:url('contactus/distributor')}",
type: "post",
data: form.serialize(),
dataType: "json",
success: function (r) {
if (r.code == 0) {
form.get(0).reset();
}
alert(r.msg);
},
error: function (e) {
console.error(e);
}
})
})
})
</script>
{/block}

View File

@@ -0,0 +1,71 @@
{extend name="public/base" /}
{block name="style"}
<link rel="stylesheet" type="text/css" href="__CSS__/contactus_index.css" />
{/block}
{block name="main"}
<div class="oricoEGapp">
<!-- 内容-->
<div class="oricoEGapp-Contact">
<!--banner-->
{notempty name="focus_image.image"}
<div class="banner img-responsives margin-top-90">
<img src="{$focus_image.image}" />
</div>
{/notempty}
<div class="narskfPage">
{notempty name="info_datas"}
<div class="narskf-content">
{assign name="chunks" value=":array_chunk($info_datas, 2)" /}
{assign name="sizeof_chunks" value=":count($chunks)" /}
{volist name="chunks" id="ch" key="k"}
{if condition="$k elt ($sizeof_chunks - 1)"}
<div class="narskf-ct-row">
{volist name="ch" id="item"}
<div class="narskfit" {notempty name="item.link"}onclick="location.href='{$item.link}'"{/notempty}>
<img src="{$item.image}" class="narskico-img" />
<span class="narskf-title" {:style(['color' => $item['title_txt_color']])}>{$item.title}</span>
{notempty name="item.desc"}
<span class="narskf-sm" {:style(['color' => $item['desc_txt_color']])}>{$item.desc|raw}</span>
{/notempty}
{notempty name="item.extra_image"}
<div class="narskfactive-ewm" style="display: none;">
<img src="{$item.extra_image}" alt="" />
</div>
{/notempty}
</div>
{/volist}
</div>
{else/}
{volist name="ch" id="item"}
<div class="narskf-ct-row">
<div class="narskfit narskfit2">
<img src="{$item.image}" class="narskico-img">
<div class="narskfit2-ct">
<span class="narskf-title" {:style(['color' => $item['title_txt_color']])}>{$item.title}</span>
<span class="narskf-sm" {:style(['color' => $item['desc_txt_color']])}>{$item.desc|raw}</span>
</div>
</div>
</div>
{/volist}
{/if}
{/volist}
</div>
{/notempty}
</div>
</div>
</div>
{/block}
{block name="script"}
<script type="text/javascript">
$(document).ready(function() {
$('.narskfit').on('click', function() {
var $ewm = $(this).find('.narskfactive-ewm');
if ($ewm.css('display') === 'none') {
$ewm.css('display', 'flex');
} else {
$ewm.css('display', 'none');
}
});
});
</script>
{/block}

View File

@@ -0,0 +1,102 @@
{extend name="public/base" /}
{block name="style"}
<link rel="stylesheet" type="text/css" href="__CSS__/contactus_message.css" />
{/block}
{block name="main"}
<div class="oricoEGapp">
<!-- 内容 -->
<div class="oricoEGapp-Contact">
<!-- banner -->
{notempty name="focus_image"}
<div class="banner img-responsives margin-top-90">
<a {notempty name="focus_image.link"} href="{$focus_image.link}" {/notempty}>
<img src="{$focus_image.image}" />
</a>
</div>
{/notempty}
<!-- 我们的信息 -->
<div class="content">
<div class="title">{:lang_i18n('我们的信息')}</div>
{notempty name="our_information"}
{assign name="first_info" value="$our_information|array_shift"/}
<div class="info">
{notempty name="first_info.image"}
<div class="left"><img src="{$first_info.image}" /></div>
{/notempty}
<div class="right">
<div class="des">{$first_info.desc|raw}</div>
</div>
</div>
{assign name="chunk_info" value="$our_information|array_chunk=2"}
{volist name="chunk_info" id="chunk"}
<div class="line"></div>
<div class="info">
{notempty name="chunk.0.image"}
<div class="left"><img src="{$chunk.0.image}" /></div>
{/notempty}
<div class="right">
{volist name="chunk" id="info" key="k"}
<div class="info_title {neq name='k' value='1'}m-t-20{/neq}">{$info.title}:</div>
<div class="des"> {$info.desc|raw}</div>
{/volist}
</div>
</div>
{/volist}
{/notempty}
</div>
<!-- question -->
<div class="content">
<div class="title">{:lang_i18n('提交您的问题')}</div>
<form action="" method="post" autocomplete="off">
<div class="question">
<div class="title">{:lang_i18n('姓名')} <span class="red">*</span></div>
<div class="des">
<input type="text" name="name" id="name" placeholder="{:lang_i18n('请输入内容...')}" class="form-control itinp">
</div>
</div>
<div class="question">
<div class="title">{:lang_i18n('电子邮箱')} <span class="red">*</span></div>
<div class="des">
<input type="text" name="email" id="email" placeholder="{:lang_i18n('请输入内容...')}" class="form-control itinp">
</div>
</div>
<div class="question">
<div class="title">{:lang_i18n('您的问题')} <span class="red">*</span></div>
<div class="des">
<textarea rows="6" name="content" id="message" class="ittextarea message" placeholder="{:lang_i18n('请输入内容...')}"></textarea>
</div>
</div>
<div class="question">
<span class="send" id="send">{:lang_i18n('发送')}</span>
</div>
</form>
</div>
<!-- Become a Distributor -->
<div class="contact_b"><a href="{:url('contactus/distributor')}">{:lang_i18n('成为经销商')}</a></div>
</div>
</div>
{/block}
{block name="script"}
<script type="text/javascript">
$(function () {
$("#send").click(function () {
var form = $(this).parents("form");
$.ajax({
url: "{:url('contactus/message')}",
type: "post",
data: form.serialize(),
dataType: "json",
success: function (r) {
if (r.code == 0) {
form.get(0).reset();
}
alert(r.msg);
},
error: function (e) {
console.error(e.msg);
}
})
})
})
</script>
{/block}

View File

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

View File

@@ -0,0 +1,325 @@
{extend name="public/base"/}
{block name="style"}
<link rel="stylesheet" type="text/css" href="__CSS__/index.css" />
{/block}
{block name="main"}
<div class="oricoEGapp">
<!--首页 -->
<div class="oricoEGapp-index">
<!-- banner-->
<div class="oidx-banner">
{notempty name="focus_images"}
<div class="swiper-container bannerswiper">
<div class="swiper-wrapper">
{volist name="focus_images" id="fi"}
<div class="swiper-slide">
<a href="{$fi.link}"><img src="{$fi.image}" alt="{$fi.title}"></a>
</div>
{/volist}
</div>
<!-- 如果需要分页器 -->
<div class="swiper-pagination"></div>
</div>
{/notempty}
</div>
<!-- 四大分类 -->
{notempty name="product_categorys"}
<div class="oidx-cate">
{volist name="product_categorys" id="pct"}
<div class="cateit">
<a href="{$pct.link}">
<img src="{$pct.image}" />
<span {:style(['color'=>$pct['title_txt_color']])}>{$pct.title}</span>
</a>
</div>
{/volist}
</div>
{/notempty}
<!-- 特色专题及公司实力 -->
{notempty name="featured_topics"}
<div class="oidx-gg">
{volist name="featured_topics" id="ft"}
<div class="index-img">
<img src="{$ft.image}">
<div class="Innew-text wow animated bounceInLeft animated">
<p class="title">{$ft.title}</p>
<div class="more">
<a href="{$ft.link}" target="_blank">
{:lang_i18n('查看所有')} <i class="icon-right-svg"></i>
</a>
</div>
</div>
</div>
{/volist}
</div>
{/notempty}
<!-- 明星产品/热点产品 -->
{notempty name="featured_products"}
<div class="oidx-FP">
<div class="Inpro-text">
<p class="title">{:lang_i18n('明星产品/热点产品')}</p>
</div>
<div class="m_Container">
<div class="swiper-container FPswiper">
<div class="swiper-wrapper text_center">
{volist name="featured_products" id="fp"}
<div class="swiper-slide inproimg ">
<a href="{:url('product/detail',['id'=>$fp.id])}"><img src="{$fp.cover_image}" alt="" /></a>
<div class="inprotext">
<p class="text_center title">{$fp.name}</p>
<p class="t-f16"></p>
<p class="timeblue">
<a href="{:url('product/detail',['id'=>$fp.id])}">
{:lang_i18n('了解更多')} <img src="__IMAGES__/more-r.png">
</a>
</p>
</div>
</div>
{/volist}
</div>
<!-- 如果需要分页器 -->
<div class="swiper-pagination"></div>
</div>
</div>
</div>
{/notempty}
<!-- 专题图片展示 -->
<div class="oidx-ztpictureshow">
<!-- 视频 -->
{notempty name="video"}
<div class="vedio_in">
<img src="{$video.image}" />
<iframe class="margin-top-20" width="100%" style="z-index:9999;"
src="{$video.video}" title="YouTube video player" frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowfullscreen="" id="videoElement"></iframe>
</div>
{/notempty}
{notempty name="scenes"}
{volist name="scenes" id="sc"}
<div class="indocking">
<a href="{$sc.link}"><img src="{$sc.image}" /></a>
<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=" margin-top-14 f_weight_400 timedesin" {:style(['color'=>$sc['desc_txt_color']])}>{$sc.desc|raw}</p>
<p class=" margin-top-20 f_weight_400">
<a href="{$sc.link}" class="timeblue"> {:lang_i18n('了解更多')} <img src="__IMAGES__/more-r.png"></a>
</p>
</div>
</div>
{/volist}
{/notempty}
</div>
<!-- orico技术 -->
<div class="oidx-tcly">
<div class="Tech-text">
<h3>{:lang_i18n('Orico 技术')}</h3>
<p>{:lang_i18n('强大功能、简单使用')}</p>
</div>
<div class="section section-blends section-full">
<div class="section-stack section-stack--center ">
<div class="section-stack__main">
<div class="before-after shadow text-custom ba-slider">
<img src="__IMAGES__/back-img01.jpg">
<div class="resize">
<img src="__IMAGES__/back-img02.jpg" style="width: 390px;">
</div>
<span class="handle"></span>
</div>
</div>
</div>
</div>
</div>
<!-- 品牌故事 -->
{notempty name="brand_story"}
<div class="oidx-times">
<section class="cd-horizontal-timeline loaded">
<div class="events-content">
<ul>
{volist name="brand_story" id="bs" key="k"}
<li class="{eq name='k' value='1'}selected{/eq}">
<img src="{$bs.image}">
<div class="position_a text_center">
<p class=" timetitle" {:style(['color'=>$bs['title_txt_color']])}>{$bs.title} </p>
<p class=" margin-top-14 f_weight_400 timedesin" {:style(['color'=>$bs['desc_txt_color']])}>{$bs.desc|raw}</p>
<p class=" margin-top-20 f_weight_400">
<span class=" timeblue">
<a href="{$bs.link}">{:lang_i18n('了解更多')}<img src="__IMAGES__/more-r.png"></a>
</span>
</p>
</div>
</li>
{/volist}
</ul>
</div>
<div class="timeline">
<div class="events-wrapper">
<div class="events">
<ol>
{volist name="brand_story" id="bs" key="k"}
<li>
<a class="{eq name='k' value='1'}selected{/eq}">{$bs.year}</a>
</li>
{/volist}
</ol>
<span class="filling-line"></span>
</div>
</div>
</div>
</section>
</div>
{/notempty}
<!-- 数据统计 -->
{notempty name="data_statistics"}
<div class="oidx-total">
<div class="num-bg clearfix">
<ul>
{volist name="data_statistics" id="ds"}
<li>
<h3 {:style(['color'=>$ds['desc_txt_color']])}>{$ds.desc|raw}</h3>
<p {:style(['color'=>$ds['title_txt_color']])}>{$ds.title}</p>
</li>
{/volist}
</ul>
</div>
</div>
{/notempty}
<!-- 文章轮播 -->
{notempty name="recommend_articles"}
<div class="oidx-imgqh">
<div class="swiper-container imgqhswiper">
<div class="swiper-wrapper">
{volist name="recommend_articles" id="ra"}
<div class="swiper-slide">
<a href="{:url('article/detail', ['id' => $ra.id])}">
<div class="title pos-text">{$ra.title|raw}</div>
<img src="{$ra.image}" alt="" />
</a>
</div>
{/volist}
</div>
<!-- 如果需要分页器 -->
<div class="swiper-pagination"></div>
</div>
</div>
{/notempty}
<!-- 常见问题 -->
{notempty name="recommend_faq"}
<div class="oidx-fqa">
<div class="faq">
<div class="faq-title ">
<h3>{:lang_i18n('常见问题')}</h3>
<h5>{:lang_i18n('回答您最关心的问题')}</h5>
<p>{:lang_i18n('客服团队的工作时间周一到周五早9点到晚6点 平均应答时间24小时内')}</p>
</div>
{volist name="recommend_faq" id="rq"}
<dl>
<dt class="cursor_p">
{$rq.question}<i class="rotate icon-add-svg"></i>
</dt>
<dd>{$rq.answer|raw}</dd>
</dl>
{/volist}
</div>
</div>
{/notempty}
</div>
</div>
{/block}
{block name="script"}
<script src="__JS__/before-after.min.js" type="text/javascript"></script>
<script type="text/javascript">
//banner轮播
var bannerswiper = new Swiper('.bannerswiper', {
// 配置选项
loop: true,
autoplay: {
delay: 3000,
},
pagination: {
el: '.swiper-pagination',
}
});
// 分类轮播
var FPswiper = new Swiper(".FPswiper", {
loop: true, //允许从第一张到最后一张,或者从最后一张到第一张 循环属性
slidesPerView: 2, // 设置显示一张
centeredSlides: true, //使当前图片居中显示
centeredSlidesBounds: true, //使左右两边的图片始终贴合边缘
autoplay: true, //可选选项,自动滑动
initialSlide: 0, //默认显示第二张图片索引从0开始
speed: 2000, //设置过度时间
autoplay: false,
});
// 图片切换
var imgqhswiper = new Swiper('.imgqhswiper', {
loop: true, //允许从第一张到最后一张,或者从最后一张到第一张 循环属性
effect: 'coverflow', //轮播效果coverflow覆盖流效果
slidesPerView: 2,
centeredSlides: true,
slidesOffsetBefore: 0, //偏移使第一张图片向右偏移150px */
autoplay: true, //可选选项,自动滑动
speed: 2000, //设置过度时间
autoplay: true,
pagination: {
el: '.swiper-pagination',
clickable: true,
dynamicBullets: true,
},
});
$(function() {
//视频播放
var videos = $(".vedio_in");
videos.on("click", function() {
var elm = $(this),
conts = elm.contents(),
le = conts.length,
ifr = null;
for (var i = 0; i < le; i++) {
if (conts[i].nodeType == 8) ifr = conts[i].textContent;
}
elm.addClass("player").html(ifr);
elm.off("click");
});
// 图片覆盖左右移动
$('.before-after').beforeAfter();
// 为日期链接添加点击事件处理函数
$('.events a').on('click', function() {
// 移除所有日期链接的 selected 类
$('.events a').removeClass('selected');
// 移除所有内容列表项的 selected 类
$('.events-content li').removeClass('selected');
// 为当前点击的日期链接添加 selected 类
$(this).addClass('selected');
// 获取当前点击链接的索引
var index = $('.events a').index(this);
// 为对应的内容列表项添加 selected 类
$('.events-content li').eq(index).addClass('selected');
});
// fqa
// 为所有带有 cursor_p 类的 dt 元素添加点击事件处理函数
$('.cursor_p').on('click', function() {
// 切换对应的 dd 元素的显示和隐藏状态
$(this).next('dd').slideToggle(400);
// 获取当前 dt 元素内的图标元素
var icon = $(this).find('i');
// 切换图标类名
if (icon.hasClass('icon-add-svg')) {
icon.removeClass('icon-add-svg').addClass('icon-jian-svg');
} else {
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>
{/block}

View File

@@ -0,0 +1,93 @@
{extend name="public/base" /}
{block name="style"}
<link rel="stylesheet" type="text/css" href="__CSS__/product_category.css" />
{/block}
{block name="main"}
<div class="oricoEGapp">
<!-- banner轮播图 -->
{notempty name="focus_image"}
<div>
{volist name="focus_image" id="fi"}
<a {notempty name="fi.link" }href="{$fi.link}"{/notempty}>
<img src="{$fi.image}" style="width: 100%;margin-top: 3.5rem;"/>
</a>
{/volist}
</div>
{/notempty}
<div class="oricoEGapp-catelists">
<!-- 二级分类导航 -->
<div class="first_list_category">
<div class="scroller">
<ul class="clearfix">
{volist name="list" id="vo"}
<li>
<a href="{:url('product/subcategory', ['id' => $vo.id])}">
<div class="category_list">
<p>{$vo.name}</p>
</div>
</a>
</li>
{/volist}
</ul>
</div>
</div>
<!-- 二级分类几个产品展示 -->
{volist name="list" id="vo"}
<div class="m_Container">
<div class="product_list_title">
<div class="product_title">{$vo.name}</div>
<a href="{:url('product/subcategory', ['id' => $vo.id])}" class="view_all text_gray">
{:lang_i18n('查看全部')}<span class="icon-Double-Arrow"></span>
</a>
</div>
<div class="product_list">
{notempty name="vo.products"}
<ul>
{volist name="vo.products" id="pro" length="4"}
<li class="img-responsive">
<a href="{:url('product/detail', ['id' => $pro.id])}">
<img src="{:thumb($pro.cover_image)}">
<span class="title">{$pro.name}</span>
<span class="subtitle">{$pro.spu}</span>
</a>
</li>
{/volist}
</ul>
{/notempty}
</div>
</div>
{/volist}
</div>
</div>
{/block}
{block name="script"}
<script type="text/javascript">
// 自定义 navbarscroll 方法
$(function() {
let startX = 0;
let isDragging = false;
let currentLi;
$('.scroller ul li').on('mousedown touchstart', function(e) {
startX = e.type === 'touchstart' ? e.originalEvent.touches[0].clientX : e.clientX;
isDragging = true;
currentLi = $(this);
});
$(document).on('mousemove touchmove', function(e) {
if (isDragging) {
const currentX = e.type === 'touchmove' ? e.originalEvent.touches[0].clientX : e.clientX;
const diffX = currentX - startX;
if (diffX > 20) { // 设定一个最小滑动距离这里设为20像素
// 右滑操作
$('.scroller ul li').removeClass('cur');
currentLi.addClass('cur');
// 这里可以添加更多右滑后要执行的操作,例如显示对应内容
isDragging = false;
}
}
});
$(document).on('mouseup touchend', function() {
isDragging = false;
});
});
</script>
{/block}

View File

@@ -0,0 +1,273 @@
{extend name="public/base" /}
{block name="title"}
{notempty name="product.seo_title"}<title>{$product.seo_title}</title>{else /}{__BLOCK__}{/notempty}
{/block}
{block name="seo"}
{notempty name="product.seo_keywords"}
<meta name="keywords" content="{$product.seo_keywords}" />
<meta name="description" content="{$product.seo_desc}" />
{else/}
{__BLOCK__}
{/notempty}
{/block}
{block name="style"}
<link rel="stylesheet" type="text/css" href="__CSS__/product_detail.css" />
{/block}
{block name="main"}
<div class="oricoEGapp">
<!--产品详情-->
<div class="oricoEGapp-prdetail">
<div class="m_Container margin-top-90">
<div class="goods_address">
<a class="href_01">{:lang_i18n('首页')}</a>
{volist name="product_categorys" id="ca"}
<span class="icon-arrow arrow_address"></span>
{eq name="ca.pid" value="0"}
<a class="href_02" href="{:url('product/category', ['id' => $ca.id])}">{$ca.name}</a>
{else /}
<a class="href_02" href="{:url('product/subcategory', ['id' => $ca.id])}">{$ca.name}</a>
{/eq}
{/volist}
</div>
</div>
<!--产品轮播图 -->
{notempty name="product_skus"}
<div class="m_Container oricodtail-pdetailimgs">
{volist name="product_skus" id="sku" key="idx"}
<div class="swiper-container pdetailswiper" data-index="{$idx}" {neq name="idx" value="1"}style="display: none;"{/neq}>
<div class="swiper-wrapper">
{volist name="sku.photo_album" id="photo"}
<div class="swiper-slide">
<img src="{$photo}" alt="" />
</div>
{/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 class="swiper-pagination"></div>
</div>
{/volist}
</div>
{/notempty}
<!-- 规格参数 -->
<div class="m_Container">
<!-- 颜色/属性 -->
{notempty name="product_sku_attrs"}
<div class="slideTxtBox">
<div class="hd clearfix">
{volist name="product_sku_attrs" id="ps"}
<div class="dt attr_type">
<span>{$ps.attr_name}</span>
{notempty name="ps.attr_values"}
<ul class="hd clearfix">
{volist name="ps.attr_values" id="pv" key="pk"}
{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}">
{else/}
<li class="attr_value tip1 attr_item_defalut" data-index="{$pk}">
{/between}
{eq name="attr_value_type" value="IMAGE"}
<span class="co-bg"><img src="{$pv.attr_value}" /></span>
{elseif condition="$attr_value_type == 'RGB'" /}
<span class="co-bg" {:style(['background-color'=>$pv.attr_value])}></span>
{else/}
<span>{$pv.attr_value}</span>
{/eq}
</li>
{/volist}
</ul>
{/notempty}
</div>
{/volist}
</div>
</div>
{/notempty}
<div class="goods_all_title">
<div class="title">{$product.name}</div>
</div>
{notempty name="product_params"}
<div class="proTfg">
<ul class="msul swt-Table">
<li class="Table-Row">
<div class="ms1 Table-Cell">{:lang_i18n('型号')}</div>
<div class="ms2 Table-Cell"></div>
<div class="ms3 Table-Cell">{$product.spu}</div>
</li>
{volist name="product_params" id="param"}
<li class="Table-Row">
<div class="ms1 Table-Cell">{$param.name}</div>
<div class="ms2 Table-Cell"></div>
<div class="ms3 Table-Cell">{$param.value}</div>
</li>
{/volist}
</ul>
</div>
{/notempty}
<div class="platform_buy">
{eq name=":cookie('think_lang')" value="en-us"}
<a class="btn-blue-detail business-button">{:lang_i18n('发送查询')}</a>
{/eq}
</div>
</div>
<!-- 产品描述 -->
<div class="goods_details">
<ul class="cpa des cursor_p">
<li class="active" id="one">{:lang_i18n('产品描述')}</li>
{notempty name="product_related"}
<li onclick="javascript:location.href='#related'">{:lang_i18n('关联产品')}</li>
{/notempty}
<div class="clear"></div>
</ul>
</div>
<!-- 产品图片-->
<div class="goods_des img-responsives" id="description-tab">{$product.detail|raw}</div>
<!-- 关联产品-->
{notempty name="product_related"}
<div class="glcplist" id="related">
{volist name="product_related" id="rel"}
<div class="glcpitem">
<a href="{:url('product/detail', ['id'=>$rel.id])}">
<img src="{:thumb($rel.cover_image)}" class="glcpimg" />
<span class="glt1">{$rel.name}</span>
<span class="glt2">{$rel.spu}</span>
</a>
</div>
{/volist}
</div>
{/notempty}
<!-- 弹窗-->
<div class="marsk-container-detail">
<div class="popup-quick">
<div class="title-text">{:lang_i18n('发送查询')}</div>
<div class="business-close"><img src="__IMAGES__/close2.png"></div>
<form action="" method="post" autocomplete="off" class="apply_content">
<div class="detail_form">
<div>
<p><strong class="redstr">*</strong>{:lang_i18n('姓名')}</p>
<div class="name clearfix">
<input type="text" class="first detail-w02" placeholder="{:lang_i18n('请输入您的名称')}"
name="first_name" id="firstname" style="margin-right:0.5rem;">
<input type="text" class="first detail-w02" placeholder="{:lang_i18n('请输入您的姓氏')}"
name="last_name" id="lastname">
</div>
</div>
<div class=" clearfix">
<p><strong class="redstr">*</strong>{:lang_i18n('公司/组织')}</p>
<div class="redstr">
<input type="text" class="first detail-w01" id="companyName" name="company_name">
</div>
</div>
<div class=" clearfix">
<p><strong class="redstr">*</strong>{:lang_i18n('邮箱')}</p>
<div class="redstr">
<input type="text" class="first detail-w01" id="email" name="email">
</div>
</div>
<div class=" clearfix">
<p><strong class="redstr">*</strong>{:lang_i18n('电话号码')}</p>
<div class="redstr">
<input type="text" class="first detail-w01" id="phone" name="phone">
</div>
</div>
<div class="clearfix">
<p><strong class="redstr">*</strong>{:lang_i18n('国家')}</p>
<div class="redstr">
<select class=" detail-w01" id="country" name="corp_name">
<option value="">--- {:lang_i18n('请选择所属国家')} ---</option>
{volist name="country_list" id="country"}
<option value="{$country}">{$country}</option>
{/volist}
</select>
</div>
</div>
<div class=" clearfix">
<p><strong class="redstr">*</strong>{:lang_i18n('行业')}</p>
<div class="redstr">
<input type="text" class="first detail-w01" id="industry" name="industry">
</div>
</div>
<div class=" clearfix">
<p><strong style="color: red;">*</strong>{:lang_i18n('询问内容')}</p>
<div>
<textarea rows="3" cols="20" class="first detail-w01" id="message" name="message"></textarea>
</div>
</div>
<div class="submit_btn" id="send">{:lang_i18n('提交')}</div>
</div>
</form>
</div>
</div>
</div>
</div>
{/block}
{block name="script"}
<script type="text/javascript">
//产品图片轮播
var pdetailswiper = new Swiper('.pdetailswiper', {
// 配置选项
loop: true,
autoplay: {
delay: 3000,
},
pagination: {
el: '.swiper-pagination',
}
});
$(function() {
$('.business-button').click(function() {
$('.marsk-container-detail').show()
})
$('.business-close').click(function() {
$('.marsk-container-detail').hide()
})
// 产品描述和关联产品切换
$('.cpa li').on('click', function() {
$(this).siblings().removeClass('active');
$(this).addClass('active');
const targetTab = $(this).data('tab');
$('.tab-pane').hide();
if (targetTab === 'description') {
$('#description-tab').show();
} else if (targetTab === 'related') {
$('#description-tab').hide();
}
});
// 根据颜色切换图册
$('.attr_type').find('.attr_value').click(function() {
var index = $(this).data('index');
$('.pdetailswiper').hide();
$('.pdetailswiper[data-index="' + index + '"]').show();
$('.attr_value').removeClass('attr_item_on');
$(this).addClass('attr_item_on');
});
// 提交产品询价查询
// 提交询盘
$('#send').click(function() {
var form = $(this).parents('form');
$.ajax({
url: "{:url('product/inquiry')}",
type: 'POST',
data: form.serialize(),
success: function(r) {
if (r.code == 0) {
form[0].reset(); // 重置表单
modal.hide();
}
alert(r.msg);
},
error: function(e) {
console.error(e);
}
})
});
})
</script>
{/block}

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