382 Commits

Author SHA1 Message Date
paulGao
b740a6f906 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2022-02-17 14:54:30 +08:00
paulGao
7376d4d890 修复api错误 2022-02-17 14:54:18 +08:00
夜良king
81297db7a8 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2022-02-16 11:37:50 +08:00
夜良king
b5ca94ab98 楼层装修 分页 2022-02-16 11:37:00 +08:00
lemon橪
a220339fd6 合并内容 2022-02-16 11:26:01 +08:00
lemon橪
0994b6659a 合并部分代码 回滚规格 2022-02-16 11:22:35 +08:00
夜良king
c4037a346d 修改样式 和 优化一些 功能 2022-02-16 09:25:01 +08:00
lemon橪
45a6e76d4a 需改pc样式上的bug 2022-02-15 16:54:36 +08:00
paulGao
aee67ec317 修改版本号 2022-02-15 14:08:04 +08:00
夜良king
51610546c4 重新修改config 2022-02-15 10:17:19 +08:00
夜良king
e8e7d27c0d Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2022-02-15 10:12:53 +08:00
夜良king
166e889b6f commit 2022-02-15 10:12:49 +08:00
paulGao
db95647cd8 修复管理端刷新tokenapi错误问题 2022-02-15 10:03:14 +08:00
lemon橪
db13814156 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2022-02-14 17:10:45 +08:00
lemon橪
5cf3956bc8 取消cdn加载 2022-02-14 17:10:40 +08:00
OceansDeep
329e6df722 !6 适配接口路径修改
Merge pull request !6 from OceansDeep/fengtianyangyang
2022-02-14 07:51:16 +00:00
paulGao
8023852b3c 升级版本号 2022-02-14 15:35:01 +08:00
paulGao
228935034d 适配api 2022-02-14 14:21:37 +08:00
paulGao
acff55dc65 适配修改后的api 2022-02-12 15:20:36 +08:00
paulGao
61a9110c51 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui into fengtianyangyang 2022-02-11 16:44:27 +08:00
paulGao
3a3e14e0a7 适配微服务 2022-02-10 18:57:36 +08:00
lemon橪
6ba767419e 新增文库详情页面,转门为审核使用 2022-02-10 17:13:26 +08:00
lemon橪
925365018b 优化商家发布商品丢失规格问题,修改开启cdn 2022-02-10 14:26:53 +08:00
lemon橪
5960df31bd 合并并提交修改 2022-02-09 20:50:09 +08:00
lemon橪
21f9fd92e2 取消cdn加载 2022-02-09 20:49:49 +08:00
paulGao
9765310136 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui into fengtianyangyang 2022-02-09 10:32:50 +08:00
paulGao
51cde2dd0d fix bugs 2022-01-27 14:58:37 +08:00
fengtianyangyang
3311568e50 修改路径 2022-01-25 19:08:47 +08:00
fengtianyangyang
e5918b041a 路径修改 2022-01-25 12:01:40 +08:00
paulGao
f46330ecf0 Merge branch 'fengtianyangyang' of gitee.com:beijing_hongye_huicheng/lilishop-ui into fengtianyangyang 2022-01-25 09:46:15 +08:00
paulGao
846e80f1fa 适配微服务版本 2022-01-25 09:46:12 +08:00
fengtianyangyang
631519d7c7 路径修改 2022-01-25 09:22:22 +08:00
paulGao
bbeb31e8a3 修复店铺和平台优惠券同时选择时,显示问题 2022-01-21 19:02:09 +08:00
paulGao
52bcf07e25 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2022-01-21 16:53:28 +08:00
paulGao
4d725221a5 优化店铺搜索栏 2022-01-21 16:53:16 +08:00
Chopper
c8a0619141 积分设置优化 2022-01-21 16:20:15 +08:00
fengtianyangyang
e1d7b1801d 接口修改 2022-01-21 09:14:21 +08:00
paulGao
15456ae377 修复删除会员评论,弹出框不关闭问题 2022-01-20 17:40:05 +08:00
fengtianyangyang
1c3d711298 路径修改 2022-01-20 17:21:30 +08:00
paulGao
1bee69cefb 优化管理端和卖家端登录 2022-01-17 18:00:49 +08:00
paulGao
cf740d9605 修复富文本编辑器xss过滤样式问题 2022-01-17 16:49:55 +08:00
paulGao
d2aca24d06 优化申请售后退货 2022-01-04 19:57:40 +08:00
paulGao
6e042c4b78 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2022-01-04 09:21:03 +08:00
paulGao
1afd1704ab 修复pc显示促销价格问题 2022-01-04 09:21:00 +08:00
夜良king
d5f81fe5d8 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2021-12-31 18:23:05 +08:00
夜良king
fada0a735f 修改样式 和查看虚拟实物 2021-12-31 18:22:30 +08:00
夜良king
35de0c031d 样式加 虚拟实物查看 2021-12-31 18:22:06 +08:00
lemon橪
2e5eefc079 提交 buyer和seller退出uuid清空bug 2021-12-30 11:16:08 +08:00
学习很差啦
1fa264b0bf !5 修复登出账号、修改密码等操作会清除uuid的bug 感谢大佬ray 提出的pr
Merge pull request !5 from master
2021-12-30 03:06:29 +00:00
zhanglei829
d2a0940858 修复登出账号、修改密码等操作会清除uuidbug 2021-12-30 10:13:34 +08:00
paulGao
4ff8eb6494 修复优化拼团 2021-12-29 19:50:24 +08:00
paulGao
8ca87cdb2a Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2021-12-28 19:54:58 +08:00
paulGao
f45b115355 修复满额活动赠送积分不显示填写积分。商品规格默认项无法退格删除。权限菜单选择某一子项获取选择全部问题 2021-12-28 19:54:40 +08:00
夜良king
7490211340 修改了小样式 按钮 2021-12-28 18:33:47 +08:00
夜良king
76d028277a buyer一些样式和一个弹框 2021-12-28 17:51:23 +08:00
lemon橪
0a0066fe5c Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2021-12-27 16:16:27 +08:00
lemon橪
4f7e38db3b 修改移动端楼层装修文章地址 2021-12-27 16:16:26 +08:00
paulGao
54dcd2d8be 修复优化促销问题 2021-12-25 18:36:15 +08:00
paulGao
6c1d7cce8d Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2021-12-25 17:05:19 +08:00
lemon橪
06b090cdf6 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2021-12-25 10:59:02 +08:00
lemon橪
3653b4e7cb 优化buyer底部信息,优化购物车显示规格数量可能导致的bug 新增订单物流显示 2021-12-25 10:59:00 +08:00
paulGao
c6c890da63 修复拼团排序问题 2021-12-24 16:55:30 +08:00
paulGao
75e7bc2d9c 优化搜索热词管理 2021-12-24 16:09:57 +08:00
paulGao
649f983990 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2021-12-23 21:20:52 +08:00
paulGao
193628913a 优化店铺详情页 2021-12-23 21:20:37 +08:00
lemon橪
cb304d7d53 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2021-12-23 19:02:30 +08:00
lemon橪
4bb7bd4603 buyer端 部分颜色优化以及部分间距优化 2021-12-23 19:02:29 +08:00
paulGao
1e408eb8ae 修复管理端积分商品问题 2021-12-23 17:11:30 +08:00
Chopper
d762d18c7b 将支付应用id分别配置 2021-12-23 11:58:09 +08:00
Chopper
3622c7bb53 pc订单详情无法跳转商品详情页面问题处理 2021-12-22 18:29:29 +08:00
paulGao
1b9b2d9c95 适配字段变化 2021-12-22 10:50:43 +08:00
paulGao
0d5c60ed8c Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2021-12-21 18:59:57 +08:00
paulGao
ab2bcb515f 优化促销相关代码 2021-12-21 18:59:45 +08:00
lemon橪
b3e6eb72eb 新增npmrc以及yarnrc文件,修改config配置变成可配置的cdn加载以及端口设置 2021-12-21 16:30:54 +08:00
lemon橪
9742aaf0bc udesk 技术储备方案 2021-12-20 17:37:22 +08:00
lemon橪
bc1942c492 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2021-12-20 16:48:10 +08:00
lemon橪
44facf549a 提交udesk方案 2021-12-20 16:48:08 +08:00
eeer
09dd9861fd update seller/vue.config.js. 统一取消cdn加载 目前cdn链接的https请求挂了 2021-12-20 06:31:42 +00:00
eeer
8d3b5cf91d update manager/vue.config.js. 统一取消cdn加载 目前cdn链接的https请求挂了 2021-12-20 06:31:08 +00:00
eeer
5a90567e98 update buyer/vue.config.js. 统一取消cdn加载 目前cdn链接的https请求挂了 2021-12-20 06:30:40 +00:00
lemon橪
246ba9057f 删除最低购买金额 2021-12-16 13:41:57 +08:00
lemon橪
9eecc603db Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2021-12-13 19:27:23 +08:00
lemon橪
1fe4078115 化楼层装修中商品分类判断 2021-12-13 19:27:20 +08:00
paulGao
ef73a6fe94 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2021-12-11 13:51:33 +08:00
paulGao
edef393535 适配重构促销 2021-12-11 13:50:58 +08:00
Chopper
97e6fc79ea Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2021-12-09 20:21:49 +08:00
Chopper
0b82ae7569 商家设置坐席id代码补充 2021-12-09 20:21:46 +08:00
lemon橪
3cb0e52ca0 优化楼层装修中商品分类代码可能会出现的bug . 如果更新此版本建议同步更新uni版本更新 2021-12-09 18:32:11 +08:00
lemon橪
fd1d32d431 管理端优惠券判断优化 2021-12-03 10:00:23 +08:00
lemon橪
8c169489eb 修改统计中发现的bug 2021-11-30 17:15:37 +08:00
lemon橪
6ecb6b8055 修改部分冗余代码,新增商家端npmrc配置 后续还会新增yarnrc 2021-11-22 11:16:32 +08:00
lemon橪
515cd3ebbd 新增部分售后判断 2021-11-18 18:07:58 +08:00
lemon橪
6c6b89f512 优化buyer端配置信息完善性 2021-11-18 17:10:44 +08:00
lemon橪
1ac5dcfe25 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2021-11-18 14:51:46 +08:00
lemon橪
ccd5decbf7 优化楼层装修 pc端中控制台因类型转换问题导致的报错信息 2021-11-18 14:51:44 +08:00
paulGao
9a12a29127 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2021-11-17 16:39:38 +08:00
paulGao
8d96a3c106 管理端增加退出登录 2021-11-17 16:39:24 +08:00
lemon橪
41bfd17cd0 pc端物流日志 2021-11-16 11:02:59 +08:00
paulGao
5614414185 add logout 2021-11-11 18:45:53 +08:00
lemon橪
7ac4010910 修改规格样式问题 2021-11-09 15:53:11 +08:00
lemon橪
ffc5af6d39 修改商品中参数可能出现的bug 2021-11-09 15:38:45 +08:00
lemon橪
c64f00fe9e merge master 2021-11-05 16:16:56 +08:00
lemon橪
d3a49f3f3e 修改商品参数中部分bug 2021-11-05 16:16:28 +08:00
paulGao
06c6abe250 修复售后订单loading 2021-11-05 10:49:08 +08:00
chopper711
f54739e337 update README.md. 2021-11-02 08:04:19 +00:00
lemon橪
cdc673da06 删除无用数据 2021-10-28 16:27:59 +08:00
Chopper
0bd99df26a 后台查阅消息,跳转分销提现页面内容问题处理 2021-10-27 10:56:25 +08:00
chopper711
0dcee2f2e2 !4 PC显示发票信息问题处理,结算页面商品宽度调整,后台发票开具条件增加已发货可以开具发票的按钮
Merge pull request !4 from chopper711/lifenlong
2021-10-26 02:40:06 +00:00
Chopper
f7f836f5fd PC显示发票信息问题处理,结算页面商品宽度调整,后台发票开具条件增加已发货可以开具发票的按钮 2021-10-26 10:38:41 +08:00
lemon橪
16d1576c10 秒杀金额显示问题 2021-10-22 15:11:18 +08:00
lemon橪
0d1dbd0350 修改语言插件 2021-10-21 17:50:34 +08:00
lemon橪
18ea8a4366 语言设定小插件 2021-10-21 15:48:03 +08:00
lemon橪
b9aa720bea 修改秒杀添加商品可能出现的bug 2021-10-21 14:09:00 +08:00
lemon橪
28473979ec 合并master 2021-10-19 16:41:03 +08:00
lemon橪
dbe5a21f4d 修改buyer api路径 将buyer manager seller 统一为 public/config下修改api地址,新增buyer底部 公司,备案号等信息展示,修改商家端seller秒杀bug以及部分issue中的优化方案 2021-10-19 16:40:43 +08:00
Chopper
31d9859f10 表单校验几个细节问题 2021-10-19 14:20:20 +08:00
lemon橪
7cbd2b698c 优化劵活动优惠券代码 2021-10-15 18:38:29 +08:00
lemon橪
6fa3fa7822 优化砍价逻辑,以及修改劵活动Bug 2021-10-12 18:06:52 +08:00
lemon橪
e80316d43d 修复管理后台es分词报错问题 2021-10-09 09:29:30 +08:00
paulGao
9979b6fd67 修复管理员添加密码验证 2021-10-08 14:56:25 +08:00
OceansDeep
a36a4cd244 !3 修复设置限时抢购活动无时间显示bug
Merge pull request !3 from OceansDeep/dev-gl
2021-10-08 03:38:51 +00:00
paulGao
f99e2673a6 修复设置限时抢购活动无时间显示bug 2021-10-08 11:37:11 +08:00
lemon橪
47da7d3b16 管理端新增文章时删除全部选项 2021-10-06 17:01:30 +08:00
lemon橪
4f2f6e8d20 优化楼层装修样式问题,以及退单金额显示,删除砍价批量删除商品功能 2021-09-29 16:04:24 +08:00
lemon橪
4da164dcba 优化商品发布规格校验,后续会优化规格详情中添加规格以前数据消失问题 2021-09-26 18:02:26 +08:00
lemon橪
1aab8aa8c8 合并shuai分支 优化正则校验以及商品发布中样式 ,后续会优化商品发布中规格问题 2021-09-26 16:37:53 +08:00
lemon橪
8a2a946bc1 合并shuai分支 优化正则校验以及商品发布中样式 ,后续会优化商品发布中规格问题 2021-09-26 16:36:57 +08:00
Chopper
038de5ed53 商品详情管理端,字段优化问题处理 2021-09-26 16:19:53 +08:00
Chopper
0bac362c95 Merge branch 'liushuai'
大部分为参数校验问题,以及部分商品字段优化
# Conflicts:
#	buyer/src/config/index.js
#	manager/src/config/index.js
#	seller/src/views/goods/goods-seller/draftGoods.vue
2021-09-26 16:12:24 +08:00
Chopper
04599148fc 文章分类,积分设置删除后无法新增问题处理 2021-09-26 16:07:50 +08:00
lemon橪
b61faef093 管理端删除基础配置 2021-09-26 14:49:41 +08:00
Chopper
642536f83e 校验问题处理 2021-09-26 14:49:19 +08:00
Chopper
7ebb5e21d2 各种页面校验功能补充优化 2021-09-24 18:19:09 +08:00
OceansDeep
0c18a0f6db !2 修复楼层装修选择店铺,店铺开启状态不正确
Merge pull request !2 from OceansDeep/dev-gl
2021-09-24 08:40:41 +00:00
paulGao
93768e4014 reset config 2021-09-24 16:39:24 +08:00
paulGao
3674b63db4 reset config 2021-09-24 16:38:27 +08:00
paulGao
9e8f369da4 reset config 2021-09-24 16:37:33 +08:00
paulGao
04cc8b991c reset config seller 2021-09-24 16:34:42 +08:00
paulGao
0342f1d17a fix dialog template shops storeDisable show error 2021-09-24 16:32:23 +08:00
paulGao
82838a5ebb Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui into dev-gl 2021-09-24 15:49:00 +08:00
Chopper
20042786aa 商品模块代码继续完善,表单校验等 2021-09-22 15:32:47 +08:00
lemon橪
2037b57a5d 优化管理端商家端冗余以及配置内容。抽出公共主题颜色、站点标题等内容。分离config中api配置,修改商家发布中拖拽以及控制台出错的bug。 2021-09-22 15:08:34 +08:00
Chopper
2932c7f35d 参数校验相关提交 2021-09-22 12:16:22 +08:00
lemon橪
53cc6f46d1 修改buyer端购物车显示bug 2021-09-17 18:26:24 +08:00
paulGao
a5e2ae9a4d Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui into dev-gl 2021-09-17 17:19:48 +08:00
lemon橪
95beebc5c7 合并master 2021-09-17 17:16:30 +08:00
lemon橪
f7b8713be1 解决商家端 商家列表报错问题 2021-09-17 17:16:15 +08:00
Chopper
c33d10734f im 页面声明 2021-09-17 11:03:09 +08:00
Chopper
edde94af69 IM 设置 2021-09-17 11:01:57 +08:00
Chopper
fbf2b6a6fa Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2021-09-16 16:22:36 +08:00
Chopper
b84f1b595e 镜像相关提交 2021-09-16 16:22:13 +08:00
lemon橪
e4bc52a219 修改已发现秒杀的bug 2021-09-15 17:05:43 +08:00
lemon橪
dc55e0983a 优化部分代码,修改发布商品部分bug 2021-09-15 13:48:35 +08:00
lemon橪
f3914b63b3 解决iview Radio 报错问题 2021-09-10 11:26:50 +08:00
lemon橪
1ad729ca0e 修改权限已知问题 2021-09-10 11:18:01 +08:00
lemon橪
8c864c207a 修改部分样式问题,新增解析转义,修改buyer端没有第三方登录问题 2021-09-09 10:43:41 +08:00
lemon橪
aaadc90b09 cdn axios版本升级 2021-09-07 11:46:54 +08:00
paulGao
ea8c86e2e2 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui into dev-gl 2021-09-07 09:37:30 +08:00
lemon橪
575e7b3297 修改验证价格问题 2021-09-06 17:19:17 +08:00
lemon橪
49b1252a1f seller在public文件夹下配置全局变量时,刷新页面失效 2021-09-06 17:08:32 +08:00
lemon橪
b0021a759f vue版本升级为2.6 优化cdn加载,优化部分样式,删除某部分图片,修改店铺bug 2021-09-06 17:01:38 +08:00
paulGao
70506767ef Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui into dev-gl 2021-09-03 15:44:06 +08:00
paulGao
48002d6143 conifg 2021-09-03 15:43:46 +08:00
lemon橪
43349a51d1 修改部分样式,分离seller端config文件,配置部分冗余数据,删除部分没用的图片 2021-09-03 14:58:03 +08:00
lemon橪
a6052bcd9d 合并Master 2021-09-03 11:38:35 +08:00
lemon橪
3d418fa9e1 修改楼层装修中需要的js cdn不加载问题 2021-09-03 11:37:54 +08:00
Chopper
9feff82451 merge master 2021-09-03 09:42:19 +08:00
Chopper
647ed90eac 价格展示相关优化,拼团活动返回不刷新问题处理 2021-09-03 09:40:57 +08:00
OceansDeep
30b968b3e5 !1 add goods parameter sort
Merge pull request !1 from OceansDeep/dev-gl
2021-09-02 08:45:29 +00:00
paulGao
c8edf9c1bd add goods parameter sort 2021-09-02 16:37:46 +08:00
lemon橪
a2c6a1d46d 删除seller mode模式 2021-09-02 15:04:15 +08:00
lemon橪
6d5428317f 修改统计出现的bug 2021-09-02 15:01:54 +08:00
lemon橪
b829d2cd05 seller线上删除console 2021-09-02 11:18:49 +08:00
lemon橪
7f46528086 删除部分manager不用的图片,压缩图片大小,修改统计时测出的bug 2021-09-02 11:17:11 +08:00
lemon橪
71e4c49c3e 优化cdn动态加载管理端,修复砍价金额bug,删除部分不规范代码 2021-09-01 10:11:12 +08:00
lemon橪
84cfb26512 i18n问题解决 2021-08-31 09:46:18 +08:00
lemon橪
07445e42e3 合并Master 2021-08-30 18:26:01 +08:00
lemon橪
201348202a 解决seller报错问题 2021-08-30 18:25:42 +08:00
Chopper
01d2ecda39 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2021-08-30 18:14:51 +08:00
Chopper
34967921a5 店铺首页展示字段问题处理,以及描述处理 2021-08-30 18:14:24 +08:00
lemon橪
692f7b6dbf 提交商品发布错误bug 2021-08-30 17:20:09 +08:00
lemon橪
8dc3923a4f 合并master 2021-08-30 16:21:23 +08:00
lemon橪
b5b74e8b3b 修改上星期提交的bug 2021-08-30 16:21:05 +08:00
Chopper
a7ee9a6444 双减号问题处理 2021-08-30 14:46:01 +08:00
lemon橪
5ac39d0e93 合并master修改 2021-08-27 18:11:52 +08:00
lemon橪
e6d8d87c31 优化店铺端代码,减少报错信息,动态cdn加载,优化速度30%+ 2021-08-27 18:10:33 +08:00
Chopper
bed539d16f 优惠金额,优惠券金额管理端展示问题处理 2021-08-27 17:29:26 +08:00
Chopper
abaefc59a6 领取数量调整描述为已领取数量,明确含义。
购物车无法渲染哪个商品参与了满减活动问题处理
2021-08-26 11:15:07 +08:00
Chopper
8d60a40688 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2021-08-25 14:18:50 +08:00
Chopper
589b7fc7c5 售后信息展示,单价展示问题处理 2021-08-25 14:18:35 +08:00
lemon橪
7caa2fd40d 优化店铺段报错问题,后续会配置开发环境以及生产环境动态CDN优化 2021-08-20 17:45:57 +08:00
lemon橪
b59da2c101 合并砍价功能 2021-08-19 14:48:19 +08:00
lemon橪
72ad898a6c 满额活动解决修改Cookie中的字段导致新增活动出现的问题 2021-08-17 15:46:59 +08:00
pikachu
db919a57f3 修改在已有秒杀商品情况下添加新的秒杀商品 数据保存错误问题 2021-08-16 19:54:18 +08:00
lemon橪
f33efac045 合并分支 2021-08-16 11:32:15 +08:00
lemon橪
334a27a12b 修改楼层装修中商品装修出现的默认不显示bug 2021-08-16 11:31:59 +08:00
mabo
08fcbe9acf Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2021-08-13 18:03:10 +08:00
mabo
14a8695cc9 删除debugger,证照信息需要上传正反面,修改店铺信息,地址回显,bug修改,代码优化,店铺详情展示优化 2021-08-13 18:03:07 +08:00
lemon橪
9e4449257e 新增收款流水 店铺展示,修改菜单权限ui样式 2021-08-13 14:30:24 +08:00
lemon橪
826454e164 合并master 2021-08-13 11:30:47 +08:00
lemon橪
4c11e448f1 修改菜单权限, 新增版本更新提示 2021-08-13 11:30:33 +08:00
mabo
cfc5c94f5a Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2021-08-13 10:38:08 +08:00
mabo
e6588af790 积分扣减展示问题,pc商品详情图片不展示问题,pc楼层装修提示修改,代码优化 2021-08-13 10:38:04 +08:00
lemon橪
9b81a70808 合并master 2021-08-13 09:19:07 +08:00
lemon橪
fb50143ec2 新增app版本描述 2021-08-13 09:18:46 +08:00
mabo
736c5ecd2c 结算单添加砍价,积分商品金额 2021-08-12 18:39:34 +08:00
mabo
e88c75d0b7 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2021-08-12 17:42:16 +08:00
mabo
a849d8906a 投诉详情取消投诉规则改变,商品分类2级分类没有图片 2021-08-12 17:42:05 +08:00
Chopper
2d2448ebba Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui
# Conflicts:
#	seller/src/views/promotion/seckill/seckill.vue
2021-08-12 17:12:13 +08:00
mabo
9b0a089e29 选择品牌,品牌绑定时候可以搜索 2021-08-12 16:41:43 +08:00
Chopper
682bd13b6e add elasticsearch progress 2021-08-12 02:17:28 +08:00
mabo
71ab63e047 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2021-08-12 01:03:43 +08:00
mabo
2e27a2fb85 好评率展示问题,申请售后图片变形,清除足迹不刷新列表,结算单筛选条件展示错误,店铺审核按钮调整到详情 2021-08-12 01:03:39 +08:00
Chopper
02bf570f08 商家端售后排序问题处理 2021-08-12 00:09:01 +08:00
Chopper
e52ac06fb3 pc支持分销 2021-08-11 22:53:47 +08:00
Chopper
c1a741466c 商家端查看秒杀活动列表问题处理 2021-08-11 22:29:27 +08:00
mabo
81ab58e009 店铺入驻bug修改 2021-08-11 22:13:25 +08:00
mabo
a42a7515dc Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2021-08-11 21:41:19 +08:00
mabo
2dabff65ed 店铺入驻没有回显问题 2021-08-11 21:41:15 +08:00
pikachu
71d8fbd5fe Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2021-08-11 21:32:54 +08:00
pikachu
7763abd591 拼团活动相关校验 2021-08-11 21:32:42 +08:00
mabo
6bbba6bd35 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2021-08-11 21:18:26 +08:00
mabo
c7ce4e72c6 店铺入驻bug修改,订单详情添加修改金额展示 2021-08-11 21:18:22 +08:00
pikachu
9e365c27b5 新增充值取消状态 2021-08-11 19:28:47 +08:00
mabo
4557b1d5c1 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2021-08-11 18:48:03 +08:00
mabo
e9163e4247 管理、商家,添加删除秒杀商品接口,管理端切换账号菜单权限不生效问题,代码优化 2021-08-11 18:47:59 +08:00
lemon橪
328bceec2c 合并master 2021-08-11 18:12:53 +08:00
lemon橪
82bb5577b2 修改统计错误信息 2021-08-11 18:12:36 +08:00
mabo
3e505a8a4e Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2021-08-11 14:56:06 +08:00
mabo
cc80242896 pc端添加2个轮播代码,楼层装修跟pc端样式不一致,楼层装修无法添加的bug修改 2021-08-11 14:56:02 +08:00
lemon橪
e521e723d5 修改移动端楼层装修bug 2021-08-11 11:57:02 +08:00
lemon橪
9213aed8e0 修改部分移动端楼层装修bug 2021-08-11 10:19:45 +08:00
mabo
d104baf426 管理端,装修页面添加两种新轮播 2021-08-10 18:01:07 +08:00
mabo
b89fb8b2ba Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2021-08-10 17:39:20 +08:00
mabo
bb8ea94850 pc收藏店铺字段变更,添加修改秒杀页面 2021-08-10 17:39:15 +08:00
lemon橪
783c6df0a4 修改统计上店铺不加载bug 修改统计图antV加载数据不齐全bug 2021-08-10 16:50:55 +08:00
lemon橪
06a6b77d2e pull最新代码 修改店铺简介的富文本框 2021-08-10 16:30:55 +08:00
mabo
924de43227 删除文件 buyer/src/pages/payment/thirdPay.vue 2021-08-10 08:11:21 +00:00
mabo
0597531c72 删除文件 buyer/src/pages/forgetPassword.vue 2021-08-10 08:11:11 +00:00
mabo
07e75f71cc 删除文件 buyer/src/pages/couponCenter.vue 2021-08-10 08:11:04 +00:00
mabo
c9d42755ef 删除文件 buyer/src/components/nav/cateNav.vue 2021-08-10 08:10:15 +00:00
mabo
9e45c45688 删除文件 buyer/src/components/indexDecorate/modelList/seckill.vue 2021-08-10 08:09:05 +00:00
mabo
75fd42e152 删除文件 buyer/src/components/indexDecorate/modelList/recommend.vue 2021-08-10 08:08:59 +00:00
mabo
97bc68ad26 删除文件 buyer/src/components/indexDecorate/modelList/notEnough.vue 2021-08-10 08:08:54 +00:00
mabo
05a25bd80f 删除文件 buyer/src/components/indexDecorate/modelList/newGoodsSort.vue 2021-08-10 08:08:45 +00:00
mabo
ffde03bc21 删除文件 buyer/src/components/indexDecorate/modelList/firstPageAdvert.vue 2021-08-10 08:08:39 +00:00
mabo
0d42bce536 删除文件 buyer/src/components/indexDecorate/modelList/carousel.vue 2021-08-10 08:08:31 +00:00
mabo
bf2eb82728 删除文件 buyer/src/components/indexDecorate/modelFormItem.vue 2021-08-10 08:07:02 +00:00
mabo
a62530d7b8 删除文件 buyer/src/components/indexDecorate/modelForm.vue 2021-08-10 08:06:57 +00:00
mabo
3e1fa0b937 修改秒杀页面展示名 2021-08-10 11:53:28 +08:00
mabo
604a918fd1 商家端代码优化 2021-08-10 10:17:48 +08:00
mabo
1f02b45600 管理端代码优化 2021-08-10 09:59:53 +08:00
lemon橪
ebb048f1a7 修改付款日志订单创建时间 2021-08-09 11:57:57 +08:00
lemon橪
c58d70524d 更改seller上面之前配置出错的问题 2021-08-09 11:11:57 +08:00
pikachu
86fed0db41 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2021-08-06 19:19:01 +08:00
pikachu
7cbca93d3d 积分字段修改 2021-08-06 19:18:55 +08:00
lemon橪
c1f846a633 修改虚拟订单不能时间筛选问题 2021-08-06 17:34:57 +08:00
lemon橪
7a43087ae0 合并master 2021-08-06 17:17:56 +08:00
lemon橪
f281f8e65a 修改售后原因bug 2021-08-06 17:17:40 +08:00
mabo
4d26bf08b2 修改提示信息 2021-08-06 16:13:48 +08:00
mabo
146854b098 导出订单默认导出一万条,优化代码 2021-08-06 16:12:41 +08:00
mabo
5cfbfdf67c 修改上传图片大小限制,最大1M 2021-08-06 15:35:07 +08:00
mabo
00a64c4d2a Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2021-08-06 14:12:35 +08:00
mabo
ba7e711a88 删除无用字段 2021-08-06 14:12:30 +08:00
lemon橪
10dcf4473c 合并master 2021-08-06 11:59:20 +08:00
lemon橪
4c217b85e9 优化菜单设置权限功能,懒人版一件选中权限 2021-08-06 11:58:53 +08:00
mabo
c75bd5208b 买家端商品分类,导航加载报错问题,商家端跳转买家端商品地址代码优化,文件上传地址调用位置修改 2021-08-06 11:32:29 +08:00
mabo
1fe7c050a4 分销商品添加移除功能,删除无用接口 2021-08-06 09:40:12 +08:00
mabo
c6874acb1b pc端修改我的优惠券bug,样式,管理端删除添加秒杀活动功能 2021-08-05 18:07:11 +08:00
mabo
ffeef640da 店铺列表,搜索项,店铺状态字段错误 2021-08-05 17:35:52 +08:00
mabo
1f054b796d 积分商品流程完成,billpirce改为flowprice,必填项提示错误 2021-08-05 17:10:10 +08:00
mabo
35881e30e0 积分商品,搜索热词为null问题 2021-08-05 11:19:12 +08:00
pikachu
a8e55d230a Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2021-08-04 19:08:33 +08:00
pikachu
083576ab3f 更改微信提现状态 2021-08-04 19:08:04 +08:00
mabo
0387ac510a 管理端和商家端userInfo字段名变更,管理端会员详情,他的积分字段调整 2021-08-04 17:51:43 +08:00
mabo
726ae1f856 1. 第一次进入商品列表,商品分类未展示
2. 链接选择器,店铺开启状态展示错误
3. 从新装修楼层,楼层bug修改
4. 搜索热词为空是返回null,导致报错
5. 首页全部商品分类缓存问题
6. 修改菜单项缓存、添加设置
7. 店铺分类二级分类修改时无父级分类
2021-08-04 17:07:39 +08:00
mabo
483d8c3aef 链接选择器,店铺开启状态展示错误 2021-08-03 18:12:27 +08:00
mabo
db42d19f44 买家端订单详情添加操作,商品选择器,categoryId传参错误 2021-08-03 18:08:18 +08:00
mabo
d822c3c809 swiper问题 2021-08-03 10:40:38 +08:00
mabo
94719d58cd lock文件添加 2021-08-03 10:20:54 +08:00
mabo
307153801d 取消pakcge-lock.json的忽略 2021-08-03 10:08:07 +08:00
mabo
a771189939 swiper 报错 2021-08-03 09:53:50 +08:00
mabo
98c65eab46 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2021-08-03 09:23:39 +08:00
mabo
21a37db1da 删除无用代码 2021-08-03 09:23:36 +08:00
Chopper
4008816c66 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2021-08-02 18:45:01 +08:00
Chopper
925e84528c 修改结算页面展示字段 2021-08-02 18:44:28 +08:00
mabo
8d6ee03d88 首页展示秒杀商品,楼层装修页面调整 2021-08-02 18:13:08 +08:00
mabo
8cec0e6ab8 商家端列表页缓存 2021-07-31 15:49:54 +08:00
mabo
ad17d8b743 文件名大小写修改 2021-07-31 11:05:34 +08:00
mabo
2792d24e98 添加注释 2021-07-31 09:49:17 +08:00
mabo
ff92fd8d76 添加pc端代码注释 2021-07-30 18:17:01 +08:00
mabo
93ba1c134f 热搜词缓存 2021-07-30 17:11:36 +08:00
mabo
dc08d545a2 删除like模块引用 2021-07-30 16:13:31 +08:00
mabo
ca3cf71c6d 搜索热词,pc端注释,管理端结算单订单号字段错误 2021-07-30 15:59:14 +08:00
lemon橪
96beccad82 修改退款金额有问题bug 2021-07-29 17:39:35 +08:00
lemon橪
f63c21b17a 订单详情不加载问题 2021-07-29 15:49:10 +08:00
lemon橪
6b27278e6e 订单详情 不触发加载问题 2021-07-29 15:48:41 +08:00
mabo
cd0cd14f77 代码注释添加 2021-07-28 17:07:37 +08:00
mabo
94a9404b39 结算单添加积分,砍价价格字段 2021-07-28 10:56:37 +08:00
mabo
2385bbd912 积分展示问题 2021-07-28 09:24:37 +08:00
mabo
327d911f80 买家图片地址问题 2021-07-28 09:02:48 +08:00
mabo
83f0f01233 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2021-07-27 18:13:48 +08:00
mabo
877ccc059e 楼层装修接口多次调用,发票管理状态错误,售后详情打开多个会为空 2021-07-27 18:13:45 +08:00
lemon橪
9313d5a886 新增商品楼层装修模块 2021-07-27 18:13:24 +08:00
mabo
5fb6986a18 菜单管理保存时删除无用字段 2021-07-27 16:13:38 +08:00
mabo
eb4a5e4fdc 管理端注释添加完成 2021-07-27 15:59:34 +08:00
mabo
59e1aedbf3 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2021-07-26 18:12:17 +08:00
mabo
87980277bf 添加注释,删除无用代码,bug修改 2021-07-26 18:12:13 +08:00
Chopper
30fbe6ca83 no message 2021-07-26 16:03:39 +08:00
Chopper
31d28627f1 热词功能完善 2021-07-26 16:02:31 +08:00
mabo
df9ea021b3 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2021-07-26 14:47:22 +08:00
mabo
a198fc0161 添加注释,测试功能,选择部门组件报错,会员详情积分字段展示错误,售后原因添加标识判断是新增还是编辑 2021-07-26 14:47:18 +08:00
chopper711
64bfe1cdc2 !5 提现审核功能
Merge pull request !5 from pipi
2021-07-26 06:15:36 +00:00
pikachu
6a716fa531 提现申请审核 2021-07-24 17:38:19 +08:00
pikachu
05b4f67bd3 修复提现记录不展示 2021-07-24 11:46:41 +08:00
mabo
9130485631 添加注释,修改分销设置提交方式,左侧菜单无法选中问题 2021-07-23 18:05:05 +08:00
mabo
ae329419a6 页签切换,一级菜单也要选中,报错信息提示多个问题 2021-07-23 11:46:01 +08:00
mabo
66462b9085 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2021-07-22 18:05:59 +08:00
mabo
80d070bb67 管理端售后,添加跳转链接 2021-07-22 18:05:55 +08:00
lemon橪
916dd1a398 合并Master 2021-07-22 18:03:04 +08:00
lemon橪
502c77fb6e 优化角色权限样式 2021-07-22 18:02:47 +08:00
mabo
2f8946f372 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2021-07-22 14:25:59 +08:00
mabo
abc58298a3 logo替换为本地文件,商品搜索项折叠,售后展示平台退款订单 2021-07-22 14:25:55 +08:00
lemon橪
4809c3839b 修改售后单部分样式以及逻辑 2021-07-22 14:23:31 +08:00
lemon橪
7fbcdafa9b 合并master 2021-07-22 09:10:42 +08:00
lemon橪
b2180ecaf7 更改退货列表间距 2021-07-22 09:10:15 +08:00
mabo
6351bdb633 买家优惠券页面调整,订单导出添加参数,订单详情样式调整 2021-07-22 09:01:59 +08:00
mabo
75bff1edc4 会员中心添加首页按钮,pclogo改为阿里云地址,编辑折扣券没有传折扣值, 2021-07-21 15:27:39 +08:00
paulGao
f512caa81d 添加自定义分词管理 2021-07-21 08:00:24 +08:00
lemon橪
c3178eb7d0 合并master 2021-07-20 18:03:28 +08:00
lemon橪
562679b366 新增楼层装修砍价的编辑 2021-07-20 18:02:49 +08:00
mabo
eee0258061 物流公司切换禁用无效问题,pc退货添加物流信息回填,保存发票回显错误 2021-07-20 18:00:35 +08:00
mabo
0a248d89d5 物流公司switch切换无效,代码注释添加 2021-07-20 14:06:53 +08:00
mabo
5062cad2b0 商家端添加注释,删除无用代码,优化样式 2021-07-19 18:03:35 +08:00
mabo
07f41f5cb6 pc商品列表样式修改,商家注释添加,订单统计,退订单按钮样式 2021-07-16 17:57:24 +08:00
mabo
133febe7a7 代码注释添加 2021-07-15 10:19:56 +08:00
mabo
e74c6d9eda Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2021-07-14 18:01:03 +08:00
mabo
0499a9c237 批量上传、添加注释 2021-07-14 18:00:59 +08:00
pikachu
fbb24fd07f 修复积分字段展示问题 2021-07-13 18:55:20 +08:00
pikachu
0b62cba3b9 修改积分类型字段 2021-07-13 18:46:55 +08:00
mabo
0fd4645514 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui
# Conflicts:
#	seller/src/config/index.js
2021-07-13 18:16:10 +08:00
mabo
0e277a8e6d 前端首页下拉样式,头部样式,seller端批量上传 2021-07-13 18:15:32 +08:00
pikachu
d7da00582a Merge branch 'master' into qiuqiu 2021-07-12 23:44:29 +08:00
pikachu
953320526e 砍价第一版本 2021-07-12 23:43:59 +08:00
pikachu
726b11eb82 砍价第一版本 2021-07-12 23:42:59 +08:00
lemon橪
ca8d518fae 修改物流请求 2021-07-12 18:37:42 +08:00
lemon橪
3e3c101a1e 合并方法 2021-07-12 18:19:05 +08:00
lemon橪
c6417cf197 修改商家端物流这块请求方法 2021-07-12 18:18:49 +08:00
mabo
4c0aec2f42 文章分类,订单列表,商品分类,收款记录等页面bug修改 2021-07-09 17:58:31 +08:00
mabo
7331fcbb17 Merge branch 'ma' 2021-07-09 15:21:28 +08:00
mabo
f5faad982c 发布商品代码拆分完成,管理端订单设置修改 2021-07-09 15:04:02 +08:00
mabo
48c0dcb69b bug修改 2021-07-08 14:36:05 +08:00
mabo
0504592f7d 拆分代码 2021-07-08 09:24:42 +08:00
mabo
9ff4197ec4 no message 2021-07-07 17:45:38 +08:00
mabo
c835616ad2 Merge branch 'master' into ma
# Conflicts:
#	buyer/src/components/goodsDetail/ShowGoodsDetail.vue
#	buyer/src/config/index.js
#	seller/src/views/goods/goods-seller/goodsOperation.vue
2021-07-07 16:14:23 +08:00
mabo
e5449213c2 no message 2021-07-07 16:12:55 +08:00
mabo
872a5d1982 左侧菜单选中设置 2021-07-07 16:03:48 +08:00
mabo
1246810c01 bug修改 2021-07-07 15:34:38 +08:00
mabo
fc393ecd64 部分bug修改 2021-07-05 17:53:23 +08:00
mabo
9b9295ea94 拆分发布商品代码 2021-07-05 16:08:12 +08:00
mabo
c403fce786 no message 2021-07-02 18:04:17 +08:00
mabo
31349634f6 Merge branch 'master' into ma
# Conflicts:
#	seller/src/views/goods/goods-seller/goodsOperation.vue
2021-07-02 17:38:14 +08:00
mabo
cc1afed902 分销提现,滑块验证bug修改 2021-07-02 16:45:52 +08:00
mabo
3a76ba2c1f 发布文章图片不回显,发布商品不选类型可以点下一步 2021-07-02 14:26:01 +08:00
mabo
da330b80c8 Merge branch 'master' into ma 2021-07-02 10:33:34 +08:00
mabo
1028b8189e 导出待发货订单 2021-07-02 10:32:15 +08:00
mabo
6988ad8bf0 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2021-07-02 09:50:28 +08:00
mabo
e318fe5be0 pc首页margin问题 2021-07-02 09:50:25 +08:00
lemon橪
4166a1ca58 合并master 2021-07-02 09:38:07 +08:00
lemon橪
35ea8adf7d 解决配送地址选择不回显bug 2021-07-02 09:37:46 +08:00
mabo
be2280907e 导出待发货订单 2021-07-02 09:10:53 +08:00
mabo
6100f1e39a 商品参数修改 2021-07-01 17:00:52 +08:00
mabo
5368f3c323 发布商品,选择模板后跳到商品编辑页面 2021-07-01 16:32:41 +08:00
mabo
be1a05e566 Revert "no message"
This reverts commit 0a02195ca6.
2021-07-01 16:04:06 +08:00
mabo
0a02195ca6 no message 2021-07-01 16:03:59 +08:00
mabo
6887b6c624 issues上bug修改 2021-07-01 16:02:12 +08:00
mabo
f7167912e7 商品sku只展示一个问题 2021-06-30 17:41:24 +08:00
mabo
14feac43fe Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2021-06-30 15:51:18 +08:00
mabo
c9e58f3586 修改bug 2021-06-30 15:51:14 +08:00
mabo
e493f26442 拆分发布商品代码 2021-06-29 17:53:50 +08:00
mabo
f973cadd80 Merge branch 'master' into ma 2021-06-29 15:29:59 +08:00
mabo
9fbc61f742 拆分商品发布代码 2021-06-29 11:50:37 +08:00
591 changed files with 44917 additions and 44692 deletions

