225 Commits
v4.2.5 ... v4.3

Author SHA1 Message Date
Chopper711
39547b542c style: 默认描述增加 2023-08-22 16:08:54 +08:00
Yer
8c9246faa4 fix: 🐛 修复商家端菜单切换之后active样式丢失问题 2023-08-16 16:29:45 +08:00
Yer
74b180f6d3 fix: 🐛 修改展示字错误 2023-08-14 15:53:44 +08:00
Yer
ac26690e78 fix: 🐛 修改部分已知的bug 2023-08-11 17:41:44 +08:00
Yer
d642e00844 fix: 🐛 修改订单详情因为发票信息可能出现的bug 2023-08-10 16:53:14 +08:00
Yer
7bbb657379 perf: 优化地区选择器代码 2023-08-10 11:29:57 +08:00
Yer
00a56473f1 fix: 🐛 优化买家端首页点击回到顶部的判断 2023-08-09 15:32:44 +08:00
Yer
e138275c0a fix: 📝 补充提交 2023-08-09 14:57:35 +08:00
Yer
9e7a1b3ee3 feat: 商家端新增楼层数据保存到本地功能 2023-08-09 14:56:57 +08:00
Yer
c5e06ad1f2 feat: 新增管理端楼层装修保存到本地功能 2023-08-09 14:42:23 +08:00
Yer
128ad892d1 feat: 买家端使用最新地址选择器,默认在config关闭高德地图功能,开启后可继续使用 2023-08-03 16:36:41 +08:00
Yer
552b4c605d feat: 地图选择器 2023-08-03 10:38:07 +08:00
Yer
8b33dbe8d7 feat: 管理端使用最新地址选择器,默认在config关闭高德地图功能,开启后可继续使用 2023-08-03 10:37:53 +08:00
Yer
8a43335b75 feat: 商家端使用最新地址选择器,默认在config关闭高德地图功能,开启后可继续使用 2023-08-02 10:53:14 +08:00
“Yer”
a4d17102f1 style: 💄 修改文章页面红线突兀样式 2023-07-31 17:48:30 +08:00
Yer
d02d0adb39 fix: 🐛 修改PC首页跳转bug 2023-07-28 17:11:19 +08:00
Yer
c86cecf4f0 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2023-07-25 10:10:22 +08:00
Yer
7bc5d67efc feat: 商家端新增redirect登录功能 2023-07-25 10:10:20 +08:00
misworga831
d058d7d6e8 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2023-07-24 15:11:03 +08:00
misworga831
914fa0a324 fix: 优化统计数据文本展示 2023-07-24 15:10:52 +08:00
Yer
4389911436 买家端展示视频判断 2023-07-24 14:26:07 +08:00
Yer
841d48e2a7 style: 🐛 修改几个console警告问题 2023-07-21 11:17:40 +08:00
Yer
b6c16e7048 提交优化一个小问题 2023-07-20 18:10:16 +08:00
Yer
9fce33ca18 买家端新增视频播放功能 2023-07-20 16:50:43 +08:00
Yer
6a653198c3 商家端新增上传视频功能 2023-07-19 14:08:32 +08:00
Yer
2c8e34008f 轮播图 string类型改成 number类型 要不然有警告 2023-07-14 13:45:00 +08:00
Yer
6feb650f06 优化Buyer端展示 2023-07-14 13:42:35 +08:00
Yer
873764b59e feat: 管理端添加多标签Tab页内嵌模式设置 2023-07-14 09:19:52 +08:00
Yer
36ef331b94 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2023-07-13 17:24:03 +08:00
Yer
308619fbdd feat: buyer端新增 平台/店铺切换搜索,管理端意见按照时间反馈排序展示 2023-07-13 17:24:00 +08:00
pikachu1995@126.com
6dec218e81 删除无用的配置项 2023-07-13 16:00:09 +08:00
Yer
f9717eb7ac 微信消息订阅模板 描述文字更换 订阅 改成 初始化 2023-07-11 17:10:54 +08:00
Chopper711
cb10bd97a0 店铺编辑管理端排版处理 2023-07-11 15:35:25 +08:00
Yer
430894eb69 删除管理端中 物流公司中需要填写的电子表单 2023-07-11 15:07:10 +08:00
Yer
34cb3b4a29 style: 💄 优化PC首页展示以及店铺中搜索商品未携带id问题 2023-07-11 11:45:29 +08:00
Yer
b89f81e5d6 fix: 🐛 修复日志管理中开发人员操作时间展示问题 2023-07-10 10:13:38 +08:00
Yer
604bdcaf77 fix: 🐛 修改日志模块中操作时间展示问题 2023-07-10 09:49:14 +08:00
Yer
a46cd8ee97 优化最新pc首页展示的问题 ,删除秒杀活动默认展示以及轮播图新增自动滚动 2023-07-07 09:21:07 +08:00
Yer
7e14569479 补充提交 2023-07-06 17:23:46 +08:00
Yer
3c296ea011 feat: 新增楼层装修 更改部分买家端UI 2023-07-06 17:21:38 +08:00
Yer
8529641145 优化了部分展示功能 2023-07-06 16:21:25 +08:00
Yer
b133502062 补充提交 2023-07-06 15:37:59 +08:00
Yer
5470253626 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2023-07-06 11:44:17 +08:00
Yer
6b697f9ecd feat: 新增多标签Tab页内嵌模式 2023-07-06 11:44:15 +08:00
pikachu1995@126.com
44558d9072 运营后台-售后列表,售后状态展示优化 2023-07-05 11:42:25 +08:00
pikachu1995@126.com
8dbd5429f0 运营后台-订单列表,订单状态展示优化 2023-07-05 11:11:39 +08:00
Yer
3c83179579 feat: 管理端新增格式化价格文件插件并在代码中引入,更新代码需要install插件 2023-07-04 10:24:21 +08:00
Yer
bf70527c58 feat: 商家端新增格式化价格文件插件并在代码中引入,更新代码需要install插件 2023-07-03 16:28:58 +08:00
Yer
26a539662e fix: 🐛 修改在买家端商品详情中因为categoryName为空导致页面出错不展示bug 2023-06-16 10:58:06 +08:00
mahe
48f2bd82a1 修改热区无法跳转专题问题 2023-06-15 09:44:46 +08:00
mahe
73c2654cc5 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2023-06-09 17:42:16 +08:00
mahe
49dfd644a2 修改优惠券展示问题 2023-06-09 17:39:59 +08:00
chc
09ce16dc95 IM携带商品信息 2023-06-01 10:10:51 +08:00
Chopper711
5b58d1de5e fix:之前的部分售后逻辑补足,不过代码判定存在问题,需要未来进行优化 2023-05-31 15:04:46 +08:00
Yer
775b339c17 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2023-05-26 16:54:29 +08:00
Yer
1ef8dd26cf fix: 🐛 修改店铺详情bug 2023-05-26 16:54:26 +08:00
yeliang-king
b36be16f38 会员修改刷新列表 2023-05-16 17:10:48 +08:00
Yer
1c765f37cf feat: 新增pc端 商品下架功能 2023-05-10 13:51:24 +08:00
Yer
724922dddc Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2023-05-09 11:42:44 +08:00
Yer
9dece4dd2c fix: 🐛 修复规格列表中,第一次新增规格点击编辑不回显问题 2023-05-09 11:42:41 +08:00
mahe
4a628acd37 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2023-05-09 11:05:49 +08:00
mahe
5c3501f08d 优化系统设置中的警告 2023-05-09 11:05:40 +08:00
misworga831
ad09b38ed5 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2023-05-08 18:42:09 +08:00
misworga831
c60a54b8f9 fix: 修复满减活动没有传递范围参数 2023-05-08 18:41:56 +08:00
Chopper711
056386e8e9 fix:用户端提现状态展示问题处理 2023-05-06 16:34:33 +08:00
Chopper711
8ad79b8728 fix: 兼容提现失败前端的展示 2023-05-06 16:23:29 +08:00
Chopper711
a78374910f fix: 兼容提现失败前端的展示 2023-05-06 16:23:27 +08:00
mahe
4318e8d0da 修改店铺装修选择链接问题 2023-05-06 16:07:30 +08:00
mahe
4ace1a9cca 增加店铺楼层装修图片热区功能 2023-05-06 15:57:34 +08:00
chc
7ded1c564e 类型保存问题 2023-04-26 11:02:24 +08:00
chc
28d68bdca6 去除电子面单必填校验 2023-04-25 10:40:31 +08:00
9181befdf9 秒杀增加card,满额详情不展示操作列 2023-04-23 10:23:32 +08:00
87b3cbe344 满额活动增加card样式 2023-04-23 09:33:16 +08:00
Yer
8b0ca5ba7e Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2023-04-21 17:36:05 +08:00
Yer
b30be8efb2 优化商城端可以重复搜索内容 2023-04-21 17:36:02 +08:00
Yer
2213f0d0ce 新版楼层装修样式修改以及链接修改 2023-04-21 17:25:16 +08:00
夜良king
0883a967b6 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2023-04-19 10:34:43 +08:00
夜良king
c8e8685586 删除多余的文字 2023-04-19 10:34:32 +08:00
73ce45aff9 虚拟订单展示物流bug 2023-04-17 17:41:16 +08:00
e954cf4d92 订单详情重复展示问题 2023-04-17 11:31:52 +08:00
d1a974f6b0 规格列表,编辑不回显问题 2023-04-17 10:13:29 +08:00
39f7f1ed38 修改规格列表多余提示 2023-04-17 09:29:26 +08:00
lemon橪
5380cf9ba9 Merge remote-tracking branch 'refs/remotes/origin/master' 2023-04-15 09:37:13 +08:00
lemon橪
6e9ca81b58 fix: 🐛 修改系统设置oss设置表单校验不通过问题 2023-04-15 09:36:36 +08:00
学习很差啦
531ed5b2dd Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui into dev-feature 2023-04-12 11:07:47 +08:00
学习很差啦
ebc79da0fc feat: 对原有填写金额的input框进行改进,优化部分样式问题 2023-04-12 11:06:25 +08:00
学习很差啦
1cbafbce25 最新楼层装修模块 2023-04-07 16:47:27 +08:00
学习很差啦
816d842a57 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui into dev-feature 2023-04-07 10:12:01 +08:00
misworga831
e5c25895a0 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2023-04-04 15:15:09 +08:00
misworga831
1abc7a5a52 fix: 适配新获取商品返回结果 2023-04-04 15:14:41 +08:00
学习很差啦
170244cc9c style: 修改部分页面中展示细节,分销订单中新增状态展示,统计模块优化代码,热词模块 历史热词默认展示昨天热词,以及优化热词统计 2023-04-03 14:22:07 +08:00
学习很差啦
3498de4529 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2023-03-31 18:16:37 +08:00
学习很差啦
16b0d457fc style: 新增部分代码注释 页面新增部分提示 2023-03-31 18:16:33 +08:00
misworga831
87b6ddbaa6 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2023-03-31 17:14:29 +08:00
misworga831
2f6e50cc1c fix: 适配新获取商品返回结果 2023-03-31 17:14:22 +08:00
Chopper711
aa196918bf update README.md.
Signed-off-by: Chopper711 <1814994716@qq.com>
2023-03-31 07:23:51 +00:00
学习很差啦
5958353383 楼层装修新增内容 2023-03-31 15:22:38 +08:00
lemon橪
f37f633f51 新增部分楼层 2023-03-29 14:05:31 +08:00
chc
8c286610ba 待自提状态 2023-03-29 10:06:59 +08:00
chc
d2540733dc fix: 电子面单参数显示错误 2023-03-28 17:00:19 +08:00
chc
ab56bdfcad 规格问题 2023-03-27 19:45:53 +08:00
Chopper711
803eae5c7d style:按钮空格 2023-03-23 16:44:28 +08:00
学习很差啦
6b3892e17d 楼层装修新特征 2023-03-22 16:22:10 +08:00
学习很差啦
500afcc33f 楼层装修新特征 2023-03-22 16:22:01 +08:00
pikachu1995@126.com
64c61d5365 Merge branch 'master' into Bulbasaur 2023-03-22 08:43:05 +08:00
chc
bf58711c88 -fix APP版本时间问题,微信消息修改时间问题 2023-03-15 19:41:08 +08:00
学习很差啦
48b3e3246c Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2023-03-15 10:44:05 +08:00
学习很差啦
8f629db5ab feat: 新增全局Input表单默认最大输入值,开放config全局配置 2023-03-15 10:44:02 +08:00
Chopper711
1ca94d289a fix: 关闭优惠券按钮状态判定未判定新活动状态导致新活动点击关闭按钮无效 2023-03-15 10:19:03 +08:00
17600048398
3159c325e3 商品分类移除多余字符 2023-03-14 11:18:17 +08:00
17600048398
b51040c73e 物流管理-关闭物流传参错误问题, 2023-03-14 09:10:18 +08:00
17600048398
f4ddeaa5c5 前端问题处理 2023-03-09 18:16:10 +08:00
misworga831
8599708af3 Increase payment support and update parameters
- Improved payment system with WeChat and AliPay support
- Increased minimum recharge amount to `1`
- Added maximum of `9` characters for the recharge amount
- Added minimum withdraw amount setting
- Added real name field for AliPay
- Added third-party login field for AliPay
- Added maxlength of `9` characters for the withdraw amount
- Added a span tag to append '元' to the recharge amount
- Added a new function `with

[buyer/src/pages/home/userCenter/MoneyManagement.vue]
- Raise the minimum recharge amount to `1`
- Allow for a maximum of `9` characters for the recharge amount
- Added support for WeChat and AliPay
- Added a minimum withdraw amount setting
- Added a real name field for AliPay
- Added a third-party login field for AliPay
- Added maxlength of `9` characters for the withdraw amount
- Added a span tag to append '元' to the recharge amount
- Fixed typo
[buyer/src/api/pay.js]
- Add a new function `withdrawalSettingVO` for payment result inquiry
- Change the parameters for `payCallback` function
2023-03-08 21:58:29 +08:00
pikachu1995@126.com
72fb11d3d3 Merge branch 'master' into Bulbasaur 2023-03-08 18:42:17 +08:00
chc
7d0b3c6908 feat: 商家端增加修改密码,手机号登录 2023-03-08 10:25:23 +08:00
chc
f7a9bff2ba feat: 集成顺丰平台,发货,查询物流,打印面单 2023-03-06 18:00:11 +08:00
chc
4fd419fcfe Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2023-03-02 17:55:47 +08:00
chc
f72c28d770 fix: 🐛 关闭物流公司传递参数错误,css /deep/拼写错误 2023-03-02 17:55:36 +08:00
pikachu1995@126.com
7c775f7692 增加提现设置内容:提现方式、最低提现金额、微信提现应用ID 2023-03-02 06:52:15 +08:00
学习很差啦
ac0404adaa 补充提交im ws-socket中发现的问题 2023-03-01 17:51:43 +08:00
学习很差啦
40ccbf3edb fix: 🐛 买家端buyer im传值优化 2023-03-01 15:25:00 +08:00
学习很差啦
2aa7b67b7a Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2023-03-01 14:59:57 +08:00
学习很差啦
4700bc995a feat: 优化im 接口403判定,新增从买家端以及卖家端进行跳转im权限判定,新增im掉线重连以及重连成功提醒,新增发送的消息断线将会进行重新发送消息提示,优化最近浏览 订单列表空展示。注释部分im打印的日志信息 2023-03-01 14:59:54 +08:00
Chopper711
7052fa7420 !31 修复添加源时默认切换源类型不正确问题
Merge pull request !31 from Jimi/master
2023-02-28 03:32:00 +00:00
Jimi
08c62e5c9c fix:修复添加源时默认切换源类型不正确问题 2023-02-28 09:21:41 +08:00
学习很差啦
32b29f45e7 修改直播价格展示信息错误 2023-02-21 14:25:32 +08:00
学习很差啦
49d023cef0 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2023-02-17 11:28:29 +08:00
学习很差啦
674c2352ef feat: 新增im接口权限失效判定,优化买家显示样式以及卖家样式。 2023-02-17 11:28:26 +08:00
pikachu1995@126.com
96156508b5 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2023-02-16 18:16:17 +08:00
pikachu1995@126.com
802f13e6e5 存储新增:腾讯云、华为云
短信新增:腾讯云、华为云
物流新增:快递100
2023-02-16 18:15:39 +08:00
学习很差啦
5d24dda4c1 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2023-02-16 16:28:25 +08:00
学习很差啦
2207d11c7c 修改入驻电话校验 2023-02-16 16:28:24 +08:00
495096c779 im跳转问题 2023-02-16 15:57:18 +08:00
9375ba9e31 im金额格式化 2023-02-13 09:24:30 +08:00
42a24d854b im路径跳转 2023-02-09 16:34:01 +08:00
cc31b6232f im聊天发送中文问题 2023-02-09 15:59:08 +08:00
092873592d Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2023-02-09 15:14:05 +08:00
70757e8adf IM商家端不显示问题 2023-02-09 15:13:55 +08:00
Chopper711
b1fb019b01 update README.md.
Signed-off-by: Chopper711 <1814994716@qq.com>
2023-02-09 03:21:07 +00:00
15386982806
ed4f78bf6a 用户PC端,我的订单,根据订单号搜索框展示不全问题修改 2023-02-08 18:18:09 +08:00
chc
826ba41866 自提地址最下方显示问题 2023-02-03 17:26:49 +08:00
mahe
4886b53847 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2023-02-03 10:22:13 +08:00
mahe
56d6401cda 调整im样式,过滤数据 2023-02-03 10:22:06 +08:00
夜良king
36794613cd Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2023-02-03 10:06:50 +08:00
夜良king
cfd2529caf 修改错别字 2023-02-03 10:06:22 +08:00
chc
f0628c5995 失效商品导致页面不展示 2023-02-02 18:04:49 +08:00
chc
4780ae5b18 核销自提订单 2023-02-02 17:06:32 +08:00
chc
5a93abb946 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2023-02-01 15:03:51 +08:00
chc
d371fd0146 IM功能 2023-02-01 15:03:40 +08:00
misworga831
c850a27cca fix: 🐛 修复规格值为空后,规格错乱问题 2023-02-01 10:18:38 +08:00
chc
a97ed0c3f6 接口问题修改 2023-01-31 17:42:36 +08:00
15386982806
3c65de9912 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2023-01-31 17:07:36 +08:00
15386982806
c6e1cc060a 重置用户密码 2023-01-31 17:07:28 +08:00
chc
9df377677b 开启面单按钮问题 2023-01-19 17:26:31 +08:00
chc
69caf86c7e 下载问题 2023-01-19 17:25:07 +08:00
15386982806
c86d863f1d 修改积分商品回显问题 2023-01-18 11:28:46 +08:00
c130597e95 im商家接口问题 2023-01-13 18:16:14 +08:00
5d16a7a80e 转换表情 2023-01-13 10:53:39 +08:00
bad9f9109c im当前浏览发送问题 2023-01-12 17:10:34 +08:00
7e33598b8e 宽度,表情 2023-01-12 14:34:38 +08:00
lemon橪
83f145767e refactor: 修改config API_DEV为线上掩饰站点api 2023-01-12 11:07:25 +08:00
8ea3843d61 足迹 2023-01-11 18:24:18 +08:00
paulGao
29cc6002cd Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2023-01-11 11:29:34 +08:00
paulGao
db33b34f18 feat: 增加优惠券领取详情和优化pc端跳转使用优惠券页面 2023-01-11 11:28:28 +08:00
73acb0bc09 跳转样式问题 2023-01-10 18:44:39 +08:00
夜良king
94ab061cc8 config 修改 2023-01-10 18:32:26 +08:00
夜良king
4f243afb63 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2023-01-10 18:27:52 +08:00
夜良king
efd3ed26df 自动发券模块(管理端加前端展示) 2023-01-10 18:27:37 +08:00
Chopper711
e7d1664673 Merge branch 'lili_self' 2023-01-09 18:47:48 +08:00
夜良king
7b7310ed75 优惠券详情 2023-01-06 10:33:10 +08:00
夜良king
c8649caf1a 商家端 规格修改 2023-01-05 10:43:37 +08:00
aaa2deef85 pc发布商品不显示IM 2022-12-30 18:40:50 +08:00
夜良king
b0ed6635e5 修改发布商品模块 商品描述 请求数据删除 2022-12-30 17:24:41 +08:00
0dc3124bba 订单列表发送 2022-12-29 18:20:06 +08:00
1135c1fbc3 滚动加载样式 2022-12-28 18:32:48 +08:00
779f6e4fa1 滚动加载样式 2022-12-28 18:31:26 +08:00
chc
f4bf4dc060 展示问题 2022-12-28 18:23:23 +08:00
84d3dd247d 滚动请求 2022-12-28 14:54:57 +08:00
61c44af5a0 ds 2022-12-28 11:25:40 +08:00
e8b7a85140 聊天 2022-12-28 11:23:46 +08:00
chc
aa4dbc1bbd 商品信息展示修改 2022-12-28 11:22:54 +08:00
3881370b6e IM 2022-12-28 10:08:51 +08:00
0fa93d545e 删除IM文件夹 2022-12-28 10:08:18 +08:00
chc
a92c213b64 IM功能 2022-12-28 09:22:05 +08:00
lemon橪
fcc9a9f8c5 fix: 🐛 解决秒杀商品中分页错误,以及删除看到的冗余代码 2022-12-26 18:03:09 +08:00
夜良king
0ffd0f0c29 goolist 虚拟/实物展示问题 2022-12-26 11:48:10 +08:00
夜良king
3afad96b8f 楼层 选择链接模板修改 2022-12-23 15:31:59 +08:00
chc
d9e1a4a491 站点图标与logo分开添加与展示 2022-12-22 15:17:13 +08:00
chc
2e4246e63b 手机号搜索消失 2022-12-19 10:19:06 +08:00
Chopper711
235d582ae2 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-ui 2022-12-07 17:01:28 +08:00
c34e2ad6ad 楼层代码注释 2022-12-07 17:00:37 +08:00
Chopper711
78b8a002e9 楼层装修问题处理 2022-12-07 16:58:51 +08:00
夜良king
29091739d4 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2022-12-07 10:45:25 +08:00
夜良king
aa05ee1165 去除店铺结算已审核 2022-12-07 10:45:12 +08:00
学习很差啦
2446c28b20 补充提交api地址错误问题 2022-12-07 10:42:47 +08:00
学习很差啦
8378182730 解决合并冲突 2022-12-07 10:37:24 +08:00
学习很差啦
d84250ab88 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2022-12-07 10:36:17 +08:00
学习很差啦
5218388eff 删除富文本中不用的插件,新增商品上传提示 2022-12-07 10:36:15 +08:00
夜良king
984bc4b635 去除 店铺 申请中状态 2022-12-07 09:58:31 +08:00
paulGao
acc9a0b88a 补全缺失接口 2022-12-06 16:42:32 +08:00
paulGao
a31c7a5ad0 fix: 修复移动端楼层装修外部链接没有地方填写问题 2022-12-06 16:32:29 +08:00
paulGao
f0882793e4 fix: 🐛 优化批发商品,起批量提示 2022-11-29 15:00:45 +08:00
paulGao
053e5ce062 fix: 🐛 优化批发商品购买数量不能低于起批量 2022-11-29 11:40:37 +08:00
mahe
34ef7e555a 修改优惠券的宽度,浏览记录分页与评论超出问题 2022-11-28 09:51:47 +08:00
chc
34165127f0 im 2022-11-23 18:43:53 +08:00
学习很差啦
4d347df505 fix: 🐛 修改 商家端楼层装中 intro 和 mobileIntro 可能存在转义符导致json出错问题 2022-11-23 14:44:46 +08:00
chc
830154371a 自提 2022-11-22 17:17:37 +08:00
学习很差啦
69c2c4c5c2 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2022-11-22 15:17:14 +08:00
学习很差啦
a5d067943d fix: 🐛 商家端楼层装修选择图片问题修改,以及删除商家端搜索模块 2022-11-22 15:17:09 +08:00
Chopper711
1e190e3a88 update LICENSE.
Signed-off-by: Chopper711 <1814994716@qq.com>
2022-11-21 03:23:34 +00:00
paulGao
b042bd6052 增加可链接外部页面 2022-11-18 10:13:28 +08:00
chc
3861881996 行高问题 2022-10-28 11:27:21 +08:00
chc
405bb4a216 Merge remote-tracking branch 'origin/master' 2022-10-28 09:44:47 +08:00
chc
c382f015f4 移动装修分页无效和pc装修分页样式 2022-10-28 09:44:24 +08:00
夜良king
c083a58f30 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-ui 2022-10-26 16:34:46 +08:00
夜良king
a78d637468 楼层装修 2022-10-26 16:34:34 +08:00
paulGao
0cb32caa3e 优化秒杀页面样式问题 2022-10-26 15:42:08 +08:00
8095aa0d8e 登陆页header footer 警告 2022-10-26 11:13:43 +08:00
chc
60117f51b3 商家跳转404 2022-10-26 08:57:31 +08:00
chc
b51a5e6deb 店铺 2022-10-25 19:22:52 +08:00
chc
b9869053c2 wapList 2022-10-25 18:50:54 +08:00
chc
f1753babbe 跳转问题 2022-10-25 18:35:48 +08:00
chc
05f8defe56 配置文件 2022-10-25 17:32:49 +08:00
chc
af115c45cc 配置文件 2022-10-25 17:32:09 +08:00
学习很差啦
532fc8b2dd fix: 🐛 修改演示站点多展示专题问题 2022-10-24 11:10:33 +08:00
470 changed files with 32980 additions and 6031 deletions

143
LICENSE
View File

@@ -1,5 +1,5 @@
GNU GENERAL PUBLIC LICENSE GNU AFFERO GENERAL PUBLIC LICENSE
Version 3, 29 June 2007 Version 3, 19 November 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies Everyone is permitted to copy and distribute verbatim copies
@@ -7,17 +7,15 @@
Preamble Preamble
The GNU General Public License is a free, copyleft license for The GNU Affero General Public License is a free, copyleft license for
software and other kinds of works. software and other kinds of works, specifically designed to ensure
cooperation with the community in the case of network server software.
The licenses for most software and other practical works are designed The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast, to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to our General Public Licenses are intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the software for all its users.
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you price. Our General Public Licenses are designed to make sure that you
@@ -26,44 +24,34 @@ them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things. free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you Developers that use our General Public Licenses protect your rights
these rights or asking you to surrender the rights. Therefore, you have with two steps: (1) assert copyright on the software, and (2) offer
certain responsibilities if you distribute copies of the software, or if you this License which gives you legal permission to copy, distribute
you modify it: responsibilities to respect the freedom of others. and/or modify the software.
For example, if you distribute copies of such a program, whether A secondary benefit of defending all users' freedom is that
gratis or for a fee, you must pass on to the recipients the same improvements made in alternate versions of the program, if they
freedoms that you received. You must make sure that they, too, receive receive widespread use, become available for other developers to
or can get the source code. And you must show them these terms so they incorporate. Many developers of free software are heartened and
know their rights. encouraged by the resulting cooperation. However, in the case of
software used on network servers, this result may fail to come about.
The GNU General Public License permits making a modified version and
letting the public access it on a server without ever releasing its
source code to the public.
Developers that use the GNU GPL protect your rights with two steps: The GNU Affero General Public License is designed specifically to
(1) assert copyright on the software, and (2) offer you this License ensure that, in such cases, the modified source code becomes available
giving you legal permission to copy, distribute and/or modify it. to the community. It requires the operator of a network server to
provide the source code of the modified version running there to the
users of that server. Therefore, public use of a modified version, on
a publicly accessible server, gives the public access to the source
code of the modified version.
For the developers' and authors' protection, the GPL clearly explains An older license, called the Affero General Public License and
that there is no warranty for this free software. For both users' and published by Affero, was designed to accomplish similar goals. This is
authors' sake, the GPL requires that modified versions be marked as a different license, not a version of the Affero GPL, but Affero has
changed, so that their problems will not be attributed erroneously to released a new version of the Affero GPL which permits relicensing under
authors of previous versions. this license.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and The precise terms and conditions for copying, distribution and
modification follow. modification follow.
@@ -72,7 +60,7 @@ modification follow.
0. Definitions. 0. Definitions.
"This License" refers to version 3 of the GNU General Public License. "This License" refers to version 3 of the GNU Affero General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of "Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks. works, such as semiconductor masks.
@@ -549,35 +537,45 @@ to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program. License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License. 13. Remote Network Interaction; Use with the GNU General Public License.
Notwithstanding any other provision of this License, if you modify the
Program, your modified version must prominently offer all users
interacting with it remotely through a computer network (if your version
supports such interaction) an opportunity to receive the Corresponding
Source of your version by providing access to the Corresponding Source
from a network server at no charge, through some standard or customary
means of facilitating copying of software. This Corresponding Source
shall include the Corresponding Source for any work covered by version 3
of the GNU General Public License that is incorporated pursuant to the
following paragraph.
Notwithstanding any other provision of this License, you have Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single under version 3 of the GNU General Public License into a single
combined work, and to convey the resulting work. The terms of this combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work, License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License, but the work with which it is combined will remain governed by version
section 13, concerning interaction through a network will apply to the 3 of the GNU General Public License.
combination as such.
14. Revised Versions of this License. 14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will the GNU Affero General Public License from time to time. Such new versions
be similar in spirit to the present version, but may differ in detail to will be similar in spirit to the present version, but may differ in detail to
address new problems or concerns. address new problems or concerns.
Each version is given a distinguishing version number. If the Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General Program specifies that a certain numbered version of the GNU Affero General
Public License "or any later version" applies to it, you have the Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published GNU Affero General Public License, you may choose any version ever published
by the Free Software Foundation. by the Free Software Foundation.
If the Program specifies that a proxy can decide which future If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's versions of the GNU Affero General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you public statement of acceptance of a version permanently authorizes you
to choose that version for the Program. to choose that version for the Program.
@@ -635,40 +633,29 @@ the "copyright" line and a pointer to where the full notice is found.
Copyright (C) <year> <name of author> Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU Affero General Public License as published
the Free Software Foundation, either version 3 of the License, or by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU Affero General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail. Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short If your software can interact with users remotely through a computer
notice like this when it starts in an interactive mode: network, you should also make sure that it provides a way for users to
get its source. For example, if your program is a web application, its
<program> Copyright (C) <year> <name of author> interface could display a "Source" link that leads users to an archive
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. of the code. There are many ways you could offer source, and different
This is free software, and you are welcome to redistribute it solutions will be better for different programs; see section 13 for the
under certain conditions; type `show c' for details. specific requirements.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school, You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary. if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see For more information on this, and how to apply and follow the GNU AGPL, see
<http://www.gnu.org/licenses/>. <http://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.

View File

@@ -2,23 +2,19 @@
#### 欢迎交流需求,交流业务,交流技术(基础问题自行解决,其他问题先看文档后提问) #### 欢迎交流需求,交流业务,交流技术(基础问题自行解决,其他问题先看文档后提问)
#### 不用削尖脑袋往老群里加,老群活跃度较低,很多潜水党,新群相对而言活跃一些 :tw-1f606: :tw-1f606: :tw-1f606: :tw-1f606: :tw-1f606: :tw-1f606:
#### PS **演示站点所有环境均部署master分支。如果有演示站点问题可以反馈如果演示站点没问题本地运行有问题需自行处理**
##### 交流 qq 1群 961316482已满 ##### 交流 qq 1群 961316482已满
<a target="_blank" href="https://qm.qq.com/cgi-bin/qm/qr?k=BAhURE3DG2YWhQk6kRxVapbLykqMoPS8&jump_from=webapi"><img border="0" src="https://pub.idqqimg.com/wpa/images/group.png" alt="Lilishop交流群" title="Lilishop交流群">点击快捷加群</a>
##### 交流 qq 2群 875294241已满 ##### 交流 qq 2群 875294241已满
##### 交流 qq 3群 263785057已满
<a target="_blank" href="https://qm.qq.com/cgi-bin/qm/qr?k=_lrekOvr5k2p5uTn5GRidI-chKEmpCX3&jump_from=webapi"><img border="0" src="https://pub.idqqimg.com/wpa/images/group.png" alt="Lilishop交流群2群" title="Lilishop交流群2群">点击快捷加群</a> ##### 交流 qq 4群 674617534 (已满)
##### 交流 qq 5群 594675235
##### 交流 qq 3群 263785057
<a target="_blank" href="https://qm.qq.com/cgi-bin/qm/qr?k=VUogkDvaso4zLTFH8nxFPDRKq0EthUn1&jump_from=webapi"><img border="0" src="//pub.idqqimg.com/wpa/images/group.png" alt="Lilishop交流群3群" title="Lilishop交流群3群">点击快捷加群</a>
##### 体验 公众号/小程序/APP 体验,扫描二维码 ##### 体验 公众号/小程序/APP 体验,扫描二维码
![image-20210511171611793](https://pickmall.cn/assets/imgs/h5-qrcode.png) ![image-20210511171611793](https://static.pickmall.cn/images/h5-qrcode.png)
[![star](https://gitee.com/beijing_hongye_huicheng/lilishop/badge/star.svg?theme=dark)](https://gitee.com/beijing_hongye_huicheng/lilishop/stargazers) [![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) &nbsp;&nbsp;![github](https://img.shields.io/github/stars/hongyehuicheng/lilishop.svg?style=social&logo=#181717)
@@ -60,7 +56,7 @@ PS手机验证码为 111111
**商城 小程序/公众号/APP**:扫描二维码 **商城 小程序/公众号/APP**:扫描二维码
![image-20210511171611793](https://pickmall.cn/assets/imgs/h5-qrcode.png) ![image-20210511171611793](https://static.pickmall.cn/images/h5-qrcode.png)
### 快速本地部署 ### 快速本地部署
@@ -79,24 +75,24 @@ PS手机验证码为 111111
#### 平台管理端功能 #### 平台管理端功能
![平台管理端功能](https://pickmall.cn/assets/imgs/other/managerList1.jpg) ![平台管理端功能](https://static.pickmall.cn/images/other/managerList1.jpg)
#### 卖家功能 #### 卖家功能
![商家端功能](https://pickmall.cn/assets/imgs/other/storeList.jpg) ![商家端功能](https://static.pickmall.cn/images/other/storeList.jpg)
### 商城前端功能展示 ### 商城前端功能展示
#### 商城移动端 #### 商城移动端
<img src="https://pickmall.cn/assets/imgs/other/app.gif" alt="移动端功能展示" style="zoom:50%;" /> <img src="https://static.pickmall.cn/images/other/app.gif" alt="移动端功能展示" style="zoom:50%;" />
#### 平台管理端 #### 平台管理端
![管理端功能展示](https://pickmall.cn/assets/imgs/other/manager.gif) ![管理端功能展示](https://static.pickmall.cn/images/other/manager.gif)
### 技术选型 ### 技术选型
@@ -166,6 +162,15 @@ PS手机验证码为 111111
### 交流群 ### 交流群
##### 官方qq 1群 961316482已满 ##### 交流 qq 1群 961316482已满
##### 官方qq 2群 875294241已满 ##### 交流 qq 2群 875294241已满
##### 官网qq 3群 263785057 ##### 交流 qq 3群 263785057(已满)
##### 交流 qq 4群 674617534已满
##### 交流 qq 5群 594675235
### 附录
有人有自己的学习视频、学习记录文档、希望宣传关联开源项目等均可以私聊仓库所有者。
类似:
清晨敲代码同学的分析: https://blog.csdn.net/vaevaevae233/category_12103567.html

374
buyer/package-lock.json generated
View File

@@ -13,7 +13,6 @@
"version": "7.14.5", "version": "7.14.5",
"resolved": "https://registry.nlark.com/@babel/code-frame/download/@babel/code-frame-7.14.5.tgz?cache=0&sync_timestamp=1623280639364&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fcode-frame%2Fdownload%2F%40babel%2Fcode-frame-7.14.5.tgz", "resolved": "https://registry.nlark.com/@babel/code-frame/download/@babel/code-frame-7.14.5.tgz?cache=0&sync_timestamp=1623280639364&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fcode-frame%2Fdownload%2F%40babel%2Fcode-frame-7.14.5.tgz",
"integrity": "sha1-I7CNdA6D9JxeWZRfvxtD6Au/Tts=", "integrity": "sha1-I7CNdA6D9JxeWZRfvxtD6Au/Tts=",
"dev": true,
"requires": { "requires": {
"@babel/highlight": "^7.14.5" "@babel/highlight": "^7.14.5"
} }
@@ -21,14 +20,12 @@
"@babel/helper-validator-identifier": { "@babel/helper-validator-identifier": {
"version": "7.14.9", "version": "7.14.9",
"resolved": "https://registry.nlark.com/@babel/helper-validator-identifier/download/@babel/helper-validator-identifier-7.14.9.tgz?cache=0&sync_timestamp=1627804495811&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-validator-identifier%2Fdownload%2F%40babel%2Fhelper-validator-identifier-7.14.9.tgz", "resolved": "https://registry.nlark.com/@babel/helper-validator-identifier/download/@babel/helper-validator-identifier-7.14.9.tgz?cache=0&sync_timestamp=1627804495811&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-validator-identifier%2Fdownload%2F%40babel%2Fhelper-validator-identifier-7.14.9.tgz",
"integrity": "sha1-ZlTRcbICT22O4VG/JQlpmRkTHUg=", "integrity": "sha1-ZlTRcbICT22O4VG/JQlpmRkTHUg="
"dev": true
}, },
"@babel/highlight": { "@babel/highlight": {
"version": "7.14.5", "version": "7.14.5",
"resolved": "https://registry.nlark.com/@babel/highlight/download/@babel/highlight-7.14.5.tgz?cache=0&sync_timestamp=1623280657819&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhighlight%2Fdownload%2F%40babel%2Fhighlight-7.14.5.tgz", "resolved": "https://registry.nlark.com/@babel/highlight/download/@babel/highlight-7.14.5.tgz?cache=0&sync_timestamp=1623280657819&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhighlight%2Fdownload%2F%40babel%2Fhighlight-7.14.5.tgz",
"integrity": "sha1-aGGlLwOWZAUAH2qlNKAaJNmejNk=", "integrity": "sha1-aGGlLwOWZAUAH2qlNKAaJNmejNk=",
"dev": true,
"requires": { "requires": {
"@babel/helper-validator-identifier": "^7.14.5", "@babel/helper-validator-identifier": "^7.14.5",
"chalk": "^2.0.0", "chalk": "^2.0.0",
@@ -295,6 +292,11 @@
"integrity": "sha1-0zV0eaD9/dWQf+Z+F+CoXJBuEwE=", "integrity": "sha1-0zV0eaD9/dWQf+Z+F+CoXJBuEwE=",
"dev": true "dev": true
}, },
"@types/parse-json": {
"version": "4.0.0",
"resolved": "https://registry.npmmirror.com/@types/parse-json/-/parse-json-4.0.0.tgz",
"integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA=="
},
"@types/q": { "@types/q": {
"version": "1.5.5", "version": "1.5.5",
"resolved": "https://registry.nlark.com/@types/q/download/@types/q-1.5.5.tgz", "resolved": "https://registry.nlark.com/@types/q/download/@types/q-1.5.5.tgz",
@@ -460,6 +462,7 @@
"minimist": "^1.2.5", "minimist": "^1.2.5",
"pnp-webpack-plugin": "^1.6.4", "pnp-webpack-plugin": "^1.6.4",
"portfinder": "^1.0.26", "portfinder": "^1.0.26",
"postcss-loader": "^3.0.0",
"ssri": "^8.0.1", "ssri": "^8.0.1",
"terser-webpack-plugin": "^1.4.4", "terser-webpack-plugin": "^1.4.4",
"thread-loader": "^2.1.3", "thread-loader": "^2.1.3",
@@ -472,6 +475,139 @@
"webpack-chain": "^6.4.0", "webpack-chain": "^6.4.0",
"webpack-dev-server": "^3.11.0", "webpack-dev-server": "^3.11.0",
"webpack-merge": "^4.2.2" "webpack-merge": "^4.2.2"
},
"dependencies": {
"ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"optional": true,
"requires": {
"color-convert": "^2.0.1"
}
},
"chalk": {
"version": "4.1.2",
"resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"dev": true,
"optional": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
}
},
"color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"optional": true,
"requires": {
"color-name": "~1.1.4"
}
},
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true,
"optional": true
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true,
"optional": true
},
"json5": {
"version": "2.2.2",
"resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.2.tgz",
"integrity": "sha512-46Tk9JiOL2z7ytNQWFLpj99RZkVgeHf87yGQKsIkaPz1qSH9UczKH1rO7K3wgRselo0tYMUNfecYpm/p1vC7tQ==",
"dev": true,
"optional": true
},
"loader-utils": {
"version": "2.0.4",
"resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.4.tgz",
"integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
"dev": true,
"optional": true,
"requires": {
"big.js": "^5.2.2",
"emojis-list": "^3.0.0",
"json5": "^2.1.2"
}
},
"postcss-loader": {
"version": "3.0.0",
"resolved": "https://registry.npmmirror.com/postcss-loader/-/postcss-loader-3.0.0.tgz",
"integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==",
"dev": true,
"requires": {
"loader-utils": "^1.1.0",
"postcss": "^7.0.0",
"postcss-load-config": "^2.0.0",
"schema-utils": "^1.0.0"
},
"dependencies": {
"json5": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/json5/-/json5-1.0.1.tgz",
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
"dev": true,
"requires": {
"minimist": "^1.2.0"
}
},
"loader-utils": {
"version": "1.4.0",
"resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-1.4.0.tgz",
"integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
"dev": true,
"requires": {
"big.js": "^5.2.2",
"emojis-list": "^3.0.0",
"json5": "^1.0.1"
}
}
}
},
"schema-utils": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-1.0.0.tgz",
"integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
"dev": true,
"requires": {
"ajv": "^6.1.0",
"ajv-errors": "^1.0.0",
"ajv-keywords": "^3.1.0"
}
},
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"optional": true,
"requires": {
"has-flag": "^4.0.0"
}
},
"vue-loader-v16": {
"version": "npm:vue-loader@16.8.3",
"resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-16.8.3.tgz",
"integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
"dev": true,
"optional": true,
"requires": {
"chalk": "^4.1.0",
"hash-sum": "^2.0.0",
"loader-utils": "^2.0.0"
}
}
} }
}, },
"@vue/cli-shared-utils": { "@vue/cli-shared-utils": {
@@ -1687,7 +1823,6 @@
"version": "2.4.2", "version": "2.4.2",
"resolved": "https://registry.nlark.com/chalk/download/chalk-2.4.2.tgz?cache=0&sync_timestamp=1627646734234&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fchalk%2Fdownload%2Fchalk-2.4.2.tgz", "resolved": "https://registry.nlark.com/chalk/download/chalk-2.4.2.tgz?cache=0&sync_timestamp=1627646734234&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fchalk%2Fdownload%2Fchalk-2.4.2.tgz",
"integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=",
"dev": true,
"requires": { "requires": {
"ansi-styles": "^3.2.1", "ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5", "escape-string-regexp": "^1.0.5",
@@ -1698,7 +1833,6 @@
"version": "5.5.0", "version": "5.5.0",
"resolved": "https://registry.nlark.com/supports-color/download/supports-color-5.5.0.tgz?cache=0&sync_timestamp=1626703400240&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsupports-color%2Fdownload%2Fsupports-color-5.5.0.tgz", "resolved": "https://registry.nlark.com/supports-color/download/supports-color-5.5.0.tgz?cache=0&sync_timestamp=1626703400240&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fsupports-color%2Fdownload%2Fsupports-color-5.5.0.tgz",
"integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=",
"dev": true,
"requires": { "requires": {
"has-flag": "^3.0.0" "has-flag": "^3.0.0"
} }
@@ -4382,8 +4516,7 @@
"has-flag": { "has-flag": {
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.nlark.com/has-flag/download/has-flag-3.0.0.tgz?cache=0&sync_timestamp=1626715907927&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fhas-flag%2Fdownload%2Fhas-flag-3.0.0.tgz", "resolved": "https://registry.nlark.com/has-flag/download/has-flag-3.0.0.tgz?cache=0&sync_timestamp=1626715907927&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fhas-flag%2Fdownload%2Fhas-flag-3.0.0.tgz",
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
"dev": true
}, },
"has-symbols": { "has-symbols": {
"version": "1.0.2", "version": "1.0.2",
@@ -4819,6 +4952,15 @@
"integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==",
"optional": true "optional": true
}, },
"import-cwd": {
"version": "2.1.0",
"resolved": "https://registry.npmmirror.com/import-cwd/-/import-cwd-2.1.0.tgz",
"integrity": "sha512-Ew5AZzJQFqrOV5BTW3EIoHAnoie1LojZLXKcCQ/yTRyVZosBhK1x1ViYjHGf5pAFOq8ZyChZp6m/fSN7pJyZtg==",
"dev": true,
"requires": {
"import-from": "^2.1.0"
}
},
"import-fresh": { "import-fresh": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npm.taobao.org/import-fresh/download/import-fresh-2.0.0.tgz?cache=0&sync_timestamp=1608469532269&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fimport-fresh%2Fdownload%2Fimport-fresh-2.0.0.tgz", "resolved": "https://registry.npm.taobao.org/import-fresh/download/import-fresh-2.0.0.tgz?cache=0&sync_timestamp=1608469532269&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fimport-fresh%2Fdownload%2Fimport-fresh-2.0.0.tgz",
@@ -4829,6 +4971,15 @@
"resolve-from": "^3.0.0" "resolve-from": "^3.0.0"
} }
}, },
"import-from": {
"version": "2.1.0",
"resolved": "https://registry.npmmirror.com/import-from/-/import-from-2.1.0.tgz",
"integrity": "sha512-0vdnLL2wSGnhlRmzHJAg5JHjt1l2vYhzJ7tNLGbeVg0fse56tpGaH0uzH+r9Slej+BSXXEHvBKDEnVSLLE9/+w==",
"dev": true,
"requires": {
"resolve-from": "^3.0.0"
}
},
"import-local": { "import-local": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npm.taobao.org/import-local/download/import-local-2.0.0.tgz", "resolved": "https://registry.npm.taobao.org/import-local/download/import-local-2.0.0.tgz",
@@ -5360,8 +5511,7 @@
"js-tokens": { "js-tokens": {
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.nlark.com/js-tokens/download/js-tokens-4.0.0.tgz", "resolved": "https://registry.nlark.com/js-tokens/download/js-tokens-4.0.0.tgz",
"integrity": "sha1-GSA/tZmR35jjoocFDUZHzerzJJk=", "integrity": "sha1-GSA/tZmR35jjoocFDUZHzerzJJk="
"dev": true
}, },
"js-yaml": { "js-yaml": {
"version": "3.14.1", "version": "3.14.1",
@@ -5387,8 +5537,7 @@
"json-parse-even-better-errors": { "json-parse-even-better-errors": {
"version": "2.3.1", "version": "2.3.1",
"resolved": "https://registry.npm.taobao.org/json-parse-even-better-errors/download/json-parse-even-better-errors-2.3.1.tgz", "resolved": "https://registry.npm.taobao.org/json-parse-even-better-errors/download/json-parse-even-better-errors-2.3.1.tgz",
"integrity": "sha1-fEeAWpQxmSjgV3dAXcEuH3pO4C0=", "integrity": "sha1-fEeAWpQxmSjgV3dAXcEuH3pO4C0="
"dev": true
}, },
"json-schema": { "json-schema": {
"version": "0.2.3", "version": "0.2.3",
@@ -5465,6 +5614,11 @@
"resolved": "https://registry.nlark.com/kind-of/download/kind-of-6.0.3.tgz", "resolved": "https://registry.nlark.com/kind-of/download/kind-of-6.0.3.tgz",
"integrity": "sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0=" "integrity": "sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0="
}, },
"klona": {
"version": "2.0.5",
"resolved": "https://registry.npmmirror.com/klona/-/klona-2.0.5.tgz",
"integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ=="
},
"launch-editor": { "launch-editor": {
"version": "2.2.1", "version": "2.2.1",
"resolved": "https://registry.npm.taobao.org/launch-editor/download/launch-editor-2.2.1.tgz", "resolved": "https://registry.npm.taobao.org/launch-editor/download/launch-editor-2.2.1.tgz",
@@ -5662,8 +5816,7 @@
"lines-and-columns": { "lines-and-columns": {
"version": "1.1.6", "version": "1.1.6",
"resolved": "https://registry.npm.taobao.org/lines-and-columns/download/lines-and-columns-1.1.6.tgz", "resolved": "https://registry.npm.taobao.org/lines-and-columns/download/lines-and-columns-1.1.6.tgz",
"integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA="
"dev": true
}, },
"load-json-file": { "load-json-file": {
"version": "1.1.0", "version": "1.1.0",
@@ -6810,6 +6963,21 @@
"no-case": "^2.2.0" "no-case": "^2.2.0"
} }
}, },
"parent-module": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz",
"integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
"requires": {
"callsites": "^3.0.0"
},
"dependencies": {
"callsites": {
"version": "3.1.0",
"resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz",
"integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="
}
}
},
"parse-asn1": { "parse-asn1": {
"version": "5.1.6", "version": "5.1.6",
"resolved": "https://registry.npm.taobao.org/parse-asn1/download/parse-asn1-5.1.6.tgz", "resolved": "https://registry.npm.taobao.org/parse-asn1/download/parse-asn1-5.1.6.tgz",
@@ -7121,6 +7289,91 @@
"postcss": "^7.0.0" "postcss": "^7.0.0"
} }
}, },
"postcss-load-config": {
"version": "2.1.2",
"resolved": "https://registry.npmmirror.com/postcss-load-config/-/postcss-load-config-2.1.2.tgz",
"integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==",
"dev": true,
"requires": {
"cosmiconfig": "^5.0.0",
"import-cwd": "^2.0.0"
}
},
"postcss-loader": {
"version": "7.0.1",
"resolved": "https://registry.npmmirror.com/postcss-loader/-/postcss-loader-7.0.1.tgz",
"integrity": "sha512-VRviFEyYlLjctSM93gAZtcJJ/iSkPZ79zWbN/1fSH+NisBByEiVLqpdVDrPLVSi8DX0oJo12kL/GppTBdKVXiQ==",
"requires": {
"cosmiconfig": "^7.0.0",
"klona": "^2.0.5",
"semver": "^7.3.7"
},
"dependencies": {
"cosmiconfig": {
"version": "7.0.1",
"resolved": "https://registry.npmmirror.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz",
"integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==",
"requires": {
"@types/parse-json": "^4.0.0",
"import-fresh": "^3.2.1",
"parse-json": "^5.0.0",
"path-type": "^4.0.0",
"yaml": "^1.10.0"
}
},
"import-fresh": {
"version": "3.3.0",
"resolved": "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.0.tgz",
"integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
"requires": {
"parent-module": "^1.0.0",
"resolve-from": "^4.0.0"
}
},
"lru-cache": {
"version": "6.0.0",
"resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz",
"integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
"requires": {
"yallist": "^4.0.0"
}
},
"parse-json": {
"version": "5.2.0",
"resolved": "https://registry.npmmirror.com/parse-json/-/parse-json-5.2.0.tgz",
"integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
"requires": {
"@babel/code-frame": "^7.0.0",
"error-ex": "^1.3.1",
"json-parse-even-better-errors": "^2.3.0",
"lines-and-columns": "^1.1.6"
}
},
"path-type": {
"version": "4.0.0",
"resolved": "https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz",
"integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="
},
"resolve-from": {
"version": "4.0.0",
"resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz",
"integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="
},
"semver": {
"version": "7.3.8",
"resolved": "https://registry.npmmirror.com/semver/-/semver-7.3.8.tgz",
"integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
"requires": {
"lru-cache": "^6.0.0"
}
},
"yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz",
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
}
}
},
"postcss-merge-longhand": { "postcss-merge-longhand": {
"version": "4.0.11", "version": "4.0.11",
"resolved": "https://registry.nlark.com/postcss-merge-longhand/download/postcss-merge-longhand-4.0.11.tgz", "resolved": "https://registry.nlark.com/postcss-merge-longhand/download/postcss-merge-longhand-4.0.11.tgz",
@@ -10025,94 +10278,6 @@
} }
} }
}, },
"vue-loader-v16": {
"version": "npm:vue-loader@16.8.3",
"resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-16.8.3.tgz",
"integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
"dev": true,
"optional": true,
"requires": {
"chalk": "^4.1.0",
"hash-sum": "^2.0.0",
"loader-utils": "^2.0.0"
},
"dependencies": {
"ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"optional": true,
"requires": {
"color-convert": "^2.0.1"
}
},
"chalk": {
"version": "4.1.2",
"resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"dev": true,
"optional": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
}
},
"color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"optional": true,
"requires": {
"color-name": "~1.1.4"
}
},
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true,
"optional": true
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true,
"optional": true
},
"json5": {
"version": "2.2.1",
"resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.1.tgz",
"integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==",
"dev": true,
"optional": true
},
"loader-utils": {
"version": "2.0.3",
"resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.3.tgz",
"integrity": "sha512-THWqIsn8QRnvLl0shHYVBN9syumU8pYWEHPTmkiVGd+7K5eFNVSY6AJhRvgGF70gg1Dz+l/k8WicvFCxdEs60A==",
"dev": true,
"optional": true,
"requires": {
"big.js": "^5.2.2",
"emojis-list": "^3.0.0",
"json5": "^2.1.2"
}
},
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"optional": true,
"requires": {
"has-flag": "^4.0.0"
}
}
}
},
"vue-piczoom": { "vue-piczoom": {
"version": "1.0.6", "version": "1.0.6",
"resolved": "https://registry.npmmirror.com/vue-piczoom/-/vue-piczoom-1.0.6.tgz", "resolved": "https://registry.npmmirror.com/vue-piczoom/-/vue-piczoom-1.0.6.tgz",
@@ -11285,6 +11450,11 @@
"integrity": "sha1-27fa+b/YusmrRev2ArjLrQ1dCP0=", "integrity": "sha1-27fa+b/YusmrRev2ArjLrQ1dCP0=",
"dev": true "dev": true
}, },
"yaml": {
"version": "1.10.2",
"resolved": "https://registry.npmmirror.com/yaml/-/yaml-1.10.2.tgz",
"integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="
},
"yargs": { "yargs": {
"version": "16.2.0", "version": "16.2.0",
"resolved": "https://registry.nlark.com/yargs/download/yargs-16.2.0.tgz?cache=0&sync_timestamp=1628889089720&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fyargs%2Fdownload%2Fyargs-16.2.0.tgz", "resolved": "https://registry.nlark.com/yargs/download/yargs-16.2.0.tgz?cache=0&sync_timestamp=1628889089720&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fyargs%2Fdownload%2Fyargs-16.2.0.tgz",

View File

@@ -10,11 +10,13 @@
"dependencies": { "dependencies": {
"@amap/amap-jsapi-loader": "0.0.7", "@amap/amap-jsapi-loader": "0.0.7",
"axios": "^0.19.2", "axios": "^0.19.2",
"dplayer": "^1.27.1",
"js-cookie": "^2.2.1", "js-cookie": "^2.2.1",
"less": "^2.7.0", "less": "^2.7.0",
"less-loader": "^5.0.0", "less-loader": "^5.0.0",
"mv-count-down": "^0.1.15", "mv-count-down": "^0.1.15",
"node-sass": "^4.14.1", "node-sass": "^4.14.1",
"postcss-loader": "^7.0.1",
"psl": "^1.8.0", "psl": "^1.8.0",
"qs": "^6.9.4", "qs": "^6.9.4",
"sass-loader": "^7.3.1", "sass-loader": "^7.3.1",

View File

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

View File

@@ -3,6 +3,7 @@
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name='description' content='在线购物平台'>
<meta name="viewport" content="width=device-width,initial-scale=1.0"> <meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>logo.ico"> <link rel="icon" href="<%= BASE_URL %>logo.ico">
<title><%= htmlWebpackPlugin.options.title %></title> <title><%= htmlWebpackPlugin.options.title %></title>
@@ -16,7 +17,7 @@
<% } %> <% } %>
<script src="/config.js"></script> <script src="/config.js"></script>
<noscript> <noscript>
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong> <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript> </noscript>
<div id="app"></div> <div id="app"></div>

View File

@@ -26,7 +26,7 @@ export default {
//动态获取icon //动态获取icon
let link =document.querySelector("link[rel*='icon']") ||document.createElement("link"); let link =document.querySelector("link[rel*='icon']") ||document.createElement("link");
link.type = "image/x-icon"; link.type = "image/x-icon";
link.href = storage.getItem("logoImg"); link.href = storage.getItem("siteIcon");
link.rel = "shortcut icon"; link.rel = "shortcut icon";
document.getElementsByTagName("head")[0].appendChild(link); document.getElementsByTagName("head")[0].appendChild(link);
} }
@@ -45,12 +45,12 @@ export default {
// 存放信息 // 存放信息
storage.setItem('siteName', data.siteName); storage.setItem('siteName', data.siteName);
storage.setItem('logoImg', data.buyerSideLogo); storage.setItem('logoImg', data.buyerSideLogo);
storage.setItem("siteIcon",data.buyerSideIcon);
window.document.title = data.siteName; window.document.title = data.siteName;
//动态获取icon //动态获取icon
let link =document.querySelector("link[rel*='icon']") ||document.createElement("link"); let link =document.querySelector("link[rel*='icon']") ||document.createElement("link");
link.type = "image/x-icon"; link.type = "image/x-icon";
link.href = data.buyerSideLogo; link.href = data.buyerSideIcon;
link.rel = "shortcut icon"; link.rel = "shortcut icon";
document.getElementsByTagName("head")[0].appendChild(link); document.getElementsByTagName("head")[0].appendChild(link);
} }

View File

@@ -212,3 +212,52 @@ export function receiptSelect (params) {
params params
}); });
} }
/**
* 获取全部配送方式
*/
export function shippingMethodList(params) {
return request({
url: `/buyer/trade/carts/shippingMethodList`,
method: Method.GET,
needToken: true,
params: params,
});
}
/**
* 获取全部配送方式
*/
export function storeAddressList(params) {
return request({
url: `/buyer/store/address/shippingMethodList`,
method: Method.GET,
needToken: true,
params: params,
});
}
/**
* 设置自提地址ID
* @param addressId
*/
export function setStoreAddressId(storeAddressId,way) {
return request({
url: `/buyer/trade/carts/storeAddress?storeAddressId=${storeAddressId}&way=${way}`,
method: Method.GET,
needToken: true,
});
}
/**
* 提交配送方式
* @param params
*/
export function setShipMethod(params) {
return request({
url: "/buyer/trade/carts/shippingMethod",
method: Method.PUT,
needToken: true,
params,
});
}

View File

@@ -10,6 +10,15 @@ export function indexData(params) {
}); });
} }
// 获取自动发券
export function getAutoCoup(){
return request({
url: "/buyer/promotion/coupon/activity",
method: Method.GET,
needToken: true,
});
}
/** /**
* 获取店铺楼层数据 * 获取店铺楼层数据
*/ */

View File

@@ -59,7 +59,7 @@ export function withdrawalApply (params) {
}); });
} }
// 收藏商品、店铺 // 收藏商品
export function collectGoods (type, id) { export function collectGoods (type, id) {
return request({ return request({
url: `/buyer/member/collection/add/${type}/${id}`, url: `/buyer/member/collection/add/${type}/${id}`,
@@ -68,7 +68,16 @@ export function collectGoods (type, id) {
}); });
} }
// 取消 收藏商品、店铺 // 收藏店铺
export function collectStore (type, id) {
return request({
url: `/buyer/member/storeCollection/add/${type}/${id}`,
method: Method.POST,
needToken: true
});
}
// 取消 收藏商品
export function cancelCollect (type, id) { export function cancelCollect (type, id) {
return request({ return request({
url: `/buyer/member/collection/delete/${type}/${id}`, url: `/buyer/member/collection/delete/${type}/${id}`,
@@ -77,7 +86,16 @@ export function cancelCollect (type, id) {
}); });
} }
// 查看是否收藏 // 取消 收藏店铺
export function cancelStoreCollect (type, id) {
return request({
url: `/buyer/member/storeCollection/delete/${type}/${id}`,
method: Method.DELETE,
needToken: true
});
}
// 查看是否收藏商品
export function isCollection (type, goodsId) { export function isCollection (type, goodsId) {
return request({ return request({
url: `/buyer/member/collection/isCollection/${type}/${goodsId}`, url: `/buyer/member/collection/isCollection/${type}/${goodsId}`,
@@ -86,7 +104,16 @@ export function isCollection (type, goodsId) {
}); });
} }
// 会员收藏列表 // 查看是否收藏店铺
export function isStoreCollection (type, goodsId) {
return request({
url: `/buyer/member/storeCollection/isCollection/${type}/${goodsId}`,
method: Method.GET,
needToken: true
});
}
// 会员收藏商品列表
export function collectList (params) { export function collectList (params) {
return request({ return request({
url: `/buyer/member/collection/${params.type}`, url: `/buyer/member/collection/${params.type}`,
@@ -96,6 +123,16 @@ export function collectList (params) {
}); });
} }
// 会员收藏店铺列表
export function storeCollectList (params) {
return request({
url: `/buyer/member/storeCollection/${params.type}`,
method: Method.GET,
needToken: true,
params
});
}
// 单个商品评价 // 单个商品评价
export function goodsComment (params) { export function goodsComment (params) {
return request({ return request({

View File

@@ -46,3 +46,17 @@ export function payCallback (params) {
params params
}); });
} }
/**
* 支付结果查询
* @param orderType 交易类型,可用值:TRADE,ORDER,RECHARGE
* @param sn 订单编号
*/
export function withdrawalSettingVO (params) {
return request({
url: `/buyer/wallet/wallet/withdrawalSettingVO`,
needToken: true,
method: Method.GET,
params
});
}

View File

@@ -75,3 +75,15 @@ export function applyStatus () {
method: Method.GET method: Method.GET
}) })
} }
/**
* 获取自提点信息
* @param storeId
*/
export function getStoreAddress(storeId,params) {
return request({
url: `/buyer/store/address/page/${storeId}`,
method: Method.GET,
params
});
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 682 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg width="24" height="24" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M24 44C35.0457 44 44 35.0457 44 24C44 12.9543 35.0457 4 24 4C12.9543 4 4 12.9543 4 24C4 35.0457 12.9543 44 24 44Z" fill="none" stroke="#333" stroke-width="4" stroke-linejoin="round"/><path d="M20 24V17.0718L26 20.5359L32 24L26 27.4641L20 30.9282V24Z" fill="none" stroke="#333" stroke-width="4" stroke-linejoin="round"/></svg>

After

Width:  |  Height:  |  Size: 468 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View File

@@ -10,20 +10,28 @@ $warning_color: #ff9900;
$error_color: #ed3f14; $error_color: #ed3f14;
$handle-btn-color: #438cde; $handle-btn-color: #438cde;
$theme_color: #e4393c; $theme_color: #F31947;
$border_color: #dddee1; $border_color: #dddee1;
$title_color: #8c8c8c; $title_color: #8c8c8c;
$light_title_color: #1c2438; $light_title_color: #1c2438;
$light_content_color: #495060; $light_content_color: #495060;
$light_sub_color: #80848f; $light_sub_color: #80848f;
$light_background_color: #f8f8f9; $light_background_color: #F5F5F7;
$light_white_background_color: #fff; $light_white_background_color: #fff;
// 暗黑主题颜色 // 暗黑主题颜色
$dark_background_color: #141414; $dark_background_color: #141414;
$dark_sub_background_color: #1d1d1d; //稍微浅一点的 $dark_sub_background_color: #1d1d1d; //稍微浅一点的
$dark_content_color: #d5d5d5; $dark_content_color: #d5d5d5;
.wes-2 {
/* 适用于webkit内核和移动端 */
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
overflow: hidden;
}
/***** 封装一些方法可用于 黑暗主题 ,明亮主题 *****/ /***** 封装一些方法可用于 黑暗主题 ,明亮主题 *****/
// 背景颜色 // 背景颜色
@@ -170,6 +178,19 @@ $dark_content_color: #d5d5d5;
margin-right: 20px; margin-right: 20px;
} }
.mb_24 {
margin-bottom: 24px;
}
.mt_24 {
margin-top: 24px;
}
.ml_24 {
margin-left: 24px;
}
.mr_24 {
margin-right: 24px;
}
.mb_10 { .mb_10 {
margin-bottom: 10px; margin-bottom: 10px;
} }
@@ -270,10 +291,24 @@ li {
left: auto; left: auto;
} }
} }
.flex{
display: flex;
}
.flex-a-c{
align-items: center;
}
.flex-j-sb{
justify-content: space-between;
}
.flex-j-c{
justify-content: center;
}
.width_1200_auto {
width: 1184px;
margin: 0 auto;
}

View File

@@ -1,6 +1,6 @@
<template> <template>
<div> <div class="navbar" :class="{'small-search-box':useClass == 'fixed-show'}">
<div class="container"> <div class="container width_1200_auto flex flex-a-c">
<img <img
:src="$store.state.logoImg" :src="$store.state.logoImg"
v-if="showLogo" v-if="showLogo"
@@ -8,38 +8,45 @@
alt="" alt=""
@click="$router.push('/')" @click="$router.push('/')"
/> />
<i-input <div :class="{'small-search-box':useClass == 'fixed-show'}" class="search-box">
v-model="searchData" <i-input
size="large" v-model="searchData"
class="search" size="large"
placeholder="输入你想查找的商品" class="search "
@keyup.enter.native="search" placeholder="输入你想查找的商品"
> @keyup.enter.native="search"
<Button v-if="!store" slot="append" @click="search">搜索</Button> >
</i-input>
<div v-if="store" class="btn-div"> <div class="search-icon" slot="append" @click="search">
<Button class="store-search" type="warning" @click="searchStore">搜本店</Button> <Icon type="ios-search" size="21"/>
<Button class="store-search" type="primary" @click="search">搜全站</Button> </div>
</i-input>
<template v-if="showTag">
<div class="only-store" v-if="storeId" @click="research()">
切换为{{!onlyStore ? '店铺内' : '平台'}}搜索
</div>
<div v-if="promotionTags.length === 0"></div>
<div v-else class="history-list flex">
<div
v-for="(item, index) in promotionTags"
:key="index"
class="mr_10"
>
<span class="history-item" @click="selectTags(item)">{{ item }}</span>
</div>
</div>
</template>
</div> </div>
<template v-if="showTag">
<div style="height:12px" v-if="promotionTags.length === 0"></div>
<div v-else>
<Tag
v-for="(item, index) in promotionTags"
:key="index"
class="mr_10"
>
<span class="hover-color" @click="selectTags(item)">{{ item }}</span>
</Tag>
</div>
</template>
</div> </div>
</div> </div>
</template> </template>
<script> <script>
import storage from '@/plugins/storage.js' import storage from '@/plugins/storage.js'
import {hotWords} from '@/api/goods.js' import {hotWords} from '@/api/goods.js'
export default { export default {
name: 'search', name: 'search',
props: { props: {
@@ -51,37 +58,59 @@ export default {
type: Boolean, type: Boolean,
default: true default: true
}, },
store: { // 是否为店铺页面 storeId: { // 是否为店铺页面
type: Boolean, type: String,
default: false default: ""
}, },
hover: { hover: {
type: Boolean, type: Boolean,
default: false default: false
},
useClass:{
type:null,
default:''
} }
}, },
data () { watch:{
storeId(val){
this.onlyStore = val ? true : false
}
},
data() {
return { return {
searchData: '' // 搜索内容 searchData: '', // 搜索内容
onlyStore:false,
}; };
}, },
methods: { methods: {
selectTags (item) { // 选择热门标签 selectTags(item) { // 选择热门标签
this.searchData = item; this.searchData = item;
this.search(); this.search();
}, },
search () { // 全平台搜索商品 research(){
this.$router.push({ this.onlyStore = !this.onlyStore
path: '/goodsList',
query: { keyword: this.searchData }
});
}, },
searchStore () { // 店铺搜索商品 search () { // 全平台搜索商品
const url = this.$route.path;
if(url == '/goodsList'){
this.$emit('search', this.searchData)
}else{
const pushData = {
path:'/goodsList',
query: { keyword: this.searchData },
}
if(this.storeId && this.onlyStore) pushData.query.storeId = this.storeId
this.$router.push(pushData);
}
},
searchStore() { // 店铺搜索商品
this.$emit('search', this.searchData) this.$emit('search', this.searchData)
} }
}, },
computed: { computed: {
promotionTags () { promotionTags() {
if (this.$store.state.hotWordsList) { if (this.$store.state.hotWordsList) {
return JSON.parse(this.$store.state.hotWordsList) return JSON.parse(this.$store.state.hotWordsList)
} else { } else {
@@ -89,8 +118,9 @@ export default {
} }
} }
}, },
created () { created() {
this.searchData = this.$route.query.keyword this.searchData = this.$route.query.keyword
if (!this.hover) { // 首页顶部固定搜索栏不调用热词接口 if (!this.hover) { // 首页顶部固定搜索栏不调用热词接口
// 搜索热词每5分钟请求一次 // 搜索热词每5分钟请求一次
const reloadTime = storage.getItem('hotWordsReloadTime') const reloadTime = storage.getItem('hotWordsReloadTime')
@@ -111,27 +141,70 @@ export default {
}; };
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.container { .only-store{
margin: 30px auto; text-align: right;
width: 460px; color:$theme_color;
position: relative; cursor: pointer;
} }
.navbar {
height: 113px;
background: #fff;
}
.search-icon{
width: 100%;
height: 100%;
}
.small-search-box{
height: 60px;
margin: 0 !important;
}
.container {
position: relative;
height: 100%;
}
.search { .search {
width: 778.4px;
margin: 10px 0px 5px 0; margin: 10px 0px 5px 0;
border-radius: 18.9px;
/deep/ .ivu-input.ivu-input-large { /deep/ .ivu-input.ivu-input-large {
border: 2px solid $theme_color; border: 1.4px solid $theme_color;
font-size: 12px; box-sizing: border-box;
height: 34px; border-radius: 19.6px;
position: relative;
padding-left: 26px;
font-size: 14px;
font-weight: normal;
height: 37.8px;
color: #999;
&:focus { &:focus {
box-shadow: none; box-shadow: none;
} }
} }
/deep/ .ivu-input-group-append { /deep/ .ivu-input-group-append {
border: 1px solid $theme_color; border-radius: 19.6px !important;
border-left: none; cursor: pointer;
height: 30px; box-sizing: border-box;
border: 1.4px solid $theme_color;
width: 67.2px;
height: 37.8px;
position: absolute;
right: 0;
display: flex;
align-items: center;
justify-content: center;
top: 0;
z-index: 99;
background-color: $theme_color; background-color: $theme_color;
color: #ffffff; color: #ffffff;
button { button {
font-size: 14px; font-size: 14px;
font-weight: 600; font-weight: 600;
@@ -139,28 +212,46 @@ export default {
} }
} }
} }
.search-box{
margin-left: 28px;
}
.logo-img { .logo-img {
position: absolute;
left: -360px;
top: -9px;
max-width: 150px; max-width: 150px;
cursor: pointer; cursor: pointer;
} }
.store-search{
width:55.6px; .store-search {
width: 55.6px;
padding: 0 9px; padding: 0 9px;
border-radius: 0; border-radius: 0;
border-radius: 3px; border-radius: 3px;
&:nth-child(2){
width:55px; &:nth-child(2) {
width: 55px;
margin-left: -2px; margin-left: -2px;
border-radius: 3px; border-radius: 3px;
} }
} }
.btn-div{
.btn-div {
position: relative; position: relative;
height: 0px; height: 0px;
top: -38px; top: -38px;
left: 352px; left: 352px;
} }
.history-list {
margin-left: 28px;
}
.history-item {
font-size: 13px;
font-weight: normal;
line-height: 16px;
letter-spacing: 0px;
margin-right: 17px;
color: #666666;
cursor: pointer;
}
</style> </style>

View File

@@ -12,12 +12,8 @@
<i-input v-model="formData.name" style="width: 600px"></i-input> <i-input v-model="formData.name" style="width: 600px"></i-input>
</FormItem> </FormItem>
<FormItem label="收件地区" prop="address"> <FormItem label="收件地区" prop="address">
<i-input {{ formData.address || '暂无地址' }}
v-model="formData.address" <Button type="primary" style="margin-left: 10px;" size="small" @click="$refs.map.open()">选择</Button>
disabled
style="width: 600px"
></i-input>
<Button type="primary" size="small" @click="$refs.map.showMap = true">选择</Button>
</FormItem> </FormItem>
<FormItem label="详细地址" prop="detail"> <FormItem label="详细地址" prop="detail">
<i-input v-model="formData.detail" style="width: 600px"></i-input> <i-input v-model="formData.detail" style="width: 600px"></i-input>
@@ -43,12 +39,12 @@
<Button type="primary" class="mr_10" :loading="loading" @click="save">保存收货地址</Button> <Button type="primary" class="mr_10" :loading="loading" @click="save">保存收货地址</Button>
</div> </div>
</Modal> </Modal>
<lili-map ref="map" @getAddress="getAddress"></lili-map> <multipleMap ref="map" @callback="getAddress"></multipleMap>
</div> </div>
</template> </template>
<script> <script>
import liliMap from '@/components/map'; import multipleMap from "@/components/map/multiple-map";
import { import {
newMemberAddress, newMemberAddress,
editMemberAddress, editMemberAddress,
@@ -129,14 +125,24 @@ export default {
} }
}); });
}, },
getAddress (item) { getAddress (val) {
// 获取地图选择信息 // 获取地图选择信息
this.mapMsg = item; if(val.type === 'select'){
this.$set(this.formData, 'address', item.addr); const paths = val.data.map(item => item.name).join(',')
this.$set(this.formData, 'consigneeAddressIdPath', item.addrId); const ids = val.data.map(item => item.id).join(',')
this.$set(this.formData, 'detail', item.detail); this.$set(this.formData,'address',paths)
this.formData.lat = item.position.lat; this.$set(this.formData,'consigneeAddressIdPath',ids)
this.formData.lon = item.position.lng; const coord = val.data[val.data.length - 1].center.split(',')
this.formData.lat = coord[1]
this.formData.lon = coord[0]
}else{
this.$set(this.formData, "address", val.data.addr);
this.$set(this.formData, "consigneeAddressIdPath", val.data.addrId);
this.$set(this.formData, "detail", val.data.address);
this.formData.lat = val.data.position.lat;
this.formData.lon = val.data.position.lng;
}
}, },
show () { // 地址模态框显示 show () { // 地址模态框显示
this.showAddr = true; this.showAddr = true;
@@ -158,7 +164,7 @@ export default {
} }
}, },
components: { components: {
liliMap multipleMap
} }
}; };
</script> </script>

View File

@@ -24,7 +24,7 @@ export default {
.advertising { .advertising {
height: 80px; height: 80px;
width: 100%; width: 100%;
background-color: $theme_color;
text-align: center; text-align: center;
overflow: hidden; overflow: hidden;
position: relative; position: relative;

View File

@@ -7,6 +7,7 @@
alt="" alt=""
/> />
<p v-if="_Title">{{ _Title }}</p> <p v-if="_Title">{{ _Title }}</p>
<slot></slot>
</div> </div>
</template> </template>
@@ -35,6 +36,6 @@ export default {
} }
p { p {
cursor: pointer; cursor: pointer;
} }
</style> </style>

View File

@@ -0,0 +1,119 @@
<template>
<div class="shadow-box">
<div class="shadow-item flex flex-a-c flex-j-c" v-for="(item,index) in iconList" @click="handleClickIcon(item)" :key="index">
<img class="icon" :src="require(`@/assets/iconfont/${item.icon}.png`)">
<div class="shadow-label">{{item.label}}</div>
<div class="line" v-if="iconList.length-1 !=index"></div>
</div>
</div>
</template>
<script>
export default {
name: "fixed-index",
data(){
return{
iconList:[
{
icon:"user",
label:"会员中心",
path:"/home"
},
{
icon:"carts",
label:"购物车",
path:"/cart"
},
{
icon:"notification",
label:"消息",
path:"/home/MsgList"
},
{
icon:"collage",
label:"收藏",
path:"/home/Favorites"
},
{
icon:"back",
label:"顶部",
path:"back"
},
],
isScrolling:false,
timeoutId:"",
}
},
mounted() {
const vm = this
// 添加滚轮事件监听器
window.addEventListener('wheel', function() {
if (vm.isScrolling) {
// 如果页面正在滚动,则取消定时器并设置 isScrolling 为 false
window.cancelAnimationFrame(vm.timeoutId);
vm.isScrolling = false;
}
});
},
methods:{
scrollToTop() {
const c = document.documentElement.scrollTop || document.body.scrollTop;
if (c > 0) {
this.timeoutId = window.requestAnimationFrame(this.scrollToTop);
window.scrollTo(0, c - c / 4);
this.isScrolling = true;
}else {
this.isScrolling = false;
}
},
handleClickIcon(val){
if(val.path === 'back'){
this.scrollToTop()
}else{
this.$router.push(val.path)
}
}
}
}
</script>
<style scoped lang="scss">
.shadow-box{
width: 64px;
height: 354px;
border-radius: 10px;
opacity: 1;
background: #FFFFFF;
box-shadow: 0px 1px 10px 0px rgba(154, 154, 154, 0.5);
}
.shadow-label{
font-size: 13px;
font-weight: normal;
line-height: 16px;
text-align: center;
letter-spacing: 0px;
color: #666666;
}
.icon{
margin-top: 15px;
width: 20px;
height: 20px;
margin-bottom: 5px;
}
.shadow-item{
cursor: pointer;
flex-direction: column;
height: 70px;
>.line{
width: 34px;
height: 1px;
opacity: 1;
margin-top: 17px;
border: 0.7px solid #EAEAEA;
}
}
</style>

View File

@@ -3,20 +3,20 @@
<footer class="footer"> <footer class="footer">
<div class="clearfix"></div> <div class="clearfix"></div>
<div class="icon-row"> <div class="icon-row">
<div class="footer-icon"> <div class="footer-icon flex flex-a-c">
<h5 class="footer-icon-child"></h5> <h5 class="footer-icon-child"></h5>
<span class="footer-icon-text">品类齐全轻松购物</span> <span class="footer-icon-text">品类齐全轻松购物</span>
</div> </div>
<div class="footer-icon"> <div class="footer-icon flex flex-a-c">
<h5 class="footer-icon-child footer-icon-child-2"></h5> <h5 class="footer-icon-child footer-icon-child-2"></h5>
<span class="footer-icon-text">多仓直发极速配送</span> <span class="footer-icon-text">多仓直发极速配送</span>
</div> </div>
<div class="footer-icon"> <div class="footer-icon flex flex-a-c">
<h5 class="footer-icon-child footer-icon-child-3"></h5> <h5 class="footer-icon-child footer-icon-child-3"></h5>
<span class="footer-icon-text">正品行货精致服务</span> <span class="footer-icon-text">正品行货精致服务</span>
</div> </div>
<div class="footer-icon"> <div class="footer-icon flex flex-a-c">
<h5 class="footer-icon-child footer-icon-child-4"></h5> <h5 class="footer-icon-child footer-icon-child-4"></h5>
<span class="footer-icon-text">天天低价畅选无忧</span> <span class="footer-icon-text">天天低价畅选无忧</span>
</div> </div>
</div> </div>
@@ -37,27 +37,28 @@
</li> </li>
</ul> </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>
<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="information footer-bottmom">
<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>
<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="clearfix"></div>
<div class="copyright"> <div class="copyright">
<p>Copyright © {{year}} {{config.title}}</p> <p>Copyright © {{year}} {{config.title}}</p>
@@ -77,7 +78,7 @@ export default {
guideArr: [ guideArr: [
// 导航链接 // 导航链接
["购物指南", "购物流程", "会员介绍", "生活旅行", "常见问题"], ["购物指南", "购物流程", "会员介绍", "生活旅行", "常见问题"],
["配送方式", "上门自提", "配送服务查询", "收取标准", "物流规则"], ["配送方式", "上门自提", "配送查询", "收取标准", "物流规则"],
["支付方式", "在线支付", "公司转账", "余额支付", "积分支付"], ["支付方式", "在线支付", "公司转账", "余额支付", "积分支付"],
["售后服务", "售后政策", "退款说明", "返修/退货", "取消订单"], ["售后服务", "售后政策", "退款说明", "返修/退货", "取消订单"],
], ],
@@ -101,40 +102,36 @@ export default {
/*****************************底 部 开 始*****************************/ /*****************************底 部 开 始*****************************/
.footer { .footer {
width: 100%; width: 100%;
padding-top: 30px; height: 370px;
background: #FFFFFF;
@include background_color($light_background_color);
} }
.icon-row { .icon-row {
margin: 15px auto; display: flex;
padding-top: 8px; align-items: center;
width: 1000px; justify-content: space-between;
height: 64px; width: 1056px;
height: 71px;
margin: 0 auto;
} }
.footer-icon { .footer-icon {
margin-left: 17px;
margin-right: 17px;
float: left; float: left;
} }
.footer-icon-child { .footer-icon-child {
margin-top: 10px;
overflow: hidden; overflow: hidden;
position: absolute; width: 36.4px;
width: 36px; display: flex;
height: 42px; align-items: center;
background-image: url("../../assets/images/footer/ico_service.png"); justify-content: center;
text-indent: -999px; font-size: 18.2px;
} font-weight: normal;
.footer-icon-child-2 { color: #333;
background-position: 0 -43px; height: 36.4px;
} border: 1.4px solid #CECECE;
.footer-icon-child-3 { border-radius: 50%;
background-position: 0 -86px;
}
.footer-icon-child-4 {
background-position: 0 -129px;
} }
.icp { .icp {
margin-right: 30px !important;
>*{ >*{
margin: 0 4px; margin: 0 4px;
} }
@@ -148,59 +145,69 @@ export default {
} }
} }
.footer-icon-text { .footer-icon-text {
margin-left: 45px; margin-left: 11px;
font-size: 18px; font-size: 16px;
font-weight: bold;
line-height: 64px; font-weight: normal;
text-align: center;
} }
.service-intro { .service-intro {
width: 100%; width: 100%;
border-top: 1px solid $border_color; border-top: 1px solid $border_color;
} }
.servece-type { .servece-type {
margin: 15px auto; width: 952px;
width: 800px; margin: 22px auto 10px auto;
display: flex; display: flex;
flex-direction: row; flex-direction: row;
justify-content: space-between; justify-content: space-between;
}
}
.servece-type-info{
}
.servece-type-info ul { .servece-type-info ul {
list-style: none; list-style: none;
} }
.servece-type-info li { .servece-type-info li {
font-size: 14px; font-size: 12px;
cursor: pointer; cursor: pointer;
line-height: 26px; font-weight: normal;
} line-height: 15px;
.servece-type-info li:hover{ text-align: center;
color:#b8b8be; margin-bottom: 13px;
color: #333;
} }
.servece-type-info li:first-child { .servece-type-info li:first-child {
font-size: 16px; font-size: 14.82px;
line-height: 28px; font-weight: normal;
font-weight: bold; line-height: 18px;
}
.servece-type-info li:first-child:hover{ letter-spacing: 0px;
// font-size:15px; margin-bottom: 17px;
// font-weight: bold; color: #333333;
color:#b8b8be;
} }
.friend-link { .friend-link {
display: flex; display: flex;
align-items: flex-start; align-items: flex-start;
justify-content: space-between; justify-content: center;
width: 908px; width: 908px;
padding: 10px 0; padding: 10px 0;
margin: 0px auto; margin: 0px auto;
border-top: 1px solid $border_color; border-top: 1px solid $border_color;
} }
.information { .information {
margin-top: 23px;
margin-bottom: 21px;
display: flex; display: flex;
flex-direction: column; justify-content: center;
> * {
margin: 2px 0; }
} a{
color: #3457FF;
} }
.zhizhao { .zhizhao {
width: 20px; width: 20px;
@@ -213,35 +220,38 @@ export default {
.friend-link-item li { .friend-link-item li {
padding: 5px 0px; padding: 5px 0px;
float: left; float: left;
margin-right: 59px;
font-weight: normal;
line-height: 13px;
color: #333333;
} }
.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 { .link-item {
padding: 0px 8px; padding: 0px 8px;
cursor: pointer; cursor: pointer;
border-right: 1px solid $border_color;
} }
.link-last-item { .link-last-item {
border: none; border: none;
} }
.copyright { .copyright {
width: 100%; width: 100%;
line-height: 30px; cursor: pointer;
text-align: center; text-align: center;
height:25px;
opacity: 1;
margin-bottom: 12px;
font-size: 12px;
font-weight: normal;
line-height: 13px;
letter-spacing: 0px;
color: #959595;
} }
.copyright a {
color: #232323;
font-size: 20px;
}
.footer-icon-text { .footer-icon-text {
@include title_color($light_title_color); @include title_color($light_title_color);
} }

View File

@@ -4,22 +4,15 @@
<!-- 详情左侧展示数据图片收藏举报 --> <!-- 详情左侧展示数据图片收藏举报 -->
<div class="item-detail-left"> <div class="item-detail-left">
<!-- 大图放大镜 --> <!-- 大图放大镜 -->
<!-- <div id="dplayer"></div> -->
<div class="item-detail-big-img"> <div class="item-detail-big-img">
<pic-zoom :url="imgList[imgIndex].url" :scale="2"></pic-zoom>
</div> <pic-zoom :url="imgList[imgIndex].url" :scale="2"></pic-zoom>
<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>
<!-- <div id="dplayer"></div> -->
<div class="item-detail-img-row"> <div class="item-detail-img-row">
<div <div
class="item-detail-img-small" class="item-detail-img-small"
@mouseover="imgIndex = index" @mouseover="imgIndex = index"
@@ -44,6 +37,18 @@
<div class="item-detail-title"> <div class="item-detail-title">
<p> <p>
{{ skuDetail.goodsName }} {{ skuDetail.goodsName }}
<Tag
v-if="skuDetail.goodsType !== 'VIRTUAL_GOODS'"
style="margin-top:10px;rgb(153, 149, 149);"
>
实物商品
</Tag>
<Tag
v-else-if="skuDetail.goodsType == 'VIRTUAL_GOODS'"
style="margin-top:10px;rgb(153, 149, 149);"
>
虚拟商品
</Tag>
</p> </p>
</div> </div>
<div class="sell-point"> <div class="sell-point">
@@ -238,6 +243,7 @@
:disabled="skuDetail.quantity === 0" :disabled="skuDetail.quantity === 0"
v-model="count" v-model="count"
:precision="0.1" :precision="0.1"
@on-blur="changeCount"
></InputNumber> ></InputNumber>
<span class="inventory"> 库存{{ skuDetail.quantity }}</span> <span class="inventory"> 库存{{ skuDetail.quantity }}</span>
</div> </div>
@@ -271,7 +277,8 @@
class="add-buy-car" class="add-buy-car"
v-if="$route.query.way !== 'POINT' && skuDetail.authFlag === 'PASS'" v-if="$route.query.way !== 'POINT' && skuDetail.authFlag === 'PASS'"
> >
<Button
<Button
type="error" type="error"
v-if="skuDetail.goodsType !== 'VIRTUAL_GOODS'" v-if="skuDetail.goodsType !== 'VIRTUAL_GOODS'"
:loading="loading" :loading="loading"
@@ -286,9 +293,15 @@
@click="buyNow" @click="buyNow"
>立即购买</Button >立即购买</Button
> >
<Tooltip content="观看视频" v-if="skuDetail.goodsVideo">
<img class="view-video" @click="showGoodsVideo = true" :src="require('@/assets/iconfont/play.svg')" alt="">
</Tooltip>
</div> </div>
</div> </div>
</div> </div>
<Modal title="浏览视频" v-model="showGoodsVideo">
<div id="dplayer"></div>
</Modal>
</div> </div>
</div> </div>
</template> </template>
@@ -296,6 +309,7 @@
<script> <script>
import Promotion from "./Promotion.vue"; import Promotion from "./Promotion.vue";
import PicZoom from "vue-piczoom"; // 图片放大 import PicZoom from "vue-piczoom"; // 图片放大
import DPlayer from "dplayer";
import { import {
collectGoods, collectGoods,
isCollection, isCollection,
@@ -303,6 +317,7 @@ import {
cancelCollect, cancelCollect,
} from "@/api/member.js"; } from "@/api/member.js";
import { addCartGoods } from "@/api/cart.js"; import { addCartGoods } from "@/api/cart.js";
export default { export default {
name: "ShowGoods", name: "ShowGoods",
props: { props: {
@@ -317,14 +332,25 @@ export default {
handler(val) { handler(val) {
this.skuDetail = val.data; this.skuDetail = val.data;
this.wholesaleList = val.wholesaleList; this.wholesaleList = val.wholesaleList;
if (this.wholesaleList && this.wholesaleList.length > 0) {
this.count = this.wholesaleList[0].num;
}
this.swiperGoodsImg(); this.swiperGoodsImg();
}, },
deep: true, deep: true,
immediate: true, immediate: true,
}, },
showGoodsVideo(val){
if(val){
this.initVideo();
}
}
}, },
data() { data() {
return { return {
showGoodsVideo:false,
goodsVideo:"",
wholesaleList: [], wholesaleList: [],
count: 1, // 商品数量 count: 1, // 商品数量
imgIndex: 0, // 展示图片下标 imgIndex: 0, // 展示图片下标
@@ -364,6 +390,32 @@ export default {
}, },
}, },
methods: { methods: {
// 初始化video
initVideo(){
if(!this.goodsVideo ){
setTimeout(()=>{
this.goodsVideo = new DPlayer({
container: document.getElementById('dplayer'),
video: {
url:this.skuDetail.goodsVideo,
},
});
},100)
}
},
changeCount(val) {
if (this.wholesaleList && this.wholesaleList.length > 0) {
if (this.count <= this.wholesaleList[0].num) {
this.$Message.warning("批发商品购买数量不能小于起批数量");
this.count = this.wholesaleList[0].num;
}
}
},
select(index, value) { select(index, value) {
// 选择规格 // 选择规格
this.$set(this.currentSelceted, index, value); this.$set(this.currentSelceted, index, value);
@@ -532,6 +584,7 @@ export default {
this.imgList = e.specImage; this.imgList = e.specImage;
} }
}); });
}, },
}, },
mounted() { mounted() {
@@ -587,6 +640,7 @@ export default {
.item-detail-left { .item-detail-left {
width: 350px; width: 350px;
margin-right: 30px; margin-right: 30px;
} }
@@ -595,8 +649,14 @@ export default {
height: 350px; height: 350px;
box-shadow: 0px 0px 8px $border_color; box-shadow: 0px 0px 8px $border_color;
cursor: pointer; cursor: pointer;
}
}
#dplayer{
width: 100%;
height: 100%;
}
.item-detail-big-img img { .item-detail-big-img img {
width: 100%; width: 100%;
} }
@@ -830,11 +890,14 @@ export default {
.add-buy-car-box { .add-buy-car-box {
width: 100%; width: 100%;
margin-top: 15px; margin-top: 15px;
border-top: 1px dotted $border_color; border-top: 1px dotted $border_color;
} }
.add-buy-car { .add-buy-car {
display: flex;
align-items: center;
margin-top: 15px; margin-top: 15px;
> * { > * {
margin: 0 4px; margin: 0 4px;
@@ -857,5 +920,8 @@ export default {
color: red; color: red;
margin-bottom: 5px; margin-bottom: 5px;
} }
.view-video{
cursor: pointer;
}
/******************商品图片及购买详情结束******************/ /******************商品图片及购买详情结束******************/
</style> </style>

View File

@@ -1,25 +1,32 @@
<template> <template>
<div class="box"> <div class="box">
<div class="nav"> <div class="nav width_1200_auto">
<ul class="location"> <ul class="location flex">
<li v-if="$route.path.includes('home')" style="margin-left:10px"><router-link to="/">首页</router-link></li> <li v-if="$route.path.includes('home')" style="margin-left:10px">
<router-link to="/">首页</router-link>
</li>
<ul class="flex">
<li>Hi欢迎来到{{ config.title }}</li>
<li class="first" v-show="!userInfo.username">
<router-link :to="`/signUp`" class="nav-item">
<span>立即注册</span>
</router-link>
</li>
<li v-show="!userInfo.username">
<router-link class="nav-item" :to="`/login?rePath=${$route.path}&query=${JSON.stringify($route.query)}`">
<span>请登录</span>
</router-link>
</li>
</ul>
</ul> </ul>
<ul class="detail"> <ul class="detail flex">
<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">请登录</span>
</router-link>
</li>
<li v-show="!!userInfo.username"> <li v-show="!!userInfo.username">
<div class="username-p"> <div class="username-p">
<div> <div>
<Avatar class="person-icon" :src="userInfo.face" icon="person" size="small" /> <Avatar class="person-icon" :src="userInfo.face" icon="person" size="small"/>
<span class="username">{{ userInfo.nickName? userInfo.nickName : userInfo.username | secrecyMobile }}</span> <span class="username">{{
userInfo.nickName ? userInfo.nickName : userInfo.username | secrecyMobile
}}</span>
</div> </div>
<transition name='fade'> <transition name='fade'>
<ul class="drop-items"> <ul class="drop-items">
@@ -31,16 +38,15 @@
</transition> </transition>
</div> </div>
</li> </li>
<li @click="goUserCenter('/home/MyOrder')"><span class="nav-item hover-color">我的订单</span></li> <li @click="goUserCenter('/home/MyOrder')"><span class="nav-item">我的订单</span></li>
<li @click="goUserCenter('/home/MyTracks')"><span class="nav-item hover-color">我的足迹</span></li> <li @click="goUserCenter('/home/MyTracks')"><span class="nav-item">我的足迹</span></li>
<li @click="goUserCenter('/home/MsgList')"><span class="nav-item hover-color">我的消息</span></li> <li @click="goUserCenter('/home/MsgList')"><span class="nav-item">我的消息</span></li>
<li v-if="$route.name !== 'Cart'" style="position:relative;"> <li v-if="$route.name !== 'Cart'" style="position:relative;">
<i class="cart-badge" v-show="Number(cartNum)">{{cartNum < 100 ? cartNum : '99'}}</i>
<Dropdown placement="bottom-start"> <Dropdown placement="bottom-start">
<router-link to="/cart" target="_blank"> <router-link to="/cart" target="_blank">
<span @mouseenter="getCartList"> <span class="nav-item" @mouseenter="getCartList">
<Icon size="18" type="ios-cart-outline"></Icon> <Icon size="18" type="ios-cart-outline"></Icon>
购物车 购物车{{ cartNum < 100 ? cartNum : '99' }}
</span> </span>
</router-link> </router-link>
<DropdownMenu slot="list"> <DropdownMenu slot="list">
@@ -52,25 +58,25 @@
<div class="shopping-cart-list" v-show="shoppingCart.length > 0"> <div class="shopping-cart-list" v-show="shoppingCart.length > 0">
<div class="shopping-cart-box" v-for="(item, index) in shoppingCart" @click="goToPay" :key="index"> <div class="shopping-cart-box" v-for="(item, index) in shoppingCart" @click="goToPay" :key="index">
<div class="shopping-cart-img"> <div class="shopping-cart-img">
<img :src="item.goodsSku.thumbnail" class="hover-pointer" /> <img :src="item.goodsSku.thumbnail" class="hover-pointer"/>
</div> </div>
<div class="shopping-cart-info"> <div class="shopping-cart-info">
<div class="shopping-cart-title "> <div class="shopping-cart-title ">
<p class="hover-pointer goods-title ellipsis">{{ item.goodsSku.goodsName }}</p> <p class="hover-pointer goods-title ellipsis">{{ item.goodsSku.goodsName }}</p>
</div> </div>
<div class="shopping-cart-detail"> <div class="shopping-cart-detail">
<p> <div>
数量: 数量:
<span class="shopping-cart-text">{{ item.num }}</span> <span class="shopping-cart-text">{{ item.num }}</span>
价钱:
<span class="shopping-cart-text">{{ item.purchasePrice | unitPrice('¥') }}</span> </div>
</p> <div class="shopping-price">
{{ item.purchasePrice | unitPrice('¥') }}
</div>
</div> </div>
</div> </div>
</div> </div>
<div class="go-to-buy">
<Button type="error" size="small" @click="goToPay">去结账</Button>
</div>
</div> </div>
</DropdownMenu> </DropdownMenu>
</Dropdown> </Dropdown>
@@ -78,6 +84,7 @@
<li> <li>
<span class="nav-item" @click="shopEntry">店铺入驻</span> <span class="nav-item" @click="shopEntry">店铺入驻</span>
</li> </li>
</ul> </ul>
</div> </div>
</div> </div>
@@ -85,42 +92,45 @@
<script> <script>
import storage from '@/plugins/storage.js'; import storage from '@/plugins/storage.js';
import { cartGoodsAll } from '@/api/cart.js'; import {cartGoodsAll} from '@/api/cart.js';
import { logout } from '@/api/account.js'; import {logout} from '@/api/account.js';
export default { export default {
name: 'M-Header', name: 'M-Header',
created () { created() {
if (storage.getItem('userInfo')) { if (storage.getItem('userInfo')) {
this.userInfo = JSON.parse(storage.getItem('userInfo')); this.userInfo = JSON.parse(storage.getItem('userInfo'));
} }
}, },
data () { data() {
return { return {
config: require('@/config'),
userInfo: {}, // 用户信息 userInfo: {}, // 用户信息
shoppingCart: [] // 购物车 shoppingCart: [] // 购物车
}; };
}, },
computed: { computed: {
// 购物车商品数量 // 购物车商品数量
cartNum () { cartNum() {
return this.$store.state.cartNum; return this.$store.state.cartNum;
} }
}, },
methods: { methods: {
goToPay () { // 跳转购物车 goToPay() { // 跳转购物车
let url = this.$router.resolve({ let url = this.$router.resolve({
path: '/cart' path: '/cart'
}); });
window.open(url.href, '_blank'); window.open(url.href, '_blank');
}, },
myInfo () { // 跳转会员中心 myInfo() { // 跳转会员中心
let url = this.$router.resolve({ let url = this.$router.resolve({
path: '/home' path: '/home'
}); });
window.open(url.href, '_blank'); window.open(url.href, '_blank');
}, },
signOutFun () { // 退出登录 signOutFun() { // 退出登录
logout().then(res => { logout().then(res => {
storage.removeItem('accessToken'); storage.removeItem('accessToken');
storage.removeItem('refreshToken'); storage.removeItem('refreshToken');
@@ -130,10 +140,10 @@ export default {
this.$router.push('/login'); this.$router.push('/login');
}); });
}, },
goUserCenter (path) { goUserCenter(path) {
// 跳转我的订单,我的足迹、收藏等 // 跳转我的订单,我的足迹、收藏等
if (this.userInfo.username) { if (this.userInfo.username) {
this.$router.push({ path: path }); this.$router.push({path: path});
} else { } else {
this.$Modal.confirm({ this.$Modal.confirm({
title: '请登录', title: '请登录',
@@ -152,19 +162,19 @@ export default {
}); });
} }
}, },
shopEntry () { shopEntry() {
// 店铺入驻 // 店铺入驻
if (storage.getItem('accessToken')) { if (storage.getItem('accessToken')) {
let routeUrl = this.$router.resolve({ let routeUrl = this.$router.resolve({
path: '/shopEntry', path: '/shopEntry',
query: { id: 1 } query: {id: 1}
}); });
window.open(routeUrl.href, '_blank'); window.open(routeUrl.href, '_blank');
} else { } else {
this.$router.push('login'); this.$router.push('login');
} }
}, },
getCartList () { getCartList() {
// 获取购物车列表 // 获取购物车列表
if (this.userInfo.username) { if (this.userInfo.username) {
cartGoodsAll().then((res) => { cartGoodsAll().then((res) => {
@@ -179,106 +189,88 @@ export default {
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.shopping-cart-detail,
.shopping-cart-text,
.shopping-cart-info,
.nav a,
.location,
.first,
.username,
.shopping-cart-null span {
}
.box { .box {
width: 100%; width: 100%;
font-size: 12px!important; font-size: 12px !important;
// height: 35px; height: 36px;
@include background_color($light_white_background_color); background: #333;
color: #fff;
} }
.nav { .nav {
margin: 0 auto;
width: 1200px;
display: flex; display: flex;
flex-direction: row; flex-direction: row;
justify-content: space-between; justify-content: space-between;
} }
.nav ul { .nav ul {
list-style: none; list-style: none;
} }
.nav li { .nav li {
cursor: pointer;
float: left; float: left;
font-size: 12px; line-height: 36px;
line-height: 35px; margin-right: 15px;
margin-right: 10px;
font-weight: bold;
} }
.nav a, .nav a,
.nav-item { .nav-item {
font-size: 13px;
font-weight: normal;
text-decoration: none; text-decoration: none;
padding-left: 14px;
border-left: 1px solid #ccc;
color: #999;
cursor: pointer; cursor: pointer;
color: #fff;
} }
.nav-item {
padding-left: 20px;
}
.location a { .location a {
border-left: none; border-left: none;
} }
.nav a:hover {
color: $theme_color;
}
.icon { .icon {
color: gray; color: gray;
vertical-align: middle; vertical-align: middle;
} }
.first a:first-child {
padding-left: 3px;
border-left: none;
}
.city { .city {
padding: 10px 15px; padding: 10px 15px;
} }
.city-item { .city-item {
font-weight: bold; font-weight: bold;
cursor: pointer; cursor: pointer;
padding: 5px; padding: 5px;
} }
.city-item:hover { .city-item:hover {
color: $theme_color; color: $theme_color;
} }
.person-icon { .person-icon {
color: $theme_color; color: $theme_color;
background-color: #f0cdb2; background-color: #f0cdb2;
} }
.shopping-cart-list {
padding: 10px 15px;
box-sizing: border-box;
max-height: 300px;
overflow: scroll;
}
.shopping-cart-box {
margin: 8px 0px;
margin-top: 15px;
padding-bottom: 15px;
height: 40px;
display: flex;
align-items: center;
border-bottom: 1px #ccc dotted;
}
.shopping-cart-box:first-child {
margin-top: 8px;
}
.shopping-cart-img { .shopping-cart-img {
margin-right: 15px; margin-right: 15px;
width: 40px; width: 40px;
height: 40px; height: 40px;
} }
.shopping-cart-img img { .shopping-cart-img img {
width: 100%; width: 100%;
} }
.shopping-cart-info { .shopping-cart-info {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
@@ -290,10 +282,7 @@ export default {
line-height: 20px; line-height: 20px;
} }
.go-to-buy {
display: flex;
justify-content: flex-end;
}
.shopping-cart-null { .shopping-cart-null {
padding: 15px; padding: 15px;
display: flex; display: flex;
@@ -301,22 +290,28 @@ export default {
align-items: center; align-items: center;
justify-content: center; justify-content: center;
} }
.cart-null-icon { .cart-null-icon {
font-size: 38px; font-size: 38px;
margin-bottom: 15px; margin-bottom: 15px;
} }
.shopping-cart-null span { .shopping-cart-null span {
font-size: 12px; font-size: 12px;
line-height: 16px; line-height: 16px;
} }
.username-p { .username-p {
position: relative; position: relative;
div{
div {
cursor: pointer; cursor: pointer;
>span{
> span {
margin-left: 5px; margin-left: 5px;
} }
} }
.drop-items { .drop-items {
position: absolute; position: absolute;
display: none; display: none;
@@ -335,19 +330,21 @@ export default {
li { li {
color: rgb(107, 106, 106); color: rgb(107, 106, 106);
width: 100%; width: 100%;
border-bottom:1px solid rgb(207, 206, 206); border-bottom: 1px solid rgb(207, 206, 206);
font-weight: normal; font-weight: normal;
text-align: center; text-align: center;
&:last-child{
&:last-child {
border: none; border: none;
} }
&:hover{
&:hover {
cursor: pointer; cursor: pointer;
color: $theme_color; color: $theme_color;
} }
} }
&::before{ &::before {
position: absolute; position: absolute;
top: -20px; top: -20px;
left: 30px; left: 30px;
@@ -355,10 +352,10 @@ export default {
width: 0; width: 0;
height: 0; height: 0;
border: 10px solid #999; border: 10px solid #999;
border-color: transparent transparent #fff transparent ; border-color: transparent transparent #fff transparent;
} }
&::after{ &::after {
content: ''; content: '';
position: absolute; position: absolute;
width: 80px; width: 80px;
@@ -367,8 +364,9 @@ export default {
left: 0; left: 0;
} }
} }
&:hover{
.drop-items{ &:hover {
.drop-items {
display: block; display: block;
} }
} }
@@ -382,11 +380,13 @@ export default {
justify-content: center; justify-content: center;
align-items: center; align-items: center;
} }
.my-page a { .my-page a {
margin: 0px; margin: 0px;
padding: 0px; padding: 0px;
border: none; border: none;
} }
.my-info { .my-info {
padding: 5px; padding: 5px;
width: 50%; width: 50%;
@@ -394,15 +394,19 @@ export default {
text-align: center; text-align: center;
cursor: pointer; cursor: pointer;
} }
.my-info:hover { .my-info:hover {
box-shadow: 0px 0px 5px #ccc; box-shadow: 0px 0px 5px #ccc;
} }
.my-info i { .my-info i {
font-size: 28px; font-size: 28px;
} }
.my-info p { .my-info p {
font-size: 12px; font-size: 12px;
} }
.sign-out { .sign-out {
padding: 5px; padding: 5px;
width: 50%; width: 50%;
@@ -410,18 +414,23 @@ export default {
text-align: center; text-align: center;
cursor: pointer; cursor: pointer;
} }
.sign-out:hover { .sign-out:hover {
box-shadow: 0px 0px 5px $border_color; box-shadow: 0px 0px 5px $border_color;
} }
.sign-out i { .sign-out i {
font-size: 28px; font-size: 28px;
} }
.sign-out p { .sign-out p {
font-size: 12px; font-size: 12px;
} }
.goods-title:hover { .goods-title:hover {
color: $theme_color; color: $theme_color;
} }
.cart-badge { .cart-badge {
position: absolute; position: absolute;
right: -8px; right: -8px;
@@ -437,4 +446,34 @@ export default {
z-index: 3; z-index: 3;
top: 3px; top: 3px;
} }
.shopping-cart-box {
padding: 8px 0;
cursor: pointer;
display: flex;
align-items: center;
border-bottom: 1px #ccc dotted;
}
.shopping-cart-list {
padding: 10px 10px;
box-sizing: border-box;
max-height: 300px;
overflow-y: scroll;
color: #333;
}
.shopping-cart-detail {
color: #999;
font-size: 12px;
}
.shopping-price {
color: $theme_color;
font-size: 14px;
font-weight: bold;
}
</style> </style>

View File

@@ -1,62 +0,0 @@
<template>
<div class="shop-box">
<div class="shop-container">
<div class="shop-title-content">
<img class="hover-pointer" @click="linkTo(`/merchant?id=${storeDetail.storeId}`)" :src="storeDetail.storeLogo" height="40" alt="">
<p><router-link :to="`/merchant?id=${storeDetail.storeId}`">{{ storeDetail.storeName }}</router-link></p>
<div class="ml_20" v-html="storeDetail.storeDesc"></div>
</div>
</div>
</div>
</template>
<script>
export default {
name: 'ShopHeader',
props: {
detail: {
type: Object,
default: null
}
},
computed: {
storeDetail () { // 店铺详情
return this.detail;
}
}
};
</script>
<style scoped>
/* 店铺介绍 */
.shop-box {
width: 100%;
height: 50px;
background-color: #484848;
}
.shop-container {
width: 1200px;
height: 100%;
margin: 0px auto;
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: center;
color: #fff;
}
.shop-title-content {
display: flex;
align-items: center;
}
.shop-title-content p {
font-size: 20px;
margin-left: 20px;
}
.shop-title-content a {
color: #fff;
}
</style>

View File

@@ -1,22 +1,27 @@
<template> <template>
<div class="scroll-show"> <div class="scroll-show">
<div class="content clearfix"> <div class="content clearfix">
<cateNav class="cate" :hover="true" :showNavBar="false"></cateNav> <cateNav class="cate" :hover="true" :showNavBar="false"
useClass="fixed-show"></cateNav>
<Search <Search
class="search-con" class="search-con"
:hover="true" :hover="true"
ref="search"
:showLogo="false" :showLogo="false"
:showTag="false" :showTag="false"
useClass="fixed-show"
></Search> ></Search>
<Icon <div class="flex flex-a-c cart">
type="ios-cart-outline" <Icon
@click="goCartList" type="ios-cart-outline"
class="cart-icon" @click="goCartList"
@mouseenter.native="getCartList" class="cart-icon"
/> @mouseenter.native="getCartList"
<i class="cart-badge">{{ cartNum < 100 ? cartNum : "99" }}</i> />
<i class="cart-badge">{{ cartNum < 100 ? cartNum : "99" }}</i>
</div>
</div> </div>
<hr class="hr"/>
</div> </div>
</template> </template>
<script> <script>
@@ -53,6 +58,7 @@ export default {
}, },
}, },
mounted() { mounted() {
if (storage.getItem("userInfo")) { if (storage.getItem("userInfo")) {
this.userInfo = JSON.parse(storage.getItem("userInfo")); this.userInfo = JSON.parse(storage.getItem("userInfo"));
} }
@@ -60,14 +66,11 @@ export default {
}; };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.hr{
height:1px;
background:$theme_color;
}
.content { .content {
width: 1200px; width: 1200px;
height: 40px; height: 40px;
margin: 10px auto; margin: 0 auto;
position: relative; position: relative;
} }
.cate { .cate {
@@ -80,11 +83,14 @@ export default {
overflow: hidden; overflow: hidden;
margin-top: -27px; margin-top: -27px;
} }
.cart{
height: 60px;
}
.cart-icon { .cart-icon {
width: 30px; width: 30px;
float: left; float: left;
font-size: 25px; font-size: 25px;
margin-top: 8px;
color: $theme_color; color: $theme_color;
z-index: 1; z-index: 1;
position: relative; position: relative;
@@ -106,6 +112,6 @@ export default {
line-height: 17px; line-height: 17px;
text-align: center; text-align: center;
z-index: 5; z-index: 5;
top: 3px; top: 10px;
} }
</style> </style>

View File

@@ -81,6 +81,27 @@
<template v-if="element.type == 'recommend'"> <template v-if="element.type == 'recommend'">
<recommend :data="element" class="mb_20 width_1200_auto"></recommend> <recommend :data="element" class="mb_20 width_1200_auto"></recommend>
</template> </template>
<!-- 一行三列 -->
<template v-if="element.type == 'oneRowThreeColumns'">
<oneRowThreeColumns :data="element" class="mb_20 width_1200_auto"></oneRowThreeColumns>
</template>
<!-- 商品模块 -->
<template v-if="element.type == 'goodsType'">
<goodsAndType :paramData="element" class="mb_20 width_1200_auto"></goodsAndType>
</template>
<!-- 商品模块 -->
<template v-if="element.type == 'onlyGoodsModel'">
<onlyGoodsModel :data="element" class="mb_20 width_1200_auto"></onlyGoodsModel>
</template>
<!-- 混合模块 -->
<template v-if="element.type == 'mixModel'">
<mixModel :data="element" class="mb_20 width_1200_auto"></mixModel>
</template>
<!-- 混合模块 -->
<template v-if="element.type == 'forYour'">
<forYour :data="element" class="mb_20 width_1200_auto"></forYour>
</template>
<!-- 新品排行 --> <!-- 新品排行 -->
<template v-if="element.type == 'newGoodsSort'"> <template v-if="element.type == 'newGoodsSort'">
<new-goods-sort <new-goods-sort
@@ -100,7 +121,7 @@
<div style="width: 100%; text-align: center"> <div style="width: 100%; text-align: center">
<img <img
width="1200" width="1200"
class="hover-pointer mb_20" class="hover-pointer mb_20 bannerAd"
@click="linkTo(element.options.url)" @click="linkTo(element.options.url)"
:src="element.options.img" :src="element.options.img"
alt="" alt=""
@@ -126,6 +147,12 @@ import NewGoodsSort from "./modelList/NewGoodsSort.vue";
import Recommend from "./modelList/Recommend.vue"; import Recommend from "./modelList/Recommend.vue";
import NotEnough from "./modelList/NotEnough.vue"; import NotEnough from "./modelList/NotEnough.vue";
import Seckill from "./modelList/Seckill.vue"; import Seckill from "./modelList/Seckill.vue";
import oneRowThreeColumns from "./modelList/oneRowThreeColumns.vue";
import goodsAndType from "./modelList/goodsAndType.vue";
import onlyGoodsModel from "./modelList/onlyGoodsModel.vue";
import mixModel from "./modelList/mixModel.vue";
import forYour from "./modelList/forYour.vue";
export default { export default {
name: "modelFormItem", name: "modelFormItem",
@@ -139,6 +166,11 @@ export default {
FirstPageAdvert, FirstPageAdvert,
NotEnough, NotEnough,
Seckill, Seckill,
oneRowThreeColumns,
goodsAndType,
onlyGoodsModel,
mixModel,
forYour
}, },
data() { data() {
return { return {
@@ -153,7 +185,11 @@ export default {
position: relative; position: relative;
margin-bottom: 10px; margin-bottom: 10px;
} }
.bannerAd{
width: 1183px;
height: 166.6px;
border-radius: 10px;
}
/** 热门广告 */ /** 热门广告 */
.advert-list { .advert-list {
background: $theme_color; background: $theme_color;
@@ -198,9 +234,4 @@ export default {
} }
} }
.width_1200_auto {
width: 1200px;
margin: 0 auto;
background-color: #fff;
}
</style> </style>

View File

@@ -5,14 +5,13 @@
<div class="nav-side"></div> <div class="nav-side"></div>
<div class="nav-content"> <div class="nav-content">
<!-- 轮播图 --> <!-- 轮播图 -->
<Carousel autoplay> <!-- autoplay autoplay-speed="10000"-->
<CarouselItem v-for="(item, index) in data.options.list" :key="index"> <Carousel :height="333.9" autoplay :autoplay-speed="5000">
<div style="overflow: hidden"> <CarouselItem v-for="(item, index) in data.options.list" :key="index">
<div class="swiper-img" >
<img <img
:src="item.img" :src="item.img"
width="790"
@click="linkTo(item.url)" @click="linkTo(item.url)"
height="340"
class="hover-pointer" class="hover-pointer"
/> />
</div> </div>
@@ -21,47 +20,66 @@
</div> </div>
<div class="nav-right"> <div class="nav-right">
<div class="person-msg"> <div class="person-msg">
<img :src="userInfo.face" v-if="userInfo.face" alt /> <div class="user-box" @click="entryControl({ path: 'home' })">
<Avatar icon="ios-person" class="mb_10" v-else size="80" /> <img class="user-face" :src="userInfo.face || defaultAvatar" alt />
<div> <div class="welcome">
Hi, {{ Hi, {{
userInfo.nickName || `欢迎来到${config.title}` | secrecyMobile userInfo.nickName || `欢迎来到${config.title}` | secrecyMobile
}} }}
</div>
</div> </div>
<div v-if="userInfo.id"> <div v-if="userInfo.id">
<Button class="btns" shape="circle" @click="$router.push('home')" <div class="icon-list"></div>
>会员中心</Button <!-- #TODO 后续增加 -->
<!-- <div class="icon-list flex flex-j-sb" >
<div class="icon-item" :key="index" @click="entryControl(item)" v-for="(item,index) in recentList">
<div class="value">
{{ item.value}}
</div>
<div class="label">
{{ item.label}}
</div>
</div>
</div> -->
</div>
<div v-else class="flex flex-a-c ">
<div class="btns" @click="$router.push('login')" shape="circle"
>登录</div
>
<div class="btns sign-up" @click="$router.push('signUp')" shape="circle"
>注册</div
> >
</div> </div>
<div v-else>
<Button class="btns" @click="$router.push('login')" shape="circle" <div class="gray-line"></div>
>请登录</Button <div class="icon-list flex flex-j-sb" >
> <div class="icon-item" @click="entryControl(item)" :key="index" v-for="(item, index) in entranceList">
<img class="icon" :src="require(`@/assets/iconfont/${item.icon}.png`)">
<div>
{{ item.label }}
</div>
</div>
</div> </div>
</div> <div class="icon-list flex flex-j-sb" >
<div class="shop-msg"> <div class="icon-item" :key="index" @click="entryControl(item)" v-for="(item, index) in appendList">
<div> <img class="icon" :src="require(`@/assets/iconfont/${item.icon}.png`)">
<span>常见问题</span> <div>
<ul class="article-list"> {{ item.label }}
<li </div>
class="ellipsis" </div>
:alt="article.title"
v-for="(article, index) in articleList"
:key="index"
@click="goArticle(article.id)"
>
{{ article.title }}
</li>
</ul>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</template> </template>
<script> <script>
import { articleList } from "@/api/common.js";
import storage from "@/plugins/storage"; import storage from "@/plugins/storage";
export default { export default {
name: "modelCarousel", name: "modelCarousel",
@@ -69,60 +87,253 @@ export default {
data() { data() {
return { return {
config: require("@/config"), config: require("@/config"),
defaultAvatar: require("@/assets/images/default.png"),
userInfo: {}, // 用户信息 userInfo: {}, // 用户信息
articleList: [], // 常见问题 entranceList: [
params: { {
// 请求常见问题参数 icon: "collage",
pageNumber: 1, label: "宝贝收藏",
pageSize: 5, path: "/home/Favorites"
type: "ANNOUNCEMENT", },
sort: "sort", {
}, icon: "shop",
label: "收藏店铺",
path: "/home/Favorites?type=STORE"
},
{
icon: "carts",
label: "购物车",
path: "/cart"
},
{
icon: "story",
label: "我的足迹",
path: "/home/MyTracks"
},
],
appendList: [
{
icon: "support",
label: "帮助中心",
path: "/article"
},
{
icon: "feedback",
label: "我的评论",
path: "/home/CommentList"
},
{
icon: "notice",
label: "收货地址",
path: "/home/MyAddress"
},
{
icon: "notification",
label: "我的消息",
path: "/home/MsgList"
},
],
recentList: [
{
value: "0",
label: "购物车"
},
{
value: "0",
label: "待收货"
},
{
value: "0",
label: "待发货"
},
{
value: "0",
label: "代付款"
},
],
}; };
}, },
methods: { methods: {
getArticleList() { // 快捷跳转中心
// 获取常见问题列表 entryControl(val) {
articleList(this.params).then((res) => { console.log("val",val)
if (res.success) { let url = this.$router.resolve(val.path);
this.articleList = res.result.records; window.open(url.href, '_blank');
}
});
},
goArticle(id) {
// 跳转文章详情
let routeUrl = this.$router.resolve({
path: "/article",
query: { id },
});
window.open(routeUrl.href, "_blank");
}, },
}, },
mounted() { mounted() {
if (storage.getItem("userInfo")) if (storage.getItem("userInfo"))
this.userInfo = JSON.parse(storage.getItem("userInfo")); this.userInfo = JSON.parse(storage.getItem("userInfo"));
this.getArticleList();
}, },
}; };
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.label {
font-size: 12px;
font-weight: normal;
line-height: 14px;
text-align: center;
letter-spacing: 0px;
color: #666666;
}
.swiper-img {
overflow: hidden;
width: 637px;
height: 329.9px;
}
.icon-list {
width: 216px
}
.icon-list:nth-last-of-type(1) {
margin-top: 20px;
}
.hot-box {
margin-top: 35px;
width: 216px;
}
.hot-tag {
margin-right: 6px;
width: 36px;
height: 18px;
border-radius: 4px;
opacity: 1;
font-size: 12px;
border: 1px solid $theme_color;
color: $theme_color;
text-align: center;
line-height: 18px;
}
.gray-line {
width: 216px;
height: 1px;
border: 1px solid #E5E5E5;
margin-bottom: 13px;
}
.icon {
width: 20px !important;
height: 20px !important;
margin-bottom: 7px;
}
.icon-item {
cursor: pointer;
text-align: center;
>div {
font-size: 11px;
font-weight: normal;
line-height: 13px;
text-align: center;
letter-spacing: 0px;
color: #666666;
}
>.value {
font-size: 14px;
line-height: 17px;
text-align: center;
font-weight: 400;
letter-spacing: 0px;
margin-bottom: 3px;
color: $theme_color;
}
>.label {
font-weight: 400;
font-size: 12px;
line-height: 14px;
text-align: center;
letter-spacing: 0px;
color: #666666;
margin-bottom: 13px;
}
}
.model-carousel { .model-carousel {
width: 1200px; width: 1200px;
height: 340px; height: 340px;
overflow: hidden; overflow: hidden;
} }
.hover-pointer {
//display: block;
//width: 100%;
//height: 100%;
width: 637px;
height: 329.9px;
object-fit: cover;
border-radius: 10px;
}
.welcome {
font-size: 14px;
font-weight: normal;
line-height: 17px;
text-align: center;
letter-spacing: 0px;
color: #333333;
}
.hr {
width: 216px;
height: 1px;
border: 1px solid #E5E5E5;
}
.btns { .btns {
background-color:#363634 ; margin-top: 21px;
line-height:30px; margin-bottom: 13px;
color: white !important; width: 77px;
height: 28px;
border-radius: 14px;
opacity: 1;
font-size: 13px;
font-weight: normal;
line-height: 28px;
text-align: center;
cursor: pointer;
letter-spacing: 0px;
color: #FFFFFF;
background: $theme_color;
} }
.btns:hover {
background-color: #363634; .sign-up {
line-height:32px !important; background: #F39519;
color: #e5d790 !important; margin-left: 10px;
} }
.avatar {
margin-bottom: 13px;
}
.user-face {
margin-bottom: 12px;
width: 70px;
height: 70px;
border-radius: 50%;
}
/* 导航主体 */ /* 导航主体 */
.nav-body { .nav-body {
width: 1200px; width: 1200px;
@@ -131,67 +342,80 @@ export default {
} }
.nav-side { .nav-side {
height: 100%; height: 334px;
width: 200px; width: 263.2px;
border-bottom-left-radius: 10px;
border-bottom-right-radius: 10px;
float: left; float: left;
padding: 0px; padding: 0px;
color: #fff; color: #fff;
background-color: #6e6568; // background-color: #6e6568;
} }
/*导航内容*/ /*导航内容*/
.nav-content { .nav-content {
width: 790px; width: 637px;
overflow: hidden; margin-left: 10.8px;
margin-top: 10px;
height: 333.9px;
float: left; float: left;
position: relative; position: relative;
} }
.nav-right { .nav-right {
float: left; float: left;
width: 210px; margin-top: 10px;
width: 263.2px;
margin-left: 10px;
border-radius: 10px;
background: #FFFFFF;
.person-msg { .person-msg {
cursor: pointer;
height: 333px;
display: flex; display: flex;
align-items: center; align-items: center;
flex-direction: column; flex-direction: column;
margin: 20px auto; padding-top: 28px;
button { padding-bottom: 25px;
height: 30px !important;
margin-top: 10px; >.user-box{
line-height: 30px; text-align: center;
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 { .shop-msg {
div { div {
width: 100%; width: 100%;
margin: 10px 27px; margin: 10px 27px;
span { span {
cursor: pointer; cursor: pointer;
text-align: center; text-align: center;
font-weight: bold; font-weight: bold;
margin-left: 5px; margin-left: 5px;
} }
span:nth-child(1) { span:nth-child(1) {
@include content_color($theme_color); @include content_color($theme_color);
margin-left: 0; margin-left: 0;
} }
span:nth-child(2) { span:nth-child(2) {
font-weight: normal; font-weight: normal;
} }
span:nth-child(3):hover { span:nth-child(3):hover {
color: $theme_color; color: $theme_color;
} }
} }
ul { ul {
li { li {
cursor: pointer; cursor: pointer;
@@ -199,6 +423,7 @@ export default {
color: #999395; color: #999395;
width: 150px; width: 150px;
font-size: 12px; font-size: 12px;
&:hover { &:hover {
color: $theme_color; color: $theme_color;
} }

View File

@@ -65,12 +65,12 @@ export default {
handleScrollx(){ handleScrollx(){
// console.log('滚动高度',window.pageYOffset) // 获取滚动条的高度 // console.log('滚动高度',window.pageYOffset) // 获取滚动条的高度
// console.log(this.$refs.obtain.getBoundingClientRect().top) //获取到距离顶部的距离 // console.log(this.$refs.obtain.getBoundingClientRect().top) //获取到距离顶部的距离
this.scrollHieght = Number(window.pageYOffset);//获取到距离顶部的距离 // this.scrollHieght = Number(window.pageYOffset);//获取到距离顶部的距离
this.scrollTops = Number(this.$refs.obtain.getBoundingClientRect().top); // 获取到距离顶部的距离 // this.scrollTops = Number(this.$refs.obtain.getBoundingClientRect().top); // 获取到距离顶部的距离
this.topSearchShow = true; // 展示图钉 // this.topSearchShow = true; // 展示图钉
if(this.scrollTops < -660){ // 超过隐藏 // if(this.scrollTops < -660){ // 超过隐藏
this.topSearchShow = false; // this.topSearchShow = false;
} // }
}, },
toguid(path,id){ toguid(path,id){
var path =path; var path =path;
@@ -81,7 +81,7 @@ export default {
change(status){ //获取是否获取到图钉 change(status){ //获取是否获取到图钉
this.open = status this.open = status
}, },
gotoDemo(){ // 跳转到demo的位置 gotoDemo(){ // 跳转到demo的位置
if(this.open){ // 获取到图钉之后在跳转当前位置 if(this.open){ // 获取到图钉之后在跳转当前位置
document.querySelector("#demo").scrollIntoView(true); document.querySelector("#demo").scrollIntoView(true);
} }

View File

@@ -0,0 +1,228 @@
<template>
<div class="model" v-if="data">
<div class="for-your">{{ data.options.title }}</div>
<div class="flex card">
<div class="left">
<img :src="data.options.data.image.src" alt="" />
</div>
<div class="right flex">
<!-- 商品区 -->
<div class="goods-list">
<div
class="goods-item"
:key="index"
v-for="(item, index) in data.options.data.list"
@click="linkTo(item.url)"
>
<div>
<div class="goods-name">{{ item.title }}</div>
<div class="goods-desc">{{ item.desc }}</div>
</div>
<img class="goods-img" :src="item.img" alt="" />
</div>
</div>
<!-- 热卖区 -->
<div class="hot-list">
<div class="hot-title">{{ data.options.data.hot.title }}</div>
<div
class="hot-item flex flex-a-c"
v-for="(item, index) in data.options.data.hot.list"
:key="index"
@click="linkTo(item.url)"
>
<img :src="item.img" alt="" />
<div class="hot-goods">
<div class="hot-goods-title">{{ item.title }}</div>
<div>
<div class="hot-price">{{ item.price | unitPrice }}</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: "forYour",
data() {
return {
current: "",
};
},
props: {
data: {
type: Object,
default: {},
},
},
mounted() {},
methods: {},
};
</script>
<style scoped lang="scss">
.goods-list {
display: flex;
width: 558px;
flex-wrap: wrap;
}
.goods-item {
width: 278px;
height: 277px;
text-align: center;
box-sizing: border-box;
cursor: pointer;
border-right: 1.4px solid #e2e2e2;
&:nth-of-type(3) {
border-top: 1.4px solid #e2e2e2;
}
&:nth-of-type(4) {
border-top: 1.4px solid #e2e2e2;
}
&:hover {
/deep/ .goods-name {
color: $theme_color;
}
/deep/ .goods-desc {
color: $theme_color;
}
}
}
.goods-name {
margin-top: 23px;
font-size: 25px;
font-weight: normal;
line-height: 30px;
text-align: center;
letter-spacing: 0px;
color: #333333;
}
.goods-img {
width: 190px;
height: 156px;
margin-top: 19px;
border-radius: 10px;
}
.goods-desc {
font-size: 14px;
font-weight: normal;
line-height: 17px;
text-align: center;
margin-top: 11px;
letter-spacing: 0px;
color: #333333;
}
.for-your {
font-size: 35px;
font-weight: normal;
line-height: 42px;
text-align: center;
letter-spacing: 0px;
margin-bottom: 32px;
color: #333333;
}
.card,
.right-card {
opacity: 1;
background: #ffffff;
border-radius: 10px;
position: relative;
box-shadow: 0px 1px 13px 0px #E5E5E5;
&:hover {
.setup-box {
display: block;
}
}
}
.modal-tab-bar {
> .flex {
align-items: center;
margin: 10px 0;
}
}
.draggable {
> .flex {
align-items: center;
}
}
.left {
width: 346px;
height: 554px;
border-radius: 9.8px 0px 0px 9.8px;
> img {
max-width: 100%;
height: 100%;
}
}
.right {
width: 839px;
height: 554px;
border-radius: 0px 9.8px 9.8px 0px;
}
.hot-list {
width: 279px;
}
.hot-title {
margin-left: 25px;
line-height: 63px;
font-size: 17px;
font-weight: normal;
letter-spacing: 0px;
color: #333333;
height: 63px;
}
.hot-item {
cursor: pointer;
box-sizing: border-box;
border-top: 1.4px solid #e2e2e2;
height: 122px;
padding:0 14px;
align-items: center;
&:hover {
> .hot-goods {
> .hot-goods-title {
color: $theme_color;
}
}
}
> img {
width: 76.3px;
height: 77.7px;
}
}
.hot-goods {
margin-left: 14px;
}
.hot-goods-title {
font-size: 13px;
font-weight: normal;
line-height: 16px;
letter-spacing: 0px;
color: #333333;
}
.hot-price {
margin-top: 10.3px;
font-size: 24px;
font-weight: normal;
line-height: 29px;
letter-spacing: 0px;
color: $theme_color;
}
</style>

View File

@@ -0,0 +1,205 @@
<template>
<div class="goods-type-wrapper">
<div class="flex goods-type-line">
<div class="goods-type-title">{{ paramData.options.title }}</div>
<div class="flex goods-type-labels">
<div
:class="{ active: current === item.___index }"
class="goods-type-item"
v-for="(item, index) in paramData.options.labels"
:key="index"
@click="handleClickLabel(item, index)"
>
{{ item.label }}
</div>
</div>
</div>
<!-- 商品部分 -->
<div class="only-goods-list flex-j-sb">
<div
v-if="paramData.options"
class="only-goods-list-item "
v-for="(item, index) in paramData.options.list.filter((client) => {
return client.___index == current;
})"
:key="index"
@click="linkTo(item.url)"
>
<div class="goods-img">
<img :src="item.img" />
</div>
<div>
<div class="goods-name wes-2">{{ item.title }}</div>
<div class="goods-desc">{{ item.desc }}</div>
</div>
<div class="goods-price">
{{ item.price | unitPrice("¥") }}
</div>
<!-- 查看 -->
<div class="white-shadow">
<div class="search">去查看</div>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: "goods",
props: {
paramData: {
type: Object,
default: {},
},
},
data() {
return {
current: "",
};
},
watch: {},
mounted() {
this.current = this.paramData.options.labels[0].___index;
},
methods: {
// 筛选出当前分类下的商品
handleClickLabel(val, index) {
this.current = index;
},
},
};
</script>
<style scoped lang="scss">
.white-shadow {
width: 287px;
height: 122px;
border-radius: 0px 0px 10px 10px;
opacity: 1;
position: absolute;
bottom: 0;
left: 0;
opacity: 0;
display: flex;
justify-content: center;
transition: 0.35s;
align-items: center;
background: linear-gradient(
180deg,
rgba(252, 252, 252, 0.58) -50%,
#ffffff 99%
);
}
.search {
width: 143px;
height: 45px;
border-radius: 22.5px;
opacity: 1;
font-size: 20px;
font-weight: normal;
text-align: center;
letter-spacing: 0px;
line-height: 45px;
color: #ffffff;
background: $theme_color;
}
.only-goods-list{
display: flex;
flex-wrap: wrap;
}
.only-goods-list-item {
padding-top: 30px;
width: 287px;
height: 343.7px;
border-radius: 9.8px;
opacity: 1;
margin-bottom: 14.3px;
cursor: pointer;
background: #ffffff;
transition: all 0.4s ease;
box-shadow: 0px 1px 13px 0px #e5e5e5;
position: relative;
&:hover {
transform: translateY(-5px);
box-shadow: 0px 1px 14px 0px #c5c5c5;
> .white-shadow {
opacity: 1;
}
> .goods-img {
> img {
opacity: 0.8 !important;
}
}
}
}
.goods-img {
margin-bottom: 9.8px;
text-align: center;
> img {
transition: all 0.4s ease;
width: auto;
max-height: 183px;
}
}
.goods-name {
font-size: 18px;
font-weight: normal;
line-height: 22px;
text-align: center;
letter-spacing: 0px;
width: 200px;
margin: 0 auto 12.4px auto;
color: #333333;
-webkit-text-stroke: #979797 0.7px; /* 浏览器可能不支持 */
}
.goods-desc {
font-size: 14px;
font-weight: normal;
line-height: 17px;
text-align: center;
letter-spacing: 0px;
margin-bottom: 12.4px;
color: #666666;
-webkit-text-stroke: #979797 0.7px; /* 浏览器可能不支持 */
}
.goods-price {
font-size: 25.2px;
font-weight: normal;
line-height: 30px;
text-align: center;
letter-spacing: 0px;
color: #f31947;
-webkit-text-stroke: #979797 0.7px; /* 浏览器可能不支持 */
}
.goods-type-line {
justify-content: space-between;
align-items: center;
margin-bottom: 25px;
}
.goods-type-title {
font-size: 31px;
font-weight: normal;
line-height: 37px;
letter-spacing: 0px;
color: #333333;
}
.active {
color: #f31947;
}
.goods-type-labels {
cursor: pointer;
font-size: 21px;
font-weight: normal;
line-height: 25px;
letter-spacing: 0px;
}
.goods-type-item {
margin-left: 28px;
}
</style>

View File

@@ -0,0 +1,53 @@
<template>
<div class="mix-model">
<!-- 左侧 -->
<div class="left-card">
<left :data="data" />
</div>
<!-- 右侧 -->
<div class="right-card">
<right :data="data" />
</div>
</div>
</template>
<script>
import left from './mixs/mix-goods'
import right from './mixs/mix-brand'
export default {
name: "mixModel",
data() {
return {}
},
props: {
data: {
type: Object,
default: {}
}
},
components: {
left,
right
},
mounted() {
},
methods: {}
}
</script>
<style scoped lang="scss">
.mix-model{
display: flex;
justify-content:space-between;
}
.left-card,.right-card{
width: 584px;
height: 344px;
border-radius: 10px;
opacity: 1;
background: #FFFFFF;
box-shadow: 0px 1px 13px 0px #E5E5E5;
position: relative;
}
</style>

View File

@@ -0,0 +1,132 @@
<template>
<div class="flex" v-if="data.options.right.model == 'brand'">
<div class="left-side" @click="linkTo(data.options.right.data.image.url)">
<img :src="data.options.right.data.image.src" alt="">
</div>
<div class="right-side">
<div class="badge-box flex">
<div class="round">
<Icon type="ios-arrow-forward" />
</div>
</div>
<div class="flex goods-list">
<div class="goods-item flex" @click="linkTo(item.url)" :key="index" v-for="(item,index) in data.options.right.data.list">
<div class="goods-thumbnail">
<img :src="item.img" alt="">
</div>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: "mix-goods",
data() {
return {}
},
props: {
data: {
type: Object,
default: {}
}
},
components: {},
mounted() {
},
methods: {}
}
</script>
<style scoped lang="scss">
.right-side{
width: 330px;
}
.goods-detail-title{
font-size: 13px;
font-weight: normal;
line-height: 16px;
text-align: center;
letter-spacing: 0px;
color: #333333;
}
.goods-detail-price{
font-size: 14px;
font-weight: normal;
line-height: 17px;
letter-spacing: 0px;
color: $theme_color;
margin-top: 8px;
margin-bottom:10px;
}
.goods-thumbnail{
margin-left: 7px;
display: flex;
align-items: center;
>img{
width:90px;
height: 90px;
}
}
.badge-box{
margin-top: 33px;
justify-content:right;
>.round{
width: 17.5px;
height: 17.5px;
opacity: 1;
border-radius: 50%;
text-align: center;
line-height: 17.5px;
border: 0.7px solid #333333;
margin-right: 17.5px;
}
}
.goods-list{
width: 330px;
flex-wrap: wrap;
justify-content:space-between;
padding: 0 16px;
}
.goods-item{
display: flex;
align-items: center;
justify-content: center;
width:50%;
height: 85px;
border-radius: 9.8px;
opacity: 1;
transition: .35s;
background: #FFFFFF;
margin-bottom:9px;
}
.left-side {
>img{
width: 254px;
height: 344px;
border-radius: 9.8px 0px 0px 9.8px;
opacity: 1;
}
}
.badge {
width: 50px;
height: 27px;
line-height:27px;
border-radius: 13.3px 0px 0px 13.3px;
opacity: 1;
background: #F31947;
font-size: 12.6px;
font-weight: normal;
text-align: center;
letter-spacing: 0px;
color: #FFFFFF;
margin-top: 26px;
margin-bottom:17px;
}
</style>

View File

@@ -0,0 +1,127 @@
<template>
<div class="flex" v-if="data.options.left.model == 'goods'">
<div class="left-side" @click="linkTo(data.options.right.data.image.url)">
<img :src="data.options.left.data.image.src" alt="">
</div>
<div class="right-side">
<div class="badge-box flex">
<div class="badge" @click="linkTo(data.options.right.data.image.url)">
{{data.options.left.data.badge.label}}
</div>
</div>
<div class="flex goods-list">
<div class="goods-item flex" @click="linkTo(item.url)" :key="index" v-for="(item,index) in data.options.left.data.list">
<div class="goods-thumbnail">
<img :src="item.img" alt="">
</div>
<div class="goods-detail">
<div class="goods-detail-title">{{item.title}}</div>
<div class="goods-detail-price">{{item.price | unitPrice('¥')}}</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: "mix-goods",
data() {
return {}
},
props: {
data: {
type: Object,
default: {}
}
},
components: {},
mounted() {
},
methods: {}
}
</script>
<style scoped lang="scss">
.right-side{
width: 387px;
}
.goods-detail-title{
font-size: 13px;
font-weight: normal;
line-height: 16px;
text-align: center;
letter-spacing: 0px;
color: #333333;
}
.goods-detail-price{
font-size: 14px;
font-weight: normal;
line-height: 17px;
letter-spacing: 0px;
color: #F31947;
margin-top: 8px;
margin-bottom:10px;
}
.goods-thumbnail{
margin-left: 7px;
display: flex;
align-items: center;
>img{
width:90px;
height: 90px;
}
}
.badge-box{
justify-content:right;
}
.goods-list{
width: 387px;
flex-wrap: wrap;
justify-content:space-between;
padding: 0 16px;
}
.goods-item{
cursor: pointer;
display: flex;
align-items: center;
width: 173.6px;
height: 119px;
border-radius: 9.8px;
opacity: 1;
transition: .35s;
background: #FFFFFF;
margin-bottom:9px;
&:hover{
box-shadow: 0px 1px 6px 0px #E5E5E5;
}
}
.left-side {
>img{
border-radius: 10px 0px 0px 10px;
display: block;
width: 196.7px;
height: 343.7px;
}
}
.badge {
width: 50px;
height: 27px;
line-height:27px;
border-radius: 13.3px 0px 0px 13.3px;
opacity: 1;
background: #F31947;
font-size: 12.6px;
font-weight: normal;
text-align: center;
letter-spacing: 0px;
color: #FFFFFF;
margin-top: 26px;
margin-bottom:17px;
}
</style>

View File

@@ -0,0 +1,36 @@
<template>
<div class="line flex flex-a-c flex-j-sb">
<div class="column" v-for="(item,index) in data.options.list" :key="index">
<img :src="item.img" class="three-column-img">
</div>
</div>
</template>
<script>
export default {
name: "oneRowThreeColumns",
props: {
data: {
type: Object,
default: {}
}
},
data () {
return {
};
},
methods: {}
}
</script>
<style scoped lang="scss">
.column{
width: 385px;
height: 165px;
>img{
width: 100%;
height: 100%;
}
}
</style>

View File

@@ -0,0 +1,186 @@
<template>
<div class="goods-type-wrapper">
<!-- 商品部分 -->
<div class="only-goods-list flex" >
<div
class="only-goods-list-item"
v-for="(item, index) in data.options.list"
:key="index"
@click="handleClick(item)"
>
<div>
<div class="goods-name wes-2">{{ item.title }}</div>
<div class="goods-desc">{{ item.desc }}</div>
</div>
<div class="goods-img">
<img :src="item.img" />
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: "onlyGoodsList",
props: {
data: {
type: Object,
default: {},
},
},
data() {
return {
flag:false,
tabIndex:0,
current: 0,
showModal: false,
selected: {}, // 已选数据
picModelFlag: false,
};
},
mounted(){
},
methods: {
handleClick(val){
this.linkTo(val.url)
},
},
};
</script>
<style scoped lang="scss">
.goods-type-wrapper {
position: relative;
}
.del-btn{
margin-left:10px;
}
.tab-bar {
margin-bottom: 20px;
}
.draggable {
padding: 10px;
border-bottom: 1px solid #ededed;
transition: 0.35s;
&:hover {
background-color: #ededed;
}
}
.column-config {
margin-left: 10px;
> * {
margin: 4px;
}
}
.column-img {
width: 100px;
height: 100px;
}
.add-goods {
margin-left: 20px;
margin-bottom: 10px;
}
.only-goods-list {
position: relative;
flex-wrap: wrap;
justify-content: space-between;
&:hover {
> .setup-box {
display: block;
}
}
}
.column-goods-config {
flex: 2;
align-items: center;
justify-content: space-between;
}
.only-goods-list-item {
padding-top: 34.8px;
margin-bottom: 14.3px;
width: 287px;
height: 343.7px;
border-radius: 9.8px;
opacity: 1;
cursor: pointer;
background: #ffffff;
transition: 0.35s;
box-shadow: 0px 1px 13px 0px #e5e5e5;
&:hover {
box-shadow: 0px 1px 14px 0px #c5c5c5;
transform: translateY(-2px);
}
}
.goods-img {
text-align: center;
> img {
width: auto;
max-height: 183px;
}
}
.goods-name {
margin-bottom: 11.9px;
font-size: 25px;
font-weight: normal;
line-height: 30px;
text-align: center;
letter-spacing: 0px;
color: #333333;
-webkit-text-stroke: #979797 0.7px; /* 浏览器可能不支持 */
}
.goods-desc {
margin-bottom: 30px;
font-size: 16px;
font-weight: normal;
line-height: 19px;
text-align: center;
letter-spacing: 0px;
color: #666666;
-webkit-text-stroke: #979797 0.7px; /* 浏览器可能不支持 */
}
.goods-price {
font-size: 25.2px;
font-weight: normal;
line-height: 30px;
text-align: center;
letter-spacing: 0px;
color: $theme_color;
-webkit-text-stroke: #979797 0.7px; /* 浏览器可能不支持 */
}
.goods-type-line {
justify-content: space-between;
align-items: center;
margin-bottom: 25px;
}
.goods-type-title {
font-size: 31px;
font-weight: normal;
line-height: 37px;
letter-spacing: 0px;
color: #333333;
}
.active {
color: $theme_color;
}
.goods-type-labels {
font-size: 21px;
font-weight: normal;
line-height: 25px;
letter-spacing: 0px;
}
.goods-type-item {
margin-left: 28px;
}
</style>

View File

@@ -1,114 +1,94 @@
<template> <template>
<div class="lili-map"> <div class="map">
<Modal v-model="showMap" title="选择地址" width="800">
<div class="address">{{ addrContent.address }}</div> <div class="address">{{ addrContent.address }}</div>
<div id="map-container"></div> <div id="map-container"></div>
<div class="search-con">
<Input placeholder="输入关键字搜索" id="input-map" v-model="mapSearch" />
<ul>
<li v-for="(tip, index) in tips" :key="index" @click="selectAddr(tip.location)">
<p>{{ tip.name }}</p>
<p>{{ tip.district + tip.address }}</p>
</li>
</ul>
</div>
<div slot="footer" class="footer">
<Button type="primary" :loading="loading" @click="ok">确定</Button>
</div>
<div class="search-con">
<Input
placeholder="输入关键字搜索"
id="input-map"
v-model="mapSearch"
/>
<ul>
<li
v-for="(tip, index) in tips"
:key="index"
@click="selectAddr(tip.location)"
>
<p>{{ tip.name }}</p>
<p>{{ tip.district + tip.address }}</p>
</li>
</ul>
</div>
<div slot="footer">
<Button type="default" @click="showMap = false">取消</Button>
<Button type="primary" :loading="loading" @click="ok">确定</Button>
</div>
</Modal>
</div> </div>
</template> </template>
<script> <script>
import AMapLoader from '@amap/amap-jsapi-loader'; import AMapLoader from "@amap/amap-jsapi-loader";
import { handleRegion } from '@/api/address.js'; import { handleRegion } from "@/api/address.js";
const config = require('@/config/index')
export default { export default {
name: 'map', name: "map",
props: { data() {
useApi: {
default: true,
type: Boolean
}
},
data () {
return { return {
config:require('@/config'), config,
showMap: false, // 展示地图 showMap: false, // 地图显隐
mapSearch: '', // 地图搜索 mapSearch: "", // 地图搜索
map: null, // 初始化地图 map: null, // 初始化地图
autoComplete: null, // 初始化搜索方法 autoComplete: null, // 初始化搜索方法
geocoder: null, // 初始化地理、坐标转化 geocoder: null, // 初始化地理、坐标转化
positionPicker: null, // 地图拖拽选点 positionPicker: null, // 地图拖拽选点
tips: [], // 搜索关键字列表 tips: [], //搜索关键字列表
addrContent: {}, // 回显地址信息 addrContent: {}, // 回显地址信息
loading: false // 加载状态 loading: false, // 加载状态
}; };
}, },
watch: { watch: {
// 监听搜索框搜索地图
mapSearch: function (val) { mapSearch: function (val) {
this.searchOfMap(val); this.searchOfMap(val);
} },
}, },
methods: { methods: {
ok () { ok() {
// 确定选择
this.loading = true; if (this.addrContent && this.addrContent.regeocode) {
const address = this.addrContent.address; const params = {
const township = this.addrContent.regeocode.addressComponent.township; cityCode: this.addrContent.regeocode.addressComponent.citycode,
const index = address.indexOf(township) + township.length; townName: this.addrContent.regeocode.addressComponent.township,
this.addrContent.detail = address.substring(index); };
const params = {
cityCode: this.addrContent.regeocode.addressComponent.citycode,
townName: this.addrContent.regeocode.addressComponent.township
};
if (this.useApi) {
handleRegion(params).then((res) => { handleRegion(params).then((res) => {
this.loading = false;
if (res.success) { if (res.success) {
this.showMap = false; this.addrContent.addr = res.result.name.replace(/,/g, " ");
this.addrContent.addr = res.result.name.replace(/,/g, ' ');
this.addrContent.addrId = res.result.id; this.addrContent.addrId = res.result.id;
this.$emit('getAddress', this.addrContent); this.loading = false;
this.$emit("getAddress", this.addrContent);
} }
}); });
} else { } else {
this.loading = false; this.$Message.error('未获取到坐标信息请查看高德API配置是否正确')
this.showMap = false;
this.$emit('getAddress', this.addrContent);
} }
}, },
init () { // 初始化地图 init() {
AMapLoader.load({ AMapLoader.load({
key: this.config.aMapKey, // 申请好的Web端开发者Key首次调用 load 时必填 key: this.config.aMapKey, // 申请好的Web端开发者Key首次调用 load 时必填
version: '', // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15 version: "", // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
plugins: [ plugins: [
'AMap.ToolBar', "AMap.ToolBar",
'AMap.Autocomplete', "AMap.Autocomplete",
'AMap.PlaceSearch', "AMap.PlaceSearch",
'AMap.Geolocation', "AMap.Geolocation",
'AMap.Geocoder' "AMap.Geocoder",
], // 需要使用的的插件列表,如比例尺'AMap.Scale'等 ], // 需要使用的的插件列表,如比例尺'AMap.Scale'等
AMapUI: { AMapUI: {
// 是否加载 AMapUI缺省不加载 // 是否加载 AMapUI缺省不加载
version: '1.1', // AMapUI 缺省 1.1 version: "1.1", // AMapUI 缺省 1.1
plugins: ['misc/PositionPicker'] // 需要加载的 AMapUI ui插件 plugins: ["misc/PositionPicker"], // 需要加载的 AMapUI ui插件
} },
}) })
.then((AMap) => { .then((AMap) => {
let that = this; let that = this;
this.map = new AMap.Map('map-container', { this.map = new AMap.Map("map-container", {
zoom: 12 zoom: 12,
}); });
that.map.addControl(new AMap.ToolBar()); that.map.addControl(new AMap.ToolBar());
that.map.addControl(new AMap.Autocomplete()); that.map.addControl(new AMap.Autocomplete());
@@ -117,15 +97,15 @@ export default {
// 实例化Autocomplete // 实例化Autocomplete
let autoOptions = { let autoOptions = {
city: '全国' city: "全国",
}; };
that.autoComplete = new AMap.Autocomplete(autoOptions); // 搜索 that.autoComplete = new AMap.Autocomplete(autoOptions); // 搜索
that.geocoder = new AMap.Geocoder(autoOptions); that.geocoder = new AMap.Geocoder(autoOptions);
that.positionPicker = new AMapUI.PositionPicker({ that.positionPicker = new AMapUI.PositionPicker({
// 拖拽选点 // 拖拽选点
mode: 'dragMap', mode: "dragMap",
map: that.map map: that.map,
}); });
that.positionPicker.start(); that.positionPicker.start();
/** /**
@@ -134,38 +114,37 @@ export default {
* 需要字段可以查找 * 需要字段可以查找
* *
*/ */
that.positionPicker.on('success', function (positionResult) { that.positionPicker.on("success", function (positionResult) {
// console.log(positionResult);
that.addrContent = positionResult; that.addrContent = positionResult;
}); });
}) })
.catch((e) => {}); .catch((e) => { });
}, },
searchOfMap (val) { searchOfMap(val) {
// 地图搜索 // 地图搜索
let that = this; let that = this;
this.autoComplete.search(val, function (status, result) { this.autoComplete.search(val, function (status, result) {
// 搜索成功时result即是对应的匹配数据 // 搜索成功时result即是对应的匹配数据
if (status === 'complete' && result.info === 'OK') { if (status == "complete" && result.info == "OK") {
that.tips = result.tips; that.tips = result.tips;
} else { } else {
that.tips = []; that.tips = [];
} }
}); });
}, },
selectAddr (location) { selectAddr(location) {
// 选择坐标 // 选择坐标
if (!location) { if (!location) {
this.$Message.warning('请选择正确点位'); this.$Message.warning("请选择正确点位");
return false; return false;
} }
const lnglat = [location.lng, location.lat]; const lnglat = [location.lng, location.lat];
this.positionPicker.start(lnglat); this.positionPicker.start(lnglat);
} },
}, },
mounted () { mounted() {
this.init(); this.init();
} },
}; };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@@ -179,16 +158,20 @@ export default {
right: 20px; right: 20px;
top: 64px; top: 64px;
width: 260px; width: 260px;
ul { ul {
width: 260px; width: 260px;
height: 400px; height: 360px;
overflow: scroll; overflow: scroll;
li { li {
padding: 5px; padding: 5px;
p:nth-child(2) { p:nth-child(2) {
color: #999; color: #999;
font-size: 12px; font-size: 12px;
} }
&:hover { &:hover {
background-color: #eee; background-color: #eee;
cursor: pointer; cursor: pointer;
@@ -199,6 +182,12 @@ export default {
.address { .address {
margin-bottom: 10px; margin-bottom: 10px;
// color: $theme_color;
font-weight: bold; font-weight: bold;
} }
.footer {
text-align: right;
margin: 10px 0;
}
</style> </style>

View File

@@ -0,0 +1,155 @@
<template>
<Modal width="800" footer-hide v-model="enableMap">
<RadioGroup @on-change="changeMap" v-model="mapDefault" type="button">
<Radio label="select">级联选择</Radio>
<Radio label="map" v-if="aMapSwitch">高德地图</Radio>
</RadioGroup>
<div>
<div v-if="mapDefault === 'select'">
<div class="selector">
<div class="selector-item" v-for="(plant, plantIndex) in Object.keys(data)" :key="plantIndex">
<div :class="{ 'active': chiosend[plantIndex].id == item.id }" v-for="(item, index) in data[plant]"
:key="index"
@click="init(item, plantIndex != Object.keys(data).length - 1 ? Object.keys(data)[plantIndex + 1] : 0, plantIndex)"
class="map-item">
{{ item.name }}
</div>
</div>
</div>
<div class="footer">
<Button type="primary" @click="finished">确定</Button>
</div>
</div>
<mapping v-if="mapDefault === 'map'" ref="map" @getAddress="getAddress" />
</div>
</Modal>
</template>
<script>
import { aMapSwitch } from '@/config/index'
import mapping from "@/components/map/index.vue";
import * as API_Setup from "@/api/common.js";
export default {
components: { mapping },
data() {
return {
aMapSwitch,
enableMap: false,
mapDefault: "select",
data: {
province: [], //省
city: [], //市
area: [], //区
street: [], //街道
},
chiosend: [],
};
},
mounted() {
this.chiosend = new Array(4).fill("");
},
methods: {
open() {
this.enableMap = true
this.init({ id: 0 }, 'province');
},
changeMap(val) {
this.mapDefault = val
},
init(val, level = 'province', index) {
if (level == 0) {
// 说明选择到了街道将街道id存入数组
this.chiosend.splice(3, 1, val);
}
else {
API_Setup.getRegion(val.id).then((res) => {
if (res.result.length && val.id !== 0) {
this.chiosend[index] = val
}
else if(!res.result.length){
this.chiosend[index] = val
}
this.data[level] = res.result;
if (level == 'city') {
this.data.area = []
this.data.street = []
this.chiosend.splice(1, 3, "","","");
}
if (level == 'area') {
this.data.street = []
this.chiosend.splice(2, 2, "","");
}
if (level == 'street') {
this.chiosend.splice(3, 1, "");
}
});
}
},
getAddress(center) {
this.$emit('callback', {
type: this.mapDefault,
data: center
})
this.enableMap = false;
},
// 选择完成
finished() {
if(!this.chiosend[0]){
this.$Message.error("请选择地址")
return
}
const params = this.chiosend.filter((item) => item!=="" && item.value !== "");
this.enableMap = false;
this.$emit('callback', {
type: this.mapDefault,
data: params
})
},
},
}
</script>
<style lang="scss" scoped>
.selector {
height: 400px;
padding: 10px 0;
display: flex;
}
.selector-item {
width: 100%;
flex: 1;
overflow: auto;
}
.map-item {
width: 100%;
padding: 10px;
border-bottom: 1px solid #eee;
cursor: pointer;
&:hover {
background: #eee;
}
}
.active {
background: #eee;
}
.footer {
text-align: right;
margin: 10px 0;
}
</style>

View File

@@ -0,0 +1,52 @@
<template>
<div></div>
</template>
<script>
import { getIMDetail } from "@/api/common";
import Storage from "@/plugins/storage";
import { getMemberMsg } from "@/api/login";
export default {
data() {
return {
Storage,
IMLink: "",
};
},
methods: {
// 跳转im客服
async IMService(id, goodsId, skuId) {
// 获取访问Token
let accessToken = Storage.getItem("accessToken");
await this.getIMDetailMethods();
const userInfo = await getMemberMsg();
if (userInfo.success) {
//携带商品Id,在IM可以发送商品信息
if(goodsId && skuId){
window.open(
this.IMLink + "?token=" + accessToken + "&id=" + id || this.storeMsg.storeId + "&goodsId=" + goodsId + "&skuId=" + skuId
);
}else{
window.open(
this.IMLink + "?token=" + accessToken + "&id=" + id || this.storeMsg.storeId
);
}
} else {
this.$Message.error("请登录后再联系客服");
return;
}
},
// 获取im信息
async getIMDetailMethods() {
let res = await getIMDetail();
if (res.success) {
this.IMLink = res.result;
}
},
},
};
</script>
<style lang="scss" scoped></style>

View File

@@ -1,28 +1,29 @@
<template> <template>
<div class="cate-nav"> <div class="cate-nav width_1200_auto" :class="{'fixed-show':useClass == 'fixed-show'}">
<div class="nav-con"> <div class="nav-con" :class="{'background-white':useClass == 'background-white'}">
<div <div
class="all-categories hover-pointer" class="all-categories hover-pointer"
@mouseenter="showFirstLists" @mouseenter="showFirstLists"
@mouseleave="showFirstList = false" @mouseleave="showFirstList = false"
> >
全部商品分类 商品分类
</div> </div>
<ul class="nav-item" v-if="showNavBar"> <ul class="nav-item " v-if="showNavBar">
<li <li
class="nav-lis" class="nav-lis flex flex-a-c flex-j-c"
v-for="(item, index) in navList.list" v-for="(item, index) in navList.list"
:key="index" :key="index"
@click="linkTo(item.url)" @click="linkTo(item.url)"
> >
{{ item.name }} {{ item.name }}
<!-- {{item}} --> <div class="colum" v-if="index !== navList.list.length - 1"></div>
</li> </li>
</ul> </ul>
</div> </div>
<!-- 全部商品分类 --> <!-- 全部商品分类 -->
<div <div
class="cate-list" class="cate-list"
:style="{'top':!showNavBar ?'60px':'46px'}"
v-show="showAlways || showFirstList" v-show="showAlways || showFirstList"
@mouseenter="showFirstList = true" @mouseenter="showFirstList = true"
@mouseleave="showFirstList = false" @mouseleave="showFirstList = false"
@@ -131,6 +132,10 @@ export default {
default: false, default: false,
type: Boolean, type: Boolean,
}, },
useClass:{
type:null,
default:''
}
}, },
data() { data() {
return { return {
@@ -223,46 +228,81 @@ export default {
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.background-white{
background: #fff;
}
.nav-lis:hover { .nav-lis:hover {
color: $theme_color !important; color: $theme_color !important;
cursor: pointer; cursor: pointer;
}
.nav-lis{
width: 103px;
text-align: center;
position: relative;
}
.fixed-show{
margin-top: 0 !important;
>.nav-con{
>.all-categories{
align-items: center !important;
height: 60px;
display: inherit;
justify-content: center;
padding: 0 !important;
}
}
}
.colum{
height: 14.7px;
opacity: 1;
border: 0.7px solid #CBC8C8;
position: absolute;
right: 0;
} }
.cate-nav { .cate-nav {
width: 1200px;
position: relative; position: relative;
margin: 0 auto; margin: 14px auto 0 auto;
} }
/** 商品分类 */ /** 商品分类 */
.nav-con { .nav-con {
width: 1200px; height: 46px;
height: 40px;
margin: 0 auto; margin: 0 auto;
display: flex; display: flex;
.all-categories { .all-categories {
width: 200px; border-top-left-radius: 10px;
line-height: 40px; border-top-right-radius: 10px;
color: #fff; padding-left: 37.4px;
background-color: $theme_color; background: #FFFFFF;
text-align: center; width: 263.2px;
font-size: 16px; padding-top: 15.4px;
line-height: 20px;
border-bottom: none; border-bottom: none;
font-size: 16.8px;
font-weight: normal;
color: #333333;
letter-spacing: 0px;
} }
.nav-item { .nav-item {
width: 1000px; width: 914px;
height: 40px; height: 46px;
line-height: 40px; border-radius: 10px;
background: #FFFFFF;
margin-left: 10px;
line-height: 46px;
overflow: hidden; overflow: hidden;
list-style: none; list-style: none;
// background-color: #eee; // background-color: #eee;
display: flex; display: flex;
li { li {
float: left; float: left;
font-weight: bold; font-size: 17px;
margin-left: 20px; font-weight: normal;
color: rgb(129, 127, 127); color: #333333;
font-size: 15px;
&:hover { &:hover {
color: #e1251b; color: $theme_color;
} }
} }
} }
@@ -271,17 +311,33 @@ export default {
.cate-list { .cate-list {
margin: 0 auto; margin: 0 auto;
position: absolute; position: absolute;
z-index: 1000; z-index: 1000;
} }
.nav-side { .nav-side {
width: 200px; width: 263.2px;
color: #666;
float: left; float: left;
padding: 0px; overflow:hidden;
color: #fff;
background-color: #6e6568; border-bottom-left-radius: 10px;
height: 335px; border-bottom-right-radius: 10px;
overflow: hidden; background-color: #fff;
height: 340px;
////自动移滚动条样式
//&::-webkit-scrollbar {
// width: 1px;
// height: 5px;
//}
//&::-webkit-scrollbar-thumb {
// border-radius: 1em;
// background-color: rgba(50, 50, 50, 0.3);
//}
//&::-webkit-scrollbar-track {
// border-radius: 1em;
// background-color: rgba(50, 50, 50, 0.1);
//}
} }
.large-nav { .large-nav {
height: 470px; height: 470px;
@@ -294,22 +350,16 @@ export default {
} }
.nav-side ul { .nav-side ul {
width: 100%; width: 100%;
padding: 0px;
padding-top: 5px;
list-style: none; list-style: none;
} }
.nav-side li { .nav-side li {
padding: 7.5px 0; padding: 0 0 16.2px 37.4px;
padding-left: 12px;
font-size: 13px; font-size: 13px;
line-height: 18px; line-height: 18px;
&:hover {
background: #999395;
}
} }
.nav-side-item:hover { .nav-side-item:hover {
cursor: pointer; cursor: pointer;
color: #e1251b; color: $theme_color;
} }
/*显示商品详细信息*/ /*显示商品详细信息*/
@@ -335,10 +385,11 @@ export default {
padding-left: 12px; padding-left: 12px;
margin-right: 15px; margin-right: 15px;
font-size: 12px; font-size: 12px;
background-color: #6e6568; color: #333;
} }
.nav-detail-item span:hover { .nav-detail-item span:hover {
background-color: #e1251b; background-color: $theme_color;
color: #fff;
} }
.detail-item-panel li { .detail-item-panel li {
line-height: 30px; line-height: 30px;
@@ -353,7 +404,7 @@ export default {
text-align: right; text-align: right;
} }
.detail-item-title:hover { .detail-item-title:hover {
color: #e1251b; color: $theme_color;
} }
.detail-item-row { .detail-item-row {
display: flex; display: flex;
@@ -373,6 +424,6 @@ export default {
} }
} }
.detail-item:hover { .detail-item:hover {
color: #e1251b; color: $theme_color;
} }
</style> </style>

View File

@@ -153,7 +153,9 @@
</div> </div>
</div> </div>
</template> </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 @click="moreOptions" v-if="tagsContent.length>4" class="more-options">
{{showTagCount===5?'更多筛选项':'收起筛选项'}}
</div>
</div> </div>
</div> </div>
</template> </template>

View File

@@ -16,6 +16,8 @@ module.exports = {
//FIXME 请检查当前高德key创建的日期如果2021年12月02日之前申请的 无需填写安全密钥 //FIXME 请检查当前高德key创建的日期如果2021年12月02日之前申请的 无需填写安全密钥
aMapSecurityJsCode:"2bd0fbf621881f4c77be74f0e76495f3", // 高德web端js申请的安全密钥 aMapSecurityJsCode:"2bd0fbf621881f4c77be74f0e76495f3", // 高德web端js申请的安全密钥
aMapKey: "7f11113750315d8543daaf5c3ba353ca", //高德web端js申请的api key aMapKey: "7f11113750315d8543daaf5c3ba353ca", //高德web端js申请的api key
aMapSwitch:false, //是否开启高德定位
enableCDN: true, //生产环境 是否启用cdn加载 vue等js enableCDN: true, //生产环境 是否启用cdn加载 vue等js
port: 10000, //端口 port: 10000, //端口
inputMaxLength:'140' //全局输入框默认最大输入长度字
}; };

View File

@@ -8,10 +8,15 @@ import * as filters from "./plugins/filters";
import store from "@/vuex/store"; import store from "@/vuex/store";
import storage from "@/plugins/storage"; import storage from "@/plugins/storage";
// 全局引入封装组件 // 全局引入封装组件
import { InstallAll } from "@/components/global.js"; import {InstallAll} from "@/components/global.js";
const {aMapSecurityJsCode, title, inputMaxLength} = require("@/config");
const copyViewUi = {...ViewUI}
copyViewUi.Input.props.maxlength.default = inputMaxLength // 挂载最大输入值
Vue.use(copyViewUi);
const { aMapSecurityJsCode, title } = require("@/config");
Vue.use(ViewUI);
Vue.use(InstallAll); Vue.use(InstallAll);
Vue.config.productionTip = false; Vue.config.productionTip = false;

View File

@@ -10,7 +10,7 @@
>) >)
</div> </div>
</div> </div>
<Search :showTag="false" :showLogo="false"></Search>
</div> </div>
<Divider /> <Divider />
<!-- 购物车主体 --> <!-- 购物车主体 -->
@@ -245,7 +245,7 @@
</div> </div>
<Spin size="large" fix v-if="loading"></Spin> <Spin size="large" fix v-if="loading"></Spin>
</div> </div>
<BaseFooter></BaseFooter> <BaseFooter class="footer"></BaseFooter>
</div> </div>
</template> </template>
@@ -449,6 +449,9 @@ export default {
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.footer{
margin-top: 10px;
}
/** logo 搜索 start **/ /** logo 搜索 start **/
.logo { .logo {
height: 40px; height: 40px;
@@ -781,4 +784,5 @@ export default {
.ivu-input-number-input { .ivu-input-number-input {
text-align: center; text-align: center;
} }
</style> </style>

View File

@@ -5,25 +5,44 @@
<div> <div>
<div class="coupon-title"> <div class="coupon-title">
<router-link to="/"> <router-link to="/">
<img src="../assets/images/logo.png" width="120" alt=""> <img src="../assets/images/logo.png" width="120" alt="" />
</router-link> </router-link>
<p>领券中心</p> <p>领券中心</p>
<Input search style="width:400px" @on-search='search' enter-button="搜索" placeholder="搜索优惠券" /> <Input
search
style="width: 400px"
@on-search="search"
enter-button="搜索"
placeholder="搜索优惠券"
/>
</div> </div>
<div class="fontsize_18 recommend">推荐好券</div> <div class="fontsize_18 recommend">推荐好券</div>
<empty v-if="list.length===0" /> <empty v-if="list.length === 0" />
<ul class="coupon-list" v-else> <ul class="coupon-list" v-else>
<li v-for="(item, index) in list" class="coupon-item" :key="index"> <li v-for="(item, index) in list" class="coupon-item" :key="index">
<div class="c-left"> <div class="c-left">
<div> <div>
<span v-if="item.couponType === 'PRICE'" class="fontsize_12 global_color">¥<span class="price">{{item.price | unitPrice}}</span></span> <span
<span v-if="item.couponType === 'DISCOUNT'" class="fontsize_12 global_color"><span class="price">{{item.couponDiscount}}</span></span> v-if="item.couponType === 'PRICE'"
<span class="describe">{{item.consumeThreshold}}元可用</span> 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> </div>
<p>使用范围{{useScope(item.scopeType, item.storeName)}}</p> <p>使用范围{{ useScope(item.scopeType, item.storeName) }}</p>
<p>有效期{{item.endTime}}</p> <p>有效期{{ item.endTime }}</p>
</div> </div>
<b></b> <b></b>
<a class="c-right" @click="receive(item)">立即领取</a> <a class="c-right" @click="receive(item)">立即领取</a>
@@ -31,12 +50,15 @@
<i class="circle-bottom"></i> <i class="circle-bottom"></i>
</li> </li>
</ul> </ul>
<Page :total="total" @on-change="changePageNum" <Page
:total="total"
@on-change="changePageNum"
class="pageration" class="pageration"
@on-page-size-change="changePageSize" @on-page-size-change="changePageSize"
:page-size="params.pageSize" :page-size="params.pageSize"
show-total show-total
show-sizer> show-sizer
>
</Page> </Page>
</div> </div>
</div> </div>
@@ -44,135 +66,136 @@
</div> </div>
</template> </template>
<script> <script>
import {couponList, receiveCoupon} from '@/api/member.js' import { couponList, receiveCoupon } from "@/api/member.js";
export default { export default {
data () { data() {
return { return {
list: [], // 优惠券列表 list: [], // 优惠券列表
total: 0, // 优惠券总数 total: 0, // 优惠券总数
params: { // 请求参数 params: {
getType: 'FREE', // 请求参数
getType: "FREE",
pageNumber: 1, pageNumber: 1,
pageSize: 20 pageSize: 20,
} },
} };
}, },
methods: { methods: {
// 搜索优惠券 // 搜索优惠券
search (item) { search(item) {
this.params.couponName = item this.params.couponName = item;
this.params.pageNumber = 1 this.params.pageNumber = 1;
this.getList() this.getList();
}, },
// 获取优惠券列表 // 获取优惠券列表
getList () { getList() {
this.$Spin.show() this.$Spin.show();
couponList(this.params).then(res => { couponList(this.params)
this.$Spin.hide() .then((res) => {
this.loading = false this.$Spin.hide();
if (res.success) { this.loading = false;
this.list = res.result.records if (res.success) {
this.total = res.result.total this.list = res.result.records;
} this.total = res.result.total;
}).catch(() => { this.$Spin.hide() }) }
})
.catch(() => {
this.$Spin.hide();
});
}, },
// 分页 改变页码 // 分页 改变页码
changePageNum (val) { changePageNum(val) {
this.params.pageNumber = val; this.params.pageNumber = val;
this.getList() this.getList();
}, },
// 分页 改变每页数 // 分页 改变每页数
changePageSize (val) { changePageSize(val) {
this.params.pageNumber = 1; this.params.pageNumber = 1;
this.params.pageSize = val; this.params.pageSize = val;
this.getList() this.getList();
}, },
// 领取优惠券 // 领取优惠券
receive (item) { receive(item) {
receiveCoupon(item.id).then(res => { receiveCoupon(item.id).then((res) => {
if (res.success) { if (res.success) {
console.log(item);
this.$Modal.confirm({ this.$Modal.confirm({
title: '领取优惠券', title: "领取优惠券",
content: '<p>优惠券领取成功,可到我的优惠券页面查看</p>', content: "<p>优惠券领取成功,可到我的优惠券页面查看</p>",
okText: '我的优惠券', okText: "我的优惠券",
cancelText: '立即使用', cancelText: "立即使用",
closable: true, closable: true,
onOk: () => { onOk: () => {
this.$router.push('/home/Coupons') this.$router.push("/home/Coupons");
}, },
onCancel: () => { onCancel: () => {
if (item.storeId !== '0') { this.$router.push({
this.$router.push({path: '/merchant', query: {id: item.storeId}}) path: "/goodsList",
} else { query: { promotionsId: item.id, promotionType: "COUPON" },
if (item.scopeType === 'PORTION_GOODS_CATEGORY') { });
this.$router.push({path: '/goodsList', query: {categoryId: item.scopeId}}) },
} else {
this.$router.push({path: '/goodsList'})
}
}
}
}); });
} }
}) });
}, },
// 优惠券可用范围 // 优惠券可用范围
useScope (type, storeName) { useScope(type, storeName) {
let shop = '平台'; let shop = "平台";
let goods = '全部商品' let goods = "全部商品";
if (storeName !== 'platform') shop = storeName if (storeName !== "platform") shop = storeName;
switch (type) { switch (type) {
case 'ALL': case "ALL":
goods = '全部商品' goods = "全部商品";
break; break;
case 'PORTION_GOODS': case "PORTION_GOODS":
goods = '部分商品' goods = "部分商品";
break; break;
case 'PORTION_GOODS_CATEGORY': case "PORTION_GOODS_CATEGORY":
goods = '部分分类商品' goods = "部分分类商品";
break; break;
} }
return `${shop}${goods}可用` return `${shop}${goods}可用`;
} },
}, },
mounted () { mounted() {
this.getList() this.getList();
} },
} };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import '../assets/styles/coupon.scss'; @import "../assets/styles/coupon.scss";
.content{ .content {
width: 100%; width: 100%;
background-color: #fff; background-color: #fff;
> div { > div {
margin: 10px auto; margin: 10px auto;
width: 1200px; width: 1200px;
}
} }
.coupon-title { }
display: flex; .coupon-title {
align-items: center; display: flex;
align-items: center;
p{ p {
font-size: 18px; font-size: 18px;
margin-right: 500px; margin-right: 500px;
}
border-bottom: 2px solid $theme_color;
} }
.recommend { border-bottom: 2px solid $theme_color;
margin: 20px auto; }
font-weight: bold; .recommend {
width: 200px; margin: 20px auto;
text-align: center; font-weight: bold;
} width: 200px;
.coupon-item { text-align: center;
b{ }
background: url('../assets/images/small-circle.png') top left repeat-y; .coupon-item {
} b {
} background: url("../assets/images/small-circle.png") top left repeat-y;
.pageration {
text-align: right;
padding-bottom: 10px;
} }
}
.pageration {
text-align: right;
padding-bottom: 10px;
}
</style> </style>

View File

@@ -2,48 +2,40 @@
<div style="background: #fff"> <div style="background: #fff">
<BaseHeader></BaseHeader> <BaseHeader></BaseHeader>
<Search></Search> <Search></Search>
<drawer></drawer>
<ShopHeader :detail="storeMsg"></ShopHeader>
<div class="shop-item-path"> <div class="shop-item-path">
<div class="shop-nav-container"> <div class="shop-nav-container">
<Breadcrumb> <Breadcrumb>
<BreadcrumbItem to="/">首页</BreadcrumbItem> <BreadcrumbItem to="/">首页</BreadcrumbItem>
<BreadcrumbItem <BreadcrumbItem v-for="(item, index) in categoryBar" :to="goGoodsList(index)" target="_blank" :key="index">
v-for="(item, index) in categoryBar"
:to="goGoodsList(index)"
target="_blank"
:key="index"
>
{{ item.name }} {{ item.name }}
</BreadcrumbItem> </BreadcrumbItem>
</Breadcrumb> </Breadcrumb>
<div class="store-collect"> <div class="store-collect" v-if="!takeDownSale">
<span class="mr_10" v-if="goodsMsg.data"> <span class="mr_10" v-if="goodsMsg.data">
<router-link :to="'Merchant?id=' + goodsMsg.data.storeId">{{ <router-link :to="'Merchant?id=' + goodsMsg.data.storeId">{{
goodsMsg.data.storeName goodsMsg.data.storeName
}}</router-link> }}</router-link>
</span> </span>
<span @click="collect"> <span @click="collect">
<Icon <Icon type="ios-heart" :color="storeCollected ? '#ed3f14' : '#666'" />
type="ios-heart" {{ storeCollected? "已收藏店铺": "收藏店铺" }}
:color="storeCollected ? '#ed3f14' : '#666'"
/>
{{ storeCollected ? "已收藏店铺" : "收藏店铺" }}
</span> </span>
<span class="ml_10" @click="IMService()">联系客服</span> <span class="ml_10" @click="IMService(goodsMsg.data.storeId,goodsMsg.data.goodsId,goodsMsg.data.id)">联系客服</span>
</div> </div>
</div> </div>
</div> </div>
<!-- 商品信息展示 --> <!-- 商品信息展示 -->
<ShowGoods <ShowGoods @handleClickSku="targetClickSku" v-if="goodsMsg.data" :detail="goodsMsg"></ShowGoods>
@handleClickSku="targetClickSku"
v-if="goodsMsg.data"
:detail="goodsMsg"
></ShowGoods>
<!-- 商品详细展示 --> <!-- 商品详细展示 -->
<ShowGoodsDetail v-if="goodsMsg.data" :detail="goodsMsg"></ShowGoodsDetail> <ShowGoodsDetail v-if="goodsMsg.data" :detail="goodsMsg"></ShowGoodsDetail>
<empty _Title='当前商品已下架' v-if="takeDownSale">
<div class="sale-btn">
<Button size="small" class="mr_10" @click="target('/')">返回首页</Button>
<Button size="small" @click="target('goodsList')">返回商品列表</Button>
</div>
</empty>
<Spin size="large" fix v-if="isLoading"></Spin> <Spin size="large" fix v-if="isLoading"></Spin>
<BaseFooter></BaseFooter> <BaseFooter></BaseFooter>
</div> </div>
@@ -51,69 +43,52 @@
<script> <script>
import Search from "@/components/Search"; import Search from "@/components/Search";
import ShopHeader from "@/components/header/ShopHeader";
import ShowGoods from "@/components/goodsDetail/ShowGoods"; import ShowGoods from "@/components/goodsDetail/ShowGoods";
import empty from "@/components/empty/Main";
import ShowGoodsDetail from "@/components/goodsDetail/ShowGoodsDetail"; import ShowGoodsDetail from "@/components/goodsDetail/ShowGoodsDetail";
import { goodsSkuDetail } from "@/api/goods"; import { goodsSkuDetail } from "@/api/goods";
import { import {
cancelCollect, cancelStoreCollect,
collectGoods, collectStore,
isCollection, isStoreCollection,
getGoodsDistribution, getGoodsDistribution,
} from "@/api/member"; } from "@/api/member";
import { getDetailById } from "@/api/shopentry"; import { getDetailById } from "@/api/shopentry";
import { getIMDetail } from "@/api/common"; import imTalk from '@/components/mixes/talkIm'
import Storage from "../plugins/storage";
export default { export default {
name: "GoodsDetail", name: "GoodsDetail",
beforeRouteEnter(to, from, next) { beforeRouteEnter (to, from, next) {
window.scrollTo(0, 0); window.scrollTo(0, 0);
next(); next();
}, },
created() { created () {
this.getGoodsDetail(); this.getGoodsDetail();
}, },
data() { mixins: [imTalk],
data () {
return { return {
goodsMsg: {}, // 商品信息 goodsMsg: {}, // 商品信息
isLoading: false, // 加载状态 isLoading: false, // 加载状态
categoryBar: [], // 分类 categoryBar: [], // 分类
storeCollected: false, // 商品收藏 storeCollected: false, // 商品收藏
storeMsg: {}, // 店铺信息 storeMsg: {}, // 店铺信息
IMLink: "", takeDownSale:false, // 是否下架
}; };
}, },
methods: { methods: {
// 跳转im客服 // 跳转首页或商品页面
async IMService() { target(url){
// 获取访问Token this.$router.push({path: url})
let accessToken = Storage.getItem("accessToken");
await this.getIMDetailMethods();
if (!accessToken) {
this.$Message.error("请登录后再联系客服");
return;
}
window.open(
this.IMLink +
"?token=" +
accessToken +
"&id=" +
this.goodsMsg.data.storeId
);
},
// 获取im信息
async getIMDetailMethods() {
let res = await getIMDetail();
if (res.success) {
this.IMLink = res.result;
}
}, },
// 点击规格 // 点击规格
targetClickSku(val) { targetClickSku (val) {
this.getGoodsDetail(val); this.getGoodsDetail(val);
}, },
// 获取商品详情 // 获取商品详情
getGoodsDetail(val) { getGoodsDetail (val) {
this.isLoading = true; this.isLoading = true;
const params = val || this.$route.query; const params = val || this.$route.query;
@@ -141,6 +116,7 @@ export default {
.then((res) => { .then((res) => {
this.isLoading = false; this.isLoading = false;
if (res.success) { if (res.success) {
const result = res.result; const result = res.result;
const cateName = res.result.categoryName; const cateName = res.result.categoryName;
const cateId = result.data.categoryPath.split(","); const cateId = result.data.categoryPath.split(",");
@@ -149,37 +125,42 @@ export default {
// 插入分类id和name // 插入分类id和name
cateArr.push({ cateArr.push({
id: e, id: e,
name: cateName[index], name: cateName ? cateName[index] : "",
}); });
}); });
this.categoryBar = cateArr; this.categoryBar = cateArr;
this.$set(this, "goodsMsg", res.result); this.$set(this, "goodsMsg", res.result);
// 判断是否收藏 // 判断是否收藏
if (this.Cookies.getItem("userInfo")) { if (this.Cookies.getItem("userInfo")) {
isCollection("STORE", this.goodsMsg.data.storeId).then((res) => { isStoreCollection("STORE", this.goodsMsg.data.storeId).then((res) => {
if (res.success && res.result) { if (res.success && res.result) {
this.storeCollected = true; this.storeCollected = true;
} }
}); });
} }
if (!this.storeMsg) { if (!this.storeMsg) {
// 获取店铺信息 // 获取店铺信息
getDetailById(this.goodsMsg.data.storeId).then((res) => { getDetailById(this.goodsMsg.data.storeId).then((res) => {
if (res.success) { if (res.success) {
this.storeMsg = res.result; this.storeMsg = res.result;
} }
}); });
} }
} else { } else {
this.$Message.error(res.message); this.$Message.error(res.message);
this.$router.push("/"); this.isLoading = false
} }
}) })
.catch((e) => { .catch((e) => {
this.$router.push("/"); this.isLoading = false
if(e.code === 11001){
this.takeDownSale = true
}
}); });
}, },
goGoodsList(currIndex) { goGoodsList (currIndex) {
// 跳转商品列表 // 跳转商品列表
const arr = []; const arr = [];
this.categoryBar.forEach((e, index) => { this.categoryBar.forEach((e, index) => {
@@ -189,16 +170,16 @@ export default {
}); });
return location.origin + "/goodsList?categoryId=" + arr.toString(); return location.origin + "/goodsList?categoryId=" + arr.toString();
}, },
async collect() { async collect () {
// 收藏店铺 // 收藏店铺
if (this.storeCollected) { if (this.storeCollected) {
let cancel = await cancelCollect("STORE", this.goodsMsg.data.storeId); let cancel = await cancelStoreCollect("STORE", this.goodsMsg.data.storeId);
if (cancel.success) { if (cancel.success) {
this.$Message.success("已取消收藏"); this.$Message.success("已取消收藏");
this.storeCollected = false; this.storeCollected = false;
} }
} else { } else {
let collect = await collectGoods("STORE", this.goodsMsg.data.storeId); let collect = await collectStore("STORE", this.goodsMsg.data.storeId);
if (collect.code === 200) { if (collect.code === 200) {
this.storeCollected = true; this.storeCollected = true;
this.$Message.success("收藏店铺成功,可以前往个人中心我的收藏查看"); this.$Message.success("收藏店铺成功,可以前往个人中心我的收藏查看");
@@ -209,9 +190,9 @@ export default {
watch: {}, watch: {},
components: { components: {
Search, Search,
ShopHeader,
ShowGoods, ShowGoods,
ShowGoodsDetail, ShowGoodsDetail,
empty
}, },
}; };
</script> </script>
@@ -242,4 +223,8 @@ export default {
} }
} }
} }
.sale-btn{
margin:10px 0
}
</style> </style>

View File

@@ -1,9 +1,8 @@
<template> <template>
<div> <div class="wrapper">
<BaseHeader></BaseHeader> <BaseHeader></BaseHeader>
<Search @search="handleSearch"></Search> <Search @search="handleSearch"></Search>
<drawer></drawer>
<cateNav></cateNav>
<div class="container"> <div class="container">
<!-- 商品筛选栏 --> <!-- 商品筛选栏 -->
<GoodsClassNav @getParams="getParams"></GoodsClassNav> <GoodsClassNav @getParams="getParams"></GoodsClassNav>
@@ -49,60 +48,61 @@
class="goods-show-info" class="goods-show-info"
v-for="(item, index) in goodsList" v-for="(item, index) in goodsList"
:key="index" :key="index"
@click="goGoodsDetail(item.id, item.content.goodsId)" @click="goGoodsDetail(item.id, item.goodsId)"
> >
<div class="goods-show-img"> <div class="goods-show-img">
<img width="220" height="220" :src="item.content.thumbnail" /> <img width="220" height="220" :src="item.thumbnail" />
</div> </div>
<div class="goods-show-price"> <div class="goods-show-price">
<span> <span>
<span class="seckill-price text-danger">{{ <span class="seckill-price text-danger">{{
item.content.price | unitPrice("¥") item.price | unitPrice("¥")
}}</span> }}</span>
</span> </span>
</div> </div>
<div class="goods-show-detail"> <div class="goods-show-detail">
<Tag <Tag
v-if="item.content.salesModel === 'WHOLESALE'" v-if="item.salesModel === 'WHOLESALE'"
class="goods-show-tag" class="goods-show-tag"
color="purple" color="purple"
> >
批发 批发
</Tag> </Tag>
<span>{{ item.content.goodsName }}</span> <span>{{ item.goodsName }}</span>
</div> </div>
<div class="goods-show-num"> <div class="goods-show-num">
已有<span>{{ item.content.commentNum || 0 }}</span 已有<span>{{ item.commentNum || 0 }}</span
>人评价 >人评价
</div> </div>
<div class="goods-show-seller"> <div class="goods-show-seller">
<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">{{ <span class="text-bottom" style="color: #e4393c">{{
item.content.storeName item.storeName
}}</span> }}</span>
</div> </div>
<div class="goods-show-right">
<Tag
class="goods-show-tag"
color="red"
v-if="item.selfOperated"
>
自营
</Tag>
<Tag
class="goods-show-tag"
color="blue"
v-if="item.goodsType === 'VIRTUAL_GOODS'"
>
虚拟
</Tag>
<Tag
class="goods-show-tag"
color="blue"
v-else-if="item.goodsType === 'PHYSICAL_GOODS'"
>
实物
</Tag>
</div>
</div> </div>
</div> </div>
</div> </div>
@@ -145,7 +145,6 @@ export default {
], ],
goodsList: [], // 商品列表 goodsList: [], // 商品列表
loading: false, // 加载状态 loading: false, // 加载状态
goodsListType: "",
total: 0, // 列表总数 total: 0, // 列表总数
params: { params: {
// 请求参数 // 请求参数
@@ -158,19 +157,28 @@ export default {
watch: { watch: {
$route() { $route() {
const keyword = this.$route.query.keyword; const keyword = this.$route.query.keyword;
this.handleSearch(keyword); if (keyword) {
this.handleSearch(keyword);
}
if (this.$route.query.categoryId) { if (this.$route.query.categoryId) {
let cateId = this.$route.query.categoryId.split(","); let cateId = this.$route.query.categoryId.split(",");
Object.assign(this.params, this.$route.query); Object.assign(this.params, this.$route.query);
this.params.categoryId = cateId[cateId.length - 1]; this.params.categoryId = cateId[cateId.length - 1];
this.getGoodsList();
} }
if (this.$route.query.promotionType) {
this.params.promotionType = this.$route.query.promotionType;
}
if (this.$route.query.promotionsId) {
this.params.promotionsId = this.$route.query.promotionsId;
}
this.getGoodsList();
}, },
}, },
methods: { methods: {
// 搜索 // 搜索
handleSearch(key) { handleSearch(key) {
this.params.keyword = key; this.params.keyword = key;
this.$route.query.keyword = key
this.params.pageNumber = 0; this.params.pageNumber = 0;
this.getGoodsList(); this.getGoodsList();
}, },
@@ -221,11 +229,8 @@ export default {
.then((res) => { .then((res) => {
this.loading = false; this.loading = false;
if (res.success) { if (res.success) {
this.goodsList = res.result.content; this.goodsList = res.result.records;
this.total = res.result.totalElements; this.total = res.result.total;
for (var i = 0; i < this.goodsList.length; i++) {
this.goodsListType = this.goodsList[i];
}
} }
}) })
.catch(() => { .catch(() => {
@@ -256,12 +261,16 @@ export default {
<style scoped lang="scss"> <style scoped lang="scss">
@import "../assets/styles/goodsList.scss"; @import "../assets/styles/goodsList.scss";
.cate-nav{
margin-top: 10px;
}
.goods-show-info > .goods-show-seller > .goods-show-buyer { .goods-show-info > .goods-show-seller > .goods-show-buyer {
height: 16px; width: 35px;
width: 30px; height: 17px;
white-space: nowrap; white-space: nowrap;
line-height: 17px; line-height: 17px;
text-align: center; text-align: center;
align-content: center;
padding: 0 3px; padding: 0 3px;
background-color: #e23a3a; background-color: #e23a3a;
} }
@@ -281,8 +290,8 @@ export default {
vertical-align: middle; vertical-align: middle;
} }
.container { .container {
margin: 15px auto; margin:25px auto 15px auto;
width: 1200px; width: 1184px;
min-width: 1000px; min-width: 1000px;
position: relative; position: relative;
} }
@@ -293,72 +302,14 @@ export default {
display: flex; display: flex;
} }
/* ---------------侧边广告栏开始------------------- */ /* ---------------侧边广告栏开始------------------- */
.as-box {
width: 200px;
border: 1px solid #ccc;
}
.goods-show-right { .goods-show-right {
width: 35px; display: flex;
height: 17px; flex-direction: row;
// 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;
color: $theme_color;
line-height: 36px;
font-size: 18px;
}
.item-as-title span:first-child {
margin-left: 20px;
}
.item-as-title span:last-child {
float: right;
margin-right: 15px;
font-size: 10px;
color: rgb(204, 204, 204);
}
.item-as {
width: 160px;
margin: 18px auto;
}
.item-as-img {
width: 160px;
height: 160px;
margin: 0px auto;
}
.item-as-price span {
font-size: 18px;
}
.item-as-intro {
margin-top: 5px; margin-top: 5px;
font-size: 12px;
} }
.item-as-selled {
margin-top: 5px;
font-size: 12px;
}
.item-as-selled span {
color: #005aa0;
}
/* ---------------侧边广告栏结束------------------- */
/* ---------------商品栏开始------------------- */ /* ---------------商品栏开始------------------- */
.goods-list-box { .goods-list-box {

View File

@@ -1,6 +1,28 @@
<template> <template>
<div class="container"> <div class="container">
<drawer></drawer> <Modal v-model="showCpmodel" width="350">
<template #header>
<p style="color:black;text-align:left">
<!-- <Icon type="ios-information-circle"></Icon> -->
<span>活动优惠券</span>
</p>
</template>
<template>
<Scroll :on-reach-bottom="handleReachBottom">
<Card dis-hover v-for="(item, index) in autoCoupList" :key="index" style="margin: 10px 15px">
<span v-if="item.couponType === 'PRICE'" class="fontsize_12 global_color" style="font-size: 15px;">¥<span class="price">{{item.price | unitPrice}}</span></span>
<span v-if="item.couponType === 'DISCOUNT'" class="fontsize_12 global_color" style="font-size: 15px;"><span class="price">{{item.discount}}</span></span>
<span class="describe" style="font-size: 15px;margin-left: 5px;">{{item.consumeThreshold}}元可用</span>
<p style="font-size: 10px;">使用范围{{useScope(item.scopeType, item.storeName)}}</p>
<p style="font-size: 10px;">有效期{{item.endTime}}</p>
</Card>
</Scroll>
</template>
<template #footer>
<Button type="error" @click="showCpmodel=false">确定</Button>
</template>
</Modal>
<!-- 固定头部 --> <!-- 固定头部 -->
<hover-search class="hover-search" :class="{show: topSearchShow}"></hover-search> <hover-search class="hover-search" :class="{show: topSearchShow}"></hover-search>
<!-- 顶部广告 --> <!-- 顶部广告 -->
@@ -15,6 +37,8 @@
<model-form ref="modelForm" :data="modelForm"></model-form> <model-form ref="modelForm" :data="modelForm"></model-form>
<!-- 底部栏 --> <!-- 底部栏 -->
<BaseFooter></BaseFooter> <BaseFooter></BaseFooter>
<!-- 侧边栏 -->
<fixedBar class="fixed-bar" :class="{'show-fixed': topSearchShow}"></fixedBar>
</div> </div>
</template> </template>
@@ -22,8 +46,9 @@
import Search from '@/components/Search'; import Search from '@/components/Search';
import ModelForm from '@/components/indexDecorate/ModelForm'; import ModelForm from '@/components/indexDecorate/ModelForm';
import HoverSearch from '@/components/header/hoverSearch'; import HoverSearch from '@/components/header/hoverSearch';
import storage from '@/plugins/storage'; import fixedBar from '@/components/fixed/index';
import { indexData } from '@/api/index.js'; import storage from "@/plugins/storage";
import { indexData,getAutoCoup } from '@/api/index.js';
import {seckillByDay} from '@/api/promotion' import {seckillByDay} from '@/api/promotion'
export default { export default {
name: 'Index', name: 'Index',
@@ -38,9 +63,14 @@ export default {
that.topSearchShow = false; that.topSearchShow = false;
} }
}; };
if(storage.getItem('userInfo')){
this.getAutoCoup()
}
}, },
data () { data () {
return { return {
autoCoupList:[],
showCpmodel:false,
modelForm: { list: [] }, // 楼层装修数据 modelForm: { list: [] }, // 楼层装修数据
topAdvert: {}, // 顶部广告 topAdvert: {}, // 顶部广告
showNav: false, // 是否展示分类栏 showNav: false, // 是否展示分类栏
@@ -49,7 +79,73 @@ export default {
carouselOpacity: false // 不同轮播分类样式 carouselOpacity: false // 不同轮播分类样式
}; };
}, },
// created(){
// },
methods: { methods: {
// 优惠券可用范围
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}可用`
},
getAutoCoup(){
let data = new Date()
let datas = data.getDate()
let hours = data.getHours()
let flagCoup = storage.getItem('getTimes') //缓存
if(flagCoup && flagCoup != undefined && flagCoup != null){ //判断当前是否有缓存
if(Number(datas) > Number(flagCoup)){ //判断缓存是否小于当前天数
if(Number(hours) >= 6){//超过或等于6时清楚缓存
storage.setItem('getTimes',datas)//存储缓存
this.getcps()
}
}
}else{
// window.localStorage.setItem('getTimes',datas)//存储缓存
this.getcps()
}
},
getcps(){
console.log(123123)
let data = new Date()
let datas = data.getDate()
getAutoCoup().then(res=>{ //调用自动发券
if(res.success){
this.autoCoupList.push(...res.result);
let objs = {};
this.autoCoupList = this.autoCoupList.reduce((cur, next) => {
//对象去重
if (next.id != undefined) {
objs[next.id]
? ""
: (objs[next.id] = true && cur.push(next));
}
return cur;
}, []);
if(this.autoCoupList != '' && this.autoCoupList.length > 0){
console.log(1231232132)
this.showCpmodel = true;
}
storage.setItem('getTimes',datas)//存储缓存
}
})
},
handleReachBottom(){
} ,
getIndexData () { getIndexData () {
// 获取首页装修数据 // 获取首页装修数据
indexData({ clientType: 'PC' }).then(async (res) => { indexData({ clientType: 'PC' }).then(async (res) => {
@@ -88,12 +184,14 @@ export default {
components: { components: {
Search, Search,
ModelForm, ModelForm,
HoverSearch HoverSearch,
fixedBar
} }
}; };
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
@import '../assets/styles/coupon.scss';
.container { .container {
@include sub_background_color($light_background_color); @include sub_background_color($light_background_color);
} }
@@ -119,4 +217,55 @@ export default {
transform: translateZ(0); transform: translateZ(0);
top: 0; top: 0;
} }
.fixed-bar{
opacity: 0 !important;
transform: translateY(-10px);
transition: .35s;
z-index: 999999;
height: 0px !important;
overflow: hidden;
}
.show-fixed{
height: 354px !important;
opacity: 1 !important;
transform: translateY(0);
-webkit-transform: translateZ(0);
-moz-transform: translateZ(0);
-ms-transform: translateZ(0);
-o-transform: translateZ(0);
transform: translateZ(0);
}
/* 2K */
@media screen and (min-width: 2561px) and (max-width: 3840px) {
/* 样式 */
.fixed-bar{
position: fixed;
right:900px;
top: 500px;
}
}
/* 1080p */
@media screen and (max-width: 2560px) {
/* 样式 */
.fixed-bar{
position: fixed;
right:300px;
top: 500px;
}
}
@media screen and (max-width: 2025px) {
/* 样式 */
.fixed-bar{
position: fixed;
right:150px;
top: 300px;
}
}
</style> </style>

View File

@@ -235,6 +235,7 @@ export default {
this.$Message.success("登录成功"); this.$Message.success("登录成功");
storage.setItem("accessToken", res.result.accessToken); storage.setItem("accessToken", res.result.accessToken);
storage.setItem("refreshToken", res.result.refreshToken); storage.setItem("refreshToken", res.result.refreshToken);
storage.setItem('getTimes',0)
apiLogin.getMemberMsg().then((res) => { apiLogin.getMemberMsg().then((res) => {
if (res.success) { if (res.success) {
storage.setItem("userInfo", res.result); storage.setItem("userInfo", res.result);

View File

@@ -1,95 +1,104 @@
<template> <template>
<div class="merchant"> <div class="merchant">
<BaseHeader/> <BaseHeader/>
<!-- 搜索栏 --> <!-- 搜索栏 -->
<Search :store="true" @search="search"></Search> <Search :storeId="storeMsg.storeId" @search="search"></Search>
<!-- 店铺logo --> <!-- 店铺logo -->
<div class="shop-logo"> <div class="shop-logo">
<div> <div>
<p>{{storeMsg.storeName || 'xx店铺'}}</p> <p>{{ storeMsg.storeName || '店铺' }}</p>
<p class="ellipsis" :alt="storeMsg.storeDesc" v-html="storeMsg.storeDesc"></p> <p :alt="storeMsg.storeDesc" class="ellipsis" v-html="storeMsg.storeDesc"></p>
</div>
<div>
<span class="hover-pointer" @click="collect"><Icon type="ios-heart" :color="storeCollected ? '#ed3f14' : '#fff'" />{{storeCollected?'已收藏店铺':'收藏店铺'}}</span>
<span style="width:80px" class="hover-pointer ml_10" @click="IMService()"><Icon custom="icomoon icon-customer-service" />联系客服</span>
</div>
</div> </div>
<div class="store-category"> <div>
<ul class="cate-list"> <span class="hover-pointer" @click="collect"><Icon :color="storeCollected ? '#ed3f14' : '#fff'"
<li type="ios-heart"/>{{
class="cate-item" storeCollected ? '已收藏店铺' : '收藏店铺'
@click="searchByCate({ id: '', labelName: '店铺推荐' })" }}</span>
> <span class="hover-pointer ml_10" style="width:80px" @click="IMService(storeMsg.storeId,null,null)"><Icon
首页 custom="icomoon icon-customer-service"/>联系客服</span>
</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> </div>
</div>
<div class="store-category">
<ul class="cate-list">
<li
class="cate-item"
@click="searchByCate({ id: '', labelName: '店铺推荐' })"
>
首页
</li>
<li v-for="(cate, index) in cateList" :key="index" class="cate-item">
<Dropdown v-if="cate.children.length">
<div @click.self="searchByCate(cate)">
{{ cate.labelName }}
<Icon type="ios-arrow-down"></Icon>
</div>
<DropdownMenu slot="list">
<DropdownItem
v-for="sec in cate.children"
:key="sec.id"
:name="sec.id"
@click.native="searchByCate(sec)"
>{{ sec.labelName }}
</DropdownItem
>
</DropdownMenu>
</Dropdown>
<span v-else @click.self="searchByCate(cate)">{{
cate.labelName
}}</span>
</li>
</ul>
</div>
<div v-if="storeMsg.pageShow&&storeMsg.pageShow==='1'">
<!-- 楼层装修部分 -->
<model-form ref="modelForm" :data="modelForm"></model-form>
</div>
<div v-else>
<div class="promotion-decorate">{{ cateName }}</div> <div class="promotion-decorate">{{ cateName }}</div>
<div class="goods-list">
<empty v-if="goodsList.length === 0"/>
<div
v-for="(item, index) in goodsList"
v-else
:key="index"
class="goods-show-info"
@click="goGoodsDetail(item.id, item.goodsId)"
>
<!-- <div class="goods-list">--> <div class="goods-show-img">
<!-- <empty v-if="goodsList.length === 0"/>--> <img :src="item.small" height="220" width="220" alt=""/>
<!-- <div--> </div>
<!-- v-else--> <div class="goods-show-price">
<!-- class="goods-show-info"--> <span>
<!-- v-for="(item, index) in goodsList"--> <span class="seckill-price text-danger">{{
<!-- :key="index"--> item.price | unitPrice("¥")
<!-- @click="goGoodsDetail(item.content.id, item.content.goodsId)"--> }}</span>
<!-- >--> </span>
<!-- <div class="goods-show-img">--> </div>
<!-- <img width="220" height="220" :src="item.content.thumbnail"/>--> <div class="goods-show-detail">
<!-- </div>--> <span>{{ item.goodsName }}</span>
<!-- <div class="goods-show-price">--> </div>
<!-- <span>--> <div class="goods-show-num">
<!-- <span class="seckill-price text-danger">{{--> 已有<span>{{ item.commentNum || 0 }}</span
<!-- item.content.price | unitPrice("¥")--> >人评价
<!-- }}</span>--> </div>
<!-- </span>--> </div>
<!-- </div>--> </div>
<!-- <div class="goods-show-detail">--> <div class="goods-page">
<!-- <span>{{ item.content.goodsName }}</span>--> <Page
<!-- </div>--> :page-size="params.pageSize"
<!-- <div class="goods-show-num">--> :total="total"
<!-- 已有<span>{{ item.content.commentNum || 0 }}</span--> show-sizer
<!-- >人评价--> @on-change="changePageNum"
<!-- </div>--> @on-page-size-change="changePageSize"
<!-- </div>--> ></Page>
<!-- </div>--> </div>
<!-- <div class="goods-page">-->
<!-- <Page-->
<!-- show-sizer-->
<!-- @on-change="changePageNum"-->
<!-- @on-page-size-change="changePageSize"-->
<!-- :total="total"-->
<!-- :page-size="params.pageSize"-->
<!-- ></Page>-->
<!-- </div>-->
<!-- -->
</div>
<!-- 楼层装修部分 -->
<model-form ref="modelForm" :data="modelForm"></model-form>
<BaseFooter/> <BaseFooter/>
@@ -97,17 +106,16 @@
</template> </template>
<script> <script>
import { getIMDetail } from "@/api/common";
import Storage from "../plugins/storage"; import {getCateById, getDetailById} from "@/api/shopentry";
import {getDetailById, getCateById} from "@/api/shopentry"; import {cancelStoreCollect, collectStore} from "@/api/member";
import {cancelCollect, collectGoods, isCollection} from "@/api/member";
import {goodsList} from "@/api/goods"; import {goodsList} from "@/api/goods";
import Search from "@/components/Search"; import Search from "@/components/Search";
import ModelForm from "@/components/indexDecorate/ModelForm"; import ModelForm from "@/components/indexDecorate/ModelForm";
import HoverSearch from "@/components/header/hoverSearch"; import HoverSearch from "@/components/header/hoverSearch";
import storage from "@/plugins/storage"; import storage from "@/plugins/storage";
import {getFloorStoreData} from "@/api/index.js"; import {getFloorStoreData} from "@/api/index.js";
import {seckillByDay} from "@/api/promotion"; import imTalk from '@/components/mixes/talkIm'
export default { export default {
name: "Merchant", name: "Merchant",
@@ -116,6 +124,7 @@ export default {
ModelForm, ModelForm,
HoverSearch, HoverSearch,
}, },
mixins: [imTalk],
data() { data() {
return { return {
// 店铺装修的内容 // 店铺装修的内容
@@ -131,7 +140,6 @@ export default {
cateList: [], // 店铺分裂 cateList: [], // 店铺分裂
goodsList: [], // 商品列表 goodsList: [], // 商品列表
total: 0, // 商品数量 total: 0, // 商品数量
IMLink:"",
params: { params: {
// 请求参数 // 请求参数
pageNumber: 1, pageNumber: 1,
@@ -156,8 +164,8 @@ export default {
let dataJson = JSON.parse(res.result.pageData); let dataJson = JSON.parse(res.result.pageData);
// 秒杀活动不是装修的数据,需要调用接口判断是否有秒杀商品 // 秒杀活动不是装修的数据,需要调用接口判断是否有秒杀商品
// 轮播图根据不同轮播,样式不同 // 轮播图根据不同轮播,样式不同
for (let i = 0; i < dataJson.list.length; i++) { for (const element of dataJson.list) {
let type = dataJson.list[i].type; let type = element.type;
if (type === "carousel2") { if (type === "carousel2") {
this.carouselLarge = true; this.carouselLarge = true;
} else if (type === "carousel1") { } else if (type === "carousel1") {
@@ -178,45 +186,23 @@ export default {
} }
); );
}, },
// 跳转im客服
async IMService() {
// 获取访问Token // getStoreMsg () { // 店铺信息
let accessToken = Storage.getItem("accessToken"); // getDetailById(this.$route.query.id).then(res => {
await this.getIMDetailMethods(); // if (res.success) {
if (!accessToken) { // this.storeMsg = res.result
this.$Message.error("请登录后再联系客服"); // document.title = this.storeMsg.storeName
return; // if (this.Cookies.getItem('userInfo')) {
} // isCollection('STORE', this.storeMsg.storeId).then(res => {
window.open( // if (res.success && res.result) {
this.IMLink + // this.storeCollected = true;
"?token=" + // }
accessToken + // })
"&id=" + // }
this.storeMsg.storeId // }
); // })
}, // },
// 获取im信息
async getIMDetailMethods() {
let res = await getIMDetail();
if (res.success) {
this.IMLink = res.result;
}
},
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;
}
})
}
}
})
},
// async getListByDay() { // async getListByDay() {
// // 当天秒杀活动 // // 当天秒杀活动
// const res = await seckillByDay(); // const res = await seckillByDay();
@@ -227,28 +213,34 @@ export default {
// } // }
// }, // },
// getStoreMsg() { getStoreMsg() {
// // 店铺信息 // 店铺信息
// getDetailById(this.$route.query.id).then((res) => { getDetailById(this.$route.query.id).then((res) => {
// if (res.success) { if (res.success) {
//
// this.storeMsg = res.result; this.storeMsg = res.result;
// console.log(this.storeMsg)
//
// this.getIndexData(); //判定如果开启楼层展示,则获取页面信息 否则读取商品信息
// let that = this; if (this.storeMsg.pageShow && this.storeMsg.pageShow === '1') {
// window.onscroll = function () {
// let top = this.getIndexData();
// document.documentElement.scrollTop || document.body.scrollTop; } else {
// if (top > 300) { this.getGoodsList();
// that.topSearchShow = true; }
// } else { let that = this;
// that.topSearchShow = false; window.onscroll = function () {
// } let top =
// }; document.documentElement.scrollTop || document.body.scrollTop;
// } if (top > 300) {
// }); that.topSearchShow = true;
// }, } else {
that.topSearchShow = false;
}
};
}
});
},
getCateList() { getCateList() {
// 店铺分类 // 店铺分类
getCateById(this.$route.query.id).then((res) => { getCateById(this.$route.query.id).then((res) => {
@@ -262,8 +254,8 @@ export default {
goodsList(this.params) goodsList(this.params)
.then((res) => { .then((res) => {
if (res.success) { if (res.success) {
this.goodsList = res.result.content; this.goodsList = res.result.records;
this.total = res.result.totalElements; this.total = res.result.total;
} }
}) })
.catch(() => { .catch(() => {
@@ -303,13 +295,13 @@ export default {
async collect() { async collect() {
// 收藏店铺 // 收藏店铺
if (this.storeCollected) { if (this.storeCollected) {
let cancel = await cancelCollect("STORE", this.storeMsg.storeId); let cancel = await cancelStoreCollect("STORE", this.storeMsg.storeId);
if (cancel.success) { if (cancel.success) {
this.$Message.success("已取消收藏"); this.$Message.success("已取消收藏");
this.storeCollected = false; this.storeCollected = false;
} }
} else { } else {
let collect = await collectGoods("STORE", this.storeMsg.storeId); let collect = await collectStore("STORE", this.storeMsg.storeId);
if (collect.code === 200) { if (collect.code === 200) {
this.storeCollected = true; this.storeCollected = true;
this.$Message.success("收藏店铺成功,可以前往个人中心我的收藏查看"); this.$Message.success("收藏店铺成功,可以前往个人中心我的收藏查看");
@@ -320,7 +312,7 @@ export default {
}; };
</script> </script>
<style scoped lang="scss"> <style lang="scss" scoped>
@import "../assets/styles/goodsList.scss"; @import "../assets/styles/goodsList.scss";
.merchant { .merchant {

View File

@@ -2,7 +2,7 @@
<div> <div>
<BaseHeader></BaseHeader> <BaseHeader></BaseHeader>
<Search></Search> <Search></Search>
<cateNav></cateNav>
<!-- 添加成功提示 --> <!-- 添加成功提示 -->
<div class="add-info-box-container"> <div class="add-info-box-container">
<div class="add-info-box"> <div class="add-info-box">

View File

@@ -2,7 +2,7 @@
<div> <div>
<BaseHeader></BaseHeader> <BaseHeader></BaseHeader>
<Search></Search> <Search></Search>
<cateNav></cateNav>
<div class="title-bg"><p>文章帮助中心</p></div> <div class="title-bg"><p>文章帮助中心</p></div>
<div class="container width_1200"> <div class="container width_1200">
<Layout class="layoutAll"> <Layout class="layoutAll">
@@ -182,7 +182,6 @@ export default {
text-align: center; text-align: center;
} }
.title-bg{ .title-bg{
border-top: 3px solid $theme_color;
height: 100px; height: 100px;
width: 100%; width: 100%;
background-color: #7b7b7b; background-color: #7b7b7b;

View File

@@ -32,6 +32,10 @@ export const orderStatusList = [
{ {
name: '已取消', name: '已取消',
status: 'CANCELLED' status: 'CANCELLED'
},
{
name: '待提货',
status: 'STAY_PICKED_UP'
} }
] ]
// 订单售后状态 // 订单售后状态

View File

@@ -36,7 +36,7 @@
<i-col span="4"> <i-col span="4">
<Tooltip transfer> <Tooltip transfer>
<div class="content">{{item.content}}</div> <div class="content">{{item.content}}</div>
<div style="white-space: normal;" slot="content"> <div style="white-space: normal;word-break:break-all" slot="content">
{{item.content}} {{item.content}}
</div> </div>
</Tooltip> </Tooltip>
@@ -160,7 +160,11 @@ export default {
color: #999; color: #999;
max-height: 60px; max-height: 60px;
overflow: hidden; overflow: hidden;
word-wrap: break-word; // word-wrap: break-word;
display:-webkit-box;
-webkit-box-orient:vertical;/*设置方向*/
-webkit-line-clamp:3;/*设置超过为省略号的行数*/
word-break:break-all;
} }
.eval-detail { .eval-detail {

View File

@@ -527,7 +527,7 @@ export default {
top: -200px; top: -200px;
left: 200px; left: 200px;
} }
/depp/ .ivu-alert-message { /deep/ .ivu-alert-message {
p { p {
margin: 4px 0; margin: 4px 0;
} }

View File

@@ -25,7 +25,7 @@
<Button size="small" type="primary" @click="buynow(item.skuId, item.goodsId)" v-if="params.type === 'GOODS'">立即购买</Button> <Button size="small" type="primary" @click="buynow(item.skuId, item.goodsId)" v-if="params.type === 'GOODS'">立即购买</Button>
<Button size="small" type="primary" @click="goShop(item.id)" v-else>店铺购买</Button> <Button size="small" type="primary" @click="goShop(item.id)" v-else>店铺购买</Button>
<Button size="small" v-if="params.type === 'GOODS'" @click="cancel(item.skuId)">取消收藏</Button> <Button size="small" v-if="params.type === 'GOODS'" @click="cancel(item.skuId)">取消收藏</Button>
<Button size="small" v-if="params.type === 'SHOP'" @click="cancel(item.id)">取消收藏</Button> <Button size="small" v-if="params.type === 'STORE'" @click="cancelStore(item.id)">取消收藏</Button>
</div> </div>
</div> </div>
</template> </template>
@@ -36,7 +36,7 @@
</template> </template>
<script> <script>
import { collectList, cancelCollect } from '@/api/member.js' import { collectList, cancelCollect,storeCollectList,cancelStoreCollect} from '@/api/member.js'
export default { export default {
name: 'Favorites', name: 'Favorites',
props: { props: {
@@ -53,11 +53,12 @@ export default {
params: { // 请求参数 params: { // 请求参数
pageNumber: 1, pageNumber: 1,
pageSize: 100, pageSize: 100,
type: 'GOODS' type: this.$route.query.type || 'GOODS'
}, },
spinShow: false // 加载状态 spinShow: false // 加载状态
}; };
}, },
methods: { methods: {
getList () { // 获取收藏列表 getList () { // 获取收藏列表
this.spinShow = true this.spinShow = true
@@ -66,10 +67,16 @@ export default {
if (res.success) this.list = res.result.records; if (res.success) this.list = res.result.records;
}) })
}, },
getStoreList () { // 获取收藏列表
this.spinShow = true
storeCollectList(this.params).then(res => {
this.spinShow = false
if (res.success) this.list = res.result.records;
})
},
change (index) { // tab栏切换 change (index) { // tab栏切换
if (index === 0) { this.params.type = 'GOODS' } if (index === 0) { this.params.type = 'GOODS',this.getList()}
if (index === 1) { this.params.type = 'SHOP' } if (index === 1) { this.params.type = 'STORE',this.getStoreList()}
this.getList()
}, },
cancel (id) { // 取消收藏 cancel (id) { // 取消收藏
let typeName = this.params.type === 'GOODS' ? '商品' : '店铺' let typeName = this.params.type === 'GOODS' ? '商品' : '店铺'
@@ -85,6 +92,20 @@ export default {
} }
}); });
}, },
cancelStore (id) { // 取消收藏
let typeName = this.params.type === 'GOODS' ? '商品' : '店铺'
this.$Modal.confirm({
title: 'Title',
content: `<p>确定取消收藏该${typeName}吗?</p>`,
onOk: () => {
cancelStoreCollect(this.params.type, id).then(res => {
if (res.success) {
this.getStoreList();
}
})
}
});
},
buynow (skuId, goodsId) { // 跳转详情 buynow (skuId, goodsId) { // 跳转详情
let url = this.$router.resolve({ let url = this.$router.resolve({
path: '/goodsDetail', path: '/goodsDetail',
@@ -103,6 +124,7 @@ export default {
mounted () { mounted () {
if (this.homePage) this.params.pageSize = 5; if (this.homePage) this.params.pageSize = 5;
this.getList() this.getList()
} }
}; };
</script> </script>

View File

@@ -7,8 +7,9 @@
<i-input v-model="formData.name" placeholder="请输入收件人姓名" style="width: 600px"></i-input> <i-input v-model="formData.name" placeholder="请输入收件人姓名" style="width: 600px"></i-input>
</FormItem> </FormItem>
<FormItem label="收件地区" prop="address"> <FormItem label="收件地区" prop="address">
<i-input v-model="formData.address" disabled placeholder="请选择收货地址" style="width: 600px"></i-input> <span>{{ formData.address || '暂无地址' }}</span>
<Button type="primary" size="small" @click="$refs.map.showMap = true">选择</Button>
<Button type="default" style="margin-left: 10px;" size="small" @click="$refs.map.open()">选择</Button>
</FormItem> </FormItem>
<FormItem label="详细地址" prop="detail"> <FormItem label="详细地址" prop="detail">
<i-input v-model="formData.detail" placeholder="请输入详细地址" style="width: 600px"></i-input> <i-input v-model="formData.detail" placeholder="请输入详细地址" style="width: 600px"></i-input>
@@ -29,14 +30,15 @@
<Button type="primary" class="mr_10" :loading="loading" @click="save">保存收货地址</Button> <Button type="primary" class="mr_10" :loading="loading" @click="save">保存收货地址</Button>
<Button @click="$router.back()">返回</Button> <Button @click="$router.back()">返回</Button>
</div> </div>
<lili-map ref="map" @getAddress="getAddress"></lili-map>
<multipleMap ref="map" @callback="getAddress" />
</div> </div>
</template> </template>
<script> <script>
import card from "@/components/card"; import card from "@/components/card";
import liliMap from "@/components/map";
import multipleMap from "@/components/map/multiple-map";
import * as RegExp from "@/plugins/RegExp.js"; import * as RegExp from "@/plugins/RegExp.js";
import { import {
newMemberAddress, newMemberAddress,
@@ -117,15 +119,25 @@ export default {
} }
}); });
}, },
getAddress(item) { getAddress(val) {
// 获取地图选择信息 // 获取地图选择信息
console.log(item); if(val.type === 'select'){
this.mapMsg = item; const paths = val.data.map(item => item.name).join(',')
this.$set(this.formData, "address", item.addr); const ids = val.data.map(item => item.id).join(',')
this.$set(this.formData, "consigneeAddressIdPath", item.addrId); this.$set(this.formData,'address',paths)
this.$set(this.formData, "detail", item.detail); this.$set(this.formData,'consigneeAddressIdPath',ids)
this.formData.lat = item.position.lat; const coord = val.data[val.data.length - 1].center.split(',')
this.formData.lon = item.position.lng; this.formData.lat = coord[1]
this.formData.lon = coord[0]
}else{
this.$set(this.formData, "address", val.data.addr);
this.$set(this.formData, "consigneeAddressIdPath", val.data.addrId);
this.$set(this.formData, "detail", val.data.address);
this.formData.lat = val.data.position.lat;
this.formData.lon = val.data.position.lng;
}
}, },
}, },
mounted() { mounted() {
@@ -134,7 +146,7 @@ export default {
}, },
components: { components: {
card, card,
liliMap, multipleMap
}, },
}; };
</script> </script>

View File

@@ -4,7 +4,7 @@
<card _Title="我的订单" :_Size="16" :_Tabs="changeWay" @_Change="change" v-if="!homePage"></card> <card _Title="我的订单" :_Size="16" :_Tabs="changeWay" @_Change="change" v-if="!homePage"></card>
<card _Title="我的订单" :_Size="16" :_Tabs="changeWay" @_Change="change" _More="全部订单" _Src="/home/MyOrder" v-else></card> <card _Title="我的订单" :_Size="16" :_Tabs="changeWay" @_Change="change" _More="全部订单" _Src="/home/MyOrder" v-else></card>
<!-- 搜索 筛选 --> <!-- 搜索 筛选 -->
<div class="mb_20 box" v-if="!homePage"> <div class="mb_24 box" v-if="!homePage">
<div class="global_float_right" > <div class="global_float_right" >
<Input <Input
class="width_300" class="width_300"
@@ -70,7 +70,8 @@
<Button @click="goPay(order.sn)" size="small" type="success" v-if="order.allowOperationVO.pay">去支付</Button> <Button @click="goPay(order.sn)" size="small" type="success" v-if="order.allowOperationVO.pay">去支付</Button>
<Button @click="received(order.sn)" size="small" type="warning" v-if="order.allowOperationVO.rog">确认收货</Button> <Button @click="received(order.sn)" size="small" type="warning" v-if="order.allowOperationVO.rog">确认收货</Button>
<!-- 售后 --> <!-- 售后 -->
<Button v-if="order.groupAfterSaleStatus && order.groupAfterSaleStatus.includes('NOT_APPLIED')" @click="applyAfterSale(order.orderItems)" size="small">申请售后</Button> <Button v-if="order.groupAfterSaleStatus && (order.groupAfterSaleStatus==='NOT_APPLIED'|| order.groupAfterSaleStatus==='PART_AFTER_SALE' )"
@click="applyAfterSale(order.orderItems)" size="small">申请售后</Button>
</div> </div>
</div> </div>
</div> </div>
@@ -206,7 +207,7 @@ export default {
applyAfterSale (goodsItem) { // 申请售后 applyAfterSale (goodsItem) { // 申请售后
let arr = [] let arr = []
goodsItem.forEach(e => { goodsItem.forEach(e => {
if (e.afterSaleStatus === 'NOT_APPLIED') { if (e.afterSaleStatus === 'NOT_APPLIED'|| e.afterSaleStatus === 'PART_AFTER_SALE') {
arr.push(e) arr.push(e)
} }
}); });

View File

@@ -53,7 +53,7 @@
></Step> ></Step>
</Steps> </Steps>
</div> </div>
<div class="order-card"> <div class="order-card" v-if="order.order.deliveryMethod == 'LOGISTICS'">
<h3>收货人信息</h3> <h3>收货人信息</h3>
<p>收货人:{{ order.order.consigneeName }}</p> <p>收货人:{{ order.order.consigneeName }}</p>
<p>手机号码:{{ order.order.consigneeMobile | secrecyMobile }}</p> <p>手机号码:{{ order.order.consigneeMobile | secrecyMobile }}</p>
@@ -62,6 +62,11 @@
{{ order.order.consigneeDetail }} {{ order.order.consigneeDetail }}
</p> </p>
</div> </div>
<div class="order-card" v-if="order.order.deliveryMethod == 'SELF_PICK_UP'">
<h3>自提点信息</h3>
<p>自提点名称:{{ order.order.storeAddressPath }}</p>
<p>联系方式:{{ order.order.storeAddressMobile }}</p>
</div>
<div class="order-card"> <div class="order-card">
<h3>付款信息</h3> <h3>付款信息</h3>
<p>支付方式:{{ order.paymentMethodValue }}</p> <p>支付方式:{{ order.paymentMethodValue }}</p>
@@ -70,7 +75,7 @@
<div class="order-card" v-if="!order.order.verificationCode"> <div class="order-card" v-if="!order.order.verificationCode">
<h3>配送信息</h3> <h3>配送信息</h3>
<p>配送方式:{{ order.deliveryMethodValue }}</p> <p>配送方式:{{ order.deliveryMethodValue }}</p>
<p>配送状态:{{ order.deliverStatusValue }}</p> <p v-if="order.order.deliveryMethod === 'LOGISTICS'">配送状态:{{ order.deliverStatusValue }}</p>
<p v-if="logistics"> <p v-if="logistics">
物流信息:{{ logistics.shipper || "暂无物流信息" }} 物流信息:{{ logistics.shipper || "暂无物流信息" }}
</p> </p>
@@ -89,7 +94,7 @@
</div> </div>
<div class="order-card" v-if="order.order.payStatus === 'PAID'"> <div class="order-card" v-if="order.order.payStatus === 'PAID'">
<h3>发票信息</h3> <h3>发票信息</h3>
<template v-if="order.order.needReceipt"> <template v-if="order.order.needReceipt && order.receipt">
<p>发票抬头:{{ order.receipt.receiptTitle }}</p> <p>发票抬头:{{ order.receipt.receiptTitle }}</p>
<p>发票内容:{{ order.receipt.receiptContent }}</p> <p>发票内容:{{ order.receipt.receiptContent }}</p>
<p v-if="order.receipt.taxpayerId"> <p v-if="order.receipt.taxpayerId">
@@ -270,6 +275,9 @@ export default {
if (res.success) { if (res.success) {
this.order = res.result; this.order = res.result;
this.progressList = res.result.orderLogs; this.progressList = res.result.orderLogs;
if (this.order.order.deliveryMethod === 'LOGISTICS') {
this.traces();
}
} }
}); });
}, },
@@ -336,7 +344,6 @@ export default {
}, },
mounted() { mounted() {
this.getDetail(); this.getDetail();
this.traces();
}, },
}; };
</script> </script>

View File

@@ -1,136 +1,155 @@
<template> <template>
<div class="wrapper"> <div class="wrapper">
<card _Title="优惠券列表" :_Tabs="statusNameList" @_Change="change" /> <card _Title="优惠券列表" :_Tabs="statusNameList" @_Change="change" />
<empty v-if="list.length==0" /> <empty v-if="list.length == 0" />
<ul class="coupon-list" v-else> <ul class="coupon-list" v-else>
<li v-for="(item, index) in list" class="coupon-item" :key="index"> <li v-for="(item, index) in list" class="coupon-item" :key="index">
<div class="c-left"> <div class="c-left">
<div> <div>
<span v-if="item.couponType === 'PRICE'" class="fontsize_12 global_color">¥<span class="price">{{item.price | unitPrice}}</span></span> <span
<span v-if="item.couponType === 'DISCOUNT'" class="fontsize_12 global_color"><span class="price">{{item.discount}}</span></span> v-if="item.couponType === 'PRICE'"
<span class="describe">{{item.consumeThreshold}}元可用</span> 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.discount }}</span
></span
>
<span class="describe">{{ item.consumeThreshold }}元可用</span>
</div> </div>
<p>使用范围{{useScope(item.scopeType, item.storeName)}}</p> <p>使用范围{{ useScope(item.scopeType, item.storeName) }}</p>
<p>有效期{{item.endTime}}</p> <p>有效期{{ item.endTime }}</p>
</div> </div>
<b></b> <b></b>
<a class="c-right" :class="{'canot-use':params.memberCouponStatus !== 'NEW'}" @click="go(item)">立即使用</a> <a
class="c-right"
:class="{ 'canot-use': params.memberCouponStatus !== 'NEW' }"
@click="go(item)"
>立即使用</a
>
<i class="circle-top"></i> <i class="circle-top"></i>
<i class="circle-bottom"></i> <i class="circle-bottom"></i>
</li> </li>
</ul> </ul>
<Page :total="total" @on-change="changePageNum" <Page
:total="total"
@on-change="changePageNum"
class="pageration" class="pageration"
@on-page-size-change="changePageSize" @on-page-size-change="changePageSize"
:page-size="params.pageSize" :page-size="params.pageSize"
show-total show-total
show-sizer> show-sizer
>
</Page> </Page>
<Spin v-if="loading" fix></Spin> <Spin v-if="loading" fix></Spin>
</div> </div>
</template> </template>
<script> <script>
import { memberCouponList } from '@/api/member.js'; import { memberCouponList } from "@/api/member.js";
export default { export default {
name: 'Coupons', name: "Coupons",
data () { data() {
return { return {
statusNameList: [ // 优惠券状态 statusNameList: [
'未使用', // 优惠券状态
'已使用', "未使用",
'已过期' "已使用",
"已过期",
], ],
statusList: ['NEW', 'USED', 'EXPIRE'], // 优惠券状态 statusList: ["NEW", "USED", "EXPIRE"], // 优惠券状态
loading: false, // 列表加载状态 loading: false, // 列表加载状态
params: { // 请求参数 params: {
// 请求参数
pageNumber: 1, pageNumber: 1,
pageSize: 10, pageSize: 10,
memberCouponStatus: 'NEW' memberCouponStatus: "NEW",
}, },
total: 0, // 优惠券总数 total: 0, // 优惠券总数
list: [] // 优惠券列表 list: [], // 优惠券列表
}; };
}, },
methods: { methods: {
getList () { // 获取优惠券列表 getList() {
this.loading = true // 获取优惠券列表
memberCouponList(this.params).then(res => { this.loading = true;
this.loading = false memberCouponList(this.params).then((res) => {
this.loading = false;
if (res.success) { if (res.success) {
this.list = res.result.records this.list = res.result.records;
this.total = res.result.total this.total = res.result.total;
} }
}) });
}, },
// 切换优惠券状态 // 切换优惠券状态
change (index) { change(index) {
this.params.memberCouponStatus = this.statusList[index] this.params.memberCouponStatus = this.statusList[index];
this.params.pageNumber = 1; this.params.pageNumber = 1;
this.getList() this.getList();
}, },
go (item) { // 根据使用条件跳转商品列表页面 go(item) {
if (this.params.memberCouponStatus !== 'NEW') return; // 根据使用条件跳转商品列表页面
if (this.params.memberCouponStatus !== "NEW") return;
if (item.storeId !== '0') { this.$router.push({
this.$router.push({path: '/merchant', query: {id: item.storeId}}) path: "/goodsList",
} else { query: { promotionsId: item.couponId, promotionType: "COUPON" },
if (item.scopeType === 'PORTION_GOODS_CATEGORY') { });
this.$router.push({path: '/goodsList', query: {categoryId: item.scopeId}})
} else {
this.$router.push({path: '/goodsList'})
}
}
}, },
changePageNum (val) { // 分页改变页码 changePageNum(val) {
// 分页改变页码
this.params.pageNumber = val; this.params.pageNumber = val;
this.getList() this.getList();
}, },
changePageSize (val) { // 分页改变页数 changePageSize(val) {
// 分页改变页数
this.params.pageNumber = 1; this.params.pageNumber = 1;
this.params.pageSize = val; this.params.pageSize = val;
this.getList() this.getList();
}, },
useScope (type, storeName) { // 根据字段返回 优惠券适用范围 useScope(type, storeName) {
let shop = '平台'; // 根据字段返回 优惠券适用范围
let goods = '全部商品' let shop = "平台";
if (storeName !== 'platform') shop = storeName let goods = "全部商品";
if (storeName !== "platform") shop = storeName;
switch (type) { switch (type) {
case 'ALL': case "ALL":
goods = '全部商品' goods = "全部商品";
break; break;
case 'PORTION_GOODS': case "PORTION_GOODS":
goods = '部分商品' goods = "部分商品";
break; break;
case 'PORTION_GOODS_CATEGORY': case "PORTION_GOODS_CATEGORY":
goods = '部分分类商品' goods = "部分分类商品";
break; break;
} }
return `${shop}${goods}可用` return `${shop}${goods}可用`;
} },
}, },
mounted () { mounted() {
this.getList() this.getList();
} },
} };
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
@import '../../../assets/styles/coupon.scss'; @import "../../../assets/styles/coupon.scss";
.coupon-item{ .coupon-item {
height: 125px; height: 125px;
.c-left{ .c-left {
padding: 16px; padding: 16px;
} }
.c-right{ .c-right {
padding: 20px 16px; padding: 20px 16px;
width: 43px; width: 43px;
font-size: 14px; font-size: 14px;
} }
.canot-use{ .canot-use {
color: #999; color: #999;
background-color: #eee; background-color: #eee;
} }

View File

@@ -1,13 +1,13 @@
<template> <template>
<div class="wrapper"> <div class="wrapper">
<card _Title="资金管理" /> <card _Title="资金管理"/>
<div class="box"> <div class="box">
<div class="mb_20 account-price"> <div class="mb_20 account-price">
<span class="subTips">账户余额</span> <span class="subTips">账户余额</span>
<span class="global_color mr_10" style="font-size:26px">{{ memberDeposit | unitPrice }}</span> <span class="global_color mr_10" style="font-size:26px">{{ memberDeposit | unitPrice }}</span>
<span class="subTips">冻结金额</span> <span class="subTips">冻结金额</span>
<span class="">{{ frozenDeposit | unitPrice}}</span> <span class="">{{ frozenDeposit | unitPrice }}</span>
</div> </div>
<div class="account-btns"> <div class="account-btns">
<Button type="primary" @click="recharge">在线充值</Button> <Button type="primary" @click="recharge">在线充值</Button>
@@ -22,19 +22,19 @@
<div> <div>
<Form <Form
ref="formData" ref="formData"
:model="formData"
label-position="left"
:label-width="100" :label-width="100"
:model="formData"
:rules="formValidate" :rules="formValidate"
label-position="left"
> >
<FormItem label="充值金额" prop="price"> <FormItem label="充值金额" prop="price">
<Input v-model="formData.price" size="large" number maxlength="9" <Input v-model="formData.price" maxlength="9" number size="large"
><span slot="append"></span></Input> ><span slot="append"></span></Input>
</FormItem> </FormItem>
</Form> </Form>
</div> </div>
<div slot="footer" style="text-align: center"> <div slot="footer" style="text-align: center">
<Button type="success" size="large" @click="rechargePrice">充值</Button> <Button size="large" type="success" @click="rechargePrice">充值</Button>
</div> </div>
</Modal> </Modal>
<!-- 提现申请 --> <!-- 提现申请 -->
@@ -46,23 +46,45 @@
<div> <div>
<Form <Form
ref="withdrawApplyFormData" ref="withdrawApplyFormData"
:label-width="120"
:model="withdrawApplyFormData" :model="withdrawApplyFormData"
label-position="left"
:label-width="100"
:rules="withdrawApplyFormValidate" :rules="withdrawApplyFormValidate"
> >
<FormItem label="提现类型" prop="type">
<Select v-model="withdrawApplyFormData.type" disabled>
<Option value="ALI">支付宝</Option>
<Option value="WECHAT">微信</Option>
</Select>
</FormItem>
<FormItem label="提现金额" prop="price"> <FormItem label="提现金额" prop="price">
<Input <Input
v-model="withdrawApplyFormData.price" v-model="withdrawApplyFormData.price"
size="large"
number
maxlength="9" maxlength="9"
><span slot="append"></span></Input> number
size="large"
><span slot="append"></span></Input>
<span style="color: red">最低提现金额 {{ withdrawApplyFormData.minPrice }}</span>
</FormItem>
<FormItem v-if="withdrawApplyFormData.type === 'ALI'" label="真实姓名" prop="realName">
<Input
v-model="withdrawApplyFormData.realName"
maxlength="9"
number
size="large"
></Input>
</FormItem>
<FormItem v-if="withdrawApplyFormData.type === 'ALI'" label="第三方登录账号" prop="connectNumber">
<Input
v-model="withdrawApplyFormData.connectNumber"
maxlength="9"
number
size="large"
></Input>
</FormItem> </FormItem>
</Form> </Form>
</div> </div>
<div slot="footer" style="text-align: center"> <div slot="footer" style="text-align: center">
<Button type="success" size="large" @click="withdrawal">提现</Button> <Button size="large" type="success" @click="withdrawal">提现</Button>
</div> </div>
</Modal> </Modal>
<!-- 余额日志 --> <!-- 余额日志 -->
@@ -73,15 +95,15 @@
<div class="page-size"> <div class="page-size">
<Page <Page
:current="walletForm.pageNumber" :current="walletForm.pageNumber"
:total="logColumnsData.total"
:page-size="walletForm.pageSize" :page-size="walletForm.pageSize"
:page-size-opts="[10, 20, 50]"
:total="logColumnsData.total"
show-sizer
show-total
size="small"
transfer
@on-change="changePage" @on-change="changePage"
@on-page-size-change="changePageSize" @on-page-size-change="changePageSize"
:page-size-opts="[10, 20, 50]"
size="small"
show-total
show-sizer
transfer
></Page> ></Page>
</div> </div>
</TabPane> </TabPane>
@@ -95,15 +117,15 @@
<div class="page-size"> <div class="page-size">
<Page <Page
:current="rechargeForm.pageNumber" :current="rechargeForm.pageNumber"
:total="rechargeListData.total"
:page-size="rechargeForm.pageSize" :page-size="rechargeForm.pageSize"
:page-size-opts="[10, 20, 50]"
:total="rechargeListData.total"
show-sizer
show-total
size="small"
transfer
@on-change="rechargeChangePage" @on-change="rechargeChangePage"
@on-page-size-change="rechargeChangePageSize" @on-page-size-change="rechargeChangePageSize"
:page-size-opts="[10, 20, 50]"
size="small"
show-total
show-sizer
transfer
></Page> ></Page>
</div> </div>
</TabPane> </TabPane>
@@ -117,15 +139,15 @@
<div class="page-size"> <div class="page-size">
<Page <Page
:current="withdrawApplyForm.pageNumber" :current="withdrawApplyForm.pageNumber"
:total="withdrawApplyColumnsListData.total"
:page-size="withdrawApplyForm.pageSize" :page-size="withdrawApplyForm.pageSize"
:page-size-opts="[10, 20, 50]"
:total="withdrawApplyColumnsListData.total"
show-sizer
show-total
size="small"
transfer
@on-change="withdrawChangePage" @on-change="withdrawChangePage"
@on-page-size-change="withdrawChangePageSize" @on-page-size-change="withdrawChangePageSize"
:page-size-opts="[10, 20, 50]"
size="small"
show-total
show-sizer
transfer
></Page> ></Page>
</div> </div>
</TabPane> </TabPane>
@@ -134,17 +156,12 @@
</template> </template>
<script> <script>
import { import {getDepositLog, getMembersWallet, getRecharge, getWithdrawApply, recharge, withdrawalApply} from '@/api/member';
getMembersWallet, import {withdrawalSettingVO} from "@/api/pay";
getDepositLog,
getRecharge,
getWithdrawApply,
recharge,
withdrawalApply
} from '@/api/member';
export default { export default {
name: 'MoneyManagement', name: 'MoneyManagement',
data () { data() {
return { return {
frozenDeposit: 0, // 冻结余额 frozenDeposit: 0, // 冻结余额
memberDeposit: 0, // 余额 memberDeposit: 0, // 余额
@@ -157,7 +174,11 @@ export default {
}, },
// 提现金额 // 提现金额
withdrawApplyFormData: { withdrawApplyFormData: {
price: 1 price: 1,
minPrice: 1,
type: '',
realName: '',
connectNumber: '',
}, },
// 余额日志 // 余额日志
walletForm: { walletForm: {
@@ -180,17 +201,23 @@ export default {
// 提现申请校验 // 提现申请校验
withdrawApplyFormValidate: { withdrawApplyFormValidate: {
price: [ price: [
{ required: true, message: '请输入大于0小于9999的合法提现金额' }, {required: true, message: '请输入大于0小于9999的合法提现金额'},
{ {
pattern: /^[1-9]\d{0,3}(\.\d{1,2})?$/, pattern: /^[1-9]\d{0,3}(\.\d{1,2})?$/,
message: '请输入大于0小于9999的合法提现金额', message: '请输入大于0小于9999的合法提现金额',
trigger: 'change' trigger: 'change'
} }
] ],
realName: [
{required: true, message: '请输入真实姓名'},
],
connectNumber: [
{required: true, message: '请输入第三方登录账号'},
],
}, },
formValidate: { formValidate: {
price: [ price: [
{ required: true, message: '请输入大于等于1小于9999的合法充值金额' }, {required: true, message: '请输入大于等于1小于9999的合法充值金额'},
{ {
pattern: /^[1-9]\d{0,3}(\.\d{1,2})?$/, pattern: /^[1-9]\d{0,3}(\.\d{1,2})?$/,
message: '请输入大于等于1小于9999的合法充值金额', message: '请输入大于等于1小于9999的合法充值金额',
@@ -342,6 +369,8 @@ export default {
return h('div', [h('span', {}, '申请中')]); return h('div', [h('span', {}, '申请中')]);
} else if (params.row.applyStatus === 'VIA_AUDITING') { } else if (params.row.applyStatus === 'VIA_AUDITING') {
return h('div', [h('span', {}, '提现成功')]); return h('div', [h('span', {}, '提现成功')]);
} else if (params.row.applyStatus === 'ERROR') {
return h('div', [h('span', {}, '提现失败')]);
} else { } else {
return h('div', [h('span', {}, '审核拒绝')]); return h('div', [h('span', {}, '审核拒绝')]);
} }
@@ -362,12 +391,12 @@ export default {
withdrawApplyColumnsListData: {} // 提现记录 withdrawApplyColumnsListData: {} // 提现记录
}; };
}, },
mounted () { mounted() {
this.init(); this.init();
}, },
methods: { methods: {
// 初始化数据 // 初始化数据
init () { init() {
getMembersWallet().then((res) => { getMembersWallet().then((res) => {
this.frozenDeposit = res.result.memberFrozenWallet; this.frozenDeposit = res.result.memberFrozenWallet;
this.memberDeposit = res.result.memberWallet; this.memberDeposit = res.result.memberWallet;
@@ -378,7 +407,7 @@ export default {
} }
}); });
}, },
tabPaneChange (v) { tabPaneChange(v) {
// 如果查询充值记录 // 如果查询充值记录
if (v === 'recharge') { if (v === 'recharge') {
this.getRechargeData(); this.getRechargeData();
@@ -393,7 +422,7 @@ export default {
} }
}, },
// 充值记录 // 充值记录
getRechargeData () { getRechargeData() {
getRecharge(this.rechargeForm).then((res) => { getRecharge(this.rechargeForm).then((res) => {
if (res.message === 'success') { if (res.message === 'success') {
this.rechargeListData = res.result; this.rechargeListData = res.result;
@@ -401,7 +430,7 @@ export default {
}); });
}, },
// 提现记录 // 提现记录
getWithdrawApplyData () { getWithdrawApplyData() {
getWithdrawApply(this.withdrawApplyForm).then((res) => { getWithdrawApply(this.withdrawApplyForm).then((res) => {
if (res.message === 'success') { if (res.message === 'success') {
this.withdrawApplyColumnsListData = res.result; this.withdrawApplyColumnsListData = res.result;
@@ -409,49 +438,49 @@ export default {
}); });
}, },
// 余额日志 // 余额日志
changePage (v) { changePage(v) {
this.walletForm.pageNumber = v; this.walletForm.pageNumber = v;
this.init(); this.init();
}, },
changePageSize (v) { changePageSize(v) {
this.walletForm.pageNumber = 1; this.walletForm.pageNumber = 1;
this.walletForm.pageSize = v; this.walletForm.pageSize = v;
this.init(); this.init();
}, },
// 充值记录 // 充值记录
rechargeChangePage (v) { rechargeChangePage(v) {
this.rechargeForm.pageNumber = v; this.rechargeForm.pageNumber = v;
this.getRechargeData(); this.getRechargeData();
}, },
rechargeChangePageSize (v) { rechargeChangePageSize(v) {
this.rechargeForm.pageNumber = 1; this.rechargeForm.pageNumber = 1;
this.rechargeForm.pageSize = v; this.rechargeForm.pageSize = v;
this.getRechargeData(); this.getRechargeData();
}, },
// 提现记录 // 提现记录
withdrawChangePage (v) { withdrawChangePage(v) {
this.withdrawApplyForm.pageNumber = v; this.withdrawApplyForm.pageNumber = v;
this.getWithdrawApplyData(); this.getWithdrawApplyData();
}, },
withdrawChangePageSize (v) { withdrawChangePageSize(v) {
this.withdrawApplyForm.pageNumber = 1; this.withdrawApplyForm.pageNumber = 1;
this.withdrawApplyForm.pageSize = v; this.withdrawApplyForm.pageSize = v;
this.getWithdrawApplyData(); this.getWithdrawApplyData();
}, },
// 弹出在线充值框 // 弹出在线充值框
recharge () { recharge() {
this.formData.price = 1; this.formData.price = 1;
this.modal = true; this.modal = true;
}, },
// 在线充值 // 在线充值
rechargePrice () { rechargePrice() {
this.$refs['formData'].validate((valid) => { this.$refs['formData'].validate((valid) => {
if (valid) { if (valid) {
recharge(this.formData).then((res) => { recharge(this.formData).then((res) => {
if (res.message === 'success') { if (res.message === 'success') {
this.$router.push({ this.$router.push({
path: '/payment', path: '/payment',
query: { orderType: 'RECHARGE', sn: res.result.rechargeSn } query: {orderType: 'RECHARGE', sn: res.result.rechargeSn}
}); });
} }
}); });
@@ -459,12 +488,23 @@ export default {
}); });
}, },
// 申请提现弹出框 // 申请提现弹出框
withdrawalApply () { withdrawalApply() {
this.withdrawApplyFormData.price = 1;
this.withdrawApplyModal = true; this.withdrawApplyModal = true;
this.withdrawApplyFormData.minPrice = 1;
this.withdrawApplyFormData.price = 1;
this.withdrawApplyFormData.type = '';
this.withdrawApplyFormData.realName = '';
this.withdrawApplyFormData.connectNumber = '';
withdrawalSettingVO().then((res) => {
if (res.code === 200) {
this.withdrawApplyFormData.minPrice = res.result.minPrice;
this.withdrawApplyFormData.type = res.result.type;
this.withdrawApplyFormData.price = 1;
}
});
}, },
// 提现 // 提现
withdrawal () { withdrawal() {
this.$refs['withdrawApplyFormData'].validate((valid) => { this.$refs['withdrawApplyFormData'].validate((valid) => {
if (valid) { if (valid) {
withdrawalApply(this.withdrawApplyFormData).then((res) => { withdrawalApply(this.withdrawApplyFormData).then((res) => {
@@ -482,25 +522,30 @@ export default {
}; };
</script> </script>
<style scoped lang="scss"> <style lang="scss" scoped>
.box { .box {
margin: 20px 0; margin: 20px 0;
} }
.page-size { .page-size {
margin: 15px 0px; margin: 15px 0px;
display: flex; display: flex;
justify-content: flex-end; justify-content: flex-end;
align-items: center; align-items: center;
} }
.account-price { .account-price {
font-weight: bold; font-weight: bold;
} }
.subTips { .subTips {
margin-left: 10px; margin-left: 10px;
} }
.account-btns { .account-btns {
margin: 10px 0; margin: 10px 0;
} }
.ivu-btn { .ivu-btn {
margin: 0 4px; margin: 0 4px;
} }

View File

@@ -112,7 +112,10 @@ export default {
tracksList(this.params).then((res) => { tracksList(this.params).then((res) => {
this.spinShow = false; this.spinShow = false;
if (res.success && res.result.records.length) { if (res.success && res.result.records.length) {
this.list = res.result.records; this.list = res.result.records.filter(item =>{
return item != null
});
this.total = res.result.total
} else { } else {
this.list = []; this.list = [];
} }

View File

@@ -9,42 +9,29 @@
</div> </div>
<div class="cart-steps"> <div class="cart-steps">
<span :class="stepIndex == 1 ? 'active' : ''">1.我的购物车</span> <span :class="stepIndex == 1 ? 'active' : ''">1.我的购物车</span>
<Icon <Icon :class="stepIndex == 1 ? 'active-arrow' : ''" custom="icomoon icon-next"></Icon>
:class="stepIndex == 1 ? 'active-arrow' : ''"
custom="icomoon icon-next"
></Icon>
<span :class="stepIndex == 1 ? 'active' : ''">2.填写订单信息</span> <span :class="stepIndex == 1 ? 'active' : ''">2.填写订单信息</span>
<Icon <Icon :class="stepIndex == 1 ? 'active-arrow' : ''" custom="icomoon icon-next"></Icon>
:class="stepIndex == 1 ? 'active-arrow' : ''"
custom="icomoon icon-next"
></Icon>
<span :class="stepIndex == 2 ? 'active' : ''">3.成功提交订单</span> <span :class="stepIndex == 2 ? 'active' : ''">3.成功提交订单</span>
</div> </div>
</div> </div>
<Divider /> <Divider />
<div class="content width_1200"> <div class="content width_1200">
<!-- 收货地址 --> <!-- 收货地址 -->
<div class="address"> <div class="address" v-if="selectedDeliverMethod === 'LOGISTICS'">
<div class="card-head"> <div class="card-head">
<span>收货人信息</span> <span>收货人信息</span>
<span @click="goAddressManage">管理收货人地址</span> <span @click="goAddressManage">管理收货人地址</span>
</div> </div>
<div class="address-manage"> <div class="address-manage">
<div <div class="address-item" v-show="moreAddr ? true : index < 3"
class="address-item" :class="selectedAddress.id === item.id ? 'border-red' : ''" @mouseenter="showEditBtn = index"
v-show="moreAddr ? true : index < 3" @mouseleave="showEditBtn = ''" @click="selectAddress(item)" v-for="(item, index) in addressList"
:class="selectedAddress.id === item.id ? 'border-red' : ''" :key="index">
@mouseenter="showEditBtn = index"
@mouseleave="showEditBtn = ''"
@click="selectAddress(item)"
v-for="(item, index) in addressList"
:key="index"
>
<div> <div>
<span>{{ item.name }}</span> <span>{{ item.name }}</span>
<Tag class="ml_10" v-if="item.isDefault" color="red">默认</Tag> <Tag class="ml_10" v-if="item.isDefault" color="red">默认</Tag>
<Tag class="ml_10" v-if="item.alias" color="warning" <Tag class="ml_10" v-if="item.alias" color="warning">{{ item.alias }}
>{{ item.alias }}
</Tag> </Tag>
</div> </div>
<div>{{ item.mobile }}</div> <div>{{ item.mobile }}</div>
@@ -53,12 +40,7 @@
</div> </div>
<div class="edit-btn" v-show="showEditBtn === index"> <div class="edit-btn" v-show="showEditBtn === index">
<span @click.stop="editAddress(item.id)">修改</span> <span @click.stop="editAddress(item.id)">修改</span>
<span <span class="ml_10" v-if="!item.isDefault" @click.stop="delAddress(item)">删除</span>
class="ml_10"
v-if="!item.isDefault"
@click.stop="delAddress(item)"
>删除</span
>
</div> </div>
<div class="corner-icon" v-show="selectedAddress.id === item.id"> <div class="corner-icon" v-show="selectedAddress.id === item.id">
<div></div> <div></div>
@@ -70,75 +52,99 @@
<div>添加新地址</div> <div>添加新地址</div>
</div> </div>
</div> </div>
<div class="more-addr" @click="moreAddr = !moreAddr" v-if="addressList.length > 3">
<div
class="more-addr"
@click="moreAddr = !moreAddr"
v-if="addressList.length > 3"
>
{{ moreAddr ? "收起地址" : "更多地址" }} {{ moreAddr ? "收起地址" : "更多地址" }}
<Icon v-show="!moreAddr" type="md-arrow-dropdown" /> <Icon v-show="!moreAddr" type="md-arrow-dropdown" />
<Icon v-show="moreAddr" type="md-arrow-dropup" /> <Icon v-show="moreAddr" type="md-arrow-dropup" />
</div> </div>
</div> </div>
<div class="address" v-if="selectedDeliverMethod === 'SELF_PICK_UP'">
<div class="card-head">
<span>自提点信息</span>
</div>
<div class="address-manage">
<div class="address-item" v-show="storeMoreAddr ? true : index < 3"
:class="selectedAddress.id === item.id ? 'border-red' : ''" @mouseenter="showEditBtn = index"
@mouseleave="showEditBtn = ''" @click="selectStoreAddress(item)" v-for="(item, index) in storeAddressList"
:key="index">
<div>
<span>{{ item.addressName }}</span>
</div>
<div>{{ item.mobile }}</div>
<div>
{{ item.address | unitAddress }} {{ item.detail }}
</div>
<div class="corner-icon" v-show="selectedStoreAddress.id === item.id">
<div></div>
<Icon type="md-checkmark" />
</div>
</div>
</div>
<div class="more-addr" @click="storeMoreAddr = !storeMoreAddr" v-if="addressList.length > 3">
{{ storeMoreAddr ? "收起地址" : "更多地址" }}
<Icon v-show="!storeMoreAddr" type="md-arrow-dropdown" />
<Icon v-show="storeMoreAddr" type="md-arrow-dropup" />
</div>
</div>
<div>
</div>
<div class="goods-content">
<div class="card-head mt_20 mb_20">
<span>配送方式</span>
</div>
<div class="delivery-method">
<div class="method-item" v-show="moreAddr ? true : index < 3"
:class="selectedDeliverMethod === item.value ? 'border-red' : ''" @mouseenter="showEditBtn = item.value"
@mouseleave="showEditBtn = ''" @click="selectDeliverMethod(item)" v-for="(item, index) in shippingMethod"
:key="index">
<div>{{ item.label }}</div>
<div class="corner-icon" v-show="selectedDeliverMethod === item.value">
<div></div>
<Icon type="md-checkmark" />
</div>
</div>
</div>
</div>
<!-- 商品信息 --> <!-- 商品信息 -->
<div class="goods-content"> <div class="goods-content">
<div class="card-head mt_20 mb_20"> <div class="card-head mt_20 mb_20">
<span>商品信息</span> <span>商品信息</span>
<span @click="$router.push('/cart')">返回购物车</span> <span @click="$router.push('/cart')">返回购物车</span>
</div> </div>
<div <div class="goods-msg" v-for="(shop, shopIndex) in goodsList" :key="shopIndex">
class="goods-msg"
v-for="(shop, shopIndex) in goodsList"
:key="shopIndex"
>
<div v-if="shop.checked"> <div v-if="shop.checked">
<div class="shop-name"> <div class="shop-name">
<span> <span>
<span class="hover-color" @click="goShopPage(shop.storeId)">{{ <span class="hover-color" @click="goShopPage(shop.storeId)">{{
shop.storeName shop.storeName
}}</span }}</span>&nbsp;&nbsp;
>&nbsp;&nbsp;
</span> </span>
</div> </div>
<div class="goods-list"> <div class="goods-list">
<div <div class="goods-item" v-for="(goods, goodsIndex) in shop.checkedSkuList" :key="goodsIndex">
class="goods-item" <span class="hover-color" @click="
v-for="(goods, goodsIndex) in shop.checkedSkuList" goGoodsDetail(goods.goodsSku.id, goods.goodsSku.goodsId)
:key="goodsIndex" ">
>
<span
class="hover-color"
@click="
goGoodsDetail(goods.goodsSku.id, goods.goodsSku.goodsId)
"
>
<img :src="goods.goodsSku.thumbnail" alt="" /> <img :src="goods.goodsSku.thumbnail" alt="" />
<span style="vertical-align: top">{{ <span style="vertical-align: top">{{
goods.goodsSku.goodsName goods.goodsSku.goodsName
}}</span> }}</span>
</span> </span>
<span class="goods-price">{{ <span class="goods-price">{{
goods.purchasePrice | unitPrice("¥") goods.purchasePrice | unitPrice("¥")
}}</span> }}</span>
<span>x{{ goods.num }}</span> <span>x{{ goods.num }}</span>
<span>{{ goods.goodsSku.quantity > 0 ? "有货" : "无货" }}</span> <span>{{ goods.goodsSku.quantity > 0 ? "有货" : "无货" }}</span>
<span class="goods-price">{{ <span class="goods-price">{{
goods.subTotal | unitPrice("¥") goods.subTotal | unitPrice("¥")
}}</span> }}</span>
</div> </div>
</div> </div>
<div class="order-mark"> <div class="order-mark">
<Input <Input type="textarea" maxlength="60" v-model="shop.remark" show-word-limit placeholder="订单备注" />
type="textarea" <span style="font-size: 12px; color: #999">提示请勿填写有关支付收货发票方面的信息</span>
maxlength="60"
v-model="shop.remark"
show-word-limit
placeholder="订单备注"
/>
<span style="font-size: 12px; color: #999"
>提示请勿填写有关支付收货发票方面的信息</span
>
</div> </div>
</div> </div>
</div> </div>
@@ -146,13 +152,9 @@
<!-- 发票信息 --> <!-- 发票信息 -->
<div class="invoice"> <div class="invoice">
<div class="card-head mt_20 mb_20"> <div class="card-head mt_20 mb_20">
<span class="relative" <span class="relative">发票信息<span class="inv-tips">
>发票信息<span class="inv-tips"> <Icon type="ios-alert-outline" />开企业抬头发票须填写纳税人识别号以免影响报销
<Icon </span></span>
type="ios-alert-outline"
/>开企业抬头发票须填写纳税人识别号以免影响报销
</span></span
>
</div> </div>
<div class="inovice-content"> <div class="inovice-content">
<span>{{ invoiceData.receiptTitle }}</span> <span>{{ invoiceData.receiptTitle }}</span>
@@ -167,47 +169,24 @@
</div> </div>
<div v-if="couponList.length === 0">无可用优惠券</div> <div v-if="couponList.length === 0">无可用优惠券</div>
<ul v-else class="coupon-list"> <ul v-else class="coupon-list">
<li <li v-for="(item, index) in couponList" class="coupon-item" :key="index">
v-for="(item, index) in couponList"
class="coupon-item"
:key="index"
>
<div class="c-left"> <div class="c-left">
<div> <div>
<span <span v-if="item.couponType === 'PRICE'" class="fontsize_12 global_color">¥<span class="price">{{
v-if="item.couponType === 'PRICE'"
class="fontsize_12 global_color"
><span class="price">{{
item.price | unitPrice item.price | unitPrice
}}</span></span }}</span></span>
> <span v-if="item.couponType === 'DISCOUNT'" class="fontsize_12 global_color"><span class="price">{{
<span item.discount
v-if="item.couponType === 'DISCOUNT'" }}</span></span>
class="fontsize_12 global_color" <span class="describe">{{ item.consumeThreshold }}元可用</span>
><span class="price">{{ item.discount }}</span
></span
>
<span class="describe"
>{{ item.consumeThreshold }}元可用</span
>
</div> </div>
<p>使用范围{{ useScope(item.scopeType) }}</p> <p>使用范围{{ useScope(item.scopeType) }}</p>
<p>有效期{{ item.endTime }}</p> <p>有效期{{ item.endTime }}</p>
</div> </div>
<img <img class="used" v-if="usedCouponId.includes(item.id)" src="../../assets/images/geted.png" alt="" />
class="used"
v-if="usedCouponId.includes(item.id)"
src="../../assets/images/geted.png"
alt=""
/>
<b></b> <b></b>
<a class="c-right" @click="useCoupon(item.id, true)">立即使用</a> <a class="c-right" @click="useCoupon(item.id, true)">立即使用</a>
<a <a class="c-right" v-if="usedCouponId.includes(item.id)" @click="useCoupon(item.id, false)">放弃优惠</a>
class="c-right"
v-if="usedCouponId.includes(item.id)"
@click="useCoupon(item.id, false)"
>放弃优惠</a
>
<i class="circle-top"></i> <i class="circle-top"></i>
<i class="circle-bottom"></i> <i class="circle-bottom"></i>
</li> </li>
@@ -216,30 +195,24 @@
<!-- 订单价格 --> <!-- 订单价格 -->
<div class="order-price"> <div class="order-price">
<div> <div>
<span>{{ totalNum }}件商品总商品金额</span <span>{{ totalNum }}件商品总商品金额</span><span>{{ priceDetailDTO.goodsPrice | unitPrice("¥") }}</span>
><span>{{ priceDetailDTO.goodsPrice | unitPrice("¥") }}</span>
</div> </div>
<div v-if="priceDetailDTO.freightPrice > 0"> <div v-if="priceDetailDTO.freightPrice > 0">
<span>运费</span <span>运费</span><span>{{ priceDetailDTO.freightPrice | unitPrice("¥") }}</span>
><span>{{ priceDetailDTO.freightPrice | unitPrice("¥") }}</span>
</div> </div>
<div v-if="priceDetailDTO.discountPrice > 0"> <div v-if="priceDetailDTO.discountPrice > 0">
<span>优惠金额</span <span>优惠金额</span><span>-{{ priceDetailDTO.discountPrice | unitPrice("¥") }}</span>
><span>-{{ priceDetailDTO.discountPrice | unitPrice("¥") }}</span>
</div> </div>
<div v-if="priceDetailDTO.couponPrice > 0"> <div v-if="priceDetailDTO.couponPrice > 0">
<span>优惠券金额</span <span>优惠券金额</span><span>-{{ priceDetailDTO.couponPrice | unitPrice("¥") }}</span>
><span>-{{ priceDetailDTO.couponPrice | unitPrice("¥") }}</span>
</div> </div>
<div v-if="$route.query.way === 'POINTS'"> <div v-if="$route.query.way === 'POINTS'">
<span>应付积分</span <span>应付积分</span><span class="actrual-price">{{ priceDetailDTO.payPoint }}</span>
><span class="actrual-price">{{ priceDetailDTO.payPoint }}</span>
</div> </div>
<div v-else> <div v-else>
<span>应付金额</span <span>应付金额</span><span class="actrual-price">{{
><span class="actrual-price">{{ priceDetailDTO.flowPrice | unitPrice("¥")
priceDetailDTO.flowPrice | unitPrice("¥")
}}</span> }}</span>
</div> </div>
</div> </div>
@@ -247,26 +220,21 @@
<!-- 底部支付栏 --> <!-- 底部支付栏 -->
<div class="order-footer width_1200"> <div class="order-footer width_1200">
<div class="pay ml_20" @click="pay">提交订单</div> <div class="pay ml_20" @click="pay">提交订单</div>
<div class="pay-address" v-if="addressList.length"> <div class="pay-address" v-if="addressList.length && selectedDeliverMethod === 'LOGISTICS'">
配送至{{ selectedAddress.consigneeAddressPath | unitAddress }} 配送至{{ selectedAddress.consigneeAddressPath | unitAddress }}
{{ selectedAddress.detail }}&nbsp;&nbsp;收货人{{ {{ selectedAddress.detail }}&nbsp;&nbsp;收货人{{
selectedAddress.name selectedAddress.name
}}&nbsp;&nbsp;{{ selectedAddress.mobile }} }}&nbsp;&nbsp;{{ selectedAddress.mobile }}
</div> </div>
<div class="pay-address" v-if="addressList.length && selectedDeliverMethod === 'SELF_PICK_UP'">
自提地点{{selectedStoreAddress.address}} &nbsp;&nbsp;联系方式{{ selectedStoreAddress.mobile }}
</div>
</div> </div>
<BaseFooter></BaseFooter> <BaseFooter></BaseFooter>
<!-- 添加发票模态框 --> <!-- 添加发票模态框 -->
<invoice-modal <invoice-modal ref="invModal" :invoiceData="invoiceData" @change="getInvMsg" />
ref="invModal"
:invoiceData="invoiceData"
@change="getInvMsg"
/>
<!-- 选择地址模态框 --> <!-- 选择地址模态框 -->
<address-manage <address-manage ref="address" :id="addrId" @change="addrChange"></address-manage>
ref="address"
:id="addrId"
@change="addrChange"
></address-manage>
</div> </div>
</template> </template>
@@ -279,8 +247,12 @@ import {
createTrade, createTrade,
selectAddr, selectAddr,
selectCoupon, selectCoupon,
setShipMethod,
setStoreAddressId,
shippingMethodList,
couponNum, couponNum,
} from "@/api/cart"; } from "@/api/cart";
import { getStoreAddress } from "@/api/shopentry.js"
import { canUseCouponList } from "@/api/member.js"; import { canUseCouponList } from "@/api/member.js";
export default { export default {
@@ -288,15 +260,35 @@ export default {
components: { invoiceModal, addressManage }, components: { invoiceModal, addressManage },
data() { data() {
return { return {
selectedStoreAddress: 'm',
selectMethod: '',
stepIndex: 1, // 顶部步骤条状态 stepIndex: 1, // 顶部步骤条状态
invoiceAvailable: false, // 发票编辑按钮 invoiceAvailable: false, // 发票编辑按钮
showEditBtn: "", // 鼠标移入显示编辑按钮 showEditBtn: "", // 鼠标移入显示编辑按钮
orderMark: "", // 订单备注 orderMark: "", // 订单备注
storeMoreAddr: false,
invoiceData: { invoiceData: {
// 发票数据 // 发票数据
receiptTitle: "个人", receiptTitle: "个人",
receiptContent: "不开发票", receiptContent: "不开发票",
}, },
searchForm: {
pageNumber: 1,
pageSize: 100
},
shippingMethod: [],
storeAddressList: [],
shippingWay: [
{
value: "LOGISTICS",
label: "物流",
},
{
value: "SELF_PICK_UP",
label: "自提",
},
],
selectedDeliverMethod: 'LOGISTICS',
addressList: [], // 地址列表 addressList: [], // 地址列表
selectedAddress: {}, // 所选地址 selectedAddress: {}, // 所选地址
goodsList: [], // 商品列表 goodsList: [], // 商品列表
@@ -308,6 +300,7 @@ export default {
couponList: [], // 可用优惠券列表 couponList: [], // 可用优惠券列表
usedCouponId: [], // 已使用优惠券id usedCouponId: [], // 已使用优惠券id
selectedCoupon: {}, // 已选优惠券对象 selectedCoupon: {}, // 已选优惠券对象
storeId: '', //店铺Id
}; };
}, },
mounted() { mounted() {
@@ -317,6 +310,7 @@ export default {
// 初始化数据 // 初始化数据
init() { init() {
this.getGoodsDetail(); this.getGoodsDetail();
this.getDistribution();
}, },
goAddressManage() { goAddressManage() {
// 跳转地址管理页面 // 跳转地址管理页面
@@ -324,7 +318,7 @@ export default {
}, },
getAddress() { getAddress() {
// 获取收货地址列表 // 获取收货地址列表
memberAddress().then((res) => { memberAddress(this.searchForm).then((res) => {
if (res.success) { if (res.success) {
this.addressList = res.result.records; this.addressList = res.result.records;
this.addressList.forEach((e, index) => { this.addressList.forEach((e, index) => {
@@ -335,6 +329,38 @@ export default {
} }
}); });
}, },
// 获取配送方式列表
async getDistribution() {
let shopRes = await shippingMethodList({ way: this.$route.query.way });
let shopList;
if (shopRes.success) {
shopList = shopRes.result;
let way = [];
console.log(shopList)
this.shippingWay.forEach((item) => {
shopList.forEach((child) => {
if (item.value == child) {
way.push(item);
}
});
});
this.shippingMethod = way;
console.log(this.shippingMethod)
}
},
async getStoreAddressList() {
getStoreAddress(this.storeId,this.searchForm).then(res => {
if (res.success) {
this.storeAddressList = res.result.records
this.storeAddressList.forEach((e, index) => {
if (e.id === this.selectedAddress.id && index > 2) {
this.storeMoreAddr = true;
}
});
}
})
},
getGoodsDetail() { getGoodsDetail() {
// 订单商品详情 // 订单商品详情
this.$Spin.show(); this.$Spin.show();
@@ -364,7 +390,7 @@ export default {
this.goodsList = res.result.cartList; this.goodsList = res.result.cartList;
this.priceDetailDTO = res.result.priceDetailDTO; this.priceDetailDTO = res.result.priceDetailDTO;
this.skuList = res.result.skuList; this.skuList = res.result.skuList;
this.storeId = this.goodsList[0].storeId
if (res.result.receiptVO) { if (res.result.receiptVO) {
this.invoiceData = res.result.receiptVO; this.invoiceData = res.result.receiptVO;
} }
@@ -401,6 +427,7 @@ export default {
this.selectedAddress = res.result.memberAddress; this.selectedAddress = res.result.memberAddress;
} }
this.getAddress(); this.getAddress();
this.getStoreAddressList();
this.totalNum = 0; this.totalNum = 0;
for (let i = 0; i < this.skuList.length; i++) { for (let i = 0; i < this.skuList.length; i++) {
this.totalNum += this.skuList[i].num; this.totalNum += this.skuList[i].num;
@@ -475,8 +502,32 @@ export default {
}; };
selectAddr(params).then((res) => { selectAddr(params).then((res) => {
if (res.success) { if (res.success) {
this.$Message.success("选择收货地址成功"); this.$Message.success("选择配送方式成功");
this.selectedAddress = item; this.selectMethod = item;
this.getGoodsDetail();
}
});
},
selectStoreAddress(item) {
console.log(item.id)
console.log(this.$route.query.way)
// 选择自提地址
setStoreAddressId(item.id,this.$route.query.way).then((res) => {
if (res.success) {
this.$Message.success("选择自提地址成功");
this.selectedStoreAddress = item;
this.getGoodsDetail();
}
});
},
selectDeliverMethod(item) {
let params = {
way: this.$route.query.way,
shippingMethod: item.value,
};
setShipMethod(params).then((res) => {
if (res.success) {
this.selectedDeliverMethod = item.value;
this.getGoodsDetail(); this.getGoodsDetail();
} }
}); });
@@ -503,7 +554,7 @@ export default {
} }
}); });
}, },
onCancel: () => {}, onCancel: () => { },
}); });
}, },
goGoodsDetail(skuId, goodsId) { goGoodsDetail(skuId, goodsId) {
@@ -605,9 +656,11 @@ export default {
<style scoped lang="scss"> <style scoped lang="scss">
@import "../../assets/styles/coupon.scss"; @import "../../assets/styles/coupon.scss";
.goods-msg { .goods-msg {
overflow: hidden; overflow: hidden;
} }
/** logo start */ /** logo start */
.logo { .logo {
height: 40px; height: 40px;
@@ -680,12 +733,82 @@ export default {
padding: 15px 25px; padding: 15px 25px;
} }
.delivery-method {
display: flex;
flex-wrap: wrap;
>div {
border: 1px dotted #949494;
width: 50px;
height: 40px;
margin: 20px 20px 0 0;
padding: 10px;
cursor: pointer;
color: #999;
}
.method-item {
position: relative;
font-size: 12px;
>div:nth-child(1) {
margin-bottom: 10px;
span {
margin-right: 10px;
}
>span:nth-child(1) {
color: #000000;
font-size: 14px;
}
}
.edit-btn {
font-size: 12px;
position: absolute;
top: 15px;
right: 20px;
color: $theme_color;
span:hover {
border-bottom: 1px solid $theme_color;
}
}
.corner-icon {
position: absolute;
right: -1px;
bottom: -1px;
div {
width: 0;
border-top: 20px solid transparent;
border-right: 20px solid $theme_color;
}
.ivu-icon {
font-size: 12px;
position: absolute;
bottom: 0;
right: 1px;
transform: rotate(-15deg);
color: #fff;
}
}
}
.border-red {
border-color: $theme_color;
}
}
/** 地址管理 */ /** 地址管理 */
.address-manage { .address-manage {
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
> div { >div {
border: 1px dotted #949494; border: 1px dotted #949494;
width: 265px; width: 265px;
height: 120px; height: 120px;
@@ -704,20 +827,21 @@ export default {
.ivu-icon { .ivu-icon {
font-size: 24px; font-size: 24px;
} }
} }
.address-item { .address-item {
position: relative; position: relative;
font-size: 12px; font-size: 12px;
> div:nth-child(1) { >div:nth-child(1) {
margin-bottom: 10px; margin-bottom: 10px;
span { span {
margin-right: 10px; margin-right: 10px;
} }
> span:nth-child(1) { >span:nth-child(1) {
color: #000000; color: #000000;
font-size: 14px; font-size: 14px;
} }
@@ -767,7 +891,7 @@ export default {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
> span:nth-child(1) { >span:nth-child(1) {
font-weight: bold; font-weight: bold;
.ivu-icon { .ivu-icon {
@@ -779,7 +903,7 @@ export default {
} }
} }
> span:nth-child(2) { >span:nth-child(2) {
color: #999; color: #999;
position: relative; position: relative;
display: flex; display: flex;
@@ -833,22 +957,23 @@ export default {
height: 48px; height: 48px;
} }
> span { >span {
text-align: center; text-align: center;
width: 100px; width: 100px;
} }
> span:nth-child(1) { >span:nth-child(1) {
font-size: 12px; font-size: 12px;
flex: 1; flex: 1;
text-align: left; text-align: left;
> span {
>span {
margin-left: 10px; margin-left: 10px;
} }
} }
> span:last-child { >span:last-child {
color: $theme_color; color: $theme_color;
font-weight: bold; font-weight: bold;
} }
@@ -895,11 +1020,11 @@ export default {
} }
.inovice-content { .inovice-content {
> span { >span {
margin-right: 10px; margin-right: 10px;
} }
> span:last-child { >span:last-child {
color: $theme_color; color: $theme_color;
cursor: pointer; cursor: pointer;
@@ -919,7 +1044,7 @@ export default {
font-size: 16px; font-size: 16px;
color: #999; color: #999;
> div > span:nth-child(2) { >div>span:nth-child(2) {
width: 130px; width: 130px;
text-align: right; text-align: right;
display: inline-block; display: inline-block;

View File

@@ -6,12 +6,7 @@
<div class="promotion-decorate">限时秒杀</div> <div class="promotion-decorate">限时秒杀</div>
<ul class="time-line"> <ul class="time-line">
<template v-for="(time, index) in list"> <template v-for="(time, index) in list">
<li <li v-if="index < 5" @click="currIndex = index" :key="index" :class="{ currTimeline: currIndex === index }">
v-if="index < 5"
@click="currIndex = index"
:key="index"
:class="{ currTimeline: currIndex === index }"
>
<div>{{ time.timeLine + ":00" }}</div> <div>{{ time.timeLine + ":00" }}</div>
<div v-if="currIndex === index"> <div v-if="currIndex === index">
<p>{{ nowHour >= time.timeLine ? "秒杀中" : "即将开始" }}</p> <p>{{ nowHour >= time.timeLine ? "秒杀中" : "即将开始" }}</p>
@@ -30,13 +25,8 @@
<!-- 秒杀商品列表 --> <!-- 秒杀商品列表 -->
<div class="goods-list"> <div class="goods-list">
<empty v-if="goodsList.length === 0" /> <empty v-if="goodsList.length === 0" />
<div <div v-else class="goods-show-info1" v-for="(item, index) in goodsList" :key="index"
v-else @click="goGoodsDetail(item.skuId, item.goodsId)">
class="goods-show-info1"
v-for="(item, index) in goodsList"
:key="index"
@click="goGoodsDetail(item.skuId, item.goodsId)"
>
<div class="goods-show-img"> <div class="goods-show-img">
<img width="200" height="200" :src="item.goodsImage" /> <img width="200" height="200" :src="item.goodsImage" />
</div> </div>
@@ -53,42 +43,28 @@
<div class="goods-show-detail"> <div class="goods-show-detail">
<span>{{ item.goodsName }}</span> <span>{{ item.goodsName }}</span>
</div> </div>
<div <div class="goods-seckill-btn" :class="{
class="goods-seckill-btn" 'goods-seckill-btn-gray': nowHour < list[currIndex].timeLine,
:class="{ }">
'goods-seckill-btn-gray': nowHour < list[currIndex].timeLine,
}"
>
{{ nowHour >= list[currIndex].timeLine ? "立即抢购" : "即将开始" }} {{ nowHour >= list[currIndex].timeLine ? "立即抢购" : "即将开始" }}
</div> </div>
<div <div v-if="nowHour >= list[currIndex].timeLine && item.quantity <= item.salesNum"
v-if="nowHour >= list[currIndex].timeLine" class="goods-seckill-btn goods-seckill-btn-gray">
class="goods-seckill-btn goods-seckill-btn-gray"
>
已售罄 已售罄
</div> </div>
<div v-if="nowHour >= list[currIndex].timeLine" class="goods-show-num1"> <div v-if="nowHour >= list[currIndex].timeLine" class="goods-show-num1">
<span <span>已售{{
>已售{{ (item.quantity && item.quantity > 0
(item.quantity && item.quantity > 0 ? Math.ceil(
? Math.ceil( (item.salesNum / (item.quantity + item.salesNum)) * 100
(item.salesNum / (item.quantity + item.salesNum)) * 100 )
) : 100) + "%"
: 100) + "%" }}</span><Progress hide-info stroke-color="#df0021" style="width: 110px" class="ml_10" :percent="item.quantity && item.quantity > 0
}}</span ? Math.ceil(
><Progress (item.salesNum / (item.quantity + item.salesNum)) * 100
hide-info )
stroke-color="#df0021" : 100
style="width: 110px" " />
class="ml_10"
:percent="
item.quantity && item.quantity > 0
? Math.ceil(
(item.salesNum / (item.quantity + item.salesNum)) * 100
)
: 100
"
/>
</div> </div>
<div class="goods-show-seller"> <div class="goods-show-seller">
<span>{{ item.storeName }}</span> <span>{{ item.storeName }}</span>
@@ -101,7 +77,7 @@
<script> <script>
import { seckillByDay } from "@/api/promotion"; import { seckillByDay } from "@/api/promotion";
export default { export default {
data() { data () {
return { return {
list: [], // 秒杀时段列表 list: [], // 秒杀时段列表
goodsList: [], // 商品列表 goodsList: [], // 商品列表
@@ -112,19 +88,19 @@ export default {
nowHour: new Date().getHours(), // 当前小时数 nowHour: new Date().getHours(), // 当前小时数
}; };
}, },
beforeDestroy() { beforeDestroy () {
// 销毁前清除定时器 // 销毁前清除定时器
clearInterval(this.interval); clearInterval(this.interval);
}, },
watch: { watch: {
currIndex(val) { currIndex (val) {
clearInterval(this.interval); clearInterval(this.interval);
this.interval = null; this.interval = null;
this.nowHour = new Date().getHours(); this.nowHour = new Date().getHours();
this.countDown(val); this.countDown(val);
this.goodsList = this.list[val].seckillGoodsList; this.goodsList = this.list[val].seckillGoodsList;
}, },
diffSeconds(val) { diffSeconds (val) {
const hours = Math.floor(val / 3600); const hours = Math.floor(val / 3600);
// 当前秒数 / 60向下取整 // 当前秒数 / 60向下取整
// 获取到所有分钟数 3600 / 60 = 60分钟 // 获取到所有分钟数 3600 / 60 = 60分钟
@@ -138,7 +114,7 @@ export default {
clearInterval(this.interval); clearInterval(this.interval);
this.interval = null; this.interval = null;
} }
function filteTime(time) { function filteTime (time) {
if (time < 10) { if (time < 10) {
return "0" + time; return "0" + time;
} else { } else {
@@ -148,7 +124,7 @@ export default {
}, },
}, },
methods: { methods: {
getListByDay() { getListByDay () {
// 当天秒杀活动 // 当天秒杀活动
seckillByDay().then((res) => { seckillByDay().then((res) => {
if (res.success) { if (res.success) {
@@ -158,7 +134,7 @@ export default {
} }
}); });
}, },
goGoodsDetail(skuId, goodsId) { goGoodsDetail (skuId, goodsId) {
// 跳转商品详情 // 跳转商品详情
let routeUrl = this.$router.resolve({ let routeUrl = this.$router.resolve({
path: "/goodsDetail", path: "/goodsDetail",
@@ -166,7 +142,7 @@ export default {
}); });
window.open(routeUrl.href, "_blank"); window.open(routeUrl.href, "_blank");
}, },
countDown(currIndex) { countDown (currIndex) {
// 倒计时 // 倒计时
// 0点时间戳 // 0点时间戳
let zeroTime = new Date(new Date().toLocaleDateString()).getTime(); let zeroTime = new Date(new Date().toLocaleDateString()).getTime();
@@ -191,13 +167,14 @@ export default {
}, 1000); }, 1000);
}, },
}, },
mounted() { mounted () {
this.getListByDay(); this.getListByDay();
}, },
}; };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "../../assets/styles/goodsList.scss"; @import "../../assets/styles/goodsList.scss";
.goods-seckill-btn { .goods-seckill-btn {
position: absolute; position: absolute;
right: 0; right: 0;
@@ -209,20 +186,26 @@ export default {
line-height: 35px; line-height: 35px;
font-size: 14px; font-size: 14px;
background-color: $theme_color; background-color: $theme_color;
margin-bottom: 1px;
margin-right: 1px;
} }
.goods-seckill-btn-gray { .goods-seckill-btn-gray {
background-color: #666; background-color: #666;
} }
.promotion-decorate::before, .promotion-decorate::before,
.promotion-decorate::after { .promotion-decorate::after {
background-image: url("/src/assets/images/sprite@2x.png"); background-image: url("/src/assets/images/sprite@2x.png");
} }
.time-line { .time-line {
width: 1200px; width: 1200px;
height: 60px; height: 60px;
margin: 0 auto; margin: 0 auto;
background-color: #fff; background-color: #fff;
display: flex; display: flex;
li { li {
padding: 0 30px; padding: 0 30px;
font-size: 16px; font-size: 16px;
@@ -231,9 +214,11 @@ export default {
height: 100%; height: 100%;
display: flex; display: flex;
align-items: center; align-items: center;
&:hover { &:hover {
cursor: pointer; cursor: pointer;
} }
.not-curr { .not-curr {
border: 1px solid #999; border: 1px solid #999;
border-radius: 20px; border-radius: 20px;
@@ -243,37 +228,44 @@ export default {
font-weight: normal; font-weight: normal;
} }
} }
.currTimeline { .currTimeline {
background-color: $theme_color; background-color: $theme_color;
color: #fff; color: #fff;
> div:nth-child(1) {
>div:nth-child(1) {
font-size: 20px; font-size: 20px;
} }
> div:nth-child(2) {
>div:nth-child(2) {
font-size: 14px; font-size: 14px;
margin-left: 10px; margin-left: 10px;
} }
} }
} }
.goods-show-info1 { .goods-show-info1 {
width: 275px; width: 290px;
padding: 6px; padding: 6px;
margin: 10px 0px; margin: 10px 0px;
margin-left: 5px; margin-left: 8px;
position: relative; position: relative;
border: 1px solid #fff; border: 1px solid #fff;
cursor: pointer; cursor: pointer;
background-color: #fff; background-color: #fff;
} }
.goods-show-info1:hover { .goods-show-info1:hover {
border: 1px solid #ccc; border: 1px solid #ccc;
box-shadow: 0px 0px 15px #ccc; box-shadow: 0px 0px 15px #ccc;
} }
.goods-show-img { .goods-show-img {
display: flex; display: flex;
justify-content: center; justify-content: center;
} }
.ivu-progress-success .ivu-progress-bg { .ivu-progress-success .ivu-progress-bg {
background-color: #111fff; background-color: #111fff;
} }
</style> </style>

View File

@@ -10,11 +10,8 @@
/> />
</FormItem> </FormItem>
<FormItem prop="companyAddressIdPath" label="公司所在地"> <FormItem prop="companyAddressIdPath" label="公司所在地">
<region <span>{{ form.companyAddressPath || '暂无地址' }}</span>
style="width: 250px" <Button type="default" style="margin-left: 10px;" @click="$refs.map.open()">选择</Button>
@selected="selectedRegion"
:addressId="address"
/>
</FormItem> </FormItem>
<FormItem prop="companyAddress" label="公司详细地址"> <FormItem prop="companyAddress" label="公司详细地址">
<Input <Input
@@ -187,16 +184,18 @@
<Modal title="View Image" v-model="visible"> <Modal title="View Image" v-model="visible">
<img :src="previewPicture" v-if="visible" style="width: 100%" /> <img :src="previewPicture" v-if="visible" style="width: 100%" />
</Modal> </Modal>
<multipleMap ref="map" @callback="getAddress" />
</div> </div>
</template> </template>
<script> <script>
import { applyFirst } from '@/api/shopentry'; import { applyFirst } from '@/api/shopentry';
import * as RegExp from '@/plugins/RegExp.js'; import * as RegExp from '@/plugins/RegExp.js';
import region from '@/components/map/region.vue'; import multipleMap from "@/components/map/multiple-map";
import storage from '@/plugins/storage'; import storage from '@/plugins/storage';
import { commonUrl } from '@/plugins/request.js'; import { commonUrl } from '@/plugins/request.js';
export default { export default {
components: { region }, components: { multipleMap },
props: { props: {
content: { content: {
default: {}, default: {},
@@ -209,7 +208,7 @@ export default {
accessToken: {}, // 验证token accessToken: {}, // 验证token
visible: false, // 预览图片 visible: false, // 预览图片
loading: false, // 加载状态 loading: false, // 加载状态
address: '', // 地址
previewPicture: '', // 预览图片url previewPicture: '', // 预览图片url
form: { // 表单数据 form: { // 表单数据
legalPhoto: [], legalPhoto: [],
@@ -234,7 +233,7 @@ export default {
], ],
companyPhone: [ companyPhone: [
{ required: true, message: '请填写公司电话' }, { required: true, message: '请填写公司电话' },
{ pattern: RegExp.TEL, message: '请填写正确的号码' } { pattern: RegExp.mobile, message: '请填写正确的号码' }
], ],
companyEmail: [ companyEmail: [
{ required: true, message: '请填写电子邮箱' }, { required: true, message: '请填写电子邮箱' },
@@ -258,6 +257,19 @@ export default {
}; };
}, },
methods: { methods: {
// 获取店铺地址
getAddress(val){
if(val.type === 'select'){
const paths = val.data.map(item => item.name).join(',')
const ids = val.data.map(item => item.id).join(',')
this.$set(this.form, 'companyAddressIdPath', ids)
this.$set(this.form, 'companyAddressPath', paths)
}else{
this.$set(this.form, 'companyAddressIdPath', val.data.addrId)
this.$set(this.form, 'companyAddressPath', val.data.addr)
}
},
// 下一步 // 下一步
next () { next () {
this.$refs.firstForm.validate((valid) => { this.$refs.firstForm.validate((valid) => {
@@ -279,15 +291,7 @@ export default {
} }
}); });
}, },
// 地址选择回显
selectedRegion (item) {
this.$set(this.form, 'companyAddressIdPath', item[0].toString());
this.$set(
this.form,
'companyAddressPath',
item[1].toString().replace(/\s/g, '')
);
},
// 上传之前 // 上传之前
beforeUpload () { beforeUpload () {
this.uploadLoading = true; this.uploadLoading = true;
@@ -354,7 +358,7 @@ export default {
if (this.form.licencePhoto) { if (this.form.licencePhoto) {
this.form.legalPhoto = this.content.legalPhoto.split(','); this.form.legalPhoto = this.content.legalPhoto.split(',');
this.form.licencePhoto = this.content.licencePhoto.split(','); this.form.licencePhoto = this.content.licencePhoto.split(',');
this.address = this.form.companyAddressIdPath;
} }
} }
} }

View File

@@ -22,6 +22,7 @@
<span v-if="storeDisable == 'REFUSED'">审核未通过,请修改资质信息如有疑问请联系管理员</span> <span v-if="storeDisable == 'REFUSED'">审核未通过,请修改资质信息如有疑问请联系管理员</span>
</div> </div>
<Button v-if="currentIndex === 3" @click="$router.push('/')">返回</Button> <Button v-if="currentIndex === 3" @click="$router.push('/')">返回</Button>
&nbsp;
<Button type="primary" @click='currentIndex = 0' <Button type="primary" @click='currentIndex = 0'
v-if="storeDisable === 'REFUSED' && currentIndex === 3">重新申请</Button> v-if="storeDisable === 'REFUSED' && currentIndex === 3">重新申请</Button>
</div> </div>
@@ -162,7 +163,7 @@ export default {
padding: 10px 20px; padding: 10px 20px;
h1 { h1 {
margin-top: 20px; margin-top: 20px;
} }
} }

View File

@@ -60,24 +60,10 @@
> >
</Select> </Select>
</FormItem> </FormItem>
<FormItem prop="storeCenter" label="店铺定位">
<Button
type="info"
v-if="!form.storeCenter"
@click="$refs.liliMap.showMap = true"
>点击获取店铺定位</Button>
<Button
type="success"
v-else
@click="$refs.liliMap.showMap = true"
>已定位</Button>
</FormItem>
<FormItem prop="storeAddressIdPath" label="店铺所在地"> <FormItem prop="storeAddressIdPath" label="店铺所在地">
<region <span>{{ form.storeAddressPath || '暂无地址' }}</span>
style="width: 250px" <Button type="default" style="margin-left: 10px;" @click="$refs.map.open()">选择</Button>
@selected="selectedRegion"
:addressId="address"
/>
</FormItem> </FormItem>
<FormItem prop="storeAddressDetail" label="店铺详细地址"> <FormItem prop="storeAddressDetail" label="店铺详细地址">
<Input <Input
@@ -107,16 +93,20 @@
<Modal title="View Image" v-model="visible"> <Modal title="View Image" v-model="visible">
<img :src="previewPicture" v-if="visible" style="width: 100%" /> <img :src="previewPicture" v-if="visible" style="width: 100%" />
</Modal> </Modal>
<lili-map ref="liliMap" @getAddress="getAddress" :useApi="false"></lili-map> <multipleMap ref="map" @callback="getAddress" />
</div> </div>
</template> </template>
<script> <script>
import { applyThird } from '@/api/shopentry'; import { applyThird } from '@/api/shopentry';
import { getCategory } from '@/api/goods'; import { getCategory } from '@/api/goods';
import Map from '@/components/map/index';
import storage from '@/plugins/storage'; import storage from '@/plugins/storage';
import { commonUrl } from '@/plugins/request.js'; import { commonUrl } from '@/plugins/request.js';
import region from '@/components/map/region.vue';
import multipleMap from "@/components/map/multiple-map";
export default { export default {
props: { props: {
content: { content: {
@@ -124,7 +114,7 @@ export default {
type: Object type: Object
} }
}, },
components: { liliMap: Map, region }, components: { multipleMap },
data () { data () {
return { return {
loading: false, // 加载状态 loading: false, // 加载状态
@@ -132,7 +122,7 @@ export default {
action: commonUrl + '/common/common/upload/file', // 上传地址 action: commonUrl + '/common/common/upload/file', // 上传地址
accessToken: {}, // 验证token accessToken: {}, // 验证token
previewPicture: '', // 预览图片 previewPicture: '', // 预览图片
address: '', // 回显地址
visible: false, // 图片预览 visible: false, // 图片预览
form: { // 表单数据 form: { // 表单数据
storeLogo: [] storeLogo: []
@@ -217,12 +207,22 @@ export default {
this.form[listName].splice(index, 1); this.form[listName].splice(index, 1);
}, },
// 选择坐标回调 // 选择坐标回调
getAddress (item) { getAddress (val) {
this.$set( if(val.type === 'select'){
this.form, const paths = val.data.map(item => item.name).join(',')
'storeCenter', const ids = val.data.map(item => item.id).join(',')
item.position.lng + ',' + item.position.lat this.$set(this.form, "storeAddressPath", paths);
); this.$set(this.form, "storeAddressIdPath", ids);
this.form.storeCenter = val.data[val.data.length - 1].center
}else{
this.$set(this.form, "storeAddressPath", val.data.addr);
this.$set(this.form, "storeAddressIdPath", val.data.addrId);
this.$set(
this.form,
'storeCenter',
val.data.position.lng + ',' + val.data.position.lat
);
}
}, },
// 获取商品分类 // 获取商品分类
getCategoryList () { getCategoryList () {
@@ -230,15 +230,8 @@ export default {
if (res.success) this.categoryList = res.result; if (res.success) this.categoryList = res.result;
}); });
}, },
// 地址选择回显
selectedRegion (item) {
this.$set(this.form, 'storeAddressIdPath', item[0].toString());
this.$set(
this.form,
'storeAddressPath',
item[1].toString().replace(/\s/g, '')
);
}
}, },
mounted () { mounted () {
this.accessToken.accessToken = storage.getItem('accessToken'); this.accessToken.accessToken = storage.getItem('accessToken');
@@ -253,7 +246,6 @@ export default {
} else { } else {
this.form.storeLogo = []; this.form.storeLogo = [];
} }
this.address = this.form.storeAddressIdPath;
this.$forceUpdate(); this.$forceUpdate();
} }
this.$refs.thirdForm.resetFields() this.$refs.thirdForm.resetFields()

View File

@@ -160,7 +160,7 @@ service.interceptors.response.use(
Message.error(errorData.message || _message); Message.error(errorData.message || _message);
} }
} }
return Promise.reject(error); return Promise.reject(errorData);
} }
); );

View File

@@ -738,6 +738,11 @@ argparse@^1.0.7:
dependencies: dependencies:
sprintf-js "~1.0.2" sprintf-js "~1.0.2"
argparse@^2.0.1:
version "2.0.1"
resolved "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
arr-diff@^4.0.0: arr-diff@^4.0.0:
version "4.0.0" version "4.0.0"
resolved "https://registry.npm.taobao.org/arr-diff/download/arr-diff-4.0.0.tgz" resolved "https://registry.npm.taobao.org/arr-diff/download/arr-diff-4.0.0.tgz"
@@ -1316,6 +1321,11 @@ callsites@^2.0.0:
resolved "https://registry.npm.taobao.org/callsites/download/callsites-2.0.0.tgz" resolved "https://registry.npm.taobao.org/callsites/download/callsites-2.0.0.tgz"
integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=
callsites@^3.0.0:
version "3.1.0"
resolved "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
camel-case@3.0.x: camel-case@3.0.x:
version "3.0.0" version "3.0.0"
resolved "https://registry.npm.taobao.org/camel-case/download/camel-case-3.0.0.tgz?cache=0&sync_timestamp=1606867311564&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcamel-case%2Fdownload%2Fcamel-case-3.0.0.tgz" resolved "https://registry.npm.taobao.org/camel-case/download/camel-case-3.0.0.tgz?cache=0&sync_timestamp=1606867311564&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcamel-case%2Fdownload%2Fcamel-case-3.0.0.tgz"
@@ -1843,6 +1853,16 @@ cosmiconfig@^5.0.0:
js-yaml "^3.13.1" js-yaml "^3.13.1"
parse-json "^4.0.0" parse-json "^4.0.0"
cosmiconfig@^8.2.0:
version "8.2.0"
resolved "https://registry.npmmirror.com/cosmiconfig/-/cosmiconfig-8.2.0.tgz#f7d17c56a590856cd1e7cee98734dca272b0d8fd"
integrity sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==
dependencies:
import-fresh "^3.2.1"
js-yaml "^4.1.0"
parse-json "^5.0.0"
path-type "^4.0.0"
create-ecdh@^4.0.0: create-ecdh@^4.0.0:
version "4.0.4" version "4.0.4"
resolved "https://registry.npm.taobao.org/create-ecdh/download/create-ecdh-4.0.4.tgz?cache=0&sync_timestamp=1596557441827&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcreate-ecdh%2Fdownload%2Fcreate-ecdh-4.0.4.tgz" resolved "https://registry.npm.taobao.org/create-ecdh/download/create-ecdh-4.0.4.tgz?cache=0&sync_timestamp=1596557441827&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcreate-ecdh%2Fdownload%2Fcreate-ecdh-4.0.4.tgz"
@@ -3696,6 +3716,14 @@ import-fresh@^2.0.0:
caller-path "^2.0.0" caller-path "^2.0.0"
resolve-from "^3.0.0" resolve-from "^3.0.0"
import-fresh@^3.2.1:
version "3.3.0"
resolved "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==
dependencies:
parent-module "^1.0.0"
resolve-from "^4.0.0"
import-from@^2.1.0: import-from@^2.1.0:
version "2.1.0" version "2.1.0"
resolved "https://registry.npm.taobao.org/import-from/download/import-from-2.1.0.tgz" resolved "https://registry.npm.taobao.org/import-from/download/import-from-2.1.0.tgz"
@@ -4206,6 +4234,11 @@ javascript-stringify@^2.0.1:
resolved "https://registry.nlark.com/javascript-stringify/download/javascript-stringify-2.1.0.tgz#27c76539be14d8bd128219a2d731b09337904e79" resolved "https://registry.nlark.com/javascript-stringify/download/javascript-stringify-2.1.0.tgz#27c76539be14d8bd128219a2d731b09337904e79"
integrity sha1-J8dlOb4U2L0Sghmi1zGwkzeQTnk= integrity sha1-J8dlOb4U2L0Sghmi1zGwkzeQTnk=
jiti@^1.18.2:
version "1.19.1"
resolved "https://registry.npmmirror.com/jiti/-/jiti-1.19.1.tgz#fa99e4b76a23053e0e7cde098efe1704a14c16f1"
integrity sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg==
js-base64@^2.1.8: js-base64@^2.1.8:
version "2.6.4" version "2.6.4"
resolved "https://registry.npm.taobao.org/js-base64/download/js-base64-2.6.4.tgz?cache=0&sync_timestamp=1604450430432&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjs-base64%2Fdownload%2Fjs-base64-2.6.4.tgz" resolved "https://registry.npm.taobao.org/js-base64/download/js-base64-2.6.4.tgz?cache=0&sync_timestamp=1604450430432&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjs-base64%2Fdownload%2Fjs-base64-2.6.4.tgz"
@@ -4246,6 +4279,13 @@ js-yaml@^3.13.1:
argparse "^1.0.7" argparse "^1.0.7"
esprima "^4.0.0" esprima "^4.0.0"
js-yaml@^4.1.0:
version "4.1.0"
resolved "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602"
integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==
dependencies:
argparse "^2.0.1"
jsbn@~0.1.0: jsbn@~0.1.0:
version "0.1.1" version "0.1.1"
resolved "https://registry.npm.taobao.org/jsbn/download/jsbn-0.1.1.tgz" resolved "https://registry.npm.taobao.org/jsbn/download/jsbn-0.1.1.tgz"
@@ -5414,6 +5454,13 @@ param-case@2.1.x:
dependencies: dependencies:
no-case "^2.2.0" no-case "^2.2.0"
parent-module@^1.0.0:
version "1.0.1"
resolved "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
dependencies:
callsites "^3.0.0"
parse-asn1@^5.0.0, parse-asn1@^5.1.5: parse-asn1@^5.0.0, parse-asn1@^5.1.5:
version "5.1.6" version "5.1.6"
resolved "https://registry.npm.taobao.org/parse-asn1/download/parse-asn1-5.1.6.tgz?cache=0&sync_timestamp=1597167448404&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fparse-asn1%2Fdownload%2Fparse-asn1-5.1.6.tgz" resolved "https://registry.npm.taobao.org/parse-asn1/download/parse-asn1-5.1.6.tgz?cache=0&sync_timestamp=1597167448404&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fparse-asn1%2Fdownload%2Fparse-asn1-5.1.6.tgz"
@@ -5550,6 +5597,11 @@ path-type@^3.0.0:
dependencies: dependencies:
pify "^3.0.0" pify "^3.0.0"
path-type@^4.0.0:
version "4.0.0"
resolved "https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
pbkdf2@^3.0.3: pbkdf2@^3.0.3:
version "3.1.1" version "3.1.1"
resolved "https://registry.npm.taobao.org/pbkdf2/download/pbkdf2-3.1.1.tgz" resolved "https://registry.npm.taobao.org/pbkdf2/download/pbkdf2-3.1.1.tgz"
@@ -5732,6 +5784,15 @@ postcss-loader@^3.0.0:
postcss-load-config "^2.0.0" postcss-load-config "^2.0.0"
schema-utils "^1.0.0" schema-utils "^1.0.0"
postcss-loader@^7.0.1:
version "7.3.3"
resolved "https://registry.npmmirror.com/postcss-loader/-/postcss-loader-7.3.3.tgz#6da03e71a918ef49df1bb4be4c80401df8e249dd"
integrity sha512-YgO/yhtevGO/vJePCQmTxiaEwER94LABZN0ZMT4A0vsak9TpO+RvKRs7EmJ8peIlB9xfXCsS7M8LjqncsUZ5HA==
dependencies:
cosmiconfig "^8.2.0"
jiti "^1.18.2"
semver "^7.3.8"
postcss-merge-longhand@^4.0.11: postcss-merge-longhand@^4.0.11:
version "4.0.11" version "4.0.11"
resolved "https://registry.npm.taobao.org/postcss-merge-longhand/download/postcss-merge-longhand-4.0.11.tgz" resolved "https://registry.npm.taobao.org/postcss-merge-longhand/download/postcss-merge-longhand-4.0.11.tgz"
@@ -6420,6 +6481,11 @@ resolve-from@^3.0.0:
resolved "https://registry.npm.taobao.org/resolve-from/download/resolve-from-3.0.0.tgz" resolved "https://registry.npm.taobao.org/resolve-from/download/resolve-from-3.0.0.tgz"
integrity sha1-six699nWiBvItuZTM17rywoYh0g= integrity sha1-six699nWiBvItuZTM17rywoYh0g=
resolve-from@^4.0.0:
version "4.0.0"
resolved "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
resolve-url@^0.2.1: resolve-url@^0.2.1:
version "0.2.1" version "0.2.1"
resolved "https://registry.npm.taobao.org/resolve-url/download/resolve-url-0.2.1.tgz?cache=0&sync_timestamp=1585438700247&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fresolve-url%2Fdownload%2Fresolve-url-0.2.1.tgz" resolved "https://registry.npm.taobao.org/resolve-url/download/resolve-url-0.2.1.tgz?cache=0&sync_timestamp=1585438700247&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fresolve-url%2Fdownload%2Fresolve-url-0.2.1.tgz"
@@ -6604,6 +6670,13 @@ semver@^7.3.5:
dependencies: dependencies:
lru-cache "^6.0.0" lru-cache "^6.0.0"
semver@^7.3.8:
version "7.5.4"
resolved "https://registry.npmmirror.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e"
integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==
dependencies:
lru-cache "^6.0.0"
semver@~5.3.0: semver@~5.3.0:
version "5.3.0" version "5.3.0"
resolved "https://registry.npm.taobao.org/semver/download/semver-5.3.0.tgz?cache=0&sync_timestamp=1606851912015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-5.3.0.tgz" resolved "https://registry.npm.taobao.org/semver/download/semver-5.3.0.tgz?cache=0&sync_timestamp=1606851912015&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-5.3.0.tgz"

10
im/.env Normal file
View File

@@ -0,0 +1,10 @@
NODE_ENV=production
VUE_APP_PREVIEW=false
VUE_APP_API_BASE_URL=https://im-api.pickmall.cn
VUE_APP_WEB_SOCKET_URL=wss://im-api.pickmall.cn/lili/webSocket
VUE_APP_COMMON=https://common-api.pickmall.cn
VUE_APP_BUYER=https://buyer-api.pickmall.cn
VUE_APP_SELLER=https://store-api.pickmall.cn
VUE_APP_WEBSITE_NAME="LiLi IM"
VUE_APP_PC_URL=https://pc-b2b2c.pickmall.cn/
VUE_APP_PC_STORE=https://store-b2b2c.pickmall.cn/

10
im/.env.development Normal file
View File

@@ -0,0 +1,10 @@
NODE_ENV=development
VUE_APP_PREVIEW=false
VUE_APP_API_BASE_URL=https://im-api.pickmall.cn
VUE_APP_WEB_SOCKET_URL=wss://im-api.pickmall.cn/lili/webSocket
VUE_APP_COMMON=https://common-api.pickmall.cn
VUE_APP_BUYER=https://buyer-api.pickmall.cn
VUE_APP_SELLER=https://store-api.pickmall.cn
VUE_APP_WEBSITE_NAME="LiLi IM"
VUE_APP_PC_URL=https://pc-b2b2c.pickmall.cn/
VUE_APP_PC_STORE=https://store-b2b2c.pickmall.cn/

23
im/.gitignore vendored Normal file
View File

@@ -0,0 +1,23 @@
.DS_Store
node_modules
/dist
# local env files
.env.local
.env.*.local
# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?

21
im/LICENSE Normal file
View File

@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2020 YuanDong
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

71
im/README.md Normal file
View File

@@ -0,0 +1,71 @@
# Springboot-websocket
过渡阶段IM
前端仓库https://gitee.com/beijing_hongye_huicheng/im
后端仓库https://gitee.com/beijing_hongye_huicheng/springboot-websocket
部署方式:
1、导入数据库配置resource目录下application.yml的数据库以及redis配置文件。
2、maven打包
3、启动jar包即可。
4、前端程序运行测试环境需配置根目录 .env.development文件正式环境需配置 .env 文件。
# 参考项目
项目前端参考https://gitee.com/gzydong/LumenIM.git 功能更丰富,大家可以去学习一波
# IM体验
浏览器1打开地址http://127.0.0.1:8000/message?token=eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyQ29udGV4dCI6IntcInVzZXJuYW1lXCI6XCIxMzAxMTExMTExMVwiLFwibmlja05hbWVcIjpcIuW8oOS4ieWTiOWTiOWTiFwiLFwiZmFjZVwiOlwiaHR0cHM6Ly9saWxpc2hvcC1vc3Mub3NzLWNuLWJlaWppbmcuYWxpeXVuY3MuY29tLzQ1ZDUyOGYwMjRjZTQyMzI4NzYxNjFhZmQxN2Y0ZWExLmpwZ1wiLFwiaWRcIjpcIjEzNzY0MTc2ODQxNDAzMjY5MTJcIixcImxvbmdUZXJtXCI6ZmFsc2UsXCJyb2xlXCI6XCJTVE9SRVwiLFwic3RvcmVJZFwiOlwiMTM3NjQzMzU2NTI0NzQ3MTYxNlwiLFwic3RvcmVOYW1lXCI6XCLlrrblrrbkuZBcIixcImlzU3VwZXJcIjpmYWxzZX0iLCJzdWIiOiIxMzAxMTExMTExMSIsImV4cCI6MTY0NTQ2OTk1M30.fXpCZ2YiFYqACpmxVvKjIpXovfPRDJavHjftpQzdEps
浏览器2打开地址http://127.0.0.1:8000/message?token=eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyQ29udGV4dCI6IntcInVzZXJuYW1lXCI6XCIxMzAxMTExMTExMVwiLFwibmlja05hbWVcIjpcIuW8oOS4ieWTiOWTiOWTiFwiLFwiZmFjZVwiOlwiaHR0cHM6Ly9saWxpc2hvcC1vc3Mub3NzLWNuLWJlaWppbmcuYWxpeXVuY3MuY29tLzk2N2UzMzU1Yzg0NTRiNGFhMTk1N2M1NTQ5ZTZiNzIwLnBuZ1wiLFwiaWRcIjpcIjEzNzY0MTc2ODQxNDAzMjY5MTJcIixcImxvbmdUZXJtXCI6ZmFsc2UsXCJyb2xlXCI6XCJNRU1CRVJcIixcImlzU3VwZXJcIjpmYWxzZX0iLCJzdWIiOiIxMzAxMTExMTExMSIsImV4cCI6MTY0NTQ2OTAyNn0.GEkGpKRKF3rqzHRhaPCFilPpWe37cIXTT4KnwWR4Bt0&id=1376433565247471616
即可进行聊天。
# NGINX配置事例
线上NGINX配置在测试阶段出现问题这里吧相关的配置贴出来供大家参考。
````
server {
listen 443 ssl;
ssl_certificate "/etc/nginx/ssl/pickmall.cn.pem";
ssl_certificate_key "/etc/nginx/ssl/pickmall.cn.key";
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
include /etc/nginx/default.d/*.conf;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
server_name im-api.pickmall.cn;
location / {
proxy_pass http://127.0.0.1:8088;
}
}
server {
listen 443 ssl;
ssl_certificate "/etc/nginx/ssl/pickmall.cn.pem";
ssl_certificate_key "/etc/nginx/ssl/pickmall.cn.key";
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
include /etc/nginx/default.d/*.conf;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
server_name im.pickmall.cn;
try_files $uri $uri/ /index.html;
root /home/im/im/dist;
}
````

51
im/babel.config.js Normal file
View File

@@ -0,0 +1,51 @@
module.exports = {
presets: [
'@vue/cli-plugin-babel/preset'
],
plugins: [
[
"import",
{
"libraryName": "element-ui",
"styleLibraryName": "theme-chalk"
}
],
[
"prismjs",
{
"languages": [
"html",
"css",
"less",
"javascript",
"typescript",
"json",
"xml",
"bash",
"nginx",
"sql",
"docker",
"php",
"java",
"go",
"python",
"ruby",
"rust",
"objectivec",
"c",
"csharp",
"cpp",
"lua",
"shell",
"vim",
"yaml",
"yml",
"md",
"erlang",
"ini"
],
"theme": "okaidia"
}
]
]
}

18
im/jsconfig.json Normal file
View File

@@ -0,0 +1,18 @@
{
"compilerOptions": {
"target": "es6",
"baseUrl": ".",
"paths": {
"@/*": [
"src/*"
]
}
},
"exclude": [
"node_modules",
"dist"
],
"include": [
"src/**/*"
]
}

67
im/package.json Normal file
View File

@@ -0,0 +1,67 @@
{
"name": "LiLi-IM",
"version": "0.1.0",
"private": true,
"scripts": {
"dev": "vue-cli-service serve",
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"lint": "vue-cli-service lint"
},
"dependencies": {
"axios": "^0.21.4",
"babel-plugin-prismjs": "^2.0.1",
"core-js": "^3.6.5",
"element-ui": "^2.14.1",
"js-audio-recorder": "^1.0.6",
"js-base64": "^2.5.1",
"mavon-editor": "^2.10.4",
"nprogress": "^0.2.0",
"prismjs": "^1.29.0",
"svg-sprite-loader": "^5.0.0",
"vue": "^2.6.11",
"vue-contextmenujs": "^1.3.13",
"vue-cropper": "^0.5.5",
"vue-prism-editor": "^0.5.1",
"vue-router": "^3.4.9",
"vuex": "^3.5.1"
},
"devDependencies": {
"@vue/cli-plugin-babel": "^5.0.8",
"@vue/cli-plugin-eslint": "^5.0.8",
"@vue/cli-service": "^5.0.8",
"babel-eslint": "^10.1.0",
"babel-plugin-import": "^1.13.1",
"compression-webpack-plugin": "^5.0.0",
"eslint": "^8.28.0",
"eslint-plugin-vue": "^6.2.2",
"less": "^3.0.4",
"less-loader": "^5.0.0",
"postcss": "^8.4.20",
"style-resources-loader": "^1.4.1",
"vue-cli-plugin-style-resources-loader": "^0.1.4",
"vue-svg-component-runtime": "^1.0.1",
"vue-svg-icon-loader": "^2.1.1",
"vue-template-compiler": "^2.6.11",
"webpack": "^5.75.0"
},
"eslintConfig": {
"root": true,
"env": {
"node": true
},
"extends": [
"plugin:vue/essential",
"eslint:recommended"
],
"parserOptions": {
"parser": "babel-eslint"
},
"rules": {}
},
"browserslist": [
"> 1%",
"last 2 versions",
"not dead"
]
}

BIN
im/public/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

34
im/public/index.html Normal file
View File

@@ -0,0 +1,34 @@
<!DOCTYPE html>
<html lang="zh-cmn-Hans">
<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,maximum-scale=1.0, minimum-scale=1.0, viewport-fit=cover">
<link rel="icon" href="favicon.ico">
<title>LiLi IM</title>
<style>.first-loading-wrp{display:flex;justify-content:center;align-items:center;flex-direction:column;min-height:420px;height:100%}.first-loading-wrp>h1{font-size:128px}.first-loading-wrp .loading-wrp{padding:98px;display:flex;justify-content:center;align-items:center}.dot{animation:antRotate 1.2s infinite linear;transform:rotate(45deg);position:relative;display:inline-block;font-size:32px;width:32px;height:32px;box-sizing:border-box}.dot i{width:14px;height:14px;position:absolute;display:block;background-color:#1890ff;border-radius:100%;transform:scale(.75);transform-origin:50% 50%;opacity:.3;animation:antSpinMove 1s infinite linear alternate}.dot i:nth-child(1){top:0;left:0}.dot i:nth-child(2){top:0;right:0;-webkit-animation-delay:.4s;animation-delay:.4s}.dot i:nth-child(3){right:0;bottom:0;-webkit-animation-delay:.8s;animation-delay:.8s}.dot i:nth-child(4){bottom:0;left:0;-webkit-animation-delay:1.2s;animation-delay:1.2s}@keyframes antRotate{to{-webkit-transform:rotate(405deg);transform:rotate(405deg)}}@-webkit-keyframes antRotate{to{-webkit-transform:rotate(405deg);transform:rotate(405deg)}}@keyframes antSpinMove{to{opacity:1}}@-webkit-keyframes antSpinMove{to{opacity:1}}</style>
<!-- require cdn assets css -->
<% for (var i in htmlWebpackPlugin.options.cdn && htmlWebpackPlugin.options.cdn.css) { %>
<link rel="stylesheet" href="<%= htmlWebpackPlugin.options.cdn.css[i] %>" />
<% } %>
<link rel="stylesheet" href="https://at.alicdn.com/t/font_1425251_3v0kq1by4iq.css">
<link rel="stylesheet" href="https://cdn.bootcss.com/animate.css/3.7.2/animate.css">
</head>
<body>
<noscript>
<strong>We're sorry but vue-antd-pro doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="app">
<div class="first-loading-wrp">
<div class="loading-wrp">
<span class="dot dot-spin"><i></i><i></i><i></i><i></i></span>
</div>
</div>
</div>
<!-- require cdn assets js -->
<% for (var i in htmlWebpackPlugin.options.cdn && htmlWebpackPlugin.options.cdn.js) { %>
<script type="text/javascript" src="<%= htmlWebpackPlugin.options.cdn.js[i] %>"></script>
<% } %>
<!-- built files will be auto injected -->
</body>
</html>

47
im/src/App.vue Normal file
View File

@@ -0,0 +1,47 @@
<template>
<div id="app">
<router-view v-if="showView" />
</div>
</template>
<script>
export default {
name: 'App',
data () {
return {
// 用于点击当前页的router时刷新当前页
showView: true,
beforeUnload: '',
Handler: ''
}
},
methods: {
// 刷新当前路由方法
refreshView () {
this.showView = false
this.$nextTick(() => (this.showView = true))
},
beforeunloadHandler () {
this.beforeUnload = new Date().getTime();
},
// 页面关闭后 重置btnHide
unloadHandler (e) {
this.Handler = new Date().getTime() - this.beforeUnload;
if (this.Handler <= 5) {
var storage = window.localStorage;
storage.clear()
localStorage.setItem('btnHide', 1)
}
},
},
mounted () {
window.addEventListener('beforeunload', e => this.beforeunloadHandler(e))
window.addEventListener('unload', e => this.unloadHandler(e))
},
destroyed () {
window.removeEventListener('beforeunload', e => this.beforeunloadHandler(e))
window.removeEventListener('unload', e => this.unloadHandler(e))
},
}
</script>

109
im/src/api/chat.js Normal file
View File

@@ -0,0 +1,109 @@
import { post, get, upload, del } from "@/utils/request";
// 获取聊天列表服务接口
export const ServeGetTalkList = (data) => {
return get("/im/talk/list", data);
};
// 获取聊天列表服务接口
export const ServeGetStoreTalkList = (data) => {
return get("/im/talk/store/list", data);
};
// 聊天列表创建服务接口
export const ServeCreateTalkList = (id) => {
return get(`/im/talk/user/${id}`);
};
// 删除聊天列表服务接口
export const ServeDeleteTalkList = (data) => {
return del("/im/talk", data);
};
// 对话列表置顶服务接口
export const ServeTopTalkList = (data) => {
return post("/im/talk/top", data);
};
// 清除聊天消息未读数服务接口
export const ServeClearTalkUnreadNum = (data) => {
return post("/im/talk/update-unread-num", data);
};
// 获取聊天记录服务接口
export const ServeTalkRecords = (data) => {
return get("/im/message", data);
};
// 获取转发会话记录详情列表服务接口
export const ServeGetForwardRecords = (data) => {
return get("/im/talk/get-forward-records", data);
};
// 对话列表置顶服务接口
export const ServeSetNotDisturb = (data) => {
return post("/im/talk/disturb", data);
};
// 查找用户聊天记录服务接口
export const ServeFindTalkRecords = (data) => {
return get("/im/talk/find-chat-records", data);
};
// 搜索用户聊天记录服务接口
export const ServeSearchTalkRecords = (data) => {
return get("/im/talk/search-chat-records", data);
};
export const ServeGetRecordsContext = (data) => {
return get("/im/talk/get-records-context", data);
};
// 发送代码块消息服务接口
export const ServeSendTalkCodeBlock = (data) => {
return post("/im/talk/message/code", data);
};
// 发送聊天文件服务接口
export const ServeSendTalkFile = (data) => {
return post("/im/talk/message/file", data);
};
// 发送聊天图片服务接口
export const ServeSendTalkImage = (data) => {
return upload("/common/common/upload/file", data);
};
// 发送表情包服务接口
export const ServeSendEmoticon = (data) => {
return post("/im/talk/message/emoticon", data);
};
// 转发消息服务接口
export const ServeForwardRecords = (data) => {
return post("/im/talk/message/forward", data);
};
// 撤回消息服务接口
export const ServeRevokeRecords = (data) => {
return post("/im/talk/message/revoke", data);
};
// 删除消息服务接口
export const ServeRemoveRecords = (data) => {
return post("/im/talk/message/delete", data);
};
// 收藏表情包服务接口
export const ServeCollectEmoticon = (data) => {
return post("/im/talk/message/collect", data);
};
//投票
export const ServeSendVote = (data) => {
return post("/im/talk/message/vote", data);
};
export const ServeConfirmVoteHandle = (data) => {
return post("/im/talk/message/vote/handle", data);
};

45
im/src/api/contacts.js Normal file
View File

@@ -0,0 +1,45 @@
import { post, get } from '@/utils/request'
// 获取好友列表服务接口
export const ServeGetContacts = data => {
return get('/contacts/list', data)
}
// 解除好友关系服务接口
export const ServeDeleteContact = data => {
return post('/contacts/delete', data)
}
// 修改好友备注服务接口
export const ServeEditContactRemark = data => {
return post('/contacts/edit-remark', data)
}
// 搜索联系人
export const ServeSearchContact = data => {
return get('/contacts/search', data)
}
// 好友申请服务接口
export const ServeCreateContact = data => {
return post('/contacts/apply/create', data)
}
// 查询好友申请服务接口
export const ServeGetContactApplyRecords = data => {
return get('/contacts/apply/records', data)
}
// 处理好友申请服务接口
export const ServeApplyAccept = data => {
return post('/contacts/apply/accept', data)
}
export const ServeApplyDecline = data => {
return post('/contacts/apply/decline', data)
}
// 查询好友申请未读数量服务接口
export const ServeFindFriendApplyNum = () => {
return get('/contacts/apply-unread-num')
}

26
im/src/api/emoticon.js Normal file
View File

@@ -0,0 +1,26 @@
import { post, get, upload } from '@/utils/request'
// 查询用户表情包服务接口
export const ServeFindUserEmoticon = () => {
return get('/emoticon/list')
}
// 查询系统表情包服务接口
export const ServeFindSysEmoticon = () => {
return get('/emoticon/system')
}
// 设置用户表情包服务接口
export const ServeSetUserEmoticon = data => {
return post('/emoticon/set-user-emoticon', data)
}
// 移除收藏表情包服务接口
export const ServeDelCollectEmoticon = data => {
return post('/emoticon/del-collect-emoticon', data)
}
// 上传表情包服务接口
export const ServeUploadEmoticon = data => {
return upload('/emoticon/upload-emoticon', data)
}

5
im/src/api/goods.js Normal file
View File

@@ -0,0 +1,5 @@
import { post, get, upload, del } from "@/utils/request";
export const ServeGetGoodsDetail = (data) => {
return get(`/im/goods/goods/sku/${data.goodsId}/${data.skuId}`);
};

66
im/src/api/group.js Normal file
View File

@@ -0,0 +1,66 @@
import { post, get } from '@/utils/request'
// 查询用户群聊服务接口
export const ServeGetGroups = () => {
return get('/group/list')
}
// 获取群信息服务接口
export const ServeGroupDetail = data => {
return get('/group/detail', data)
}
// 创建群聊服务接口
export const ServeCreateGroup = data => {
return post('/group/create', data)
}
// 修改群信息
export const ServeEditGroup = data => {
return post('/group/edit', data)
}
// 邀请好友加入群聊服务接口
export const ServeInviteGroup = data => {
return post('/group/invite', data)
}
// 移除群聊成员服务接口
export const ServeRemoveMembersGroup = data => {
return post('/group/remove-members', data)
}
// 管理员解散群聊服务接口
export const ServeDismissGroup = data => {
return post('/group/dismiss', data)
}
// 用户退出群聊服务接口
export const ServeSecedeGroup = data => {
return post('/group/secede', data)
}
// 修改群聊名片服务接口
export const ServeUpdateGroupCard = data => {
return post('/group/set-group-card', data)
}
// 获取用户可邀请加入群组的好友列表
export const ServeGetInviteFriends = data => {
return get('/group/invite-friends', data)
}
// 获取群组成员列表
export const ServeGetGroupMembers = data => {
return get('/group/members', data)
}
// 获取群组公告列表
export const ServeGetGroupNotices = data => {
return get('/group/notices', data)
}
// 编辑群公告
export const ServeEditGroupNotice = data => {
return post('/group/edit-notice', data)
}

16
im/src/api/upload.js Normal file
View File

@@ -0,0 +1,16 @@
import { post, get, upload } from '@/utils/request'
// 上传头像裁剪图片服务接口
export const ServeUploadFileStream = data => {
return post('/upload/file-stream', data)
}
// 查询大文件拆分信息服务接口
export const ServeFindFileSplitInfo = (data = {}) => {
return get('/upload/get-file-split-info', data)
}
// 文件拆分上传服务接口
export const ServeFileSubareaUpload = (data = {}, options = {}) => {
return upload('/upload/file-subarea-upload', data, options)
}

47
im/src/api/user.js Normal file
View File

@@ -0,0 +1,47 @@
import { get } from "@/utils/request";
import config from "@/config/config";
// 获取用户相关设置信息
export const ServeGetUserSetting = () => {
return get(`${config.BASE_BUYER}/buyer/passport/member`);
};
// 获取店铺相关设置信息
export const ServeGetStoreSetting = () => {
return get(`${config.BASE_SELLER}/store/member/user`);
};
// 获取用户相关设置信息
export const ServeGetUserDetail = (memberId) => {
return get(`${config.BASE_SELLER}/store/passport/member/${memberId}`);
};
// 获取店铺相关设置信息
export const ServeGetStoreDetail = (storeId) => {
return get(`${config.BASE_BUYER}/buyer/store/store/store/${storeId}`);
};
// 获取用户历史足迹
export const ServeGetFootPrint = (params) => {
return get(`${config.BASE_BUYER}/buyer/member/footprint`, params);
};
// 商家获取用户历史足迹
export const ServeStoreGetFootPrint = (params) => {
return get(`${config.BASE_SELLER}/store/member/footprint`, params);
};
// 获取用户订单列表信息
export const ServeGetOrderPrint = (params) => {
return get(`${config.BASE_BUYER}/buyer/order/order`, params);
};
// 商家获取用户订单列表信息
export const ServeStoreGetOrderPrint = (params) => {
return get(`${config.BASE_SELLER}/store/order/order`, params);
};
// 获取商品信息
export const ServeGetGoodsDetail = (data) => {
return get(`${config.BASE_BUYER}/buyer/goods/goods/sku/${data.goodsId}/${data.skuId}`);
};

View File

@@ -0,0 +1,241 @@
@import './reset.css';
.no-select {
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.main-color{
color: #508afe;
}
.no-padding {
padding: 0;
}
.avatar-box {
height: 35px;
width: 35px;
flex-shrink: 0;
background-color: #508afe;
border-radius: 50%;
display: flex;
justify-content: center;
align-items: center;
font-size: 14px;
color: white;
user-select: none;
transition: ease 1s;
position: relative;
overflow: hidden;
img {
width: 100%;
height: 100%;
background-color: white;
border-radius: 3px;
}
.top-mask {
width: 100%;
height: 100%;
background-color: rgba(22, 25, 29, 0.6);
position: absolute;
top: 0;
left: 0;
color: white;
display: none;
align-items: center;
justify-content: center;
font-weight: bold;
}
&:hover .top-mask {
display: flex;
}
}
.no-border {
border: 0;
}
.pointer {
cursor: pointer;
}
.border-radius0 {
border-radius: 0;
}
.full-height {
height: 100%;
}
.talk-height {
height: 80%;
width: 80%;
}
.ov-hidden {
overflow: hidden;
}
// 滚动条样式
.lum-scrollbar {
&::-webkit-scrollbar {
width: 3px;
background-color: #e4e4e5;
}
&::-webkit-scrollbar-thumb {
border-radius: 3px;
background-color: #c0bebc;
}
}
.larkc-tag {
font-size: 12px;
font-weight: 400;
display: inline-flex;
align-items: center;
justify-content: center;
padding: 0 6px;
height: 20px;
border-radius: 2px;
cursor: default;
user-select: none;
background-color: #dee0e3;
transform: scale(0.83);
transform-origin: left;
flex-shrink: 0;
}
.flex-center {
display: flex;
align-items: center;
justify-content: center;
}
// 自定义 dialog 样式
// lum-dialog -- start
.lum-dialog-mask {
position: fixed;
top: 0;
left: 0;
z-index: 999;
width: 100%;
height: 100%;
background-color: @maskBagColor;
overflow: hidden;
display: flex;
align-items: center;
justify-content: center;
.lum-dialog-box {
min-width: 200px;
min-height: 200px;
background-color: white;
border-radius: 3px;
overflow: hidden;
box-shadow: 0 2px 8px 0 rgba(31, 35, 41, 0.2);
margin: 0 10px;
.container {
height: 100%;
}
.header {
padding: 0;
display: flex;
align-items: center;
justify-content: space-between;
border-bottom: 1px solid #f5eeee;
>p:first-child {
text-indent: 20px;
}
.tools {
height: 100%;
width: 100px;
display: flex;
align-items: center;
justify-content: flex-end;
padding-right: 20px;
i {
font-size: 20px;
cursor: pointer;
margin-left: 8px;
}
}
}
.main {
/deep/.el-input__inner {
border-radius: 1px !important;
}
.submit-btn {
border-radius: 2px;
font-weight: 400;
}
}
}
}
// lum-dialog -- end
.talk-notify {
.el-notification__title {
font-weight: 300;
font-size: 16px;
color: #f44336;
}
p {
max-height: 65px;
overflow: hidden;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
text-indent: -7px;
word-break: break-all;
}
}
.im-notify {
padding: 14px 26px 8px 0px;
.el-notification__closeBtn {
position: absolute;
top: 12px;
}
.el-notification__group {
margin-left: 5px;
}
}
.flex {
display: flex;
}
.flex-2 {
flex: 2;
}
.flex-8 {
flex: 8;
}
.flex-4 {
flex: 4;
}
.flex-10 {
flex: 10;
}

View File

@@ -0,0 +1,991 @@
.markdown-body .octicon {
display: inline-block;
fill: currentColor;
vertical-align: text-bottom;
}
.markdown-body .anchor {
float: left;
line-height: 1;
margin-left: -20px;
padding-right: 4px;
}
.markdown-body .anchor:focus {
outline: none;
}
.markdown-body h1 .octicon-link,
.markdown-body h2 .octicon-link,
.markdown-body h3 .octicon-link,
.markdown-body h4 .octicon-link,
.markdown-body h5 .octicon-link,
.markdown-body h6 .octicon-link {
color: #1b1f23;
vertical-align: middle;
visibility: hidden;
}
.markdown-body h1:hover .anchor,
.markdown-body h2:hover .anchor,
.markdown-body h3:hover .anchor,
.markdown-body h4:hover .anchor,
.markdown-body h5:hover .anchor,
.markdown-body h6:hover .anchor {
text-decoration: none;
}
.markdown-body h1:hover .anchor .octicon-link,
.markdown-body h2:hover .anchor .octicon-link,
.markdown-body h3:hover .anchor .octicon-link,
.markdown-body h4:hover .anchor .octicon-link,
.markdown-body h5:hover .anchor .octicon-link,
.markdown-body h6:hover .anchor .octicon-link {
visibility: visible;
}
.markdown-body h1:hover .anchor .octicon-link:before,
.markdown-body h2:hover .anchor .octicon-link:before,
.markdown-body h3:hover .anchor .octicon-link:before,
.markdown-body h4:hover .anchor .octicon-link:before,
.markdown-body h5:hover .anchor .octicon-link:before,
.markdown-body h6:hover .anchor .octicon-link:before {
width: 16px;
height: 16px;
content: ' ';
display: inline-block;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' version='1.1' width='16' height='16' aria-hidden='true'%3E%3Cpath fill-rule='evenodd' d='M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z'%3E%3C/path%3E%3C/svg%3E");
}
.markdown-body {
-ms-text-size-adjust: 100%;
-webkit-text-size-adjust: 100%;
font-size: 16px;
word-wrap: break-word;
font-family: Content-font, Roboto, sans-serif;
font-weight: 400;
color: #3B454E;
line-height: 1.625;
}
.markdown-body details {
display: block;
}
.markdown-body summary {
display: list-item;
}
.markdown-body a {
background-color: initial;
}
.markdown-body a:active,
.markdown-body a:hover {
outline-width: 0;
}
.markdown-body strong {
font-weight: inherit;
font-weight: bolder;
}
.markdown-body h1 {
font-size: 2em;
margin: .67em 0;
}
.markdown-body img {
border-style: none;
}
.markdown-body code,
.markdown-body kbd,
.markdown-body pre {
font-family: monospace, monospace;
font-size: 1em;
}
.markdown-body hr {
box-sizing: initial;
height: 0;
overflow: visible;
}
.markdown-body input {
font: inherit;
margin: 0;
}
.markdown-body input {
overflow: visible;
}
.markdown-body [type=checkbox] {
box-sizing: border-box;
padding: 0;
}
.markdown-body * {
box-sizing: border-box;
}
.markdown-body input {
font-family: inherit;
font-size: inherit;
line-height: inherit;
}
.markdown-body a {
color: #0366d6;
text-decoration: none;
}
.markdown-body a:hover {
text-decoration: underline;
}
.markdown-body strong {
font-weight: 600;
}
.markdown-body hr {
height: 0;
margin: 15px 0;
overflow: hidden;
background: transparent;
border: 0;
border-bottom: 1px solid #dfe2e5;
}
.markdown-body hr:after,
.markdown-body hr:before {
display: table;
content: "";
}
.markdown-body hr:after {
clear: both;
}
.markdown-body table {
border-spacing: 0;
border-collapse: collapse;
}
.markdown-body td,
.markdown-body th {
padding: 0;
}
.markdown-body details summary {
cursor: pointer;
}
.markdown-body kbd {
display: inline-block;
padding: 3px 5px;
font: 11px SFMono-Regular, Consolas, Liberation Mono, Menlo, monospace;
line-height: 10px;
color: #444d56;
vertical-align: middle;
background-color: #fafbfc;
border: 1px solid #d1d5da;
border-radius: 3px;
box-shadow: inset 0 -1px 0 #d1d5da;
}
.markdown-body h1,
.markdown-body h2,
.markdown-body h3,
.markdown-body h4,
.markdown-body h5,
.markdown-body h6 {
margin-top: 0;
margin-bottom: 0;
}
.markdown-body h1 {
font-size: 32px;
}
.markdown-body h1,
.markdown-body h2 {
font-weight: 600;
}
.markdown-body h2 {
font-size: 24px;
}
.markdown-body h3 {
font-size: 20px;
}
.markdown-body h3,
.markdown-body h4 {
font-weight: 600;
}
.markdown-body h4 {
font-size: 16px;
}
.markdown-body h5 {
font-size: 14px;
}
.markdown-body h5,
.markdown-body h6 {
font-weight: 600;
}
.markdown-body h6 {
font-size: 12px;
}
.markdown-body p {
margin-top: 0;
margin-bottom: 10px;
}
.markdown-body blockquote {
margin: 20px 0 !important;
background-color: #f5f8fc;
padding: 1rem;
color: #8796a8;
border-left: none;
}
.markdown-body ol,
.markdown-body ul {
padding-left: 0;
margin-top: 0;
margin-bottom: 0;
}
.markdown-body ol ol,
.markdown-body ul ol {
list-style-type: lower-roman;
}
.markdown-body ol ol ol,
.markdown-body ol ul ol,
.markdown-body ul ol ol,
.markdown-body ul ul ol {
list-style-type: lower-alpha;
}
.markdown-body dd {
margin-left: 0;
}
.markdown-body code,
.markdown-body pre {
font-family: SFMono-Regular, Consolas, Liberation Mono, Menlo, monospace;
font-size: 12px;
}
.markdown-body pre {
margin-top: 0;
margin-bottom: 0;
}
.markdown-body input::-webkit-inner-spin-button,
.markdown-body input::-webkit-outer-spin-button {
margin: 0;
-webkit-appearance: none;
appearance: none;
}
.markdown-body :checked+.radio-label {
position: relative;
z-index: 1;
border-color: #0366d6;
}
.markdown-body .border {
border: 1px solid #e1e4e8 !important;
}
.markdown-body .border-0 {
border: 0 !important;
}
.markdown-body .border-bottom {
border-bottom: 1px solid #e1e4e8 !important;
}
.markdown-body .rounded-1 {
border-radius: 3px !important;
}
.markdown-body .bg-white {
background-color: #fff !important;
}
.markdown-body .bg-gray-light {
background-color: #fafbfc !important;
}
.markdown-body .text-gray-light {
color: #6a737d !important;
}
.markdown-body .mb-0 {
margin-bottom: 0 !important;
}
.markdown-body .my-2 {
margin-top: 8px !important;
margin-bottom: 8px !important;
}
.markdown-body .pl-0 {
padding-left: 0 !important;
}
.markdown-body .py-0 {
padding-top: 0 !important;
padding-bottom: 0 !important;
}
.markdown-body .pl-1 {
padding-left: 4px !important;
}
.markdown-body .pl-2 {
padding-left: 8px !important;
}
.markdown-body .py-2 {
padding-top: 8px !important;
padding-bottom: 8px !important;
}
.markdown-body .pl-3,
.markdown-body .px-3 {
padding-left: 16px !important;
}
.markdown-body .px-3 {
padding-right: 16px !important;
}
.markdown-body .pl-4 {
padding-left: 24px !important;
}
.markdown-body .pl-5 {
padding-left: 32px !important;
}
.markdown-body .pl-6 {
padding-left: 40px !important;
}
.markdown-body .f6 {
font-size: 12px !important;
}
.markdown-body .lh-condensed {
line-height: 1.25 !important;
}
.markdown-body .text-bold {
font-weight: 600 !important;
}
.markdown-body .pl-c {
color: #6a737d;
}
.markdown-body .pl-c1,
.markdown-body .pl-s .pl-v {
color: #005cc5;
}
.markdown-body .pl-e,
.markdown-body .pl-en {
color: #6f42c1;
}
.markdown-body .pl-s .pl-s1,
.markdown-body .pl-smi {
color: #24292e;
}
.markdown-body .pl-ent {
color: #22863a;
}
.markdown-body .pl-k {
color: #d73a49;
}
.markdown-body .pl-pds,
.markdown-body .pl-s,
.markdown-body .pl-s .pl-pse .pl-s1,
.markdown-body .pl-sr,
.markdown-body .pl-sr .pl-cce,
.markdown-body .pl-sr .pl-sra,
.markdown-body .pl-sr .pl-sre {
color: #032f62;
}
.markdown-body .pl-smw,
.markdown-body .pl-v {
color: #e36209;
}
.markdown-body .pl-bu {
color: #b31d28;
}
.markdown-body .pl-ii {
color: #fafbfc;
background-color: #b31d28;
}
.markdown-body .pl-c2 {
color: #fafbfc;
background-color: #d73a49;
}
.markdown-body .pl-c2:before {
content: "^M";
}
.markdown-body .pl-sr .pl-cce {
font-weight: 700;
color: #22863a;
}
.markdown-body .pl-ml {
color: #735c0f;
}
.markdown-body .pl-mh,
.markdown-body .pl-mh .pl-en,
.markdown-body .pl-ms {
font-weight: 700;
color: #005cc5;
}
.markdown-body .pl-mi {
font-style: italic;
color: #24292e;
}
.markdown-body .pl-mb {
font-weight: 700;
color: #24292e;
}
.markdown-body .pl-md {
color: #b31d28;
background-color: #ffeef0;
}
.markdown-body .pl-mi1 {
color: #22863a;
background-color: #f0fff4;
}
.markdown-body .pl-mc {
color: #e36209;
background-color: #ffebda;
}
.markdown-body .pl-mi2 {
color: #f6f8fa;
background-color: #005cc5;
}
.markdown-body .pl-mdr {
font-weight: 700;
color: #6f42c1;
}
.markdown-body .pl-ba {
color: #586069;
}
.markdown-body .pl-sg {
color: #959da5;
}
.markdown-body .pl-corl {
text-decoration: underline;
color: #032f62;
}
.markdown-body .mb-0 {
margin-bottom: 0 !important;
}
.markdown-body .my-2 {
margin-bottom: 8px !important;
}
.markdown-body .my-2 {
margin-top: 8px !important;
}
.markdown-body .pl-0 {
padding-left: 0 !important;
}
.markdown-body .py-0 {
padding-top: 0 !important;
padding-bottom: 0 !important;
}
.markdown-body .pl-1 {
padding-left: 4px !important;
}
.markdown-body .pl-2 {
padding-left: 8px !important;
}
.markdown-body .py-2 {
padding-top: 8px !important;
padding-bottom: 8px !important;
}
.markdown-body .pl-3 {
padding-left: 16px !important;
}
.markdown-body .pl-4 {
padding-left: 24px !important;
}
.markdown-body .pl-5 {
padding-left: 32px !important;
}
.markdown-body .pl-6 {
padding-left: 40px !important;
}
.markdown-body .pl-7 {
padding-left: 48px !important;
}
.markdown-body .pl-8 {
padding-left: 64px !important;
}
.markdown-body .pl-9 {
padding-left: 80px !important;
}
.markdown-body .pl-10 {
padding-left: 96px !important;
}
.markdown-body .pl-11 {
padding-left: 112px !important;
}
.markdown-body .pl-12 {
padding-left: 128px !important;
}
.markdown-body hr {
border-bottom-color: #eee;
}
.markdown-body kbd {
display: inline-block;
padding: 3px 5px;
font: 11px SFMono-Regular, Consolas, Liberation Mono, Menlo, monospace;
line-height: 10px;
color: #444d56;
vertical-align: middle;
background-color: #fafbfc;
border: 1px solid #d1d5da;
border-radius: 3px;
box-shadow: inset 0 -1px 0 #d1d5da;
}
.markdown-body:after,
.markdown-body:before {
display: table;
content: "";
}
.markdown-body:after {
clear: both;
}
.markdown-body>:first-child {
margin-top: 0 !important;
}
.markdown-body>:last-child {
margin-bottom: 0 !important;
}
.markdown-body a:not([href]) {
color: inherit;
text-decoration: none;
}
.markdown-body blockquote,
.markdown-body details,
.markdown-body dl,
.markdown-body ol,
.markdown-body p,
.markdown-body pre,
.markdown-body table,
.markdown-body ul {
margin-top: 0;
margin-bottom: 16px;
}
.markdown-body hr {
height: .25em;
padding: 0;
margin: 24px 0;
background-color: #e1e4e8;
border: 0;
}
.markdown-body blockquote {
margin: 20px 0 !important;
background-color: #f5f8fc;
padding: 1rem;
color: #8796a8;
border-left: 3px solid #03A9F4;
}
.markdown-body blockquote>:first-child {
margin-top: 0;
}
.markdown-body blockquote>:last-child {
margin-bottom: 0;
}
.markdown-body h1,
.markdown-body h2,
.markdown-body h3,
.markdown-body h4,
.markdown-body h5,
.markdown-body h6 {
margin-top: 24px;
margin-bottom: 16px;
font-weight: 600;
line-height: 1.25;
}
.markdown-body h1 {
font-size: 2em;
}
.markdown-body h1,
.markdown-body h2 {
padding-bottom: .3em;
/* border-bottom: 1px solid #eaecef; */
}
.markdown-body h2 {
font-size: 1.5em;
}
.markdown-body h3 {
font-size: 1.25em;
}
.markdown-body h4 {
font-size: 1em;
}
.markdown-body h5 {
font-size: .875em;
}
.markdown-body h6 {
font-size: .85em;
color: #6a737d;
}
.markdown-body ol,
.markdown-body ul {
padding-left: 2em;
}
.markdown-body ol ol,
.markdown-body ol ul,
.markdown-body ul ol,
.markdown-body ul ul {
margin-top: 0;
margin-bottom: 0;
}
.markdown-body li {
word-wrap: break-all;
}
.markdown-body li>p {
margin-top: 16px;
}
.markdown-body li+li {
margin-top: .25em;
}
.markdown-body dl {
padding: 0;
}
.markdown-body dl dt {
padding: 0;
margin-top: 16px;
font-size: 1em;
font-style: italic;
font-weight: 600;
}
.markdown-body dl dd {
padding: 0 16px;
margin-bottom: 16px;
}
.markdown-body table {
display: block;
width: 100%;
overflow: auto;
}
.markdown-body table th {
font-weight: 600;
}
.markdown-body table td,
.markdown-body table th {
padding: 6px 13px;
border: 1px solid #dfe2e5;
}
.markdown-body table tr {
background-color: #fff;
border-top: 1px solid #c6cbd1;
}
.markdown-body table tr:nth-child(2n) {
background-color: #f6f8fa;
}
.markdown-body img {
max-width: 100%;
box-sizing: initial;
background-color: #fff;
}
.markdown-body img[align=right] {
padding-left: 20px;
}
.markdown-body img[align=left] {
padding-right: 20px;
}
.markdown-body code {
padding: .2em .4em;
margin: 0;
font-size: 85%;
background-color: rgba(27, 31, 35, .05);
border-radius: 3px;
}
.markdown-body pre {
word-wrap: normal;
}
.markdown-body pre>code {
padding: 0;
margin: 0;
font-size: 100%;
word-break: normal;
white-space: pre;
background: transparent;
border: 0;
}
.markdown-body .highlight {
margin-bottom: 16px;
}
.markdown-body .highlight pre {
margin-bottom: 0;
word-break: normal;
}
.markdown-body .highlight pre,
.markdown-body pre {
padding: 16px;
overflow: auto;
font-size: 85%;
line-height: 1.45;
}
.markdown-body pre code {
display: inline;
max-width: auto;
padding: 0;
margin: 0;
overflow: visible;
line-height: inherit;
word-wrap: normal;
background-color: initial;
border: 0;
}
.markdown-body .commit-tease-sha {
display: inline-block;
font-family: SFMono-Regular, Consolas, Liberation Mono, Menlo, monospace;
font-size: 90%;
color: #444d56;
}
.markdown-body .full-commit .btn-outline:not(:disabled):hover {
color: #005cc5;
border-color: #005cc5;
}
.markdown-body .blob-wrapper {
overflow-x: auto;
overflow-y: hidden;
}
.markdown-body .blob-wrapper-embedded {
max-height: 240px;
overflow-y: auto;
}
.markdown-body .blob-num {
width: 1%;
min-width: 50px;
padding-right: 10px;
padding-left: 10px;
font-family: SFMono-Regular, Consolas, Liberation Mono, Menlo, monospace;
font-size: 12px;
line-height: 20px;
color: rgba(27, 31, 35, .3);
text-align: right;
white-space: nowrap;
vertical-align: top;
cursor: pointer;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.markdown-body .blob-num:hover {
color: rgba(27, 31, 35, .6);
}
.markdown-body .blob-num:before {
content: attr(data-line-number);
}
.markdown-body .blob-code {
position: relative;
padding-right: 10px;
padding-left: 10px;
line-height: 20px;
vertical-align: top;
}
.markdown-body .blob-code-inner {
overflow: visible;
font-family: SFMono-Regular, Consolas, Liberation Mono, Menlo, monospace;
font-size: 12px;
color: #24292e;
word-wrap: normal;
white-space: pre;
}
.markdown-body .pl-token.active,
.markdown-body .pl-token:hover {
cursor: pointer;
background: #ffea7f;
}
.markdown-body .tab-size[data-tab-size="1"] {
-moz-tab-size: 1;
tab-size: 1;
}
.markdown-body .tab-size[data-tab-size="2"] {
-moz-tab-size: 2;
tab-size: 2;
}
.markdown-body .tab-size[data-tab-size="3"] {
-moz-tab-size: 3;
tab-size: 3;
}
.markdown-body .tab-size[data-tab-size="4"] {
-moz-tab-size: 4;
tab-size: 4;
}
.markdown-body .tab-size[data-tab-size="5"] {
-moz-tab-size: 5;
tab-size: 5;
}
.markdown-body .tab-size[data-tab-size="6"] {
-moz-tab-size: 6;
tab-size: 6;
}
.markdown-body .tab-size[data-tab-size="7"] {
-moz-tab-size: 7;
tab-size: 7;
}
.markdown-body .tab-size[data-tab-size="8"] {
-moz-tab-size: 8;
tab-size: 8;
}
.markdown-body .tab-size[data-tab-size="9"] {
-moz-tab-size: 9;
tab-size: 9;
}
.markdown-body .tab-size[data-tab-size="10"] {
-moz-tab-size: 10;
tab-size: 10;
}
.markdown-body .tab-size[data-tab-size="11"] {
-moz-tab-size: 11;
tab-size: 11;
}
.markdown-body .tab-size[data-tab-size="12"] {
-moz-tab-size: 12;
tab-size: 12;
}
.markdown-body .task-list-item {
list-style-type: none;
}
.markdown-body .task-list-item+.task-list-item {
margin-top: 3px;
}
.markdown-body .task-list-item input {
margin: 0 .2em .25em -1.6em;
vertical-align: middle;
}

View File

@@ -0,0 +1,281 @@
.aside-box {
position: relative;
background-color: white;
border-right: 1px solid rgb(245, 245, 245);
overflow: hidden;
padding: 0;
.header {
display: flex;
flex-direction: row;
align-items: center;
padding: 0 15px;
.from {
flex: 1 1;
flex-shrink: 0;
height: 40px;
/deep/.el-input .el-input__inner {
border-radius: 20px;
width: 170px;
}
}
.tools {
flex-basis: 32px;
flex-shrink: 0;
height: 32px;
margin-bottom: 8px;
cursor: pointer;
line-height: 32px;
text-align: center;
position: relative;
user-select: none;
.tools-menu {
position: absolute;
right: 0;
top: 38px;
width: 100px;
min-height: 80px;
box-sizing: border-box;
background-color: rgba(31, 35, 41, 0.9);
border-radius: 5px;
z-index: 1;
padding: 3px 0;
.menu1-item {
height: 40px;
line-height: 40px;
color: white;
font-size: 14px;
&:hover {
background-color: rgba(70, 72, 73, 0.9);
}
}
}
}
}
}
// 右侧面板
.panel {
position: relative;
width: 100%;
height: 100%;
box-sizing: border-box;
.header {
display: flex;
align-items: center;
justify-content: space-between;
&.border{
border-bottom: 1px solid #f5f5f5;
}
}
.subheader {
display: flex;
align-items: center;
justify-content: flex-start;
border-top: 1px solid rgb(92, 156, 230);
border-bottom: 1px solid rgb(92, 156, 230);
p {
padding: 0 10px;
cursor: pointer;
font-size: 13px;
&:first-child {
padding-left: 0;
}
&.active {
color: #508afe;
}
}
}
.panel-body {
overflow: auto;
width: 100%;
height: 100%;
box-sizing: border-box;
.preloading {
height: 100%;
width: 100%;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
user-select: none;
p {
margin-top: 20px;
color: #afacac;
font-size: 14px;
font-weight: 300;
}
}
.data-item {
display: flex;
flex-direction: row;
align-items: center;
height: 60px;
cursor: pointer;
padding: 5px 15px;
position: relative;
overflow: hidden;
border-bottom: 1px solid #f1ebeb;
margin-bottom: 2px;
.avatar {
height: 35px;
width: 35px;
flex-basis: 35px;
flex-shrink: 0;
background-color: #508afe;
border-radius: 50%;
overflow: hidden;
display: flex;
justify-content: center;
align-items: center;
font-size: 14px;
color: white;
user-select: none;
transition: ease 1s;
position: relative;
}
.card {
height: 40px;
display: flex;
align-content: center;
flex-direction: column;
flex: 1 1;
margin-left: 10px;
overflow: hidden;
.title {
width: 100%;
height: 20px;
display: flex;
align-items: center;
.name {
margin-right: 15px;
color: #1f2329;
}
.larkc-tag {
font-size: 12px;
font-weight: 400;
display: inline-flex;
align-items: center;
justify-content: center;
padding: 0 6px;
height: 20px;
border-radius: 2px;
cursor: default;
user-select: none;
background-color: #dee0e3;
transform: scale(0.8);
transform-origin: left;
flex-shrink: 0;
}
.wait {
background: #ffb445;
color: white;
}
.agree {
background: #53bd53;
color: white;
}
}
.content {
font-size: 10px;
line-height: 18px;
color: #8f959e;
overflow: hidden;
margin-top: 3px;
font-weight: 300;
white-space: nowrap;
text-overflow: ellipsis;
}
}
.apply-from {
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
position: relative;
right: -110px;
top: 0px;
height: 60px;
width: 100px;
transition: ease 0.5s 0.3s;
background-color: white;
opacity: 0;
button {
margin: 2px;
}
}
&:hover {
box-shadow: 0 0 8px 4px #f1f1f1;
.avatar {
border-radius: 2px;
}
.apply-from {
opacity: 1;
right: 0px;
}
}
}
}
}
.broadside-box {
position: absolute;
width: 350px;
height: 100%;
top: 0;
right: 0;
z-index: 2;
animation: showBox 0.5s ease-in-out;
-webkit-animation: showBox 0.5s ease-in-out;
-moz-animation: showBox 0.5s ease-in-out;
-webkit-box-direction: normal;
background: white;
box-shadow: 0 0 14px #cccccc70;
}
@keyframes showBox {
0% {
transform: translateX(350px);
}
to {
transform: translateX(0);
}
}
@-webkit-keyframes showBox {
0% {
-webkit-transform: translateX(350px);
}
to {
-webkit-transform: translateX(0);
}
}

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