689 Commits

Author SHA1 Message Date
2c85df4a98 Merge branch 'dev' 2025-12-05 09:36:52 +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
88a91f3136 删除注释 2025-12-04 10:27:05 +08:00
5fd603cbc6 底部样式 2025-12-04 10:25:06 +08:00
b92753c822 底部 2025-12-04 10:22:56 +08:00
ddd578eb08 Merge branch 'dev' 2025-12-03 17:56:52 +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
1cdd0536b9 Merge branch 'font' 2025-12-01 15:46:23 +08:00
c28b945858 font 2025-12-01 15:33:55 +08:00
9cc6dc3cd9 Merge branch 'dev' 2025-11-28 16:23:35 +08:00
9845883d8e refactor: 专题 - 电力品线 2025-11-28 16:23:21 +08:00
4d25f6fec8 Merge branch 'dev' 2025-11-28 15:46:00 +08:00
5d44c45c13 footer 2025-11-28 15:45:20 +08:00
2764ce3b86 Merge branch 'dev' 2025-11-28 15:36:31 +08:00
7f472b0351 refactor: 专题 - 电力品线 2025-11-28 15:36:12 +08:00
7cb270b313 Merge branch 'dev' 2025-11-28 15:23:45 +08:00
14df140847 refactor: 专题 - 电力品线 2025-11-28 15:23:29 +08:00
86ffcb99ac Merge branch 'dev' 2025-11-28 14:51:46 +08:00
13e58c33a2 refactor: 专题 - 电力品线 2025-11-28 14:51:30 +08:00
c476193002 Merge branch 'dev' 2025-11-28 14:43:34 +08:00
88e307a10e feat: 添加电力品线专题url 2025-11-28 14:43:17 +08:00
5643faad94 Merge branch 'dev' 2025-11-28 14:36:46 +08:00
989f6c25a0 refactor: 修改..gitignore 2025-11-28 14:35:35 +08:00
2e5103b19a Initial commit 2025-11-28 14:33:22 +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 26232 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 APP_DEBUG = true
DB_TYPE = mysql DB_TYPE = mysql
DB_HOST = 127.0.0.1 DB_HOST = localhost
DB_NAME = test DB_NAME = orico-official-website
DB_USER = username DB_USER = orico-ow
DB_PASS = password DB_PASS = 14Xi17NIK8V2qAXE8oMataHEsaR8lE
DB_PORT = 3306 DB_PORT = 3306
DB_CHARSET = utf8 DB_CHARSET = utf8mb4
DB_PREFIX = ow_
DB_VERSION = 8
DEFAULT_LANG = zh-cn DEFAULT_LANG = zh-cn
# 前端代理服务器ip影响使用代理访问情况下的客户端ip获取
PROXY_SERVER_IP[] = 120.79.27.160
# redis 配置
REDIS_HOST = 127.0.0.1
REDIS_PORT = 6379
REDIS_PASSWORD = ''
REDIS_PREFIX = ow:
[JWT]
TTL=3600
REFRESH_TTL=20160
SECRET=b43e6276644ed60e65c50d1b324ba10b
# 七牛云存储配置
[QINIU_CLOUD]
BUCKET = orico-official-website
BASE_URL = //ow.static.f2b211.com
ACCESS_KEY = dOsTum4a5qvhPTBbZRPX0pIOU7PZWRX7htKjztms
SECRET_KEY = KFxsGbnErkALFfeGdMa8QWTdodJbamMX0iznLe-q
# 后台不需要登录的接口
[ADMIN_AUTH]
WHITE_LIST[] = v1/user/login
WHITE_LIST[] = v1/user/captcha
WHITE_LIST[] = receive_sync/category
WHITE_LIST[] = receive_sync/product
# 不需记录日志的接口
[ADMIN_API]
IGNORE_LOGGING_LIST[] = v1/OperateLog/index
MAX_IMAGE_SIZE = 5mb; # 图片上传最大限制
MAX_VIDEO_SIZE = 150mb; # 视频上传最大限制
MAX_ATTACHMENT_SIZE = 100mb; # 附件上传最大限制
# 开放API
[OPENAPI]
ACCESS_TOKEN_LIFETIME = 3600; # 访问令牌有效期
REFRESH_TOKEN_LIFETIME = 1209600; # 刷新令牌有效期
RESOURCE_IMAGES_DOMAIN = http://local.orico.com; # 图片资源服务器地址
RESOURCE_VIDEOS_DOMAIN = http://local.orico.com; # 视频资源服务器地址
# 七牛云存储配置
[QINUI]
BUCKET = orico
BASE_URL = http://local.orico.com
ACCESS_KEY = 1234567890
SECRET_KEY = 1234567890
# 前台视图模板规则配置
[INDEX_VIEW_TPL]
# 视图目录
# query 规则URL参数 mtpl=1 表示移动端访问
# 例如http://xxxx.com?mtpl=1
# domain 规则:根据特定域名,判断是否移动端访问
# 例如http://mobile.orico.cn
RULE = query
# query 规则参数名
RULE_QUERY_NAME = mtpl
# query 规则参数值
RULE_QUERY_VALUE = 1
# domain 规则协议
RULE_DOMAIN_SCHEME[] = http
RULE_DOMAIN_SCHEME[] = https
# domain 规则域名
RULE_DOMAIN_HOST = mobile.orico.cn
# 前台语言检测配置
[INDEX_LANG_DETECT]
# 是否启用域名检测方式来检测语言
DOMAIN_DETECT = true
# 域名规则
# 格式:域名=语言
# 例如mobile.orico.cn=zh-cn
DOMAIN_RULE[] = orico.cn=zh-cn
DOMAIN_RULE[] = orico.com.cn=zh-cn
DOMAIN_RULE[] = www.orico.cn=zh-cn
DOMAIN_RULE[] = www.orico.com.cn=zh-cn
DOMAIN_RULE[] = ow.f2b211.com=zh-cn
DOMAIN_RULE[] = orico.cc=en-us
DOMAIN_RULE[] = www.orico.cc=en-us
DOMAIN_RULE[] = ow.us.f2b211.com=en-us