3
.idea/misc.xml generated
View File

@@ -3,4 +3,7 @@
<component name="JavaScriptSettings">
<option name="languageLevel" value="ES6" />
</component>
<component name="WebPackConfiguration">
<option name="mode" value="DISABLED" />
</component>
</project>

253
README.md
View File

@@ -1,110 +1,138 @@
## Lilishop B2B2C商城系统
## 🔥 Lilishop B2B2C商城系统
##### 🌹 开源不易如有帮助请点Star
#### 欢迎交流需求,交流业务,交流技术(基础问题自行解决,进群先看文档后提问)
##### 交流 qq 1群 961316482已满
##### 交流 qq 2群 875294241
##### 商城 公众号/小程序体验,扫描二维码
##### 官方公众号 & 开源不易如有帮助请点Star
![image-20210511171611793](https://pickmall.cn/assets/imgs/h5-qrcode.png)
[![star](https://gitee.com/beijing_hongye_huicheng/lilishop/badge/star.svg?theme=dark)](https://gitee.com/beijing_hongye_huicheng/lilishop/stargazers)
&nbsp;&nbsp;![github](https://img.shields.io/github/stars/hongyehuicheng/lilishop.svg?style=social&logo=#181717)
### 介绍
### 🔥 商城介绍
**官网**https://pickmall.cn
Lilishop 是一款Java开发基于SpringBoot研发B2B2C多用户商城前端使用 Vue、uniapp开发 **系统全端全部代码开源**
Lilishop 商城系统 基于SpringBoot 研发B2B2C多用户商城系统,前端使用 Vue、uniapp开发 **系统全端全部代码开源**
产品前后端分离、支持分布式部署
业务兼容O2O商城/B2B商城/B2B2C商城/F2B2C商城/S2B2C商城。支持小程序商城、H5商城、APP商城、 PC商城
商城展示端包含 PC、H5、微信小程序、APP。
商城前后端分离、支持分布式部署。
商城包含 会员模块、**第三方登录模块**、**第三方支付模块**、**楼层装修模块**、订单模块、分销模块、文章模块、系统设置模块、流量分析模块
系统包含各种中间件、搜索引擎、多级缓存、分布式事务、分布式任务调度等支持Docker支持k8s。是一款高性能支持高并发商城系统。
商城包含各种中间件、搜索引擎、多级缓存、分布式事务、分布式任务调度等支持Docker支持k8s。是一款高性能支持高并发商城系统。
开箱即用,简单配置即可部署一套属于您的系统。
##### 商城 API/消费者 聚合版
api不需要单独部署只需启动一个jar包就可以正常运转 如有需要可以点击跳转https://gitee.com/beijing_hongye_huicheng/lilishop-simplify
### 文档
### ☃️ 商城 开发/使用/常见问题 帮助文档
**产品文档**(需求、架构、使用、部署、开发):https://docs.pickmall.cn
https://docs.pickmall.cn
### 💧 开源商城项目地址(gitee)
**API商城所有API**https://gitee.com/beijing_hongye_huicheng/lilishop.git
**UI商城管理端/商家端/买家PC端** https://gitee.com/beijing_hongye_huicheng/lilishop-ui.git
**uniapp商城移动端支持小程序/APP/H5**https://gitee.com/beijing_hongye_huicheng/lilishop-uniapp.git
**docker一键部署商城部署脚本**https://gitee.com/beijing_hongye_huicheng/docker.git
### 💧 开源商城项目地址(github)
**API商城所有API**https://github.com/hongyehuicheng/lilishop.git
**UI商城管理端/商家端/买家PC端** https://github.com/hongyehuicheng/lilishop-ui.git
**uniapp商城移动端支持小程序/APP/H5**https://github.com/hongyehuicheng/lilishop-uniapp.git
**docker一键部署商城部署脚本**https://github.com/hongyehuicheng/docker.git
### 项目链接(gitee)
☃️ UI 项目下3个文件夹 buyer买家PC端seller商家端manager后台管理端
**Java后台**https://gitee.com/beijing_hongye_huicheng/lilishop.git
**Vue后台前端** https://gitee.com/beijing_hongye_huicheng/lilishop-ui.git
### 💧 演示地址(手机验证码为 111111)
**Uni-app**https://gitee.com/beijing_hongye_huicheng/lilishop-uniapp.git
**商城管理端**https://admin-b2b2c.pickmall.cn 账号admin/123456
**docker一键部署**https://gitee.com/beijing_hongye_huicheng/docker.git
**商城店铺后台**https://store-b2b2c.pickmall.cn 账号13011111111/111111
### 项目链接(github)
**商城PC页面**https://pc-b2b2c.pickmall.cn
**Java后台**https://github.com/hongyehuicheng/lilishop.git
**商城移动端(请使浏览器手机模式,或者用手机浏览器打开)**https://m-b2b2c.pickmall.cn
**Vue后台前端** https://github.com/hongyehuicheng/lilishop-ui.git
**Uni-app**https://github.com/hongyehuicheng/lilishop-uniapp.git
**docker一键部署**https://github.com/hongyehuicheng/docker.git
### 演示地址
**运营后台**https://admin-b2b2c.pickmall.cn 账号admin/123456
**店铺后台**https://store-b2b2c.pickmall.cn 账号13011111111/111111
**用户前台**https://pc-b2b2c.pickmall.cn
**移动端**https://m-b2b2c.pickmall.cn
**小程序/公众号**:扫描二维码
![image-20210511171611793](https://pickmall.cn/assets/imgs/h5-qrcode.png)
### 3行命令搭建本地环境
### 🚙 3行命令搭建本地商城(注:只能本机访问,如需调整,请自行操作镜像)
温馨提示由于服务较多如果笔记本环境启动内存没有32g可能无法启动成功macbookpro 2020 16g内存启动无法成功台式机在16g内存、AMD 3700x 的ubuntu系统成功运行。
温馨提示:由于服务中间件较多如果笔记本环境启动内存没有32g可能无法启动成功macbookpro 2020 16g内存启动无法成功台式机在16g内存、AMD 3700x 的ubuntu系统成功运行。
##### 下载docker脚本
##### docker环境安装 [点击跳转](https://docs.pickmall.cn/deploy/%E8%BF%90%E8%A1%8C%E7%8E%AF%E5%A2%83%E5%87%86%E5%A4%87.html)
##### 下载docker-compose脚本
`git clone https://gitee.com/beijing_hongye_huicheng/docker.git `
##### 部署基础环境
##### 部署商城所需中间件
`docker-compose up -d`
##### 部署应用
##### 部署商城应用
`docker-compose -f docker-compose-application.yml up -d`
PS:单独部署的话,数据库文件访问这里:https://gitee.com/beijing_hongye_huicheng/docker/tree/master/init/mysql
PS:商城数据库单独部署 https://gitee.com/beijing_hongye_huicheng/docker/tree/master/init/mysql 这里有与tag版本一致的sql根据tag获取sql如果使用master代码则需要在lilishop项目根目录的DB目录中获取对应的升级sql。
##### 各个地址
##### 商城 API/UI 地址
| API | 地址 |
| -------------- | --------------- |
| 买家API | http://127.0.0.1:8888 |
| 商家API | http://127.0.0.1:8889 |
| 管理端API | http://127.0.0.1:8887 |
| 通用API | http://127.0.0.1:8890 |
| 商城买家API | http://127.0.0.1:8888 |
| 商城商家API | http://127.0.0.1:8889 |
| 商城管理端API | http://127.0.0.1:8887 |
| 商城基础API | http://127.0.0.1:8890 |
| 前端演示 | 地址 |
| -------------- | --------------- |
| PC | http://127.0.0.1:10000 |
| WAP | http://127.0.0.1:10001 |
| 商 | http://127.0.0.1:10002 |
| 管理端 | http://127.0.0.1:10003 |
| 商城PC端 | http://127.0.0.1:10000 |
| 商城WAP | http://127.0.0.1:10001 |
| 商城卖家端 | http://127.0.0.1:10002 |
| 商城管理端 | http://127.0.0.1:10003 |
### 功能列表
### ⚾️ 功能列表
#### 平台功能
#### 🥎 商城平台功能
![平台功能](https://pickmall.cn/assets/imgs/other/managerList.jpg)
#### 商家端功能
#### 🥎 商城卖家功能
![商家端功能](https://pickmall.cn/assets/imgs/other/storeList.jpg)
@@ -112,30 +140,28 @@ PS:单独部署的话数据库文件访问这里https://gitee.com/beijing_
### 功能展示
### 🧩 商城前端功能展示
#### 移动端
<img src="https://pickmall.cn/assets/imgs/other/app.gif" alt="管理端功能展示" style="zoom:50%;" />
#### ⚽️ 商城移动端
<img src="https://pickmall.cn/assets/imgs/other/app.gif" alt="移动端功能展示" style="zoom:50%;" />
#### 管理端
#### ⚽️ 商城管理端
![管理端功能展示](https://pickmall.cn/assets/imgs/other/manager.gif)
### 技术选型
### 商城技术选型
#### 架构图
#### 🥅 架构图
![架构](https://lili-system.oss-cn-beijing.aliyuncs.com/docs/%E6%9E%B6%E6%9E%84.png)
##### Java后台
##### 🕹 后台技术选型
| 说明 | 框架 | 说明 | |
| -------------- | --------------- | -------------- | ------------- |
@@ -149,7 +175,7 @@ PS:单独部署的话数据库文件访问这里https://gitee.com/beijing_
| 短信 | 阿里云短信 | 认证 | JWT |
| 日志处理 | Log4j | 接口规范 | RESTful |
##### 前端-运营后台、店铺后台
##### 🖥 前端-运营后台、店铺后台
| 说明 | 框架 | 说明 | 框架 |
| ---------- | ---------- | ---------- | ------- |
@@ -159,119 +185,34 @@ PS:单独部署的话数据库文件访问这里https://gitee.com/beijing_
| 基础UI库 | iView | UI界面基于 | iView |
| 网络请求 | axios | | |
##### 前端-移动端
##### 📱前端-移动端
| 说明 | 架构 | 说明 | 架构 |
| --------- | ------- | -------- | ------- |
| 基础UI库 | uViewui | 基础框架 | uni-app |
| CSS预处理 | scss | 地图引擎 | amap |
### 升级计划
#### 计划每个月发布一个版本,具体时间可能有出入
时间2021年6月15日
### 🌟 版本升级
```
新增功能:
1.微信小程序直播
2.优惠券活动
3.新人赠券
4.准确发券
5.用户等级
6.数据导出
7.订单批量
8.APP版本升级检测
9.积分商城
功能优化:
1.优惠券有效期增加类型:设置领取后*内有效。
2.秒杀活动设置为每天开启,需设置秒杀活动开启时间。
3.店铺配送模板,配送地区如果选择省份则下方的市级地址不展示。
4.店铺配送模板支持,店铺包邮。
5.普通商品设置去除卖家承担运费。
商城后续会持续版本升级修复bug完善功能覆盖更多业务场景 o2o/b2b/s2b2b2c/跨境电商
后续会考虑推出微服务商城系统/商城中台等
```
时间2021年7月15日
```
新增功能:
1.会员权益
2.支持用户升级会员
3.供求单
4.IM腾讯云智服
5.服务商品
6.店铺支持订单核销
7.店铺自提点
功能优化:
1.用户分享商城、关注店铺、邀请新用户可获取积分、经验值。
```
时间2021年8月16日
```
新增功能:
1.微淘功能
2.店铺移动端
3.店铺发货单
```
时间2021年9月15日
```
新增功能:
增加供应商功能
```
### 版本升级
```
后续会持续版本升级修复bug完善功能覆盖更多业务场景 o2o/b2b/s2b2b2c/跨境电商
后续会考虑推出微服务/中台等 企业级版本
```
### 技术亮点
1.后端框架基于Springboot构建基于maven持久层使用MyBatisPlus。使用elasticsearch、redis、mongodb、rocketmq 等各种中间健。都是主流架构,轻松应对各种环境。
2.支持集群、分布式支持docker 轻松部署,解决各种复杂场景!
3.代码模块清晰主要分为三端api买家、卖家、管理各端API互相隔离自己鉴权自己操作业务。
4.使用阿里开源的RocketMQ基于mq解决各种并发场景解决事务一致性解决搞并发延迟场景问题。
5.项目使用多级缓存应用不同场景redis缓存业务数据、mongodb缓存关系型多对多关系问题、nginx缓存高频访问低频修改的页面。
6.支持各种联合登陆,支持各种客户端的支付问题,灵活配置灵活开启。
7.内置完善的楼层装修机制,各种拖拉拽,维护跳转页面或外网,即便是一个什么都不懂的运营也可以轻松掌握。
8.内置阿里短信接口可以在线申请短信模版。内置阿里oss系统可以对文件执行各种操作。oss商家端资源相互隔离。
10.强大的统计报表,统计效果,可以实现各个场景,包含在线人数,历史在线人数,活跃人数等信息。
11.标准Api接口、提供swagger文档快速二开。
12.分布式调度任务中心,解决分布式定时任务多次执行问题。
13.代码注释完善,快速上手。
14.非移动端采用IView框架各种自定义插件、选择器实现。移动端采用uniapp一次编写全端使用
15.已经对接好各种第三方插件,支持各种复杂等联合登陆,联合支付等场景。
### 开源须知
### ⚠️ 开源须知
1.仅允许用于个人学习研究使用.
2.禁止将本开源的代码和资源进行任何形式任何名义的出售.
3.限制商用如果需要商业使用请联系我们。QQ3409056806.
3.软件受国家计算机软件著作权保护登记号2021SR0805085
### 交流群
4.限制商用如果需要商业使用请联系我们。QQ3409056806.
**QQ群**961316482
### 🐧 交流群
##### 官方qq 1群 961316482已满
##### 官方qq 2群 875294241

1
buyer/.gitignore vendored
View File

@@ -12,4 +12,3 @@ yarn-error.log*
*.ntvs*
*.njsproj
*.sln
package-lock.json

5
buyer/.npmrc Normal file
View File

@@ -0,0 +1,5 @@
# 默认依赖包指定淘宝源
registry=https://registry.npm.taobao.org/
sass_binary_site=https://npm.taobao.org/mirrors/node-sass/
phantomjs_cdnurl=https://npm.taobao.org/mirrors/phantomjs/
electron_mirror=https://npm.taobao.org/mirrors/electron/

View File

@@ -1,10 +0,0 @@
// https://github.com/michael-ciniawsky/postcss-load-config
module.exports = {
"plugins": {
"postcss-import": {},
"postcss-url": {},
// to target browsers: use "browserslist" field in package.json
"autoprefixer": {}
}
}

5
buyer/.yarnrc Normal file
View File

@@ -0,0 +1,5 @@
registry "https://registry.npmmirror.com"
sass_binary_site "https://npmmirror.com/mirrors/node-sass"
phantomjs_cdnurl "https://npmmirror.com/mirrors/phantomjs"
electron_mirror "https://npmmirror.com/mirrors/electron"

View File

View File

@@ -1,25 +1,19 @@
### 全局css src/assets/styles
# new
### 工具类 src/plugins
## Project setup
```
npm install
```
### 顶部广告页 src/components/advertising
### 全部商品分类 components/nav
### 底部导航栏 components/footer
### 发票模态框 components/invoiceModal
### 商品详情 pages/GoodsDetail.vue
#### 商品详情组件 components/goodsDetail
### 全部商品分类 pages/AllCategories.vue
### 意见反馈 pages/Feedback.vue
### 卡片的封装 components/card
### 购物车 pages/Cart.vue
### Compiles and hot-reloads for development
```
npm run serve
```
### Compiles and minifies for production
```
npm run build
```
### Customize configuration
See [Configuration Reference](https://cli.vuejs.org/config/).

5
buyer/babel.config.js Normal file
View File

@@ -0,0 +1,5 @@
module.exports = {
presets: [
'@vue/cli-plugin-babel/preset'
]
}

View File

@@ -1,41 +0,0 @@
'use strict'
require('./check-versions')()
process.env.NODE_ENV = 'production'
const ora = require('ora')
const rm = require('rimraf')
const path = require('path')
const chalk = require('chalk')
const webpack = require('webpack')
const config = require('../config')
const webpackConfig = require('./webpack.prod.conf')
const spinner = ora('building for production...')
spinner.start()
rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => {
if (err) throw err
webpack(webpackConfig, (err, stats) => {
spinner.stop()
if (err) throw err
process.stdout.write(stats.toString({
colors: true,
modules: false,
children: false, // If you are using ts-loader, setting this to true will make TypeScript errors show up during build.
chunks: false,
chunkModules: false
}) + '\n\n')
if (stats.hasErrors()) {
console.log(chalk.red(' Build failed with errors.\n'))
process.exit(1)
}
console.log(chalk.cyan(' Build complete.\n'))
console.log(chalk.yellow(
' Tip: built files are meant to be served over an HTTP server.\n' +
' Opening index.html over file:// won\'t work.\n'
))
})
})

View File

@@ -1,54 +0,0 @@
'use strict'
const chalk = require('chalk')
const semver = require('semver')
const packageConfig = require('../package.json')
const shell = require('shelljs')
function exec (cmd) {
return require('child_process').execSync(cmd).toString().trim()
}
const versionRequirements = [
{
name: 'node',
currentVersion: semver.clean(process.version),
versionRequirement: packageConfig.engines.node
}
]
if (shell.which('npm')) {
versionRequirements.push({
name: 'npm',
currentVersion: exec('npm --version'),
versionRequirement: packageConfig.engines.npm
})
}
module.exports = function () {
const warnings = []
for (let i = 0; i < versionRequirements.length; i++) {
const mod = versionRequirements[i]
if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) {
warnings.push(mod.name + ': ' +
chalk.red(mod.currentVersion) + ' should be ' +
chalk.green(mod.versionRequirement)
)
}
}
if (warnings.length) {
console.log('')
console.log(chalk.yellow('To use this template, you must update following to modules:'))
console.log()
for (let i = 0; i < warnings.length; i++) {
const warning = warnings[i]
console.log(' ' + warning)
}
console.log()
process.exit(1)
}
}

View File

@@ -1,110 +0,0 @@
'use strict'
const path = require('path')
const config = require('../config')
const ExtractTextPlugin = require('extract-text-webpack-plugin')
const packageConfig = require('../package.json')
exports.assetsPath = function (_path) {
const assetsSubDirectory = process.env.NODE_ENV === 'production'
? config.build.assetsSubDirectory
: config.dev.assetsSubDirectory
return path.posix.join(assetsSubDirectory, _path)
}
exports.cssLoaders = function (options) {
options = options || {}
const cssLoader = {
loader: 'css-loader',
options: {
sourceMap: options.sourceMap
}
}
const postcssLoader = {
loader: 'postcss-loader',
options: {
sourceMap: options.sourceMap
}
}
// generate loader string to be used with extract text plugin
function generateLoaders (loader, loaderOptions) {
const loaders = options.usePostCSS ? [cssLoader, postcssLoader] : [cssLoader]
if (loader) {
loaders.push({
loader: loader + '-loader',
options: Object.assign({}, loaderOptions, {
sourceMap: options.sourceMap
})
})
}
// Extract CSS when that option is specified
// (which is the case during production build)
if (options.extract) {
return ExtractTextPlugin.extract({
use: loaders,
fallback: 'vue-style-loader',
publicPath: '../../'
})
} else {
return ['vue-style-loader'].concat(loaders)
}
}
// https://vue-loader.vuejs.org/en/configurations/extract-css.html
return {
css: generateLoaders(),
postcss: generateLoaders(),
less: generateLoaders('less' , { javascriptEnabled : true }),
sass: generateLoaders('sass', { indentedSyntax: true }),
scss: generateLoaders('sass').concat(
{
loader: 'sass-resources-loader',
options: {
//你自己的scss全局文件的路径
resources: path.resolve(__dirname, '../src/assets/styles/global.scss')
}
}
),
stylus: generateLoaders('stylus'),
styl: generateLoaders('stylus')
}
}
// Generate loaders for standalone style files (outside of .vue)
exports.styleLoaders = function (options) {
const output = []
const loaders = exports.cssLoaders(options)
for (const extension in loaders) {
const loader = loaders[extension]
output.push({
test: new RegExp('\\.' + extension + '$'),
use: loader
})
}
return output
}
exports.createNotifierCallback = () => {
const notifier = require('node-notifier')
return (severity, errors) => {
if (severity !== 'error') return
const error = errors[0]
const filename = error.file && error.file.split('!').pop()
notifier.notify({
title: packageConfig.name,
message: severity + ': ' + error.name,
subtitle: filename || '',
icon: path.join(__dirname, 'logo.png')
})
}
}

View File

@@ -1,22 +0,0 @@
'use strict'
const utils = require('./utils')
const config = require('../config')
const isProduction = process.env.NODE_ENV === 'production'
const sourceMapEnabled = isProduction
? config.build.productionSourceMap
: config.dev.cssSourceMap
module.exports = {
loaders: utils.cssLoaders({
sourceMap: sourceMapEnabled,
extract: isProduction
}),
cssSourceMap: sourceMapEnabled,
cacheBusting: config.dev.cacheBusting,
transformToRequire: {
video: ['src', 'poster'],
source: 'src',
img: 'src',
image: 'xlink:href'
}
}

View File

@@ -1,111 +0,0 @@
'use strict'
const path = require('path')
const utils = require('./utils')
const config = require('../config')
const vueLoaderConfig = require('./vue-loader.conf')
function resolve (dir) {
return path.join(__dirname, '..', dir)
}
const createLintingRule = () => ({
test: /\.(js|vue)$/,
loader: 'eslint-loader',
enforce: 'pre',
include: [resolve('src'), resolve('test')],
options: {
formatter: require('eslint-friendly-formatter'),
emitWarning: !config.dev.showEslintErrorsInOverlay
}
})
module.exports = {
context: path.resolve(__dirname, '../'),
entry: {
app: './src/main.js'
},
output: {
path: config.build.assetsRoot,
filename: '[name].js',
publicPath: process.env.NODE_ENV === 'production'
? config.build.assetsPublicPath
: config.dev.assetsPublicPath
},
resolve: {
extensions: ['.js', '.vue', '.json'],
alias: {
'vue$': 'vue/dist/vue.esm.js',
'@': resolve('src'),
}
},
module: {
rules: [
// ...(config.dev.useEslint ? [createLintingRule()] : []),
{
test: /\.vue$/,
loader: 'vue-loader',
options: vueLoaderConfig
},
{
test: /\.scss$/,
loaders: ['style', 'css', 'sass']
},
// {
// test: /\.less$/,
// loader: "style-loader!css-loader!less-loader",
// },
{
test: /\.js$/,
loader: 'babel-loader',
include: [resolve('src'), resolve('test'), resolve('node_modules/webpack-dev-server/client')]
},
{
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 10000,
name: utils.assetsPath('img/[name].[hash:7].[ext]')
}
},
{
test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 10000,
name: utils.assetsPath('media/[name].[hash:7].[ext]')
}
},
{
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 10000,
name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
}
},
{
test: /\.(cur)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 10000,
name: utils.assetsPath('cur/[name].[hash:7].[ext]')
}
}
]
},
node: {
// prevent webpack from injecting useless setImmediate polyfill because Vue
// source contains it (although only uses it if it's native).
setImmediate: false,
// prevent webpack from injecting mocks to Node native modules
// that does not make sense for the client
dgram: 'empty',
fs: 'empty',
net: 'empty',
tls: 'empty',
child_process: 'empty'
}
}

View File

@@ -1,95 +0,0 @@
'use strict'
const utils = require('./utils')
const webpack = require('webpack')
const config = require('../config')
const merge = require('webpack-merge')
const path = require('path')
const baseWebpackConfig = require('./webpack.base.conf')
const CopyWebpackPlugin = require('copy-webpack-plugin')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
const portfinder = require('portfinder')
const HOST = process.env.HOST
const PORT = process.env.PORT && Number(process.env.PORT)
const devWebpackConfig = merge(baseWebpackConfig, {
module: {
rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true })
},
// cheap-module-eval-source-map is faster for development
devtool: config.dev.devtool,
// these devServer options should be customized in /config/index.js
devServer: {
clientLogLevel: 'warning',
historyApiFallback: {
rewrites: [
{ from: /.*/, to: path.posix.join(config.dev.assetsPublicPath, 'index.html') },
],
},
hot: true,
contentBase: false, // since we use CopyWebpackPlugin.
compress: true,
host: HOST || config.dev.host,
port: PORT || config.dev.port,
open: config.dev.autoOpenBrowser,
overlay: config.dev.errorOverlay
? { warnings: false, errors: true }
: false,
publicPath: config.dev.assetsPublicPath,
proxy: config.dev.proxyTable,
quiet: true, // necessary for FriendlyErrorsPlugin
watchOptions: {
poll: config.dev.poll,
}
},
plugins: [
new webpack.DefinePlugin({
'process.env': require('../config/dev.env')
}),
new webpack.HotModuleReplacementPlugin(),
new webpack.NamedModulesPlugin(), // HMR shows correct file names in console on update.
new webpack.NoEmitOnErrorsPlugin(),
// https://github.com/ampedandwired/html-webpack-plugin
new HtmlWebpackPlugin({
filename: 'index.html',
template: 'index.html',
inject: true
}),
// copy custom static assets
new CopyWebpackPlugin([
{
from: path.resolve(__dirname, '../static'),
to: config.dev.assetsSubDirectory,
ignore: ['.*']
}
])
]
})
module.exports = new Promise((resolve, reject) => {
portfinder.basePort = process.env.PORT || config.dev.port
portfinder.getPort((err, port) => {
if (err) {
reject(err)
} else {
// publish the new Port, necessary for e2e tests
process.env.PORT = port
// add port to devServer config
devWebpackConfig.devServer.port = port
// Add FriendlyErrorsPlugin
devWebpackConfig.plugins.push(new FriendlyErrorsPlugin({
compilationSuccessInfo: {
messages: [`Your application is running here: http://${devWebpackConfig.devServer.host}:${port}`],
},
onErrors: config.dev.notifyOnErrors
? utils.createNotifierCallback()
: undefined
}))
resolve(devWebpackConfig)
}
})
})

View File

@@ -1,145 +0,0 @@
'use strict'
const path = require('path')
const utils = require('./utils')
const webpack = require('webpack')
const config = require('../config')
const merge = require('webpack-merge')
const baseWebpackConfig = require('./webpack.base.conf')
const CopyWebpackPlugin = require('copy-webpack-plugin')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const ExtractTextPlugin = require('extract-text-webpack-plugin')
const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin')
const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
const env = require('../config/prod.env')
const webpackConfig = merge(baseWebpackConfig, {
module: {
rules: utils.styleLoaders({
sourceMap: config.build.productionSourceMap,
extract: false,
usePostCSS: true
})
},
devtool: config.build.productionSourceMap ? config.build.devtool : false,
output: {
path: config.build.assetsRoot,
filename: utils.assetsPath('js/[name].[chunkhash].js'),
chunkFilename: utils.assetsPath('js/[id].[chunkhash].js')
},
plugins: [
// http://vuejs.github.io/vue-loader/en/workflow/production.html
new webpack.DefinePlugin({
'process.env': env
}),
new UglifyJsPlugin({
uglifyOptions: {
compress: {
warnings: false
}
},
sourceMap: config.build.productionSourceMap,
parallel: true
}),
// extract css into its own file
new ExtractTextPlugin({
filename: utils.assetsPath('css/[name].[contenthash].css'),
// Setting the following option to `false` will not extract CSS from codesplit chunks.
// Their CSS will instead be inserted dynamically with style-loader when the codesplit chunk has been loaded by webpack.
// It's currently set to `true` because we are seeing that sourcemaps are included in the codesplit bundle as well when it's `false`,
// increasing file size: https://github.com/vuejs-templates/webpack/issues/1110
allChunks: true,
}),
// Compress extracted CSS. We are using this plugin so that possible
// duplicated CSS from different components can be deduped.
new OptimizeCSSPlugin({
cssProcessorOptions: config.build.productionSourceMap
? { safe: true, map: { inline: false } }
: { safe: true }
}),
// generate dist index.html with correct asset hash for caching.
// you can customize output by editing /index.html
// see https://github.com/ampedandwired/html-webpack-plugin
new HtmlWebpackPlugin({
filename: config.build.index,
template: 'index.html',
inject: true,
minify: {
removeComments: true,
collapseWhitespace: true,
removeAttributeQuotes: true
// more options:
// https://github.com/kangax/html-minifier#options-quick-reference
},
// necessary to consistently work with multiple chunks via CommonsChunkPlugin
chunksSortMode: 'dependency'
}),
// keep module.id stable when vendor modules does not change
new webpack.HashedModuleIdsPlugin(),
// enable scope hoisting
new webpack.optimize.ModuleConcatenationPlugin(),
// split vendor js into its own file
new webpack.optimize.CommonsChunkPlugin({
name: 'vendor',
minChunks (module) {
// any required modules inside node_modules are extracted to vendor
return (
module.resource &&
/\.js$/.test(module.resource) &&
module.resource.indexOf(
path.join(__dirname, '../node_modules')
) === 0
)
}
}),
// extract webpack runtime and module manifest to its own file in order to
// prevent vendor hash from being updated whenever app bundle is updated
new webpack.optimize.CommonsChunkPlugin({
name: 'manifest',
minChunks: Infinity
}),
// This instance extracts shared chunks from code splitted chunks and bundles them
// in a separate chunk, similar to the vendor chunk
// see: https://webpack.js.org/plugins/commons-chunk-plugin/#extra-async-commons-chunk
new webpack.optimize.CommonsChunkPlugin({
name: 'app',
async: 'vendor-async',
children: true,
minChunks: 3
}),
// copy custom static assets
new CopyWebpackPlugin([
{
from: path.resolve(__dirname, '../static'),
to: config.build.assetsSubDirectory,
ignore: ['.*']
}
])
]
})
if (config.build.productionGzip) {
const CompressionWebpackPlugin = require('compression-webpack-plugin')
webpackConfig.plugins.push(
new CompressionWebpackPlugin({
asset: '[path].gz[query]',
algorithm: 'gzip',
test: new RegExp(
'\\.(' +
config.build.productionGzipExtensions.join('|') +
')$'
),
threshold: 10240,
minRatio: 0.8
})
)
}
if (config.build.bundleAnalyzerReport) {
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
webpackConfig.plugins.push(new BundleAnalyzerPlugin())
}
module.exports = webpackConfig

View File

@@ -1,8 +0,0 @@
'use strict'
const merge = require('webpack-merge')
const prodEnv = require('./prod.env')
module.exports = merge(prodEnv, {
NODE_ENV: '"development"',
BASE_URL:''
})

View File

@@ -1,84 +0,0 @@
'use strict'
// Template version: 1.3.1
// see http://vuejs-templates.github.io/webpack for documentation.
const path = require('path')
// const api = 'http://www.baidu.com'
module.exports = {
dev: {
// Paths
assetsSubDirectory: 'static',
assetsPublicPath: '/',
proxyTable: {
// '/api': {
// target:api,
// changeOrigin:true,
// pathRewrite:{
// '^/api':''
// }
// }
},
// Various Dev Server settings
host: '0.0.0.0', // can be overwritten by process.env.HOST
port: 10000, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
autoOpenBrowser: false,
errorOverlay: true,
notifyOnErrors: true,
poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions-
// Use Eslint Loader?
// If true, your code will be linted during bundling and
// linting errors and warnings will be shown in the console.
useEslint: false,
// If true, eslint errors and warnings will also be shown in the error overlay
// in the browser.
showEslintErrorsInOverlay: false,
/**
* Source Maps
*/
// https://webpack.js.org/configuration/devtool/#development
devtool: 'cheap-module-eval-source-map',
// If you have problems debugging vue-files in devtools,
// set this to false - it *may* help
// https://vue-loader.vuejs.org/en/options.html#cachebusting
cacheBusting: true,
cssSourceMap: true
},
build: {
// Template for index.html
index: path.resolve(__dirname, '../dist/index.html'),
// Paths
assetsRoot: path.resolve(__dirname, '../dist'),
assetsSubDirectory: 'static',
assetsPublicPath: '/',
/**
* Source Maps
*/
productionSourceMap: true,
// https://webpack.js.org/configuration/devtool/#production
devtool: '#source-map',
// Gzip off by default as many popular static hosts such as
// Surge or Netlify already gzip all static assets for you.
// Before setting to `true`, make sure to:
// npm install --save-dev compression-webpack-plugin
productionGzip: false,
productionGzipExtensions: ['js', 'css'],
// Run the build command with an extra argument to
// View the bundle analyzer report after build finishes:
// `npm run build --report`
// Set to `true` or `false` to always turn it on or off
bundleAnalyzerReport: process.env.npm_config_report
}
}

View File

@@ -1,5 +0,0 @@
'use strict'
module.exports = {
NODE_ENV: '"production"',
BASE_URL:'http://www.baidu.com'
}

View File

@@ -1 +1 @@
docker build -t registry.cn-beijing.aliyuncs.com/lili-images/buyer-ui-4.2.0:0.0.2 .
docker build -t registry.cn-beijing.aliyuncs.com/lili-images/buyer-ui:4.2.4.1 .

View File

@@ -1,14 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="./static/logo.ico" type="image/x-icon">
<script src="https://yzf.qq.com/xv/web/static/chat_sdk/yzf_chat.min.js"></script>
<title>LILI</title>
</head>
<body>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
</html>

View File

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 19 KiB

9902
buyer/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,91 +1,42 @@
{
"name": "lilishop-vue",
"name": "lilishop",
"version": "1.0.0",
"private": true,
"scripts": {
"dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
"start": "npm run dev",
"lint": "eslint --ext .js,.vue src",
"build": "node build/build.js"
"dev": "vue-cli-service serve",
"serve": "vue-cli-service serve",
"build": "vue-cli-service build"
},
"dependencies": {
"@amap/amap-jsapi-loader": "0.0.7",
"axios": "^0.19.2",
"js-cookie": "^2.2.1",
"less": "^3.12.2",
"less": "^2.7.0",
"less-loader": "^5.0.0",
"mv-count-down": "^0.1.15",
"node-sass": "^4.14.1",
"psl": "^1.8.0",
"qs": "^6.9.4",
"swiper": "^5.2.0",
"sass-loader": "^7.3.1",
"uuid": "^8.3.2",
"v-distpicker": "^1.0.17",
"view-design": "^4.3.2",
"vue": "^2.5.2",
"vue-awesome": "^4.0.2",
"vue-awesome-swiper": "^4.1.1",
"vue": "^2.6.11",
"vue-awesome-swiper": "^3.1.3",
"vue-piczoom": "^1.0.6",
"vue-qr": "^2.3.0",
"vue-router": "^3.0.1",
"vuex": "^3.0.1"
},
"devDependencies": {
"autoprefixer": "^7.1.2",
"babel-core": "^6.22.1",
"babel-eslint": "^8.2.1",
"babel-helper-vue-jsx-merge-props": "^2.0.3",
"babel-loader": "^7.1.1",
"babel-plugin-syntax-jsx": "^6.18.0",
"babel-plugin-transform-runtime": "^6.22.0",
"babel-plugin-transform-vue-jsx": "^3.5.0",
"babel-preset-env": "^1.3.2",
"babel-preset-stage-2": "^6.22.0",
"chalk": "^2.0.1",
"copy-webpack-plugin": "^4.0.1",
"css-loader": "^0.28.0",
"eslint": "^4.15.0",
"eslint-config-standard": "^10.2.1",
"eslint-friendly-formatter": "^3.0.0",
"eslint-loader": "^1.7.1",
"eslint-plugin-import": "^2.7.0",
"eslint-plugin-node": "^5.2.0",
"eslint-plugin-promise": "^3.4.0",
"eslint-plugin-standard": "^3.0.1",
"eslint-plugin-vue": "^4.0.0",
"extract-text-webpack-plugin": "^3.0.0",
"file-loader": "^1.1.4",
"friendly-errors-webpack-plugin": "^1.6.1",
"html-webpack-plugin": "^2.30.1",
"node-notifier": "^5.1.2",
"node-sass": "^4.14.1",
"optimize-css-assets-webpack-plugin": "^3.2.0",
"ora": "^1.2.0",
"portfinder": "^1.0.13",
"postcss-import": "^11.0.0",
"postcss-loader": "^2.0.8",
"postcss-url": "^7.2.1",
"rimraf": "^2.6.0",
"@vue/cli-service": "~4.5.0",
"compression-webpack-plugin": "^5.0.0",
"sass-loader": "^7.3.1",
"sass-resources-loader": "^2.0.3",
"semver": "^5.3.0",
"shelljs": "^0.7.6",
"uglifyjs-webpack-plugin": "^1.1.1",
"url-loader": "^0.5.8",
"vue-loader": "^13.3.0",
"vue-style-loader": "^3.0.1",
"vue-template-compiler": "^2.5.2",
"webpack": "^3.6.0",
"webpack-bundle-analyzer": "^2.9.0",
"webpack-dev-server": "^2.9.1",
"webpack-merge": "^4.1.0"
},
"engines": {
"node": ">= 6.0.0",
"npm": ">= 3.0.0"
"uglifyjs-webpack-plugin": "^2.2.0",
"vue-template-compiler": "^2.6.11"
},
"browserslist": [
"> 1%",
"last 2 versions",
"not ie <= 8"
"not dead"
]
}

17
buyer/public/config.js Normal file
View File

@@ -0,0 +1,17 @@
var BASE = {
/**
* @description api请求基础路径
*/
API_DEV: {
common: "https://common-api.pickmall.cn",
buyer: "https://buyer-api.pickmall.cn",
seller: "https://store-api.pickmall.cn",
manager: "https://admin-api.pickmall.cn"
},
API_PROD: {
common: "https://common-api.pickmall.cn",
buyer: "https://buyer-api.pickmall.cn",
seller: "https://store-api.pickmall.cn",
manager: "https://admin-api.pickmall.cn"
},
};

25
buyer/public/index.html Normal file
View File

@@ -0,0 +1,25 @@
<!DOCTYPE html>
<html lang="">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>logo.ico">
<title><%= htmlWebpackPlugin.options.title %></title>
<% for(var css of htmlWebpackPlugin.options.cdn.css) { %>
<link rel="stylesheet" href="<%=css%>" />
<% } %>
</head>
<body>
<% for(var js of htmlWebpackPlugin.options.cdn.js) { %>
<script src="<%=js%>"></script>
<% } %>
<script src="/config.js"></script>
<noscript>
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
</html>

BIN
buyer/public/logo.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

View File

@@ -5,33 +5,14 @@
</template>
<script>
import {v4 as uuidv4} from 'uuid';
import storage from '@/plugins/storage';
import {getLogo} from '@/api/common.js';
export default {
name: 'App',
mounted () {
let uuid = storage.getItem('uuid');
if (!uuid) {
uuid = uuidv4();
storage.setItem('uuid', uuid);
}
if (!this.Cookies.getItem('logo')) {
setTimeout(() => {
getLogo().then(res => {
if (res.success) {
let logoObj = JSON.parse(res.result.settingValue)
this.Cookies.setItem('logo', logoObj.buyerSideLogo)
}
})
}, 1000)
}
}
};
</script>
<style lang="scss">
#app{
height: 100%;
@include background_color($light_background_color);
}
</style>

View File

@@ -11,7 +11,7 @@ import request, {Method} from '@/plugins/request.js'
// 获取密码状态
export function getPwdStatus (params) {
return request({
url: '/buyer/members/wallet/check',
url: '/buyer/passport/member/wallet/check',
method: Method.GET,
needToken: true,
params
@@ -21,7 +21,7 @@ export function getPwdStatus (params) {
// 设置密码
export function setPwd (params) {
return request({
url: '/buyer/members/wallet/set-password',
url: '/buyer/passport/member/wallet/set-password',
method: Method.POST,
needToken: true,
data: params
@@ -31,7 +31,7 @@ export function setPwd (params) {
// 设置支付密码
export function setUpdatePwdOrdinary (params) {
return request({
url: '/buyer/members/wallet/update-password/ordinary',
url: '/buyer/passport/member/wallet/update-password/ordinary',
method: Method.GET,
needToken: true,
data: params
@@ -41,7 +41,7 @@ export function setUpdatePwdOrdinary (params) {
// 修改会员资料
export function editMemberInfo (params) {
return request({
url: '/buyer/members/editOwn',
url: '/buyer/passport/member/editOwn',
method: Method.PUT,
needToken: true,
data: params
@@ -51,9 +51,18 @@ export function editMemberInfo (params) {
// 修改密码
export function editPwd (params) {
return request({
url: `/buyer/members/modifyPass`,
url: `/buyer/passport/member/modifyPass`,
method: Method.PUT,
needToken: true,
data: params
})
}
// 获取密码状态
export function logout () {
return request({
url: '/buyer/passport/member/logout',
method: Method.POST,
needToken: true
})
}

View File

@@ -5,7 +5,7 @@ import request, {
// 会员收货地址列表
export function memberAddress () {
return request({
url: '/buyer/memberAddress',
url: '/buyer/member/address',
needToken: true,
method: Method.GET
});
@@ -14,7 +14,7 @@ export function memberAddress () {
// 添加收货地址
export function newMemberAddress (params) {
return request({
url: '/buyer/memberAddress',
url: '/buyer/member/address',
needToken: true,
method: Method.POST,
data: params
@@ -24,7 +24,7 @@ export function newMemberAddress (params) {
// 编辑收货地址
export function editMemberAddress (params) {
return request({
url: '/buyer/memberAddress',
url: '/buyer/member/address',
needToken: true,
method: Method.PUT,
params
@@ -34,7 +34,7 @@ export function editMemberAddress (params) {
// 删除收货地址
export function delMemberAddress (id) {
return request({
url: `/buyer/memberAddress/delById/${id}`,
url: `/buyer/member/address/delById/${id}`,
needToken: true,
method: Method.DELETE
});
@@ -43,7 +43,7 @@ export function delMemberAddress (id) {
// 根据id获取会员地址详情
export function getAddrDetail (id) {
return request({
url: `/buyer/memberAddress/get/${id}`,
url: `/buyer/member/address/get/${id}`,
needToken: true,
method: Method.GET
});
@@ -52,7 +52,7 @@ export function getAddrDetail (id) {
// 传给后台citycode 获取城市街道等id
export function handleRegion (params) {
return request({
url: `${commonUrl}/common/region/region`,
url: `${commonUrl}/common/common/region/region`,
needToken: true,
method: Method.GET,
params

View File

@@ -5,7 +5,7 @@ import request, {Method, commonUrl} from '@/plugins/request.js';
*/
export function getVerifyImg (verificationEnums) {
return request({
url: `${commonUrl}/common/slider/${verificationEnums}`,
url: `${commonUrl}/common/common/slider/${verificationEnums}`,
method: Method.GET,
needToken: false
});
@@ -15,7 +15,7 @@ export function getVerifyImg (verificationEnums) {
*/
export function postVerifyImg (params) {
return request({
url: `${commonUrl}/common/slider/${params.verificationEnums}`,
url: `${commonUrl}/common/common/slider/${params.verificationEnums}`,
method: Method.POST,
needToken: false,
params
@@ -26,14 +26,14 @@ export function postVerifyImg (params) {
*/
export function sendSms (params) {
return request({
url: `${commonUrl}/common/sms/${params.verificationEnums}/${params.mobile}`,
url: `${commonUrl}/common/common/sms/${params.verificationEnums}/${params.mobile}`,
method: Method.GET,
needToken: false,
params
});
}
/**
* 发送短信验证码
* 获取logo图标
*/
export function getLogo () {
return request({
@@ -45,7 +45,7 @@ export function getLogo () {
// 地区数据,用于三级联动
export function getRegion (id) {
return request({
url: `${commonUrl}/common/region/item/${id}`,
url: `${commonUrl}/common/common/region/item/${id}`,
needToken: true,
method: Method.GET
});
@@ -57,7 +57,7 @@ export function getRegion (id) {
*/
export function articleList (params) {
return request({
url: `/buyer/article`,
url: `/buyer/other/article`,
method: Method.GET,
params
});
@@ -69,7 +69,7 @@ export function articleList (params) {
*/
export function articleCateList () {
return request({
url: `/buyer/article/articleCategory/list`,
url: `/buyer/other/article/articleCategory/list`,
method: Method.GET
});
}
@@ -77,7 +77,18 @@ export function articleCateList () {
// 通过id获取文章
export function articleDetail (id) {
return request({
url: `/buyer/article/get/${id}`,
url: `/buyer/other/article/get/${id}`,
method: Method.GET
});
}
// 获取IM接口前缀
export function getIMDetail () {
return request({
url: `${commonUrl}/common/IM`,
method: Method.GET
});
}

View File

@@ -5,7 +5,7 @@ import request, {
// 商品列表
export function goodsList (params) {
return request({
url: '/buyer/goods/es',
url: '/buyer/goods/goods/es',
method: Method.GET,
needToken: false,
params
@@ -15,7 +15,7 @@ export function goodsList (params) {
// 商品分类 筛选条件 品牌, 尺寸等
export function filterList (params) {
return request({
url: '/buyer/goods/es/related',
url: '/buyer/goods/goods/es/related',
method: Method.GET,
needToken: false,
params
@@ -25,7 +25,7 @@ export function filterList (params) {
// id获取商品详情
export function goodsDetail (goodsId) {
return request({
url: `/buyer/goods/get/${goodsId}`,
url: `/buyer/goods/goods/get/${goodsId}`,
method: Method.GET,
needToken: false
});
@@ -34,7 +34,7 @@ export function goodsDetail (goodsId) {
// id获取商品Sku详情
export function goodsSkuDetail (params) {
return request({
url: `/buyer/goods/sku/${params.goodsId}/${params.skuId}`,
url: `/buyer/goods/goods/sku/${params.goodsId}/${params.skuId}`,
method: Method.GET,
needToken: true,
params
@@ -44,7 +44,7 @@ export function goodsSkuDetail (params) {
// 获取所有商品分类
export function getCategory (parentId) {
return request({
url: `/buyer/category/get/${parentId}`,
url: `/buyer/goods/category/get/${parentId}`,
method: Method.GET,
needToken: false
});
@@ -60,12 +60,12 @@ export function pintuanMembers (pintuanId) {
}
/**
* @param {Number} start 搜索起始下标
* @param {Number} end 搜索结束下标
* 获取搜索热词
* @param {Number} count 获取搜索热词数量
*/
export function hotWords (params) {
return request({
url: `/buyer/goods/hot-words`,
url: `/buyer/goods/goods/hot-words`,
method: Method.GET,
needToken: false,
params

View File

@@ -3,7 +3,7 @@ import request, {Method} from '@/plugins/request.js'
// 获取首页楼层装修数据
export function indexData (params) {
return request({
url: '/buyer/pageData/getIndex',
url: '/buyer/other/pageData/getIndex',
method: Method.GET,
needToken: false,
params
@@ -17,7 +17,7 @@ export function indexData (params) {
*/
export function pageData (params) {
return request({
url: `/buyer/pageData`,
url: `/buyer/other/pageData`,
method: Method.GET,
needToken: false,
params
@@ -28,7 +28,7 @@ export function pageData (params) {
*/
export function handleRefreshToken (token) {
return request({
url: `/buyer/members/refresh/${token}`,
url: `/buyer/passport/member/refresh/${token}`,
method: Method.GET,
needToken: false
})

View File

@@ -6,7 +6,7 @@ import request, {Method, buyerUrl} from '@/plugins/request.js';
*/
export function regist (params) {
return request({
url: '/buyer/members/register',
url: '/buyer/passport/member/register',
method: Method.POST,
needToken: false,
data: params
@@ -18,7 +18,7 @@ export function regist (params) {
*/
export function login (params) {
return request({
url: '/buyer/members/userLogin',
url: '/buyer/passport/member/userLogin',
method: Method.POST,
needToken: false,
data: params,
@@ -31,7 +31,7 @@ export function login (params) {
*/
export function smsLogin (params) {
return request({
url: '/buyer/members/smsLogin',
url: '/buyer/passport/member/smsLogin',
method: Method.POST,
needToken: false,
data: params,
@@ -44,7 +44,7 @@ export function smsLogin (params) {
*/
export function getMemberMsg (params) {
return request({
url: '/buyer/members',
url: '/buyer/passport/member',
method: Method.GET,
needToken: true,
params
@@ -55,7 +55,7 @@ export function getMemberMsg (params) {
* 第三方登录 支付宝微博qq,微信
*/
export function webLogin (type) {
window.open(`${buyerUrl}/buyer/connect/login/web/${type}`, 'blank');
window.open(`${buyerUrl}/buyer/passport/connect/connect/login/web/${type}`, 'blank');
}
/**
@@ -63,7 +63,7 @@ export function webLogin (type) {
*/
export function loginCallback (uuid) {
return request({
url: `/buyer/connect/result?state=${uuid}`,
url: `/buyer/passport/connect/connect/result?state=${uuid}`,
method: Method.GET,
needToken: false
});
@@ -74,7 +74,7 @@ export function loginCallback (uuid) {
*/
export function validateCode (params) {
return request({
url: `/buyer/members/resetByMobile`,
url: `/buyer/passport/member/resetByMobile`,
method: Method.POST,
needToken: false,
params
@@ -86,7 +86,7 @@ export function validateCode (params) {
*/
export function resetPassword (params) {
return request({
url: `/buyer/members/resetPassword`,
url: `/buyer/passport/member/resetPassword`,
method: Method.POST,
needToken: false,
params

View File

@@ -3,7 +3,7 @@ import request, {Method} from '@/plugins/request.js';
// 查询账户余额
export function getMembersWallet () {
return request({
url: '/buyer/members/wallet',
url: '/buyer/passport/member/wallet',
method: Method.GET,
needToken: true
});
@@ -22,7 +22,7 @@ export function getDepositLog (params) {
// 查询充值记录
export function getRecharge (params) {
return request({
url: '/buyer/member/recharge',
url: '/buyer/wallet/recharge',
method: Method.GET,
needToken: true,
params
@@ -52,7 +52,7 @@ export function recharge (params) {
// 提现
export function withdrawalApply (params) {
return request({
url: '/buyer/members/wallet/withdrawal',
url: '/buyer/passport/member/wallet/withdrawal',
method: Method.POST,
needToken: true,
data: params
@@ -99,7 +99,7 @@ export function collectList (params) {
// 单个商品评价
export function goodsComment (params) {
return request({
url: `/buyer/memberEvaluation/${params.goodsId}/goodsEvaluation`,
url: `/buyer/member/evaluation/${params.goodsId}/goodsEvaluation`,
method: Method.GET,
needToken: false,
params
@@ -109,7 +109,7 @@ export function goodsComment (params) {
// 商品各评价类别数量
export function goodsCommentNum (goodsId) {
return request({
url: `/buyer/memberEvaluation/${goodsId}/evaluationNumber`,
url: `/buyer/member/evaluation/${goodsId}/evaluationNumber`,
method: Method.GET,
needToken: false
});
@@ -118,7 +118,7 @@ export function goodsCommentNum (goodsId) {
// 添加会员评价
export function addEvaluation (params) {
return request({
url: `/buyer/memberEvaluation`,
url: `/buyer/member/evaluation`,
method: Method.POST,
needToken: true,
params
@@ -128,7 +128,7 @@ export function addEvaluation (params) {
// 会员评价详情
export function evaluationDetail (id) {
return request({
url: `/buyer/memberEvaluation/get/${id}`,
url: `/buyer/member/evaluation/get/${id}`,
method: Method.GET,
needToken: true
});
@@ -195,7 +195,7 @@ export function receiveCoupon (couponId) {
// 获取申请售后列表
export function afterSaleList (params) {
return request({
url: `/buyer/afterSale/page`,
url: `/buyer/order/afterSale/page`,
method: Method.GET,
needToken: true,
params
@@ -205,7 +205,7 @@ export function afterSaleList (params) {
// 获取申请售后页面信息
export function afterSaleInfo (sn) {
return request({
url: `/buyer/afterSale/applyAfterSaleInfo/${sn}`,
url: `/buyer/order/afterSale/applyAfterSaleInfo/${sn}`,
method: Method.GET,
needToken: true
});
@@ -214,7 +214,7 @@ export function afterSaleInfo (sn) {
// 获取申请售后、投诉原因
export function afterSaleReason (serviceType) {
return request({
url: `/buyer/afterSale/get/afterSaleReason/${serviceType}`,
url: `/buyer/order/afterSale/get/afterSaleReason/${serviceType}`,
method: Method.GET,
needToken: true
});
@@ -222,7 +222,7 @@ export function afterSaleReason (serviceType) {
// 获取申请售后详情
export function afterSaleDetail (sn) {
return request({
url: `/buyer/afterSale/get/${sn}`,
url: `/buyer/order/afterSale/get/${sn}`,
method: Method.GET,
needToken: true
});
@@ -230,7 +230,7 @@ export function afterSaleDetail (sn) {
// 售后日志
export function afterSaleLog (sn) {
return request({
url: `/buyer/afterSale/get/getAfterSaleLog/${sn}`,
url: `/buyer/order/afterSale/get/getAfterSaleLog/${sn}`,
method: Method.GET,
needToken: true
});
@@ -239,7 +239,7 @@ export function afterSaleLog (sn) {
// 申请售后
export function applyAfterSale (params) {
return request({
url: `/buyer/afterSale/save/${params.orderItemSn}`,
url: `/buyer/order/afterSale/save/${params.orderItemSn}`,
method: Method.POST,
needToken: true,
params
@@ -249,7 +249,7 @@ export function applyAfterSale (params) {
// 取消售后申请
export function cancelAfterSale (afterSaleSn) {
return request({
url: `/buyer/afterSale/cancel/${afterSaleSn}`,
url: `/buyer/order/afterSale/cancel/${afterSaleSn}`,
method: Method.POST,
needToken: true
});
@@ -258,7 +258,7 @@ export function cancelAfterSale (afterSaleSn) {
// 投诉商品
export function handleComplain (data) {
return request({
url: `/buyer/complain`,
url: `/buyer/order/complain`,
method: Method.POST,
needToken: true,
data
@@ -267,7 +267,7 @@ export function handleComplain (data) {
// 分页获取我的投诉列表
export function complainList (params) {
return request({
url: `/buyer/complain`,
url: `/buyer/order/complain`,
method: Method.GET,
needToken: true,
params
@@ -279,7 +279,7 @@ export function complainList (params) {
*/
export function getComplainDetail (id) {
return request({
url: `/buyer/complain/${id}`,
url: `/buyer/order/complain/${id}`,
method: Method.GET,
needToken: true
});
@@ -290,7 +290,7 @@ export function getComplainDetail (id) {
*/
export function clearComplain (id) {
return request({
url: `/buyer/complain/status/${id}`,
url: `/buyer/order/complain/status/${id}`,
method: Method.PUT,
needToken: true
});
@@ -301,7 +301,7 @@ export function clearComplain (id) {
*/
export function distribution () {
return request({
url: `/buyer/distribution`,
url: `/buyer/distribution/distribution`,
method: Method.GET,
needToken: true
});
@@ -314,7 +314,7 @@ export function distribution () {
*/
export function applyDistribution (params) {
return request({
url: `/buyer/distribution`,
url: `/buyer/distribution/distribution`,
method: Method.POST,
needToken: true,
params
@@ -326,7 +326,7 @@ export function applyDistribution (params) {
*/
export function getDistOrderList (params) {
return request({
url: `/buyer/distribution/distributionOrder`,
url: `/buyer/distribution/order`,
method: Method.GET,
needToken: true,
params
@@ -338,7 +338,7 @@ export function getDistOrderList (params) {
*/
export function getDistGoodsList (params) {
return request({
url: `/buyer/distributionGoods`,
url: `/buyer/distribution/goods`,
method: Method.GET,
needToken: true,
params
@@ -346,14 +346,16 @@ export function getDistGoodsList (params) {
}
/**
* 选择分销商品
* 绑定、解绑分销商品
* @param distributionGoodsId 分销商品id
* @param checked 分销商品id,true为绑定false为解绑
*/
export function selectDistGoods (distributionGoodsId) {
export function selectDistGoods (params) {
return request({
url: `/buyer/distributionGoods/checked/${distributionGoodsId}`,
url: `/buyer/distribution/goods/checked/${params.distributionGoodsId}`,
method: Method.GET,
needToken: true
needToken: true,
params
});
}
@@ -388,7 +390,7 @@ export function distCash (params) {
*/
export function tracksList (params) {
return request({
url: `/buyer/footprint`,
url: `/buyer/member/footprint`,
method: Method.GET,
needToken: true,
params
@@ -400,7 +402,7 @@ export function tracksList (params) {
*/
export function clearTracks () {
return request({
url: `/buyer/footprint`,
url: `/buyer/member/footprint`,
method: Method.DELETE,
needToken: true
});
@@ -412,7 +414,7 @@ export function clearTracks () {
*/
export function clearTracksById (ids) {
return request({
url: `/buyer/footprint/delByIds/${ids}`,
url: `/buyer/member/footprint/delByIds/${ids}`,
method: Method.DELETE,
needToken: true
});
@@ -447,7 +449,7 @@ export function memberPointHistory (params) {
*/
export function memberMsgList (params) {
return request({
url: `/buyer/member/message`,
url: `/buyer/message/member`,
method: Method.GET,
needToken: true,
params
@@ -457,9 +459,10 @@ export function memberMsgList (params) {
* 设置消息为已读
* @param {String} messageId 消息id
*/
export function readMemberMsg (id) {
export function readMemberMsg (id) {
return request({
url: `/buyer/member/message/${id}`,
url: `/buyer/message/member/${id}`,
method: Method.PUT,
needToken: true
});
@@ -468,10 +471,22 @@ export function memberMsgList (params) {
* 删除会员消息
* @param {String} messageId 消息id
*/
export function delMemberMsg (id) {
export function delMemberMsg (id) {
return request({
url: `/buyer/member/message/${id}`,
url: `/buyer/message/member/${id}`,
method: Method.DELETE,
needToken: true
});
}
/**
* 绑定分销
* @param distributionId 商品分销ID
*/
export function getGoodsDistribution (distributionId) {
return request({
url: `/buyer/distribution/bindingDistribution/${distributionId}`,
method: Method.GET,
needToken: true
});
}

View File

@@ -5,7 +5,7 @@ import request, {
// 查询会员订单列表
export function getOrderList (params) {
return request({
url: `/buyer/orders`,
url: `/buyer/order/order`,
method: Method.GET,
needToken: true,
params
@@ -18,7 +18,7 @@ export function getOrderList (params) {
*/
export function orderDetail (orderSn) {
return request({
url: `/buyer/orders/${orderSn}`,
url: `/buyer/order/order/${orderSn}`,
method: Method.GET,
needToken: true
});
@@ -31,7 +31,7 @@ export function orderDetail (orderSn) {
*/
export function cancelOrder (params) {
return request({
url: `/buyer/orders/${params.orderSn}/cancel`,
url: `/buyer/order/order/${params.orderSn}/cancel`,
method: Method.POST,
needToken: true,
params
@@ -44,7 +44,7 @@ export function cancelOrder (params) {
*/
export function delOrder (orderSn) {
return request({
url: `/buyer/orders/${orderSn}`,
url: `/buyer/order/order/${orderSn}`,
method: Method.DELETE,
needToken: true
});
@@ -56,7 +56,7 @@ export function delOrder (orderSn) {
*/
export function sureReceived (orderSn) {
return request({
url: `/buyer/orders/${orderSn}/receiving`,
url: `/buyer/order/order/${orderSn}/receiving`,
method: Method.POST,
needToken: true
});
@@ -68,7 +68,7 @@ export function sureReceived (orderSn) {
*/
export function getTraces (orderSn) {
return request({
url: `/buyer/orders/getTraces/${orderSn}`,
url: `/buyer/order/order/getTraces/${orderSn}`,
method: Method.POST,
needToken: true
});
@@ -80,7 +80,7 @@ export function getTraces (orderSn) {
*/
export function evolutionList (params) {
return request({
url: `/buyer/memberEvaluation`,
url: `/buyer/member/evaluation`,
method: Method.GET,
needToken: true,
params
@@ -90,9 +90,28 @@ export function evolutionList (params) {
// 添加交易投诉对话
export function communication (params) {
return request({
url: `/buyer/complain/communication`,
url: `/buyer/order/complain/communication`,
method: Method.POST,
needToken: true,
params
});
}
// 退换货服务 提交物流
export function afterSaleDelivery (params) {
return request({
url: `/buyer/order/afterSale/delivery/${params.afterSaleSn}`,
method: Method.POST,
needToken: true,
params
});
}
// 获取退货可选物流公司
export function getLogisticsCompany () {
return request({
url: `/buyer/other/logistics`,
method: Method.GET,
needToken: true,
params: { pageNumber: 1, pageSize: 200, disabled: 'OPEN' }
});
}

View File

@@ -10,7 +10,7 @@ import request, {
*/
export function tradeDetail (params) {
return request({
url: '/buyer/cashier/tradeDetail',
url: '/buyer/payment/cashier/tradeDetail',
needToken: true,
method: Method.GET,
params
@@ -26,7 +26,7 @@ export function tradeDetail (params) {
*/
export function pay (params) {
return request({
url: `/buyer/cashier/pay/${params.paymentMethod}/${params.paymentClient}`,
url: `/buyer/payment/cashier/pay/${params.paymentMethod}/${params.paymentClient}`,
needToken: true,
method: Method.GET,
params
@@ -40,7 +40,7 @@ export function pay (params) {
*/
export function payCallback (params) {
return request({
url: `/buyer/cashier/result`,
url: `/buyer/payment/cashier/result`,
needToken: true,
method: Method.GET,
params

View File

@@ -46,3 +46,14 @@ export function pointGoods (params) {
params
});
}
/**
* 获取积分商品详情
*/
export function pointGoodsDetail (id) {
return request({
url: `/buyer/promotion/pointsGoods/${id}`,
method: Method.GET,
needToken: true,
id
});
}

View File

@@ -5,7 +5,7 @@ import request, {
// 店铺分页列表
export function shopList (params) {
return request({
url: '/buyer/store',
url: '/buyer/store/store',
needToken: true,
method: Method.GET,
params
@@ -15,7 +15,7 @@ export function shopList (params) {
// 申请店铺第一步-填写企业信息
export function applyFirst (params) {
return request({
url: '/buyer/store/apply/first',
url: '/buyer/store/store/apply/first',
needToken: true,
method: Method.PUT,
params
@@ -25,7 +25,7 @@ export function applyFirst (params) {
// 申请店铺第一步-填写企业信息
export function applySecond (params) {
return request({
url: '/buyer/store/apply/second',
url: '/buyer/store/store/apply/second',
needToken: true,
method: Method.PUT,
params
@@ -35,7 +35,7 @@ export function applySecond (params) {
// 申请店铺第一步-填写企业信息
export function applyThird (params) {
return request({
url: '/buyer/store/apply/third',
url: '/buyer/store/store/apply/third',
needToken: true,
method: Method.PUT,
params
@@ -45,7 +45,7 @@ export function applyThird (params) {
// 店铺详情
export function getDetailById (id) {
return request({
url: `/buyer/store/get/detail/${id}`,
url: `/buyer/store/store/get/detail/${id}`,
needToken: true,
method: Method.GET
})
@@ -53,7 +53,7 @@ export function getDetailById (id) {
// 店铺分类
export function getCateById (id) {
return request({
url: `/buyer/store/label/get/${id}`,
url: `/buyer/store/store/label/get/${id}`,
needToken: true,
method: Method.GET
})
@@ -61,7 +61,7 @@ export function getCateById (id) {
// 店铺入驻协议
export function agreement () {
return request({
url: `/buyer/article/type/STORE_REGISTER`,
url: `/buyer/other/article/type/STORE_REGISTER`,
needToken: true,
method: Method.GET
})
@@ -70,7 +70,7 @@ export function agreement () {
// 获取当前登录会员的店铺信息
export function applyStatus () {
return request({
url: `/buyer/store/apply`,
url: `/buyer/store/store/apply`,
needToken: true,
method: Method.GET
})

Binary file not shown.

Before

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 131 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 302 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View File

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 374 KiB

View File

@@ -1,92 +1,91 @@
// coupon
.coupon-list {
display: flex;
flex-wrap: wrap;
display: flex;
flex-wrap: wrap;
}
.coupon-item {
width: 380px;
height: 145px;
margin-bottom: 20px;
margin-right: 10px;
margin-left: 10px;
position: relative;
border: 1px solid #eee;
.c-left {
width: 100%;
padding: 20px;
>div, > p {
margin-bottom: 10px;
}
>div {
.price{
color: $theme_color;
font-size: 20px;
}
.describe{
background-color: #fff4ec;
color: $theme_color;
padding: 0 5px;
margin-left: 10px;
font-size: 13px;
}
}
p:nth-of-type(1){
font-weight: bold;
}
p:nth-of-type(2){
color: #999;
}
}
b{
position: absolute;
z-index: 2;
top: 0;
right: 50px;
display: block;
width: 3px;
height: 100%;
}
.c-right {
position: absolute;
right: 0;
top: 0;
width: 52px;
height: 100%;
background-color: $theme_color;
color: #fff;
font-size: 16px;
padding: 20px;
&:hover{
font-weight: bold;
}
}
i{
position: absolute;
width: 20px;
height: 20px;
right: 42px;
width: 380px;
height: 145px;
margin-bottom: 20px;
margin-right: 10px;
margin-left: 10px;
position: relative;
border: 1px solid #eee;
background-color: #fff;
border-radius: 20px;
&:after{
content: '';
position: absolute;
width: 25px;
height: 20px;
left: -2px;
background-color: #fff;
.c-left {
width: 100%;
padding: 20px;
> div,
> p {
margin-bottom: 10px;
}
> div {
.price {
color: $theme_color;
font-size: 20px;
}
.describe {
background-color: #fff4ec;
color: $theme_color;
padding: 0 5px;
margin-left: 10px;
font-size: 13px;
}
}
p:nth-of-type(1) {
font-weight: bold;
}
p:nth-of-type(2) {
color: #999;
}
}
}
i.circle-top{
top: -10px;
&::after{
top: -11px;
b {
position: absolute;
z-index: 2;
top: 0;
right: 50px;
display: block;
width: 3px;
height: 100%;
}
}
i.circle-bottom{
bottom: -10px;
&::after{
bottom: -11px;
.c-right {
position: absolute;
right: 0;
top: 0;
width: 52px;
height: 100%;
background-color: $theme_color;
color: #fff;
font-size: 16px;
padding: 20px;
}
}
}
i {
position: absolute;
width: 20px;
height: 20px;
right: 42px;
border: 1px solid #eee;
background-color: #fff;
border-radius: 20px;
&:after {
content: "";
position: absolute;
width: 25px;
height: 20px;
left: -2px;
background-color: #fff;
}
}
i.circle-top {
top: -10px;
&::after {
top: -11px;
}
}
i.circle-bottom {
bottom: -10px;
&::after {
bottom: -11px;
}
}
}

View File

@@ -1,18 +1,112 @@
/*
* @Author: LMR
* @Date: 2020-08-11 10:12:34
* @Last Modified by: LMR
* @Last Modified time: 2020-08-18 16:00:10
*/
//引入主题色
@import "./theme.scss";
.global_color{
color: $theme_color;
// 明亮主题颜色
$primary_color: #2d8cf0;
$primary_light_color: #0f1011;
$primary_dark_color: #2b85e4;
$success_color: #19be6b;
$warning_color: #ff9900;
$error_color: #ed3f14;
$handle-btn-color: #438cde;
$theme_color: #e4393c;
$border_color: #dddee1;
$title_color: #8c8c8c;
$light_title_color: #1c2438;
$light_content_color: #495060;
$light_sub_color: #80848f;
$light_background_color: #f8f8f9;
$light_white_background_color: #fff;
// 暗黑主题颜色
$dark_background_color: #141414;
$dark_sub_background_color: #1d1d1d; //稍微浅一点的
$dark_content_color: #d5d5d5;
/***** 封装一些方法可用于 黑暗主题 ,明亮主题 *****/
// 背景颜色
@mixin background_color($color) {
/*通过该函数设置字体颜色,后期方便统一管理;*/
background-color: $color;
transition: 0.35s;
[data-theme="dark"] & {
background-color: $dark_background_color;
}
[data-theme="light"] & {
background-color: $light_background_color;
}
}
.global_background_color{
background-color: $theme_color;
// 辅助背景颜色
@mixin sub_background_color($color) {
/*通过该函数设置字体颜色,后期方便统一管理;*/
background-color: $color;
transition: 0.35s;
[data-theme="dark"] & {
background-color: $dark_sub_background_color;
}
[data-theme="light"] & {
background-color: $light_background_color;
}
}
@mixin white_background_color() {
/*通过该函数设置字体颜色,后期方便统一管理;*/
background-color: $light_white_background_color;
transition: 0.35s;
[data-theme="dark"] & {
background-color: $dark_sub_background_color;
}
[data-theme="light"] & {
background-color: $light_white_background_color;
}
}
// 正文颜色
@mixin content_color($color) {
/*通过该函数设置字体颜色,后期方便统一管理;*/
color: $color;
[data-theme="dark"] & {
color: $dark_content_color;
}
[data-theme="light"] & {
color: $light_content_color;
}
}
// 辅助颜色
@mixin sub_color($color) {
/*通过该函数设置字体颜色,后期方便统一管理;*/
color: $color;
[data-theme="dark"] & {
color: $dark_content_color;
}
[data-theme="light"] & {
color: $light_sub_color;
}
}
// 标题颜色
@mixin title_color($color) {
/*通过该函数设置字体颜色,后期方便统一管理;*/
color: $color;
[data-theme="dark"] & {
color: $dark_content_color;
}
[data-theme="light"] & {
color: $light_title_color;
}
}
// 全局变量
.global_color {
color: $theme_color;
}
.global_background_color {
background-color: $theme_color;
}
.global_text_left {
text-align: left;
@@ -26,44 +120,96 @@
.global_float_right {
float: right;
}
.clearfix::after{
content: '';
.clearfix::after {
content: "";
display: block;
clear: both;
}
.width_1200{width: 1200px;}
.width_800{width: 800px;}
.width_400{width: 400px;}
.width_300{width: 300px;}
.width_200{width: 200px;}
.width_100{width: 100px;}
.width_1200 {
width: 1200px;
}
.width_800 {
width: 800px;
}
.width_400 {
width: 400px;
}
.width_300 {
width: 300px;
}
.width_200 {
width: 200px;
}
.width_100 {
width: 100px;
}
.fontsize_12{font-size: 12px;}
.fontsize_14{font-size: 14px;}
.fontsize_16{font-size: 16px;}
.fontsize_18{font-size: 18px;}
.fontsize_12 {
font-size: 12px;
}
.fontsize_14 {
font-size: 14px;
}
.fontsize_16 {
font-size: 16px;
}
.fontsize_18 {
font-size: 18px;
}
.mb_20{margin-bottom: 20px;}
.mt_20{margin-top: 20px;}
.ml_20{margin-left: 20px;}
.mr_20{margin-right: 20px;}
.mb_20 {
margin-bottom: 20px;
}
.mt_20 {
margin-top: 20px;
}
.ml_20 {
margin-left: 20px;
}
.mr_20 {
margin-right: 20px;
}
.mb_10{margin-bottom: 10px;}
.mt_10{margin-top: 10px;}
.ml_10{margin-left: 10px;}
.mr_10{margin-right: 10px;}
.mb_10 {
margin-bottom: 10px;
}
.mt_10 {
margin-top: 10px;
}
.ml_10 {
margin-left: 10px;
}
.mr_10 {
margin-right: 10px;
}
.pb_20{padding-bottom: 20px;}
.pt_20{padding-top: 20px;}
.pl_20{padding-left: 20px;}
.pr_20{padding-right: 20px;}
.pb_20 {
padding-bottom: 20px;
}
.pt_20 {
padding-top: 20px;
}
.pl_20 {
padding-left: 20px;
}
.pr_20 {
padding-right: 20px;
}
.pb_10{padding-bottom: 10px;}
.pt_10{padding-top: 10px;}
.pl_10{padding-left: 10px;}
.pr_10{padding-right: 10px;}
.pb_10 {
padding-bottom: 10px;
}
.pt_10 {
padding-top: 10px;
}
.pl_10 {
padding-left: 10px;
}
.pr_10 {
padding-right: 10px;
}
.color999{
.color999 {
color: #999;
}
@@ -71,55 +217,123 @@ html,
body {
height: 100%;
width: 100%;
font-family: "Helvetica Neue",Helvetica,"PingFang SC","Hiragino Sans GB","Microsoft YaHei","微软雅黑",Arial,sans-serif;
font-family: "Helvetica Neue", Helvetica, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "微软雅黑", Arial,
sans-serif;
// overflow: hidden;
margin: 0;
padding: 0;
}
li{
li {
list-style: none;
}
.hover-color:hover{
color: $theme_color!important;
.hover-color:hover {
color: $theme_color !important;
cursor: pointer;
}
.hover-pointer{
.hover-pointer {
cursor: pointer;
}
.center{
.center {
margin: 0 auto;
}
.relative{
.relative {
position: relative;
}
.ellipsis{
.ellipsis {
overflow: hidden;
text-overflow:ellipsis;
text-overflow: ellipsis;
white-space: nowrap;
}
.promotion-decorate{
.promotion-decorate {
width: 200px;
text-align: center;
font-size: 25px;
position: relative;
font-weight: bold;
margin: 30px auto 30px;
&::before,&::after{
content: '';
display: inline-block;
width: 25px;
height: 20px;
background-size: 50px 20px;
background-repeat: no-repeat;
background-position: 0 0;
position: absolute;
top: 10px;
left: -3px;
&::before,
&::after {
content: "";
display: inline-block;
width: 25px;
height: 20px;
background-size: 50px 20px;
background-repeat: no-repeat;
background-position: 0 0;
position: absolute;
top: 10px;
left: -3px;
}
&::after{
background-position: -24px 0;
right: -3px;
left: auto;
&::after {
background-position: -24px 0;
right: -3px;
left: auto;
}
}
}
// goodsList
.text-danger {
color: $theme_color;
}
.seckill-price{
margin-right: 5px;
font-size: 25px;
font-weight: bold;
}
.goods-list {
display: flex;
flex-wrap: wrap;
width: 1200px;
margin: 0 auto;
}
.goods-show-info {
width: 235px;
padding: 6px;
margin: 10px 0px;
margin-left: 5px;
position: relative;
border: 1px solid #fff;
cursor: pointer;
background-color: #fff;
}
.goods-show-info:hover {
border: 1px solid #ccc;
box-shadow: 0px 0px 15px #ccc;
}
.goods-show-price {
margin-top: 6px;
}
.goods-show-detail {
font-size: 12px;
margin: 6px 0px;
}
.goods-show-num {
font-size: 12px;
margin-bottom: 6px;
color: #666;
}
.goods-show-num {
font-size: 12px;
margin-bottom: 6px;
color: #009688;
}
.goods-show-num span {
color: #005aa0;
font-weight: bold;
}
.goods-show-seller {
font-size: 12px;
color: $theme_color;
}
.goods-page {
margin:10px auto ;
text-align: right;
width: 1200px;
}

View File

@@ -30,8 +30,18 @@
margin-top: 6px;
}
.goods-show-detail {
height: 36px;
font-size: 12px;
margin: 6px 0px;
overflow:hidden;
text-overflow: ellipsis;
display:-webkit-box;
-webkit-line-clamp:2;
-webkit-box-orient:vertical;
color:#808080;
}
.goods-show-detail :hover{
color:#E23A3A;
}
.goods-show-num {
font-size: 12px;

View File

@@ -1,84 +1,19 @@
@import '~view-design/src/styles/index.less';
@import "~view-design/src/styles/index.less";
// iview 自定义样式
@primary-color: #ed3f14;
@primary-color: #ff5c58;
@info-color: #fa6419;
@success-color: #68cabe;
@error-color: #ff3c2a;
@table-thead-bg: #f8f8f9;
@table-td-stripe-bg: #f8f8f9;
@table-td-hover-bg: #ededed;
@table-td-highlight-bg: #ededed;
@font-size-base: 12px;
.ivu-drawer,
.drawer,
.ivu-drawer-wrap {
z-index: 2600 !important;
}
@table-thead-bg : #f8f8f9;
@table-td-stripe-bg : #f8f8f9;
@table-td-hover-bg : #ededed;
@table-td-highlight-bg : #ededed;
//
//.colorPaletteMixin() {
// @functions: ~`(function() {
// var hueStep = 2;
// var saturationStep = 0.16;
// var saturationStep2 = 0.05;
// var brightnessStep1 = 0.05;
// var brightnessStep2 = 0.15;
// var lightColorCount = 5;
// var darkColorCount = 4;
//
// var getHue = function(hsv, i, isLight) {
// var hue;
// if (hsv.h >= 60 && hsv.h <= 240) {
// hue = isLight ? hsv.h - hueStep * i : hsv.h + hueStep * i;
// } else {
// hue = isLight ? hsv.h + hueStep * i : hsv.h - hueStep * i;
// }
// if (hue < 0) {
// hue += 360;
// } else if (hue >= 360) {
// hue -= 360;
// }
// return Math.round(hue);
// };
// var getSaturation = function(hsv, i, isLight) {
// var saturation;
// if (isLight) {
// saturation = hsv.s - saturationStep * i;
// } else if (i === darkColorCount) {
// saturation = hsv.s + saturationStep;
// } else {
// saturation = hsv.s + saturationStep2 * i;
// }
// if (saturation > 1) {
// saturation = 1;
// }
// if (isLight && i === lightColorCount && saturation > 0.1) {
// saturation = 0.1;
// }
// if (saturation < 0.06) {
// saturation = 0.06;
// }
// return Number(saturation.toFixed(2));
// };
// var getValue = function(hsv, i, isLight) {
// var value;
// if (isLight) {
// value = hsv.v + brightnessStep1 * i;
// }else{
// value = hsv.v - brightnessStep2 * i
// }
// if (value > 1) {
// value = 1;
// }
// return Number(value.toFixed(2))
// };
//
// this.colorPalette = function(color, index) {
// var isLight = index <= 6;
// var hsv = tinycolor(color).toHsv();
// var i = isLight ? lightColorCount + 1 - index : index - lightColorCount - 1;
// return tinycolor({
// h: getHue(hsv, i, isLight),
// s: getSaturation(hsv, i, isLight),
// v: getValue(hsv, i, isLight),
// }).toHexString();
// };
//})()`;
//}
//.colorPaletteMixin();

View File

@@ -1,114 +0,0 @@
/*
* @Author: LMR
* @Date: 2020-08-14 11:04:12
* @Last Modified by: LMR
* @Last Modified time: 2020-08-18 14:21:41
*/
// 主题颜色
// 明亮主题颜色
$primary_color: #2d8cf0;
$primary_light_color: #0f1011;
$primary_dark_color: #2b85e4;
$success_color: #19be6b;
$warning_color: #ff9900;
$error_color: #ed3f14;
$handle-btn-color: #438cde;
$theme_color: #ed3f14;
$border_color: #dddee1;
$title_color: #8c8c8c;
$light_title_color: #1c2438;
$light_content_color: #495060;
$light_sub_color: #80848f;
$light_background_color: #f8f8f9;
$light_white_background_color :#fff;
// 暗黑主题颜色
$dark_background_color: #141414;
$dark_sub_background_color: #1d1d1d; //稍微浅一点的
$dark_content_color: #d5d5d5;
/***** 封装一些方法可用于 黑暗主题 ,明亮主题 *****/
// 背景颜色
@mixin background_color($color) {
/*通过该函数设置字体颜色,后期方便统一管理;*/
background-color: $color;
transition: 0.35s;
[data-theme="dark"] & {
background-color: $dark_background_color;
}
[data-theme="light"] & {
background-color: $light_background_color;
}
}
// 辅助背景颜色
@mixin sub_background_color($color) {
/*通过该函数设置字体颜色,后期方便统一管理;*/
background-color: $color;
transition: 0.35s;
[data-theme="dark"] & {
background-color: $dark_sub_background_color;
}
[data-theme="light"] & {
background-color: $light_background_color;
}
}
@mixin white_background_color() {
/*通过该函数设置字体颜色,后期方便统一管理;*/
background-color: $light_white_background_color;
transition: 0.35s;
[data-theme="dark"] & {
background-color: $dark_sub_background_color;
}
[data-theme="light"] & {
background-color: $light_white_background_color;
}
}
// 正文颜色
@mixin content_color($color) {
/*通过该函数设置字体颜色,后期方便统一管理;*/
color: $color;
[data-theme="dark"] & {
color: $dark_content_color;
}
[data-theme="light"] & {
color: $light_content_color;
}
}
// 辅助颜色
@mixin sub_color($color) {
/*通过该函数设置字体颜色,后期方便统一管理;*/
color: $color;
[data-theme="dark"] & {
color: $dark_content_color;
}
[data-theme="light"] & {
color: $light_sub_color;
}
}
// 标题颜色
@mixin title_color($color) {
/*通过该函数设置字体颜色,后期方便统一管理;*/
color: $color;
[data-theme="dark"] & {
color: $dark_content_color;
}
[data-theme="light"] & {
color: $light_title_color;
}
}

View File

@@ -2,7 +2,7 @@
<div>
<div class="container">
<img
:src="logoImg"
:src="$store.state.logoImg"
v-if="showLogo"
class="logo-img"
alt=""
@@ -27,6 +27,7 @@
<Tag
v-for="(item, index) in promotionTags"
:key="index"
class="mr_10"
>
<span class="hover-color" @click="selectTags(item)">{{ item }}</span>
</Tag>
@@ -37,7 +38,7 @@
</template>
<script>
import {getLogo} from '@/api/common.js'
import storage from '@/plugins/storage.js'
import {hotWords} from '@/api/goods.js'
export default {
name: 'search',
@@ -53,13 +54,15 @@ export default {
store: { // 是否为店铺页面
type: Boolean,
default: false
},
hover: {
type: Boolean,
default: false
}
},
data () {
return {
searchData: '', // 搜索内容
logoImg: '', // pc端展示logo
promotionTags: [] // 热门搜索列表
searchData: '' // 搜索内容
};
},
methods: {
@@ -77,26 +80,36 @@ export default {
this.$emit('search', this.searchData)
}
},
mounted () {
if (!this.Cookies.getItem('logo')) {
getLogo().then(res => {
if (res.success) {
let logoObj = JSON.parse(res.result.settingValue)
this.Cookies.setItem('logo', logoObj.buyerSideLogo)
this.logoImg = logoObj.buyerSideLogo
}
})
} else {
this.logoImg = this.Cookies.getItem('logo')
computed: {
promotionTags () {
if (this.$store.state.hotWordsList) {
return JSON.parse(this.$store.state.hotWordsList)
} else {
return []
}
}
},
created () {
this.searchData = this.$route.query.keyword
hotWords({start: 1, end: 5}).then(res => {
if (res.success) this.promotionTags = res.result
})
if (!this.hover) { // 首页顶部固定搜索栏不调用热词接口
// 搜索热词每5分钟请求一次
const reloadTime = storage.getItem('hotWordsReloadTime')
const time = new Date().getTime() - 5 * 60 * 1000
if (!reloadTime) {
hotWords({count: 5}).then(res => {
if (res.success && res.result) storage.setItem('hotWordsList', res.result)
})
storage.setItem('hotWordsReloadTime', new Date().getTime())
} else if (reloadTime && time > reloadTime) {
hotWords({count: 5}).then(res => {
if (res.success && res.result) storage.setItem('hotWordsList', res.result)
})
storage.setItem('hotWordsReloadTime', new Date().getTime())
}
}
}
};
</script>
<style scoped lang="scss">
.container {
margin: 30px auto;
@@ -134,9 +147,11 @@ export default {
cursor: pointer;
}
.store-search{
width:63px;
padding: 0 9px;
border-radius: 0;
&:nth-child(2){
width:62px;
margin-left: -5px;
}
}
@@ -144,6 +159,6 @@ export default {
position: relative;
height: 0px;
top: -38px;
left: 336px;
left: 352px;
}
</style>

View File

@@ -1,110 +0,0 @@
<template>
<div class="wrapper">
<empty v-if="list.length==0" />
<ul class="coupon-list" v-else>
<li v-for="(item, index) in list" class="coupon-item" :key="index">
<div class="c-left">
<div>
<span v-if="item.couponType === 'PRICE'" class="fontsize_12 global_color">¥<span class="price">{{item.price | unitPrice}}</span></span>
<span v-if="item.couponType === 'DISCOUNT'" class="fontsize_12 global_color"><span class="price">{{item.couponDiscount}}</span></span>
<span class="describe">{{item.consumeThreshold}}元可用</span>
</div>
<p>使用范围{{useScope(item.scopeType, item.storeName)}}</p>
<p>有效期{{item.endTime}}</p>
</div>
<b></b>
<a class="c-right" @click="go(item)">立即使用</a>
<i class="circle-top"></i>
<i class="circle-bottom"></i>
</li>
</ul>
<Page :total="total" @on-change="changePageNum"
v-if="list.length && total > params.pageNumber"
class="pageration"
@on-page-size-change="changePageSize"
:page-size="params.pageSize"
show-sizer>
</Page>
<Spin v-if="loading" fix></Spin>
</div>
</template>
<script>
import { memberCouponList } from '@/api/member.js';
export default {
data () {
return {
loading: false, // 列表加载状态
params: { // 请求参数
pageNumber: 1,
pageSize: 10
},
total: 0, // 优惠券总数
list: [] // 优惠券列表
};
},
methods: {
getList () { // 获取优惠券列表
this.loading = true
memberCouponList(this.params).then(res => {
this.loading = false
if (res.success) {
this.list = res.result.records
this.total = res.result.total
}
})
},
go (item) { // 根据使用条件跳转商品列表页面
if (item.storeId !== 'platform') {
this.$router.push({path: '/merchant', query: {id: item.storeId}})
} else {
if (item.scopeType === 'PORTION_GOODS_CATEGORY') {
this.$router.push({path: '/goodsList', query: {categoryId: item.scopeId}})
} else {
this.$router.push({path: '/goodsList'})
}
}
},
changePageNum (val) { // 分页改变页码
this.params.pageNumber = val;
this.getList()
},
changePageSize (val) { // 分页改变页数
this.pageNumber = 1;
this.params.pageSize = val;
this.getList()
},
useScope (type, storeName) { // 根据字段返回 优惠券适用范围
let shop = '平台';
let goods = '全部商品'
if (storeName !== 'platform') shop = storeName
switch (type) {
case 'ALL':
goods = '全部商品'
break;
case 'PORTION_GOODS':
goods = '部分商品'
break;
case 'PORTION_GOODS_CATEGORY':
goods = '部分分类商品'
break;
}
return `${shop}${goods}可用`
}
},
mounted () {
this.getList()
}
};
</script>
<style scoped lang="scss">
@import '../../assets/styles/coupon.scss';
.pageration {
text-align: right;
}
</style>

View File

@@ -36,9 +36,11 @@ export default {
},
components: {drawerPage},
computed: {
// 用户信息
userInfo () {
return Storage.getItem('userInfo');
},
// 购物车商品数量
cartNum () {
return this.$store.state.cartNum
}

View File

@@ -35,6 +35,6 @@ export default {
}
p {
cursor: pointer;
@include sub_color($light_sub_color);
}
</style>

View File

@@ -29,18 +29,38 @@
</div>
</div>
<div class="clearfix"></div>
<div class="friend-link">
<div class="friend-link flex">
<div class="friend-link-item">
<ul>
<li v-for="(link, index) in moreLink" :key="index" @click="goArticle">
<span class="link-item" :class="{'link-last-item': index === 4}">{{link}}</span>
</li>
</ul>
<div class="icp">
<li v-if="config.icpCard">
<a :href='"https://tsm.miit.gov.cn/dxxzsp/xkz/xkzgl/resource/qiyesearch.jsp?num="+config.icpCard+"&type=xuke"' target="_blank">
{{config.icpCard}}
</a>
</li>
<li v-if="config.icpMessage" class="footer-bottmom">
<a href="https://beian.miit.gov.cn/" target="_blank">
{{config.icpMessage}}
</a>
</li>
</div>
</div>
<div class="information footer-bottmom">
<a class="flex " :href="config.company.href">
<img class="zhizhao" src="@/assets/images/zhizhao.jpg" mode="" />{{config.company.name}}
</a>
</div>
</div>
<div class="clearfix"></div>
<div class="copyright">
<p>Copyright © LILI</p>
<p>Copyright © {{year}} {{config.title}}</p>
</div>
</div>
</footer>
@@ -48,27 +68,32 @@
</template>
<script>
export default {
name: 'Footer',
data () {
name: "Footer",
data() {
return {
guideArr: [ // 导航链接
[ '购物指南', '购物流程', '会员介绍', '生活旅行', '常见问题', '大家电', '联系客服' ],
[ '配送方式', '上门自提', '211限时达', '配送服务查询', '收取标准', '海外配送' ],
[ '支付方式', '货到付款', '在线支付', '分期付款', '邮局汇款', '公司转账' ],
[ '售后服务', '售后政策', '价格保护', '退款说明', '返修/退换货', '取消订单' ]
config:require('@/config'),
guideArr: [
// 导航链接
["购物指南", "购物流程", "会员介绍", "生活旅行", "常见问题"],
["配送方式", "上门自提", "配送服务查询", "收取标准", "物流规则"],
["支付方式", "在线支付", "公司转账", "余额支付", "积分支付"],
["售后服务", "售后政策", "退款说明", "返修/退货", "取消订单"],
],
moreLink: ['关于我们', '联系我们', '联系客服', '商家帮助', '隐私政策'] // 更多链接
moreLink: ["关于我们", "联系我们", "联系客服", "商家帮助", "隐私政策"], // 更多链接
year: new Date().getFullYear(), // 当前年份
};
},
methods: {
goArticle () { // 跳转文章页
goArticle() {
// 跳转文章页
let routeUrl = this.$router.resolve({
path: '/article'
})
window.open(routeUrl.href, '_blank')
}
}
path: "/article",
});
window.open(routeUrl.href, "_blank");
},
},
};
</script>
@@ -76,11 +101,9 @@ export default {
/*****************************底 部 开 始*****************************/
.footer {
width: 100%;
height: 450px;
padding-top: 30px;
@include background_color($light_background_color);
}
.icon-row {
margin: 15px auto;
@@ -111,7 +134,20 @@ export default {
.footer-icon-child-4 {
background-position: 0 -129px;
}
.footer-icon-text{
.icp {
>*{
margin: 0 4px;
}
flex-direction: column;
}
.flex{
display: flex;
align-items: center;
>img{
margin-right: 4px;
}
}
.footer-icon-text {
margin-left: 45px;
font-size: 18px;
font-weight: bold;
@@ -123,7 +159,6 @@ export default {
}
.servece-type {
margin: 15px auto;
height: 200px;
width: 800px;
display: flex;
flex-direction: row;
@@ -138,22 +173,39 @@ export default {
cursor: pointer;
line-height: 26px;
}
.servece-type-info li:hover{
color:#b8b8be;
}
.servece-type-info li:first-child {
font-size: 16px;
line-height: 28px;
font-weight: bold;
}
.servece-type-info li:first-child:hover{
// font-size:15px;
// font-weight: bold;
color:#b8b8be;
}
.friend-link {
display: flex;
align-items: center;
align-items: flex-start;
justify-content: space-between;
width: 908px;
height: 30px;
padding: 10px 0;
margin: 0px auto;
border-top: 1px solid $border_color;
}
.friend-link-item {
margin: 0px auto;
.information {
display: flex;
flex-direction: column;
> * {
margin: 2px 0;
}
}
.zhizhao {
width: 20px;
height: 20px;
border-radius: 50%;
}
.friend-link-item ul {
list-style: none;
@@ -162,6 +214,17 @@ export default {
padding: 5px 0px;
float: left;
}
.friend-link-item li:hover{
color:#b8b8be;
margin-top:-2px;
}
.footer-bottmom:hover{
margin-top:0 !important;
}
.footer-bottmom>a:hover{
color:#e4393c;
}
.link-item {
padding: 0px 8px;
cursor: pointer;
@@ -175,15 +238,17 @@ export default {
line-height: 30px;
text-align: center;
}
.copyright a{
.copyright a {
color: #232323;
font-size: 20px;
}
.footer-icon-text{
@include title_color($light_title_color)
.footer-icon-text {
@include title_color($light_title_color);
}
.copyright,.friend-link,.servece-type-info {
@include sub_color($light_sub_color)
.copyright,
.friend-link,
.servece-type-info {
@include sub_color($light_sub_color);
}
/*****************************底 部 结 束*****************************/
</style>

View File

@@ -7,7 +7,7 @@ import FixedTopPage from '@/components/advertising/FixedTop'; // 顶部广告
import Footer from '@/components/footer/Footer'; // 底部栏
import Search from '@/components/Search' // 搜索框
import card from '@/components/card' // 个人中心 卡片
import cateNav from '@/components/nav/cateNav' // 个人中心 卡片
import cateNav from '@/components/nav/CateNav' // 个人中心 卡片
empty.install = function (Vue) {
Vue.component('empty', empty);

View File

@@ -8,7 +8,7 @@
<div v-else>{{end}}</div>
</div>
<span v-else class="cart-promotion">
<span v-if="end === ''">活动结束<span>{{ hours }}</span> : <span>{{ minutes }}</span> : <span>{{ seconds }}</span></span>
<span v-if="end === ''">活动结束<span>{{ hours }}</span> : <span>{{ minutes }}</span> : <span>{{ seconds }}</span></span>
<span v-else>活动已结束</span>
</span>
</div>

View File

@@ -7,6 +7,8 @@
<div class="item-detail-big-img">
<pic-zoom :url="imgList[imgIndex].url" :scale="2"></pic-zoom>
</div>
<div v-if="skuDetail.goodsType !== 'VIRTUAL_GOODS'" style="margin-top:10px;rgb(153, 149, 149);">实物商品</div>
<div v-else-if="skuDetail.goodsType == 'VIRTUAL_GOODS'" style="margin-top:10px;rgb(153, 149, 149);">虚拟商品</div>
<div class="item-detail-img-row">
<div
class="item-detail-img-small"
@@ -19,7 +21,11 @@
</div>
<div class="goodsConfig mt_10">
<span @click="collect" ><Icon type="ios-heart" :color="isCollected ? '#ed3f14' : '#666'" />{{isCollected?'已收藏':'收藏'}}</span>
<span @click="collect"
><Icon type="ios-heart" :color="isCollected ? '#ed3f14' : '#666'" />{{
isCollected ? "已收藏" : "收藏"
}}</span
>
</div>
</div>
<!-- 右侧商品信息活动信息操作展示 -->
@@ -29,28 +35,41 @@
{{ skuDetail.goodsName }}
</p>
</div>
<div class="sell-point">
{{ skuDetail.sellingPoint }}
</div>
<!-- 限时秒杀 -->
<Promotion v-if="promotionMap['SECKILL']" :time="promotionMap['SECKILL'].endTime"></Promotion>
<Promotion
v-if="promotionMap['SECKILL']"
:time="promotionMap['SECKILL'].endTime"
></Promotion>
<!-- 商品详细 价格优惠券促销 -->
<div class="item-detail-price-row">
<div class="item-price-left">
<!-- 商品原价 -->
<div class="item-price-row" v-if="!skuDetail.promotionPrice">
<!-- 秒杀价格 -->
<div class="item-price-row" v-if="skuDetail.promotionPrice && promotionMap['SECKILL']">
<p>
<span class="item-price-title"> &nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="item-price">{{skuDetail.price | unitPrice("¥")}}</span>
<span class="item-price-title" v-if="promotionMap['SECKILL']"
> &nbsp;&nbsp;</span
>
<span class="item-price">{{
skuDetail.promotionPrice | unitPrice("¥")
}}</span>
<span class="item-price-old">{{
skuDetail.price | unitPrice("¥")
}}</span>
</p>
</div>
<!-- 秒杀价格 -->
<div class="item-price-row" v-if="skuDetail.promotionPrice">
<!-- 商品原价 -->
<div class="item-price-row" v-else>
<p>
<span class="item-price-title" v-if="promotionMap['SECKILL']"> &nbsp;&nbsp;</span>
<span class="item-price">{{skuDetail.promotionPrice | unitPrice("¥")}}</span>
<span class="item-price-old">{{skuDetail.price | unitPrice("¥")}}</span>
<span class="item-price-title"> &nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="item-price">{{ skuDetail.price | unitPrice("¥") }}</span>
</p>
</div>
<!-- 优惠券展示 -->
<div class="item-price-row" v-if="promotionMap['COUPON'].length">
<div class="item-price-row" v-if="promotionMap['COUPON'].length">
<p>
<span class="item-price-title"> </span>
<span
@@ -58,10 +77,14 @@
v-for="(item, index) in promotionMap['COUPON']"
:key="index"
@click="receiveCoupon(item.id)"
>
<span v-if="item.couponType == 'PRICE'"
>{{ item.consumeThreshold }}{{ item.price }}</span
>
<span v-if="item.couponType == 'PRICE'">{{ item.consumeThreshold }}{{item.price}}</span>
<span v-if="item.couponType == 'DISCOUNT'">{{ item.consumeThreshold }}{{item.couponDiscount}}</span>
</span>
<span v-if="item.couponType == 'DISCOUNT'"
>{{ item.consumeThreshold }}{{ item.couponDiscount }}</span
>
</span>
</p>
</div>
<!-- 满减展示 -->
@@ -69,8 +92,20 @@
<p>
<span class="item-price-title">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="item-promotion">满减</span>
<span class="item-desc-pintuan" v-if="promotionMap['FULL_DISCOUNT'].fullMinus">{{ promotionMap['FULL_DISCOUNT'].fullMoney }}立减现金{{ promotionMap['FULL_DISCOUNT'].fullMinus}}</span>
<span class="item-desc-pintuan" v-if="promotionMap['FULL_DISCOUNT'].fullRate">{{ promotionMap['FULL_DISCOUNT'].fullMoney }}立享{{ promotionMap['FULL_DISCOUNT'].fullRate}}</span>
<span
class="item-desc-pintuan"
v-if="promotionMap['FULL_DISCOUNT'].fullMinus"
>{{ promotionMap["FULL_DISCOUNT"].fullMoney }}立减现金{{
promotionMap["FULL_DISCOUNT"].fullMinus
}}</span
>
<span
class="item-desc-pintuan"
v-if="promotionMap['FULL_DISCOUNT'].fullRate"
>{{ promotionMap["FULL_DISCOUNT"].fullMoney }}立享{{
promotionMap["FULL_DISCOUNT"].fullRate
}}</span
>
</p>
</div>
</div>
@@ -84,14 +119,18 @@
</div>
</div>
<!-- 选择颜色 -->
<div class="item-select" v-for="(sku, index) in formatList" :key="sku.id">
<div class="item-select" v-for="(sku, index) in formatList" :key="sku.name">
<div class="item-select-title">
<p>{{ sku.name }}</p>
</div>
<div class="item-select-column">
<div class="item-select-row" v-for="(item) in sku.values" :key="item.id">
<div class="item-select-box" @click="select(index, sku.id, item.id)"
:class="{ 'item-select-box-active': item.id === currentSelceted[index] }"
<div class="item-select-row" v-for="item in sku.values" :key="item.value">
<div
class="item-select-box"
@click="select(index, item.value)"
:class="{
'item-select-box-active': item.value === currentSelceted[index],
}"
>
<div class="item-select-intro">
<p>{{ item.value }}</p>
@@ -107,26 +146,59 @@
<p>数量</p>
</div>
<div class="item-select-row">
<InputNumber :min="1" :disabled="skuDetail.quantity === 0" v-model="count"></InputNumber>
<span class="inventory"> 库存{{skuDetail.quantity}}</span>
<InputNumber
:min="1"
:max="skuDetail.quantity"
:disabled="skuDetail.quantity === 0"
v-model="count"
:precision="0.1"
></InputNumber>
<span class="inventory"> 库存{{ skuDetail.quantity }}</span>
</div>
</div>
<div class="item-select" v-if="skuDetail.goodsType !== 'VIRTUAL_GOODS'">
<div
class="item-select"
v-if="skuDetail.goodsType !== 'VIRTUAL_GOODS' && skuDetail.weight !== 0"
>
<div class="item-select-title">
<p>重量</p>
</div>
<div class="item-select-row">
<span class="inventory"> {{skuDetail.weight}}kg</span>
<span class="inventory"> {{ skuDetail.weight }}kg</span>
</div>
</div>
<div class="add-buy-car" v-if="$route.query.way === 'POINT' && skuDetail.isAuth === 'PASS'">
<Button type="error" :loading="loading" :disabled="skuDetail.quantity === 0" @click="pointPay">积分购买</Button>
<div
class="add-buy-car"
v-if="$route.query.way === 'POINT' && skuDetail.authFlag === 'PASS'"
>
<Button
type="error"
:loading="loading"
:disabled="skuDetail.quantity === 0"
@click="pointPay"
>积分购买</Button
>
</div>
<div class="add-buy-car" v-if="$route.query.way !== 'POINT' && skuDetail.isAuth === 'PASS'">
<Button type="error" v-if="skuDetail.goodsType !== 'VIRTUAL_GOODS'" :loading="loading" :disabled="skuDetail.quantity === 0" @click="addShoppingCartBtn">加入购物车</Button>
<Button type="warning" :loading="loading1" :disabled="skuDetail.quantity === 0" @click="buyNow">立即购买</Button>
<div
class="add-buy-car"
v-if="$route.query.way !== 'POINT' && skuDetail.authFlag === 'PASS'"
>
<Button
type="error"
v-if="skuDetail.goodsType !== 'VIRTUAL_GOODS'"
:loading="loading"
:disabled="skuDetail.quantity === 0"
@click="addShoppingCartBtn"
>加入购物车</Button
>
<Button
type="warning"
:loading="loading1"
:disabled="skuDetail.quantity === 0"
@click="buyNow"
>立即购买</Button
>
</div>
</div>
</div>
</div>
@@ -134,50 +206,54 @@
</template>
<script>
import Promotion from './Promotion.vue';
import PicZoom from 'vue-piczoom'; // 图片放大 https://github.com/826327700/vue-piczoom
import { collectGoods, isCollection, receiveCoupon, cancelCollect } from '@/api/member.js';
import { addCartGoods } from '@/api/cart.js';
import Promotion from "./Promotion.vue";
import PicZoom from "vue-piczoom"; // 图片放大
import {
collectGoods,
isCollection,
receiveCoupon,
cancelCollect,
} from "@/api/member.js";
import { addCartGoods } from "@/api/cart.js";
export default {
name: 'ShowGoods',
name: "ShowGoods",
props: {
// 商品数据
detail: {
type: Object,
default: null
}
default: null,
},
},
data () {
data() {
return {
count: 1, // 商品数量
imgIndex: 0, // 展示图片下标
currentSelceted: [], // 当前商品sku
imgList: this.detail.data.specList[0].specImage || [], // 商品图片列表
imgList: [{ url: "" }], // 商品图片列表
skuDetail: this.detail.data, // sku详情
goodsSpecList: this.detail.specs, // 商品spec
promotionMap: { // 活动状态
promotionMap: {
// 活动状态
SECKILL: null,
FULL_DISCOUNT: null,
COUPON: []
COUPON: [],
}, // 促销活动
formatList: [], // 选择商品品类的数组
loading: false, // 立即购买loading
loading1: false, // 加入购物车loading
isCollected: false // 是否收藏
isCollected: false, // 是否收藏
};
},
components: {
PicZoom,
Promotion
},
components: { PicZoom, Promotion },
methods: {
select (index, id, valueId) { // 选择规格
this.$set(this.currentSelceted, index, valueId);
select(index, value) {
// 选择规格
this.$set(this.currentSelceted, index, value);
let selectedSkuId = this.goodsSpecList.find((i) => {
let matched = true;
let specValues = i.specValues.filter((j) => j.specName !== 'images');
let specValues = i.specValues.filter((j) => j.specName !== "images");
for (let n = 0; n < specValues.length; n++) {
if (specValues[n].specValueId !== this.currentSelceted[n]) {
if (specValues[n].specValue !== this.currentSelceted[n]) {
matched = false;
return;
}
@@ -186,100 +262,87 @@ export default {
return i;
}
});
console.log(selectedSkuId);
this.$router.push({
path: '/goodsDetail',
query: { skuId: selectedSkuId.skuId, goodsId: this.skuDetail.goodsId }
path: "/goodsDetail",
query: { skuId: selectedSkuId.skuId, goodsId: this.skuDetail.goodsId },
});
},
addShoppingCartBtn () { // 添加购物车
addShoppingCartBtn() {
// 添加购物车
const params = {
num: this.count,
skuId: this.skuDetail.id
skuId: this.skuDetail.id,
};
this.loading = true;
addCartGoods(params).then(res => {
debugger;
this.loading = false;
if (res.success) {
this.$router.push({path: '/shoppingCart', query: {detail: this.skuDetail, count: this.count}});
} else {
this.$Message.warning(res.message);
}
}).catch(() => {
console.log('catch');
this.loading = false;
});
addCartGoods(params)
.then((res) => {
this.loading = false;
if (res.success) {
this.$router.push({
path: "/shoppingCart",
query: { detail: this.skuDetail, count: this.count },
});
} else {
this.$Message.warning(res.message);
}
})
.catch(() => {
this.loading = false;
});
},
buyNow () { // 立即购买
buyNow() {
// 立即购买
const params = {
num: this.count,
skuId: this.skuDetail.id,
cartType: 'BUY_NOW'
cartType: "BUY_NOW",
};
// 虚拟商品购买
if (this.skuDetail.goodsType === 'VIRTUAL_GOODS') {
params.cartType = 'VIRTUAL'
if (this.skuDetail.goodsType === "VIRTUAL_GOODS") {
params.cartType = "VIRTUAL";
}
this.loading1 = true;
addCartGoods(params).then(res => {
this.loading1 = false;
if (res.success) {
this.$router.push({path: '/pay', query: {way: params.cartType}});
} else {
this.$Message.warning(res.message);
}
}).catch(() => {
this.loading1 = false;
});
addCartGoods(params)
.then((res) => {
this.loading1 = false;
if (res.success) {
this.$router.push({ path: "/pay", query: { way: params.cartType } });
} else {
this.$Message.warning(res.message);
}
})
.catch(() => {
this.loading1 = false;
});
},
pointPay () { // 积分购买
const params = {
num: this.count,
skuId: this.skuDetail.id,
cartType: 'BUY_NOW'
};
this.loading1 = true;
addCartGoods(params).then(res => {
this.loading1 = false;
if (res.success) {
this.$router.push({path: '/pay', query: {way: 'POINT'}});
} else {
this.$Message.warning(res.message);
}
});
},
async collect () { // 收藏商品
async collect() {
// 收藏商品
if (this.isCollected) {
let cancel = await cancelCollect('GOODS', this.skuDetail.id)
let cancel = await cancelCollect("GOODS", this.skuDetail.id);
if (cancel.success) {
this.$Message.success('取消收藏成功')
this.isCollected = false
this.$Message.success("取消收藏成功");
this.isCollected = false;
}
} else {
let collect = await collectGoods('GOODS', this.skuDetail.id);
let collect = await collectGoods("GOODS", this.skuDetail.id);
if (collect.code === 200) {
this.isCollected = true;
this.$Message.success('收藏商品成功,可以前往个人中心我的收藏查看');
this.$Message.success("收藏商品成功,可以前往个人中心我的收藏查看");
}
}
},
formatSku (list) {
// 格式化数据
// 格式化数据
formatSku(list) {
let arr = [{}];
list.forEach((item, index) => {
item.specValues.forEach((spec, specIndex) => {
let id = spec.specNameId;
let name = spec.specName;
let values = {
id: spec.specValueId,
value: spec.specValue,
quantity: item.quantity
quantity: item.quantity,
};
if (name === 'images') {
if (name === "images") {
return;
}
@@ -287,7 +350,7 @@ export default {
if (
arrItem.name === name &&
arrItem.values &&
!arrItem.values.find((i) => i.id === values.id)
!arrItem.values.find((i) => i.value === values.value)
) {
arrItem.values.push(values);
}
@@ -297,9 +360,8 @@ export default {
});
if (!keys.includes(name)) {
arr.push({
id: id,
name: name,
values: [values]
values: [values],
});
}
});
@@ -310,51 +372,58 @@ export default {
let cur = list.filter((i) => i.skuId === this.$route.query.skuId)[0];
if (cur) {
cur.specValues.filter((i) => i.specName !== 'images')
cur.specValues
.filter((i) => i.specName !== "images")
.forEach((value, _index) => {
this.currentSelceted[_index] = value.specValueId;
this.currentSelceted[_index] = value.specValue;
});
}
this.skuList = list;
},
receiveCoupon (id) { // 领取优惠券
receiveCoupon(id).then(res => {
receiveCoupon(id) {
// 领取优惠券
receiveCoupon(id).then((res) => {
if (res.success) {
this.$Message.success('优惠券领取成功')
this.$Message.success("优惠券领取成功");
} else {
this.$Message.warning(res.message)
this.$Message.warning(res.message);
}
})
});
},
promotion () { // 格式化促销活动,返回当前促销的对象
promotion() {
// 格式化促销活动,返回当前促销的对象
if (!this.detail.promotionMap) return false;
let keysArr = Object.keys(this.detail.promotionMap);
if (keysArr.length === 0) return false;
for (let i = 0; i < keysArr.length; i++) {
let key = keysArr[i].split('-')[0]
if (key === 'COUPON') {
this.promotionMap[key].push(this.detail.promotionMap[keysArr[i]])
let key = keysArr[i].split("-")[0];
if (key === "COUPON") {
this.promotionMap[key].push(this.detail.promotionMap[keysArr[i]]);
} else {
this.promotionMap[key] = this.detail.promotionMap[keysArr[i]]
this.promotionMap[key] = this.detail.promotionMap[keysArr[i]];
}
}
}
},
},
mounted () {
mounted() {
// 用户登录才会判断是否收藏
if (this.Cookies.getItem('userInfo')) {
isCollection('GOODS', this.skuDetail.id).then(res => {
if (this.Cookies.getItem("userInfo")) {
isCollection("GOODS", this.skuDetail.id).then((res) => {
if (res.success && res.result) {
this.isCollected = true;
}
})
});
}
this.detail.data.specList.forEach((e) => {
if (e.specName === "images") {
this.imgList = e.specImage;
}
});
this.formatSku(this.goodsSpecList);
this.promotion()
document.title = this.skuDetail.goodsName
}
this.promotion();
document.title = this.skuDetail.goodsName;
},
};
</script>
@@ -366,7 +435,6 @@ export default {
}
.inventory {
padding-left: 4px;
@include sub_color($light_sub_color);
}
.global_color {
@@ -493,10 +561,8 @@ export default {
.item-detail-price-row {
padding: 10px;
display: flex;
// width: 555px;
flex-direction: row;
justify-content: space-between;
// @include background_color($light_background_color);
background: url("../../assets/images/goodsDetail/price-bg.png");
}
@@ -580,9 +646,6 @@ export default {
}
.item-select-row {
// display: flex;
// flex-direction: row;
// flex-wrap: wrap;
margin-bottom: 8px;
}
@@ -592,10 +655,6 @@ export default {
align-items: center;
}
.item-select-img {
width: 36px;
}
.item-select-box {
padding: 5px;
margin-right: 8px;
@@ -613,31 +672,11 @@ export default {
border: 0.5px solid $theme_color;
}
.item-select-box-disabled {
background-color: gray;
}
.item-select-img img {
width: 100%;
}
.item-select-intro p {
margin: 0px;
padding: 5px;
}
.item-select-class {
padding: 5px;
margin-right: 8px;
@include sub_background_color($light_background_color);
border: 0.5px solid #ccc;
cursor: pointer;
}
.item-select-class:hover {
border: 0.5px solid $theme_color;
}
.add-buy-car-box {
width: 100%;
margin-top: 15px;
@@ -646,6 +685,9 @@ export default {
.add-buy-car {
margin-top: 15px;
> * {
margin: 0 4px;
}
}
.goodsConfig {
@@ -653,11 +695,16 @@ export default {
justify-content: space-between;
> span {
padding-right: 10px;
&:hover{
&:hover {
cursor: pointer;
color: $theme_color;
}
}
}
.sell-point {
font-size: 12px;
color: red;
margin-bottom: 5px;
}
/******************商品图片及购买详情结束******************/
</style>

View File

@@ -1,23 +1,6 @@
<template>
<div>
<div class="item-intro-show">
<!-- <div class="item-intro-recommend">
<div class="item-recommend-title">
<p>店铺热销</p>
</div>
<div class="item-intro-recommend-column">
<div class="item-recommend-column" v-for="(item, index) in hotList" :key="index">
<div class="item-recommend-img">
<img :src="item.img" alt="">
</div>
<div class="item-recommend-intro">
<span>
<span class="item-recommend-top-num">{{index + 1}}</span> 热销{{item.sale}}</span>
<span class="item-recommend-price">{{item.price | unitPrice}}</span>
</div>
</div>
</div>
</div> -->
<div class="item-intro-detail" ref="itemIntroDetail">
<div class="item-intro-nav item-tabs">
<Tabs :animated="false" @on-click="tabClick">
@@ -31,8 +14,8 @@
<div class="remarks-container" ref="itemGoodsComment">
<div class="remarks-analyse-box">
<div class="remarks-analyse-goods">
<i-circle :percent="skuDetail.grade || 100" stroke-color="#5cb85c">
<span class="remarks-analyse-num">{{skuDetail.grade || 100}}%</span>
<i-circle :percent="skuDetail.grade" stroke-color="#5cb85c">
<span class="remarks-analyse-num">{{skuDetail.grade}}%</span>
<p class="remarks-analyse-title">好评率</p>
</i-circle>
</div>
@@ -87,11 +70,16 @@
</div>
</TabPane>
<TabPane label="商品参数">
<table class="mt_10" border="1" cellpadding='0' cellspacing="0" v-if="skuDetail.goodsParamsList && skuDetail.length">
<tr v-for="param in skuDetail.goodsParamsList" :key="param">
<td>{{param.paramName}}</td><td>{{param.paramValue}}</td>
</tr>
</table>
<template v-if="detail.goodsParamsDTOList && detail.goodsParamsDTOList.length">
<div class="goods-params" v-for="item in detail.goodsParamsDTOList" :key="item.groupId">
<span class="ml_10">{{item.groupName}}</span>
<table class="mb_10" cellpadding='0' cellspacing="0" >
<tr v-for="param in item.goodsParamsItemDTOList" :key="param.paramId">
<td style="text-align: center">{{param.paramName}}</td><td>{{param.paramValue}}</td>
</tr>
</table>
</div>
</template>
<div v-else>暂无商品参数</div>
</TabPane>
</Tabs>
@@ -126,12 +114,13 @@ export default {
};
},
computed: {
skuDetail () { // skuId
// 商品详情
skuDetail () {
return this.detail.data;
}
},
methods: {
changeHeight (name) { // 设置商品详情高度
changeHeight (name) { // 设置商品详情高度
let heightCss = window.getComputedStyle(this.$refs[name]).height;
heightCss = parseInt(heightCss.substr(0, heightCss.length - 2)) + 89;
this.$refs.itemIntroDetail.style.height = heightCss + 'px';
@@ -217,7 +206,10 @@ export default {
});
window.addEventListener('scroll', this.handleScroll)
this.getList();
},
if (this.skuDetail.grade === null || this.skuDetail.grade === undefined) {
this.skuDetail.grade = 100
}
}
};
</script>
@@ -401,7 +393,8 @@ export default {
margin-right: 5px;
width: 50px;
height: 50px;
img{width: 100%;}
overflow: hidden;
img{width: 100%;height: 100%;}
}
}
.preview-img{
@@ -428,9 +421,6 @@ export default {
}
}
img:hover{
cursor: url(require('../../../static/small.cur')),auto;
}
}
}
@@ -484,17 +474,27 @@ export default {
color: $theme_color;
}
table{
border-color: #eee;
border-color:#efefef;
color: #999;
width: 70%;
margin-left: 10px;
min-width: 30%;
margin-left: 30px;
font-size: 12px;
tr{
td:nth-child(1){
width: 200px;
width: 100px;
}
td:nth-child(2){
padding-left: 20px;
}
}
td{
padding: 5px;
padding: 6px;
}
}
.goods-params {
display: flex;
border-bottom: 1px solid #eee;
margin-left: 30px;
span{color:#999}
}
</style>

View File

@@ -2,37 +2,34 @@
<div class="box">
<div class="nav">
<ul class="location">
<li>
<router-link to="/" v-if="$route.path !== '/'" class="home-page">
<Icon type="md-home" />首页
</router-link>
</li>
<li v-if="$route.path.includes('home')" style="margin-left:10px"><router-link to="/">首页</router-link></li>
</ul>
<ul class="detail">
<li class="first" v-show="!userInfo.username">
<router-link :to="`/signUp`">
<span style="border:none">立即注册</span>
</router-link>
</li>
<li v-show="!userInfo.username">
<router-link :to="`/login?rePath=${$route.path}&query=${JSON.stringify($route.query)}`">
<span style="border:none" class="tipsLogin">请登录</span>
<span style="border:none">请登录</span>
</router-link>
</li>
<li v-show="!!userInfo.username">
<Dropdown>
<p class="username-p">
<div class="username-p">
<div>
<Avatar class="person-icon" :src="userInfo.face" icon="person" size="small" />
<span class="username">{{ userInfo.nickName? userInfo.nickName : userInfo.username | secrecyMobile }}</span>
</p>
<DropdownMenu slot="list">
<div class="my-page">
<div class="my-info" @click="myInfo">
<Icon type="md-home"></Icon>
<p>我的主页</p>
</div>
<div class="sign-out" @click="signOutFun">
<Icon type="md-exit"></Icon>
<p>退出登录</p>
</div>
</div>
</DropdownMenu>
</Dropdown>
</div>
<transition name='fade'>
<ul class="drop-items">
<li @click="goUserCenter('/home')">我的主页</li>
<li @click="goUserCenter('/home/Coupons')">优惠券</li>
<li @click="goUserCenter('/home/Favorites')">我的收藏</li>
<li @click="signOutFun">退出登录</li>
</ul>
</transition>
</div>
</li>
<li @click="goUserCenter('/home/MyOrder')"><span class="nav-item hover-color">我的订单</span></li>
<li @click="goUserCenter('/home/MyTracks')"><span class="nav-item hover-color">我的足迹</span></li>
@@ -42,15 +39,10 @@
<Dropdown placement="bottom-start">
<router-link to="/cart" target="_blank">
<span @mouseenter="getCartList">
<Icon
size="18"
type="ios-cart-outline"
></Icon>
<Icon size="18" type="ios-cart-outline"></Icon>
购物车
</span>
</router-link>
<DropdownMenu slot="list">
<div class="shopping-cart-null" style="width:200px" v-show="shoppingCart.length <= 0">
<Icon type="ios-cart-outline" class="cart-null-icon"></Icon>
@@ -86,107 +78,103 @@
<li>
<span class="nav-item" @click="shopEntry">店铺入驻</span>
</li>
<!-- <li>
<router-link to="/feedback">意见反馈</router-link>
</li>-->
</ul>
</div>
</div>
</template>
<script>
import storage from "@/plugins/storage.js";
import { cartGoodsAll } from "@/api/cart.js";
import storage from '@/plugins/storage.js';
import { cartGoodsAll } from '@/api/cart.js';
import { logout } from '@/api/account.js';
export default {
name: "M-Header",
created() {
if (storage.getItem("userInfo")) {
this.userInfo = JSON.parse(storage.getItem("userInfo"));
name: 'M-Header',
created () {
if (storage.getItem('userInfo')) {
this.userInfo = JSON.parse(storage.getItem('userInfo'));
}
},
data() {
data () {
return {
// 主题颜色切换
themeType: "light",
userInfo: {}, // 用户信息
shoppingCart: [], // 购物车
shoppingCart: [] // 购物车
};
},
computed: {
cartNum() {
// 购物车商品数量
cartNum () {
return this.$store.state.cartNum;
},
}
},
methods: {
changeCity (city) { // 选择所在城市
this.city = city;
},
goToPay () { // 跳转购物车
let url = this.$router.resolve({
path: "/cart",
path: '/cart'
});
window.open(url.href, "_blank");
window.open(url.href, '_blank');
},
myInfo () { // 跳转会员中心
let url = this.$router.resolve({
path: "/home",
path: '/home'
});
window.open(url.href, "_blank");
window.open(url.href, '_blank');
},
signOutFun () { // 退出登录
storage.removeItem('accessToken');
storage.removeItem('refreshToken');
storage.removeItem('userInfo');
storage.removeItem('cartNum');
this.$store.commit('SET_CARTNUM', 0)
this.$router.push('/login');
logout().then(res => {
storage.removeItem('accessToken');
storage.removeItem('refreshToken');
storage.removeItem('userInfo');
storage.removeItem('cartNum');
this.$store.commit('SET_CARTNUM', 0)
this.$router.push('/login');
});
},
goUserCenter(path) {
// 跳转我的订单,我的足迹
goUserCenter (path) {
// 跳转我的订单,我的足迹、收藏等
if (this.userInfo.username) {
this.$router.push({ path: path });
} else {
this.$Modal.confirm({
title: "请登录",
content: "<p>请登录后执行此操作</p>",
okText: "立即登录",
cancelText: "继续浏览",
title: '请登录',
content: '<p>请登录后执行此操作</p>',
okText: '立即登录',
cancelText: '继续浏览',
onOk: () => {
this.$router.push({
path: "/login",
path: '/login',
query: {
rePath: this.$router.history.current.path,
query: JSON.stringify(this.$router.history.current.query),
},
query: JSON.stringify(this.$router.history.current.query)
}
});
},
}
});
}
},
shopEntry() {
shopEntry () {
// 店铺入驻
if (storage.getItem("accessToken")) {
if (storage.getItem('accessToken')) {
let routeUrl = this.$router.resolve({
path: "/shopEntry",
query: { id: 1 },
path: '/shopEntry',
query: { id: 1 }
});
window.open(routeUrl.href, "_blank");
window.open(routeUrl.href, '_blank');
} else {
this.$router.push("login");
this.$router.push('login');
}
},
getCartList() {
getCartList () {
// 获取购物车列表
if (this.userInfo.username) {
cartGoodsAll().then((res) => {
this.shoppingCart = res.result.skuList;
this.$store.commit("SET_CARTNUM", this.shoppingCart.length);
this.Cookies.setItem("cartNum", this.shoppingCart.length);
this.$store.commit('SET_CARTNUM', this.shoppingCart.length);
this.Cookies.setItem('cartNum', this.shoppingCart.length);
});
}
},
},
}
}
};
</script>
@@ -199,14 +187,12 @@ export default {
.first,
.username,
.shopping-cart-null span {
@include sub_color($light_sub_color);
}
.tipsLogin {
color: $theme_color;
}
.box {
width: 100%;
font-size: 12px!important;
// height: 35px;
@include background_color($light_white_background_color);
}
@@ -222,7 +208,7 @@ export default {
}
.nav li {
float: left;
font-size: 14px;
font-size: 12px;
line-height: 35px;
margin-right: 10px;
font-weight: bold;
@@ -230,7 +216,7 @@ export default {
.nav a,
.nav-item {
text-decoration: none;
padding-left: 10px;
padding-left: 14px;
border-left: 1px solid #ccc;
color: #999;
cursor: pointer;
@@ -324,8 +310,70 @@ export default {
line-height: 16px;
}
.username-p {
cursor: pointer;
position: relative;
div{
cursor: pointer;
>span{
margin-left: 5px;
}
}
.drop-items {
position: absolute;
display: none;
top: 45px;
left: 0;
right: 0;
margin: 0 auto;
padding: 5px 10px;
z-index: 20;
height: 150px;
background-color: #fff;
width: 80px;
border: 1px solid #eee;
box-shadow: 2px 2px 7px #999;
li {
color: rgb(107, 106, 106);
width: 100%;
border-bottom:1px solid rgb(207, 206, 206);
font-weight: normal;
text-align: center;
&:last-child{
border: none;
}
&:hover{
cursor: pointer;
color: $theme_color;
}
}
&::before{
position: absolute;
top: -20px;
left: 30px;
content: '';
width: 0;
height: 0;
border: 10px solid #999;
border-color: transparent transparent #fff transparent ;
}
&::after{
content: '';
position: absolute;
width: 80px;
height: 20px;
top: -20px;
left: 0;
}
}
&:hover{
.drop-items{
display: block;
}
}
}
.my-page {
padding: 3px 5px;
width: 180px;

View File

@@ -1,93 +1,106 @@
<template>
<div class="scroll-show">
<div class="content clearfix">
<cateNav class="cate" :showNavBar="false"></cateNav>
<Search class="search-con" :showLogo="false" :showTag="false"></Search>
<Icon type="ios-cart-outline" @click="goCartList" class="cart-icon" @mouseenter.native="getCartList" />
<i class="cart-badge">{{cartNum < 100 ? cartNum : '99'}}</i>
<cateNav class="cate" :hover="true" :showNavBar="false"></cateNav>
<Search
class="search-con"
:hover="true"
:showLogo="false"
:showTag="false"
></Search>
<Icon
type="ios-cart-outline"
@click="goCartList"
class="cart-icon"
@mouseenter.native="getCartList"
/>
<i class="cart-badge">{{ cartNum < 100 ? cartNum : "99" }}</i>
</div>
</div>
</template>
<script>
import {cartCount} from '@/api/cart.js'
import storage from '@/plugins/storage.js';
import { cartCount } from "@/api/cart.js";
import storage from "@/plugins/storage.js";
export default {
data () {
data() {
return {
userInfo: {} // 用户信息
}
userInfo: {}, // 用户信息
};
},
computed: {
cartNum () { // 购物车数量
return this.$store.state.cartNum
}
cartNum() {
// 购物车商品数量
return this.$store.state.cartNum;
},
},
methods: {
goCartList () { // 跳转购物车页面
goCartList() {
// 跳转购物车页面
let routerUrl = this.$router.resolve({
path: '/cart'
})
window.open(routerUrl.href, '_blank')
path: "/cart",
});
window.open(routerUrl.href, "_blank");
},
getCartList () { // 获取购物车列表
if (storage.getItem('userInfo')) {
cartCount().then(res => {
this.$store.commit('SET_CARTNUM', res.result)
this.Cookies.setItem('cartNum', res.result)
})
getCartList() {
// 获取购物车列表
if (storage.getItem("userInfo")) {
cartCount().then((res) => {
this.$store.commit("SET_CARTNUM", res.result);
this.Cookies.setItem("cartNum", res.result);
});
}
},
},
mounted() {
if (storage.getItem("userInfo")) {
this.userInfo = JSON.parse(storage.getItem("userInfo"));
}
},
mounted () {
if (storage.getItem('userInfo')) {
this.userInfo = JSON.parse(storage.getItem('userInfo'));
}
}
}
};
</script>
<style lang="scss" scoped>
.content{
width: 1200px;
height: 40px;
margin: 10px auto;
position: relative;
}
.cate {
float: left;
width: 200px!important;
}
.search-con{
float: left;
width: 800px;
overflow: hidden;
margin-top: -27px;
}
.cart-icon {
width: 30px;
float: left;
font-size: 25px;
margin-top: 8px;
color: $theme_color;
z-index: 1;
position: relative;
&:hover{
cursor: pointer;
}
}
.cart-badge {
position: absolute;
font-style: normal;
right: 165px;
display: block;
background-color: $theme_color;
color: #fff;
font-size: 12px;
width: 17px;
height: 17px;
border-radius: 10px;
line-height: 17px;
text-align: center;
z-index: 5;
top: 3px;
.content {
width: 1200px;
height: 40px;
margin: 10px auto;
position: relative;
}
.cate {
float: left;
width: 200px !important;
}
.search-con {
float: left;
width: 800px;
overflow: hidden;
margin-top: -27px;
}
.cart-icon {
width: 30px;
float: left;
font-size: 25px;
margin-top: 8px;
color: $theme_color;
z-index: 1;
position: relative;
&:hover {
cursor: pointer;
}
}
.cart-badge {
position: absolute;
font-style: normal;
right: 165px;
display: block;
background-color: $theme_color;
color: #fff;
font-size: 12px;
width: 17px;
height: 17px;
border-radius: 10px;
line-height: 17px;
text-align: center;
z-index: 5;
top: 3px;
}
</style>

View File

@@ -14,7 +14,7 @@
</div>
</template>
<script>
import ModelFormItem from './modelFormItem.vue';
import ModelFormItem from './ModelFormItem.vue';
export default {
name: 'modelForm',
components: {
@@ -25,9 +25,7 @@ export default {
</script>
<style lang="scss" scoped>
.model-content {
width: 1200px;
margin: 0 auto;
background: #fff;
width: 100%;
min-height: 1200px;
}
</style>

View File

@@ -0,0 +1,206 @@
<template>
<div class="model-item" v-if="element && element.key">
<!-- 轮播图模块包括个人信息快捷导航模块 -->
<template v-if="element.type == 'carousel'">
<model-carousel
:data="element"
class="mb_20 width_1200_auto"
></model-carousel>
</template>
<template v-if="element.type == 'carousel1'">
<model-carousel1 :data="element" class="mb_20"></model-carousel1>
</template>
<template v-if="element.type == 'carousel2'">
<model-carousel2
:data="element"
class="mb_20 width_1200_auto"
></model-carousel2>
</template>
<!-- 热门广告 -->
<template v-if="element.type == 'hotAdvert'">
<div class="mb_20 width_1200_auto">
<img
style="display: block"
class="hover-pointer"
:src="element.options.list[0].img"
@click="linkTo(element.options.list[0].url)"
width="1200"
alt=""
/>
</div>
<ul class="advert-list width_1200_auto">
<template v-for="(item, index) in element.options.list">
<li
v-if="index !== 0"
@click="linkTo(item.url)"
class="hover-pointer"
:key="index"
>
<img :src="item.img" width="230" height="190" alt="" />
</li>
</template>
</ul>
</template>
<!-- 限时秒杀 待完善 -->
<template v-if="element.type == 'seckill' && element.options.list.length">
<seckill :data="element" class="mb_20 width_1200_auto"></seckill>
</template>
<!-- 折扣广告 -->
<template v-if="element.type == 'discountAdvert'">
<div
class="discountAdvert"
:style="{
backgroundImage:
'url(' + require('@/assets/images/decorate.png') + ')',
}"
>
<img
@click="linkTo(item.url)"
class="hover-pointer"
v-for="(item, index) in element.options.classification"
:key="index"
:src="item.img"
width="190"
height="210"
alt=""
/>
<img
@click="linkTo(item.url)"
class="hover-pointer"
v-for="(item, index) in element.options.brandList"
:key="'discount' + index"
:src="item.img"
width="240"
height="105"
alt=""
/>
</div>
</template>
<!-- 好货推荐 -->
<template v-if="element.type == 'recommend'">
<recommend :data="element" class="mb_20 width_1200_auto"></recommend>
</template>
<!-- 新品排行 -->
<template v-if="element.type == 'newGoodsSort'">
<new-goods-sort
:data="element"
class="mb_20 width_1200_auto"
></new-goods-sort>
</template>
<!-- 首页广告 -->
<template v-if="element.type == 'firstAdvert'">
<first-page-advert
:data="element"
class="mb_20 width_1200_auto"
></first-page-advert>
</template>
<!-- 横幅广告 -->
<template v-if="element.type == 'bannerAdvert'">
<div style="width: 100%; text-align: center">
<img
width="1200"
class="hover-pointer mb_20"
@click="linkTo(element.options.url)"
:src="element.options.img"
alt=""
/>
</div>
</template>
<template v-if="element.type == 'notEnough'"
>
<not-enough
:data="element"
class="mb_20 width_1200_auto"
></not-enough>
</template>
</div>
</template>
<script>
import ModelCarousel from "./modelList/Carousel.vue";
import ModelCarousel1 from "./modelList/Carousel1.vue";
import ModelCarousel2 from "./modelList/Carousel2.vue";
import FirstPageAdvert from "./modelList/FirstPageAdvert.vue";
import NewGoodsSort from "./modelList/NewGoodsSort.vue";
import Recommend from "./modelList/Recommend.vue";
import NotEnough from "./modelList/NotEnough.vue";
import Seckill from "./modelList/Seckill.vue";
export default {
name: "modelFormItem",
props: ["element", "select", "index", "data"],
components: {
ModelCarousel,
ModelCarousel1,
ModelCarousel2,
Recommend,
NewGoodsSort,
FirstPageAdvert,
NotEnough,
Seckill,
},
data() {
return {
showModal: false, // 控制模态框显隐
selected: {}, // 已选数据
};
},
};
</script>
<style lang="scss" scoped>
.model-item {
position: relative;
margin-bottom: 10px;
}
/** 热门广告 */
.advert-list {
background: $theme_color;
height: 200px;
display: flex;
justify-content: space-around;
padding: 3px 10px;
> li {
img {
cursor: pointer;
border-radius: 10px;
transition: all 150ms ease-in-out;
&:hover {
transform: translateY(-3px);
box-shadow: rgba(0, 0, 0, 0.4) 0px 5px 20px 0px;
}
}
}
}
/** 折扣广告 */
.discountAdvert {
width: 1300px;
height: 566px;
margin: 0 auto;
margin-bottom: 20px;
background-repeat: no-repeat;
position: relative;
left: -47px;
padding-left: 295px;
display: flex;
flex-wrap: wrap;
align-items: flex-start;
img {
margin-top: 10px;
margin-right: 10px;
transition: all 150ms ease-in-out;
&:hover {
box-shadow: 0 5px 12px 0 rgba(0, 0, 0, 0.4);
transform: translateY(-2px);
}
}
}
.width_1200_auto {
width: 1200px;
margin: 0 auto;
background-color: #fff;
}
</style>

View File

@@ -1,302 +0,0 @@
<template>
<div class="model-item" v-if="element && element.key">
<!-- 轮播图模块包括个人信息快捷导航模块 -->
<template v-if="element.type == 'carousel'">
<model-carousel :data="element"></model-carousel>
</template>
<!-- 热门广告 -->
<template v-if="element.type == 'hotAdvert'">
<div>
<img
style="display: block"
class="hover-pointer"
:src="element.options.list[0].img"
@click="linkTo(element.options.list[0].url)"
width="1200"
alt=""
/>
</div>
<ul class="advert-list">
<template v-for="(item, index) in element.options.list">
<li
v-if="index !== 0"
@click="linkTo(item.url)"
class="hover-pointer"
:key="index"
>
<img :src="item.img" width="230" height="190" alt="" />
</li>
</template>
</ul>
</template>
<!-- 限时秒杀 待完善 -->
<!-- <template v-if="element.type == 'seckill'">
<seckill :data="element"></seckill>
</template> -->
<!-- 折扣广告 -->
<template v-if="element.type == 'discountAdvert'">
<div
class="discountAdvert"
:style="{
'background-image': 'url(' + element.options.bgImg.img + ')',
}"
>
<img
@click="linkTo(item.url)"
class="hover-pointer"
v-for="(item, index) in element.options.classification"
:key="index"
:src="item.img"
width="190"
height="210"
alt=""
/>
<img
@click="linkTo(item.url)"
class="hover-pointer"
v-for="(item, index) in element.options.brandList"
:key="'discount' + index"
:src="item.img"
width="240"
height="105"
alt=""
/>
</div>
</template>
<!-- 好货推荐 -->
<template v-if="element.type == 'recommend'">
<recommend :data="element"></recommend>
</template>
<!-- 新品排行 -->
<template v-if="element.type == 'newGoodsSort'">
<new-goods-sort :data="element"></new-goods-sort>
</template>
<!-- 首页广告 -->
<template v-if="element.type == 'firstAdvert'">
<first-page-advert :data="element"></first-page-advert>
</template>
<!-- 横幅广告 -->
<template v-if="element.type == 'bannerAdvert'">
<img
width="1200"
class="hover-pointer"
@click="linkTo(element.options.url)"
:src="element.options.img"
alt=""
/>
</template>
<template v-if="element.type == 'notEnough'">
<not-enough :data="element"></not-enough>
</template>
</div>
</template>
<script>
import ModelCarousel from './modelList/carousel.vue';
import FirstPageAdvert from './modelList/firstPageAdvert.vue';
import NewGoodsSort from './modelList/newGoodsSort.vue';
import Recommend from './modelList/recommend.vue';
import NotEnough from './modelList/notEnough.vue';
import Seckill from './modelList/seckill.vue';
export default {
name: 'modelFormItem',
props: ['element', 'select', 'index', 'data'],
components: {
ModelCarousel,
Recommend,
NewGoodsSort,
FirstPageAdvert,
NotEnough,
Seckill
},
data () {
return {
showModal: false, // 控制模态框显隐
selected: {} // 已选数据
};
}
};
</script>
<style lang="scss" scoped>
.model-item {
position: relative;
margin-bottom: 20px;
&:hover {
.del-btn {
display: block;
}
}
}
.del-btn {
width: 100px;
height: 100px;
display: none;
position: absolute;
right: -100px;
top: 0;
&:hover {
display: block;
}
}
/** 热门广告 */
.advert-list {
background: $theme_color;
height: 200px;
display: flex;
justify-content: space-around;
padding: 3px 10px;
> li {
img {
cursor: pointer;
border-radius: 10px;
transition: all 150ms ease-in-out;
&:hover {
transform: translateY(-3px);
box-shadow: rgba(0, 0, 0, 0.4) 0px 5px 20px 0px;
}
}
}
}
/** 限时秒杀 */
.limit-img {
display: flex;
flex-direction: row;
img {
width: 300px;
height: 100px;
}
}
/** 折扣广告 */
.discountAdvert {
height: 566px;
background-repeat: no-repeat;
margin-left: -97px;
position: relative;
padding-left: 295px;
display: flex;
flex-wrap: wrap;
align-items: start;
img {
margin-top: 10px;
margin-right: 10px;
transition: all 150ms ease-in-out;
&:hover {
box-shadow: 0 5px 12px 0 rgba(0, 0, 0, 0.4);
transform: translateY(-2px);
}
}
}
/** 首页品牌 */
.brand {
.brand-view {
display: flex;
margin-top: 10px;
.brand-view-content {
width: 470px;
margin-left: 10px;
img {
width: 100%;
height: 316px;
}
.brand-view-title {
height: 50px;
padding: 0 5px;
display: flex;
align-items: center;
justify-content: space-between;
}
}
.brand-view-content:first-child {
width: 240px;
margin-left: 0;
}
}
.brand-list {
margin-top: 10px;
display: flex;
align-items: center;
flex-wrap: wrap;
li {
width: 121px;
height: 112px;
position: relative;
overflow: hidden;
border: 1px solid #f5f5f5;
margin: -1px -1px 0 0;
&:hover {
.brand-mash {
display: flex;
}
}
.brand-img {
text-align: center;
margin-top: 30px;
img {
width: 100px;
height: auto;
}
}
.brand-mash {
display: none;
position: absolute;
top: 0;
left: 0;
background: rgba(0, 0, 0, 0.5);
width: inherit;
height: inherit;
font-size: 12px;
font-weight: bold;
.ivu-icon {
position: absolute;
right: 10px;
top: 10px;
font-size: 15px;
}
align-items: center;
justify-content: center;
flex-direction: column;
color: #fff;
cursor: pointer;
div:last-child {
background-color: $theme_color;
border-radius: 9px;
padding: 0 10px;
margin-top: 5px;
}
}
}
.refresh {
display: flex;
align-items: center;
flex-direction: column;
justify-content: center;
.ivu-icon {
font-size: 18px;
transition: all 0.3s ease-out;
}
&:hover {
background-color: $theme_color;
color: #fff;
.ivu-icon {
transform: rotateZ(360deg);
}
}
}
}
}
/** 装修模态框 内部样式start */
.modal-top-advert {
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
> * {
margin-bottom: 10px;
}
}
</style>

View File

@@ -0,0 +1,209 @@
<template>
<div class="model-carousel">
<div class="nav-body clearfix">
<!-- 侧边导航占位 -->
<div class="nav-side"></div>
<div class="nav-content">
<!-- 轮播图 -->
<Carousel autoplay>
<CarouselItem v-for="(item, index) in data.options.list" :key="index">
<div style="overflow: hidden">
<img
:src="item.img"
width="790"
@click="linkTo(item.url)"
height="340"
class="hover-pointer"
/>
</div>
</CarouselItem>
</Carousel>
</div>
<div class="nav-right">
<div class="person-msg">
<img :src="userInfo.face" v-if="userInfo.face" alt />
<Avatar icon="ios-person" class="mb_10" v-else size="80" />
<div>
Hi, {{
userInfo.nickName || `欢迎来到${config.title}` | secrecyMobile
}}
</div>
<div v-if="userInfo.id">
<Button class="btns" shape="circle" @click="$router.push('home')"
>会员中心</Button
>
</div>
<div v-else>
<Button class="btns" @click="$router.push('login')" shape="circle"
>请登录</Button
>
</div>
</div>
<div class="shop-msg">
<div>
<span>常见问题</span>
<ul class="article-list">
<li
class="ellipsis"
:alt="article.title"
v-for="(article, index) in articleList"
:key="index"
@click="goArticle(article.id)"
>
{{ article.title }}
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import { articleList } from "@/api/common.js";
import storage from "@/plugins/storage";
export default {
name: "modelCarousel",
props: ["data"],
data() {
return {
config: require("@/config"),
userInfo: {}, // 用户信息
articleList: [], // 常见问题
params: {
// 请求常见问题参数
pageNumber: 1,
pageSize: 5,
type: "ANNOUNCEMENT",
sort: "sort",
},
};
},
methods: {
getArticleList() {
// 获取常见问题列表
articleList(this.params).then((res) => {
if (res.success) {
this.articleList = res.result.records;
}
});
},
goArticle(id) {
// 跳转文章详情
let routeUrl = this.$router.resolve({
path: "/article",
query: { id },
});
window.open(routeUrl.href, "_blank");
},
},
mounted() {
if (storage.getItem("userInfo"))
this.userInfo = JSON.parse(storage.getItem("userInfo"));
this.getArticleList();
},
};
</script>
<style scoped lang="scss">
.model-carousel {
width: 1200px;
height: 340px;
overflow: hidden;
}
.btns {
background-color:#363634 ;
line-height:30px;
color: white !important;
}
.btns:hover {
background-color: #363634;
line-height:32px !important;
color: #e5d790 !important;
}
/* 导航主体 */
.nav-body {
width: 1200px;
height: 340px;
margin: 0px auto;
}
.nav-side {
height: 100%;
width: 200px;
float: left;
padding: 0px;
color: #fff;
background-color: #6e6568;
}
/*导航内容*/
.nav-content {
width: 790px;
overflow: hidden;
float: left;
position: relative;
}
.nav-right {
float: left;
width: 210px;
.person-msg {
display: flex;
align-items: center;
flex-direction: column;
margin: 20px auto;
button {
height: 30px !important;
margin-top: 10px;
line-height: 30px;
border: none;
}
.ivu-btn-default {
// color: $theme_color;
// border-color: $theme_color;
}
img {
margin-bottom: 10px;
width: 80px;
height: 80px;
border-radius: 50%;
}
}
.shop-msg {
div {
width: 100%;
margin: 10px 27px;
span {
cursor: pointer;
text-align: center;
font-weight: bold;
margin-left: 5px;
}
span:nth-child(1) {
@include content_color($theme_color);
margin-left: 0;
}
span:nth-child(2) {
font-weight: normal;
}
span:nth-child(3):hover {
color: $theme_color;
}
}
ul {
li {
cursor: pointer;
margin: 5px 0;
color: #999395;
width: 150px;
font-size: 12px;
&:hover {
color: $theme_color;
}
}
}
}
}
</style>

View File

@@ -0,0 +1,76 @@
<template>
<div class="model-carousel1" :style="{background: bgColor}">
<div class="nav-body clearfix">
<!-- 侧边导航 -->
<div class="nav-side"></div>
<div class="nav-content">
<!-- 轮播图 -->
<Carousel autoplay @on-change="autoChange">
<CarouselItem v-for="(item, index) in data.options.list" :key="index" >
<div style="overflow: hidden">
<img :src="item.img" width="1200" height="470" />
</div>
</CarouselItem>
</Carousel>
</div>
</div>
</div>
</template>
<script>
export default {
name: 'modelCarousel1',
props: ['data'],
data () {
return {
showModal: false, // modal显隐
selected: null, // 已选数据
picModelFlag: false, // 选择图片modal
bgColor: '#fff' // 轮播背景色
};
},
mounted () {
this.bgColor = this.data.options.list[0].bgColor
},
methods: {
// 自动切换时改变背景色
autoChange (oVal, val) {
this.bgColor = this.data.options.list[val].bgColor
}
}
};
</script>
<style scoped lang="scss">
.model-carousel1 {
width: 100%;
height: 470px;
background: #fff;
}
/*大的导航信息,包含导航,幻灯片等*/
.nav-body {
width: 1200px;
height: 470px;
margin: 0px auto;
}
.nav-side {
height: 470px;
width: 200px;
padding: 0px;
color: #fff;
line-height: 470px;
text-align: center;
position: absolute;
z-index: 1;
}
/*导航内容*/
.nav-content {
width: 1200px;
height: 470px;
overflow: hidden;
float: left;
position: relative;
}
</style>

View File

@@ -1,20 +1,30 @@
<template>
<div class="model-carousel">
<div class="model-carousel2">
<div class="nav-body clearfix">
<!-- 侧边导航占位 -->
<!-- 侧边导航 -->
<div class="nav-side"></div>
<div class="nav-content">
<!-- 轮播图 -->
<Carousel autoplay>
<CarouselItem v-for="(item, index) in data.options.list" :key="index">
<div style="overflow: hidden">
<img
:src="item.img"
width="790"
@click="linkTo(item.url)"
height="340"
class="hover-pointer"
/>
<img :src="item.img" width="590" height="470" />
</div>
</CarouselItem>
</Carousel>
</div>
<div class="nav-content1">
<!-- 轮播图 -->
<Carousel autoplay :autoplay-speed="5000">
<CarouselItem v-for="(item, index) in data.options.listRight" :key="index">
<div class="mb_10">
<img :src="item[0].img" width="190" height="150" />
</div>
<div class="mb_10">
<img :src="item[1].img" width="190" height="150" />
</div>
<div>
<img :src="item[2].img" width="190" height="150" />
</div>
</CarouselItem>
</Carousel>
@@ -23,14 +33,12 @@
<div class="person-msg">
<img :src="userInfo.face" v-if="userInfo.face" alt />
<Avatar icon="ios-person" class="mb_10" v-else size="80" />
<div>Hi{{ userInfo.nickName || "欢迎来到LiLi Shop" | secrecyMobile }}</div>
<div>Hi{{ userInfo.nickName || `欢迎来到${config.title}` | secrecyMobile }}</div>
<div v-if="userInfo.id">
<Button type="error" shape="circle" @click="$router.push('home')">会员中心</Button>
<Button type="error" shape="circle">会员中心</Button>
</div>
<div v-else>
<Button type="error" @click="$router.push('login')" shape="circle"
>请登录</Button
>
<Button type="error" shape="circle">请登录</Button>
</div>
</div>
<div class="shop-msg">
@@ -49,18 +57,20 @@
</template>
<script>
import {articleList} from '@/api/common.js'
import storage from '@/plugins/storage';
export default {
name: 'modelCarousel',
name: 'modelCarousel2',
props: ['data'],
data () {
return {
config:require('@/config'),
userInfo: {}, //
articleList: [], //
params: { //
pageNumber: 1,
pageSize: 5,
pageSize: 10,
type: 'ANNOUNCEMENT',
sort: 'sort'
}
@@ -90,51 +100,74 @@ export default {
</script>
<style scoped lang="scss">
.model-carousel {
.model-carousel2 {
width: 1200px;
height: 340px;
height: 470px;
overflow: hidden;
}
/* 导航主体 */
.nav-item li {
float: left;
font-size: 16px;
font-weight: bold;
margin-left: 30px;
}
.nav-item a {
text-decoration: none;
color: #555555;
}
.nav-item a:hover {
color: $theme_color;
}
/*大的导航信息,包含导航,幻灯片等*/
.nav-body {
width: 1200px;
height: 340px;
height: 470px;
margin: 0px auto;
}
.nav-side {
height: 100%;
width: 200px;
float: left;
padding: 0px;
color: #fff;
float: left;
background-color: #6e6568;
line-height: 470px;
text-align: center;
}
/*导航内容*/
.nav-content {
width: 790px;
.nav-content,.nav-content1 {
width: 590px;
height: 470px;
overflow: hidden;
float: left;
position: relative;
margin-left: 10px;
}
.nav-content1{
width: 190px;
}
.nav-right {
float: left;
width: 210px;
width: 190px;
margin-left: 10px;
.person-msg {
display: flex;
align-items: center;
flex-direction: column;
margin: 20px auto;
button {
height: 25px !important;
margin-top: 10px;
}
.ivu-btn-default {
color: $theme_color;
border-color: $theme_color;
}
img {
margin-bottom: 10px;
width: 80px;

View File

@@ -31,7 +31,7 @@ export default {
return {
options: this.data.options //
};
},
}
};
</script>
<style lang="scss" scoped>

View File

@@ -231,4 +231,4 @@ export default {
margin-top: 15px;
}
}
</style>
</style>

View File

@@ -1,16 +1,18 @@
<template>
<div class="not-enough">
<ul class="nav-bar">
<li
v-for="(item, index) in conData.options.navList"
:class="currentIndex === index ? 'curr' : ''"
@click="changeCurr(index)"
:key="index"
>
<p>{{ item.title }}</p>
<p>{{ item.desc }}</p>
</li>
</ul>
<div class="not-enough" ref="obtain" id="demo">
<Affix :offset-top="62" @on-change="change">
<ul class="nav-bar" v-show="topSearchShow">
<li
v-for="(item, index) in conData.options.navList"
:class="currentIndex === index ? 'curr' : ''"
@click="changeCurr(index)"
:key="index"
>
<p @click="gotoDemo">{{ item.title }}</p>
<p @click="gotoDemo">{{ item.desc }}</p>
</li>
</ul>
</Affix>
<div class="content" v-if="showContent">
<div
v-for="(item, index) in conData.options.list[currentIndex]"
@@ -29,17 +31,26 @@
</template>
<script>
export default {
mounted() {
window.addEventListener('scroll',this.handleScrollx,true)
},
props: {
data: {
type: Object,
default: null
}
default: null,
},
},
data () {
data() {
return {
screenHeight:document.body.clientHeight,
scrollHieght:0,
topSearchShow: true, //
topIndex: 0, //
scrollTops: 0,
open:'',
currentIndex: 0, //
conData: this.data, //
showContent: true //
showContent: true, //
};
},
watch: {
@@ -47,14 +58,40 @@ export default {
this.conData = val;
},
conData: function (val) {
this.$emit('content', val);
}
this.$emit("content", val);
},
},
methods: {
changeCurr (index) { //
this.currentIndex = index;
handleScrollx(){
// console.log('',window.pageYOffset) //
// console.log(this.$refs.obtain.getBoundingClientRect().top) //
this.scrollHieght = Number(window.pageYOffset);//
this.scrollTops = Number(this.$refs.obtain.getBoundingClientRect().top); //
this.topSearchShow = true; //
if(this.scrollTops < -660){ //
this.topSearchShow = false;
}
},
toguid(path,id){
var path =path;
var Id = id;
localStorage.setItem('toId',Id);
this.$router.push(path);
},
change(status){ //
this.open = status
},
gotoDemo(){ // demo
if(this.open){ //
document.querySelector("#demo").scrollIntoView(true);
}
}
//scrollIntoView()HTML
},
changeCurr(index) {
//
this.currentIndex = index;
},
},
};
</script>
<style lang="scss" scoped>
@@ -63,10 +100,13 @@ export default {
justify-content: center;
width: 100%;
margin-bottom: 10px;
background-color: rgb(218, 217, 217);
background-color: #f8f8f8;
height: 60px;
align-items: center;
position: relative;
position: sticky;
position: -webkit-sticky;
top: 0;
li {
padding: 0 30px;
text-align: center;
@@ -140,5 +180,6 @@ export default {
}
}
}
}
</style>

View File

@@ -0,0 +1,323 @@
<template>
<div class="seckill">
<div class="aside hover-pointer" @click="goToSeckill">
<div class="title">{{ actName }}</div>
<div class="hour">
<span>{{ currHour }}:00</span>点场 倒计时
</div>
<div class="count-down" v-if="actStatus === 1">
<span>{{ hours }}</span>
<span>{{ minutes }}</span>
<span>{{ seconds }}</span>
</div>
<div class="act-status" v-else>未开始</div>
</div>
<swiper :options="swiperOption" ref="mySwiper">
<swiper-slide v-for="(item,index) in goodsList" :key="index">
<div class="content hover-pointer" @click="goToSeckill">
<img :src="item.goodsImage" width="140" height="140" :alt="item.goodsName">
<div class="ellipsis">{{item.goodsName}}</div>
<div>
<span>{{ item.price | unitPrice('¥') }}</span>
<span>{{ item.originalPrice | unitPrice('¥') }}</span>
</div>
</div>
</swiper-slide>
<div class="swiper-button-prev" slot="button-prev">
<Icon type="ios-arrow-back" />
</div>
<div class="swiper-button-next" slot="button-next">
<Icon type="ios-arrow-forward" />
</div>
</swiper>
</div>
</template>
<script>
// 引入插件
import { swiper, swiperSlide } from 'vue-awesome-swiper';
import 'swiper/dist/css/swiper.css';
export default {
components: {
swiper,
swiperSlide
},
props: {
data: Object
},
data () {
return {
list: [], // 秒杀时段列表
goodsList: [], // 商品列表
actStatus: 0, // 0 未开始 1 进行中
actName: '限时秒杀', // 活动名称
currIndex: 0, // 当前时间段的下标
currHour: '00', // 当前秒杀场
diffSeconds: 0, // 倒计时秒数
hours: 0, // 小时
minutes: 0, // 分钟
seconds: 0, // 秒
interval: null, // 定时器
swiperOption: { // 轮播图参数
loop: true,
slidesPerView: 5,
// 设置点击箭头
navigation: {
nextEl: '.swiper-button-next',
prevEl: '.swiper-button-prev'
}
}
};
},
watch: {
currIndex (val) {
clearInterval(this.interval)
this.interval = null
this.countDown(val)
this.goodsList = this.list[val].seckillGoodsList
},
diffSeconds (val) {
const hours = Math.floor(val / 3600);
// 当前秒数 / 60向下取整
// 获取到所有分钟数 3600 / 60 = 60分钟
// 对60取模超过小时数的分钟数
const minutes = Math.floor(val / 60) % 60;
// 当前的秒数 % 60获取到 超过小时数、分钟数的秒数(秒数)
const seconds = val % 60;
this.hours = filteTime(hours)
this.minutes = filteTime(minutes)
this.seconds = filteTime(seconds)
if (val <= 0) {
clearInterval(this.interval)
this.interval = null
}
function filteTime (time) {
if (time < 10) {
return '0' + time
} else {
return time
}
}
}
},
computed: {
swiper () { // 轮播组件
return this.$refs.mySwiper.swiper;
}
},
beforeDestroy () {
// 销毁前清除定时器
clearInterval(this.interval);
},
mounted () {
this.getListByDay()
},
methods: {
goToSeckill () { // 跳转秒杀页面
let routeUrl = this.$router.resolve({
path: '/seckill'
});
window.open(routeUrl.href, '_blank');
},
countDown (currIndex) { // 倒计时
// 0点时间戳
let zeroTime = new Date(new Date().toLocaleDateString()).getTime();
let currTime = new Date().getTime()
let actTime = 0;
let nowHour = new Date().getHours(); // 当前小时数
if (this.list[currIndex].timeLine > nowHour) { // 活动未开始
this.actStatus = 0;
actTime = zeroTime + this.list[currIndex].timeLine * 3600 * 1000
} else if (this.list[currIndex].timeLine <= nowHour) { // 活动进行中
this.actStatus = 1;
if (currIndex === this.list.length - 1) { // 如果是最后一个活动直到24点结束
actTime = zeroTime + 24 * 3600 * 1000
} else {
actTime = zeroTime + this.list[currIndex + 1].timeLine * 3600 * 1000
}
}
this.currHour = this.list[this.currIndex].timeLine
this.diffSeconds = Math.floor((actTime - currTime) / 1000)
this.interval = setInterval(() => {
this.diffSeconds--
}, 1000)
},
getListByDay () { // 当天秒杀活动
// const list = [
// {
// timeLine: 18,
// seckillGoodsList: [
// {goodsImage: 'https://lilishop-oss.oss-cn-beijing.aliyuncs.com/a9593607de404546953055f279fd5d54.png', goodsName: 'dfsdgsdf', originalPrice: 39, price: 12},
// {goodsImage: 'https://lilishop-oss.oss-cn-beijing.aliyuncs.com/a9593607de404546953055f279fd5d54.png', goodsName: 'dfsdgsdf', originalPrice: 39, price: 12},
// {goodsImage: 'https://lilishop-oss.oss-cn-beijing.aliyuncs.com/a9593607de404546953055f279fd5d54.png', goodsName: 'dfsdgsdf', originalPrice: 39, price: 12},
// {goodsImage: 'https://lilishop-oss.oss-cn-beijing.aliyuncs.com/a9593607de404546953055f279fd5d54.png', goodsName: 'dfsdgsdf', originalPrice: 39, price: 12},
// {goodsImage: 'https://lilishop-oss.oss-cn-beijing.aliyuncs.com/a9593607de404546953055f279fd5d54.png', goodsName: 'dfsdgsdf', originalPrice: 39, price: 12},
// {goodsImage: 'https://lilishop-oss.oss-cn-beijing.aliyuncs.com/a9593607de404546953055f279fd5d54.png', goodsName: 'dfsdgsdf', originalPrice: 39, price: 12}
// ]
// }
// ]
this.list = this.data.options.list
this.goodsList = this.list[0].seckillGoodsList
this.countDown(this.currIndex)
}
}
};
</script>
<style lang="scss" scoped>
.seckill {
width: 100%;
height: 260px;
display: flex;
background-color: #eee;
.aside {
overflow: hidden;
width: 190px;
height: 100%;
color: #fff;
background-image: url("../../../assets/images/seckillBg.png");
.title {
width: 100%;
text-align: center;
font-size: 28px;
margin-top: 31px;
}
.hour {
margin-top: 90px;
text-align: center;
span {
font-size: 18px;
}
}
.count-down {
margin: 10px 0 0 30px;
> span {
position: relative;
float: left;
width: 30px;
height: 30px;
text-align: center;
background-color: #2f3430;
margin-right: 20px;
color: white;
font-size: 20px;
&::after {
content: ":";
display: block;
position: absolute;
right: -20px;
font-weight: bolder;
font-size: 18px;
width: 20px;
height: 100%;
top: 0;
}
}
> span:last-child::after {
content: "";
}
}
.act-status {
margin: 10px 0 0 65px;
font-size: 20px;
}
}
.content {
width: 200px;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
position: relative;
&::after {
content: "";
display: block;
position: absolute;
top: 50%;
right: 0;
width: 1px;
height: 200px;
transform: translateY(-50%);
background: linear-gradient(180deg, white, #eeeeee, white);
}
img {
margin-top: 30px;
}
> div {
width: 160px;
margin-top: 10px;
font-size: 12px;
position: relative;
}
> div:nth-of-type(1):hover {
color: $theme_color;
cursor: pointer;
}
> div:nth-of-type(2) {
border: 1px solid $theme_color;
line-height: 24px;
display: flex;
text-align: center;
span:nth-child(1) {
color: #fff;
font-size: 16px;
width: 92px;
background-color: $theme_color;
position: relative;
&::before {
content: " ";
width: 0;
height: 0;
border-color: transparent white transparent transparent;
border-style: solid;
border-width: 24px 8px 0 0;
position: absolute;
top: 0;
left: 84px;
}
}
span:nth-child(2) {
color: #999;
width: 66px;
text-decoration: line-through;
}
}
}
}
.swiper-container {
height: 260px;
width: 1000px;
margin-left: 10px;
background-color: #fff;
}
.swiper-button-prev, .swiper-button-next {
background: #ccc;
width: 25px;
height: 35px;
font-size: 16px;
color: #fff;
display: flex;
align-items: center;
justify-content: center;
}
.swiper-button-prev:hover, .swiper-button-next:hover {
background: #aaa;
}
.swiper-button-prev {
left: 0;
border-bottom-right-radius: 18px;
border-top-right-radius: 18px;
padding-right: 5px;
}
.swiper-button-next {
right: 0;
border-top-left-radius: 18px;
border-bottom-left-radius: 18px;
padding-left: 5px;
}
</style>

View File

@@ -1,289 +0,0 @@
<template>
<div class="seckill">
<div class="aside hover-pointer" @click="goPromotion">
<div class="title">{{ actName }}</div>
<div class="hour">
<span>{{ currHour }}:00</span>点场 倒计时
</div>
<div class="count-down" v-if="actStatus === 1">
<span>{{ hours }}</span
><span>{{ minutes }}</span
><span>{{ seconds }}</span>
</div>
<div class="act-status" v-else>
{{ actStatus == 0 ? "未开始" : "已结束" }}
</div>
</div>
<div class="section">
<swiper ref="mySwiper" :options="swiperOptions">
<swiper-slide
v-for="(item, index) in options.list[0].goodsList"
:key="index"
class="swiper-slide"
>
<div class="content hover-pointer" @click="goPromotion">
<img :src="item.img" width="140" height="140" :alt="item.name" />
<div class="ellipsis">{{ item.name }}</div>
<div>
<span>{{ item.price | unitPrice("¥") }}</span>
<span>{{ item.originalPrice | unitPrice("¥") }}</span>
</div>
</div>
</swiper-slide>
</swiper>
</div>
</div>
</template>
<script>
import { Swiper, SwiperSlide, directive } from 'vue-awesome-swiper';
// import 'swiper/swiper-bundle.css';
export default {
components: {
Swiper,
SwiperSlide
},
directives: {
swiper: directive
},
props: {
data: {
type: Object,
default: null
}
},
data () {
return {
options: this.data.options, // 装修数据
actStatus: 0, // 0 未开始 1 进行中 2 已结束
actName: '限时秒杀', // 活动名称
currHour: '00', // 当前秒杀场
diffSeconds: 0, // 倒计时秒数
days: 0, // 天
hours: 0, // 小时
minutes: 0, // 分钟
seconds: 0, // 秒
interval: undefined, // 定时器
swiperOptions: { // 轮播图参数
slidesPerView: 5,
autoplay: true,
loop: true
}
};
},
watch: {
diffSeconds (val) { // 秒杀倒计时
const hours = Math.floor(val / 3600);
// 当前秒数 / 60向下取整
// 获取到所有分钟数 3600 / 60 = 60分钟
// 对60取模超过小时数的分钟数
const minutes = Math.floor(val / 60) % 60;
// 当前的秒数 % 60获取到 超过小时数、分钟数的秒数(秒数)
const seconds = val % 60;
this.hours = hours < 10 ? '0' + hours : hours;
this.minutes = minutes < 10 ? '0' + minutes : minutes;
this.seconds = seconds < 10 ? '0' + seconds : seconds;
if (val === 0) {
clearInterval(this.interval);
this.hours = 0;
this.minutes = 0;
this.seconds = 0;
this.countDown(this.options.list);
}
}
},
mounted () {
this.countDown(this.options.list);
},
beforeDestroy () {
clearInterval(this.interval);
},
methods: {
// 倒计时
countDown (list) {
/**
* 默认倒计时两小时
* 如果没有开始,则显示未开始
* 进行中显示倒计时 + 时间
* 今天的秒杀结束则显示已结束
*/
let nowHour = new Date().getHours();
if (nowHour < Number(list[0].time)) {
// 活动未开始
this.currHour = list[0].time;
this.actStatus = 0;
} else if (nowHour >= Number(list[list.length - 1].time + 2)) {
// 活动已结束
this.actStatus = 2;
this.currHour = list[list.length - 1].time;
} else {
// 活动进行中
this.actStatus = 1;
for (let i = 0; i < list.length; i++) {
if (nowHour === Number(list[i].time)) {
this.currHour = list[i].time;
}
if (
nowHour > Number(list[i].time) &&
nowHour < Number(list[i].time + 2)
) {
this.currHour = list[i].time;
}
}
// 当前0点时间戳
let zeroTime = new Date(new Date().toLocaleDateString()).getTime();
// 活动倒计时
this.diffSeconds = Math.floor((zeroTime + 3600 * 1000 * (this.currHour + 2) - new Date().getTime()) / 1000);
this.interval = setInterval(() => {
this.diffSeconds--;
}, 1000);
}
},
goPromotion () { // 跳转秒杀页面
let routeUrl = this.$router.resolve({
path: '/seckill'
});
window.open(routeUrl.href, '_blank');
}
}
};
</script>
<style lang="scss" scoped>
.seckill {
width: 100%;
height: 260px;
display: flex;
.aside {
overflow: hidden;
width: 190px;
height: 100%;
color: #fff;
background-image: url("../../../assets/images/seckillBg.png");
.title {
width: 100%;
text-align: center;
font-size: 28px;
margin-top: 31px;
}
.hour {
margin-top: 90px;
text-align: center;
span {
font-size: 18px;
}
}
.count-down {
margin: 10px 0 0 30px;
> span {
position: relative;
float: left;
width: 30px;
height: 30px;
text-align: center;
background-color: #2f3430;
margin-right: 20px;
color: white;
font-size: 20px;
&::after {
content: ":";
display: block;
position: absolute;
right: -20px;
font-weight: bolder;
font-size: 18px;
width: 20px;
height: 100%;
top: 0;
}
}
> span:last-child::after {
content: "";
}
}
.act-status {
margin: 10px 0 0 65px;
font-size: 20px;
}
}
.section {
width: 1000px;
// background: #efefef;
.swiper-slide {
height: 260px;
.content {
width: 200px;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
position: relative;
&::after {
content: "";
display: block;
position: absolute;
top: 50%;
right: 0;
width: 1px;
height: 200px;
transform: translateY(-50%);
background: linear-gradient(180deg, white, #eeeeee, white);
}
img {
margin-top: 30px;
}
> div {
width: 160px;
margin-top: 10px;
font-size: 12px;
position: relative;
}
> div:nth-of-type(1):hover {
color: $theme_color;
cursor: pointer;
}
> div:nth-of-type(2) {
border: 1px solid $theme_color;
line-height: 24px;
display: flex;
text-align: center;
span:nth-child(1) {
color: #fff;
font-size: 16px;
width: 92px;
background-color: $theme_color;
position: relative;
&::before {
content: " ";
width: 0;
height: 0;
border-color: transparent white transparent transparent;
border-style: solid;
border-width: 24px 8px 0 0;
position: absolute;
top: 0;
left: 84px;
}
}
span:nth-child(2) {
color: #999;
width: 66px;
text-decoration: line-through;
}
}
}
}
}
}
.ellipsis {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
</style>

View File

@@ -4,11 +4,6 @@
<p slot="header">
<span>发票信息</span>
</p>
<!-- <div>
<div>为响应环保自营全面启用电子普通发票非自营发票由第三方商家实际开具</div>
<div>电子普通发票是税务机关认可的有效收付款凭证与纸质普通发票具有同等法律效力可用于报销入账售后维权等</div>
<div>如商品由第三方卖家销售发票类型及内容将由该卖家决定</div>
</div> -->
<!-- 普通发票 -->
<div class="nav-content">
<Form :model="invoiceForm" ref="form" label-position="left" :rules="ruleInline" :label-width="110">
@@ -55,15 +50,14 @@ export default {
name: 'invoiceModal',
data () {
return {
invoice: 1,
invoice: 1, // 发票类型
invoiceAvailable: false, // 模态框显隐
loading: false, // 提交状态
invoiceForm: {
// 发票表单
// 普票表单
receiptTitle: '', // 发票抬头
taxpayerId: '', // 纳税人识别号
receiptContent: '商品明细', // 发票内容
receiptContent: '商品明细' // 发票内容
},
type: 1, // 1 个人 2 单位
ruleInline: {
@@ -76,6 +70,7 @@ export default {
},
props: ['invoiceData'],
watch: {
// 回显的发票信息
invoiceData: {
handler (val) {
this.invoiceForm = { ...val };
@@ -107,10 +102,9 @@ export default {
let flage = true;
// 保存分为两种类型,个人以及企业
const { type, receiptTitle, receiptContent } = JSON.parse(
const { receiptTitle } = JSON.parse(
JSON.stringify(this.invoiceForm)
);
// 判断是否填写发票抬头
if (!receiptTitle) {
this.$Message.error('请填写发票抬头!');
@@ -118,7 +112,7 @@ export default {
return false;
}
if (type === 2) {
if (this.type === 2) {
this.$refs.form.validate((valid) => {
if (!valid) {
flage = false;
@@ -130,7 +124,7 @@ export default {
return flage;
},
// 保存发票信息
async submit () {
if (this.save()) {
this.loading = true;

View File

@@ -1,65 +0,0 @@
<template>
<div class="wrapper">
<card _Title="猜你喜欢" :_Size="16"> </card>
<Row :gutter="12" class="likeList">
<Col
:span="4"
class="likeItem"
v-for="(item, index) in goodsData"
:key="index"
>
<img :src="item.img" alt="" />
<div class="likeTitle">{{ item.title }}</div>
<div class="likePrice">{{ item.price | unitPrice }}</div>
</Col>
</Row>
</div>
</template>
<script>
export default {
name: 'like',
data () {
}
};
</script>
<style scoped lang="scss">
.wrapper {
@include white_background_color();
}
.likeList {
padding: 0 12px;
display: flex;
flex-wrap: wrap;
> .likeItem {
/*width: 210px;*/
/*margin: 10px 5px;*/
> img {
display: block;
width: 100%;
height: auto;
}
> .likeTitle,
.likePrice {
margin: 6px 0;
text-align: center;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
overflow: hidden;
}
> .likePrice {
color: $theme_color;
}
}
}
</style>

View File

@@ -31,6 +31,7 @@
<script>
import AMapLoader from '@amap/amap-jsapi-loader';
import { handleRegion } from '@/api/address.js';
export default {
name: 'map',
props: {
@@ -41,6 +42,7 @@ export default {
},
data () {
return {
config:require('@/config'),
showMap: false, // 展示地图
mapSearch: '', // 地图搜索
map: null, // 初始化地图
@@ -53,6 +55,7 @@ export default {
};
},
watch: {
// 监听搜索框搜索地图
mapSearch: function (val) {
this.searchOfMap(val);
}
@@ -87,7 +90,7 @@ export default {
},
init () { // 初始化地图
AMapLoader.load({
key: 'b440952723253aa9fe483e698057bf7d', // 申请好的Web端开发者Key首次调用 load 时必填
key: this.config.aMapKey, // 申请好的Web端开发者Key首次调用 load 时必填
version: '', // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
plugins: [
'AMap.ToolBar',

View File

@@ -167,7 +167,6 @@ export default {
watch: {
addressId: {
handler: function (v) {
console.log(v);
if (v) {
this.reviewData();
} else {
@@ -175,9 +174,6 @@ export default {
}
},
immediate: true
},
addr (v) {
console.log(v);
}
}
};

View File

@@ -0,0 +1,361 @@
<template>
<div class="cate-nav">
<div class="nav-con">
<div
class="all-categories hover-pointer"
@mouseenter="showFirstList = true"
@mouseleave="showFirstList = false"
>
全部商品分类
</div>
<ul class="nav-item" v-if="showNavBar">
<li
class="nav-lis"
v-for="(item, index) in navList.list"
:key="index"
@click="linkTo(item.url)"
>
{{ item.name }}
</li>
</ul>
</div>
<!-- 全部商品分类 -->
<div
class="cate-list"
v-show="showAlways || showFirstList"
@mouseenter="showFirstList = true"
@mouseleave="showFirstList = false"
>
<!-- 第一级分类 -->
<div
class="nav-side"
:class="{ 'large-nav': large, 'opacity-nav': opacity }"
@mouseleave="panel = false"
>
<ul>
<li
v-for="(item, index) in cateList"
:key="index"
@mouseenter="showDetail(index)"
>
<span class="nav-side-item" @click="goGoodsList(item.id)">{{
item.name
}}</span>
<span v-for="(second, secIndex) in item.children" :key="secIndex">
<span v-if="secIndex < 2"> / </span>
<span
@click="goGoodsList(second.id, second.parentId)"
class="nav-side-item"
v-if="secIndex < 2"
>{{ second.name }}</span
>
</span>
</li>
</ul>
</div>
<!-- 展开分类 -->
<div
class="detail-item-panel"
:style="{ minHeight: large ? '470px' : '340px' }"
v-show="panel"
@mouseenter="panel = true"
@mouseleave="panel = false"
>
<div class="nav-detail-item">
<template v-for="(item, index) in panelData">
<span
@click="goGoodsList(item.id, item.parentId)"
v-if="index < 8"
:key="index"
>{{ item.name }}<Icon type="ios-arrow-forward"
/></span>
</template>
</div>
<ul>
<li
v-for="(items, index) in panelData"
:key="index"
class="detail-item-row"
>
<span
class="detail-item-title"
@click="goGoodsList(items.id, items.parentId)"
>
{{ items.name }} <Icon type="ios-arrow-forward" />
<span class="glyphicon glyphicon-menu-right"></span>
</span>
<div>
<span
v-for="(item, subIndex) in items.children"
@click="goGoodsList(item.id, items.id, items.parentId)"
:key="subIndex"
class="detail-item"
>{{ item.name }}</span
>
</div>
</li>
</ul>
</div>
</div>
</div>
</template>
<script>
import { getCategory } from "@/api/goods";
import storage from "@/plugins/storage.js";
export default {
name: "GoodsListNav",
props: {
showAlways: {
// 总是显示下拉分类
default: false,
type: Boolean,
},
showNavBar: {
// 显示全部商品分类右侧导航条
default: true,
type: Boolean,
},
hover: {
default: false,
type: Boolean,
},
large: {
// 是否更高的高度
default: false,
type: Boolean,
},
opacity: {
// 是否背景透明
default: false,
type: Boolean,
},
},
data() {
return {
panel: false, // 二级分类展示
panelData: [], // 二级分类数据
showFirstList: false, // 始终展示一级列表
cateList: [], // 商品分类
};
},
computed: {
navList() {
// 导航列表
if (storage.getItem("navList")) {
return JSON.parse(storage.getItem("navList"));
} else {
return [];
}
},
},
methods: {
getCate() {
// 获取分类数据
if (this.hover) return false;
getCategory(0).then((res) => {
if (res.success) {
this.cateList = res.result;
this.$store.commit("SET_CATEGORY", res.result);
// 过期时间
var expirationTime = new Date().setHours(new Date().getHours() + 1);
// 存放过期时间
localStorage.setItem("category_expiration_time", expirationTime);
// 存放分类信息
localStorage.setItem("category", JSON.stringify(res.result));
}
});
},
showDetail(index) {
// 展示全部分类
this.panel = true;
this.panelData = this.cateList[index].children;
},
goGoodsList(id, secondId, firstId) {
// 分类共有三级,传全部分类过去
const arr = [firstId, secondId, id];
if (!arr[1]) {
arr.splice(0, 2);
}
if (!arr[0]) {
arr.shift();
}
let routerUrl = this.$router.resolve({
path: "/goodsList",
query: { categoryId: arr.toString() },
});
window.open(routerUrl.href, "_blank");
},
},
mounted() {
if (
localStorage.getItem("category") &&
localStorage.getItem("category_expiration_time")
) {
// 如果缓存过期,则获取最新的信息
if (new Date() > localStorage.getItem("category_expiration_time")) {
this.getCate();
return;
}
this.cateList = JSON.parse(localStorage.getItem("category"));
} else {
this.getCate();
}
},
};
</script>
<style scoped lang="scss">
.nav-lis:hover {
color: $theme_color !important;
cursor: pointer;
}
.cate-nav {
width: 1200px;
position: relative;
margin: 0 auto;
}
/** 商品分类 */
.nav-con {
width: 1200px;
height: 40px;
margin: 0 auto;
display: flex;
.all-categories {
width: 200px;
line-height: 40px;
color: #fff;
background-color: $theme_color;
text-align: center;
font-size: 16px;
border-bottom: none;
}
.nav-item {
width: 1000px;
height: 40px;
line-height: 40px;
overflow: hidden;
list-style: none;
// background-color: #eee;
display: flex;
li {
float: left;
font-weight: bold;
margin-left: 20px;
color: rgb(129, 127, 127);
font-size: 15px;
&:hover {
color: #e1251b;
}
}
}
}
// 分类列表
.cate-list {
margin: 0 auto;
position: absolute;
z-index: 1000;
}
.nav-side {
width: 200px;
float: left;
padding: 0px;
color: #fff;
background-color: #6e6568;
height: 335px;
overflow: hidden;
}
.large-nav {
height: 470px;
ul > li {
line-height: 20px;
}
}
.opacity-nav {
background-color: rgba(0, 0, 0, 0.5);
}
.nav-side ul {
width: 100%;
padding: 0px;
padding-top: 5px;
list-style: none;
}
.nav-side li {
padding: 7.5px 0;
padding-left: 12px;
font-size: 13px;
line-height: 18px;
&:hover {
background: #999395;
}
}
.nav-side-item:hover {
cursor: pointer;
color: #e1251b;
}
/*显示商品详细信息*/
.detail-item-panel {
width: 1000px;
min-height: 340px;
background-color: #fff;
box-shadow: 0px 0px 15px #ccc;
position: absolute;
top: 0;
left: 200px;
z-index: 1000;
padding: 15px;
}
.nav-detail-item {
margin-top: 5px;
margin-bottom: 15px;
cursor: pointer;
color: #eee;
}
.nav-detail-item span {
padding: 6px;
padding-left: 12px;
margin-right: 15px;
font-size: 12px;
background-color: #6e6568;
}
.nav-detail-item span:hover {
background-color: #e1251b;
}
.detail-item-panel li {
line-height: 30px;
}
.detail-item-title {
font-weight: bold;
font-size: 12px;
cursor: pointer;
color: #555555;
padding-right: 10px;
width: 81px;
text-align: right;
}
.detail-item-title:hover {
color: #e1251b;
}
.detail-item-row {
display: flex;
> div {
flex: 1;
}
}
.detail-item {
font-size: 12px;
padding-left: 8px;
padding-right: 8px;
cursor: pointer;
border-left: 1px solid #ccc;
&:first-child {
border: none;
padding-left: 0;
}
}
.detail-item:hover {
color: #e1251b;
}
</style>

View File

@@ -95,7 +95,7 @@
<!-- 其他筛选项 -->
<template v-for="(tag, tagIndex) in tagsContent">
<div class="other" v-if="tag.show && tagIndex !== 0" :key="tagIndex">
<div class="other" v-if="tag.show && tagIndex !== 0" v-show="tagIndex < showTagCount" :key="tagIndex">
<div>
<strong>{{ tag.key }}</strong>
</div>
@@ -153,6 +153,7 @@
</div>
</div>
</template>
<div @click="moreOptions" v-if="tagsContent.length>4" class="more-options">{{showTagCount===5?'更多筛选项':'收起筛选项'}}<Icon :type="showTagCount===5?'ios-arrow-down':'ios-arrow-up'" /></div>
</div>
</div>
</template>
@@ -168,6 +169,7 @@ export default {
first: {},
second: {}
},
showTagCount: 5, // 展示的搜索项数量
multiple: false, // 多选
tagsContent: [
// 标签
@@ -181,15 +183,18 @@ export default {
multSelected: [], // 多选分类
selectedItem: [], // 已选分类集合 顶部展示
brandIds: [], // 品牌id合集
params: {}, // 请求参数
cateList: [] // 全部商品分类
params: {} // 请求参数
};
},
computed: {
cateList () { // 商品分类
return this.$store.state.category || []
}
},
watch: {
selectedItem: {
// 监听已选条件,来调用列表接口
handler (val) {
console.log(val);
let classification = [];
this.params.brandId = ''
this.params.prop = ''
@@ -227,8 +232,12 @@ export default {
methods: {
getNav () { // 获取商品分类,分类下展示
if (!this.$route.query.categoryId) return
this.cateList = JSON.parse(localStorage.getItem('category'))
if (!this.cateList.length) { // 商品分类存储在localstorage接口未调用成功前再次刷新数据
setTimeout(() => {
this.getNav()
}, 500)
return
}
const arr = this.$route.query.categoryId.split(',')
if (arr.length > 0) {
this.tabBar = this.cateList.filter(e => {
@@ -248,7 +257,7 @@ export default {
this.$set(this.tabBar, 'second', second)
}
},
cateClick (item, index) { // 点选分类
cateClick (item, index) { // 点选分类
switch (index) {
case 1:
this.$router.push({
@@ -370,6 +379,10 @@ export default {
});
}
});
},
// 展示更多搜索项
moreOptions () {
this.showTagCount = this.showTagCount === 5 ? 100 : 5
}
},
mounted () {
@@ -411,7 +424,7 @@ export default {
background: #fff;
border: 1px solid #999;
padding: 0 8px;
width: 85px;
min-width: 85px;
text-align: center;
margin: 0 3px;
&:hover {
@@ -503,8 +516,8 @@ export default {
/** 筛选主体 */
.content {
background: #fff;
border-top: 1px solid #999;
border-bottom: 1px solid #999;
border-top: 1px solid #ddd;
border-bottom: 1px solid #ddd;
margin: 10px 0;
}
/** 品牌 start */
@@ -532,7 +545,7 @@ export default {
width: 100px;
height: 50px;
float: left;
line-height: 50px;
line-height: 45px;
border: 1px solid #ddd;
margin: -1px -1px 0 0;
overflow: hidden;
@@ -545,6 +558,7 @@ export default {
&:hover {
border-color: $theme_color;
border: 2px solid $theme_color;
top: 0;
left: 0;
position: relative;
@@ -636,7 +650,8 @@ export default {
> div:first-child {
width: 100px;
background: #eee;
padding: 10px 0 0 10px;
padding-left: 10px;
line-height: 30px;
}
> div:last-child {
width: 1100px;
@@ -652,7 +667,7 @@ export default {
height: 30px;
float: left;
line-height: 30px;
color: $primary_color;
color:#4d9cf1;
overflow: hidden;
position: relative;
font-size: 12px;
@@ -700,6 +715,15 @@ export default {
}
}
}
.more-options{
margin: 5px;
color: #4d9cf1;
font-size: 12px;
cursor: pointer;
text-align: right;
}
.more-options:hover{
color:#0165d1;
}
/** 其他筛选项 end */
</style>

View File

@@ -1,290 +0,0 @@
<template>
<div class="cate-nav">
<div class="nav-con">
<div class="all-categories hover-pointer" @mouseenter="showFirstList = true" @mouseleave="showFirstList = false">全部商品分类</div>
<ul class="nav-item" v-if="showNavBar">
<li
class="hover-color"
v-for="(item, index) in navList.list"
:key="index"
@click="linkTo(item.url)"
>
{{ item.name }}
</li>
</ul>
</div>
<!-- 全部商品分类 -->
<div class="cate-list" v-show="showAlways || showFirstList" @mouseenter="showFirstList = true" @mouseleave="showFirstList = false">
<!-- 第一级分类 -->
<div class="nav-side" @mouseleave="panel = false">
<ul>
<li v-for="(item, index) in cateList" :key="index" @mouseenter="showDetail(index)" >
<span class="nav-side-item" @click="goGoodsList(item.id)">{{item.name}}</span>
<span v-for="(second, secIndex) in item.children" :key="secIndex">
<span v-if="secIndex < 2" > / </span>
<span @click="goGoodsList(second.id, second.parentId)" class="nav-side-item" v-if="secIndex < 2">{{second.name}}</span>
</span>
</li>
</ul>
</div>
<!-- 展开分类 -->
<div
class="detail-item-panel"
v-show="panel"
@mouseenter="panel = true"
@mouseleave="panel = false"
>
<div class="nav-detail-item">
<template v-for="(item, index) in panelData">
<span @click="goGoodsList(item.id, item.parentId)" v-if="index < 8" :key="index">{{ item.name }}<Icon type="ios-arrow-forward" /></span>
</template>
</div>
<ul>
<li
v-for="(items, index) in panelData"
:key="index"
class="detail-item-row"
>
<span class="detail-item-title" @click="goGoodsList(items.id,items.parentId)">
{{ items.name }} <Icon type="ios-arrow-forward" />
<span class="glyphicon glyphicon-menu-right"></span>
</span>
<div>
<span v-for="(item, subIndex) in items.children" @click="goGoodsList(item.id,items.id,items.parentId)"
:key="subIndex" class="detail-item">{{ item.name }}</span>
</div>
</li>
</ul>
</div>
</div>
</div>
</template>
<script>
import { getCategory } from '@/api/goods';
import storage from '@/plugins/storage.js'
export default {
name: 'GoodsListNav',
props: {
showAlways: { // 总是显示下拉分类
default: false,
type: Boolean
},
showNavBar: { // 显示全部商品分类右侧导航条
default: true,
type: Boolean
}
},
data () {
return {
cateList: [], // 分类数据
panel: false, // 二级分类展示
panelData: [], // 二级分类数据
showFirstList: false // 始终展示一级列表
}
},
computed: {
navList () { // 导航列表
return JSON.parse(storage.getItem('navList')) || []
}
},
methods: {
getCate () { // 获取分类数据
getCategory(0).then(res => {
if (res.success) {
this.cateList = res.result;
// 过期时间
var expirationTime = new Date().setHours(new Date().getHours() + 1);
// 存放过期时间
localStorage.setItem('category_expiration_time', expirationTime);
// 存放分类信息
localStorage.setItem('category', JSON.stringify(res.result))
}
});
},
showDetail (index) { // 展示全部分类
this.panel = true
this.panelData = this.cateList[index].children
},
goGoodsList (id, secondId, firstId) { // 分类共有三级,传全部分类过去
const arr = [firstId, secondId, id]
if (!arr[1]) {
arr.splice(0, 2)
}
if (!arr[0]) {
arr.shift()
}
let routerUrl = this.$router.resolve({
path: '/goodsList',
query: {categoryId: arr.toString()}
})
window.open(routerUrl.href, '_blank')
}
},
mounted () {
if (localStorage.getItem('category') && localStorage.getItem('category_expiration_time')) {
// 如果缓存过期,则获取最新的信息
if (new Date() > localStorage.getItem('category_expiration_time')) {
this.getCate();
return;
}
this.cateList = JSON.parse(localStorage.getItem('category'))
} else {
this.getCate()
}
}
};
</script>
<style scoped lang="scss">
.cate-nav{
width: 1200px;
position: relative;
margin: 0 auto;
}
/** 商品分类 */
.nav-con {
width: 1200px;
height: 40px;
// background: #eee;
margin: 0 auto;
display: flex;
.all-categories {
width: 200px;
line-height: 40px;
color: #fff;
background-color: $theme_color;
text-align: center;
font-size: 16px;
}
.nav-item {
width: 1000px;
height: 40px;
line-height: 40px;
overflow: hidden;
list-style: none;
background-color: #eee;
display: flex;
li {
font-size: 16px;
font-weight: bold;
margin-left: 20px;
color: rgb(89, 88, 88);
font-size: 15px;
&:hover {
color: $theme_color;
}
}
}
}
.cate-list{
margin: 0 auto;
position: absolute;
z-index: 1000;
}
.nav-item li {
float: left;
font-size: 16px;
font-weight: bold;
margin-left: 30px;
}
.nav-item a {
text-decoration: none;
color: #555555;
}
.nav-item a:hover {
color: $theme_color;
}
.nav-side {
width: 200px;
float: left;
padding: 0px;
color: #fff;
background-color: #6e6568;
height: 335px;
overflow: hidden;
}
.nav-side ul {
width: 100%;
padding: 0px;
padding-top: 5px;
list-style: none;
}
.nav-side li {
padding: 7.5px 0;
padding-left: 12px;
font-size: 13px;
line-height: 18px;
}
.nav-side li:hover {
background: #999395;
}
.nav-side-item:hover {
cursor: pointer;
color: $theme_color;
}
/*显示商品详细信息*/
.detail-item-panel {
width: 815px;
min-height: 340px;
background-color: #fff;
box-shadow: 0px 0px 15px #ccc;
position: absolute;
top: 0;
left: 200px;
z-index: 1000;
padding: 15px;
}
.nav-detail-item {
margin-top: 5px;
margin-bottom: 15px;
cursor: pointer;
color: #eee;
}
.nav-detail-item span {
padding: 6px;
padding-left: 12px;
margin-right: 15px;
font-size: 12px;
background-color: #6e6568;
}
.nav-detail-item span:hover {
background-color: $theme_color;
}
.detail-item-panel li {
line-height: 30px;
// margin-left: 40px;
}
.detail-item-title {
font-weight: bold;
font-size: 12px;
cursor: pointer;
color: #555555;
padding-right: 10px;
width: 81px;
text-align: right;
}
.detail-item-title:hover {
color: $theme_color;
}
.detail-item-row {
display: flex;
>div{flex: 1;}
}
.detail-item {
font-size: 12px;
padding-left: 8px;
padding-right: 8px;
cursor: pointer;
border-left: 1px solid #ccc;
&:first-child{
border: none;
padding-left: 0;
}
}
.detail-item:hover {
color: $theme_color;
}
</style>

View File

@@ -3,7 +3,7 @@
<div class="imgBox" :style="{width:data.originalWidth+'px',height:data.originalHeight + 'px'}">
<img :src="data.backImage" style="width:100%;height:100%" alt="">
<img class="slider" :src="data.slidingImage" :style="{left:distance+'px',top:data.randomY+'px'}" :width="data.sliderWidth" :height="data.sliderHeight" alt="">
<Icon type="md-refresh" class="refresh" @click="refresh" />
<Icon type="md-refresh" class="refresh" @click="init" />
</div>
<div class="handle" :style="{width:data.originalWidth+'px'}">
<span class="bgcolor" :style="{width:distance + 'px',background:bgColor}"></span>
@@ -72,30 +72,34 @@ export default {
xPos: this.distance
};
postVerifyImg(params).then(res => {
if (res.result) {
this.bgColor = 'green';
this.verifyText = '解锁成功';
this.$emit('change', { status: true, distance: this.distance });
if (res.success) {
if (res.result) {
this.bgColor = 'green';
this.verifyText = '解锁成功';
this.$emit('change', { status: true, distance: this.distance });
} else {
this.bgColor = 'red';
this.verifyText = '解锁失败';
let that = this;
setTimeout(() => {
that.init();
}, 1000);
this.$emit('change', { status: false, distance: this.distance });
}
} else {
this.bgColor = 'red';
this.verifyText = '解锁失败';
let that = this;
setTimeout(() => {
that.refresh();
}, 1000);
this.$emit('change', { status: false, distance: this.distance });
this.init()
}
}).catch(()=>{
this.init()
});
},
refresh () { // 刷新滑块
init () { // 初始化数据
this.flag = false;
this.downX = 0;
this.distance = 0;
this.bgColor = '#04ad11';
this.verifyText = '拖动滑块解锁';
this.init();
},
init () { // 初始化数据
getVerifyImg(this.type).then(res => {
if (res.result) {
this.data = res.result;

View File

@@ -7,7 +7,7 @@ import storage from '@/plugins/storage.js';
*/
export function getVerifyImg (verificationEnums) {
return request({
url: `${commonUrl}/common/slider/${verificationEnums}`,
url: `${commonUrl}/common/common/slider/${verificationEnums}`,
method: Method.GET,
needToken: false,
headers: {uuid: storage.getItem('uuid')}
@@ -19,7 +19,7 @@ export function getVerifyImg (verificationEnums) {
*/
export function postVerifyImg (params) {
return request({
url: `${commonUrl}/common/slider/${params.verificationEnums}`,
url: `${commonUrl}/common/common/slider/${params.verificationEnums}`,
method: Method.POST,
needToken: false,
params,

View File

@@ -1,49 +1,12 @@
export default {
/**
* @description 配置显示在浏览器标签的title
*/
title: 'Lili电商',
/**
* @description token在Cookie中存储的天数默认1天
*/
cookieExpires: 1,
/**
* @description 是否使用国际化默认为false
* 如果不使用则需要在路由中给需要在菜单中展示的路由设置meta: {title: 'xxx'}
* 用来在菜单中显示文字
*/
useI18n: true,
/**
* @description api请求基础路径
*/
api_dev: {
// common: 'http://192.168.0.100:8890',
// buyer: 'http://192.168.0.100:8888',
// seller: 'http://192.168.0.100:8889',
// manager: 'http://192.168.0.100:8887'
common: 'https://common-api.pickmall.cn',
buyer: 'https://buyer-api.pickmall.cn',
seller: 'https://store-api.pickmall.cn',
manager: 'https://admin-api.pickmall.cn'
},
api_prod: {
common: 'https://common-api.pickmall.cn',
buyer: 'https://buyer-api.pickmall.cn',
seller: 'https://store-api.pickmall.cn',
manager: 'https://admin-api.pickmall.cn'
},
/**
* @description api请求基础路径前缀
*/
baseUrlPrefix: '/buyer',
/**
* @description 需要加载的插件
*/
plugin: {
'error-store': {
showInHeader: true, // 设为false后不会在顶部显示错误日志徽标
developmentOff: true // 设为true后在开发环境不会收集错误信息方便开发中排查错误
}
}
module.exports = {
title: "lili-shop", //配置显示在浏览器标签的title、底部信息、部分信息展示的值
icpCard: "", // icp证
company: {
href: "https://pickmall.cn",
name: "北京宏业汇成科技有限公司",
}, //公司信息
icpMessage: "京ICP备20009696号-1", //icp备案
aMapKey: "b440952723253aa9fe483e698057bf7d", //高德web端申请的api key
enableCDN: false, //生产环境 是否启用cdn加载 vue等js
port: 10000, //端口
};

View File

@@ -1,17 +1,16 @@
// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue';
import App from './App';
import router from './router';
import ViewUI from 'view-design';
import './assets/styles/theme.less';
import './assets/iconfont/iconfont.css';
// import './assets/iconfont/iconfont.css';
import * as filters from './plugins/filters';
import store from '@/vuex/store'
import storage from '@/plugins/storage';
// 全局引入封装组件
import {InstallAll} from '@/components/global.js';
let title = require('@/config').title
Vue.use(ViewUI);
Vue.use(InstallAll);
Vue.config.productionTip = false;
@@ -22,7 +21,7 @@ Object.keys(filters).forEach(key => {
router.beforeEach((to, from, next) => {
ViewUI.LoadingBar.start();
window.document.title = to.meta.title === undefined ? 'lili shop' : to.meta.title
window.document.title = to.meta.title === undefined ? title : to.meta.title
next();
});
@@ -32,7 +31,11 @@ router.afterEach(route => {
Vue.prototype.linkTo = function (url) {
if (url.substr(0, 1) === '/') { // 非外部链接没有origin只有路由地址
window.open(location.origin + url, '_blank');
if (router.mode === 'hash') {
window.open(location.origin + '/#' + url, '_blank');
} else {
window.open(location.origin + url, '_blank');
}
} else { // 外部链接完整的url地址
window.open(url, '_blank')
}
@@ -45,9 +48,7 @@ Vue.prototype.connectCs = function (sign = '37ef9b97807d03c6741298ed4eb5b536d2d2
Vue.prototype.Cookies = storage
/* eslint-disable no-new */
new Vue({
el: '#app',
router,
store,
components: { App },
template: '<App/>'
});
render: h => h(App)
}).$mount("#app")

View File

@@ -4,9 +4,10 @@
<!-- LOGO 搜索 -->
<div class="width_1200 logo">
<div>
<router-link to="/"><img :src="logoImg" alt="lili shop" title="lilishop" /></router-link>
<router-link to="/"><img :src="$store.state.logoImg" /></router-link>
<div>
购物车(<span>{{ goodsTotal }}</span>)
购物车(<span>{{ goodsTotal }}</span
>)
</div>
</div>
<Search :showTag="false" :showLogo="false"></Search>
@@ -17,9 +18,15 @@
<div class="available-area">
<div class="cart-steps">
<span :class="stepIndex == 0 ? 'active' : ''">1.我的购物车</span>
<Icon :class="stepIndex == 0 ? 'active-arrow' : ''" custom="icomoon icon-next"></Icon>
<Icon
:class="stepIndex == 0 ? 'active-arrow' : ''"
custom="icomoon icon-next"
></Icon>
<span :class="stepIndex == 1 ? 'active' : ''">2.填写订单信息</span>
<Icon :class="stepIndex == 1 ? 'active-arrow' : ''" custom="icomoon icon-next"></Icon>
<Icon
:class="stepIndex == 1 ? 'active-arrow' : ''"
custom="icomoon icon-next"
></Icon>
<span :class="stepIndex == 2 ? 'active' : ''">3.成功提交订单</span>
</div>
</div>
@@ -27,7 +34,9 @@
<div class="cart-goods">
<div class="cart-goods-title">
<div class="width_60">
<Checkbox v-model="allChecked" @on-change="changeChecked(allChecked, 'all')">全选</Checkbox>
<Checkbox v-model="allChecked" @on-change="changeChecked(allChecked, 'all')"
>全选</Checkbox
>
</div>
<div class="goods-title">商品</div>
<div class="width_150">单价</div>
@@ -39,85 +48,156 @@
<p>购物车空空如也</p>
<router-link to="/">去选购&gt;</router-link>
</div>
<div v-else class="cart-goods-items" v-for="(shop, index) in cartList" :key="index">
<div
v-else
class="cart-goods-items"
v-for="(shop, index) in cartList"
:key="index"
>
<div class="shop-name">
<div>
<Checkbox v-model="shop.checked" @on-change="changeChecked(shop.checked, 'shop', shop.storeId)"></Checkbox>
<span class="go-shop-page" @click="goShopPage(shop.storeId)">{{shop.storeName}}</span>
<Checkbox
v-model="shop.checked"
@on-change="changeChecked(shop.checked, 'shop', shop.storeId)"
></Checkbox>
<span class="go-shop-page" @click="goShopPage(shop.storeId)">{{
shop.storeName
}}</span>
</div>
<span class="shop-coupon" v-if="shop.couponList.length" :class="couponAvailable === index ? 'shop-coupon-show' : ''" @click.stop="showCoupon(shop.id, index)">
<span
class="shop-coupon"
v-if="shop.couponList.length"
:class="couponAvailable === index ? 'shop-coupon-show' : ''"
@click.stop="showCoupon(shop.id, index)"
>
<!-- 优惠券模态框 -->
<div v-if="couponAvailable === index">
<div class="coupon-item" v-for="(item, index) in shop.couponList" :key="index">
<div
class="coupon-item"
v-for="(item, index) in shop.couponList"
:key="index"
>
<span v-if="item.couponType === 'PRICE'">{{ item.price }}</span>
<span v-if="item.couponType === 'DISCOUNT'">{{ item.couponDiscount }}</span>
<span>{{item.consumeThreshold}}元可用</span>
<Button class="coupon-btn" size="small" type="primary" @click="receiveShopCoupon(item)" :disabled="item.disabled">{{ item.disabled ? "已领取" : "领取" }}</Button>
<span v-if="item.couponType === 'DISCOUNT'"
>{{ item.couponDiscount }}</span
>
<span>{{ item.consumeThreshold }}元可用</span>
<Button
class="coupon-btn"
size="small"
type="primary"
@click="receiveShopCoupon(item)"
:disabled="item.disabled"
>{{ item.disabled ? "已领取" : "领取" }}</Button
>
</div>
</div>
</span>
<div class="promotion-notice">{{shop.promotionNotice}}</div>
<div class="promotion-notice">{{ shop.promotionNotice }}</div>
</div>
<template v-for="(goods, goodsIndex) in shop.skuList">
<div class="goods-item" :key="goodsIndex">
<div class="width_60">
<Checkbox v-model="goods.checked" @on-change="changeChecked(goods.checked, 'goods', goods.goodsSku.id)"></Checkbox>
<Checkbox
v-model="goods.checked"
@on-change="changeChecked(goods.checked, 'goods', goods.goodsSku.id)"
></Checkbox>
</div>
<div class="goods-title" @click="goGoodsDetail(goods.goodsSku.id, goods.goodsSku.goodsId)">
<img :src="
goods.goodsSku.thumbnail || '../assets/images/goodsDetail/item-detail-1.jpg'
" />
<div
class="goods-title"
@click="goGoodsDetail(goods.goodsSku.id, goods.goodsSku.goodsId)"
>
<img
:src="
goods.goodsSku.thumbnail ||
'../assets/images/goodsDetail/item-detail-1.jpg'
"
/>
<div>
<p>{{ goods.goodsSku.goodsName }}</p>
<template v-for="(promotion, promotionIndex) in goods.promotions">
<div class="promotion" :key="promotionIndex" v-if="promotion.promotionType === 'SECKILL'">
<div
class="promotion"
:key="promotionIndex"
v-if="promotion.promotionType === 'SECKILL'"
>
<span>秒杀</span>
<promotion :time="promotion.endTime" type="cart"></promotion>
</div>
</template>
<template v-for="(promotion, promotionIndex) in goods.promotions">
<div
class="promotion"
:key="promotionIndex"
v-if="promotion.promotionType === 'FULL_DISCOUNT'"
>
<span>满优惠活动</span>
<promotion :time="promotion.endTime" type="cart"></promotion>
</div>
</template>
</div>
</div>
<div class="width_150">
{{ goods.goodsSku.price | unitPrice("¥") }}
{{ goods.purchasePrice | unitPrice("¥") }}
</div>
<div class="width_100">
<InputNumber :min="1" size="small" v-model="goods.num" @on-change="changeNum(goods.num, goods.goodsSku.id)"></InputNumber>
<div class="fontsize_12">{{goods.goodsSku.quantity > 0 ? '有货' : '无货'}}</div>
<InputNumber
:min="1"
size="small"
v-model="goods.num"
@on-change="changeNum(goods.num, goods.goodsSku.id)"
></InputNumber>
<div class="fontsize_12">
{{ goods.goodsSku.quantity > 0 ? "有货" : "无货" }}
</div>
</div>
<div class="width_150">
{{ goods.num * goods.goodsSku.price | unitPrice("¥") }}
{{ goods.subTotal | unitPrice("¥") }}
</div>
<div class="width_100">
<span class="handle-btn" v-if="!goods.errorMessage" @click="delGoods(goods.goodsSku.id)">删除</span>
<span class="handle-btn" v-if="!goods.errorMessage" @click="collectGoods(goods.goodsSku.id)">收藏</span>
<span
class="handle-btn"
v-if="!goods.errorMessage"
@click="delGoods(goods.goodsSku.id)"
>删除</span
>
<span
class="handle-btn"
v-if="!goods.errorMessage"
@click="collectGoods(goods.goodsSku.id)"
>收藏</span
>
</div>
<div class="error-goods" v-if="goods.errorMessage">
<div>{{goods.errorMessage}}</div>
<div>{{ goods.errorMessage }}</div>
<Button type="primary" @click="delGoods(goods.goodsSku.id)">删除</Button>
</div>
</div>
</template>
</div>
<!-- 底部支付栏 -->
<div class="cart-goods-footer">
<div>
<div class="width_60">
<Checkbox v-model="allChecked" @on-change="changeChecked(allChecked, 'all')">全选</Checkbox>
<Checkbox v-model="allChecked" @on-change="changeChecked(allChecked, 'all')"
>全选</Checkbox
>
</div>
<div class="width_100 handle-btn" @click="delGoods">删除选中商品</div>
<div class="width_100 handle-btn" @click="delGoods()">删除选中商品</div>
<!-- <div class="width_100 handle-btn" @click="collectGoods">移到我的收藏</div> -->
<div class="width_100 handle-btn" @click="clearCart">清空购物车</div>
</div>
<div>
<div class="selected-count">
已选择<span>{{ checkedNum }}</span>件商品
已选择<span>{{ checkedNum }}</span
>件商品
</div>
<div class="ml_20 save-price">
已节省<span>{{ priceDetailDTO.discountPrice | unitPrice("¥") }}</span>
</div>
<div class="ml_20 total-price">
总价不含运费:<div>{{ priceDetailDTO.billPrice | unitPrice("¥") }}</div>
总价不含运费:
<div>{{ priceDetailDTO.flowPrice | unitPrice("¥") }}</div>
</div>
<div class="pay ml_20" @click="pay">去结算</div>
</div>
@@ -125,12 +205,6 @@
</div>
<Spin size="large" fix v-if="loading"></Spin>
</div>
<!-- 猜你喜欢 -->
<!-- <div class="like">
<div class="likeGoods">
<ShowLikeGoods />
</div>
</div> -->
<BaseFooter></BaseFooter>
</div>
</template>
@@ -138,10 +212,8 @@
<script>
import Promotion from "@/components/goodsDetail/Promotion";
import Search from "@/components/Search";
import ShowLikeGoods from "@/components/like";
import * as APICart from "@/api/cart";
import * as APIMember from "@/api/member";
import { getLogo } from "@/api/common.js";
export default {
name: "Cart",
beforeRouteEnter(to, from, next) {
@@ -150,12 +222,10 @@ export default {
},
components: {
Search,
ShowLikeGoods,
Promotion,
},
data() {
return {
logoImg: "", // logo图
couponAvailable: false, // 展示优惠券
stepIndex: 0, // 当前处于哪一步,购物车==0填写订单信息==1成功提交订单==2
goodsTotal: 1, // 商品数量
@@ -168,7 +238,6 @@ export default {
skuList: [], // sku列表
};
},
computed: {},
methods: {
// 跳转商品详情
goGoodsDetail(skuId, goodsId) {
@@ -209,7 +278,9 @@ export default {
const list = this.cartList;
list.forEach((shop) => {
shop.skuList.forEach((goods) => {
idArr.push(goods.goodsSku.id);
if(goods.checked) {
idArr.push(goods.goodsSku.id);
}
});
});
} else {
@@ -230,8 +301,8 @@ export default {
},
});
},
// 清空购物车
clearCart() {
// 清空购物车
this.$Modal.confirm({
title: "提示",
content: "<p>确定要清空购物车吗?清空后不可恢复</p>",
@@ -259,8 +330,8 @@ export default {
showCoupon(storeId, index) {
this.couponAvailable = index;
},
// 设置购买数量
changeNum(val, id) {
// 设置购买数量
console.log(val, id);
APICart.setCartGoodsNum({ skuId: id, num: val }).then((res) => {
console.log(res);
@@ -269,8 +340,8 @@ export default {
}
});
},
// 设置商品选中状态
async changeChecked(status, type, id) {
// 设置商品选中状态
const check = status ? 1 : 0;
if (type === "all") {
// 全选
@@ -285,9 +356,8 @@ export default {
this.getCartList();
},
// 领取优惠券
async receiveShopCoupon(item) {
// 领取优惠券
let res = await APIMember.receiveCoupon(item.id);
if (res.success) {
this.$set(item, "disabled", true);
@@ -296,8 +366,8 @@ export default {
this.$Message.error(res.message);
}
},
// 购物车列表
async getCartList() {
// 购物车列表
this.loading = true;
try {
let res = await APICart.cartGoodsAll();
@@ -334,16 +404,6 @@ export default {
// 购物车商品数量
if (res.success) this.goodsTotal = res.result;
});
if (!this.Cookies.getItem("logo")) {
getLogo().then((res) => {
if (res.success) {
let logoObj = JSON.parse(res.result.settingValue);
this.Cookies.setItem("logo", logoObj.buyerSideLogo);
}
});
} else {
this.logoImg = this.Cookies.getItem("logo");
}
},
};
</script>
@@ -667,12 +727,12 @@ export default {
color: #999;
}
}
.cart-goods-footer > div{
.cart-goods-footer > div {
display: flex;
align-items: center;
overflow: hidden;
}
.total-price{
.total-price {
display: flex;
align-items: center;
}

View File

@@ -32,10 +32,10 @@
</li>
</ul>
<Page :total="total" @on-change="changePageNum"
v-if="list.length && total > params.pageNumber"
class="pageration"
@on-page-size-change="changePageSize"
:page-size="params.pageSize"
show-total
show-sizer>
</Page>
</div>
@@ -51,17 +51,20 @@ export default {
list: [], //
total: 0, //
params: { //
getType: 'FREE',
pageNumber: 1,
pageSize: 20
}
}
},
methods: {
//
search (item) {
this.params.couponName = item
this.params.pageNumber = 1
this.getList()
},
//
getList () {
this.$Spin.show()
couponList(this.params).then(res => {
@@ -73,18 +76,18 @@ export default {
}
}).catch(() => { this.$Spin.hide() })
},
//
changePageNum (val) {
this.params.pageNumber = val;
this.getList()
},
//
changePageSize (val) {
this.pageNumber = 1;
this.params.pageNumber = 1;
this.params.pageSize = val;
this.getList()
},
//
receive (item) {
receiveCoupon(item.id).then(res => {
if (res.success) {
@@ -93,6 +96,7 @@ export default {
content: '<p>优惠券领取成功,可到我的优惠券页面查看</p>',
okText: '我的优惠券',
cancelText: '立即使用',
closable: true,
onOk: () => {
this.$router.push('/home/Coupons')
},
@@ -111,7 +115,7 @@ export default {
}
})
},
//
useScope (type, storeName) {
let shop = '平台';
let goods = '全部商品'

View File

@@ -1,89 +0,0 @@
<template>
<div>
<div class="feedback-container">
<div class="feedback-img-box">
<img src="../assets/images/feedback.png" />
</div>
<div class="feedback-box-border">
<div class="feedback-box">
<div class="feedback-title">
<h1>意见反馈</h1>
<h2>感谢你的反馈我们会积极改善做出更好的服务的</h2>
</div>
<div class="feedback-content">
<div class="feedback-form">
<Form :model="formItem" :label-width="80">
<FormItem label="标题">
<i-input v-model="formItem.title" placeholder="请输入标题"></i-input>
</FormItem>
<FormItem label="反馈信息">
<i-input
v-model="formItem.content"
type="textarea"
:autosize="{minRows: 8,maxRows: 10}"
placeholder="请输入反馈信息"
></i-input>
</FormItem>
<FormItem>
<Button type="primary">提交</Button>
<Button type="ghost">清空信息</Button>
</FormItem>
</Form>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: 'Feedback',
data () {
return {
formItem: { // 表单数据
title: '',
content: ''
}
};
}
};
</script>
<style scoped>
.feedback-container {
margin: 15px auto;
width: 80%;
height: 600px;
display: flex;
align-items: center;
/* background-color: #ccc; */
}
.feedback-img-box {
width: 50%;
display: flex;
align-items: center;
justify-content: center;
}
.feedback-img-box img {
width: 80%;
}
.feedback-box-border {
width: 50%;
display: flex;
align-items: center;
justify-content: center;
}
.feedback-box {
width: 480px;
}
.feedback-content {
margin: 15px auto;
border: 1px #ccc dotted;
}
.feedback-form {
margin: 30px auto;
width: 90%;
}
</style>

View File

@@ -4,7 +4,7 @@
<!-- 顶部logo -->
<div class="logo-box">
<img
:src="logoImg" width='150'
:src="$store.state.logoImg" width='150'
@click="$router.push('/')"
/>
<div>修改密码</div>
@@ -97,9 +97,9 @@
<a class="item" href="https://pickmall.cn/" target="_blank">条款</a>
</Row>
<Row type="flex" justify="center" class="copyright">
Copyright © 2020 - Present
Copyright © {{year}} - Present
<a href="https://pickmall.cn/" target="_blank" style="margin: 0 5px"
>lili-shop</a
>{{config.title}}</a
>
版权所有
</Row>
@@ -108,17 +108,18 @@
</template>
<script>
import * as RegExp from '@/plugins/RegExp.js';
import { md5 } from '@/plugins/md5.js';
import * as apiLogin from '@/api/login.js';
import { sendSms } from '@/api/common.js';
import Verify from '@/components/verify';
export default {
name: 'Login',
name: 'ForgetPassword',
components: { Verify },
data () {
return {
logoImg: '', // logo
config:require('@/config'),
loading: false, //
loading1: false, //
formFirst: { //
@@ -130,6 +131,7 @@ export default {
password: '',
oncePasd: ''
},
year: new Date().getFullYear(), //
step: 0, //
ruleInline: {
//
@@ -241,8 +243,8 @@ export default {
}
},
mounted () {
document.querySelector('.forget-password').style.height = window.innerHeight + 'px'
this.$refs.formFirst.resetFields();
this.logoImg = this.Cookies.getItem('logo')
},
watch: {
}
@@ -251,7 +253,7 @@ export default {
<style scoped lang="scss">
.forget-password{
height: 100%;
min-height: 700px;
}
.logo-box {
width: 600px;

View File

@@ -8,12 +8,29 @@
<div class="shop-nav-container">
<Breadcrumb>
<BreadcrumbItem to="/">首页</BreadcrumbItem>
<BreadcrumbItem v-for="(item, index) in categoryBar" :to="goGoodsList(index)" target="_blank" :key="index">{{item.name}}</BreadcrumbItem>
<BreadcrumbItem v-for="(item, index) in categoryBar" :to="goGoodsList(index)" target="_blank" :key="index">
{{ item.name }}
</BreadcrumbItem>
</Breadcrumb>
<div class="store-collect">
<span class="mr_10" v-if="goodsMsg.data"><router-link :to="'Merchant?id=' + goodsMsg.data.storeId">{{goodsMsg.data.storeName}}</router-link></span>
<span @click="collect" ><Icon type="ios-heart" :color="storeCollected ? '#ed3f14' : '#666'" />{{storeCollected?'已收藏店铺':'收藏店铺'}}</span>
<span @click="connectCs(storeMsg.yzfSign)" class="ml_10"><Icon custom="icomoon icon-customer-service" />联系客服</span>
<span class="mr_10" v-if="goodsMsg.data">
<router-link :to="'Merchant?id=' + goodsMsg.data.storeId">{{ goodsMsg.data.storeName }}</router-link>
</span>
<span @click="collect">
<Icon type="ios-heart" :color="storeCollected ? '#ed3f14' : '#666'" />
{{storeCollected ? '已收藏店铺' : '收藏店铺'}}
</span>
<!--
先看下udesk merchantEuid 是否有值
有的话 链接udesk
没有的话 显示云智服
-->
<span class="ml_10" v-if="storeMsg.merchantEuid" @click="IMService()">联系客服</span>
<span v-else @click="connectCs(storeMsg.yzfSign)" class="ml_10">
<Icon custom="icomoon icon-customer-service" />联系客服
</span>
</div>
</div>
</div>
@@ -22,125 +39,164 @@
<!-- 商品详细展示 -->
<ShowGoodsDetail v-if="goodsMsg.data" :detail="goodsMsg"></ShowGoodsDetail>
<!-- 猜你喜欢-->
<!-- <div class="like">
<div class="likeGoods">
<ShowLikeGoods/>
</div>
</div> -->
<Spin size="large" fix v-if="isLoading"></Spin>
<BaseFooter></BaseFooter>
</div>
</template>
<script>
import Search from '@/components/Search';
import ShopHeader from '@/components/header/ShopHeader';
import ShowGoods from '@/components/goodsDetail/ShowGoods';
import ShowGoodsDetail from '@/components/goodsDetail/ShowGoodsDetail';
import ShowLikeGoods from '@/components/like';
import { goodsSkuDetail } from '@/api/goods';
import { cancelCollect, collectGoods, isCollection } from '@/api/member';
import {getDetailById} from '@/api/shopentry'
import Search from "@/components/Search";
import ShopHeader from "@/components/header/ShopHeader";
import ShowGoods from "@/components/goodsDetail/ShowGoods";
import ShowGoodsDetail from "@/components/goodsDetail/ShowGoodsDetail";
import { goodsSkuDetail } from "@/api/goods";
import {
cancelCollect,
collectGoods,
isCollection,
getGoodsDistribution,
} from "@/api/member";
import { getDetailById } from "@/api/shopentry";
import { getIMDetail } from "@/api/common";
export default {
name: 'GoodsDetail',
beforeRouteEnter (to, from, next) {
name: "GoodsDetail",
beforeRouteEnter(to, from, next) {
window.scrollTo(0, 0);
next();
},
created () {
created() {
this.getGoodsDetail();
// this.getIMDetailMethods();
},
data () {
data() {
return {
goodsMsg: {}, // 商品信息
isLoading: false, // 加载状态
categoryBar: [], // 分类
storeCollected: false, // 商品收藏
storeMsg: {} // 店铺信息
storeMsg: {}, // 店铺信息
IMLink: "",
};
},
methods: {
getGoodsDetail () {
this.isLoading = true;
const params = this.$route.query
goodsSkuDetail(params).then((res) => {
this.isLoading = false;
if (res.success) {
const result = res.result;
const cateName = res.result.categoryName;
const cateId = result.data.categoryPath.split(',');
const cateArr = [];
cateId.forEach((e, index) => { // 插入分类id和name
cateArr.push({
id: e,
name: cateName[index]
});
});
console.log(cateArr);
this.categoryBar = cateArr;
this.goodsMsg = res.result;
// 判断是否收藏
if (this.Cookies.getItem('userInfo')) {
isCollection('STORE', this.goodsMsg.data.storeId).then(res => {
if (res.success && res.result) {
this.storeCollected = true;
}
})
}
// 获取店铺信息
getDetailById(this.goodsMsg.data.storeId).then(res => {
if (res.success) {
this.storeMsg = res.result
}
})
} else {
this.$Message.error(res.message)
this.$router.push('/')
}
}).catch(() => {
this.$router.push('/')
});
// 跳转im客服
IMService() {
window.open(this.IM);
},
goGoodsList (currIndex) { // 跳转商品列表
const arr = []
// 获取im信息
async getIMDetailMethods() {
let res = await getIMDetail();
if (res.success) {
this.IMLink = res.result;
}
},
// 获取商品详情
getGoodsDetail() {
this.isLoading = true;
const params = this.$route.query;
// 分销员id
let distributionId =
params && params.distributionId
? params.distributionId
: this.Cookies.getItem("distributionId");
// 如果有分销信息
if (distributionId) {
console.log(distributionId);
// 先存储
this.Cookies.setItem("distributionId", params.distributionId);
let _this = this;
// 绑定关系
getGoodsDistribution(params.distributionId).then((res) => {
// 绑定成功,则清除关系
if (res.success) {
_this.Cookies.removeItem("distributionId");
}
});
}
goodsSkuDetail(params)
.then((res) => {
this.isLoading = false;
if (res.success) {
const result = res.result;
const cateName = res.result.categoryName;
const cateId = result.data.categoryPath.split(",");
const cateArr = [];
cateId.forEach((e, index) => {
// 插入分类id和name
cateArr.push({
id: e,
name: cateName[index],
});
});
this.categoryBar = cateArr;
this.goodsMsg = res.result;
// 判断是否收藏
if (this.Cookies.getItem("userInfo")) {
isCollection("STORE", this.goodsMsg.data.storeId).then((res) => {
if (res.success && res.result) {
this.storeCollected = true;
}
});
}
// 获取店铺信息
getDetailById(this.goodsMsg.data.storeId).then((res) => {
if (res.success) {
this.storeMsg = res.result;
}
});
} else {
this.$Message.error(res.message);
this.$router.push("/");
}
})
.catch(() => {
this.$router.push("/");
});
},
goGoodsList(currIndex) {
// 跳转商品列表
const arr = [];
this.categoryBar.forEach((e, index) => {
if (index <= currIndex) {
arr.push(e.id)
arr.push(e.id);
}
})
return location.origin + '/goodsList?categoryId=' + arr.toString()
});
return location.origin + "/goodsList?categoryId=" + arr.toString();
},
async collect () { // 收藏店铺
async collect() {
// 收藏店铺
if (this.storeCollected) {
let cancel = await cancelCollect('STORE', this.goodsMsg.data.storeId)
let cancel = await cancelCollect("STORE", this.goodsMsg.data.storeId);
if (cancel.success) {
this.$Message.success('已取消收藏')
this.$Message.success("已取消收藏");
this.storeCollected = false;
}
} else {
let collect = await collectGoods('STORE', this.goodsMsg.data.storeId);
let collect = await collectGoods("STORE", this.goodsMsg.data.storeId);
if (collect.code === 200) {
this.storeCollected = true;
this.$Message.success('收藏店铺成功,可以前往个人中心我的收藏查看');
this.$Message.success("收藏店铺成功,可以前往个人中心我的收藏查看");
}
}
}
},
},
watch: {
'$route.query.skuId': function (val) {
"$route.query.skuId": function (val) {
location.reload();
}
},
},
computed: {
IM() {
return this.IMLink + this.storeMsg.merchantEuid;
},
},
components: {
Search,
ShopHeader,
ShowGoods,
ShowGoodsDetail,
ShowLikeGoods
}
},
};
</script>
<style scoped lang="scss">
@@ -151,23 +207,19 @@ export default {
color: #2c2c2c;
}
.like {
width: 100%;
padding: 20px 0;
@include white_background_color();
}
.shop-nav-container {
width: 1200px;
margin: 0 auto;
position: relative;
.store-collect {
position: absolute;
right: 20px;
top: 0;
color: #999;
span{
&:hover{
span {
&:hover {
cursor: pointer;
color: $theme_color;
}

View File

@@ -49,27 +49,50 @@
class="goods-show-info"
v-for="(item, index) in goodsList"
:key="index"
@click="goGoodsDetail(item.id, item.goodsId)"
@click="goGoodsDetail(item.id, item.content.goodsId)"
>
<div class="goods-show-img">
<img width="220" height="220" :src="item.thumbnail" />
<img width="220" height="220" :src="item.content.thumbnail" />
</div>
<div class="goods-show-price">
<span>
<span class="seckill-price text-danger">{{
item.price | unitPrice("¥")
item.content.price | unitPrice("¥")
}}</span>
</span>
</div>
<div class="goods-show-detail">
<span>{{ item.goodsName }}</span>
<span>{{ item.content.goodsName }}</span>
</div>
<div class="goods-show-num">
已有<span>{{ item.commentNum || 0 }}</span
已有<span>{{ item.content.commentNum || 0 }}</span
>人评价
</div>
<div class="goods-show-seller">
<Tag v-if="item.selfOperated" style="padding:0 4px;" size="small" color="error">自营</Tag><span>{{ item.storeName }}</span>
<Tag
class="goods-show-buyer"
v-if="item.content.selfOperated"
size="default"
color="error"
>自营
</Tag>
<div class="goods-show-right">
<div
class="goods-show-middle"
v-if="goodsListType.content.goodsType == 'VIRTUAL_GOODS'"
>
虚拟
</div>
<div
class="goods-show-middle"
v-else-if="goodsListType.content.goodsType == 'PHYSICAL_GOODS'"
>
实物
</div>
</div>
<span class="text-bottom" style="color: #e4393c">{{
item.content.storeName
}}</span>
</div>
</div>
</div>
@@ -77,6 +100,7 @@
</div>
<div class="goods-page">
<Page
show-total
show-sizer
@on-change="changePageNum"
@on-page-size-change="changePageSize"
@@ -91,124 +115,153 @@
</template>
<script>
import GoodsClassNav from '@/components/nav/GoodsClassNav';
import * as apiGoods from '@/api/goods';
import GoodsClassNav from "@/components/nav/GoodsClassNav";
import * as apiGoods from "@/api/goods";
export default {
name: 'GoodsList',
beforeRouteEnter (to, from, next) {
name: "GoodsList",
beforeRouteEnter(to, from, next) {
window.scrollTo(0, 0);
next();
},
data () {
data() {
return {
sortIndex: 0, // 排序状态
sortPriceIndex: false, // 判断价格升序还是降序
goodsTool: [ // 排序类型
{ title: '综合', en: '' },
{ title: '销量', en: 'buyCount' },
{ title: '评论数', en: 'commentNum' },
{ title: '新品', en: 'releaseTime' }
goodsTool: [
// 排序类型
{ title: "综合", en: "" },
{ title: "销量", en: "buyCount" },
{ title: "评论数", en: "commentNum" },
{ title: "新品", en: "releaseTime" },
],
goodsList: [], // 商品列表
loading: false, // 加载状态
goodsListType: "",
total: 0, // 列表总数
params: { // 请求参数
params: {
// 请求参数
pageNumber: 0,
pageSize: 20,
categoryId: ''
}
categoryId: "",
},
};
},
watch: {
$route () {
const keyword = this.$route.query.keyword
this.handleSearch(keyword)
}
$route() {
const keyword = this.$route.query.keyword;
this.handleSearch(keyword);
},
},
methods: {
handleSearch (key) {
this.params.keyword = key
this.params.pageNumber = 0
this.getGoodsList()
// 搜索
handleSearch(key) {
this.params.keyword = key;
this.params.pageNumber = 0;
this.getGoodsList();
},
orderBy (data, index) {
orderBy(data, index) {
// 排序
this.sortIndex = index;
this.params.sort = data;
this.params.order = 'desc';
if (data === 'price') {
this.params.order = "desc";
if (data === "price") {
if (!this.sortPriceIndex) {
this.sortPriceIndex = 'asc';
this.sortPriceIndex = "asc";
} else {
this.sortPriceIndex === 'desc' ? (this.sortPriceIndex = 'asc') : (this.sortPriceIndex = 'desc');
this.sortPriceIndex === "desc"
? (this.sortPriceIndex = "asc")
: (this.sortPriceIndex = "desc");
}
this.params.order = this.sortPriceIndex
this.params.order = this.sortPriceIndex;
} else {
this.sortPriceIndex = false
this.sortPriceIndex = false;
}
this.getGoodsList();
},
goGoodsDetail (skuId, goodsId) {
goGoodsDetail(skuId, goodsId) {
// 跳转商品详情
let routeUrl = this.$router.resolve({
path: '/goodsDetail',
query: { skuId, goodsId }
path: "/goodsDetail",
query: { skuId, goodsId },
});
window.open(routeUrl.href, '_blank');
window.open(routeUrl.href, "_blank");
},
changePageNum (val) {
// 分页 修改页码
changePageNum(val) {
this.params.pageNumber = val;
this.getGoodsList();
},
changePageSize (val) {
// 分页 修改页数
changePageSize(val) {
this.params.pageNumber = 1;
this.params.pageSize = val;
this.getGoodsList();
},
getGoodsList () {
// 获取商品列表
getGoodsList() {
this.loading = true;
apiGoods.goodsList(this.params)
apiGoods
.goodsList(this.params)
.then((res) => {
this.loading = false;
if (res.success) {
this.goodsList = res.result.content;
this.total = res.result.totalElements;
for (var i = 0; i < this.goodsList.length; i++) {
this.goodsListType = this.goodsList[i];
}
}
}).catch(() => {
})
.catch(() => {
this.loading = false;
});
},
getParams (val) {
getParams(val) {
// 筛选条件回显
Object.assign(this.params, val)
this.getGoodsList()
}
Object.assign(this.params, val);
this.getGoodsList();
},
},
created () {
created() {
if (this.$route.query.categoryId) {
let cateId = this.$route.query.categoryId.split(',')
Object.assign(this.params, this.$route.query)
this.params.categoryId = cateId[cateId.length - 1]
let cateId = this.$route.query.categoryId.split(",");
Object.assign(this.params, this.$route.query);
this.params.categoryId = cateId[cateId.length - 1];
} else {
Object.assign(this.params, this.$route.query)
Object.assign(this.params, this.$route.query);
}
this.getGoodsList()
this.getGoodsList();
},
mounted () {},
components: {
GoodsClassNav
}
GoodsClassNav,
},
};
</script>
<style scoped lang="scss">
@import '../assets/styles/goodsList.scss';
@import "../assets/styles/goodsList.scss";
.goods-show-info > .goods-show-seller > .goods-show-buyer {
height: 16px;
width: 30px;
white-space: nowrap;
line-height: 17px;
text-align: center;
padding: 0 3px;
background-color: #e23a3a;
}
.goods-show-seller {
// padding:3px 0;
vertical-align: middle;
}
.container {
margin: 15px auto;
width: 1200px;
min-width: 1000px;
position: relative;
}
.price-sort:hover {
color: #e23a3a;
}
.goods-box {
display: flex;
}
@@ -217,6 +270,28 @@ export default {
width: 200px;
border: 1px solid #ccc;
}
.goods-show-right {
width: 35px;
height: 17px;
// vertical-align:middle;
overflow: hidden;
margin-top: 1.5px;
margin-right: 5px;
line-height: 16px;
background: white;
border-radius: 4px;
margin-bottom: 5px;
float: left;
text-align: center;
border: 1px solid rgba(112, 123, 187, 0.8);
color: rgba(112, 123, 187, 0.8);
}
.goods-show-middle:hover {
color: rgba(2, 15, 88, 0.6);
border: 0.2px solid rgba(0, 13, 87, 0.6);
border-radius: 4px;
line-height: 18px;
}
.item-as-title {
width: 100%;
height: 36px;
@@ -231,7 +306,7 @@ export default {
float: right;
margin-right: 15px;
font-size: 10px;
color: #ccc;
color: rgb(204, 204, 204);
}
.item-as {
width: 160px;
@@ -280,6 +355,7 @@ export default {
display: block;
clear: left;
}
.price-sort {
span {
display: inline-block;

View File

@@ -3,7 +3,6 @@
<drawer></drawer>
<!-- 固定头部 -->
<hover-search class="hover-search" :class="{show: topSearchShow}"></hover-search>
<!-- 顶部广告 -->
<FixedTopPage :data="topAdvert"></FixedTopPage>
<!-- 头部 包括登录我的订单等 -->
@@ -11,7 +10,7 @@
<!-- 搜索框logo -->
<Search></Search>
<!-- 商品分类 -->
<cateNav :showAlways="true" v-if="showNav"></cateNav>
<cateNav :showAlways="true" v-if="showNav" :large="carouselLarge" :opacity="carouselOpacity"></cateNav>
<!-- 楼层装修部分 -->
<model-form ref="modelForm" :data="modelForm"></model-form>
<!-- 底部栏 -->
@@ -21,10 +20,11 @@
<script>
import Search from '@/components/Search';
import ModelForm from '@/components/indexDecorate/modelForm';
import ModelForm from '@/components/indexDecorate/ModelForm';
import HoverSearch from '@/components/header/hoverSearch';
import storage from '@/plugins/storage';
import { indexData } from '@/api/index.js';
import {seckillByDay} from '@/api/promotion'
export default {
name: 'Index',
mounted () {
@@ -44,7 +44,9 @@ export default {
modelForm: { list: [] }, // 楼层装修数据
topAdvert: {}, // 顶部广告
showNav: false, // 是否展示分类栏
topSearchShow: false // 滚动后顶部搜索栏展示
topSearchShow: false, // 滚动后顶部搜索栏展示
carouselLarge: false, // 不同轮播分类尺寸
carouselOpacity: false // 不同轮播分类样式
};
},
methods: {
@@ -53,12 +55,34 @@ export default {
indexData({ clientType: 'PC' }).then((res) => {
if (res.success) {
let dataJson = JSON.parse(res.result.pageData);
// 秒杀活动不是装修的数据,需要调用接口判断是否有秒杀商品
// 轮播图根据不同轮播,样式不同
for (let i = 0; i < dataJson.list.length; i++) {
let type = dataJson.list[i].type
if (type === 'carousel2') {
this.carouselLarge = true;
} else if (type === 'carousel1') {
this.carouselLarge = true
this.carouselOpacity = true
} else if (type === 'seckill') {
let seckill = this.getListByDay()
dataJson.list[i].options.list = seckill
}
}
this.modelForm = dataJson;
storage.setItem('navList', dataJson.list[1])
this.showNav = true
this.topAdvert = dataJson.list[0];
}
});
},
async getListByDay () { // 当天秒杀活动
const res = await seckillByDay()
if (res.success && res.result.length) {
return res.result
} else {
return []
}
}
},
components: {
@@ -73,42 +97,6 @@ export default {
.container {
@include sub_background_color($light_background_color);
}
/** 商品分类 */
.nav-con {
width: 1200px;
height: 40px;
background: #eee;
margin: 0 auto;
display: flex;
.all-categories {
width: 200px;
line-height: 40px;
color: #fff;
background-color: $theme_color;
text-align: center;
font-size: 16px;
}
.nav-item {
width: 1000px;
height: 40px;
line-height: 40px;
overflow: hidden;
list-style: none;
background-color: #eee;
display: flex;
li {
width: 50px;
font-size: 16px;
font-weight: bold;
margin-left: 15px;
color: rgb(89, 88, 88);
font-size: 15px;
&:hover {
color: $theme_color;
}
}
}
}
</style>
<style>
.hover-search {

View File

@@ -3,10 +3,7 @@
<!-- 顶部logo -->
<div class="top-content" @click='$refs.verify.show = false'>
<div class="logo-box">
<img
:src="logoImg"
@click="$router.push('/')"
/>
<img :src="$store.state.logoImg" @click="$router.push('/')" />
<div>欢迎登录</div>
</div>
</div>
@@ -16,9 +13,7 @@
<Carousel loop :autoplay-speed="5000" class="login-carousel" arrow="never">
<CarouselItem>
<div class="demo-carousel" @click='$refs.verify.show = false'>
<img
src="https://wanmi-b2b.oss-cn-shanghai.aliyuncs.com/201811141632252680"
/>
<img src="https://wanmi-b2b.oss-cn-shanghai.aliyuncs.com/201811141632252680" />
</div>
</CarouselItem>
</Carousel>
@@ -32,99 +27,65 @@
<div @click="$router.push('signUp')">立即注册</div>
</div>
<!-- 账号密码登录 -->
<Form
ref="formInline"
:model="formData"
:rules="ruleInline"
v-show="type === true"
@click.self='$refs.verify.show = false'
>
<Form ref="formInline" :model="formData" :rules="ruleInline" v-show="type === true"
@click.self='$refs.verify.show = false'>
<FormItem prop="username">
<i-input
type="text"
v-model="formData.username"
clearable
placeholder="用户名"
>
<i-input type="text" v-model="formData.username" clearable placeholder="用户名">
<Icon type="md-person" slot="prepend"></Icon>
</i-input>
</FormItem>
<FormItem prop="password">
<i-input
type="password"
v-model="formData.password"
clearable
placeholder="密码"
>
<i-input type="password" v-model="formData.password" clearable placeholder="密码">
<Icon type="md-lock" slot="prepend"> </Icon>
</i-input>
</FormItem>
<FormItem>
<Button
type="error"
@click.stop="handleSubmit('formInline')"
long
>登录</Button>
<Button type="error" @click.stop="handleSubmit('formInline')" long>登录</Button>
</FormItem>
</Form>
<!-- 验证码登录 -->
<Form
ref="formSms"
:model="formSms"
:rules="ruleInline"
v-show="type === false"
@click.self='$refs.verify.show = false'
>
<Form ref="formSms" :model="formSms" :rules="ruleInline" v-show="type === false"
@click.self='$refs.verify.show = false'>
<FormItem prop="mobile">
<i-input
type="text"
v-model="formSms.mobile"
clearable
placeholder="手机号"
>
<i-input type="text" v-model="formSms.mobile" clearable placeholder="手机号">
<Icon type="md-lock" slot="prepend"></Icon>
</i-input>
</FormItem>
<FormItem prop="code">
<i-input
type="text"
v-model="formSms.code"
placeholder="手机验证码"
>
<Icon
type="ios-text-outline"
style="font-weight: bold"
slot="prepend"
/>
<i-input type="text" v-model="formSms.code" placeholder="手机验证码">
<Icon type="ios-text-outline" style="font-weight: bold" slot="prepend" />
<Button slot="append" @click="sendCode">{{ codeMsg }}</Button>
</i-input>
</FormItem>
<FormItem>
<Button @click.stop="verifyBtnClick" long :type="verifyStatus?'success':'default'">{{verifyStatus?'验证通过':'点击完成安全验证'}}</Button>
<Button @click.stop="verifyBtnClick" long
:type="verifyStatus?'success':'default'">{{verifyStatus?'验证通过':'点击完成安全验证'}}</Button>
</FormItem>
<FormItem>
<Button
type="error"
@click="handleSubmit('formSms')"
long
>登录</Button>
<Button type="error" @click="handleSubmit('formSms')" long>登录</Button>
</FormItem>
</Form>
<div class="regist">
<span @click="$router.push('forgetPassword')">忘记密码</span>
</div>
<div class="other-login">
<Icon custom="icomoon icon-qq" color="" class="icon-hover" @click="handleWebLogin('QQ')"/>
<Icon custom="icomoon icon-wechat" color="" class="icon-hover" @click="handleWebLogin('WECHAT_PC')"/>
<svg t="1631154795933" class="icon" @click="handleWebLogin('QQ')" viewBox="0 0 1024 1024" version="1.1"
xmlns="http://www.w3.org/2000/svg" p-id="4969" width="32" height="32">
<path
d="M824.8 613.2c-16-51.4-34.4-94.6-62.7-165.3C766.5 262.2 689.3 112 511.5 112 331.7 112 256.2 265.2 261 447.9c-28.4 70.8-46.7 113.7-62.7 165.3-34 109.5-23 154.8-14.6 155.8 18 2.2 70.1-82.4 70.1-82.4 0 49 25.2 112.9 79.8 159-26.4 8.1-85.7 29.9-71.6 53.8 11.4 19.3 196.2 12.3 249.5 6.3 53.3 6 238.1 13 249.5-6.3 14.1-23.8-45.3-45.7-71.6-53.8 54.6-46.2 79.8-110.1 79.8-159 0 0 52.1 84.6 70.1 82.4 8.5-1.1 19.5-46.4-14.5-155.8z"
p-id="4970" fill="#1296db"></path>
</svg>
<svg t="1631154766336" class="icon" @click="handleWebLogin('WECHAT_PC')" viewBox="0 0 1024 1024" version="1.1"
xmlns="http://www.w3.org/2000/svg" p-id="3844" width="32" height="32">
<path
d="M683.058 364.695c11 0 22 1.016 32.943 1.976C686.564 230.064 538.896 128 370.681 128c-188.104 0.66-342.237 127.793-342.237 289.226 0 93.068 51.379 169.827 136.725 229.256L130.72 748.43l119.796-59.368c42.918 8.395 77.37 16.79 119.742 16.79 11 0 21.46-0.48 31.914-1.442a259.168 259.168 0 0 1-10.455-71.358c0.485-148.002 128.744-268.297 291.403-268.297l-0.06-0.06z m-184.113-91.992c25.99 0 42.913 16.79 42.913 42.575 0 25.188-16.923 42.579-42.913 42.579-25.45 0-51.38-16.85-51.38-42.58 0-25.784 25.93-42.574 51.38-42.574z m-239.544 85.154c-25.384 0-51.374-16.85-51.374-42.58 0-25.784 25.99-42.574 51.374-42.574 25.45 0 42.918 16.79 42.918 42.575 0 25.188-16.924 42.579-42.918 42.579z m736.155 271.655c0-135.647-136.725-246.527-290.983-246.527-162.655 0-290.918 110.88-290.918 246.527 0 136.128 128.263 246.587 290.918 246.587 33.972 0 68.423-8.395 102.818-16.85l93.809 50.973-25.93-84.677c68.907-51.93 120.286-119.815 120.286-196.033z m-385.275-42.58c-16.923 0-34.452-16.79-34.452-34.179 0-16.79 17.529-34.18 34.452-34.18 25.99 0 42.918 16.85 42.918 34.18 0 17.39-16.928 34.18-42.918 34.18z m188.165 0c-16.984 0-33.972-16.79-33.972-34.179 0-16.79 16.927-34.18 33.972-34.18 25.93 0 42.913 16.85 42.913 34.18 0 17.39-16.983 34.18-42.913 34.18z"
fill="#09BB07" p-id="3845"></path>
</svg>
</div>
</div>
<!-- 拼图验证码 -->
<verify
ref="verify"
class="verify-con"
verifyType="LOGIN"
@change="verifyChange"
></verify>
<verify ref="verify" class="verify-con" verifyType="LOGIN" @change="verifyChange"></verify>
</div>
<div class="foot">
<Row type="flex" justify="space-around" class="help">
@@ -133,66 +94,69 @@
<router-link to="/article?id=1371992704333905920" class="item" target="_blank">条款</router-link>
</Row>
<Row type="flex" justify="center" class="copyright">
Copyright © 2021 - Present
<a href="https://pickmall.cn" target="_blank" style="margin: 0 5px">lili-shop</a>
版权所有
Copyright © {{year}} - Present
<a href="https://pickmall.cn" target="_blank" style="margin: 0 5px">{{config.title}}</a>
版权所有
</Row>
</div>
</div>
</template>
<script>
import * as RegExp from '@/plugins/RegExp.js';
import { md5 } from '@/plugins/md5.js';
import * as apiLogin from '@/api/login.js';
import { sendSms } from '@/api/common.js';
import { webLogin, loginCallback } from '@/api/login.js';
import storage from '@/plugins/storage.js';
import verify from '@/components/verify';
import * as RegExp from "@/plugins/RegExp.js";
import { md5 } from "@/plugins/md5.js";
import * as apiLogin from "@/api/login.js";
import { sendSms } from "@/api/common.js";
import { webLogin, loginCallback } from "@/api/login.js";
import storage from "@/plugins/storage.js";
import verify from "@/components/verify";
export default {
name: 'Login',
name: "Login",
components: {
verify
verify,
},
data () {
data() {
return {
config:require('@/config'),
type: true, // true 账号登录 false 验证码登录
formData: {
// 登录表单
username: '',
password: ''
username: "",
password: "",
},
formSms: { // 手机号登录
code: '',
mobile: ''
formSms: {
// 手机号登录
code: "",
mobile: "",
},
verifyStatus: false, // 是否图片验证通过
ruleInline: {
// 验证规则
username: [{ required: true, message: '请输入用户名' }],
username: [{ required: true, message: "请输入用户名" }],
password: [
{ required: true, message: '请输入密码' },
{ type: 'string', min: 6, message: '密码不能少于6位' }
{ required: true, message: "请输入密码" },
{ type: "string", min: 6, message: "密码不能少于6位" },
],
mobile: [
{ required: true, message: '请输入手机号码' },
{ required: true, message: "请输入手机号码" },
{
pattern: RegExp.mobile,
message: '请输入正确的手机号'
}
message: "请输入正确的手机号",
},
],
code: [{ required: true, message: '请输入手机验证码' }]
code: [{ required: true, message: "请输入手机验证码" }],
},
codeMsg: '发送验证码', // 验证码文字
codeMsg: "发送验证码", // 验证码文字
interval: null, // 定时器
time: 60, // 倒计时
logoImg: '' // logo图片
year: new Date().getFullYear(),
};
},
methods: {
// 登录
handleSubmit (name) {
handleSubmit(name) {
this.$refs[name].validate((valid) => {
if (valid) {
if (this.type) {
@@ -202,17 +166,20 @@ export default {
apiLogin.smsLogin(data).then((res) => {
this.$refs.verify.show = false;
if (res.success) {
this.$Message.success('登录成功');
storage.setItem('accessToken', res.result.accessToken);
storage.setItem('refreshToken', res.result.refreshToken);
this.$Message.success("登录成功");
storage.setItem("accessToken", res.result.accessToken);
storage.setItem("refreshToken", res.result.refreshToken);
apiLogin.getMemberMsg().then((res) => {
if (res.success) {
storage.setItem('userInfo', res.result);
storage.setItem("userInfo", res.result);
let query = this.$route.query;
if (query.rePath) {
this.$router.push({path: query.rePath, query: JSON.parse(query.query)});
this.$router.push({
path: query.rePath,
query: JSON.parse(query.query),
});
} else {
this.$router.push('/');
this.$router.push("/");
}
}
});
@@ -221,35 +188,33 @@ export default {
}
});
}
} else {
// this.$Message.error('请填写正确的用户名或密码');
}
});
},
// 发送手机验证码
sendCode () {
sendCode() {
if (this.time === 60) {
if (this.formSms.mobile === '') {
this.$Message.warning('请先填写手机号');
if (this.formSms.mobile === "") {
this.$Message.warning("请先填写手机号");
return;
}
if (!this.verifyStatus) {
this.$Message.warning('请先完成安全验证');
this.$Message.warning("请先完成安全验证");
return;
}
let params = {
mobile: this.formSms.mobile,
verificationEnums: 'LOGIN'
verificationEnums: "LOGIN",
};
sendSms(params).then(res => {
sendSms(params).then((res) => {
if (res.success) {
this.$Message.success('验证码发送成功');
this.$Message.success("验证码发送成功");
let that = this;
this.interval = setInterval(() => {
that.time--;
if (that.time === 0) {
that.time = 60;
that.codeMsg = '重新发送';
that.codeMsg = "重新发送";
that.verifyStatus = false;
clearInterval(that.interval);
} else {
@@ -262,80 +227,91 @@ export default {
});
}
},
verifyChange (con) { // 拼图验证码回显
verifyChange(con) {
// 拼图验证码回显
if (!con.status) return;
if (this.type === true) { // 账号密码登录
if (this.type === true) {
// 账号密码登录
let data = JSON.parse(JSON.stringify(this.formData));
data.password = md5(data.password);
this.$refs.verify.show = false;
this.$Spin.show();
apiLogin.login(data).then((res) => {
if (res.success) {
this.$Message.success('登录成功');
storage.setItem('accessToken', res.result.accessToken);
storage.setItem('refreshToken', res.result.refreshToken);
apiLogin.getMemberMsg().then((res) => {
this.$Spin.hide();
if (res.success) {
storage.setItem('userInfo', res.result);
let query = this.$route.query;
if (query.rePath) {
this.$router.push({path: query.rePath, query: JSON.parse(query.query)});
} else {
this.$router.push('/');
apiLogin
.login(data)
.then((res) => {
if (res.success) {
this.$Message.success("登录成功");
storage.setItem("accessToken", res.result.accessToken);
storage.setItem("refreshToken", res.result.refreshToken);
apiLogin.getMemberMsg().then((res) => {
this.$Spin.hide();
if (res.success) {
storage.setItem("userInfo", res.result);
let query = this.$route.query;
if (query.rePath) {
this.$router.push({
path: query.rePath,
query: JSON.parse(query.query),
});
} else {
this.$router.push("/");
}
}
}
});
} else {
});
} else {
this.$Spin.hide();
this.$Message.error(res.message);
}
})
.catch(() => {
this.$Spin.hide();
this.$Message.error(res.message);
}
}).catch(() => {
this.$Spin.hide()
});
});
} else {
this.verifyStatus = true;
this.$refs.verify.show = false;
}
},
// 开启滑块验证
verifyBtnClick () {
verifyBtnClick() {
if (!this.verifyStatus) {
this.$refs.verify.init();
}
},
handleWebLogin (type) { // 第三方登录
handleWebLogin(type) {
// 第三方登录
webLogin(type);
}
},
},
mounted () {
mounted() {
let uuid = this.$route.query.state;
if (uuid) {
storage.setItem('uuid', uuid);
loginCallback(uuid).then(res => {
storage.setItem("uuid", uuid);
loginCallback(uuid).then((res) => {
if (res.success) {
const result = res.result;
storage.setItem('accessToken', result.accessToken);
storage.setItem('refreshToken', result.refreshToken);
storage.setItem("accessToken", result.accessToken);
storage.setItem("refreshToken", result.refreshToken);
apiLogin.getMemberMsg().then((res) => {
if (res.success) {
storage.setItem('userInfo', res.result);
storage.setItem("userInfo", res.result);
let query = this.$route.query;
if (query.rePath) {
this.$router.push({path: query.rePath, query: JSON.parse(query.query)});
this.$router.push({
path: query.rePath,
query: JSON.parse(query.query),
});
} else {
this.$router.push('/');
this.$router.push("/");
}
}
});
}
});
}
this.logoImg = this.Cookies.getItem('logo')
},
watch: {
type (v) {
type(v) {
if (v) {
this.$refs.formInline.resetFields();
} else {
@@ -344,10 +320,10 @@ export default {
this.verifyStatus = false;
this.$refs.verify.show = false;
clearInterval(this.interval);
this.codeMsg = '发送验证码';
this.codeMsg = "发送验证码";
this.time = 60;
}
}
},
},
};
</script>
<style scoped lang="scss">
@@ -405,30 +381,30 @@ export default {
top: 80px;
right: 15%;
padding: 20px;
background:rgba(255,255,255,.8);
.account-number{
background: rgba(255, 255, 255, 0.8);
.account-number {
display: flex;
justify-content: space-between;
align-items: baseline;
font-weight: bold;
>div:nth-child(2){
> div:nth-child(2) {
color: $theme_color;
cursor: pointer;
}
.tab-switch{
.tab-switch {
height: 40px;
font-size: 14px;
span:nth-child(1){
span:nth-child(1) {
font-size: 16px;
border-right: 1px solid #ddd;
padding-right: 10px;
}
span:nth-child(2){
span:nth-child(2) {
cursor: pointer;
padding-left: 10px;
&:hover{
&:hover {
color: $theme_color;
}
}
@@ -436,7 +412,7 @@ export default {
}
}
.verify-con{
.verify-con {
position: absolute;
right: 16%;
top: 90px;
@@ -445,8 +421,11 @@ export default {
.other-login {
margin: 0 auto;
.ivu-icon {
font-size: 24px;
> svg {
cursor: pointer;
width: 24px;
margin-right: 10px;
height: 24px;
}
}
.regist {
@@ -480,7 +459,7 @@ export default {
}
}
}
.icon-hover{
.icon-hover {
cursor: pointer;
}
</style>

View File

@@ -6,7 +6,7 @@
<!-- 店铺logo -->
<div class="shop-logo">
<div>
<img :src="storeMsg.storeLogo" height="50" alt="">
<img :src="storeMsg.storeLogo" height="80" alt="">
<div>
<p>{{storeMsg.storeName || 'xx店铺'}}</p>
<p class="ellipsis" :alt="storeMsg.storeDesc" v-html="storeMsg.storeDesc"></p>
@@ -18,10 +18,16 @@
</div>
</div>
<div class="store-category">
<ul>
<li @click="searchByCate({id:'', labelName: '店铺推荐'})">首页</li>
<li v-for="(cate, index) in cateList" :key="index" @click="searchByCate(cate)">
{{cate.labelName}}
<ul class="cate-list">
<li class="cate-item" @click="searchByCate({id:'', labelName: '店铺推荐'})">首页</li>
<li class="cate-item" v-for="(cate, index) in cateList" :key="index">
<Dropdown v-if="cate.children.length">
<div @click.self="searchByCate(cate)">{{cate.labelName}} <Icon type="ios-arrow-down"></Icon></div>
<DropdownMenu slot="list">
<DropdownItem @click.native="searchByCate(sec)" :name="sec.id" v-for="sec in cate.children" :key="sec.id">{{sec.labelName}}</DropdownItem>
</DropdownMenu>
</Dropdown>
<span v-else @click.self="searchByCate(cate)">{{cate.labelName}}</span>
</li>
</ul>
</div>
@@ -35,23 +41,23 @@
class="goods-show-info"
v-for="(item, index) in goodsList"
:key="index"
@click="goGoodsDetail(item.id, item.goodsId)"
@click="goGoodsDetail(item.content.id, item.content.goodsId)"
>
<div class="goods-show-img">
<img width="220" height="220" :src="item.thumbnail" />
<img width="220" height="220" :src="item.content.thumbnail" />
</div>
<div class="goods-show-price">
<span>
<span class="seckill-price text-danger">{{
item.price | unitPrice("¥")
item.content.price | unitPrice("¥")
}}</span>
</span>
</div>
<div class="goods-show-detail">
<span>{{ item.goodsName }}</span>
<span>{{ item.content.goodsName }}</span>
</div>
<div class="goods-show-num">
已有<span>{{ item.commentNum || 0 }}</span>人评价
已有<span>{{ item.content.commentNum || 0 }}</span>人评价
</div>
</div>
</div>
@@ -96,21 +102,19 @@ export default {
this.getCateList()
this.getGoodsList()
},
mounted () {
if (this.Cookies.getItem('userInfo')) {
isCollection('STORE', this.soterMsg.storeId).then(res => {
if (res.success && res.result) {
this.storeCollected = true;
}
})
}
},
methods: {
getStoreMsg () { // 店铺信息
getDetailById(this.$route.query.id).then(res => {
if (res.success) {
this.storeMsg = res.result
document.title = this.storeMsg.storeName
if (this.Cookies.getItem('userInfo')) {
isCollection('STORE', this.storeMsg.storeId).then(res => {
if (res.success && res.result) {
this.storeCollected = true;
}
})
}
}
})
},
@@ -148,10 +152,12 @@ export default {
this.cateName = cate.labelName
this.getGoodsList()
},
// 分页 修改页码
changePageNum (val) {
this.params.pageNumber = val;
this.getGoodsList();
},
// 分页 修改页数
changePageSize (val) {
this.params.pageNumber = 1;
this.params.pageSize = val;
@@ -193,10 +199,6 @@ export default {
margin: 0 auto;
align-items: center;
img {
width: 80px;
}
>div:nth-child(2){
margin-left: 10px;
flex: 1;
@@ -206,9 +208,6 @@ export default {
width: 200px;
}
}
img {
height: 80px;
}
p:nth-child(1) {
font-size: 20px;
}
@@ -222,20 +221,22 @@ export default {
.store-category {
background-color: #005aa0;
color: #fff;
ul{
.cate-list{
width: 1200px;
margin: 0 auto 10px;
padding: 3px 0;
display: flex;
li {
margin: 0 auto ;
clear: left;
height: 30px;
line-height: 30px;
.cate-item {
margin-right: 25px;
float: left;
}
li:hover{
.cate-item:hover{
cursor: pointer;
}
}
}
.promotion-decorate::before,.promotion-decorate::after{
background-image: url('../../static/sprite@2x.png');
background-image: url('/src/assets/images/sprite@2x.png');
}
</style>

View File

@@ -53,9 +53,6 @@ export default {
mounted () {
let detail = this.$route.query.detail;
if (detail) this.detail = detail;
},
methods: {
}
};
</script>

View File

@@ -1,10 +1,10 @@
<template>
<div class="login" @click='$refs.verify.show = false'>
<div class="sign-up" @click='$refs.verify.show = false'>
<div style="height:50px;"></div>
<div class="logo-box">
<img
width="150"
:src="logoImg"
:src="$store.state.logoImg"
@click="$router.push('/')"
/>
<div>注册</div>
@@ -88,8 +88,8 @@
<router-link to="/article?id=1371992704333905920" class="item" target="_blank">条款</router-link>
</Row>
<Row type="flex" justify="center" class="copyright">
Copyright © 2021 - Present
<a href="https://pickmall.cn" target="_blank" style="margin: 0 5px">lili-shop</a>
Copyright © {{year}} - Present
<a href="https://pickmall.cn" target="_blank" style="margin: 0 5px">{{config.title}}</a>
版权所有
</Row>
</div>
@@ -97,16 +97,19 @@
</template>
<script>
import * as RegExp from '@/plugins/RegExp.js';
import { md5 } from '@/plugins/md5.js';
import * as apiLogin from '@/api/login.js';
import { sendSms } from '@/api/common.js';
import Verify from '@/components/verify';
export default {
name: 'Login',
name: 'SignUp',
components: { Verify },
data () {
return {
config:require('@/config'),
year: new Date().getFullYear(),
formRegist: {
// 注册表单
mobilePhone: '',
@@ -135,8 +138,7 @@ export default {
verifyType: 'REGISTER', // 验证状态
codeMsg: '发送验证码', // 提示文字
interval: '', // 定时器
time: 60, // 倒计时
logoImg: '' // logo图
time: 60 // 倒计时
};
},
methods: {
@@ -157,6 +159,7 @@ export default {
} else {}
});
},
// 发送短信验证码
sendCode () {
if (this.time === 60) {
if (this.formRegist.mobilePhone === '') {
@@ -192,14 +195,13 @@ export default {
});
}
},
handleCancel () {
this.$refs.formRegist.resetFields();
},
// 图片验证码成功回调
verifyChange (con) {
if (!con.status) return;
this.$refs.verify.show = false;
this.verifyStatus = true;
},
// 打开图片验证码
verifyBtnClick () {
if (!this.verifyStatus) {
this.$refs.verify.init();
@@ -208,14 +210,11 @@ export default {
},
mounted () {
this.$refs.formRegist.resetFields();
this.logoImg = this.Cookies.getItem('logo')
},
watch: {
document.querySelector('.sign-up').style.height = window.innerHeight + 'px'
}
};
</script>
<style scoped lang="scss">
.logo-box {
width: 600px;
height: 80px;

View File

@@ -0,0 +1,88 @@
<template>
<div class="box">
<div class="wrapper">
<div class="nav" @click="back">
<img src="@/assets/images/logo2.png" alt="" class="logo" />
<div class="title">{{ detail.title }}</div>
</div>
<div v-html="detail.content"></div>
</div>
</div>
</template>
<script>
import { articleDetail } from "@/api/common.js";
const config = require("@/config/index");
export default {
data() {
return {
config,
detail: "",
};
},
mounted() {
this.init();
},
methods: {
back() {
this.$router.push("/");
},
// 初始化文章
init() {
const id = this.$route.query.id;
articleDetail(id).then((res) => {
if (res.success) {
this.detail = res.result;
}
});
},
},
};
</script>
<style lang="scss" scoped>
.logo {
max-width: 200px;
}
.box {
min-height: 100vh;
width: 1200px;
overflow: hidden;
margin: 0 auto;
padding: 32px;
}
.wrapper {
width: 1200px;
min-height: 600px;
padding: 32px;
background: #fff;
}
.nav {
text-align: center;
font-size: 21px;
font-weight: bold;
}
.title {
text-align: center;
font-size: 21px;
margin: 20px 0;
}
// iphone
@media screen and (max-width: 767px) {
.box {
min-height: 100vh;
width: 100%;
padding: 0;
margin: 0 auto;
}
.wrapper {
width: 100%;
min-height: 600px;
padding: 0 16px;
background: #fff;
}
}
</style>

View File

@@ -17,7 +17,7 @@
:open-names="openName"
@on-select="onSelect"
>
<!-- 循环导航栏 -->
<!-- 循环导航栏 -->
<Submenu
v-show="menu.children"
v-for="(menu, index) in list"
@@ -34,7 +34,6 @@
>{{ chlidren.articleCategoryName }}</MenuItem
>
</Submenu>
</Menu>
</Sider>
<Layout class="layout ml_10">

View File

@@ -1,45 +1,15 @@
<template>
<div class="wrapper">
<div class="orderBox">
<!-- <ul class="orderUl">
<li>
<div class="circle">
<Icon size="50" type="ios-card" />
</div>
<div class="info">
<Badge :count="0"> 代付款 </Badge>
</div>
</li>
<li>
<div class="circle">
<Icon size="50" type="ios-card" />
</div>
<div class="info">
<Badge :count="0"> 待收货 </Badge>
</div>
</li>
<li>
<div class="circle">
<Icon size="50" type="ios-card" />
</div>
<div class="info">
<Badge :count="0"> 待评价 </Badge>
</div>
</li>
</ul> -->
<div class="userBox">
<div class="box">
<!-- 我的订单组件 -->
<myOrderPage :paging="false" :homePage="true" />
</div>
<div class="box">
<!-- 近期收藏 -->
<myFavorites :paging="false" :homePage="true" />
</div>
<div class="box">
<!-- 猜你喜欢 -->
<!-- <myLike /> -->
</div>
<div>
<div class="userBox">
<div class="box">
<!-- 我的订单组件 -->
<myOrderPage :homePage="true" />
</div>
<div class="box">
<!-- 近期收藏 -->
<myFavorites :homePage="true" />
</div>
<div class="box">
</div>
</div>
</div>
@@ -48,7 +18,6 @@
<script>
import myOrderPage from '@/pages/home/orderCenter/MyOrder'
import myFavorites from '@/pages/home/memberCenter/Favorites'
// import myLike from '@/components/like'
export default {
name: 'main',
@@ -60,42 +29,6 @@ export default {
</script>
<style scoped lang="scss">
.circle {
width: 70px;
height: 70px;
border-radius: 50%;
overflow: hidden;
background: $success_color;
margin: 0 auto;
text-align: center;
color: #fff;
> i {
line-height: 70px;
}
}
.info {
text-align: center;
font-size: 18px;
margin: 10px 0;
}
.orderUl {
overflow: hidden;
> li {
cursor: pointer;
border-radius: 0.4em;
float: left;
padding: 10px 0;
margin: 0 11px;
width: 200px;
text-align: center;
@include background_color($light_background_color);
}
}
.userBox {
padding: 0 0 20px 0;
}

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