4
.gitattributes vendored
View File

@@ -1,12 +1,10 @@
*.eot filter=lfs diff=lfs merge=lfs -text *.eot filter=lfs diff=lfs merge=lfs -text
*.ttf filter=lfs diff=lfs merge=lfs -text
*.woff filter=lfs diff=lfs merge=lfs -text *.woff filter=lfs diff=lfs merge=lfs -text
*.woff2 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 *.zip filter=lfs diff=lfs merge=lfs -text
*.rar filter=lfs diff=lfs merge=lfs -text *.rar filter=lfs diff=lfs merge=lfs -text
*.pdf filter=lfs diff=lfs merge=lfs -text *.pdf filter=lfs diff=lfs merge=lfs -text
*.gz filter=lfs diff=lfs merge=lfs -text *.gz filter=lfs diff=lfs merge=lfs -text
*.gzip 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 *.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 composer.lock
.DS_Store .DS_Store
Thumbs.db Thumbs.db
.env
.env.dev
.env.local
.env.prod
.htaccess
.user.ini
404.html
index.html
public/dist*
public/opendoc
public/logo.png
public/.well-known
/.idea /.idea
/.vscode /.vscode
/.zed
/vendor /vendor
/.settings /.settings
/.buildpath /.buildpath

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"
]
}
}
}
}

208
LICENSE Normal file
View File

@@ -0,0 +1,208 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION,
AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction, and distribution
as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by the copyright
owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all other entities
that control, are controlled by, or are under common control with that entity.
For the purposes of this definition, "control" means (i) the power, direct
or indirect, to cause the direction or management of such entity, whether
by contract or otherwise, or (ii) ownership of fifty percent (50%) or more
of the outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity exercising permissions
granted by this License.
"Source" form shall mean the preferred form for making modifications, including
but not limited to software source code, documentation source, and configuration
files.
"Object" form shall mean any form resulting from mechanical transformation
or translation of a Source form, including but not limited to compiled object
code, generated documentation, and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or Object form,
made available under the License, as indicated by a copyright notice that
is included in or attached to the work (an example is provided in the Appendix
below).
"Derivative Works" shall mean any work, whether in Source or Object form,
that is based on (or derived from) the Work and for which the editorial revisions,
annotations, elaborations, or other modifications represent, as a whole, an
original work of authorship. For the purposes of this License, Derivative
Works shall not include works that remain separable from, or merely link (or
bind by name) to the interfaces of, the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including the original version
of the Work and any modifications or additions to that Work or Derivative
Works thereof, that is intentionally submitted to Licensor for inclusion in
the Work by the copyright owner or by an individual or Legal Entity authorized
to submit on behalf of the copyright owner. For the purposes of this definition,
"submitted" means any form of electronic, verbal, or written communication
sent to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems, and
issue tracking systems that are managed by, or on behalf of, the Licensor
for the purpose of discussing and improving the Work, but excluding communication
that is conspicuously marked or otherwise designated in writing by the copyright
owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity on behalf
of whom a Contribution has been received by Licensor and subsequently incorporated
within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of this
License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive,
no-charge, royalty-free, irrevocable copyright license to reproduce, prepare
Derivative Works of, publicly display, publicly perform, sublicense, and distribute
the Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of this License,
each Contributor hereby grants to You a perpetual, worldwide, non-exclusive,
no-charge, royalty-free, irrevocable (except as stated in this section) patent
license to make, have made, use, offer to sell, sell, import, and otherwise
transfer the Work, where such license applies only to those patent claims
licensable by such Contributor that are necessarily infringed by their Contribution(s)
alone or by combination of their Contribution(s) with the Work to which such
Contribution(s) was submitted. If You institute patent litigation against
any entity (including a cross-claim or counterclaim in a lawsuit) alleging
that the Work or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses granted to You
under this License for that Work shall terminate as of the date such litigation
is filed.
4. Redistribution. You may reproduce and distribute copies of the Work or
Derivative Works thereof in any medium, with or without modifications, and
in Source or Object form, provided that You meet the following conditions:
(a) You must give any other recipients of the Work or Derivative Works a copy
of this License; and
(b) You must cause any modified files to carry prominent notices stating that
You changed the files; and
(c) You must retain, in the Source form of any Derivative Works that You distribute,
all copyright, patent, trademark, and attribution notices from the Source
form of the Work, excluding those notices that do not pertain to any part
of the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its distribution,
then any Derivative Works that You distribute must include a readable copy
of the attribution notices contained within such NOTICE file, excluding those
notices that do not pertain to any part of the Derivative Works, in at least
one of the following places: within a NOTICE text file distributed as part
of the Derivative Works; within the Source form or documentation, if provided
along with the Derivative Works; or, within a display generated by the Derivative
Works, if and wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and do not modify the
License. You may add Your own attribution notices within Derivative Works
that You distribute, alongside or as an addendum to the NOTICE text from the
Work, provided that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and may provide
additional or different license terms and conditions for use, reproduction,
or distribution of Your modifications, or for any such Derivative Works as
a whole, provided Your use, reproduction, and distribution of the Work otherwise
complies with the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise, any
Contribution intentionally submitted for inclusion in the Work by You to the
Licensor shall be under the terms and conditions of this License, without
any additional terms or conditions. Notwithstanding the above, nothing herein
shall supersede or modify the terms of any separate license agreement you
may have executed with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade names,
trademarks, service marks, or product names of the Licensor, except as required
for reasonable and customary use in describing the origin of the Work and
reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or agreed to
in writing, Licensor provides the Work (and each Contributor provides its
Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied, including, without limitation, any warranties
or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR
A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness
of using or redistributing the Work and assume any risks associated with Your
exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory, whether
in tort (including negligence), contract, or otherwise, unless required by
applicable law (such as deliberate and grossly negligent acts) or agreed to
in writing, shall any Contributor be liable to You for damages, including
any direct, indirect, special, incidental, or consequential damages of any
character arising as a result of this License or out of the use or inability
to use the Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all other commercial
damages or losses), even if such Contributor has been advised of the possibility
of such damages.
9. Accepting Warranty or Additional Liability. While redistributing the Work
or Derivative Works thereof, You may choose to offer, and charge a fee for,
acceptance of support, warranty, indemnity, or other liability obligations
and/or rights consistent with this License. However, in accepting such obligations,
You may act only on Your own behalf and on Your sole responsibility, not on
behalf of any other Contributor, and only if You agree to indemnify, defend,
and hold each Contributor harmless for any liability incurred by, or claims
asserted against, such Contributor by reason of your accepting any such warranty
or additional liability. END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following boilerplate
notice, with the fields enclosed by brackets "[]" replaced with your own identifying
information. (Don't include the brackets!) The text should be enclosed in
the appropriate comment syntax for the file format. We also recommend that
a file or class name and description of purpose be included on the same "printed
page" as the copyright notice for easier identification within third-party
archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

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,7 +39,11 @@ class Article
->language(request()->lang_id) ->language(request()->lang_id)
->where(function($query) use($param) { ->where(function($query) use($param) {
if (isset($param['category_id'])) { if (isset($param['category_id'])) {
$query->where('category_id', '=', $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'], [ ->withSearch(['title', 'release_time'], [
@@ -55,7 +59,8 @@ class Article
'category', 'category',
'category_id' 'category_id'
]) ])
->bindAttr('category', ['category_name' => 'name']); ->bindAttr('category', ['category_name' => 'name'])
->each(fn($item) => $item->image = thumb($item->image));
return success('获取成功', $article); return success('获取成功', $article);
} }
@@ -223,7 +228,7 @@ class Article
private function getExportArticleData() private function getExportArticleData()
{ {
$server = request()->server(); $server = request()->server();
$image_host = $server['REQUEST_SCHEME'] . "://" . $server['SERVER_NAME'] . config('filesystem.disks.public.url') . '/'; $image_host = $server['REQUEST_SCHEME'] . "://" . $server['SERVER_NAME'] . '/';
$param = request()->param(['title', 'category_id', 'release_time']); $param = request()->param(['title', 'category_id', 'release_time']);
$data = ArticleModel::field([ $data = ArticleModel::field([
'*', '*',
@@ -248,7 +253,7 @@ class Article
]) ])
->bindAttr('category', ['category_name' => 'name']) ->bindAttr('category', ['category_name' => 'name'])
->each(function ($item) use($image_host) { ->each(function ($item) use($image_host) {
$item->image = !empty($item->image) ? $image_host . $item->image : ''; $item->image = !empty($item->image) ? url_join($image_host, $item->image) : '';
return $item; return $item;
}); });

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -4,6 +4,7 @@ declare (strict_types = 1);
namespace app\admin\controller\v1; namespace app\admin\controller\v1;
use app\admin\model\v1\SysOperateLog; use app\admin\model\v1\SysOperateLog;
use app\admin\model\v1\SysUserModel;
/** /**
* 操作日志控制器 * 操作日志控制器
@@ -21,11 +22,15 @@ class OperateLog
'size/d' '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'])) { 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'], [ ->withSearch(['title', 'created_at'], [
'title' => $param['title'] ?? null, 'title' => $param['title'] ?? null,
@@ -36,7 +41,6 @@ class OperateLog
'list_rows' => $param['size'] ?? 10, 'list_rows' => $param['size'] ?? 10,
'page' => $param['page'] ?? 1, 'page' => $param['page'] ?? 1,
]) ])
->bindAttr('user', ['username'])
->hidden(['user_id', 'user']); ->hidden(['user_id', 'user']);
return success('获取成功', $logs); return success('获取成功', $logs);

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,6 +1,8 @@
<?php <?php
// 这是系统自动生成的公共文件 // 这是系统自动生成的公共文件
use think\facade\Lang;
if (!function_exists('str_contains')) { if (!function_exists('str_contains')) {
/** /**
* 检查字符串是否包含子字符串 * 检查字符串是否包含子字符串
@@ -69,38 +71,7 @@ if (!function_exists('style')) {
} }
} }
if (!function_exists('thumb')) { if (!function_exists('get_path_from_img_tag')) {
/**
* 获取缩略图
* @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'))
{
/** /**
* 从img标签中获取图片路径 * 从img标签中获取图片路径
* @param string $img * @param string $img
@@ -116,3 +87,157 @@ if (!function_exists('get_path_from_img_tag'))
return ''; 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 [ return [
// 模板引擎类型使用Think // 模板引擎类型使用Think
'type' => 'Think', 'type' => 'Think',
// 默认模板渲染规则 1 解析为小写+下划线 2 全部转换小写 3 保持操作方法 // 默认模板渲染规则 1 解析为小写+下划线 2 全部转换小写 3 保持操作方法
'auto_rule' => 1, 'auto_rule' => 1,
// 模板目录名 // 模板目录名
'view_dir_name' => 'view', 'view_dir_name' => "view/{$view_device_name}",
// 模板后缀 // 模板后缀
'view_suffix' => 'html', 'view_suffix' => 'html',
// 模板文件名分隔符 // 模板文件名分隔符
@@ -24,8 +26,8 @@ return [
'taglib_end' => '}', 'taglib_end' => '}',
// 模板输出替换 // 模板输出替换
'tpl_replace_string' => [ 'tpl_replace_string' => [
'__CSS__' => '/static/index/css', '__CSS__' => "/static/index/{$view_device_name}/css",
'__JS__' => '/static/index/js', '__JS__' => "/static/index/{$view_device_name}/js",
'__IMAGES__' => '/static/index/images', '__IMAGES__' => "/static/index/{$view_device_name}/images",
] ]
]; ];

View File

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

View File

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

View File

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

View File

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

View File

@@ -34,6 +34,7 @@ class ContactUs extends Common
->where('status', '=', 1) ->where('status', '=', 1)
->order(['sort' => 'asc', 'id' => 'desc']); ->order(['sort' => 'asc', 'id' => 'desc']);
}]) }])
->atPlatform(request()->from)
->uniqueLabel(['BANNER_6805e3d32dcc2', 'BANNER_6806090c1838f']) ->uniqueLabel(['BANNER_6805e3d32dcc2', 'BANNER_6806090c1838f'])
->language($this->lang_id) ->language($this->lang_id)
->enabled(true) ->enabled(true)
@@ -44,14 +45,7 @@ class ContactUs extends Common
$banner_map[$v->unique_label] = $v; $banner_map[$v->unique_label] = $v;
} }
$focus_image = data_get($banner_map, 'BANNER_6805e3d32dcc2')?->items->first()?->toArray(); $focus_image = data_get($banner_map, 'BANNER_6805e3d32dcc2')?->items->first()?->toArray();
$info_datas = data_get($banner_map, 'BANNER_6806090c1838f')?->items->each(function($item) { $info_datas = data_get($banner_map, 'BANNER_6806090c1838f')?->items->toArray();
if (Str::contains($item->title, '<br/>')) {
$title = explode('<br/>', $item->title);
$item->title = $title[0];
$item->title_short = $title[1];
}
return $item;
})->chunk(4)->toArray();
} }
View::assign('focus_image', $focus_image); View::assign('focus_image', $focus_image);
View::assign('info_datas', $info_datas); View::assign('info_datas', $info_datas);
@@ -88,10 +82,10 @@ class ContactUs extends Common
'user_agent' => request()->header('user-agent'), 'user_agent' => request()->header('user-agent'),
]); ]);
if ($msg->isEmpty()) { 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 = []; $focus_image = [];
@@ -102,6 +96,7 @@ class ContactUs extends Common
->where('status', '=', 1) ->where('status', '=', 1)
->order(['sort' => 'asc', 'id' => 'desc']); ->order(['sort' => 'asc', 'id' => 'desc']);
}]) }])
->atPlatform(request()->from)
->uniqueLabel([ ->uniqueLabel([
'BANNER_6801be1e7d686', 'BANNER_6801be1e7d686',
'BANNER_6801c053ce12e', 'BANNER_6801c053ce12e',
@@ -134,6 +129,7 @@ class ContactUs extends Common
'corp_name', 'corp_name',
'email', 'email',
'phone', 'phone',
'website_url',
'business_type', 'business_type',
'enterprise_size', 'enterprise_size',
'address', 'address',
@@ -153,7 +149,7 @@ class ContactUs extends Common
'email' => $form_data['email'], 'email' => $form_data['email'],
'phone' => $form_data['phone'], 'phone' => $form_data['phone'],
'referer_url' => request()->header('referer'), 'referer_url' => request()->header('referer'),
'website_url' => request()->header('host'), 'website_url' => $form_data['website_url'],
'business_type' => $form_data['business_type'], 'business_type' => $form_data['business_type'],
'enterprise_size' => $form_data['enterprise_size'], 'enterprise_size' => $form_data['enterprise_size'],
'address' => $form_data['address'], 'address' => $form_data['address'],
@@ -161,9 +157,9 @@ class ContactUs extends Common
'ip' => request()->ip(), 'ip' => request()->ip(),
]); ]);
if ($ret->isEmpty()) { 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'], 'last_name' => $form_data['last_name'],
'email' => $form_data['email'], 'email' => $form_data['email'],
'phone' => $form_data['phone'], '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'), 'referer_url' => request()->header('referer'),
'website_url' => request()->header('host'), 'website_url' => request()->header('host'),
'message' => $form_data['message'], 'message' => $form_data['message'],
'ip' => request()->ip(), 'ip' => request()->ip(),
]); ]);
if ($ret->isEmpty()) { 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') ->byName('bulk_purchase_inquiry_interested')
->find(); ->find();
if (empty($config)) { if (empty($config)) {
return error('当前选定语言的采购可选品类配置出错'); return error(lang('当前选定语言的采购可选品类配置出错'));
} }
View::assign('interested', explode(',', preg_replace('/\r?\n/', ',', $config->value))); View::assign('interested', explode(',', preg_replace('/\r?\n/', ',', $config->value)));

View File

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

View File

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

View File

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

View File

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

View File

@@ -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定义文件 // 这是系统自动生成的middleware定义文件
return [ 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); $query->where('pid', '=', $parent);
} }
// 所属上级分类范围查询
public function scopeParentChild($query, $parent)
{
if (is_array($parent)) {
$query->where('pid', 'IN', $parent);
return;
}
$query->where('pid', '=', $parent);
}
// 所属上级分类查询
public function scopeParentColumn($query, $parent)
{
if (is_array($parent)) {
$query->where('id', 'IN', $parent);
return;
}
$query->where('id', '=', $parent);
}
// 所属子分类范围查询
public function scopeChild($query, $id, $merge_self = false)
{
$query->where(function($q) use($id, $merge_self) {
$q->where('pid', '=', $id);
if ($merge_self) {
$q->whereOr('id', '=', $id);
}
});
}
// 是否显示状态范围查询 // 是否显示状态范围查询
public function scopeIsShow($query, bool $is_show) public function scopeIsShow($query, bool $is_show)
{ {

View File

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

View File

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

View File

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

View File

@@ -23,6 +23,16 @@ class SysBannerModel extends SysBannerBaseModel
return $this->hasMany(SysBannerItemModel::class, 'banner_id', 'id'); 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) public function scopeUniqueLabel($query, string|array $unique_label)
{ {

View File

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

View File

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

View File

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

View File

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

View File

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