402 Commits

Author SHA1 Message Date
Yer11214
4400e406f6 IM客服适配 2024-10-20 21:48:31 +08:00
RyanRan
78f81a8407 删除店铺显示 2024-10-05 22:47:11 +08:00
misworga831
d166d5943c fix: 已选择的分销商品,一直显示十个商品,下拉并没有增加 2024-09-23 22:34:06 +08:00
chc
c0e5d75cc6 订单增加部分发货状态 2024-09-18 15:25:32 +08:00
Yer11214
9195bcdeb5 update README.md.
Signed-off-by: Yer11214 <17633066053@163.com>
2024-07-19 02:14:48 +00:00
Yer11214
7778a62d6a fix: 🐛 修改bug在购买商品中规格为0不可编辑、购买、新增库存为0判断 2024-07-15 15:24:22 +08:00
RyanRan
31c341148f fix: 🐛 1:修改微信订阅,更改为每次支付成功之后请求订阅信息。2:修改微信支付在真机中支付成功跳转问题 2024-07-02 11:58:06 +08:00
lele0521
0b601e4f3e feat: 更新用户注销功能 2024-05-15 19:09:19 +08:00
lele0521
1d93d9103d Merge remote-tracking branch 'origin/master' 2024-05-15 18:55:48 +08:00
lele0521
5bc5152e49 feat: 更新用户注销功能 2024-05-15 18:55:41 +08:00
RyanRan
e9d1a81612 fix: 🐛 修改商品详情控制台报错bug 2024-04-29 16:29:58 +08:00
lele0521
7d3d06e8af fix: 修复虚拟订单核验码显示 2024-04-29 16:25:30 +08:00
lele0521
55bb6ab51a fix: 修复虚拟订单核验码显示 2024-04-29 16:11:56 +08:00
Yer
70c2e68bff fix: 🐛 修改砍价列表展示的Bug 2024-04-17 13:01:29 +08:00
Yer
17287df293 fix: 🐛 修改AppQQ登录appid 以及优化登录页面可能存在的bug 2024-03-15 12:02:39 +08:00
chc
a8d321c66d Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-uniapp 2024-03-11 15:55:56 +08:00
chc
fad004aed5 多货物订单无售后按钮 2024-03-11 15:55:48 +08:00
15386982806
fe9060073f 修改订单详情退款状态展示 2024-01-30 17:25:55 +08:00
15386982806
393c60200f 修改订单详情退款状态展示 2024-01-30 17:24:37 +08:00
Yer
e61222928e fix: 🐛 修复退出登录后haslogin没清空bug 2024-01-29 17:32:22 +08:00
misworga831
b51caa9135 fix: 新用户优化下单时,无地址无法下单问题 2024-01-27 10:50:42 +08:00
misworga831
992bb76072 fix: 修复已读信息接口不正确 2024-01-26 10:12:23 +08:00
misworga831
863315eaed fix: 优化虚拟商品订单不显示收货地址 2024-01-25 10:15:11 +08:00
misworga831
52bf47e358 fix: 兼容旧版本图片格式 2024-01-22 15:36:07 +08:00
Yer
8f49dce8f0 style: 解决分类搜索框页面h5不能点击问题 2024-01-17 15:46:13 +08:00
15386982806
4490a4119e 支持多包裹快递展示物流信息 2024-01-10 19:16:47 +08:00
15386982806
2d0b78af52 支持多包裹快递展示物流信息 2024-01-10 18:56:18 +08:00
15386982806
7148b32c43 订单货物展示退款状态与实际退款金额 2024-01-05 14:17:16 +08:00
lele0521
20b2ca04f0 feat: 新增会员绑定手机号功能 2023-12-04 17:19:07 +08:00
Chopper711
25677ced97 默认注释直播插件 2023-11-08 14:47:49 +08:00
Lele
4517c9562a fix: 修改优惠券类别显示 2023-10-27 18:11:02 +08:00
misworga831
2634017fb3 fix: 优化售后搜索 2023-10-16 18:33:52 +08:00
misworga831
b69c7d5a05 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-uniapp 2023-10-16 17:09:23 +08:00
misworga831
098bee9bb4 fix: 修复商品评论筛选 2023-10-16 17:09:18 +08:00
Yer
2d369ad729 fix: 🐛 解决在手机上拼团活动以及现实抢购系统栏看不到问题 2023-10-12 18:30:47 +08:00
Yer
3bf0be98cb feat: 我的足迹新增批量删除功能 2023-10-07 16:12:04 +08:00
Yer
1046a1052e feat: 个人中心优化tool方法 2023-09-28 17:22:19 +08:00
Yer
1cc6cc4ac7 修改反馈信息,回滚修改goods的代码 2023-09-26 19:22:58 +08:00
Yer
dae3e74a60 fix: 🐛 修改在部分手机分辨率下首页文字有误bug 2023-09-26 13:13:57 +08:00
Yer
fddceb5f36 fix: 🐛 修复在h5 搜索页面中点击刷新再点击回退不生效bug 2023-09-25 15:21:46 +08:00
Yer
2aed3b9305 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-uniapp 2023-09-19 17:18:46 +08:00
Yer
101aa279d8 fix: 🐛 修改了几个已知的bug 2023-09-19 17:18:44 +08:00
misworga831
abbadfbab1 fix: 完善订单投诉对话 2023-09-19 14:26:27 +08:00
Yer
8ad76a5278 fix: 🐛 修复昨天提交写错的问题 2023-09-15 17:14:13 +08:00
Yer
726a85e76c fix: 🐛 解决几个h5中会出现的Bug 2023-09-14 17:13:11 +08:00
Yer
2d69967f51 perf: 优化部分流程 2023-09-14 13:31:20 +08:00
Yer
4aeaa115dc fix: 🐛 修复部分bug 2023-09-13 15:52:08 +08:00
Yer
2d251faff1 feat: 优化个人信息页面,新增购物车删除功能 2023-09-13 09:36:37 +08:00
Yer
231936c91d feat: 新增微信小程序登录页面勾选协议功能 2023-09-07 11:41:07 +08:00
Yer
37b8e17cba feat: 微信小程序登录页面新增用户协议、隐私协议 2023-09-06 17:50:58 +08:00
Yer
7d928e3df9 fix: 🐛 修复店铺单个展示商品样式错bug 2023-09-05 11:53:02 +08:00
Yer
bb4435fab4 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-uniapp 2023-09-04 10:27:12 +08:00
Yer
1e0580ba15 fix: 🐛 修复店铺入驻bug 2023-09-04 10:27:10 +08:00
misworga831
f5716c901d Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-uniapp 2023-08-25 13:59:08 +08:00
misworga831
2c4c0ea4f0 fix: 优化小程序登录 2023-08-25 13:58:56 +08:00
Yer
63fee6f272 feat: 新增虚拟商品不展示地址功能 2023-08-18 18:49:34 +08:00
Yer
9ab1cec1bb perf: 🐛 优化QQ登录和微信登录Bug 2023-08-14 14:40:08 +08:00
misworga831
7c2a50eec0 fix: 优化小程序登录 2023-08-10 15:04:20 +08:00
misworga831
82810eb179 fix: 优化小程序登录 2023-08-10 14:19:23 +08:00
chc
53917d32c0 审核状态 2023-08-03 16:04:18 +08:00
Yer
f324fbe71d Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-uniapp 2023-08-02 10:11:28 +08:00
Yer
c6afd889ef fix: 🐛 修复砍价、积分商品详情图片间距问题 2023-08-02 10:11:25 +08:00
“Yer”
116ba65bda fix: 🐛 修复店铺商品分类中的商品列表展示问题 2023-07-31 15:40:02 +08:00
Yer
02812a9128 feat: 领取优惠券新增节流功能 2023-07-28 10:49:20 +08:00
Yer
fcc99b61e8 添加店铺入驻成功提示语 2023-07-27 11:47:02 +08:00
Yer
c9a3c72c10 新增店铺入驻未登录提示 2023-07-27 11:20:08 +08:00
Yer
abc9c59e29 修改用户协议隐私协议链接错误 2023-07-26 14:42:20 +08:00
Yer
9ed897aa85 优化登录跳转问题 2023-07-25 10:47:18 +08:00
Yer
5a84f2192f 跳转问题解决 2023-07-25 10:37:22 +08:00
Yer
9ac9cd480b fix: 🐛 修改订单详情中优惠券不展示Bug 2023-07-21 18:38:17 +08:00
Yer
b635f91e9f feat: 小程序端兼容video 播放 2023-07-20 15:50:29 +08:00
Yer
99079f0b3d feat: 新增店铺入驻功能,买家端可直接申请店铺入驻 2023-07-18 17:14:53 +08:00
Yer
317c2171e4 更改微信小程序登录按钮文字,目前使用”微信授权“会导致微信审核不通过 2023-07-14 17:10:29 +08:00
Yer
cba7ae98fa style: 💄 修改商品详情图片展示空格问题 2023-07-11 17:58:45 +08:00
Yer
e6dcb5cd3a 删除预估到手价展示 2023-07-10 16:05:45 +08:00
Yer
94f1da349a style: 💄 修改Im页面样式 2023-07-04 14:02:04 +08:00
Yer
06b5a9d7f1 style: 📝 更改README文档 2023-07-04 11:53:30 +08:00
Yer
48bebc0503 fix: 💄 优化我的订单中按钮样式 2023-06-30 10:41:25 +08:00
Yer
af1897f4ea fix: 🐛 修复楼层装修中公共js 中的bug 2023-06-25 18:01:29 +08:00
Yer
8238211f33 im 模块修改 2023-06-01 12:41:04 +08:00
Chopper711
907f51b13a 部分售后兼容 2023-05-31 15:13:52 +08:00
yeliang-king
3b036a7cb7 合并冲突 2023-05-29 15:20:08 +08:00
yeliang-king
9a0cb35637 修改页面内容 2023-05-29 15:19:31 +08:00
Yer
1c938e0007 refactor: 🎨 优化我的收藏和足迹代码 2023-05-24 16:54:15 +08:00
Yer
f31ff79a39 refactor: 🎨 优化订单备注在onShow时候丢失问题 以及 优化部分代码 2023-05-17 14:50:05 +08:00
Yer
d5ea5a4fa9 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-uniapp 2023-05-16 18:04:23 +08:00
Yer
c7237e561c fix: 🐛 修改订单取消不展示bug 2023-05-16 18:04:20 +08:00
chc
6717721725 移动端店铺收藏问题 2023-05-15 14:34:54 +08:00
chc
5e5d5b904b fix: 移动端店铺收藏 2023-05-15 14:21:38 +08:00
Yer
a353022d36 fix: 🐛 地址取消加载 loading Bug 2023-05-11 18:24:07 +08:00
Yer
ca4e458db1 feat: 新增商品下架提示框,在原有的下架提示中优化商品展示页面,弹出下架提示,展示其他商品功能。 2023-05-10 10:46:23 +08:00
Yer
7b8e954555 fix: 🐛 request 清空缓存 uuid丢失判断优化 2023-05-09 18:12:52 +08:00
Yer
b4f46ded2b feat: 我的足迹新增失效商品判断 2023-05-08 18:15:01 +08:00
Yer
274a03fe73 refactor: 🎨 购物车页面步进器数量插件更改,删除冗余代码 2023-05-04 11:03:44 +08:00
Yer
0a07ebfe8b 删除部分冗余代码 2023-04-28 11:21:50 +08:00
mahe
39c82361b6 修改店铺跳转地址 2023-04-28 10:58:13 +08:00
Yer
89f4e051ca fix: 🐛 后端修改es商品返回数据字段,前端同步 2023-04-28 10:21:36 +08:00
Yer
c04ae5eb39 fix: 🐛 补充提交购物车多次点击提交bug 2023-04-20 16:45:15 +08:00
Yer
ec692e1134 docs: 关闭小程序登录获取手机号功能,使用微信登录。解决小程序要求授权手机号出错问题。 2023-04-20 10:20:08 +08:00
Yer
02a1f7ee83 fix: 🐛 修改购物车微信小程序多次点击新增商品数量导致 页面卡顿问题 2023-04-20 10:17:57 +08:00
学习很差啦
97aa989e0b 修改优惠券文字描述 2023-04-14 10:59:54 +08:00
学习很差啦
ac67c16378 遗漏补充提交 2023-04-11 19:04:04 +08:00
学习很差啦
2bdb8682e1 feat: 优化在微信小程序中接口返回的错误信息 会被uni.hideLoading取消展示错误信息问题 2023-04-11 18:41:34 +08:00
学习很差啦
c070ed01f7 refactor: 🐛 重构im代码 2023-04-11 15:17:15 +08:00
学习很差啦
af4cfe7fba feat: 🐛 新增备用登录方案、并优化店铺名称过长导致显示错乱的样式问题、优化自动发券功能 2023-04-10 11:18:09 +08:00
学习很差啦
6a8e666fb8 fix: 🐛 优化优惠券详情不展示折扣信息 2023-04-04 18:30:26 +08:00
学习很差啦
c097a423f9 style: 后端ES接口返回格式调整,前端字段调整 2023-04-04 16:07:22 +08:00
学习很差啦
f0dcf473e8 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-uniapp 2023-04-04 09:54:31 +08:00
学习很差啦
bdff6a3c93 fix: 🐛 Im 修复在微信小程序中键盘弹出导致navbar上移的bug 2023-04-04 09:54:24 +08:00
Chopper711
74829c966d update README.md.
Signed-off-by: Chopper711 <1814994716@qq.com>
2023-03-31 07:24:05 +00:00
chc
77db8df123 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-uniapp 2023-03-29 16:44:59 +08:00
chc
a403a7d432 feat: 订单详情展示联系客服 2023-03-29 16:44:15 +08:00
学习很差啦
951d2d7f30 补全提交 2023-03-29 16:17:46 +08:00
学习很差啦
e8ddc53188 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-uniapp 2023-03-29 15:25:41 +08:00
学习很差啦
0708226890 refactor: 修改部分页面变量命名,迁移首页中新人发券代码 2023-03-29 15:25:39 +08:00
lemon橪
b0447eec3a fix: 🐛 退出登录后清空优惠券足迹展示 2023-03-28 11:32:13 +08:00
学习很差啦
e37a8ec41d fix: 🐛 新增h5中微信支付完回调查询订单详情 2023-03-21 18:47:23 +08:00
学习很差啦
467b7a0cba fix: 🐛 修改微信浏览器中支付唤起支付显示框不关闭bug 2023-03-21 15:49:42 +08:00
学习很差啦
9a583e75f3 feat: 优化联系客服,搜索功能显搜索关键字 2023-03-17 20:13:47 +08:00
学习很差啦
f9ae51606f fix: 🐛 修改商品搜索中一行一列展示商品模块中,最后一个商品展示不全的样式bug 2023-03-10 10:34:32 +08:00
学习很差啦
e768a4c1db Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-uniapp 2023-03-10 09:09:34 +08:00
学习很差啦
a77390bf5c feat: App联合登录新增unionId 2023-03-10 09:09:32 +08:00
chc
1e41801612 fix: 🐛 自提不回显问题,自提取消后券码取消显示 2023-03-09 11:17:53 +08:00
misworga831
d870ee409a add withdrawal 2023-03-08 22:01:02 +08:00
学习很差啦
b2a448447c fix: 🐛 修复投诉功未填写信息导致后端报错问题,优化投诉模块显示 2023-03-02 11:39:00 +08:00
学习很差啦
38a00e6177 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-uniapp 2023-03-01 18:29:32 +08:00
学习很差啦
767ad94565 优化Im 多订单展示 2023-03-01 18:29:25 +08:00
Chopper711
7499682883 !11 修复暂无收货地址数据判断错误问题
Merge pull request !11 from master @Jimi
2023-03-01 02:49:49 +00:00
Jimi
9192f32bbb fix: 修复暂无收货地址判断错误问题 2023-02-28 17:09:17 +08:00
学习很差啦
d256fd3559 style: 💄 修改im样式 2023-02-17 18:12:22 +08:00
学习很差啦
5844e74d32 feat: 新增过期token请求判断 2023-02-16 14:41:55 +08:00
学习很差啦
989a567ecb 代理入驻 2023-02-16 10:53:14 +08:00
d5d47ffae5 上拉刷新空页面wenti 2023-02-13 11:57:52 +08:00
8001622be2 im断线重连 2023-02-13 10:56:11 +08:00
fc5a6a6f7f 更改IM 2023-02-10 17:55:52 +08:00
dc15439861 im重复请求 2023-02-10 16:26:30 +08:00
c9c0d2d171 im重复请求 2023-02-10 16:25:42 +08:00
Chopper711
44cf46fed3 略微完善注释与逻辑 2023-02-10 14:29:18 +08:00
63ebf1a7c5 im重复请求问题 2023-02-10 14:13:22 +08:00
bc10d774a7 :Merge branch 'master' of https://toscode.gitee.com/beijing_hongye_huicheng/lilishop-uniapp 2023-02-09 16:52:13 +08:00
90f656beab im 2023-02-09 16:52:07 +08:00
Chopper711
66c729b539 update README.md.
Signed-off-by: Chopper711 <1814994716@qq.com>
2023-02-09 03:21:18 +00:00
db4dfd3edc 修改im接口报错问题 2023-02-08 12:03:48 +08:00
e7879aac65 im聊天室接口报错问题 2023-02-08 11:59:15 +08:00
学习很差啦
723570b392 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-uniapp 2023-01-29 18:14:59 +08:00
学习很差啦
5dc562396c style: 新增复制粘贴以及拨打电话封装模块,优化部分文件中的变量名、将冗余功能抽出、优化订单详情展示 2023-01-29 18:14:53 +08:00
chc
b266aad634 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-uniapp 2023-01-19 17:24:17 +08:00
chc
a25c75bf7a 自提回显 2023-01-19 17:23:52 +08:00
学习很差啦
43fc159e27 fix: 🐛 修复商品列表有促销活动不显示Bug 2023-01-19 15:59:10 +08:00
学习很差啦
2e37cb8158 style: 💄 修改部分页面UI 2023-01-17 16:14:12 +08:00
学习很差啦
529175c0ab style: 🎨 优化退出登录功能、优化部分变量名 2023-01-16 16:56:45 +08:00
学习很差啦
071599074c Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-uniapp 2023-01-16 09:17:48 +08:00
学习很差啦
d420c128eb fix: 🐛 展示在订单详情中的立即支付按钮 2023-01-16 09:17:45 +08:00
lemon橪
b33fd7e2b3 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-uniapp 2023-01-13 11:04:28 +08:00
lemon橪
815118d496 fix: 🐛 删除我的顶部背景栏配置项 2023-01-13 11:04:25 +08:00
83031507b9 Merge branch 'master' of https://toscode.gitee.com/beijing_hongye_huicheng/lilishop-uniapp 2023-01-13 10:52:39 +08:00
7565086291 转换表情 2023-01-13 10:52:12 +08:00
lemon橪
7c71375b6c Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-uniapp 2023-01-12 18:12:40 +08:00
lemon橪
c919b1463c feat: config新增默认用户头像以及默认背景配置,修复查看订单报错无权限bug 2023-01-12 18:12:35 +08:00
b72d831df9 im商品跳转问题 2023-01-12 16:48:31 +08:00
2c494ac0d1 Merge branch 'master' of https://toscode.gitee.com/beijing_hongye_huicheng/lilishop-uniapp 2023-01-12 14:35:28 +08:00
83b2295818 更换socket 2023-01-12 14:35:24 +08:00
Yer11214
11a831299a !9 update pages/tabbar/home/template/tpl_goods.vue.
Merge pull request !9 from 微安/N/A
2023-01-12 06:30:03 +00:00
paulGao
bbe315fb45 feat: 优化优惠券使用跳转 2023-01-11 11:28:51 +08:00
yeliang-king
9c03205c9f 合并 2023-01-13 07:36:43 +08:00
yeliang-king
12a4e15c13 manifest 2023-01-13 07:36:24 +08:00
yeliang-king
0843e457b0 移动端自动发券前端展示 2023-01-13 07:35:51 +08:00
学习很差啦
b1bde2f105 fix: 🐛 修改因为Im导致微信小程序编译不通过问题 更改看到的变量名问题 im后续会进行优化 2023-01-10 15:21:18 +08:00
chc
d2ff0b1ea1 IM配置 2023-01-09 19:03:29 +08:00
chc
7ff13babaa 合并im 2023-01-09 18:53:29 +08:00
chc
0da7dc6796 Merge branch 'lili_self' of https://gitee.com/beijing_hongye_huicheng/lilishop-uniapp 2023-01-09 18:49:54 +08:00
yeliang-king
f84f9ab696 优惠券种类字段修改 2022-12-30 17:33:05 +08:00
yeliang-king
8b5f7def93 楼层装修单个图片 问题 2022-12-30 14:38:42 +08:00
8c33b899bf 订单列表显示,修改bug 2022-12-29 18:19:17 +08:00
yeliang-king
8767ad6d3f 修改优惠券 类型 字段 2022-12-29 14:54:35 +08:00
yeliang-king
f797538935 修改优惠券 2022-12-29 12:02:05 +08:00
cfb4310d6f Merge branch 'lili_self' of https://gitee.com/beijing_hongye_huicheng/lilishop-uniapp into lili_self 2022-12-28 18:33:57 +08:00
d59cd74bf0 发送消息不显示bug 2022-12-28 18:33:50 +08:00
chc
c378ce7d71 im 2022-12-28 18:23:49 +08:00
9cc6f519a9 聊天功能 2022-12-27 18:01:41 +08:00
18251dde89 聊天 2022-12-27 14:49:23 +08:00
chc
04bf707836 获取消息 2022-12-27 14:48:41 +08:00
chc
5e38247ce8 IM功能 2022-12-27 14:17:00 +08:00
lemon橪
979a1e6b14 fix: 🐛 修改商品数量为0时候下单报错问题,修改店铺楼层开关不生效问题 2022-12-26 16:28:14 +08:00
lemon橪
9127d61a59 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-uniapp 2022-12-26 15:07:27 +08:00
lemon橪
fed76499a0 fix: 🐛 修改楼层中热区判断失效问题,优化客服跳转判断 2022-12-26 15:07:24 +08:00
chc
6843feebfa 四个协议不展示问题 2022-12-22 18:19:09 +08:00
weian
e650ee66ff update pages/tabbar/home/template/tpl_goods.vue.
微信小程序首页的商品分类模块,以lili官方演示站点小程序为例,点击(精选、实惠、进口、热卖)这一排分类的时候,会有黑色的底色出现,h5没有这个底色,我调试后发现是这个uni-data-select组件源码中cursor: pointer样式引起的,注释掉,微信小程序点击这一排就正常了不会有底色,对h5也没影响


Signed-off-by: weian <20943448@qq.com>
2022-12-14 06:17:24 +00:00
yeliang-king
fa6f571f61 ios 退出问题 2022-12-08 11:18:54 +08:00
yeliang-king
09b7ece510 增加注释 2022-12-06 11:11:30 +08:00
学习很差啦
b30caf051c !8 update pages/order/afterSales/afterSales.vue.
合并岁岁平安提出来的pr
2022-12-02 03:44:39 +00:00
mahe
861bf1eb07 购物车步进器增加防抖 2022-11-30 11:32:45 +08:00
paulGao
a0f1417f42 fix: 🐛 优化批发商品购买数量不能小于起批量 2022-11-29 15:02:24 +08:00
chc
2b5f57dfab 购买数量超过库存后修改为库存数量 2022-11-29 11:19:37 +08:00
岁岁平安
22a5f15201 update pages/order/afterSales/afterSales.vue.
修复售后申请中一个商品订单下的多个商品展示时,当一个在申请售后中另外几个都显示在申请售后的状态

Signed-off-by: 岁岁平安 <2170454588@qq.com>
2022-11-25 02:32:02 +00:00
chc
6baf1534c1 请求格式 2022-11-22 17:59:18 +08:00
chc
df3ce9eda7 自提 2022-11-22 17:19:09 +08:00
mahe
7f71614781 修改装修搜索传参 2022-11-17 10:36:52 +08:00
夜良king
8c5b703c47 优化 站内信 2022-11-10 11:57:30 +08:00
学习很差啦
394cda3efd feat: 💄 商品详情新增砍价活动跳转 2022-11-10 09:28:56 +08:00
学习很差啦
7b9b5c2819 将当前客户端类型进行登录传值 2022-11-09 17:36:36 +08:00
学习很差啦
4625c087d5 !5 update api/login.js.
Merge pull request !5 from N/A
2022-11-09 09:33:16 +00:00
学习很差啦
f7c3c56b53 补充提交内容 2022-11-09 17:05:54 +08:00
学习很差啦
0aa9831a62 feat: 💄 商品详情中积分商品展示优化 ,商品详情中将不再展示积分商品信息。 2022-11-09 17:00:57 +08:00
你为什么抱着键盘睡觉
ea32948b84 update api/login.js.
账号密码登录没传客户端类型 默认就PC了 导致app登录的话token有效期就两分钟 没有15天

Signed-off-by: 你为什么抱着键盘睡觉 <2170454588@qq.com>
2022-11-09 08:23:23 +00:00
paulGao
0feaf55381 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-uniapp 2022-11-04 17:56:57 +08:00
paulGao
eaa04e395b feat: 增加楼层装修 2022-11-04 17:56:02 +08:00
学习很差啦
0f8d53b09a fix: 🐛 修改可能显示图片不全的问题 2022-11-02 15:27:35 +08:00
学习很差啦
031aa0f173 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-uniapp 2022-10-28 14:56:51 +08:00
学习很差啦
5f5b571899 fix: 🐛 商品购买数量文字显示居中修改 2022-10-28 14:56:48 +08:00
chc
b6f041f68c 关于文章跳转 2022-10-28 11:28:26 +08:00
chc
558a3228be 关于文章跳转 2022-10-28 10:46:51 +08:00
夜良king
2e4bedae31 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-uniapp 2022-10-27 11:50:00 +08:00
夜良king
e2905e8fdd 修改 站内信 2022-10-27 11:49:46 +08:00
学习很差啦
ddee1fca8e Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-uniapp 2022-10-27 10:25:32 +08:00
学习很差啦
d2b13e146e fix: 🐛 修改店铺列表api路径问题 2022-10-27 10:25:30 +08:00
夜良king
9b3704a141 楼层单个图片问题 2022-10-26 16:28:23 +08:00
chc
9b5e2ec7f0 显示价格修改 2022-10-20 10:03:58 +08:00
chc
adf4e106d8 销售模式判断 2022-10-19 14:42:37 +08:00
学习很差啦
d01edbdfe2 feat: 楼层装修新增绑定分类功能 2022-10-19 11:56:42 +08:00
学习很差啦
f08d166c86 fix: 🐛 修改在关于我们等页面展示问题 2022-10-17 15:28:31 +08:00
学习很差啦
b8c61fdabd Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-uniapp 2022-10-17 14:27:27 +08:00
学习很差啦
6b3b61acb5 fix: 🐛 修复搜索页面展开历史的bug 2022-10-17 14:27:24 +08:00
1a6951b717 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-uniapp 2022-10-13 15:37:06 +08:00
165df678b3 微信登陆不跳转 2022-10-13 15:36:59 +08:00
学习很差啦
2abbee0a49 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-uniapp 2022-10-13 14:27:37 +08:00
学习很差啦
a6883fe607 fix: 🐛 修复在ios中使用手势回退会导致在我的订单页面回退按钮丢失bug 2022-10-13 14:27:34 +08:00
夜良king
6ee0abd150 站内信 入口 2022-10-11 19:09:22 +08:00
夜良king
68e927c6f4 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-uniapp 2022-10-11 18:27:54 +08:00
夜良king
1776f43425 站内信 app端 2022-10-11 18:27:42 +08:00
学习很差啦
fc8123c194 feat: 🎨 新增专题功能 2022-10-11 17:36:40 +08:00
学习很差啦
34448b8a23 merge code 2022-10-10 18:56:56 +08:00
学习很差啦
7179ca41de feat: 🎨 在config中新增5个便捷功能选项,更加简单便捷配置以及使用代码。优化部分冗余的代码 2022-10-10 18:53:14 +08:00
lemon橪
3c7d940ba8 fix: 🐛 提交parseInt导致的bug 2022-10-03 12:47:03 +08:00
学习很差啦
1225a41de4 fix: 🐛 修改格式化金额可能会出现的问题 2022-09-30 18:36:21 +08:00
学习很差啦
d101cd1b6a 修改之前封装方法出错导致出现的bug 2022-09-30 16:29:16 +08:00
学习很差啦
4851487ecd Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-uniapp 2022-09-30 09:58:10 +08:00
学习很差啦
eb0faad7ec refactor: 🐛 优化部分代码逻辑 2022-09-30 09:58:08 +08:00
lemon橪
524666f6e4 fix: 🐛 首次进入订单不刷新数据bug 2022-09-28 17:24:51 +08:00
lemon橪
e9da67dcce 修改砍价跳转问题 2022-09-27 12:40:30 +08:00
学习很差啦
aa8fc523df !4 1.在我的界面增加我的消息链接到IM消息
更新@Neo0820提交的pr
2022-09-23 07:35:17 +00:00
学习很差啦
63570a923b Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-uniapp 2022-09-23 15:10:28 +08:00
学习很差啦
638e82dd28 feat: 🎨 合并其他分支代码 2022-09-23 15:10:25 +08:00
学习很差啦
68dc960232 style: 💄 优化商品购买时商品数量显示问题 以及修改地址跳转问题 2022-09-23 15:05:19 +08:00
neo0820
bbbe25e339 1.在我的界面增加我的消息链接到IM消息
1.在我的界面增加我的消息链接到IM消息
2.调整了一下我的界面菜单的排序
3.顶部点击用户进去的personMsg增加一个退出登录的按钮
2022-09-23 09:00:41 +08:00
lemon橪
d8cca8b372 feat: 基于 @xiaochangbai 老哥的代码进行了一点样式优化
看到老哥有引入其他的qr插件,在项目里面本身自带了一个,稍微改了一下部分样式

https://gitee.com/beijing_hongye_huicheng/lilishop-uniapp/pulls/3
2022-09-16 16:39:32 +08:00
lemon橪
1e9df74034 perf: 🎨 改善促销部分荣誉代码 封装为组件使用 更加便捷以及好看。 优化部分页面显示问题
删除部分原有的老样式  更新新版促销样式 页面更加好看 删除冗余代码 封装多种方法以及组件
2022-09-15 15:40:50 +08:00
学习很差啦
8c8522c68e temp commit 2022-09-14 10:53:19 +08:00
学习很差啦
5afc5477a9 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-uniapp into test-lmr 2022-09-14 10:51:18 +08:00
学习很差啦
a6e48813cd Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-uniapp 2022-09-14 10:50:11 +08:00
学习很差啦
a1a286dfb6 temp commit 2022-09-14 10:48:30 +08:00
学习很差啦
132c64f438 提交app版本重复升级bug 2022-09-14 10:48:12 +08:00
学习很差啦
8e0bde3428 优化小程序分享 2022-09-14 10:48:12 +08:00
学习很差啦
d9ac9eb2eb 优化部分代码 2022-09-14 10:48:12 +08:00
paulGao
6ccdeba85e 增加热区功能 2022-09-14 10:47:52 +08:00
lemon橪
bbf0f39d69 优化分享链接多次提示问题,优化店铺点击搜索bug,优化登录页面在h5部分手机显示第三方登录样式问题 2022-09-14 10:47:52 +08:00
lemon橪
109af44c6b 高亮搜索热词,修改分销部分字段 2022-09-14 10:47:52 +08:00
lemon橪
bc9c012bb2 修改微信h5中充值会出现零钱充值的问题 2022-09-14 10:47:52 +08:00
paulGao
ba02c6ca7d 优化某些情况下登录权限问题 2022-09-14 10:47:52 +08:00
lemon橪
b840a0adf1 修改意见反馈以及修改密码发现的bug 2022-09-14 10:47:52 +08:00
Chopper711
5cb2f6ad91 update README.md. 2022-09-14 10:47:52 +08:00
fengtianyangyang
36a7a80814 获取物流列表失败 2022-09-14 10:47:52 +08:00
lemon橪
17299d00e1 解决在app中断网没有及时更新首页的问题 2022-09-14 10:47:52 +08:00
paulGao
a56ea2d456 适配优化的sql,将平台id改为0 2022-09-14 10:47:52 +08:00
paulGao
3a705cce8e 适配优化的sql,将平台id改为0 2022-09-14 10:47:39 +08:00
lemon橪
5550285531 修改零钱反复充值bug 2022-09-14 10:46:53 +08:00
lemon橪
0ba7644862 提交楼层跳转sku字段替换为 id字段 2022-09-14 10:46:53 +08:00
lemon橪
0e169bd116 修改已发现的问题 2022-09-14 10:46:53 +08:00
lemon橪
4b9515b21a 修复店铺联系客服跳转问题 2022-09-14 10:43:59 +08:00
lemon橪
3f0e34b715 修改商品详情中发现的展示问题 2022-09-14 10:43:59 +08:00
lemon橪
a393910c0a 补全提交 2022-09-14 10:43:59 +08:00
lemon橪
213f4b8408 优化批发商品展示样式 2022-09-14 10:43:59 +08:00
lemon橪
8cb01d0ba8 优化领劵中心的逻辑以及页面 2022-09-14 10:43:59 +08:00
lemon橪
d8c46b49d9 解决小程序中 修改密码样式问题 2022-09-14 10:43:59 +08:00
lemon橪
73e4ba9994 封装商品展示模块,全局统一管理格式,将旧版商品展示部分优化。 2022-09-14 10:43:59 +08:00
lemon橪
3aa5b21d49 优化商品搜索 空数据显示 2022-09-14 10:43:59 +08:00
Chopper
f90807ebc6 token刷新问题 2022-09-14 10:43:59 +08:00
paulGao
a555009ac9 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-uniapp 2022-09-06 19:46:47 +08:00
paulGao
af21d1abba 增加热区功能 2022-09-06 19:46:00 +08:00
学习很差啦
dcf77ba862 提交app版本重复升级bug 2022-09-06 16:25:53 +08:00
学习很差啦
f281011a47 优化小程序分享 2022-08-25 18:25:45 +08:00
学习很差啦
6bb8ca73d3 优化部分代码 2022-08-25 12:46:52 +08:00
学习很差啦
a070edc1c2 部分细节处理 2022-08-10 18:28:06 +08:00
学习很差啦
09485747a6 [仅供测试]重写navigateTo方法,解决微信小程序中超过10个页面栈时会出现的bug 2022-07-20 18:24:49 +08:00
lemon橪
cbd73ae638 优化分享链接多次提示问题,优化店铺点击搜索bug,优化登录页面在h5部分手机显示第三方登录样式问题 2022-07-14 14:20:15 +08:00
lemon橪
1aeec348eb 高亮搜索热词,修改分销部分字段 2022-07-08 17:43:04 +08:00
lemon橪
ea8e783909 修改微信h5中充值会出现零钱充值的问题 2022-07-08 11:26:10 +08:00
lemon橪
e06338dd2e 修改意见反馈和修改密码发现的bug 2022-07-06 18:34:05 +08:00
lemon橪
d6fffc43e4 修改意见反馈以及修改密码发现的bug 2022-07-06 18:32:53 +08:00
paulGao
7633f84385 优化某些情况下登录权限问题 2022-07-06 16:22:46 +08:00
lemon橪
93fc20c825 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-uniapp 2022-06-24 16:59:08 +08:00
lemon橪
ca32c11296 解决在app中断网没有及时更新首页的问题 2022-06-24 16:59:04 +08:00
Chopper711
d2b8d2238a update README.md. 2022-06-23 01:46:16 +00:00
fengtianyangyang
04ea9c39e1 获取物流列表失败 2022-06-17 17:24:00 +08:00
lemon橪
905e965917 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-uniapp 2022-06-15 10:09:42 +08:00
lemon橪
1ada23584d 修改零钱反复充值bug 2022-06-15 10:09:40 +08:00
paulGao
1456fd9076 适配优化的sql,将平台id改为0 2022-06-08 16:10:43 +08:00
paulGao
941dd6015d Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-uniapp 2022-06-08 16:09:52 +08:00
paulGao
b1f320f361 适配优化的sql,将平台id改为0 2022-06-08 16:08:58 +08:00
lemon橪
63e3718178 提交楼层跳转sku字段替换为 id字段 2022-06-07 15:34:09 +08:00
Chopper
9bfa30f849 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-uniapp
# Conflicts:
#	App.vue
2022-06-06 10:23:58 +08:00
Chopper
bb24b27963 token刷新问题 2022-06-06 10:23:33 +08:00
lemon橪
403d93831f 修改已发现的问题 2022-06-02 19:09:57 +08:00
lemon橪
9a149eb673 修复店铺联系客服跳转问题 2022-06-01 17:28:46 +08:00
lemon橪
470995c13d 修改商品详情中发现的展示问题 2022-06-01 11:30:23 +08:00
lemon橪
ddcd03f096 补全提交 2022-06-01 11:02:25 +08:00
lemon橪
b8fe2aacf1 优化批发商品展示样式 2022-06-01 10:58:54 +08:00
lemon橪
3c9f0d3c5c 优化领劵中心的逻辑以及页面 2022-05-31 15:42:21 +08:00
lemon橪
ded0ab5381 解决小程序中 修改密码样式问题 2022-05-31 12:06:30 +08:00
lemon橪
42d20f0fd9 封装商品展示模块,全局统一管理格式,将旧版商品展示部分优化。 2022-05-30 16:37:50 +08:00
lemon橪
0e8ace560b 批发商品展示 2022-05-27 18:18:02 +08:00
lemon橪
6e04a5d3da 批发商品展示 2022-05-27 18:17:23 +08:00
lemon橪
a3d8a8037f 优化商品搜索 空数据显示 2022-05-27 15:45:37 +08:00
lemon橪
1dc42e1333 提交批量购买样式 2022-05-27 10:32:08 +08:00
lemon橪
68cdcd8587 优化我的足迹 2022-05-19 09:31:32 +08:00
lemon橪
ebf0d585fc 解决订单发现的问题 2022-05-18 15:30:17 +08:00
lemon橪
75365c428d 合并提交 2022-05-10 12:08:45 +08:00
lemon橪
3e30f5e18f 修复我的足迹分页bug 2022-05-10 12:06:28 +08:00
yeliang-king
e8d3b3decb Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-uniapp 2022-05-09 09:36:16 +08:00
yeliang-king
5dcb364469 账号密码登录 和 获取权限问题 2022-05-09 09:36:02 +08:00
yeliang-king
df9530e48f 账号 密码登录 与 获取权限问题 2022-05-09 09:34:49 +08:00
lemon橪
240a27a61a Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-uniapp 2022-05-05 15:11:50 +08:00
lemon橪
a6a8a5d583 提交修改购物车bug 2022-05-05 15:11:45 +08:00
ran
a9046aded4 优化我的足迹部分代码 2022-05-03 10:12:01 +08:00
ran
6f60cc6afb 补充提交 2022-04-29 12:10:19 +08:00
ran
6e5470e20c Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-uniapp 2022-04-29 12:07:37 +08:00
ran
dc04b4220f 修复购物车添加促销商品出现的Bug 2022-04-29 12:07:30 +08:00
lemon橪
b1cfdef41c app更新判断问题 2022-04-26 17:21:03 +08:00
lemon橪
06e609613e Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-uniapp 2022-04-26 15:17:04 +08:00
lemon橪
8e66c24ff9 修改售后管理页面 样式以及小程序中不显示问题,新增订单判断 修改直播部分判断 2022-04-26 15:17:00 +08:00
yeliang-king
b4e2761b1f app 弹框协议等 2022-04-24 22:41:00 +08:00
paulGao
884d3e8c34 修复结算页只存在无效商品的店铺,显示空白店铺信息问题 2022-04-22 16:32:33 +08:00
paulGao
53739d24df 修复楼层装修标题组件小标题跳转问题 2022-04-21 16:53:53 +08:00
paulGao
f59a76d9a0 修复结算页面显示失效商品问题 2022-04-21 16:06:53 +08:00
paulGao
6cd36b19b2 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-uniapp 2022-04-21 14:58:36 +08:00
paulGao
b22ad88f37 优化移动端楼层装修 2022-04-21 14:58:18 +08:00
lemon橪
f87ec18669 删除云智服 2022-04-21 11:58:34 +08:00
lemon橪
64686e165f 修改我的订单多次请求bug 2022-04-21 11:50:13 +08:00
lemon橪
055bad9ca9 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-uniapp 2022-04-19 14:09:00 +08:00
lemon橪
c6e04bc4b9 修改优惠券显示有问题 2022-04-19 14:08:57 +08:00
Chopper
b6782df565 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-uniapp 2022-04-19 10:40:51 +08:00
Chopper
2b4cb2cc88 积分命名展示问题处理 2022-04-19 10:40:46 +08:00
paulGao
14d12d90e3 优化楼层装修 2022-04-18 09:51:00 +08:00
paulGao
4ed3832a5f 增加根据更新时间排序足迹 2022-04-08 16:28:14 +08:00
lemon橪
b0714ab27e Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-uniapp 2022-04-02 18:32:04 +08:00
lemon橪
201ee840d5 提交im 优化app 中余额支付 2022-04-02 18:32:01 +08:00
paulGao
79f737404e 优化订单刷新 2022-03-31 15:23:31 +08:00
paulGao
0b649e3f5b 修复app更新接口错误问题 2022-03-24 16:02:31 +08:00
lemon橪
c756223363 修改刷新token问题 2022-03-23 20:03:06 +08:00
lemon橪
ea60742d82 修改部分bug 2022-03-10 17:15:59 +08:00
lemon橪
2ce90ba008 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-uniapp 2022-02-28 21:12:02 +08:00
lemon橪
63211457e4 修改登录可能会出现的bug 2022-02-28 21:12:00 +08:00
夜良king
67f014d74a 更新微信订阅 2022-02-28 15:18:18 +08:00
lemon橪
08fffade74 适配api 2022-02-14 18:33:23 +08:00
lemon橪
c8adb52660 修改接口地址 2022-02-14 18:23:00 +08:00
paulGao
4f74502951 connect 2022-02-14 18:16:48 +08:00
paulGao
4a5a4c19a5 修改第三方登录 2022-02-14 18:09:51 +08:00
lemon橪
e73d76eb57 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-uniapp 2022-02-14 14:31:36 +08:00
lemon橪
b9a89d7c40 新增分销模块分销业绩详细信息补充 2022-02-14 14:31:29 +08:00
paulGao
1a1bf814a0 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-uniapp 2022-02-14 14:21:50 +08:00
paulGao
f52e929d04 适配api 2022-02-14 14:21:48 +08:00
paulGao
38d8d2e1ca 适配修改后的api 2022-02-12 15:20:48 +08:00
paulGao
ab4015d0e0 适配修改的api 2022-02-10 18:57:17 +08:00
lemon橪
15027e51ee 优化安卓app在登录验证页面图像可能显示异常问题 2022-02-07 14:41:18 +08:00
paulGao
557d7ef1d9 fix bugs 2022-01-27 14:58:42 +08:00
paulGao
4dea906e23 修复店铺和平台优惠券同时选择时,显示问题 2022-01-21 19:02:06 +08:00
paulGao
68e25cb0b3 优化下单后退显示 2022-01-04 19:58:01 +08:00
paulGao
4d033e59f1 增加刷新token接口失效的情况处理 2022-01-04 14:22:00 +08:00
paulGao
a80c579d8a 售后获取订单过滤0元订单 2022-01-04 09:20:20 +08:00
paulGao
5cc48ed462 修复登录时uuid变化问题 2021-12-31 12:04:39 +08:00
lemon橪
2abc8ff9d8 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-uniapp 2021-12-29 09:23:06 +08:00
lemon橪
198bd6c322 修复楼层装修请求文章的接口路径 2021-12-29 09:23:05 +08:00
paulGao
7fb96f1eac 修复购物车全选显示不正确问题 2021-12-28 19:50:06 +08:00
paulGao
2020f55826 修复订单详情跳转商品页面错误 2021-12-27 18:45:39 +08:00
lemon橪
c58f8d7831 Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-uniapp 2021-12-25 10:55:27 +08:00
lemon橪
32a6bbacd0 购物车新增领劵判断,优化我的优惠券中可能出现的Bug 2021-12-25 10:55:25 +08:00
夜良king
b08c77b6c0 我的足迹里-全选的改动 2021-12-24 16:41:43 +08:00
lemon橪
a8836744f6 我的收藏布局修改 2021-12-24 16:22:03 +08:00
lemon橪
3a2202a2e8 修改部分已发现的bug 2021-12-24 09:12:21 +08:00
lemon橪
896749d812 修复购物车在更新最新后端代码的时候导致的bug 2021-12-23 18:36:00 +08:00
paulGao
09ec1e8c06 修复默认弹促销 2021-12-23 16:06:59 +08:00
paulGao
07627c41e3 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-uniapp 2021-12-21 19:12:20 +08:00
paulGao
e4e278c2fa 适配促销活动,修复促销问题 2021-12-21 19:12:04 +08:00
lemon橪
1b1b239ba0 合并冲突提交 2021-12-20 17:35:38 +08:00
lemon橪
c1d4d39265 udesk 技术储备 2021-12-20 17:34:45 +08:00
lemon橪
dfd3885486 储备udesk方案,暂时注释 2021-12-20 17:34:27 +08:00
paulGao
892f49c83a 适配重构促销 2021-12-15 18:17:33 +08:00
paulGao
85d0671443 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-uniapp 2021-12-13 19:33:21 +08:00
paulGao
f22e7b9fcb 适配重构促销 2021-12-13 19:31:48 +08:00
lemon橪
d282ef1b24 化楼层装修中商品分类判断 2021-12-13 17:17:02 +08:00
lemon橪
9c2529ae3d Merge branch 'master' of https://gitee.com/beijing_hongye_huicheng/lilishop-uniapp 2021-12-13 17:16:14 +08:00
lemon橪
108b7f5b0b 优化楼层装修中商品分类判断 2021-12-13 17:16:12 +08:00
paulGao
b4c8be3e63 Merge branch 'master' of gitee.com:beijing_hongye_huicheng/lilishop-uniapp 2021-12-13 02:26:08 +08:00
paulGao
4064c56b21 适配重构促销 2021-12-11 13:48:18 +08:00
lemon橪
1416762afe 优化楼层装修中商品分类代码可能会出现的bug 2021-12-09 18:32:01 +08:00
lemon橪
17f23fe920 砍价分享图片有误bug修改 2021-12-03 15:52:40 +08:00
lemon橪
c412c92b3e 新增取消售后 优化售后部分逻辑 2021-11-30 14:59:49 +08:00
lemon橪
deed875c1b 新增商品列表 2021-11-29 09:58:39 +08:00
lemon橪
f600b628ce 我的足迹样式优化 2021-11-22 15:25:42 +08:00
lemon橪
0c887a25e3 修改login中第三方循环判断 2021-11-22 11:18:00 +08:00
lemon橪
89dbd32351 修改商品详情中图片有空格问题 2021-11-19 15:49:42 +08:00
lemon橪
98c5863973 新增搜素样式判断优化,以及投诉图片上传内容条显示 2021-11-18 18:11:28 +08:00
173 changed files with 21315 additions and 7017 deletions

3
.gitignore vendored
View File

@@ -1,6 +1,7 @@
# OSX # OSX
# #
.DS_Store .DS_Store
node_modules/
#Intellij idea #Intellij idea
.idea/ .idea/
@@ -8,3 +9,5 @@
.vscode/ .vscode/
/unpackage/ /unpackage/
.hbuilderx/launch.json .hbuilderx/launch.json
.project.config.json
.project.private.config.json

434
App.vue
View File

@@ -1,221 +1,253 @@
<script> <script>
/** /**
* vuex管理登录状态具体可以参考官方登录模板示例 * vuex管理登录状态具体可以参考官方登录模板示例
*/ */
import { mapMutations } from "vuex"; import config from "@/config/config";
import {
getClipboardData
} from "@/js_sdk/h5-copy/h5-copy.js";
import APPUpdate from "@/plugins/APPUpdate"; import APPUpdate from "@/plugins/APPUpdate";
import { getClipboardData } from "@/js_sdk/h5-copy/h5-copy.js"; import storage from "@/utils/storage";
import config from "@/config/config"; import {
// 悬浮球 mapMutations
} from "vuex";
export default {
data() {
return { /**
config, * 路由监听并删除路由
}; * https://developers.weixin.qq.com/miniprogram/dev/api/route/wx.navigateTo.html
}, * */
// #ifdef MP-WEIXIN
wx.onAppRoute((res) => {
})
// #endif
/** export default {
* 监听返回 data() {
*/ return {
onBackPress(e) { config,
if (e.from == "backbutton") { };
let routes = getCurrentPages(); },
let curRoute = routes[routes.length - 1].options;
routes.forEach((item) => {
if (
item.route == "pages/tabbar/cart/cartList" ||
item.route.indexOf("pages/product/goods") != -1
) {
uni.redirectTo({
url: item.route,
});
}
});
if (curRoute.addId) {
uni.reLaunch({
url: "/pages/tabbar/cart/cartList",
});
} else {
uni.navigateBack();
}
return true; //阻止默认返回行为
}
},
methods: {
...mapMutations(["login"]),
},
onLaunch: function () {
// #ifdef APP-PLUS
this.checkArguments(); // 检测启动参数
APPUpdate();
// 重点是以下: 一定要监听后台恢复 !一定要 /**
plus.globalEvent.addEventListener("newintent", (e) => { * 监听返回
this.checkArguments(); // 检测启动参数 */
}); onBackPress(e) {
// #endif console.log("onBackPress-APP", e);
if (e.from == "backbutton") {
let routes = getCurrentPages();
let curRoute = routes[routes.length - 1].options;
routes.forEach((item) => {
if (
item.route == "pages/tabbar/cart/cartList" ||
item.route.indexOf("pages/product/goods") != -1
) {
uni.redirectTo({
url: item.route,
});
}
});
// #ifdef MP-WEIXIN if (curRoute.addId) {
this.applyUpdateWeChat(); uni.reLaunch({
// #endif url: "/pages/tabbar/cart/cartList",
}, });
} else {
uni.navigateBack();
}
return true; //阻止默认返回行为
}
},
methods: {
...mapMutations(["login"]),
},
onLaunch: function() {
// #ifdef APP-PLUS
this.checkArguments(); // 检测启动参数
APPUpdate();
onShow() { // 重点是以下: 一定要监听后台恢复 !一定要
// #ifndef H5 plus.globalEvent.addEventListener("newintent", (e) => {
this.getClipboard(); this.checkArguments(); // 检测启动参数
// #endif });
}, // #endif
methods: {
/**
* 微信小程序版本提交更新版本 解决缓存问题
*/
applyUpdateWeChat() {
const updateManager = uni.getUpdateManager();
updateManager.onCheckForUpdate(function (res) { // #ifdef MP-WEIXIN
// 请求完新版本信息的回调 this.applyUpdateWeChat();
}); // #endif
},
updateManager.onUpdateReady(function (res) { onShow() {
uni.showModal({ // #ifndef H5
title: "更新提示", if(this.config.enableGetClipboard){
content: "发现新版本,是否重启应用?", this.getClipboard();
success(res) { }
if (res.confirm) { // #endif
// 新的版本已经下载好,调用 applyUpdate 应用新版本并重启 // #ifdef APP-PLUS
updateManager.applyUpdate();
}
},
});
});
updateManager.onUpdateFailed(function (res) {
// 新的版本下载失败
});
},
// TODO 开屏广告 后续优化添加 if (storage.getShow()) {
launch() { if (uni.getSystemInfoSync().platform == 'ios') {
try { this.$u.route("/pages/tabbar/screen/fullScreen");
// 获取本地存储中launchFlag标识 开屏广告
const value = uni.getStorageSync("launchFlag");
if (!value) {
// this.$u.route("/pages/index/agreement");
} else {
//app启动时打开启动广告页
var w = plus.webview.open(
"/hybrid/html/advertise/advertise.html",
"本地地址",
{
top: 0,
bottom: 0,
zindex: 999,
},
"fade-in",
500
);
//设置定时器4s后关闭启动广告页
setTimeout(function () {
plus.webview.close(w);
APPUpdate();
}, 3000);
}
} catch (e) {
// error
uni.setStorage({
key: "launchFlag",
data: true,
success: function () {
console.log("error时存储launchFlag");
},
});
}
},
/** }
* 获取粘贴板数据 }
*/ // #endif
async getClipboard() { },
let res = await getClipboardData(); methods: {
/** /**
* 解析粘贴板数据 * 微信小程序版本提交更新版本 解决缓存问题
*/ */
if (res.indexOf(config.shareLink) != -1) { applyUpdateWeChat() {
uni.showModal({ const updateManager = uni.getUpdateManager();
title: "提示",
content: "检测到一个分享链接是否跳转?",
confirmText: "跳转",
success: function (callback) {
if (callback.confirm) {
const path = res.split(config.shareLink)[1];
if (path.indexOf("tabbar") != -1) {
uni.switchTab({
url: path,
});
} else {
uni.navigateTo({
url: path,
});
}
}
},
});
}
},
/** updateManager.onCheckForUpdate(function(res) {
* h5中打开app获取跳转app的链接并跳转 // 请求完新版本信息的回调
*/ });
checkArguments() {
// #ifdef APP-PLUS updateManager.onUpdateReady(function(res) {
setTimeout(() => { uni.showModal({
const args = plus.runtime.arguments; title: "更新提示",
if (args) { content: "发现新版本,是否重启应用?",
const argsStr = decodeURIComponent(args); success(res) {
const path = argsStr.split("//")[1]; if (res.confirm) {
if (path.indexOf("tabbar") != -1) { // 新的版本已经下载好,调用 applyUpdate 应用新版本并重启
uni.switchTab({ updateManager.applyUpdate();
url: `/${path}`, }
}); },
} else { });
uni.navigateTo({ });
url: `/${path}`, updateManager.onUpdateFailed(function(res) {
}); // 新的版本下载失败
} });
} },
});
// #endif // TODO 开屏广告 后续优化添加
}, launch() {
}, try {
}; // 获取本地存储中launchFlag标识 开屏广告
const value = uni.getStorageSync("launchFlag");
if (!value) {
// this.$u.route("/pages/index/agreement");
} else {
//app启动时打开启动广告页
var w = plus.webview.open(
"/hybrid/html/advertise/advertise.html",
"本地地址", {
top: 0,
bottom: 0,
zindex: 999,
},
"fade-in",
500
);
//设置定时器4s后关闭启动广告页
setTimeout(function() {
plus.webview.close(w);
APPUpdate();
}, 3000);
}
} catch (e) {
// error
uni.setStorage({
key: "launchFlag",
data: true,
success: function() {
console.log("error时存储launchFlag");
},
});
}
},
/**
* 获取粘贴板数据
*/
async getClipboard() {
let res = await getClipboardData();
/**
* 解析粘贴板数据
*/
if (res.indexOf(config.shareLink) != -1 && (res != this.$store.state.shareLink)) {
this.$store.state.shareLink = res
uni.showModal({
title: "提示",
content: "检测到一个分享链接是否跳转?",
confirmText: "跳转",
success: function(callback) {
if (callback.confirm) {
const path = res.split(config.shareLink)[1];
if (path.indexOf("tabbar") != -1) {
uni.switchTab({
url: path,
});
} else {
uni.navigateTo({
url: path,
});
}
}
},
});
}
},
/**
* h5中打开app获取跳转app的链接并跳转
*/
checkArguments() {
// #ifdef APP-PLUS
setTimeout(() => {
const args = plus.runtime.arguments;
if (args) {
const argsStr = decodeURIComponent(args);
const path = argsStr.split("//")[1];
if (path.indexOf("tabbar") != -1) {
uni.switchTab({
url: `/${path}`,
});
} else {
uni.navigateTo({
url: `/${path}`,
});
}
}
});
// #endif
},
},
};
</script> </script>
<style lang="scss"> <style lang="scss">
@import "uview-ui/index.scss"; @import "uview-ui/index.scss";
// -------适配底部安全区 苹果x系列刘海屏 // -------适配底部安全区 苹果x系列刘海屏
// #ifdef MP-WEIXIN // #ifdef MP-WEIXIN
.mp-iphonex-bottom { .mp-iphonex-bottom {
padding-bottom: constant(safe-area-inset-bottom); padding-bottom: constant(safe-area-inset-bottom);
padding-bottom: env(safe-area-inset-bottom); padding-bottom: env(safe-area-inset-bottom);
box-sizing: content-box; box-sizing: content-box;
height: auto !important; height: auto !important;
padding-top: 10rpx; padding-top: 10rpx;
} }
// #endif
body { // #endif
background-color: $bg-color;
} body {
/************************ */ background-color: $bg-color;
.w200 { }
width: 200rpx !important;
} /************************ */
.flex1 { .w200 {
flex: 1; //必须父级设置flex width: 200rpx !important;
} }
.flex1 {
flex: 1; //必须父级设置flex
}
</style> </style>

View File

@@ -1 +0,0 @@
qSyvBPhDsPdxvOhC

373
README.md
View File

@@ -1,218 +1,217 @@
## 🔥 Lilishop B2B2C商城系统 ## Lilishop B2B2C 商城系统
##### 🌹 开源不易如有帮助请点Star ### 商城介绍
#### 欢迎交流需求,交流业务,交流技术(基础问题自行解决,进群先看文档后提问)
##### 交流 qq 1群 961316482已满
##### 交流 qq 2群 875294241
##### 商城 公众号/小程序体验,扫描二维码
![image-20210511171611793](https://pickmall.cn/assets/imgs/h5-qrcode.png)
[![star](https://gitee.com/beijing_hongye_huicheng/lilishop/badge/star.svg?theme=dark)](https://gitee.com/beijing_hongye_huicheng/lilishop/stargazers)
&nbsp;&nbsp;![github](https://img.shields.io/github/stars/hongyehuicheng/lilishop.svg?style=social&logo=#181717)
### 🔥 商城介绍
**官网**https://pickmall.cn **官网**https://pickmall.cn
Lilishop 商城系统 基于SpringBoot 研发B2B2C多用户商城系统前端使用 Vue、uniapp开发 **系统全端全部代码开源** **更多 README**https://gitee.com/beijing_hongye_huicheng/lilishop/blob/master/README.md
业务兼容O2O商城/B2B商城/B2B2C商城/F2B2C商城/S2B2C商城。支持小程序商城、H5商城、APP商城、 PC商城。 **演示站点**https://m-b2b2c.pickmall.cn/ 账号13011111111 验证码111111
**商城 小程序/公众号/APP**:扫描二维码
商城前后端分离、支持分布式部署。 ![image-20210511171611793](https://static.pickmall.cn/images/h5-qrcode.png)
商城包含 会员模块、**第三方登录模块**、**第三方支付模块**、**楼层装修模块**、订单模块、分销模块、文章模块、系统设置模块、流量分析模块 ## lilishop-uniapp如何在本地h5和微信小程序中运行
https://www.bilibili.com/video/BV17K8EemEh2/
商城包含各种中间件、搜索引擎、多级缓存、分布式事务、分布式任务调度等支持Docker支持k8s。是一款高性能支持高并发的商城系统。 ## lilishop-uniapp如何打包h5到服务器
https://www.bilibili.com/video/BV1CX87exE64/
##### 商城 API/消费者 聚合版 ### 快速开始
api不需要单独部署只需启动一个jar包就可以正常运转 如有需要可以点击跳转https://gitee.com/beijing_hongye_huicheng/lilishop-simplify
### ☃️ 商城 开发/使用/常见问题 帮助文档 #### 阅读文档
https://docs.pickmall.cn `uni-app` https://uniapp.dcloud.net.cn/api/
### 💧 开源商城项目地址(gitee) `vue2` https://v2.cn.vuejs.org/
**API商城所有API**https://gitee.com/beijing_hongye_huicheng/lilishop.git `uView v1` https://v1.uviewui.com/
**UI商城管理端/商家端/买家PC端** https://gitee.com/beijing_hongye_huicheng/lilishop-ui.git #### 环境
**uniapp商城移动端支持小程序/APP/H5**https://gitee.com/beijing_hongye_huicheng/lilishop-uniapp.git 在开发之前保证本地安装了以下软件
`hbulider` https://www.dcloud.io/hbuilderx.html
**docker一键部署商城部署脚本**https://gitee.com/beijing_hongye_huicheng/docker.git ### 技术栈
### 💧 开源商城项目地址(github) 本项目技术栈为 `uni-app` + `scss` + `ES2015` + `uView` 提前学习和了解这些知识将帮助你更好地上手我们的项目。
**API商城所有API**https://github.com/hongyehuicheng/lilishop.git ### 安装
**UI商城管理端/商家端/买家PC端** https://github.com/hongyehuicheng/lilishop-ui.git 1. 克隆项目到本地
**uniapp商城移动端支持小程序/APP/H5**https://github.com/hongyehuicheng/lilishop-uniapp.git ```shell
git clone https://gitee.com/beijing_hongye_huicheng/lilishop-uniapp.git
**docker一键部署商城部署脚本**https://github.com/hongyehuicheng/docker.git
☃️ UI 项目下3个文件夹 buyer买家PC端seller商家端manager后台管理端
### 💧 演示地址(手机验证码为 111111)
**商城管理端**https://admin-b2b2c.pickmall.cn 账号admin/123456
**商城店铺后台**https://store-b2b2c.pickmall.cn 账号13011111111/111111
**商城PC页面**https://pc-b2b2c.pickmall.cn
**商城移动端(请使浏览器手机模式,或者用手机浏览器打开)**https://m-b2b2c.pickmall.cn
**小程序/公众号**:扫描二维码
![image-20210511171611793](https://pickmall.cn/assets/imgs/h5-qrcode.png)
### 🚙 3行命令搭建本地商城只能本机访问如需调整请自行操作镜像
温馨提示由于服务中间件较多如果笔记本环境启动内存没有32g可能无法启动成功macbookpro 2020 16g内存启动无法成功台式机在16g内存、AMD 3700x 的ubuntu系统成功运行。
##### docker环境安装 [点击跳转](https://docs.pickmall.cn/deploy/%E8%BF%90%E8%A1%8C%E7%8E%AF%E5%A2%83%E5%87%86%E5%A4%87.html)
##### 下载docker-compose脚本
`git clone https://gitee.com/beijing_hongye_huicheng/docker.git `
##### 部署商城所需中间件
`docker-compose up -d`
##### 部署商城应用
`docker-compose -f docker-compose-application.yml up -d`
PS:商城数据库单独部署 https://gitee.com/beijing_hongye_huicheng/docker/tree/master/init/mysql 这里有与tag版本一致的sql根据tag获取sql如果使用master代码则需要在lilishop项目根目录的DB目录中获取对应的升级sql。
##### 商城 API/UI 地址
| API | 地址 |
| -------------- | --------------- |
| 商城买家API | http://127.0.0.1:8888 |
| 商城商家API | http://127.0.0.1:8889 |
| 商城管理端API | http://127.0.0.1:8887 |
| 商城基础API | http://127.0.0.1:8890 |
| 前端演示 | 地址 |
| -------------- | --------------- |
| 商城PC端 | http://127.0.0.1:10000 |
| 商城WAP端 | http://127.0.0.1:10001 |
| 商城卖家端 | http://127.0.0.1:10002 |
| 商城管理端 | http://127.0.0.1:10003 |
### ⚾️ 功能列表
#### 🥎 商城平台功能
![平台功能](https://pickmall.cn/assets/imgs/other/managerList.jpg)
#### 🥎 商城卖家功能
![商家端功能](https://pickmall.cn/assets/imgs/other/storeList.jpg)
### 🧩 商城前端功能展示
#### ⚽️ 商城移动端
<img src="https://pickmall.cn/assets/imgs/other/app.gif" alt="移动端功能展示" style="zoom:50%;" />
#### ⚽️ 商城管理端
![管理端功能展示](https://pickmall.cn/assets/imgs/other/manager.gif)
### 商城技术选型
#### 🥅 架构图
![架构](https://lili-system.oss-cn-beijing.aliyuncs.com/docs/%E6%9E%B6%E6%9E%84.png)
##### 🕹 后台技术选型
| 说明 | 框架 | 说明 | |
| -------------- | --------------- | -------------- | ------------- |
| 基础框架 | Spring Boot | MVC框架 | Spring MVC |
| 持久框架 | Mybatis-Plus | 程序构建 | Maven |
| 关系型数据库 | MySQL | 消息中间件AMQP | RocketMQ |
| 缓存 | Redis +MongoDB | 搜索引擎 | Elasticsearch |
| 安全框架 | Spring Security | 数据库连接池 | Druid |
| 数据库分库分表 | sharding | 定时任务 | xxl-job |
| 负载均衡 | Nginx | 静态资源 | 阿里云OSS |
| 短信 | 阿里云短信 | 认证 | JWT |
| 日志处理 | Log4j | 接口规范 | RESTful |
##### 🖥 前端-运营后台、店铺后台
| 说明 | 框架 | 说明 | 框架 |
| ---------- | ---------- | ---------- | ------- |
| 构建工具 | webpack | JS版本 | ES6 |
| 基础JS框架 | Vue.js | 视频播放器 | Dplayer |
| 路由管理 | Vue Router | 状态管理 | Vuex |
| 基础UI库 | iView | UI界面基于 | iView |
| 网络请求 | axios | | |
##### 📱前端-移动端
| 说明 | 架构 | 说明 | 架构 |
| --------- | ------- | -------- | ------- |
| 基础UI库 | uViewui | 基础框架 | uni-app |
| CSS预处理 | scss | 地图引擎 | amap |
### 🌟 版本升级
```
商城后续会持续版本升级修复bug完善功能覆盖更多业务场景 o2o/b2b/s2b2b2c/跨境电商
后续会考虑推出微服务商城系统/商城中台等
``` ```
2.`hbulider`中打开项目
### ⚠️ 开源须知 ```shell
1.仅允许用于个人学习研究使用. 直接将项目拖进hbulider中点击运行即可
```
2.禁止将本开源的代码和资源进行任何形式任何名义的出售. ### 目录结构
3.软件受国家计算机软件著作权保护登记号2021SR0805085 ```
├── api // 接口
├── components // 组件
├── config // 配置文件
├── CustomStartPage // 打包配置的开屏页
├── CustomStoryboard // ios自定义storyboard启动页
├── hybrid // 广告配置页
├── js_sdk // 封装的js_sdk
├── lib // 封装的部分方法
├── pages // 页面
├── plugins // 插件
├── static // 静态资源
├── store // vuex
├── utils // 工具类
├── uview-ui // uview
├── App.vue // 入口页面
├── main.js // 入口文件
├── manifest.json // hbulider配置文件
├── pages.json // 路由配置文件
├── uni.scss // 全局样式
└── vue.config.js // vue配置文件
```
4.限制商用如果需要商业使用请联系我们。QQ3409056806. ### 运行
#### 运行在 h5
`hbulider`中点击`运行`->`运行到浏览器`->`选择自己的浏览器九号`
#### 运行在微信小程序
1.需要保证本地要有`微信开发者工具` https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html
2.在`hbulider`中点击`运行`->`运行到小程序模拟器`->`微信开发者工具` 运行的时候需要配置小程序的`appid`,配置完成后即可运行
#### 运行 APP
##### 运行在安卓
`hbulider`中点击`运行`->`运行到手机或模拟器`->`选择运行到安卓APP基座`
##### 运行在 IOS
`hbulider`中点击`运行`->`运行到手机或模拟器`->`选择运行到IOS基座`
### 🐧 交流群
##### 官方qq 1群 961316482已满
##### 官方qq 2群 875294241 ### 项目配置/开发
#### config配置
在根目录`config`下的`config`设置中配置了一些默认的配置,可以根据自己的需求进行修改
```
const name = "lilishop"; //全局商城name
const schemeName = "lilishop"; //唤醒app需要的schemeName
export default {
name: name,
schemeLink: `${schemeName}://`, //唤起app地址
downloadLink: "https://pickmall.cn/download-page/index.html", //下载地址下载app的地址
shareLink: "https://m-b2b2c.pickmall.cn", //分享地址也就是在h5中默认的复制地址
appid: "", //小程序唯一凭证,即 AppID可在「微信公众平台 - 设置 - 开发设置」页中获得。(需要已经成为开发者,且帐号没有异常状态)
aMapKey: "", //在高德中申请Web服务key
scanAuthNavigation: ["https://m-b2b2c.pickmall.cn/"], //扫码认证跳转域名配置 会根据此处配置的路由进行跳转
iosAppId: "id1564638363", //AppStore的应用地址id 具体在分享->拷贝链接中查看
logo: "https://lilishop-oss.oss-cn-beijing.aliyuncs.com/4c864e133c2944efad1f7282ac8a3b9e.png", //logo地址
customerServiceMobile: "13161366885", //客服电话
customerServiceEmail: "lili@lili.com", //客服邮箱
imWebSrc: "https://im.pickmall.cn", //IM地址
baseWsUrl: "wss://im-api.pickmall.cn/lili/webSocket", // IM WS 地址
enableGetClipboard: false, //是否启用粘贴板获取 scanAuthNavigation 中的链接,如果匹配则会跳转到对应页面
enableMiniBarStartUpApp: true, //是否在h5中右侧浮空按钮点击启动app
/**
* 如需更换主题请修改此处以及uni.scss中的全局颜色
*/
mainColor: "#ff3c2a", // 主题色
lightColor: "#ff6b35", // 高亮主题色
aiderLightColor: "#ff9f28", // 辅助高亮颜色
defaultUserPhoto: "/static/missing-face.png", // 默认用户头像
enableFetchMobileLogin: false // 是否启用获取手机号登录 如果微信小程序提示封禁手机号获取权限 可将此选项设置成false作为备用登录方案
};
```
#### 组件
在根目录`components`下的`components`设置中配置了一些默认的组件可以根据自己的需求进行修改或阅读组件详情代码以及README.md文档
#### 页面
`pages`文件夹写入或修改页面代码,在`pages.json`中去配置页面路由,具体配置可以参考`pages.json` 或参考uni-app的文档
在微信小程序中默认启用分包操作,如果需要在微信小程序中使用分包,需要在`pages.json`中配置分包路径,具体配置可以参考`pages.json` 或参考uni-app的文档
#### 主题
1.现在`config`中设置主题色
2.在`uni.scss`中设置全局颜色
3.替换项目中一些icon以及图片的颜色
### 常见问题
#### 微信小程序移动端启动报错
小程序直播插件报错,在`manifest`中删除代码。
![启动报错](https://docs.pickmall.cn/configure/images/live.png)
#### 微信小程序上传文件过大超出 2MB
1.关闭微信小程序,停止微信小程序运行
2.重新点击运行小程序模拟器,在最下方有一个 `运行时是否压缩代码` 勾选并重新运行
3.如果还是提示超出2MB重新执行1步骤然后点击`发行`->`小程序`即可
4.以上1-3步骤都不行可以尝试删除一些自己开发的代码或本地的静态资源图片
#### 微信小程序在开发者工具中可以使用接口在测试版却不行
1.首先保证是否填写`request`合法域名 在微信小程序后台配置
2.需保证接口为https请求
request合法域名基础配置如下
```
https://buyer-api.pickmall.cn
https://common-api.pickmall.cn
https://im-api.pickmall.cn
https://restapi.amap.com
```
socket合法域名
```
wss://im-api.pickmall.cn
```
uploadFile合法域名
```
https://common-api.pickmall.cn
```
downloadFile合法域名
```
https://buyer-api.pickmall.cn
https://common-api.pickmall.cn
https://im-api.pickmall.cn
https://lilishop-oss.oss-cn-beijing.aliyuncs.com
```
#### 如何配置API
在根目录 `config` -> `api` 中配置开发环境以及生产环境 api 接口地址
#### 运行报错
初次运行时候可能因为本地环境缺少编译插件,这个时候一定要注意看报错信息,根据报错信息安装相应的插件即可
#### 如何配置微信小程序appid
在根目录 `manifest.json` 中配置微信小程序appid
#### 微信登录报错
需检查appId是否配置正确在后台管理中信任登录的`appId`以及`appSecret`是否配置正确

17
androidPrivacy.json Normal file
View File

@@ -0,0 +1,17 @@
{
"version" : "1",
"prompt" : "template",
"title" : "服务协议和隐私政策",
"message" : "  请你务必审慎阅读、充分理解“服务协议”和“隐私政策”各条款,包括但不限于:为了更好的向你提供服务,我们需要收集你的设备标识、操作日志等信息用于分析、优化应用性能。<br/>  你可阅读<a href=\"https://pc-b2b2c.pickmall.cn/article/detail?id=1371992704333905920\">《服务协议》</a>和<a href=\"https://pc-b2b2c.pickmall.cn/article/detail?id=1371779927900160000\">《隐私政策》</a>了解详细信息。如果你同意,请点击下面按钮开始接受我们的服务。",
"buttonAccept" : "同意并接受",
"buttonRefuse" : "暂不同意",
"second" : {
"title" : "确认提示",
"message" : "  进入应用前,你需先同意<a href=\"https://pc-b2b2c.pickmall.cn/article/detail?id=1371992704333905920\">《服务协议》</a>和<a href=\"https://pc-b2b2c.pickmall.cn/article/detail?id=1371779927900160000\">《隐私政策》</a>,否则将退出应用。",
"buttonAccept" : "同意并继续",
"buttonRefuse" : "退出应用"
},
"styles" : {
"borderRadius" : "5px"
}
}

View File

@@ -12,7 +12,7 @@ import api from "@/config/api.js";
*/ */
export function getAddressList(pageNumber, pageSize) { export function getAddressList(pageNumber, pageSize) {
return http.request({ return http.request({
url: "/memberAddress", url: "/member/address",
method: Method.GET, method: Method.GET,
needToken: true, needToken: true,
params: { pageNumber, pageSize }, params: { pageNumber, pageSize },
@@ -25,7 +25,7 @@ export function getAddressList(pageNumber, pageSize) {
*/ */
export function getLogistics() { export function getLogistics() {
return http.request({ return http.request({
url: "/logistics", url: "/other/logistics",
method: Method.GET, method: Method.GET,
needToken: true, needToken: true,
params: { pageNumber: 1, pageSize: 200, disabled: "OPEN" }, params: { pageNumber: 1, pageSize: 200, disabled: "OPEN" },
@@ -37,7 +37,7 @@ export function getLogistics() {
*/ */
export function getAddressCode(cityCode, townName) { export function getAddressCode(cityCode, townName) {
return http.request({ return http.request({
url: api.common + "/region/region", url: api.common + "/common/region/region",
method: Method.GET, method: Method.GET,
needToken: true, needToken: true,
params: { cityCode, townName }, params: { cityCode, townName },
@@ -51,7 +51,7 @@ export function getAddressCode(cityCode, townName) {
*/ */
export function addAddress(data) { export function addAddress(data) {
return http.request({ return http.request({
url: "/memberAddress", url: "/member/address",
method: Method.POST, method: Method.POST,
needToken: true, needToken: true,
header: { "content-type": "application/x-www-form-urlencoded" }, header: { "content-type": "application/x-www-form-urlencoded" },
@@ -67,7 +67,7 @@ export function addAddress(data) {
*/ */
export function editAddress(params) { export function editAddress(params) {
return http.request({ return http.request({
url: `/memberAddress`, url: `/member/address`,
method: Method.PUT, method: Method.PUT,
needToken: true, needToken: true,
header: { "content-type": "application/x-www-form-urlencoded" }, header: { "content-type": "application/x-www-form-urlencoded" },
@@ -81,7 +81,7 @@ export function editAddress(params) {
*/ */
export function deleteAddress(id) { export function deleteAddress(id) {
return http.request({ return http.request({
url: `/memberAddress/delById/${id}`, url: `/member/address/delById/${id}`,
method: Method.DELETE, method: Method.DELETE,
needToken: true, needToken: true,
}); });
@@ -95,7 +95,7 @@ export function deleteAddress(id) {
*/ */
export function getAddressDetail(id) { export function getAddressDetail(id) {
return http.request({ return http.request({
url: `/memberAddress/get/${id}`, url: `/member/address/get/${id}`,
method: Method.GET, method: Method.GET,
loading: false, loading: false,
needToken: true, needToken: true,
@@ -107,7 +107,7 @@ export function getAddressDetail(id) {
*/ */
export function getAddressDefault() { export function getAddressDefault() {
return http.request({ return http.request({
url: `/memberAddress/get/default`, url: `/member/address/get/default`,
method: Method.GET, method: Method.GET,
loading: false, loading: false,
needToken: true, needToken: true,

View File

@@ -34,16 +34,29 @@ export function applyCancelOrder(params) {
}); });
} }
/**
/** /**
* 获取商家售后收件地址 * 获取商家售后收件地址
*/ */
export function getstoreAfterSaleAddress(sn) { export function getStoreAfterSaleAddress(sn) {
return http.request({ return http.request({
url: `/afterSale/getStoreAfterSaleAddress/${sn}`, url: `/order/afterSale/getStoreAfterSaleAddress/${sn}`,
method: Method.GET, method: Method.GET,
needToken: true, needToken: true,
}); });
} }
/**
* 取消售后
*/
export function cancelAfterSale(afterSaleSn) {
return http.request({
url: `/order/afterSale/cancel/${afterSaleSn}`,
method: Method.POST,
needToken: true,
});
}
/** /**
* 获取售后服务记录相关数据 * 获取售后服务记录相关数据
@@ -51,7 +64,7 @@ export function getstoreAfterSaleAddress(sn) {
*/ */
export function getAfterSaleList(params) { export function getAfterSaleList(params) {
return http.request({ return http.request({
url: `/afterSale/page`, url: `/order/afterSale/page`,
method: Method.GET, method: Method.GET,
needToken: true, needToken: true,
params, params,
@@ -64,7 +77,7 @@ export function getAfterSaleList(params) {
*/ */
export function getServiceDetail(sn) { export function getServiceDetail(sn) {
return http.request({ return http.request({
url: `/afterSale/get/${sn}`, url: `/order/afterSale/get/${sn}`,
method: Method.GET, method: Method.GET,
needToken: true, needToken: true,
}); });
@@ -76,7 +89,7 @@ export function getServiceDetail(sn) {
*/ */
export function addComplain(params) { export function addComplain(params) {
return http.request({ return http.request({
url: `/complain`, url: `/order/complain`,
method: Method.POST, method: Method.POST,
needToken: true, needToken: true,
header: { header: {
@@ -91,7 +104,7 @@ export function addComplain(params) {
*/ */
export function clearComplain(id, params) { export function clearComplain(id, params) {
return http.request({ return http.request({
url: `/complain/status/${id}`, url: `/order/complain/status/${id}`,
method: Method.PUT, method: Method.PUT,
needToken: true, needToken: true,
params, params,
@@ -103,7 +116,7 @@ export function clearComplain(id, params) {
*/ */
export function getAfterSaleLog(sn) { export function getAfterSaleLog(sn) {
return http.request({ return http.request({
url: `/afterSale/get/getAfterSaleLog/${sn}`, url: `/order/afterSale/get/getAfterSaleLog/${sn}`,
method: Method.GET, method: Method.GET,
needToken: true, needToken: true,
}); });
@@ -114,7 +127,7 @@ export function getAfterSaleLog(sn) {
*/ */
export function getComplain(params) { export function getComplain(params) {
return http.request({ return http.request({
url: `/complain`, url: `/order/complain`,
method: Method.GET, method: Method.GET,
needToken: true, needToken: true,
params, params,
@@ -126,7 +139,7 @@ export function getComplain(params) {
*/ */
export function getAfterSaleReason(serviceType) { export function getAfterSaleReason(serviceType) {
return http.request({ return http.request({
url: `/afterSale/get/afterSaleReason/${serviceType}`, url: `/order/afterSale/get/afterSaleReason/${serviceType}`,
method: Method.GET, method: Method.GET,
needToken: true, needToken: true,
}); });
@@ -137,7 +150,7 @@ export function getAfterSaleReason(serviceType) {
*/ */
export function getClearReason() { export function getClearReason() {
return http.request({ return http.request({
url: `/afterSale/get/afterSaleReason/CANCEL`, url: `/order/afterSale/get/afterSaleReason/CANCEL`,
method: Method.GET, method: Method.GET,
needToken: true, needToken: true,
}); });
@@ -148,7 +161,7 @@ export function getClearReason() {
*/ */
export function getComplainReason() { export function getComplainReason() {
return http.request({ return http.request({
url: `/afterSale/get/afterSaleReason/COMPLAIN`, url: `/order/afterSale/get/afterSaleReason/COMPLAIN`,
method: Method.GET, method: Method.GET,
needToken: true, needToken: true,
}); });
@@ -158,7 +171,7 @@ export function getComplainReason() {
*/ */
export function getComplainDetail(id) { export function getComplainDetail(id) {
return http.request({ return http.request({
url: `/complain/${id}`, url: `/order/complain/${id}`,
method: Method.GET, method: Method.GET,
needToken: true, needToken: true,
}); });
@@ -169,7 +182,7 @@ export function getComplainDetail(id) {
*/ */
export function getAfterSaleInfo(sn) { export function getAfterSaleInfo(sn) {
return http.request({ return http.request({
url: `/afterSale/applyAfterSaleInfo/${sn}`, url: `/order/afterSale/applyAfterSaleInfo/${sn}`,
method: Method.GET, method: Method.GET,
needToken: true, needToken: true,
}); });
@@ -181,7 +194,7 @@ export function getAfterSaleInfo(sn) {
*/ */
export function applyReturn(orderItemSn, params) { export function applyReturn(orderItemSn, params) {
return http.request({ return http.request({
url: `/afterSale/save/${orderItemSn}`, url: `/order/afterSale/save/${orderItemSn}`,
method: Method.POST, method: Method.POST,
header: { header: {
"Content-Type": "application/x-www-form-urlencoded", "Content-Type": "application/x-www-form-urlencoded",
@@ -197,7 +210,7 @@ export function applyReturn(orderItemSn, params) {
*/ */
export function fillShipInfo(afterSaleSn, params) { export function fillShipInfo(afterSaleSn, params) {
return http.request({ return http.request({
url: `/afterSale/delivery/${afterSaleSn}`, url: `/order/afterSale/delivery/${afterSaleSn}`,
method: Method.POST, method: Method.POST,
header: { header: {
"Content-Type": "application/x-www-form-urlencoded", "Content-Type": "application/x-www-form-urlencoded",
@@ -205,3 +218,13 @@ export function fillShipInfo(afterSaleSn, params) {
data: params, data: params,
}); });
} }
// 添加交易投诉对话
export function communication(params) {
return http.request({
url: `/order/complain/communication`,
method: Method.POST,
needToken: true,
params
});
}

View File

@@ -23,8 +23,21 @@ export function getArticleCategory(category_type) {
*/ */
export function getArticleDetail(type) { export function getArticleDetail(type) {
return http.request({ return http.request({
url: `/article/type/${type}`, url: `/other/article/get/${type}`,
method: Method.GET, method: Method.GET,
}); });
} }
/**
* 获取文章详情
* @param type
*/
export function getArticleDetailByType(type) {
return http.request({
url: `/other/article/type/${type}`,
method: Method.GET,
});
}

View File

@@ -1,26 +1,32 @@
/** /**
* 公共API * 公共API
*/ */
import {http, Method} from '@/utils/request.js'; import { http, Method } from "@/utils/request.js";
import api from '@/config/api.js'; import api from "@/config/api.js";
/**
* 获取地区数据
/** * @param id
* 获取地区数据 */
* @param id export function getRegionsById(id = 0) {
*/ return http.request({
export function getRegionsById(id = 0) { url: `${api.common}/common/region/item/${id}`,
return http.request({ method: Method.GET,
url: `${api.common}/region/item/${id}`, message: false,
method: Method.GET, });
message: false, }
});
} // 获取IM接口前缀
export function getIMDetail() {
/** return http.request({
* 文件上传地址 url: `${api.common}/IM`,
* @type {string} method: Method.GET,
*/ message: false,
export const upload =api.common+'/upload/file'; });
}
/**
* 文件上传地址
* @type {string}
*/
export const upload = api.common + "/common/upload/file";

View File

@@ -15,7 +15,7 @@ const request = http.request;
*/ */
export function webConnect(code) { export function webConnect(code) {
return http.request({ return http.request({
url: `connect/login/web/${code}`, url: `passport/connect/connect/login/web/${code}`,
method: Method.GET, method: Method.GET,
needToken: true, needToken: true,
header: { header: {
@@ -25,8 +25,8 @@ export function webConnect(code) {
} }
export function openIdLogin(params, clientType) { export function openIdLogin(params, clientType) {
return http.request({ return http.request({
url: `connect/app/login`, url: `passport/connect/connect/app/login`,
method: Method.GET, method: Method.POST,
needToken: true, needToken: true,
data: params, data: params,
header: { header: {
@@ -40,7 +40,7 @@ export function openIdLogin(params, clientType) {
*/ */
export function loginCallback(state) { export function loginCallback(state) {
return http.request({ return http.request({
url: `connect/result?state=${state}`, url: `passport/connect/connect/result?state=${state}`,
method: Method.GET, method: Method.GET,
needToken: false needToken: false
}); });
@@ -54,7 +54,7 @@ export function loginCallback(state) {
*/ */
export function mpAutoLogin(params) { export function mpAutoLogin(params) {
return http.request({ return http.request({
url: 'mini-program/auto-login', url: 'passport/connect/miniProgram/auto-login',
method: Method.GET, method: Method.GET,
params params
}); });

41
api/entry.js Normal file
View File

@@ -0,0 +1,41 @@
/**
* 入驻类相关api
*/
import { http, Method } from "@/utils/request.js";
// 获取当前用户的代理入驻详情
export function getCompanyDetail(params) {
return http.request({
url: "/store/store/apply",
method: Method.GET,
params,
});
}
// 申请店铺第一步-填写企业信息
export function applyFirst(params) {
return http.request({
url: "/store/store/apply/first",
method: Method.PUT,
params,
});
}
// 申请店铺第二步-填写银行
export function applySecond(params) {
return http.request({
url: "/store/store/apply/second",
method: Method.PUT,
params,
});
}
// 申请店铺第三步-填写银行
export function applyThird(params) {
return http.request({
url: "/store/store/apply/third",
method: Method.PUT,
params,
});
}

View File

@@ -9,7 +9,7 @@ import { http, Method } from "@/utils/request.js";
*/ */
export function getGoodsMessage(goodsId) { export function getGoodsMessage(goodsId) {
return http.request({ return http.request({
url: `/goods/get/${goodsId}`, url: `/goods/goods/get/${goodsId}`,
method: Method.GET, method: Method.GET,
}); });
} }
@@ -19,7 +19,7 @@ import { http, Method } from "@/utils/request.js";
*/ */
export function getGoodsRelated(params) { export function getGoodsRelated(params) {
return http.request({ return http.request({
url: `/goods/es/related`, url: `/goods/goods/es/related`,
method: Method.GET, method: Method.GET,
params, params,
}); });
@@ -32,7 +32,7 @@ export function getGoodsRelated(params) {
*/ */
export function getGoods(skuId, goodsId) { export function getGoods(skuId, goodsId) {
return http.request({ return http.request({
url: `/goods/sku/${goodsId}/${skuId}`, url: `/goods/goods/sku/${goodsId}/${skuId}`,
method: Method.GET, method: Method.GET,
}); });
} }
@@ -43,7 +43,7 @@ export function getGoodsRelated(params) {
*/ */
export function getGoodsDistribution(distributionId) { export function getGoodsDistribution(distributionId) {
return http.request({ return http.request({
url: `/distribution/bindingDistribution/${distributionId}`, url: `/distribution/distribution/bindingDistribution/${distributionId}`,
method: Method.GET, method: Method.GET,
}); });
} }
@@ -56,7 +56,7 @@ export function getGoodsRelated(params) {
*/ */
export function getGoodsList(params) { export function getGoodsList(params) {
return http.request({ return http.request({
url: "/goods/es", url: "/goods/goods/es",
method: Method.GET, method: Method.GET,
params, params,
}); });
@@ -112,7 +112,7 @@ export function getPlateformTagGoods(tag_id) {
*/ */
export function getCategoryList(id) { export function getCategoryList(id) {
return http.request({ return http.request({
url: `/category/get/${id}`, url: `/goods/category/get/${id}`,
method: Method.GET, method: Method.GET,
loading: false, loading: false,
}); });
@@ -126,7 +126,7 @@ export function getCategoryList(id) {
*/ */
export function distribution() { export function distribution() {
return http.request({ return http.request({
url: `/distribution`, url: `/distribution/distribution`,
method: Method.GET, method: Method.GET,
}); });
} }
@@ -136,7 +136,7 @@ export function distribution() {
*/ */
export function applyDistribution(params) { export function applyDistribution(params) {
return http.request({ return http.request({
url: `/distribution`, url: `/distribution/distribution`,
method: Method.POST, method: Method.POST,
params, params,
}); });
@@ -170,7 +170,7 @@ export function cashLog(params) {
*/ */
export function distributionOrderList(params) { export function distributionOrderList(params) {
return http.request({ return http.request({
url: `/distribution/distributionOrder`, url: `/distribution/distribution/distributionOrder`,
method: Method.GET, method: Method.GET,
params params
}); });
@@ -181,7 +181,7 @@ export function distributionOrderList(params) {
*/ */
export function distributionGoods(params) { export function distributionGoods(params) {
return http.request({ return http.request({
url: `/distributionGoods`, url: `/distribution/goods`,
method: Method.GET, method: Method.GET,
params, params,
}); });
@@ -191,7 +191,7 @@ export function distributionGoods(params) {
*/ */
export function checkedDistributionGoods(params) { export function checkedDistributionGoods(params) {
return http.request({ return http.request({
url: `/distributionGoods/checked/${params.id}`, url: `/distribution/goods/checked/${params.id}`,
method: Method.GET, method: Method.GET,
params params
}); });
@@ -202,7 +202,7 @@ export function checkedDistributionGoods(params) {
*/ */
export function getMpCode(params){ export function getMpCode(params){
return http.request({ return http.request({
url:`/mini-program/mp/unlimited`, url:`/passport/connect/miniProgram/mp/unlimited`,
method:Method.GET, method:Method.GET,
params params
}) })
@@ -213,7 +213,7 @@ export function checkedDistributionGoods(params) {
*/ */
export function getMpScene(id){ export function getMpScene(id){
return http.request({ return http.request({
url:`/mini-program/mp/unlimited/scene?id=${id}`, url:`/passport/connect/miniProgram/mp/unlimited/scene?id=${id}`,
method:Method.GET, method:Method.GET,
}) })

View File

@@ -1,6 +1,21 @@
import { http, Method } from "@/utils/request.js"; import { http, Method } from "@/utils/request.js";
export function toSpecial(data) {
return http.request({
url: `/other/pageData/getSpecial`,
method: Method.GET,
data
});
}
/**
* 专题内容
*/
export function getSpecial(id) {
return http.request({
url: `/other/pageData/get/${id}`,
method: Method.GET,
});
}
/** /**
* 获取广告图 * 获取广告图
@@ -32,7 +47,7 @@ export function getCategory(parent_id = 0) {
*/ */
export function getHotKeywords(count) { export function getHotKeywords(count) {
return http.request({ return http.request({
url: "/goods/hot-words", url: "/goods/goods/hot-words",
method: Method.GET, method: Method.GET,
loading: false, loading: false,
params: { count }, params: { count },
@@ -44,10 +59,22 @@ export function getHotKeywords(count) {
* @param client_type * @param client_type
* @param page_type * @param page_type
*/ */
export function getFloorData() { export function getFloorData(params) {
return http.request({ return http.request({
url: `/pageData/getIndex?clientType=H5`, url: `/other/pageData/getIndex?clientType=H5`,
method: "get", method: "get",
params
});
}
/**
* 获取店铺楼层数据
*/
export function getFloorStoreData(params) {
return http.request({
url: `/other/pageData?pageClientType=H5`,
method: "get",
params
}); });
} }
@@ -56,7 +83,7 @@ export function getFloorData() {
*/ */
export function getCategoryIndexData(parentId = 0) { export function getCategoryIndexData(parentId = 0) {
return http.request({ return http.request({
url: `/category/get/${parentId}`, url: `/goods/category/get/${parentId}`,
method: "get", method: "get",
}); });
} }

93
api/im.js Normal file
View File

@@ -0,0 +1,93 @@
import { http,Method } from "@/utils/request.js";
import api from "@/config/api.js";
export function getImSetting() {
return http.request({
url: `/other/setting/get/IM_SETTING`,
method: Method.GET,
needToken: true,
});
}
/**
* 获取聊天详情接口
* @param {*} talkId
* @returns
*/
export function getTalk(talkId) {
return http.request({
url: `${api.im}/talk/${talkId}`,
method: Method.GET,
});
}
/**
* 获取与用户的聊天详情
* @param {*} talkId
* @returns
*/
export function getTalkByUser(userId) {
return http.request({
url: `${api.im}/talk/by/user/${userId}`,
method: Method.GET,
});
}
/**
* 获取聊天列表
* @param {*} talkId
* @returns
*/
export function getTalkList(params) {
return http.request({
url: `${api.im}/talk/list`,
method: Method.GET,
params
});
}
/**
* 获取聊天信息接口
* @param {*} params
* @returns
*/
export function getTalkMessage(params) {
return http.request({
url: `${api.im}/message`,
method: Method.GET,
params
});
}
/**
* 获取聊天信息接口
* @param {*} params
* @returns
*/
export function cleanUnreadMessage(params) {
return http.request({
url: `${api.im}/message/clean/unred`,
method: Method.PUT,
params
});
}
// 从商品页点击 客服 跳转 获取商品详情
export function jumpObtain(skuId, goodsId) {
return http.request({
url: `/goods/goods/sku/${goodsId}/${skuId}`,
method: Method.GET,
});
}
// 清除未读
// /im/message/clean/unred
export function clearmeaager() {
return http.request({
url: `${api.im}/message/clean/unred`,
method: Method.PUT,
});
}

View File

@@ -8,19 +8,58 @@ import api from "@/config/api.js";
*/ */
export function resetByMobile(params) { export function resetByMobile(params) {
return http.request({ return http.request({
url: `/members/resetByMobile`, url: `/passport/member/resetByMobile`,
method: "POST", method: "POST",
params, params,
}); });
} }
/**
* 绑定手机号码
* @param mobile
*/
export function bindMobile(params) {
return http.request({
url: `/passport/member/bindMobile`,
method: "POST",
params,
});
}
//获取自动发券
export function getAutoCoup(){
return http.request({
url:`/promotion/coupon/activity`,
method:"GET",
needToken: true,
});
}
/**
* 账号密码登陆
* @params password
* @params username
*/
export function userLogin(params, clientType){
return http.request({
method: "POST",
url:`/passport/member/userLogin`,
data: params,
header: {
"content-type": "application/x-www-form-urlencoded",
clientType: clientType,
},
})
}
/** /**
* 发送验证码 * 发送验证码
* @param mobile * @param mobile
*/ */
export function sendMobile(mobile,type='LOGIN') { export function sendMobile(mobile,type='LOGIN') {
return http.request({ return http.request({
url: `${api.common}/sms/${type}/${mobile}`, url: `${api.common}/common/sms/${type}/${mobile}`,
method: "GET", method: "GET",
}); });
} }
@@ -32,7 +71,7 @@ export function sendMobile(mobile,type='LOGIN') {
*/ */
export function smsLogin(params, clientType) { export function smsLogin(params, clientType) {
return http.request({ return http.request({
url: `/members/smsLogin`, url: `/passport/member/smsLogin`,
method: "POST", method: "POST",
data: params, data: params,
header: { header: {
@@ -50,7 +89,7 @@ export function smsLogin(params, clientType) {
export function modifyPass(params) { export function modifyPass(params) {
return http.request({ return http.request({
url: `/members/modifyPass`, url: `/passport/member/modifyPass`,
method: "PUT", method: "PUT",
params, params,
}); });
@@ -61,7 +100,7 @@ export function modifyPass(params) {
*/ */
export function refreshTokenFn(refresh_token) { export function refreshTokenFn(refresh_token) {
return http.request({ return http.request({
url: `/members/refresh/${refresh_token}`, url: `/passport/member/refresh/${refresh_token}`,
method: "GET", method: "GET",
}); });
} }
@@ -69,8 +108,34 @@ export function refreshTokenFn(refresh_token) {
// 获取密码状态 // 获取密码状态
export function logout () { export function logout () {
return http.request({ return http.request({
url: '/members/logout', url: '/passport/member/logout',
method: "POST", method: "POST",
needToken: true, needToken: true,
}) })
} }
export function scannerCodeLogin(params){
return http.request({
url: '/passport/member/app_scanner',
method: "POST",
params,
needToken: true,
});
}
export function scannerCodeLoginConfirm(params){
return http.request({
url: '/passport/member/app_confirm',
method: "POST",
params,
needToken: true,
});
}
// 注销用户
export function logoffConfirm() {
return http.request({
url: '/passport/member/cancellation',
method: "PUT",
needToken: true,
})
}

View File

@@ -6,7 +6,7 @@ import { http, Method } from "@/utils/request.js";
*/ */
export function feedBack(params) { export function feedBack(params) {
return http.request({ return http.request({
url: "/feedback", url: "/other/feedback",
method: Method.POST, method: Method.POST,
needToken: true, needToken: true,
params, params,
@@ -16,7 +16,7 @@ export function feedBack(params) {
// 提现 // 提现
export function withdrawalApply(params) { export function withdrawalApply(params) {
return http.request({ return http.request({
url: "/members/wallet/withdrawal", url: "/wallet/wallet/withdrawal",
method: Method.POST, method: Method.POST,
needToken: true, needToken: true,
params, params,
@@ -30,7 +30,7 @@ export function withdrawalApply(params) {
*/ */
export function payCallback(params) { export function payCallback(params) {
return http.request({ return http.request({
url: `/cashier/result`, url: `/payment/cashier/result`,
method: Method.GET, method: Method.GET,
params, params,
}); });
@@ -117,7 +117,7 @@ export function getPointsData(params) {
*/ */
export function getComments(params) { export function getComments(params) {
return http.request({ return http.request({
url: "/memberEvaluation", url: "/member/evaluation",
method: Method.GET, method: Method.GET,
needToken: true, needToken: true,
params, params,
@@ -131,7 +131,7 @@ export function getComments(params) {
*/ */
export function getFootprintNum(params) { export function getFootprintNum(params) {
return http.request({ return http.request({
url: "/footprint/getFootprintNum", url: "/member/footprint/getFootprintNum",
method: Method.GET, method: Method.GET,
needToken: true, needToken: true,
params, params,
@@ -144,7 +144,7 @@ export function getFootprintNum(params) {
*/ */
export function commentsMemberOrder(params) { export function commentsMemberOrder(params) {
return http.request({ return http.request({
url: "/memberEvaluation", url: "/member/evaluation",
method: Method.POST, method: Method.POST,
needToken: true, needToken: true,
header: { "content-type": "application/x-www-form-urlencoded" }, header: { "content-type": "application/x-www-form-urlencoded" },
@@ -202,6 +202,22 @@ export function getGoodsCollection(params, type) {
}); });
} }
/**
* 获取商品收藏
* @param params
* @returns {AxiosPromise}
*/
export function getStoreCollection(params, type) {
return http.request({
url: `/member/storeCollection/${type}`,
method: Method.GET,
needToken: true,
loading: false,
message: false,
params,
});
}
/** /**
* 收藏商品 * 收藏商品
* @returns {AxiosPromise} * @returns {AxiosPromise}
@@ -236,7 +252,7 @@ export function deleteGoodsCollection(ids) {
*/ */
export function deleteStoreCollection(store_id) { export function deleteStoreCollection(store_id) {
return http.request({ return http.request({
url: `/member/collection/delete/STORE/${store_id}`, url: `/member/storeCollection/delete/STORE/${store_id}`,
method: Method.DELETE, method: Method.DELETE,
needToken: true, needToken: true,
}); });
@@ -255,6 +271,19 @@ export function getGoodsIsCollect(type, good_id) {
}); });
} }
/**
* 获取商品是否被收藏
* @param good_id
*/
export function getStoreIsCollect(type, store_id) {
return http.request({
url: `/member/storeCollection/isCollection/${type}/${store_id}`,
method: Method.GET,
needToken: true,
loading: false,
});
}
/** /**
* 收藏店铺 * 收藏店铺
* @param store_id 店铺ID * @param store_id 店铺ID
@@ -262,10 +291,9 @@ export function getGoodsIsCollect(type, good_id) {
*/ */
export function collectionStore(store_id) { export function collectionStore(store_id) {
return http.request({ return http.request({
url: "members/collection/store", url: `/member/storeCollection/add/STORE/${store_id}`,
header: { "content-type": "application/x-www-form-urlencoded" },
method: Method.POST, method: Method.POST,
data: { store_id }, needToken: true,
}); });
} }
@@ -275,7 +303,7 @@ export function collectionStore(store_id) {
*/ */
export function getUserInfo() { export function getUserInfo() {
return http.request({ return http.request({
url: "/members", url: "/passport/member",
method: Method.GET, method: Method.GET,
needToken: true, needToken: true,
}); });
@@ -287,7 +315,7 @@ export function getUserInfo() {
*/ */
export function getUserWallet() { export function getUserWallet() {
return http.request({ return http.request({
url: "/members/wallet", url: "/wallet/wallet",
method: Method.GET, method: Method.GET,
needToken: true, needToken: true,
}); });
@@ -300,7 +328,7 @@ export function getUserWallet() {
*/ */
export function saveUserInfo(params) { export function saveUserInfo(params) {
return http.request({ return http.request({
url: "/members/editOwn", url: "/passport/member/editOwn",
method: Method.PUT, method: Method.PUT,
header: { "content-type": "application/x-www-form-urlencoded" }, header: { "content-type": "application/x-www-form-urlencoded" },
needToken: true, needToken: true,
@@ -328,7 +356,7 @@ export function addReceipt(params) {
*/ */
export function getGoodsComments(goodsId, params) { export function getGoodsComments(goodsId, params) {
return http.request({ return http.request({
url: `/memberEvaluation/${goodsId}/goodsEvaluation`, url: `/member/evaluation/${goodsId}/goodsEvaluation`,
method: Method.GET, method: Method.GET,
loading: false, loading: false,
params, params,
@@ -341,7 +369,7 @@ export function getGoodsComments(goodsId, params) {
*/ */
export function getGoodsCommentsCount(goodsId) { export function getGoodsCommentsCount(goodsId) {
return http.request({ return http.request({
url: `/memberEvaluation/${goodsId}/evaluationNumber`, url: `/member/evaluation/${goodsId}/evaluationNumber`,
method: Method.GET, method: Method.GET,
loading: false, loading: false,
}); });
@@ -365,7 +393,7 @@ export function getNoReadMessageNum() {
*/ */
export function myTrackList(params) { export function myTrackList(params) {
return http.request({ return http.request({
url: `/footprint`, url: `/member/footprint`,
method: Method.GET, method: Method.GET,
needToken: true, needToken: true,
params, params,
@@ -378,7 +406,7 @@ export function myTrackList(params) {
*/ */
export function deleteHistoryListId(ids) { export function deleteHistoryListId(ids) {
return http.request({ return http.request({
url: `/footprint/delByIds/${ids}`, url: `/member/footprint/delByIds/${ids}`,
method: Method.DELETE, method: Method.DELETE,
needToken: true, needToken: true,
}); });
@@ -419,3 +447,16 @@ export function getMemberPointSum() {
method: Method.GET, method: Method.GET,
}); });
} }
/**
* 获取会员积分VO
* @param
*/
export function withdrawalSettingVO() {
return http.request({
url: `/wallet/wallet/withdrawalSettingVO`,
method: Method.GET,
needToken: true,
});
}

View File

@@ -14,7 +14,7 @@ import api from '@/config/api.js';
*/ */
export function getWeChatMpMessage() { export function getWeChatMpMessage() {
return http.request({ return http.request({
url: 'mini-program/subscribeMessage', url: 'passport/connect/miniProgram/subscribeMessage',
method: Method.GET method: Method.GET
}); });
} }
@@ -42,12 +42,30 @@ export function getMessages(params) {
*/ */
export function messageMarkAsRead(ids) { export function messageMarkAsRead(ids) {
return http.request({ return http.request({
url: `members/member-nocice-logs/${ids}/read`, url: `/message/member/${ids}`,
method: Method.PUT, method: Method.PUT,
needToken: true, needToken: true,
}); });
} }
//读取站内消息
export function editMessages(message_id,params){
return http.request({
url:`/message/member/${message_id}`,
method:Method.PUT,
needToken:true,
params
})
}
//获取站内消息
export function messages(params) {
return http.request({
url: "/message/member",
method: Method.GET,
needToken: true,
params,
});
}
/** /**
* 获取物流消息列表 * 获取物流消息列表
@@ -73,7 +91,7 @@ export function getLogisticsMessages(params) {
*/ */
export function getAppVersion(appType) { export function getAppVersion(appType) {
return http.request({ return http.request({
url: `/appVersion/${appType}`, url: `/other/appVersion/${appType}`,
method: Method.GET, method: Method.GET,
type:"manager" type:"manager"
}); });
@@ -86,7 +104,7 @@ export function getLogisticsMessages(params) {
*/ */
export function getAppVersionList(type,data) { export function getAppVersionList(type,data) {
return http.request({ return http.request({
url: `/appVersion/appVersion/${type}`, url: `/other/appVersion/appVersion/${type}`,
method: Method.GET, method: Method.GET,
type:"manager", type:"manager",
data data

View File

@@ -51,7 +51,7 @@ export function selectedShipMethod(params) {
*/ */
export function getOrderList(params) { export function getOrderList(params) {
return http.request({ return http.request({
url: "/orders", url: "/order/order",
method: Method.GET, method: Method.GET,
needToken: true, needToken: true,
params, params,
@@ -64,7 +64,7 @@ export function getOrderList(params) {
*/ */
export function getOrderDetail(orderSn) { export function getOrderDetail(orderSn) {
return http.request({ return http.request({
url: `/orders/${orderSn}`, url: `/order/order/${orderSn}`,
method: Method.GET, method: Method.GET,
needToken: true, needToken: true,
}); });
@@ -77,7 +77,7 @@ export function getOrderDetail(orderSn) {
*/ */
export function cancelOrder(orderSn, reason) { export function cancelOrder(orderSn, reason) {
return http.request({ return http.request({
url: `/orders/${orderSn}/cancel`, url: `/order/order/${orderSn}/cancel`,
method: Method.POST, method: Method.POST,
needToken: true, needToken: true,
header: { "content-type": "application/x-www-form-urlencoded" }, header: { "content-type": "application/x-www-form-urlencoded" },
@@ -91,7 +91,7 @@ export function cancelOrder(orderSn, reason) {
*/ */
export function confirmReceipt(orderSn) { export function confirmReceipt(orderSn) {
return http.request({ return http.request({
url: `/orders/${orderSn}/receiving`, url: `/order/order/${orderSn}/receiving`,
method: Method.POST, method: Method.POST,
needToken: true, needToken: true,
}); });

View File

@@ -4,13 +4,16 @@
import {http, Method} from '@/utils/request.js'; import {http, Method} from '@/utils/request.js';
/** /**
* 获取店铺列表 * 获取店铺列表
* @param params * @param params
*/ */
export function getstoreList(params) { export function getStoreList(params) {
return http.request({ return http.request({
url: '/store', url: '/store/store',
method: Method.GET, method: Method.GET,
params, params,
}); });
@@ -22,7 +25,7 @@ export function getstoreList(params) {
*/ */
export function getStoreBaseInfo(storeId) { export function getStoreBaseInfo(storeId) {
return http.request({ return http.request({
url: `/store/get/detail/${storeId}`, url: `/store/store/get/detail/${storeId}`,
method: Method.GET, method: Method.GET,
loading: false, loading: false,
}); });
@@ -34,7 +37,7 @@ export function getstoreList(params) {
*/ */
export function getStoreCategory(id) { export function getStoreCategory(id) {
return http.request({ return http.request({
url: `/store/label/get/${id}`, url: `/store/store/label/get/${id}`,
method: Method.GET, method: Method.GET,
}); });
} }
@@ -46,11 +49,23 @@ export function getstoreList(params) {
*/ */
export function getLicencePhoto(id) { export function getLicencePhoto(id) {
return http.request({ return http.request({
url: `/store/get/licencePhoto/${id}`, url: `/store/store/get/licencePhoto/${id}`,
method: Method.GET, method: Method.GET,
}); });
} }
/**
* 获取自提点信息
* @param id
*/
export function getStoreAddress(storeId,params) {
return http.request({
url: `/store/address/page/${storeId}`,
method: Method.GET,
params
});
}

View File

@@ -155,6 +155,18 @@ export function setAddressId(addressId,way) {
}); });
} }
/**
* 设置收货地址ID
* @param addressId
*/
export function setStoreAddressId(storeAddressId,way) {
return http.request({
url: `/trade/carts/storeAddress?storeAddressId=${storeAddressId}&way=${way}`,
method: Method.GET,
needToken: true,
});
}
/** /**
@@ -177,7 +189,7 @@ export function createTrade(params) {
*/ */
export function getCashierData(params) { export function getCashierData(params) {
return http.request({ return http.request({
url: "cashier/tradeDetail", url: "payment/cashier/tradeDetail",
method: Method.GET, method: Method.GET,
needToken: true, needToken: true,
params, params,
@@ -194,7 +206,7 @@ export function getCashierData(params) {
*/ */
export function initiatePay(paymentMethod, paymentClient, params) { export function initiatePay(paymentMethod, paymentClient, params) {
return http.request({ return http.request({
url: `cashier/pay/${paymentMethod}/${paymentClient}`, url: `payment/cashier/pay/${paymentMethod}/${paymentClient}`,
method: Method.GET, method: Method.GET,
needToken: true, needToken: true,
params, params,
@@ -209,7 +221,7 @@ export function initiatePay(paymentMethod, paymentClient, params) {
*/ */
export function getExpress(orderSn) { export function getExpress(orderSn) {
return http.request({ return http.request({
url: `/orders/getTraces/${orderSn}`, url: `/order/order/getTraces/${orderSn}`,
method: Method.POST, method: Method.POST,
needToken: true, needToken: true,
@@ -281,3 +293,38 @@ export function reBuy(sn) {
needToken: true, needToken: true,
}); });
} }
/**
* 获取全部配送方式
*/
export function shippingMethodList(params) {
return http.request({
url: `/trade/carts/shippingMethodList`,
method: Method.GET,
needToken: true,
params: params,
});
}
/**
* 提交配送方式
* @param params
*/
export function setShipMethod(params) {
return http.request({
url: "/trade/carts/shippingMethod",
method: Method.PUT,
needToken: true,
params,
});
}
// 查看包裹列表
export function getPackage(orderSn) {
return http.request({
url: `/order/order/getPackage/${orderSn}`,
method: Method.GET,
needToken: true,
});
}

View File

@@ -1,475 +1,574 @@
<template> <template>
<div class="wrapper"> <div class="wrapper">
<u-popup class="popup" v-model="buyMask" :height="setup.height" closeable :mode="setup.mode" <u-popup class="popup" v-model="buyMask" :height="setup.height" closeable :mode="setup.mode" :border-radius="setup.radius" @close="closeMask()">
:border-radius="setup.radius" @close="closeMask()"> <!-- 商品 -->
<!-- 商品 --> <view class="goods-box bottom">
<view class="goods-box bottom"> <view class="goods-header">
<view class="goods-header"> <view class="goods-img">
<view class="goods-img"> <u-image width="200rpx" border-radius="20" class="uimage" height="200rpx" :src="selectedSpecImg ? selectedSpecImg : goodsDetail.thumbnail"></u-image>
<u-image width="200rpx" border-radius="20" class="uimage" height="200rpx" </view>
:src="selectedSpecImg ? selectedSpecImg : goodsDetail.thumbnail"></u-image> <view class="goods-skus">
</view> <!-- 有活动商品价格 -->
<view class="goods-skus"> <view class="goods-price" v-if="goodsDetail.promotionPrice && ((isGroup && buyType === 'PINTUAN') || !isGroup)">
<span v-if="goodsDetail.promotionPrice && !pointDetail">
<span class="goods-price-promotionShow goods-price-bigshow">{{ $options.filters.goodsFormatPrice(goodsDetail.promotionPrice)[0] }}</span>
.{{ $options.filters.goodsFormatPrice(goodsDetail.promotionPrice)[1] }}
</span>
<span v-if="pointDetail.points">
<span class="goods-price-promotionShow goods-price-bigshow">{{ pointDetail.points }}</span>
积分
</span>
<div class="promotion-box">
<span class="goods-price-bigshow">{{ $options.filters.goodsFormatPrice(goodsDetail.price)[0] }}</span>
.{{ $options.filters.goodsFormatPrice(goodsDetail.price)[1] }}
</div>
</view>
<!-- 正常商品的价格 -->
<view v-else>
<!-- 批发价格 -->
<div class="price-row flex" v-if="goodsDetail.salesModel === 'WHOLESALE'">
<div class="goods-price" v-for="(item, index) in wholesaleList" :key="index">
<span>
<span class="goods-price-bigshow">{{ $options.filters.goodsFormatPrice(item.price)[0] }}</span>
.{{ $options.filters.goodsFormatPrice(item.price)[1] }}
</span>
<span class="wholesale-item">{{ item.num }}{{ goodsDetail.goodsUnit }}</span>
</div>
</div>
<div class="goods-price" v-else>
<span>
<span class="goods-price-bigshow">{{ $options.filters.goodsFormatPrice(goodsDetail.price)[0] }}</span>
.{{ $options.filters.goodsFormatPrice(goodsDetail.price)[1] }}
</span>
</div>
</view>
<view class="goods-check-skus">
已选
<span class="goods-check-skus-name">
{{ selectName }}
<span>{{ num }}</span>
</span>
</view>
<view class="goods-check-skus">
库存
<span class="goods-check-skus-name">
<span>{{ goodsDetail.quantity }}</span>
</span>
</view>
</view>
</view>
<!-- 商品信息 -->
<scroll-view class="goods-skus-box" :scroll-y="true">
<!-- 规格 -->
<view class="goods-skus-view" :key="specIndex" v-for="(spec, specIndex) in formatList">
<view class="skus-view-list">
<view class="view-class-title">{{ spec.name }}</view>
<!-- 有活动商品价格 --> <!-- 正常逻辑 循环出sku -->
<view class="goods-price " v-if="goodsDetail.promotionPrice"> <view
<span v-if="goodsDetail.promotionPrice && !pointDetail"> v-if="!parentOrder"
:class="{ active: spec_val.value == currentSelected[specIndex] }"
<span class="skus-view-item"
class="goods-price-promotionShow goods-price-bigshow">{{ formatPrice(goodsDetail.promotionPrice)[0] }}</span> v-for="(spec_val, spec_index) in spec.values"
.{{ formatPrice(goodsDetail.promotionPrice)[1] }} :key="spec_index"
</span> @click="handleClickSpec(spec, specIndex, spec_val)"
<span v-if="pointDetail.points"> >
<span class="goods-price-promotionShow goods-price-bigshow">{{ pointDetail.points }}</span> {{ spec_val.value }}
积分 </view>
</span>
<div class="promotion-box">
<span class="goods-price-bigshow">{{
formatPrice(goodsDetail.price)[0]
}}</span>
.{{ formatPrice(goodsDetail.price)[1] }}
</div> <!-- 拼团购买仅筛选出当前拼团类型商品 -->
</view> <view
<!-- 正常商品的价格 --> v-if="parentOrder && spec_val.skuId == goodsDetail.id"
<view class="goods-price" v-else> :class="{ active: spec_val.value == currentSelected[specIndex] }"
<span> class="skus-view-item"
v-for="(spec_val, spec_index) in spec.values"
<span class="goods-price-bigshow">{{ :key="spec_index"
formatPrice(goodsDetail.price)[0] @click="handleClickSpec(spec, specIndex, spec_val)"
}}</span> >
.{{ formatPrice(goodsDetail.price)[1] }} {{ spec_val.value }}
</view>
</span> </view>
</view> </view>
<view class="goods-check-skus"> <div class="soldout" v-if="goodsDetail.quantity === 0">
已选 <u-alert-tips type="warning" title="商品已售罄" description="当前商品库存为0"></u-alert-tips>
<span class="goods-check-skus-name"> </div>
{{ selectName }} <!-- 数量 -->
<span>{{ num }}</span> <view v-if="goodsDetail.quantity !== 0" class="goods-skus-number flex flex-a-c flex-j-sb">
</span> <view class="view-class-title">数量</view>
</view> <uni-number-box class="uNumber" :min="1" :max="999" :disabled="goodsDetail.quantity === 0" v-model="num"></uni-number-box>
</view> </view>
</view> </scroll-view>
<!-- 商品信息 --> <!-- 按钮 -->
<scroll-view class="goods-skus-box" :scroll-y="true"> <view class="btns" v-if="goodsDetail.quantity !== 0">
<!-- 规格 --> <view class="box-btn card" v-if="buyType != 'PINTUAN' && goodsDetail.goodsType != 'VIRTUAL_GOODS'" @click="addToCartOrBuy('cart')">加入购物车</view>
<view class="goods-skus-view" :key="specIndex" v-for="(spec, specIndex) in formatList"> <view class="box-btn buy" @click="addToCartOrBuy('buy')">立即购买</view>
<view class="skus-view-list"> </view>
<view class="view-class-title">{{ spec.name }}</view> </view>
</u-popup>
</div>
<!-- 正常逻辑 循环出sku -->
<view v-if="!parentOrder" :class="{ active: spec_val.value == currentSelceted[specIndex] }" class="skus-view-item"
v-for="(spec_val, spec_index) in spec.values" :key="spec_index"
@click="handleClickSpec(spec, specIndex, spec_val)">{{ spec_val.value }} </view>
<!-- 拼团购买仅筛选出当前拼团类型商品 -->
<view v-if="parentOrder && spec_val.skuId == goodsDetail.id" :class="{ active: spec_val.value == currentSelceted[specIndex] }" class="skus-view-item"
v-for="(spec_val, spec_index) in spec.values" :key="spec_index"
@click="handleClickSpec(spec, specIndex, spec_val)">{{ spec_val.value }} </view>
</view>
</view>
<!-- 数量 -->
<view class="goods-skus-number">
<view class="view-class-title">数量</view>
<u-number-box :bg-color="numberBox.bgColor" :max="200" :color="numberBox.color"
:input-width="numberBox.width" :input-height="numberBox.height" :size="numberBox.size" :min="1"
v-model="num">
</u-number-box>
</view>
</scroll-view>
<!-- 按钮 -->
<view class="btns">
<view class="box-btn card" v-if="buyType != 'PINTUAN' && goodsDetail.goodsType!='VIRTUAL_GOODS'"
@click="addToCartOrBuy('cart')">加入购物车</view>
<view class="box-btn buy" @click="addToCartOrBuy('buy')">立即购买</view>
</view>
</view>
</u-popup>
</div>
</template> </template>
<script> <script>
import * as API_trade from "@/api/trade.js"; import * as API_trade from '@/api/trade.js';
import setup from "./popup"; import setup from './popup';
import uniNumberBox from '@/components/uni-number-box'
export default { export default {
data() { components: {
return { uniNumberBox
setup, },
num: 1, data() {
// 步进器的大小尺寸单位是 rpx return {
numberBox: { setup,
width: "50", num: this.wholesaleList && this.wholesaleList.length > 0 ? this.wholesaleList[0].num : 1,
height: "50",
size: "22",
color: "#333",
bgColor: "#fff",
},
selectName: "", //选中商品的昵称
selectSkuList: "", //选中商铺sku,
selectedSpecImg: "", //选中的图片路径
buyType: "", //用于存储促销,拼团等活动类型
parentOrder: "", //父级拼团活动的数据 - 如果是团员则有数据
formatList: [],
currentSelceted: [],
skuList: "",
isClose: false, //是否可以点击遮罩关闭
};
},
props: {
buyMask: {
type: Boolean,
default: false,
},
goodsDetail: {
default: "",
type: null,
},
selectedSku: {
default: "",
type: null,
},
goodsSpec: {
default: "",
type: null,
},
addr: {
default: "",
type: null,
},
pointDetail:{
default: "",
type: null,
}
},
watch: {
buyType: {
handler(val) {
this.buyType = val;
},
immediate: true,
},
selectSkuList: {
handler(val, oldval) {
this.$emit("changed", val);
},
deep: true,
},
},
methods: { selectName: '', //选中商品的昵称
selectSkuList: '', //选中商铺sku,
selectedSpecImg: '', //选中的图片路径
buyType: '', //用于存储促销,拼团等活动类型
parentOrder: '', //父级拼团活动的数据 - 如果是团员则有数据
formatList: [],
currentSelected: [],
skuList: '',
isClose: false //是否可以点击遮罩关闭
};
},
props: {
wholesaleList: {
type: null,
default: false
},
buyMask: {
type: Boolean,
default: false
},
isGroup: {
type: Boolean,
default: false
},
goodsDetail: {
default: '',
type: null
},
selectedSku: {
default: '',
type: null
},
goodsSpec: {
default: '',
type: null
},
addr: {
default: '',
type: null
},
pointDetail: {
default: '',
type: null
}
},
computed: {
wholesalePrice(key) {
return this.wholesaleList.length
? this.wholesaleList.map(item => {
return item.price;
})
: [];
},
wholesaleNum(key) {
return this.wholesaleList.length
? this.wholesaleList.map(item => {
return item.num;
})
: [];
}
},
watch: {
num(val) {
val == 0 ? this.num = 1 : ''
if (val) {
//超过库存后修改回库存
if (val > this.goodsDetail.quantity) {
this.$nextTick(function() {
this.num = this.goodsDetail.quantity;
});
}
}
},
buyType: {
handler(val) {
if (val) {
this.buyType = val;
}
},
immediate: true
},
selectSkuList: {
handler(val, oldval) {
this.$emit('changed', val);
},
deep: true
},
'goodsDetail.quantity': {
handler(val) {
if (val == 0) {
uni.showToast({
title: '商品已售罄',
duration: 2000,
icon: 'none'
})
this.num = 1;
}
}
}
},
// 格式化金钱 1999 --> [1999,00] methods: {
formatPrice(val) { numCheck(val) {
if (typeof val == "undefined") { if (this.wholesaleList && this.wholesaleList.length > 0) {
return val; if (this.num <= this.wholesaleList[0].num) {
} uni.showToast({
return val.toFixed(2).split("."); title: '批发商品购买数量不能小于起批数量!',
}, duration: 2000,
icon: 'none'
});
this.num = this.wholesaleList[0].num;
}
}
},
closeMask() {
this.$emit('closeBuy', false);
},
/**点击规格 */
handleClickSpec(val, index, specValue) {
this.currentSelected[index] = specValue.value;
let selectedSkuId = this.goodsSpec.find(i => {
let matched = true;
let specValues = i.specValues.filter(j => j.specName !== 'images');
for (let n = 0; n < specValues.length; n++) {
if (specValues[n].specValue !== this.currentSelected[n]) {
matched = false;
return;
}
}
if (matched) {
return i;
}
});
if (selectedSkuId?.skuId) {
this.$set(this.currentSelected, index, specValue.value);
this.selectSkuList = {
spec: {
specName: val.name,
specValue: specValue.value
},
data: this.goodsDetail
};
this.selectName = specValue.value;
closeMask() { this.$emit('handleClickSku', {
this.$emit("closeBuy", false); skuId: selectedSkuId.skuId,
}, goodsId: this.goodsDetail.goodsId
});
} else {
uni.showToast({
title: '暂无该商品!',
duration: 2000,
icon: 'none'
});
}
},
/**点击规格 */ /**
handleClickSpec(val, index, specValue) { * 直接购买
this.currentSelceted[index] = specValue.value; */
let selectedSkuId = this.goodsSpec.find((i) => { buy(data) {
let matched = true; API_trade.addToCart(data).then(res => {
let specValues = i.specValues.filter((j) => j.specName !== "images"); if (res.data.success) {
for (let n = 0; n < specValues.length; n++) { uni.navigateTo({
if (specValues[n].specValue !== this.currentSelceted[n]) { url: `/pages/order/fillorder?way=${data.cartType}&addr=${''}&parentOrder=${encodeURIComponent(JSON.stringify(this.parentOrder))}`
matched = false; });
return; }
} });
} },
if (matched) {
return i;
}
});
if (selectedSkuId?.skuId) {
this.$set(this.currentSelceted, index, specValue.value);
this.selectSkuList = {
spec: {
specName: val.name,
specValue: specValue.value,
},
data: this.goodsDetail,
};
this.selectName = specValue.value;
this.$emit("handleClickSku", { /**
skuId: selectedSkuId.skuId, * 添加到购物车或购买
goodsId: this.goodsDetail.goodsId, */
}); addToCartOrBuy(val) {
} else { if (!this.selectSkuList) {
uni.showToast({ uni.showToast({
title: "暂无该商品!", title: '请选择规格商品',
duration: 2000, icon: 'none'
icon: "none", });
}); return;
} }
}, let data = {
skuId: this.goodsDetail.id,
num: this.num
};
/** if (val == 'cart') {
* 直接购买 API_trade.addToCart(data).then(res => {
*/ if (res.data.code == 200) {
buy(data) { uni.showToast({
API_trade.addToCart(data).then((res) => { title: '商品已添加到购物车',
if (res.data.success) { icon: 'none'
uni.navigateTo({ });
url: `/pages/order/fillorder?way=${
data.cartType
}&addr=${""}&parentOrder=${encodeURIComponent(
JSON.stringify(this.parentOrder)
)}`,
});
}
});
},
this.$emit('queryCart');
this.closeMask();
}
});
} else {
// 判断是否拼团商品
if (this.buyType) {
data.cartType = 'PINTUAN';
} else if (this.goodsDetail.goodsType == 'VIRTUAL_GOODS') {
data.cartType = 'VIRTUAL';
} else {
data.cartType = 'BUY_NOW';
}
/** API_trade.addToCart(data).then(res => {
* 添加到购物车或购买 if (res.data.code == 200) {
*/ uni.navigateTo({
addToCartOrBuy(val) { url: `/pages/order/fillorder?way=${data.cartType}&addr=${this.addr.id || ''}&parentOrder=${encodeURIComponent(JSON.stringify(this.parentOrder))}`
if (!this.selectSkuList) { });
uni.showToast({ }
title: "请选择规格商品", });
icon: "none", }
}); },
return; formatSku(list) {
} // 格式化数据
let data = { let arr = [{}];
skuId: this.goodsDetail.id,
num: this.num,
};
if (val == "cart") { if (!Array.isArray(list)) {
API_trade.addToCart(data).then((res) => { return false;
if (res.data.code == 200) { }
uni.showToast({ list.forEach((item, index) => {
title: "商品已添加到购物车", item.specValues.forEach((spec, specIndex) => {
icon: "none", let name = spec.specName;
}); let values = {
value: spec.specValue,
quantity: item.quantity,
skuId: item.skuId
};
if (name === 'images') {
return;
}
this.$emit("queryCart"); arr.forEach((arrItem, arrIndex) => {
this.closeMask(); if (
} arrItem.name == name &&
}); arrItem.values &&
} else { !arrItem.values.find(i => {
// 判断是否拼团商品 return i.value === values.value;
if (this.buyType) { })
data.cartType = "PINTUAN"; ) {
} else if (this.goodsDetail.goodsType == "VIRTUAL_GOODS") { arrItem.values.push(values);
data.cartType = "VIRTUAL"; }
} else {
data.cartType = "BUY_NOW";
}
API_trade.addToCart(data).then((res) => { let keys = arr.map(key => {
if (res.data.code == 200) { return key.name;
uni.navigateTo({ });
url: `/pages/order/fillorder?way=${data.cartType}&addr=${ if (!keys.includes(name)) {
this.addr.id || "" arr.push({
}&parentOrder=${encodeURIComponent( name: name,
JSON.stringify(this.parentOrder) values: [values]
)}`, });
}); }
} });
}); });
} });
},
formatSku(list) {
// 格式化数据
console.log(list);
let arr = [{}];
list.forEach((item, index) => {
item.specValues.forEach((spec, specIndex) => {
let name = spec.specName;
let values = {
value: spec.specValue,
quantity: item.quantity,
skuId: item.skuId,
};
if (name === "images") {
return;
}
arr.forEach((arrItem, arrIndex) => { arr.shift();
if ( this.formatList = arr;
arrItem.name == name &&
arrItem.values &&
!arrItem.values.find((i) => {
return i.value === values.value;
})
) {
arrItem.values.push(values);
}
let keys = arr.map((key) => { list.forEach(item => {
return key.name; // 默认选中
}); if (item.skuId === this.goodsDetail.id) {
if (!keys.includes(name)) { item.specValues
console.log(name, values); .filter(i => i.specName !== 'images')
arr.push({ .forEach((value, _index) => {
name: name, this.currentSelected[_index] = value.specValue;
values: [values],
});
}
});
});
});
arr.shift(); this.selectName = value.specValue;
this.formatList = arr;
list.forEach((item) => { this.selectSkuList = {
// 默认选中 spec: value,
if (item.skuId === this.goodsDetail.id) { data: this.goodsDetail
item.specValues };
.filter((i) => i.specName !== "images") });
.forEach((value, _index) => { }
this.currentSelceted[_index] = value.specValue; });
this.selectName = value.specValue; this.skuList = list;
// console.log(" this.skuList", this.skuList)
}
},
this.selectSkuList = { mounted() {
spec: value, this.formatSku(this.goodsSpec);
data: this.goodsDetail,
};
});
}
});
this.skuList = list; console.log("goodsDetail",this.goodsDetail)
// console.log(" this.skuList", this.skuList) }
},
},
mounted() {
this.formatSku(this.goodsSpec);
},
}; };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "./popup.scss"; @import './popup.scss';
.price-row {
text-align: center;
}
.buy { .buy {
background-image: linear-gradient(135deg, #ffba0d, #ffc30d 69%, #ffcf0d); background-image: linear-gradient(135deg, #ffba0d, #ffc30d 69%, #ffcf0d);
box-shadow: 0 2px 6px 0 rgba(255, 65, 66, 0.2); box-shadow: 0 2px 6px 0 rgba(255, 65, 66, 0.2);
} }
.card { .card {
background-image: linear-gradient(135deg, #f2140c, #f2270c 70%, #f24d0c); background-image: linear-gradient(135deg, #f2140c, #f2270c 70%, #f24d0c);
box-shadow: 0 2px 6px 0 rgba(255, 65, 66, 0.2); box-shadow: 0 2px 6px 0 rgba(255, 65, 66, 0.2);
} }
/deep/.u-icon-plus, /deep/.u-icon-plus,
.u-icon-minus, .u-icon-minus,
.u-icon-disabled { .u-icon-disabled {
height: 30rpx !important; height: 30rpx !important;
background: #fff !important; background: #fff !important;
} }
.goods-skus-number { .goods-skus-number {
justify-content: space-between; justify-content: space-between;
display: flex; display: flex;
> .view-class-title {
flex: 8;
}
> .view-class-input {
flex: 1;
}
} }
/deep/ .uni-scroll-view { /deep/ .uni-scroll-view {
overflow: hidden !important; overflow: hidden !important;
} }
.active { .active {
background: $price-light-color !important; background: $price-light-color !important;
border: 2rpx solid $price-color; border: 2rpx solid $price-color;
font-weight: bold; font-weight: bold;
color: $price-color !important; color: $price-color !important;
box-sizing: border-box; box-sizing: border-box;
} }
.goods-skus-box { .goods-skus-box {
overflow-y: auto; overflow-y: auto;
height: 610rpx; height: 610rpx;
// #ifdef MP-WEIXIN // #ifdef MP-WEIXIN
height: 570rpx; height: 570rpx;
// #endif // #endif
margin-bottom: 10rpx; margin-bottom: 10rpx;
}
.soldout{
margin: 20rpx 0;
} }
.goods-skus-view { .goods-skus-view {
overflow: hidden; overflow: hidden;
.skus-view-list { .skus-view-list {
> .skus-view-item { > .skus-view-item {
flex: 1; flex: 1;
padding: 0 36rpx; padding: 0 36rpx;
overflow: hidden; overflow: hidden;
height: 60rpx; height: 60rpx;
line-height: 60rpx; line-height: 60rpx;
float: left; float: left;
text-align: center; text-align: center;
margin-left: 24rpx; margin-left: 24rpx;
margin-bottom: 20rpx; margin-bottom: 20rpx;
font-size: 22rpx; font-size: 22rpx;
color: #262626; color: #262626;
background: #f2f2f2; background: #f2f2f2;
border-radius: 30rpx; border-radius: 30rpx;
} }
} }
}
.wholesale-item {
color: #999 !important;
font-size: 24rpx;
margin: 0 20rpx;
display: flex;
justify-content: center;
} }
.goods-header { .goods-header {
height: 200rpx; height: 200rpx;
display: flex; display: flex;
align-items: center; align-items: center;
margin-bottom: 36rpx; margin-bottom: 36rpx;
} }
.goods-box { .goods-box {
padding: 50rpx 36rpx 0 36rpx; padding: 50rpx 36rpx 0 36rpx;
} }
.goods-skus { .goods-skus {
padding: 0 20rpx; padding: 0 20rpx;
} }
.goods-price { .goods-price {
color: $price-color; color: $price-color;
line-height: 80rpx; line-height: 80rpx;
display: flex; margin-right: 20rpx;
> * {
color: $price-color;
line-height: 80rpx;
}
} }
.promotion-box { .promotion-box {
line-height: 1; line-height: 1;
display: flex; display: flex;
align-items: center; align-items: center;
text-decoration: line-through; text-decoration: line-through;
color: #999; color: #999;
margin-left: 10rpx; margin-left: 10rpx;
/deep/ span {
font-size: 30rpx; /deep/ span {
} font-size: 30rpx;
}
} }
.promotion { .promotion {
font-size: 30rpx; font-size: 30rpx;
} }
.goods-price-promotionShow { .goods-price-promotionShow {
font-size: 48rpx; font-size: 48rpx;
} }
.goods-check-skus { .goods-check-skus {
font-size: 24rpx; font-size: 24rpx;
color: #999; color: #999;
> .goods-check-skus-name {
margin-left: 4rpx; > .goods-check-skus-name {
} margin-left: 4rpx;
> span { }
color: #333;
} > span {
color: #333;
}
} }
</style> </style>

View File

@@ -180,6 +180,7 @@ export default {
if (this.tabbars[index].id != item.id) { if (this.tabbars[index].id != item.id) {
this.tabbars[index].localName = item.name; this.tabbars[index].localName = item.name;
this.tabbars[index].id = item.id; this.tabbars[index].id = item.id;
this.tabbars[index].center = item.center
if (index < this.tabbars.length - 1) { if (index < this.tabbars.length - 1) {
this.tabbars.splice(index + 1, this.tabbars.length - index - 1); this.tabbars.splice(index + 1, this.tabbars.length - index - 1);
} }
@@ -195,12 +196,13 @@ export default {
localName: "请选择", localName: "请选择",
id: "", id: "",
children: data.data.result, children: data.data.result,
}; };
this.tabbars.push(current); this.tabbars.push(current);
this.tabCurrentIndex++; this.tabCurrentIndex++;
// 当前距离重新为最上面 // 当前距离重新为最上面
this.scrollTop = 0; this.$set(this,'scrollTop',0)
} }
} else { } else {
this.$emit("funcValue", this.tabbars); this.$emit("funcValue", this.tabbars);
@@ -387,4 +389,4 @@ export default {
icon { icon {
margin-left: 40rpx; margin-left: 40rpx;
} }
</style> </style>

View File

@@ -0,0 +1,11 @@
## 商品列表展示
### OBJECT 参数说明
| 属性 | 说明 | 类型 | 必填 |
| ----------- | ---------------------------------------------------------- | ------- | ---- |
| `res` | 显示数据 | Array | 是 |
| `type` | 商品展示类型 oneColumns twoColumns ,默认展示一行两列商品 | String | 否 |
| `storeName` | 是否展示店铺名称,默认展示 | Boolean | 否 |
| `keywords` | 高亮展示搜索内容 | String | 否 |

View File

@@ -0,0 +1,258 @@
<template>
<div>
<!-- 一行两列商品展示 -->
<view class="goods-list" v-if="type == 'twoColumns'">
<view v-for="(item, index) in res" :key="index" class="goods-item">
<view class="image-wrapper" @click="navigateToDetailPage(item)">
<u-image
:src="item.thumbnail"
width="100%"
height="330rpx"
mode="aspectFit"
>
<u-loading slot="loading"></u-loading>
</u-image>
</view>
<view class="goods-detail">
<div
class="title clamp"
v-html="lightSearchStr(keyword, item.goodsName)"
@click="navigateToDetailPage(item)"
></div>
<view class="price-box" @click="navigateToDetailPage(item)">
<div class="price" v-if="item.price != undefined">
¥<span
>{{
$options.filters.goodsFormatPrice(item.price)[0]
}} </span
>.{{ $options.filters.goodsFormatPrice(item.price)[1] }}
</div>
</view>
<div class="count-config" @click="navigateToDetailPage(item)">
<span>已售 {{ item.buyCount || "0" }}</span>
<span>{{ item.commentNum || "0" }}条评论</span>
</div>
</view>
</view>
</view>
<!-- 一行一列商品展示 -->
<div v-if="type == 'oneColumns'">
<div v-for="(item, index) in res" :key="index" class="goods-row">
<div class="flex goods-col">
<div class="goods-img" @click="navigateToDetailPage(item)">
<u-image
width="230rpx"
border-radius="16"
height="230rpx"
mode="aspectFit"
:src="item.goodsImage || item.thumbnail"
>
<u-loading slot="loading"></u-loading>
</u-image>
</div>
<div class="goods-detail">
<div class="title clamp3" @click="navigateToDetailPage(item)">
{{ item.goodsName }}
</div>
<view class="price-box" @click="navigateToDetailPage(item)">
<div class="price" v-if="item.price != undefined">
¥<span
>{{ $options.filters.goodsFormatPrice(item.price)[0] }} </span
>.{{ $options.filters.goodsFormatPrice(item.price)[1] }}
</div>
</view>
<div class="promotion" @click="navigateToDetailPage(item)">
<div v-if="item.salesModel == 'WHOLESALE'">
<span></span>
</div>
<div
v-for="(promotionItem, promotionIndex) in getPromotion(item)"
:key="promotionIndex"
>
<span v-if="promotionItem.indexOf('COUPON') != -1"></span>
<span v-if="promotionItem.indexOf('FULL_DISCOUNT') != -1"
>满减</span
>
<span v-if="promotionItem.indexOf('SECKILL') != -1">秒杀</span>
</div>
</div>
<div
style="overflow: hidden"
@click="navigateToDetailPage(item)"
class="count-config"
>
<span style="float: left; font-size: 22rpx"
>已售 {{ item.buyCount || "0" }}</span
>
<span style="float: right; font-size: 22rpx"
>{{ item.commentNum || "0" }}条评论</span
>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import commonTpl from "@/components/m-goods-list/common";
export default {
data() {
return {
lightColor: this.$mainColor,
};
},
mixins: [commonTpl],
props: {
// 展示的类型
type:{
type:String,
default:"oneColumns"
},
// 遍历的数据
res: {
type: Array,
default: () => {
return [];
},
},
},
methods: {
// 跳转到商品详情
navigateToDetailPage(item) {
uni.navigateTo({
url: `/pages/product/goods?id=${item.id}&goodsId=${item.goodsId}`,
});
},
},
};
</script>
<style lang="scss" scoped>
.goods-list {
display: flex;
flex-wrap: wrap;
margin: 10rpx 20rpx 284rpx;
width: 100%;
> .goods-item {
background-color: #ffffff;
display: flex;
border-radius: 16rpx;
flex-direction: column;
width: calc(50% - 30rpx);
margin-bottom: 20rpx;
padding-bottom: 20rpx;
&:nth-child(2n + 1) {
margin-right: 20rpx;
}
.image-wrapper {
width: 100%;
height: 330rpx;
border-radius: 16rpx 16rpx 0 0;
overflow: hidden;
padding: 0;
}
}
.count-config,
.store-seller-name {
font-size: $font-sm;
}
.text-hidden {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
.goods-row {
background: #fff;
padding: 16rpx;
> .goods-col {
display: flex;
> .goods-img {
overflow: hidden;
flex: 4;
}
> .goods-detail {
flex: 7;
}
}
}
.goods-detail {
margin: 0 20rpx;
> .title {
font-size: $font-base;
color: $font-color-dark;
line-height: 1.5;
height: 86rpx;
padding: 10rpx 0 0;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
overflow: hidden;
}
.promotion {
margin-top: 4rpx;
display: flex;
div {
span {
font-size: 24rpx;
color: $light-color;
margin-right: 10rpx;
padding: 0 4rpx;
border-radius: 2rpx;
}
}
}
.store-seller-name {
color: #666;
overflow: hidden;
display: flex;
justify-content: space-between;
}
.count-config {
padding: 5rpx 0;
color: #666;
display: flex;
font-size: 24rpx;
justify-content: space-between;
}
> .price-box {
margin-top: 10rpx;
display: flex;
align-items: center;
justify-content: space-between;
padding-right: 10rpx;
font-size: 24rpx;
color: $font-color-light;
> .price {
font-size: 26rpx;
line-height: 1;
color: $main-color;
font-weight: bold;
/deep/ span:nth-of-type(1) {
font-size: 38rpx;
}
}
}
}
</style>

View File

@@ -0,0 +1,69 @@
<template>
</template>
<script>
export default {
methods: {
// 高亮显示搜索内容
lightSearchStr(keyword, str) {
if (!keyword) {
return str
} else {
let unicodes = '';
for (let i of Array.from(keyword)) {
unicodes += this.unicode(i) + "|"
}
const rule = '(' + unicodes + ')'
const reg = new RegExp(rule, 'gi');
return str ? str.replace(reg, matchValue =>
`<span style="color:${this.lightColor}">${matchValue}</span>`
) : ''
}
},
// 转换为unicode
unicode(str) {
var value = '';
for (var i = 0; i < str.length; i++) {
value += '\\u' + this.left_zero_4(parseInt(str.charCodeAt(i)).toString(16));
}
return value;
},
left_zero_4(str) {
if (str != null && str != '' && str != 'undefined') {
if (str.length == 2) {
return '00' + str;
}
}
return str;
},
// 数据去重一下 只显示一次 减免 劵 什么的
getPromotion(item) {
if (item.promotionMap) {
let array = [];
Object.keys(item.promotionMap).forEach((child) => {
if (!array.includes(child.split("-")[0])) {
array.push(child.split("-")[0]);
}
});
return array;
}
},
// 跳转到商品详情
navigateToDetailPage(item) {
uni.navigateTo({
url: `/pages/product/goods?id=${item.id}&goodsId=${item.goodsId}`,
});
},
// 跳转地址
navigateToStoreDetailPage(item) {
uni.navigateTo({
url: `/pages/product/shopPage?id=${item.storeId}`,
});
},
},
}
</script>
<style lang='scss' scoped>
</style>

View File

@@ -0,0 +1,321 @@
<template>
<view>
<!-- 一行两列商品展示 -->
<view class="goods-list" v-if="type == 'twoColumns'">
<view v-for="(item, index) in res" :key="index" class="goods-item">
<view class="image-wrapper" @click="navigateToDetailPage(item)">
<u-image :src="item.thumbnail" width="100%" height='330rpx' mode="aspectFit">
<u-loading slot="loading"></u-loading>
</u-image>
</view>
<view class="goods-detail">
<div class="title clamp" v-html="lightSearchStr(keyword,item.goodsName)"
@click="navigateToDetailPage(item)">
</div>
<view class="price-box" @click="navigateToDetailPage(item)">
<div class="price" v-if="item.price!=undefined">
¥<span>{{ $options.filters.goodsFormatPrice(item.price )[0] }} </span>.{{
$options.filters.goodsFormatPrice(item.price )[1]
}}
</div>
</view>
<div class="promotion" @click="navigateToDetailPage(item)">
<div v-if="item.salesModel == 'WHOLESALE'">
<span></span>
</div>
<div v-for="(promotionItem,promotionIndex) in getPromotion(item)" :key="promotionIndex">
<span v-if="promotionItem.indexOf('COUPON') != -1"></span>
<span v-if="promotionItem.indexOf('FULL_DISCOUNT') != -1">满减</span>
<span v-if="promotionItem.indexOf('SECKILL') != -1">秒杀</span>
</div>
</div>
<div class="count-config" @click="navigateToDetailPage(item)">
<span>已售 {{ item.buyCount || "0" }}</span>
<span>{{ item.commentNum || "0" }}条评论</span>
</div>
</view>
</view>
</view>
<!-- 一行一列商品展示 -->
<div v-if="type == 'oneColumns'" class="goods-one-row">
<div v-for="(item, index) in res" :key="index" class="goods-row">
<div class="flex goods-col">
<div class="goods-img" @click="navigateToDetailPage(item)">
<u-image width="230rpx" mode="aspectFit" border-radius='16' height="230rpx" :src="item.thumbnail">
<u-loading slot="loading"></u-loading>
</u-image>
</div>
<div class="goods-detail">
<div class="title clamp3" @click="navigateToDetailPage(item)">{{ item.goodsName }}</div>
<view class="price-box" @click="navigateToDetailPage(item)">
<div class="price" v-if="item.price!=undefined">
¥<span>{{ $options.filters.goodsFormatPrice(item.price )[0] }} </span>.{{
$options.filters.goodsFormatPrice(item.price )[1]
}}
</div>
</view>
<div class="promotion" @click="navigateToDetailPage(item)">
<div v-if="item.salesModel == 'WHOLESALE'">
<span></span>
</div>
<div v-for="(promotionItem,promotionIndex) in getPromotion(item)" :key="promotionIndex">
<span v-if="promotionItem.indexOf('COUPON') != -1"></span>
<span v-if="promotionItem.indexOf('FULL_DISCOUNT') != -1">满减</span>
<span v-if="promotionItem.indexOf('SECKILL') != -1">秒杀</span>
</div>
</div>
<div style="overflow: hidden" @click="navigateToDetailPage(item)" class="count-config">
<span style="float: left; font-size: 22rpx">已售 {{ item.buyCount || '0' }}</span>
<span style="float: right; font-size: 22rpx">{{ item.commentNum || '0' }}条评论</span>
</div>
</div>
</div>
</div>
</div>
</view>
</template>
<script>
import commonTpl from '@/components/m-goods-list/common'
export default {
data() {
return {
lightColor: this.$mainColor
}
},
mixins: [commonTpl],
props: {
// 遍历的数据
res: {
type: Array,
default: () => {
return []
}
},
// 一行两列还是一行一列显示
type: {
type: String,
default: 'twoColumns',
validator() {
return ['twoColumns', 'oneColumns']
}
},
storeName: {
type: Boolean,
default: true
},
keyword: {
type: null,
default: ''
}
},
watch: {
keyword(val) {
if (val) {
this.lightSearchStr(val)
}
}
},
methods: {
// 高亮显示搜索内容
lightSearchStr(keyword, str) {
if (!keyword) {
return str
} else {
let unicodes = '';
for (let i of Array.from(keyword)) {
unicodes += this.unicode(i) + "|"
}
const rule = '(' + unicodes + ')'
const reg = new RegExp(rule, 'gi');
return str ? str.replace(reg, matchValue =>
`<span style="color:${this.lightColor}">${matchValue}</span>`
) : ''
}
},
// 转换为unicode
unicode(str) {
var value = '';
for (var i = 0; i < str.length; i++) {
value += '\\u' + this.left_zero_4(parseInt(str.charCodeAt(i)).toString(16));
}
return value;
},
left_zero_4(str) {
if (str != null && str != '' && str != 'undefined') {
if (str.length == 2) {
return '00' + str;
}
}
return str;
},
// 数据去重一下 只显示一次 减免 劵 什么的
getPromotion(item) {
if (item ? item.promotionMap : item.promotionMap) {
const fieldList = item ? item.promotionMap : item.promotionMap
let array = [];
Object.keys(fieldList).forEach((child) => {
if (!array.includes(child.split("-")[0])) {
array.push(child.split("-")[0]);
}
});
return array;
}
},
// 跳转到商品详情
navigateToDetailPage(item) {
uni.navigateTo({
url: `/pages/product/goods?id=${item.id}&goodsId=${item.goodsId}`,
});
},
// 跳转地址
navigateToStoreDetailPage(item) {
uni.navigateTo({
url: `/pages/product/shopPage?id=${item.storeId}`,
});
},
}
}
</script>
<style lang='scss' scoped>
.goods-one-row{
padding-bottom: 250rpx;
}
/* 商品列表 */
.goods-list {
display: flex;
flex-wrap: wrap;
margin: 10rpx 20rpx 284rpx;
width: 100%;
>.goods-item {
background-color: #ffffff;
display: flex;
border-radius: 16rpx;
flex-direction: column;
width: calc(50% - 30rpx);
margin-bottom: 20rpx;
padding-bottom: 20rpx;
&:nth-child(2n + 1) {
margin-right: 20rpx;
}
.image-wrapper {
width: 100%;
height: 330rpx;
border-radius: 16rpx 16rpx 0 0;
overflow: hidden;
padding: 0;
}
}
.count-config,
.store-seller-name {
font-size: $font-sm;
}
.text-hidden {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
.goods-row {
background: #fff;
padding: 16rpx;
>.goods-col {
display: flex;
>.goods-img {
overflow: hidden;
flex: 4;
}
>.goods-detail {
flex: 7;
}
}
}
.goods-detail {
margin: 0 20rpx;
>.title {
font-size: $font-base;
color: $font-color-dark;
line-height: 1.5;
height: 86rpx;
padding: 10rpx 0 0;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
overflow: hidden;
}
.promotion {
margin-top: 4rpx;
display: flex;
div {
span {
font-size: 24rpx;
color: $light-color;
margin-right: 10rpx;
padding: 0 4rpx;
border-radius: 2rpx;
}
}
}
.store-seller-name {
color: #666;
overflow: hidden;
display: flex;
justify-content: space-between;
}
.count-config {
padding: 5rpx 0;
color: #666;
display: flex;
font-size: 24rpx;
justify-content: space-between;
}
>.price-box {
margin-top: 10rpx;
display: flex;
align-items: center;
justify-content: space-between;
padding-right: 10rpx;
font-size: 24rpx;
color: $font-color-light;
>.price {
font-size: 26rpx;
line-height: 1;
color: $main-color;
font-weight: bold;
/deep/ span:nth-of-type(1) {
font-size: 38rpx;
}
}
}
}
</style>

View File

@@ -0,0 +1,170 @@
<template>
<div>
<div v-for="(item, index) in res" :key="index" class="goods-row" @click="navigateToDetailPage(item)">
<div class="flex goods-col">
<div class="goods-img">
<u-image width="230rpx" mode="aspectFit" border-radius='16' height="230rpx" :src="item.goodsImage || item.thumbnail">
<u-loading slot="loading"></u-loading>
</u-image>
</div>
<div class="goods-detail">
<div class="title clamp3">{{ item.goodsName }}</div>
<div class='flex flex-a-c flex-j-sb'>
<view class="price-box">
<!-- 秒杀 / 拼团 -->
<div class="price" v-if="!type && item.price!=undefined">
¥<span>{{ $options.filters.goodsFormatPrice(item.price )[0] }} </span>.{{
$options.filters.goodsFormatPrice(item.price )[1]
}}
</div>
<!-- 砍价 -->
<div class="price" v-if="type && item.purchasePrice!=undefined">
最低
¥<span>{{ $options.filters.goodsFormatPrice(item.purchasePrice )[0] }} </span>.{{
$options.filters.goodsFormatPrice(item.purchasePrice )[1]
}}
</div>
<!-- 兜底策略如果金额是0 -->
<div class="price" v-if="!item.price && !type">
¥<span>0 </span>.00
</div>
</view>
<div>
<image class='buy' :src="buy"></image>
</div>
</div>
<div class='count-config' v-if="!type">
<span>即将恢复{{ item.originalPrice}}</span>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import commonTpl from '@/components/m-goods-list/common'
export default {
data() {
return {
lightColor: this.$mainColor,
buy: require('@/static/buy.png')
}
},
mixins: [commonTpl],
props: {
// 遍历的数据
res: {
type: Array,
default: () => {
return []
}
},
type:{
type:null,
default:""
}
},
methods: {
// 跳转到商品详情
navigateToDetailPage(item) {
if(this.type == 'kanJia'){
uni.navigateTo({
url: `/pages/promotion/bargain/detail?id=${item.id}`,
});
return
}
uni.navigateTo({
url: `/pages/product/goods?id=${item.skuId}&goodsId=${item.goodsId}`,
});
},
}
}
</script>
<style lang='scss' scoped>
.buy {
width: 152rpx;
height: 108rpx;
}
.flex-j-sb {
width: 100%;
}
.goods-row {
background: #fff;
padding: 16rpx;
>.goods-col {
display: flex;
>.goods-img {
overflow: hidden;
flex: 4;
}
>.goods-detail {
flex: 7;
}
}
}
.goods-detail {
margin: 0 20rpx;
>.title {
font-size: $font-base;
color: $font-color-dark;
line-height: 1.5;
height: 86rpx;
padding: 10rpx 0 0;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
overflow: hidden;
}
.promotion {
margin-top: 4rpx;
display: flex;
div {
span {
font-size: 24rpx;
color: $light-color;
margin-right: 10rpx;
padding: 0 4rpx;
border-radius: 2rpx;
}
}
}
.count-config {
padding: 5rpx 0;
color: #666;
display: flex;
font-size: 24rpx;
letter-spacing:2rpx;
padding-left: 10rpx;
}
}
.price-box {
margin-top: 10rpx;
display: flex;
align-items: center;
justify-content: space-between;
padding-right: 10rpx;
font-size: 24rpx;
color: $font-color-light;
>.price {
font-size: 26rpx;
line-height: 1;
color: $main-color;
font-weight: bold;
/deep/ span:nth-of-type(1) {
font-size: 48rpx;
}
}
}
</style>

View File

@@ -1,27 +1,11 @@
<template> <template>
<div> <div>
<div class="goods-recommend">{{title ? `--${title}-- `:''}}</div> <div class="goods-recommend">{{title ? `--${title}-- `:''}}</div>
<div class="goods-list"> <goodsTemplate :res='goodsList' />
<div @click="handleClick(item)" class="goods-item" v-for="(item, item_index) in goodsList" :key="item_index">
<div class="goods-img">
<u-image :src="item.content.thumbnail" mode="aspectFill" height="350rpx" width="100%">
<u-loading slot="loading"></u-loading>
</u-image>
</div>
<div class="goods-desc">
<div class="goods-title">
{{ item.content.goodsName }}
</div>
<div class="goods-bottom">
<div class="goods-price">{{ item.content.price | unitPrice }}</div>
</div>
</div>
</div>
</div>
</div> </div>
</template> </template>
<script> <script>
import goodsTemplate from '@/components/m-goods-list/list'
import { getGoodsList } from "@/api/goods.js"; import { getGoodsList } from "@/api/goods.js";
export default { export default {
data() { data() {
@@ -50,6 +34,7 @@ export default {
default: "", default: "",
}, },
}, },
components:{goodsTemplate},
mounted() { mounted() {
this.initGoods(); this.initGoods();
}, },
@@ -74,11 +59,11 @@ export default {
} }
}); });
let goodsList = await getGoodsList(submit); let goodsList = await getGoodsList(submit);
this.goodsList.push(...goodsList.data.result.content); this.goodsList.push(...goodsList.data.result.records);
}, },
handleClick(item) { handleClick(item) {
uni.navigateTo({ uni.navigateTo({
url: `/pages/product/goods?id=${item.content.id}&goodsId=${item.content.goodsId}`, url: `/pages/product/goods?id=${item.id}&goodsId=${item.goodsId}`,
}); });
}, },
}, },

View File

@@ -121,7 +121,15 @@ export default {
* 回退到上一级 * 回退到上一级
*/ */
onClickLeft() { onClickLeft() {
uni.navigateBack(); const paths = getCurrentPages();
console.log(paths)
if(paths.length > 1){
uni.navigateBack();
}else{
uni.switchTab({
url:"/pages/tabbar/home/index"
})
}
}, },
/** /**

View File

@@ -8,7 +8,7 @@
<view class="share-list"> <view class="share-list">
<!-- #ifdef MP-WEIXIN --> <!-- #ifdef MP-WEIXIN -->
<view class="share-item"> <view class="share-item">
<button class="share-btn" open-type="share"> <button class="share-btn" @click="weChatShare" open-type="share">
<u-icon color="#04BE02" size="80" name="weixin-fill"></u-icon>微信好友 <u-icon color="#04BE02" size="80" name="weixin-fill"></u-icon>微信好友
</button> </button>
</view> </view>
@@ -19,7 +19,7 @@
<view>{{ item.title }}</view> <view>{{ item.title }}</view>
</view> </view>
<!-- #endif --> <!-- #endif -->
<!-- #ifdef H5 --> <!-- #ifdef H5 -->
<view class="share-item" @click="copyLink()"> <view class="share-item" @click="copyLink()">
<u-icon color="#b4aee8" size="80" name="share-fill"></u-icon> <u-icon color="#b4aee8" size="80" name="share-fill"></u-icon>
<view>{{ '复制链接' }}</view> <view>{{ '复制链接' }}</view>
@@ -62,6 +62,16 @@ export default {
close() { close() {
this.$emit("close"); this.$emit("close");
}, },
weChatShare(){
this.$u.mpShare = {
title: this.shareTitle(), // 默认为小程序名称,可自定义
path: '', // 默认为当前页面路径一般无需修改QQ小程序不支持
// 分享图标,路径可以是本地文件路径、代码包文件路径或者网络图片路径。
// 支持PNG及JPG默认为当前页面的截图
imageUrl: this.thumbnail ||''
}
},
// h5复制链接 // h5复制链接
// #ifdef H5 // #ifdef H5
copyLink() { copyLink() {
@@ -73,33 +83,20 @@ export default {
this.configs.shareLink + this.configs.shareLink +
getCurrentPages()[getCurrentPages().length - 1].__page__.fullPath; getCurrentPages()[getCurrentPages().length - 1].__page__.fullPath;
} }
if (content === null || content === undefined) { this.$options.filters.setClipboard(content)
content = "";
} else content = content + "";
const result = h5Copy(content);
if (result === false) {
uni.showToast({
title: "不支持",
});
} else {
uni.showToast({
title: "复制成功",
icon: "none",
});
}
}, },
// #endif // #endif
shareTitle() { shareTitle() {
let shareTitle; let shareTitle;
if (this.type == "goods") { if (this.type == "goods") {
shareTitle = `我发现了一个${this.goodsName}商品快来跟我一起看看吧`; shareTitle = `[好友推荐]${this.goodsName}快来跟我一起看看吧`;
} else if (this.type == "shops") { } else if (this.type == "shops") {
shareTitle = `我发现了一个${this.goodsName}店铺快来跟我一起看看吧`; shareTitle = `[好友发现]${this.goodsName}快来跟我一起看看吧`;
} else if (this.type == "pintuan") { } else if (this.type == "pintuan") {
shareTitle = `我拼了一个${this.goodsName}快来跟我一起抢购吧!`; shareTitle = `[好友邀请]${this.goodsName}快来跟我一起抢购吧!`;
} else if (this.type == "kanjia") { } else if (this.type == "kanjia") {
shareTitle = `请快来帮我砍一刀${this.goodsName}`; shareTitle = `[好友邀请]请快来帮我砍一刀${this.goodsName}`;
} }
return shareTitle; return shareTitle;
}, },

View File

@@ -0,0 +1,34 @@
<template>
<div>
<u-popup v-model="show" mode="bottom" height="800rpx" border-radius="14">
<div class="wrapper">
<view class="down-goods-tips">该商品已下架</view>
<scroll-view scroll-y="true" style="height: 670rpx">
<goodsRecommend title="其他商品" />
</scroll-view>
</div>
</u-popup>
</div>
</template>
<script>
import goodsRecommend from "@/components/m-goods-recommend/index.vue";
export default {
data() {
return {
show: true, // 是否显示
};
},
components: { goodsRecommend },
};
</script>
<style lang="scss" scoped>
.down-goods-tips {
font-size: 36rpx;
text-align: center;
font-weight: bold;
padding: 40rpx 0;
}
</style>

View File

@@ -0,0 +1,220 @@
<template>
<view class="uni-numbox">
<view @click="_calcValue('minus')" class="uni-numbox__minus uni-numbox-btns" :style="{background}">
<text class="uni-numbox--text" :class="{ 'uni-numbox--disabled': inputValue <= min || disabled }" :style="{color}">-</text>
</view>
<input :disabled="disabled" @focus="_onFocus" @blur="_onBlur" class="uni-numbox__value" type="number"
v-model="inputValue" :style="{background, color}" />
<view @click="_calcValue('plus')" class="uni-numbox__plus uni-numbox-btns" :style="{background}">
<text class="uni-numbox--text" :class="{ 'uni-numbox--disabled': inputValue >= max || disabled }" :style="{color}">+</text>
</view>
</view>
</template>
<script>
/**
* NumberBox 数字输入框
* @description 带加减按钮的数字输入框
* @tutorial https://ext.dcloud.net.cn/plugin?id=31
* @property {Number} value 输入框当前值
* @property {Number} min 最小值
* @property {Number} max 最大值
* @property {Number} step 每次点击改变的间隔大小
* @property {String} background 背景色
* @property {String} color 字体颜色(前景色)
* @property {Boolean} disabled = [true|false] 是否为禁用状态
* @event {Function} change 输入框值改变时触发的事件,参数为输入框当前的 value
* @event {Function} focus 输入框聚焦时触发的事件,参数为 event 对象
* @event {Function} blur 输入框失焦时触发的事件,参数为 event 对象
*/
export default {
name: "UniNumberBox",
emits: ['change', 'input', 'update:modelValue', 'blur', 'focus'],
props: {
value: {
type: [Number, String],
default: 1
},
modelValue: {
type: [Number, String],
default: 1
},
min: {
type: Number,
default: 0
},
max: {
type: Number,
default: 100
},
step: {
type: Number,
default: 1
},
background: {
type: String,
default: '#f5f5f5'
},
color: {
type: String,
default: '#333'
},
disabled: {
type: Boolean,
default: false
}
},
data() {
return {
inputValue: 0
};
},
watch: {
value(val) {
this.inputValue = +val;
},
modelValue(val) {
this.inputValue = +val;
}
},
created() {
if (this.value === 1) {
this.inputValue = +this.modelValue;
}
if (this.modelValue === 1) {
this.inputValue = +this.value;
}
},
methods: {
_calcValue(type) {
if (this.disabled) {
return;
}
const scale = this._getDecimalScale();
let value = this.inputValue * scale;
let step = this.step * scale;
if (type === "minus") {
value -= step;
if (value < (this.min * scale)) {
return;
}
if (value > (this.max * scale)) {
value = this.max * scale
}
}
if (type === "plus") {
value += step;
if (value > (this.max * scale)) {
return;
}
if (value < (this.min * scale)) {
value = this.min * scale
}
}
this.inputValue = (value / scale).toFixed(String(scale).length - 1);
this.$emit("change", +this.inputValue);
// TODO vue2 兼容
this.$emit("input", +this.inputValue);
// TODO vue3 兼容
this.$emit("update:modelValue", +this.inputValue);
},
_getDecimalScale() {
let scale = 1;
// 浮点型
if (~~this.step !== this.step) {
scale = Math.pow(10, String(this.step).split(".")[1].length);
}
return scale;
},
_onBlur(event) {
this.$emit('blur', event)
let value = event.detail.value;
if (!value) {
// this.inputValue = 0;
return;
}
value = +value;
if (value > this.max) {
value = this.max;
} else if (value < this.min) {
value = this.min;
}
const scale = this._getDecimalScale();
this.inputValue = value.toFixed(String(scale).length - 1);
this.$emit("change", +this.inputValue);
this.$emit("input", +this.inputValue);
},
_onFocus(event) {
this.$emit('focus', event)
}
}
};
</script>
<style lang="scss" scoped>
$box-height: 48rpx;
$bg: #f5f5f5;
$br: 4rpx;
$color: #333;
.uni-numbox {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: row;
}
.uni-numbox-btns {
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: row;
align-items: center;
justify-content: center;
padding: 0 8px;
background-color: $bg;
/* #ifdef H5 */
cursor: pointer;
/* #endif */
}
.uni-numbox__value {
margin: 0 4rpx;
background-color: $bg;
width: 70rpx;
height: $box-height;
text-align: center;
font-size: 24rpx;
border-left-width: 0;
border-right-width: 0;
color: $color;
}
.uni-numbox__minus {
border-top-left-radius: $br;
border-bottom-left-radius: $br;
}
.uni-numbox__plus {
border-top-right-radius: $br;
border-bottom-right-radius: $br;
}
.uni-numbox--text {
// fix nvue
line-height: 40rpx;
font-size: 40rpx;
font-weight: 300;
color: $color;
}
.uni-numbox .uni-numbox--disabled {
color: #c0c0c0 !important;
/* #ifdef H5 */
cursor: not-allowed;
/* #endif */
}
</style>

View File

@@ -29,7 +29,8 @@ export default {
}); });
}); });
}, },
fail() { fail(e) {
console.log(e)
that.$emit("close"); that.$emit("close");
}, },
}); });

View File

@@ -1,39 +1,87 @@
<template> <template>
<view> <view>
<view v-if="!hid" class="flex-row-center" :style="{ top: scHight }" style="width: 750rpx; position: fixed; z-index: 100; left: 0"> <view
<view class="flex-column-center" style="background-color: #fcfcfc; padding: 30rpx; border-radius: 10rpx"> v-if="!hid"
<movable-area class="flex" style="width: 100%" animation="false" :style="{ height: originalHeight }"> class="flex-row-center"
<movable-view scale-value="1" animation="false" damping="5000" :x="moveX" :style="{ :style="{ top: scHight }"
style="width: 750rpx; position: fixed; z-index: 100; left: 0"
>
<view
class="flex-column-center"
style="background-color: #fcfcfc; padding: 30rpx; border-radius: 10rpx"
>
<movable-area
class="flex"
style="width: 100%"
animation="false"
:style="{ height: originalHeight }"
>
<movable-view
scale-value="1"
animation="false"
damping="5000"
:x="moveX"
:style="{
height: sliderHeight, height: sliderHeight,
width: sliderWidth, width: sliderWidth,
'z-index': 101, 'z-index': 101,
}" direction="horizontal"> }"
<image :src="imgbk" class="image" mode="aspectFit" :style="{ direction="horizontal"
>
<image
:src="imgbk"
class="image"
mode="aspectFit"
:style="{
height: sliderHeight, height: sliderHeight,
width: sliderWidth, width: sliderWidth,
'margin-top': imgbKH, 'margin-top': imgbKH,
}"></image> }"
></image>
</movable-view> </movable-view>
<image :src="img" mode="aspectFit" :style="{ height: originalHeight, width: originalWidth }" style="border-radius: 10rpx"></image> <image
:src="img"
mode="aspectFit"
:style="{ height: originalHeight, width: originalWidth }"
style="border-radius: 10rpx"
></image>
</movable-area> </movable-area>
<movable-area class="flex-row-start" style=" <movable-area
class="flex-row-start"
style="
width: 100%; width: 100%;
background-color: #efefef; background-color: #efefef;
height: 80rpx; height: 80rpx;
border-radius: 40rpx; border-radius: 40rpx;
margin-top: 30rpx; margin-top: 30rpx;
"> "
<movable-view scale-value="1" animation="false" damping="50" :x="movePv" class="flex-row-center" style=" >
<movable-view
scale-value="1"
animation="false"
damping="50"
:x="movePv"
class="flex-row-center"
style="
border-radius: 50%; border-radius: 50%;
height: 100rpx; height: 100rpx;
width: 100rpx; width: 100rpx;
background-color: #ffffff; background-color: #ffffff;
border: 2rpx solid #e3e3e3; border: 2rpx solid #e3e3e3;
margin-top: -13rpx; margin-top: -13rpx;
" direction="horizontal" @change="moveChange" @touchend="end"> "
<view :class="endLoad ? 'cuIcon-right' : 'cuIcon-loading turn-load'" class="loadIcon" style=""> direction="horizontal"
</view> @change="moveChange"
@touchend="end"
>
<u-icon
:color="mainColor"
size="40"
v-if="endLoad"
name="arrow-right"
></u-icon>
<u-icon :color="mainColor" size="40" v-else name="reload"></u-icon>
</movable-view> </movable-view>
<text style="padding-left: 140rpx" :style="{ color: col }">{{ <text style="padding-left: 140rpx" :style="{ color: col }">{{
@@ -41,15 +89,20 @@
}}</text> }}</text>
</movable-area> </movable-area>
<view class="flex-row-around padding-top" style="width: 100%"> <view class="flex-row-around padding-top" style="width: 100%">
<view @click="hide" class="cuIcon-close" style="font-size: 50rpx; color: #e25915"> <u-icon
</view> @click="hide"
:color="mainColor"
size="40"
name="close"
></u-icon>
<text class="cu-tag bg-cyan round" @click="getCode">刷新拼图</text> <text class="cu-tag round" @click="getCode">刷新拼图</text>
<text class="my-neirong-sm cuIcon-safe" style="color: #c1c1c1">Lili-FRAMEWORK</text> <text class="my-neirong-sm cuIcon-safe" style="color: #c1c1c1"
>Lili-FRAMEWORK</text
>
</view> </view>
</view> </view>
</view> </view>
</view> </view>
</template> </template>
@@ -90,6 +143,7 @@ export default {
}, },
data() { data() {
return { return {
mainColor: this.$mainColor,
flage: false, flage: false,
key: "", //key key: "", //key
vsrtx: "点击进行验证", //按钮提示语 vsrtx: "点击进行验证", //按钮提示语
@@ -144,7 +198,7 @@ export default {
storage.setUuid(uuid.v1()); storage.setUuid(uuid.v1());
} }
uni.request({ uni.request({
url: api.common + "/slider/" + this.business, url: api.common + "/common/slider/" + this.business,
header: { header: {
uuid: storage.getUuid(), uuid: storage.getUuid(),
}, },
@@ -179,7 +233,7 @@ export default {
method: "POST", method: "POST",
url: url:
api.common + api.common +
"/slider/" + "/common/slider/" +
this.business + this.business +
"?xPos=" + "?xPos=" +
parseInt(this.moveCode * this.tl), parseInt(this.moveCode * this.tl),
@@ -252,10 +306,6 @@ export default {
.border-index { .border-index {
border: 1rpx solid $main-color; border: 1rpx solid $main-color;
} }
.loadIcon {
color: $main-color;
font-size: 40rpx;
}
.status_bar { .status_bar {
height: var(--status-bar-height); height: var(--status-bar-height);

View File

@@ -4,12 +4,16 @@
*/ */
// 开发环境 // 开发环境
const dev = { const dev = {
im: "https://im-api.pickmall.cn",
common: "https://common-api.pickmall.cn", common: "https://common-api.pickmall.cn",
buyer: "https://buyer-api.pickmall.cn", buyer: "https://buyer-api.pickmall.cn",
// common: "http://192.168.0.113:8890",
// buyer: "http://192.168.0.113:8888",
// im: "http://192.168.0.113:8885",
}; };
// 生产环境 // 生产环境
const prod = { const prod = {
im: "https://im-api.pickmall.cn",
common: "https://common-api.pickmall.cn", common: "https://common-api.pickmall.cn",
buyer: "https://buyer-api.pickmall.cn", buyer: "https://buyer-api.pickmall.cn",
}; };
@@ -29,6 +33,7 @@ api = prod;
api.buyer += "/buyer"; api.buyer += "/buyer";
api.common += "/common"; api.common += "/common";
api.im += "/im";
export default { export default {
...api, ...api,
}; };

View File

@@ -1,16 +1,27 @@
const name = "lilishop"; //全局商城name const name = "lilishop"; //全局商城name
const schemeName = 'lilishop' //唤醒app需要的schemeName const schemeName = "lilishop"; //唤醒app需要的schemeName
export default { export default {
name: name, name: name,
schemeLink: `${schemeName}://`, //唤起app地址 schemeLink: `${schemeName}://`, //唤起app地址
downloadLink: "https://pickmall.cn/download-page/index.html", //下载地址下载app的地址 downloadLink: "https://pickmall.cn/download-page/index.html", //下载地址下载app的地址
shareLink: "https://m-b2b2c.pickmall.cn", //分享地址也就是在h5中默认的复制地址 shareLink: "https://m-b2b2c.pickmall.cn", //分享地址也就是在h5中默认的复制地址
appid: "wx6f10f29075dc1b0b", //小程序唯一凭证,即 AppID可在「微信公众平台 - 设置 - 开发设置」页中获得。(需要已经成为开发者,且帐号没有异常状态) appid: "wx6f10f29075dc1b0b", //小程序唯一凭证,即 AppID可在「微信公众平台 - 设置 - 开发设置」页中获得。(需要已经成为开发者,且帐号没有异常状态)
appSecret: "6dfbe0c72380dce5d49d65b3c91059b1", //可在 manifest.json 查看 aMapKey: "1f78544934b66c9fbc0104117f663973", //在高德中申请Web服务key
aMapKey: "d649892b3937a5ad20b76dacb2bcb5bd", //在高德中申请web端key scanAuthNavigation: ["https://m-b2b2c.pickmall.cn/"], //扫码认证跳转域名配置 会根据此处配置的路由进行跳转
scanAuthNavigation:['https://m-b2b2c.pickmall.cn/'], //扫码认证跳转域名配置 会根据此处配置的路由进行跳转 iosAppId: "id1564638363", //AppStore的应用地址id 具体在分享->拷贝链接中查看
iosAppId:"id1564638363", //AppStore的应用地址id 具体在分享->拷贝链接中查看 logo: "https://lilishop-oss.oss-cn-beijing.aliyuncs.com/4c864e133c2944efad1f7282ac8a3b9e.png", //logo地址
logo:"https://lilishop-oss.oss-cn-beijing.aliyuncs.com/4c864e133c2944efad1f7282ac8a3b9e.png", //logo地址 customerServiceMobile: "13161366885", //客服电话
customerServiceMobile:"13161366885", //客服电话 customerServiceEmail: "lili@lili.com", //客服邮箱
customerServiceEmail:"lili@lili.com" //客服邮箱 imWebSrc: "https://im.pickmall.cn", //IM地址
}; baseWsUrl: "wss://im-api.pickmall.cn/lili/webSocket", // IM WS 地址
enableGetClipboard: false, //是否启用粘贴板获取 scanAuthNavigation 中的链接,如果匹配则会跳转到对应页面
enableMiniBarStartUpApp: true, //是否在h5中右侧浮空按钮点击启动app
/**
* 如需更换主题请修改此处以及uni.scss中的全局颜色
*/
mainColor: "#ff3c2a", // 主题色
lightColor: "#ff6b35", // 高亮主题色
aiderLightColor: "#ff9f28", // 辅助高亮颜色
defaultUserPhoto: "/static/missing-face.png", // 默认用户头像
enableFetchMobileLogin: false // 是否启用获取手机号登录 如果微信小程序提示封禁手机号获取权限 可将此选项设置成false作为备用登录方案
};

View File

@@ -7,8 +7,8 @@
* @param {sn,price} * @param {sn,price}
*/ */
import { initiatePay } from "@/api/trade";
import { getWeChatMpMessage } from "@/api/message.js"; import { getWeChatMpMessage } from "@/api/message.js";
import { initiatePay } from "@/api/trade";
class LiLiWXPay { class LiLiWXPay {
constructor(...payList) { constructor(...payList) {
this.data = payList[0]; this.data = payList[0];
@@ -65,52 +65,40 @@ class LiLiWXPay {
} }
function sendMessage(price) { function sendMessage(price) {
//判断用户是否已经进行了订阅
if (!uni.getStorageSync("acceptSubscribeMessage")) {
//订阅消息 //订阅消息
getWeChatMpMessage().then((res) => { getWeChatMpMessage().then((res) => {
var message = res.data.result; var message = res.data.result;
var templateid = message.map((item) => item.code); var templateid = message.map((item) => item.code);
uni.requestSubscribeMessage({ uni.requestSubscribeMessage({
tmplIds: templateid, tmplIds: templateid,
success: (res) => { success: (res) => {
for (let key in res) {
// 表示用户拒绝订阅该信息 },
if (res[key] == "reject") { fail: (res) => {
this.checked = false; console.log('fail', res)
} else { uni.showToast({
uni.setStorageSync("acceptSubscribeMessage", res); icon: "none",
} title: "订阅消息失败",
} })
}, },
fail: (res) => { complete: (res) => {
uni.removeStorageSync("acceptSubscribeMessage"); console.log('complete', res)
this.checked = false;
}, /**
complete: () => { * 已经支付成功
/** */
* 已经支付成功 uni.redirectTo({
*/ url:
uni.redirectTo({ "/pages/cart/payment/success?paymentMethod=WECHAT" +
url: "&payPrice=" +
"/pages/cart/payment/success?paymentMethod=WECHAT" + price,
"&payPrice=" + });
price, },
});
},
});
}); });
} else { });
/**
* 已经支付成功
*/
uni.redirectTo({
url:
"/pages/cart/payment/success?paymentMethod=WECHAT" +
"&payPrice=" +
price,
});
}
} }
export default LiLiWXPay; export default LiLiWXPay;

77
js_sdk/t-jwt/jwt.js Normal file
View File

@@ -0,0 +1,77 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
var b64re = /^(?:[A-Za-z\d+\/]{4})*?(?:[A-Za-z\d+\/]{2}(?:==)?|[A-Za-z\d+\/]{3}=?)?$/;
exports.weBtoa = function (string) {
string = String(string);
var bitmap, a, b, c, result = "", i = 0, rest = string.length % 3;
for (; i < string.length;) {
if ((a = string.charCodeAt(i++)) > 255 ||
(b = string.charCodeAt(i++)) > 255 ||
(c = string.charCodeAt(i++)) > 255)
throw new TypeError("Failed to execute 'btoa' on 'Window': The string to be encoded contains characters outside of the Latin1 range.");
bitmap = (a << 16) | (b << 8) | c;
result += b64.charAt(bitmap >> 18 & 63) + b64.charAt(bitmap >> 12 & 63) +
b64.charAt(bitmap >> 6 & 63) + b64.charAt(bitmap & 63);
}
return rest ? result.slice(0, rest - 3) + "===".substring(rest) : result;
};
exports.weAtob = function (string) {
string = String(string).replace(/[\t\n\f\r ]+/g, "");
if (!b64re.test(string))
throw new TypeError("Failed to execute 'atob' on 'Window': The string to be decoded is not correctly encoded.");
string += "==".slice(2 - (string.length & 3));
var bitmap, result = "", r1, r2, i = 0;
for (; i < string.length;) {
bitmap = b64.indexOf(string.charAt(i++)) << 18 | b64.indexOf(string.charAt(i++)) << 12 |
(r1 = b64.indexOf(string.charAt(i++))) << 6 | (r2 = b64.indexOf(string.charAt(i++)));
result += r1 === 64 ? String.fromCharCode(bitmap >> 16 & 255) :
r2 === 64 ? String.fromCharCode(bitmap >> 16 & 255, bitmap >> 8 & 255) :
String.fromCharCode(bitmap >> 16 & 255, bitmap >> 8 & 255, bitmap & 255);
}
return result;
};
function b64DecodeUnicode(str) {
return decodeURIComponent(exports.weAtob(str).replace(/(.)/g, function (p) {
var code = p.charCodeAt(0).toString(16).toUpperCase();
if (code.length < 2) {
code = "0" + code;
}
return "%" + code;
}));
}
function base64_url_decode(str) {
var output = str.replace(/-/g, "+").replace(/_/g, "/");
switch (output.length % 4) {
case 0:
break;
case 2:
output += "==";
break;
case 3:
output += "=";
break;
default:
throw "Illegal base64url string!";
}
try {
return b64DecodeUnicode(output);
}
catch (err) {
return exports.weAtob(output);
}
}
function weappJwtDecode(token, options) {
if (typeof token !== "string") {
throw ("Invalid token specified");
}
options = options || {};
var pos = options.header === true ? 0 : 1;
try {
return JSON.parse(base64_url_decode(token.split(".")[pos]));
}
catch (e) {
throw ("Invalid token specified: " + e.message);
}
}
exports.default = weappJwtDecode;

22
main.js
View File

@@ -3,19 +3,24 @@ import App from "./App";
import * as filters from "./utils/filters.js"; // global filter import * as filters from "./utils/filters.js"; // global filter
import uView from "uview-ui"; import uView from "uview-ui";
import store from "./store"; import store from "./store";
import config from '@/config/config';
import airBtn from "@/components/m-airbtn/index.vue";
import socketIO from './pages/mine/im/socket';
/** /**
* 仅在h5中显示唤醒app功能 * 仅在h5中显示唤醒app功能
* 在h5页面手动挂载 * 在h5页面手动挂载
* *
*/ */
// #ifdef H5 // #ifdef H5
import airBtn from "@/components/m-airbtn/index.vue"; if (config.enableMiniBarStartUpApp) {
let btn = Vue.component("airBtn", airBtn); //全局注册 let btn = Vue.component("airBtn", airBtn); //全局注册
document.body.appendChild(new btn().$mount().$el); document.body.appendChild(new btn().$mount().$el);
}
// #endif // #endif
// 引入uView对小程序分享的mixin封装
let mpShare = require('uview-ui/libs/mixin/mpShare.js');
Vue.mixin(mpShare)
/** /**
* 全局filters * 全局filters
@@ -27,6 +32,7 @@ Object.keys(filters).forEach((key) => {
// 引入Vuex // 引入Vuex
Vue.prototype.$store = store; Vue.prototype.$store = store;
// Vue.prototype.socketIo = new socketIO();
Vue.use(uView); Vue.use(uView);
Vue.config.productionTip = false; Vue.config.productionTip = false;
@@ -38,11 +44,11 @@ Vue.config.productionTip = false;
* 如需更换主题请修改此处以及uni.scss中的全局颜色 * 如需更换主题请修改此处以及uni.scss中的全局颜色
*/ */
// 主题色 // 主题色
Vue.prototype.$mainColor = "#ff3c2a"; Vue.prototype.$mainColor = config.mainColor;
// 高亮主题色 // 高亮主题色
Vue.prototype.$lightColor = "#ff6b35"; Vue.prototype.$lightColor = config.lightColor;
// 辅助高亮颜色 // 辅助高亮颜色
Vue.prototype.$aiderLightColor = "#ff9f28"; Vue.prototype.$aiderLightColor = config.aiderLightColor;
App.mpType = "app"; App.mpType = "app";

View File

@@ -1,9 +1,9 @@
{ {
"name" : "lili商城", "name" : "lilishop",
"appid" : "__UNI__C100675", "appid" : "__UNI__ED807EA",
"description" : "", "description" : "",
"versionName" : "4.0.47", "versionName" : "4.5.3",
"versionCode" : 4000047, "versionCode" : 4000503,
"transformPx" : false, "transformPx" : false,
"app-plus" : { "app-plus" : {
"compatible" : { "compatible" : {
@@ -63,8 +63,19 @@
"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>" "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
], ],
"abiFilters" : [ "armeabi-v7a", "arm64-v8a", "x86" ], "abiFilters" : [ "armeabi-v7a", "arm64-v8a", "x86" ],
"schemes" : "lilishop" "schemes" : "lilishop",
//安卓自添加 权限 应用市场 过度索取权限
"permissionExternalStorage" : {
"request" : "none",
"prompt" : "应用保存运行状态等信息,需要获取读写手机存储(系统提示为访问设备上的照片、媒体内容和文件)权限,请允许。"
},
"permissionPhoneState" : {
"request" : "none",
"prompt" : "为保证您正常、安全地使用,需要获取设备识别码(部分手机提示为获取手机号码)使用权限,请允许"
},
"autoSdkPermissions" : false
}, },
//安卓自添加 权限 应用市场 过度索取权限
"ios" : { "ios" : {
"idfa" : false, "idfa" : false,
"privacyDescription" : { "privacyDescription" : {
@@ -75,7 +86,8 @@
"NSLocationAlwaysAndWhenInUseUsageDescription" : "位置信息将用于高德地图的效果展示", "NSLocationAlwaysAndWhenInUseUsageDescription" : "位置信息将用于高德地图的效果展示",
"NSMicrophoneUsageDescription" : "用户上传视频时需使用音频信息" "NSMicrophoneUsageDescription" : "用户上传视频时需使用音频信息"
}, },
"urltypes" : "lilishop" "urltypes" : "lilishop",
"dSYMs" : false
}, },
/* ios */ /* ios */
"sdkConfigs" : { "sdkConfigs" : {
@@ -194,16 +206,13 @@
"desc" : "位置信息将用于高德地图的效果展示" "desc" : "位置信息将用于高德地图的效果展示"
} }
}, },
"plugins" : { "plugins" : {},
"myPlugin" : { // 直播插件注释
"version" : "1.1.0", // "live-player-plugin" : {
"provider" : "wx738958e0f4c894f9" // "version" : "1.3.0",
}, // "provider" : "wx2b03c6e691cd7370"
"live-player-plugin" : { // }
"version" : "1.3.0", "requiredPrivateInfos" : [ "chooseLocation", "getLocation" ]
"provider" : "wx2b03c6e691cd7370"
}
}
}, },
"h5" : { "h5" : {
"devServer" : { "devServer" : {

View File

@@ -14,12 +14,31 @@
"enablePullDownRefresh":true "enablePullDownRefresh":true
} }
}, },
{
"path":"pages/tabbar/screen/fullScreen",
"style": {
"navigationStyle": "custom", // 隐藏系统导航栏
"app-plus":{
"animationType": "fade-in", // 设置fade-in淡入动画为最合理的动画类型
"background": "transparent", // 背景透明
"backgroundColor": "rgba(0,0,0,0)", // 背景透明
"popGesture": "none" // 关闭IOS屏幕左边滑动关闭当前页面的功能
}
}
},
{
"path": "pages/tabbar/home/title",
"style": {
"navigationBarTitleText": "消息"
}
},
{ {
"path": "pages/tabbar/cart/cartList", "path": "pages/tabbar/cart/cartList",
"style": { "style": {
"navigationBarTitleText": "购物车", "navigationBarTitleText": "购物车",
"navigationBarBackgroundColor": "#fff" "navigationStyle": "custom", // 隐藏系统导航栏
"navigationBarBackgroundColor": "#fff",
"enablePullDownRefresh":true //实现下拉刷新样式
} }
}, { }, {
@@ -67,6 +86,12 @@
"style": { "style": {
} }
},
{
"path": "pages/tabbar/special/special",
"style": {
"navigationBarTitleText": "专题"
}
} }
], ],
@@ -86,21 +111,14 @@
"style": { "style": {
"navigationBarTitleText": "我的足迹", "navigationBarTitleText": "我的足迹",
"enablePullDownRefresh": true, "enablePullDownRefresh": true,
"app-plus": { "navigationStyle": "custom"
"titleNView": {
"buttons": [{
"text": "编辑",
"fontSize": "14"
}]
}
}
} }
}, { }, {
"path": "myCollect", "path": "myCollect",
"style": { "style": {
"navigationBarTitleText": "收藏", "navigationBarTitleText": "收藏",
"enablePullDownRefresh": true, //下拉刷新 "enablePullDownRefresh": true, //下拉刷新
"navigationStyle": "custom",
"app-plus": { "app-plus": {
"scrollIndicator": "none" "scrollIndicator": "none"
} }
@@ -208,6 +226,13 @@
"navigationBarTitleText": "地址管理" "navigationBarTitleText": "地址管理"
} }
}, },
{
"path": "address/storeAddress",
"style": {
"enablePullDownRefresh": true,
"navigationBarTitleText": "自提点"
}
},
{ {
"path": "address/add", "path": "address/add",
"style": { "style": {
@@ -239,6 +264,8 @@
"navigationBarTitleText": "面容登录" "navigationBarTitleText": "面容登录"
} }
}, },
{ {
"path": "set/securityCenter/editPassword", "path": "set/securityCenter/editPassword",
"style": { "style": {
@@ -248,8 +275,37 @@
} }
} }
}, },
{
"path": "set/securityCenter/bindMobile",
"style": {
"navigationBarTitleText": "绑定手机号",
"app-plus": {
}
}
},
{
"path": "im/list",
"style": {
"navigationStyle": "custom", // 隐藏系统导航栏
"enablePullDownRefresh": true,
"app-plus": {
}
}
},
{
"path": "im/index",
"style": {
"navigationStyle": "custom", // 隐藏系统导航栏
"enablePullDownRefresh": true,
"app-plus": {
}
}
},
{ {
"path": "set/feedBack", "path": "set/feedBack",
"style": { "style": {
@@ -342,6 +398,12 @@
"root": "pages/product", "root": "pages/product",
"pages": [{ "pages": [{
"path": "shopPage", "path": "shopPage",
"style": {
"navigationBarTitleText": "店铺详情",
"navigationStyle": "custom"
}
},{
"path": "shopList",
"style": { "style": {
"navigationBarTitleText": "", "navigationBarTitleText": "",
"navigationStyle": "custom" "navigationStyle": "custom"
@@ -402,6 +464,7 @@
} }
} }
} }
] ]
}, },
@@ -431,6 +494,21 @@
} }
} }
}, },
{
"path": "entry/seller/index",
"style": {
"navigationBarTitleText": "店铺入驻",
"navigationStyle": "custom"
}
},
{
"path": "entry/seller/control",
"style": {
"navigationBarTitleText": "",
"navigationStyle": "custom"
}
},
{ {
"path": "article", "path": "article",
"style": { "style": {
@@ -444,6 +522,14 @@
"navigationStyle": "custom", "navigationStyle": "custom",
"navigationBarTextStyle": "black" "navigationBarTextStyle": "black"
} }
},
{
"path": "scannerCodeLoginConfirm",
"style": {
"navigationBarTitleText": "扫码登录",
"navigationStyle": "custom",
"navigationBarTextStyle": "black"
}
} }
] ]
@@ -455,6 +541,8 @@
"path": "seckill", "path": "seckill",
"style": { "style": {
"navigationBarTitleText": "限时抢购", "navigationBarTitleText": "限时抢购",
"navigationStyle": "custom", // 隐藏系统导航栏
"navigationBarTextStyle": "black" ,
"app-plus": { "app-plus": {
"titleNView": { "titleNView": {
"homeButton":true "homeButton":true
@@ -468,7 +556,7 @@
"style": { "style": {
"navigationBarTitleText": "拼团活动", "navigationBarTitleText": "拼团活动",
"navigationStyle": "custom", // 隐藏系统导航栏 "navigationStyle": "custom", // 隐藏系统导航栏
"navigationBarTextStyle": "black" ,
"app-plus": { "app-plus": {
// 将回弹属性关掉 // 将回弹属性关掉
"bounce": "none" "bounce": "none"
@@ -630,6 +718,12 @@
"navigationBarTitleText": "订单详情" "navigationBarTitleText": "订单详情"
} }
}, },
{
"path": "deliverDetail",
"style": {
"navigationBarTitleText": "物流详情"
}
},
{ {
"path": "evaluate/evaluateDetail", "path": "evaluate/evaluateDetail",
"style": { "style": {

View File

@@ -1,299 +1,302 @@
<template> <template>
<view class="coupon-center"> <view class="coupon-center">
<swiper class="swiper-box"> <div class="swiper-box">
<swiper-item class="swiper-item"> <div class="swiper-item">
<scroll-view class="scroll-v" enableBackToTop="true" scroll-y @scrolltolower="loadMore"> <div class="scroll-v" enableBackToTop="true" scroll-y>
<u-empty mode="coupon" text="没有优惠券了" v-if="whetherEmpty"></u-empty> <u-empty mode="coupon" style='margin-top: 20%;' text="没有优惠券了" v-if="whetherEmpty"></u-empty>
<view v-else class="coupon-item" v-for="(item, index) in couponList" :key="index"> <view v-else class="coupon-item" v-for="(item, index) in couponList" :key="index">
<view class="left"> <view class="left">
<view class="wave-line"> <view class="wave-line">
<view class="wave" v-for="(item, index) in 12" :key="index"></view> <view class="wave" v-for="(item, index) in 12" :key="index"></view>
</view> </view>
<view class="message"> <view class="message">
<view> <view>
<!--判断当前优惠券类型 couponType PRICE || DISCOUNT --> <!--判断当前优惠券类型 couponType PRICE || DISCOUNT -->
<span v-if="item.couponType == 'DISCOUNT'">{{ item.couponDiscount }}</span> <span v-if="item.couponType == 'DISCOUNT'">{{ item.couponDiscount }}</span>
<span v-else>{{ item.price }}</span> <span v-else>{{ item.price }}</span>
</view> </view>
<view>{{ item.consumeThreshold | unitPrice }}元可用</view> <view>{{ item.consumeThreshold | unitPrice }}元可用</view>
</view> </view>
<view class="circle circle-top"></view> <view class="circle circle-top"></view>
<view class="circle circle-bottom"></view> <view class="circle circle-bottom"></view>
</view> </view>
<view class="right"> <view class="right">
<view> <view>
<!-- 根据scopeType 判断是否是 平台品类或店铺 --> <!-- 根据scopeType 判断是否是 平台品类或店铺 -->
<view v-if="item.scopeType"> <view class="coupon-title wes-3" v-if="item.scopeType">
<span v-if="item.scopeType == 'ALL' && item.id == 'platform'">全平台</span> <span v-if="item.scopeType == 'ALL' && item.storeId == '0'">全平台</span>
<span v-if="item.scopeType == 'PORTION_CATEGORY'">仅限品类</span> <span v-if="item.scopeType == 'PORTION_GOODS_CATEGORY'">仅限品类</span>
<view v-else>{{ item.storeName == 'platform' ? '全平台' :item.storeName+'店铺' }}使用</view> <view v-else>{{ item.storeName == 'platform' ? '全平台' :item.storeName+'店铺' }}使用
</view> </view>
<view>有效期至{{ item.endTime.split(" ")[0] }}</view> </view>
</view> <view v-if="item.endTime">有效期至:{{ item.endTime.split(" ")[0] }}</view>
<view class="receive" @click="receive(item)"> </view>
<text>点击</text><br /> <view class="receive" @click="receive(item)">
<text>领取</text> <text>点击</text><br />
</view> <text>领取</text>
<view class="bg-quan"> </view> </view>
</view> <view class="bg-quan"> </view>
</view> </view>
<uni-load-more :status="loadStatus"></uni-load-more> </view>
</scroll-view>
</swiper-item> </div>
</swiper> </div>
</view> </div>
</view>
</template> </template>
<script> <script>
import { receiveCoupons } from "@/api/members.js"; import {
import { getAllCoupons } from "@/api/promotions.js"; receiveCoupons
export default { } from "@/api/members.js";
data() { import {
return { getAllCoupons
loadStatus: "more", //下拉状态 } from "@/api/promotions.js";
whetherEmpty: false, //是否为空 export default {
couponList: [], // 优惠券列表 data() {
params: { return {
pageNumber: 1, loadStatus: "more", //下拉状态
pageSize: 10, whetherEmpty: false, //是否为空
}, couponList: [], // 优惠券列表
storeId: "", //店铺 id params: {
}; pageNumber: 1,
}, pageSize: 10,
onLoad(option) { },
this.storeId = option.storeId; storeId: "", //店铺 id,
this.getCoupon(); couponData: ""
}, };
onPullDownRefresh() { },
//下拉刷新 onLoad(option) {
this.params.pageNumber = 1; this.storeId = option.storeId;
this.couponList = []; this.getCoupon();
this.getCoupon(); },
}, onReachBottom() {
methods: {
/** this.loadMore()
* 获取当前优惠券 },
*/ onPullDownRefresh() {
getCoupon() { //下拉刷新
uni.showLoading({ this.params.pageNumber = 1;
title: "加载中", this.couponList = [];
}); this.getCoupon();
let submitData = { ...this.params }; },
// 判断当前是否有店铺 methods: {
this.storeId ? (submitData = { ...this.params, storeId: this.storeId }): "", /**
getAllCoupons(submitData) * 获取当前优惠券
.then((res) => { */
uni.hideLoading(); getCoupon() {
uni.stopPullDownRefresh(); uni.showLoading({
if (res.data.code == 200) { title: "加载中",
// 如果请求成功,展示数据并进行展示 });
let data = res.data.result; let submitData = {
if (data.total == 0) { ...this.params
// 当本次请求数据为空展示空信息 };
this.whetherEmpty = true; // 判断当前是否有店铺
} else { this.storeId ? (submitData = {
this.couponList.push(...data.records); ...this.params,
this.loadStatus = "noMore"; storeId: this.storeId
} }) : "",
} getAllCoupons(submitData)
}) .then((res) => {
.catch((err) => { if (this.$store.state.isShowToast){ uni.hideLoading() };
uni.hideLoading(); uni.stopPullDownRefresh();
}); if (res.data.code == 200) {
}, // 如果请求成功,展示数据并进行展示
/** this.couponData = res.data.result
* 领取优惠券 if (this.couponData.total == 0) {
*/ // 当本次请求数据为空展示空信息
receive(item) { this.whetherEmpty = true;
receiveCoupons(item.id).then((res) => { } else {
if (res.data.code == 200) { this.couponList.push(...this.couponData.records);
uni.showToast({ this.loadStatus = "noMore";
title: "领取成功", }
icon: "none", }
}); })
} else { .catch((err) => {
uni.showToast({ if (this.$store.state.isShowToast){ uni.hideLoading() };
title: res.data.message, });
icon: "none", },
}); /**
} * 领取优惠券
}); */
}, receive(val) {
/** this.$u.throttle(()=>{
* 加载更多 this.fetchCoupon(val)
*/ }, 1500)
loadMore() {
if (this.loadStatus != "noMore") { },
this.params.pageNumber++;
this.getAllCoupons(); fetchCoupon(val){
} receiveCoupons(val.id).then((res) => {
}, if (res.data.code == 200) {
}, uni.showToast({
onNavigationBarButtonTap(e) { title: "领取成功",
uni.navigateTo({ icon: "none",
url: "/pages/cart/coupon/couponIntro", });
}); } else {
}, uni.showToast({
}; title: res.data.message,
icon: "none",
});
}
});
},
/**
* 加载更多
*/
loadMore() {
if (this.couponData.total > this.params.pageNumber * this.params.pageSize) {
this.params.pageNumber++;
this.getCoupon();
}
},
},
onNavigationBarButtonTap(e) {
uni.navigateTo({
url: "/pages/cart/coupon/couponIntro",
});
},
};
</script> </script>
<style> <style>
page { page {
height: 100%; height: 100%;
} }
</style> </style>
<style lang="scss" scoped> <style lang="scss" scoped>
.coupon-center { .coupon-center {
height: 100%; height: 100%;
.couponList-scroll-content { .swiper-box {
position: relative; .coupon-item {
width: 100%; display: flex;
display: flex; align-items: center;
white-space: nowrap; height: 220rpx;
align-items: center; margin: 20rpx;
justify-content: space-between;
align-items: center;
background-color: $main-color;
color: #ffffff;
.tab-item { .left {
width: 160rpx; height: 100%;
height: 80rpx; width: 260rpx;
line-height: 60rpx; background-color: $light-color;
text-align: center; position: relative;
display: inline-block;
}
.active { .message {
border-bottom: 2px solid #ffffff; color: $font-color-white;
broder-width: 60rpx; display: flex;
font-size: 30rpx; justify-content: center;
font-weight: 700; align-items: center;
padding-bottom: 4rpx; flex-direction: column;
} margin-top: 40rpx;
}
.swiper-box { view:nth-child(1) {
height: 100%; font-weight: bold;
font-size: 60rpx;
}
.scroll-v { view:nth-child(2) {
height: 100%; font-size: $font-sm;
} }
}
.coupon-item { .wave-line {
display: flex; height: 220rpx;
align-items: center; width: 8rpx;
height: 220rpx; position: absolute;
margin: 20rpx; top: 0;
left: 0;
background-color: $light-color;
overflow: hidden;
.left { .wave {
height: 100%; width: 8rpx;
width: 260rpx; height: 16rpx;
background-color: $light-color; background-color: #ffffff;
position: relative; border-radius: 0 16rpx 16rpx 0;
.message { margin-top: 4rpx;
color: $font-color-white; }
display: flex; }
justify-content: center;
align-items: center;
flex-direction: column;
margin-top: 40rpx;
view:nth-child(1) { .circle {
font-weight: bold; width: 40rpx;
font-size: 60rpx; height: 40rpx;
} background-color: $bg-color;
position: absolute;
border-radius: 50%;
z-index: 111;
}
view:nth-child(2) { .circle-top {
font-size: $font-sm; top: -20rpx;
} right: -20rpx;
} }
.wave-line { .circle-bottom {
height: 220rpx; bottom: -20rpx;
width: 8rpx; right: -20rpx;
position: absolute; }
top: 0; }
left: 0;
background-color: $light-color;
overflow: hidden;
.wave { .right {
width: 8rpx; display: flex;
height: 16rpx; justify-content: space-between;
background-color: #ffffff; align-items: center;
border-radius: 0 16rpx 16rpx 0; width: 450rpx;
margin-top: 4rpx; font-size: $font-sm;
} height: 100%;
} background-color: #ffffff;
.circle { overflow: hidden;
width: 40rpx; position: relative;
height: 40rpx;
background-color: $bg-color;
position: absolute;
border-radius: 50%;
z-index: 111;
}
.circle-top {
top: -20rpx;
right: -20rpx;
}
.circle-bottom {
bottom: -20rpx;
right: -20rpx;
}
}
.right { >view:nth-child(1) {
display: flex; color: #666666;
justify-content: space-between; margin-left: 20rpx;
align-items: center; display: flex;
width: 450rpx; height: 100%;
font-size: $font-sm; flex-direction: column;
height: 100%; justify-content: space-around;
background-color: #ffffff;
overflow: hidden;
position: relative;
> view:nth-child(1) {
color: #666666;
margin-left: 20rpx;
line-height: 3em;
> view:nth-child(1) {
color: #ff6262;
font-size: 30rpx;
}
}
.receive { >view:nth-child(1) {
color: #ffffff; color: #ff6262;
background-color: $main-color; font-size: 30rpx;
border-radius: 50%; }
width: 86rpx; }
height: 86rpx;
text-align: center;
margin-right: 30rpx;
vertical-align: middle;
padding-top: 8rpx;
position: relative;
z-index: 2;
}
.bg-quan { .receive {
width: 244rpx; color: #ffffff;
height: 244rpx; background-color: $main-color;
border: 6rpx solid $main-color; border-radius: 50%;
border-radius: 50%; width: 86rpx;
opacity: 0.1; height: 86rpx;
color: $main-color; text-align: center;
text-align: center; margin-right: 30rpx;
padding-top: 30rpx; vertical-align: middle;
font-size: 130rpx; padding-top: 8rpx;
position: absolute; position: relative;
right: -54rpx; z-index: 2;
bottom: -60rpx; }
}
} .bg-quan {
} width: 244rpx;
} height: 244rpx;
} border: 6rpx solid $main-color;
border-radius: 50%;
opacity: 0.1;
color: $main-color;
text-align: center;
padding-top: 30rpx;
font-size: 130rpx;
position: absolute;
right: -54rpx;
bottom: -60rpx;
}
}
}
}
}
.coupon-title {
width: 260rpx;
}
</style> </style>

View File

@@ -3,7 +3,8 @@
<view class="body"> <view class="body">
<view class="top-view"> <view class="top-view">
<view class="title">{{coupon.title}}</view> <view class="title">{{coupon.title}}</view>
<view class="price"><text></text>{{coupon.price | unitPrice}}</view> <view class="price" v-if="coupon.couponType =='PRICE'"><text></text>{{coupon.price | unitPrice}}</view>
<view class="price" v-if="coupon.couponType =='DISCOUNT'">{{coupon.discount}}</view>
<view class="text">{{coupon.consumeThreshold}}元可用</view> <view class="text">{{coupon.consumeThreshold}}元可用</view>
<view class="bg-quan"> <view class="bg-quan">
@@ -13,11 +14,13 @@
</view> </view>
</view> </view>
<view class="bottom-view"> <view class="bottom-view">
<view class="text"> 使用平台{{ <view class="text"> 使用范围{{
coupon.scopeType == 'ALL' && coupon.id == 'platform' coupon.scopeType == 'ALL' && coupon.storeId == '0'
? "全平台" ? "全平台"
: coupon.scopeType == "PORTION_CATEGORY" : coupon.scopeType == "PORTION_GOODS"
? "仅限品类" ? "部分商品"
: coupon.scopeType == "PORTION_GOODS_CATEGORY"
? "部分分类商品"
: coupon.storeName == 'platform' ? '全平台' :coupon.storeName+'' : coupon.storeName == 'platform' ? '全平台' :coupon.storeName+''
}}使用</view> }}使用</view>
<view class="text"> 有效期至{{coupon.endTime}}</view> <view class="text"> 有效期至{{coupon.endTime}}</view>

View File

@@ -1,12 +1,22 @@
<template> <template>
<div class="wrapper"> <div class="wrapper">
<u-tabs :list="list" :is-scroll="false" :active-color="lightColor" :current="current" @change="(i)=>{current = i}"> <u-tabs
:list="list"
:is-scroll="false"
:active-color="lightColor"
:current="current"
@change="
(i) => {
current = i;
}
"
>
</u-tabs> </u-tabs>
<div class="empty" v-if="couponsList.length <= 0"> <div class="empty" v-if="couponsList.length <= 0">
<u-empty text="暂无优惠券" mode="coupon"></u-empty> <u-empty text="暂无优惠券" mode="coupon"></u-empty>
</div> </div>
<view class="coupon-item" v-for="(item, index) in couponsList" :key="index" > <view class="coupon-item" v-for="(item, index) in couponsList" :key="index">
<view class="left"> <view class="left">
<view class="wave-line"> <view class="wave-line">
<view class="wave" v-for="(item, index) in 12" :key="index"></view> <view class="wave" v-for="(item, index) in 12" :key="index"></view>
@@ -24,17 +34,29 @@
<view class="right"> <view class="right">
<view class="desc"> <view class="desc">
<view v-if="item.scopeType"> <view v-if="item.scopeType">
<span v-if="item.scopeType == 'ALL' && item.id == 'platform'">全平台</span> <span v-if="item.scopeType == 'ALL' && item.storeId == '0'">全平台</span>
<span v-if="item.scopeType == 'PORTION_CATEGORY'">仅限品类</span> <span v-if="item.scopeType == 'PORTION_GOODS_CATEGORY'">仅限品类</span>
<view v-else>{{ item.storeName == 'platform' ? '全平台' :item.storeName+'店铺' }}使用</view> <view v-else
>{{
item.storeName == "platform" ? "全平台" : item.storeName + "店铺"
}}使用</view
>
</view> </view>
<view class="reason" v-if="item.reason">{{item.reason}}</view> <view class="reason" v-if="item.reason">{{ item.reason }}</view>
<view class="end-time">有效期至:{{item.endTime}}</view> <view class="end-time">有效期至:{{ item.endTime }}</view>
</view> </view>
<view class="receive" v-if="current ==0" @click="clickWay(item)"> <view
class="receive"
v-if="current == 0 && !routerVal.selectedCoupon.includes(item.id)"
@click="clickWay(item)"
>
<text>立即</text><br /> <text>立即</text><br />
<text>使用</text> <text>使用</text>
</view> </view>
<view class="used" v-if="current == 0 && routerVal.selectedCoupon.includes(item.id)" @click="clickWay(item)">
<text>取消</text><br />
<text>使用</text>
</view>
<view class="bg-quan"></view> <view class="bg-quan"></view>
</view> </view>
</view> </view>
@@ -69,9 +91,8 @@ export default {
routerVal: "", //上级传参 routerVal: "", //上级传参
}; };
}, },
onLoad(options){ onLoad(options) {
this.routerVal = options this.routerVal = options;
}, },
watch: { watch: {
current(val) { current(val) {
@@ -84,6 +105,7 @@ export default {
mounted() { mounted() {
this.init(); this.init();
console.log(this.routerVal);
}, },
methods: { methods: {
@@ -99,7 +121,7 @@ export default {
clickWay(coupon) { clickWay(coupon) {
useCoupon({ useCoupon({
memberCouponId: coupon.id, memberCouponId: coupon.id,
used: true, used: !this.routerVal.selectedCoupon.includes(coupon.id),
way: this.routerVal.way, way: this.routerVal.way,
}).then((res) => { }).then((res) => {
if (res.data.success) { if (res.data.success) {
@@ -216,7 +238,7 @@ export default {
> view:nth-child(1) { > view:nth-child(1) {
color: #666666; color: #666666;
margin-left: 20rpx; margin-left: 20rpx;
> view:nth-child(1) { > view:nth-child(1) {
color: #ff6262; color: #ff6262;
font-size: 30rpx; font-size: 30rpx;
@@ -237,6 +259,20 @@ export default {
z-index: 2; z-index: 2;
} }
.used {
color: #ffffff;
background-color: black;
border-radius: 50%;
width: 86rpx;
height: 86rpx;
text-align: center;
margin-right: 30rpx;
vertical-align: middle;
padding-top: 8rpx;
position: relative;
z-index: 2;
}
.bg-quan { .bg-quan {
width: 244rpx; width: 244rpx;
height: 244rpx; height: 244rpx;

View File

@@ -2,28 +2,63 @@
<view class="b-content"> <view class="b-content">
<view class="navbar"> <view class="navbar">
<!-- 循环出头部tab栏 --> <!-- 循环出头部tab栏 -->
<view v-for="(item, index) in navList" :key="index" class="nav-item" @click="handleTabClick(index)"><text <view
:class="{ current: tabCurrentIndex === index }">{{ v-for="(item, index) in navList"
:key="index"
class="nav-item"
@click="handleTabClick(index)"
><text :class="{ current: tabCurrentIndex === index }">{{
item.text item.text
}}</text></view> }}</text></view
>
</view> </view>
<swiper :current="tabCurrentIndex" class="swiper-box" duration="300" @change="changeTab"> <swiper
<swiper-item class="tab-content" v-for="(navItem, navIndex) in navList" :key="navIndex"> :current="tabCurrentIndex"
<scroll-view class="list-scroll-content" scroll-y @scrolltolower="loadData"> class="swiper-box"
duration="300"
@change="changeTab"
>
<swiper-item
class="tab-content"
v-for="(navItem, navIndex) in navList"
:key="navIndex"
>
<scroll-view
class="list-scroll-content"
scroll-y
@scrolltolower="loadData"
>
<!-- 空白页 --> <!-- 空白页 -->
<u-empty mode="coupon" text="暂无优惠券了" v-if="navItem.wheterEmpty"></u-empty> <u-empty
mode="coupon"
text="暂无优惠券了"
v-if="navItem.whetherEmpty"
></u-empty>
<!-- 数据 --> <!-- 数据 -->
<view v-if="navItem.dataList && coupon" class="coupon-item" :class="{ 'coupon-used': navIndex != 0 }" <view
v-for="(coupon, index) in navItem.dataList" :key="index"> v-if="navItem.dataList && coupon"
class="coupon-item"
:class="{ 'coupon-used': navIndex != 0 }"
v-for="(coupon, index) in navItem.dataList"
:key="index"
>
<view class="left"> <view class="left">
<view class="wave-line"> <view class="wave-line">
<view class="wave" v-for="(item, index) in 12" :key="index"></view> <view
class="wave"
v-for="(item, index) in 12"
:key="index"
></view>
</view> </view>
<view class="message"> <view class="message">
<view class="price" v-if="coupon.couponType == 'DISCOUNT'">{{ coupon.discount }}</view> <view class="price" v-if="coupon.couponType == 'DISCOUNT'"
>{{ coupon.discount }}</view
>
<view class="price" v-else>{{ coupon.price }}</view> <view class="price" v-else>{{ coupon.price }}</view>
<view class="sub-price">{{ coupon.consumeThreshold | unitPrice }}可用</view> <view class="sub-price"
>{{ coupon.consumeThreshold | unitPrice }}可用</view
>
</view> </view>
<view class="circle circle-top"></view> <view class="circle circle-top"></view>
<view class="circle circle-bottom"></view> <view class="circle circle-bottom"></view>
@@ -31,27 +66,49 @@
<view class="right" v-if="coupon"> <view class="right" v-if="coupon">
<view class="content"> <view class="content">
<view class="title-1">{{ coupon.title }}</view> <view class="title-1">{{ coupon.title }}</view>
<view class="title-2">使用平台{{ <view class="title-2"
coupon.scopeType == 'ALL' && coupon.id == 'platform' >使用范围{{
coupon.scopeType == "ALL" && coupon.storeId == "0"
? "全平台" ? "全平台"
: coupon.scopeType == "PORTION_CATEGORY" : coupon.scopeType == "PORTION_GOODS"
? "仅限品类" ? "部分商品"
: coupon.storeName == 'platform' ? '全平台' :coupon.storeName+'' : coupon.scopeType == "PORTION_GOODS_CATEGORY"
}}使用</view> ? "部分分类商品"
<view v-if="coupon.endTime">{{ : coupon.storeName == "platform"
coupon.endTime ? "全平台"
}}</view> : coupon.storeName + ""
<view @click="couponDetail(coupon)">详细说明 }}使用</view
<u-icon style="float: right; margin-top: 10rpx" name="arrow-right"></u-icon> >
<view v-if="coupon.endTime">{{ coupon.endTime }}</view>
<view @click="couponDetail(coupon)"
>详细说明
<u-icon
style="float: right; margin-top: 10rpx"
name="arrow-right"
></u-icon>
</view> </view>
</view> </view>
<view class="jiao-1" v-if="navIndex == 0"> <view class="jiao-1" v-if="navIndex == 0">
<text class="text-1">新到</text> <text class="text-1">新到</text>
<text class="text-2" v-if="coupon.used_status == 1">将过期</text> <text class="text-2" v-if="coupon.used_status == 1"
>将过期</text
>
</view> </view>
<image class="no-icon" v-if="navIndex == 1" src="@/static/img/used.png"></image> <image
<image class="no-icon" v-if="navIndex == 2" src="@/static/img/overdue.png"></image> class="no-icon"
<view class="receive" v-if="navIndex == 0" @click="useItNow(coupon)"> v-if="navIndex == 1"
src="@/static/img/used.png"
></image>
<image
class="no-icon"
v-if="navIndex == 2"
src="@/static/img/overdue.png"
></image>
<view
class="receive"
v-if="navIndex == 0"
@click="useItNow(coupon)"
>
<text>立即</text><br /> <text>立即</text><br />
<text>使用</text> <text>使用</text>
</view> </view>
@@ -84,7 +141,7 @@ export default {
pageSize: 10, pageSize: 10,
status: 1, status: 1,
}, },
wheterEmpty: false, whetherEmpty: false,
}, },
{ {
text: "已使用", text: "已使用",
@@ -96,7 +153,7 @@ export default {
pageSize: 10, pageSize: 10,
status: 2, status: 2,
}, },
wheterEmpty: false, whetherEmpty: false,
}, },
{ {
text: "已过期", text: "已过期",
@@ -108,7 +165,7 @@ export default {
pageSize: 10, pageSize: 10,
status: 3, status: 3,
}, },
wheterEmpty: false, whetherEmpty: false,
}, },
], ],
couponList: [], //优惠券列表 couponList: [], //优惠券列表
@@ -116,6 +173,7 @@ export default {
}, },
onShow() { onShow() {
this.navList[this.tabCurrentIndex].params.pageNumber = 1;
this.navList[this.tabCurrentIndex].dataList = []; this.navList[this.tabCurrentIndex].dataList = [];
this.getData(); this.getData();
}, },
@@ -150,7 +208,7 @@ export default {
let data = res.data.result.records; let data = res.data.result.records;
if (data.length == 0) { if (data.length == 0) {
if (res.data.pageNumber == 1) { if (res.data.pageNumber == 1) {
this.navList[index].wheterEmpty = true; this.navList[index].whetherEmpty = true;
} else { } else {
this.navList[index].loadStatus = "noMore"; this.navList[index].loadStatus = "noMore";
} }
@@ -161,7 +219,7 @@ export default {
this.navList[index].dataList.push(...data); this.navList[index].dataList.push(...data);
} }
} }
uni.hideLoading(); if (this.$store.state.isShowToast){ uni.hideLoading() };
}); });
}, },
@@ -187,15 +245,9 @@ export default {
* 立即使用优惠券 * 立即使用优惠券
*/ */
useItNow(item) { useItNow(item) {
if (item.storeId) { uni.navigateTo({
uni.navigateTo({ url: `/pages/navigation/search/searchPage?promotionsId=${item.couponId}&promotionType=COUPON`,
url: `/pages/product/shopPage?id=${item.storeId}`, });
});
} else {
uni.switchTab({
url: "/pages/tabbar/home/index",
});
}
}, },
/** /**

View File

@@ -98,18 +98,18 @@
}, },
onBackPress(e) { onBackPress(e) {
if (e.from == "backbutton") { if (e.from == "backbutton") {
if(this.routerVal.recharge_sn){ if(this.routerVal.recharge_sn){
uni.switchTab({ uni.switchTab({
url: '/pages/tabbar/user/my' url: '/pages/tabbar/user/my'
}); });
} }
else{ else{
uni.redirectTo({ uni.navigateTo({
url: "/pages/order/myOrder?status=0", url: "/pages/order/myOrder?status=0",
}); });
} }
return true; //阻止默认返回行为 return true; //阻止默认返回行为
} }
}, },
mounted() { mounted() {
this.cashierData(); this.cashierData();
@@ -139,6 +139,7 @@
// 判断当前是否是充值 // 判断当前是否是充值
this.sn = this.routerVal.recharge_sn; this.sn = this.routerVal.recharge_sn;
this.orderType = "RECHARGE"; this.orderType = "RECHARGE";
} else if (this.routerVal.trade_sn) { } else if (this.routerVal.trade_sn) {
this.sn = this.routerVal.trade_sn; this.sn = this.routerVal.trade_sn;
this.orderType = "TRADE"; this.orderType = "TRADE";
@@ -161,16 +162,16 @@
}); });
// #endif // #endif
// #ifndef MP-WEIXIN
if(this.routerVal.recharge_sn){ if(this.routerVal.recharge_sn){
this.payList = res.data.result.support.filter((item) => { this.payList = res.data.result.support.filter((item) => {
return item != "WALLET"; return item != "WALLET";
}) })
} }
else{ else{
this.payList = res.data.result.support; this.payList = res.data.result.support;
} }
// #ifndef APP-PLUS // #ifdef H5
//判断是否微信浏览器 //判断是否微信浏览器
var ua = window.navigator.userAgent.toLowerCase(); var ua = window.navigator.userAgent.toLowerCase();
if (ua.match(/MicroMessenger/i) == 'micromessenger') { if (ua.match(/MicroMessenger/i) == 'micromessenger') {
@@ -178,11 +179,17 @@
this.payList = res.data.result.support.filter((item) => { this.payList = res.data.result.support.filter((item) => {
return item != "ALIPAY"; return item != "ALIPAY";
}); });
// 充值的话仅保留微信支付
if(this.orderType == "RECHARGE"){
this.payList = res.data.result.support.filter((item) => {
return item == "WECHAT";
});
}
} }
// #endif // #endif
// #endif
this.walletValue = res.data.result.walletValue; this.walletValue = res.data.result.walletValue;
@@ -226,13 +233,18 @@
const paymentMethod = payment; const paymentMethod = payment;
// 客户端类型 APP/NATIVE/JSAPI/H5 // 客户端类型 APP/NATIVE/JSAPI/H5
const paymentClient = this.paymentClient; const paymentClient = this.paymentClient;
uni.showLoading({
title: "正在唤起支付...",
mask:true
});
// #ifdef APP-PLUS // #ifdef APP-PLUS
//APP pay //APP pay
// 初始化支付签名 // 初始化支付签名
await API_Trade.initiatePay(paymentMethod, paymentClient, params).then( await API_Trade.initiatePay(paymentMethod, paymentClient, params).then(
(signXml) => { (signXml) => {
if (this.$store.state.isShowToast){ uni.hideLoading() };
//如果支付异常 //如果支付异常
if (!signXml.data.success) { if (!signXml.data.success) {
uni.showToast({ uni.showToast({
@@ -241,33 +253,39 @@
}); });
return; return;
} }
let payForm = signXml.data.result; let payForm = signXml.data.result;
let paymentType = paymentMethod === "WECHAT" ? "wxpay" : "alipay"; let paymentType = paymentMethod === "WECHAT" ? "wxpay" : "alipay";
uni.requestPayment({
provider: paymentType, if(paymentMethod === "WALLET"){
orderInfo: payForm, uni.showToast({
success: (e) => { icon: "none",
console.log(e); title: "支付成功!",
uni.showToast({ });
icon: "none", this.callback(paymentMethod)
title: "支付成功!", }
}); else{
uni.requestPayment({
this.callback(paymentMethod) provider: paymentType,
orderInfo: payForm || '',
success: (e) => {
}, uni.showToast({
fail: (e) => { icon: "none",
console.log(this); title: "支付成功!",
this.exception = e; });
uni.showModal({ this.callback(paymentMethod)
content: "支付失败,如果您已支付,请勿反复支付", },
showCancel: false, fail: (e) => {
}); console.log(this);
}, this.exception = e;
}); uni.showModal({
content: "支付失败,如果您已支付,请勿反复支付",
showCancel: false,
});
},
});
}
} }
); );
//APP pay //APP pay
@@ -316,8 +334,25 @@
} }
} }
); );
if (this.$store.state.isShowToast){ uni.hideLoading() };
} else { } else {
window.location.href = JSON.parse(response.result).h5_url; window.location.href = JSON.parse(response.result).h5_url;
const searchParams = {
...params,
price:this.cashierParams,
}
const timer = setInterval(()=>{
payCallback(searchParams).then(res=>{
if(res.data.result){
clearTimeout(timer);
uni.navigateTo({
url:"/pages/order/myOrder"
})
}
})
},3000)
if (this.$store.state.isShowToast){ uni.hideLoading() };
} }
} else if (paymentMethod === "WALLET") { } else if (paymentMethod === "WALLET") {
uni.showToast({ uni.showToast({

View File

@@ -1,5 +1,5 @@
<template> <template>
<view class="wrapper" v-if="flage"> <view class="wrapper" v-if="flag">
<div class='goods' v-if="selectedGoods"> <div class='goods' v-if="selectedGoods">
<image class="goods-image" :src="selectedGoods.thumbnail" alt=""> <image class="goods-image" :src="selectedGoods.thumbnail" alt="">
<p class="goodsName">{{selectedGoods.goodsName}}</p> <p class="goodsName">{{selectedGoods.goodsName}}</p>
@@ -58,7 +58,7 @@
<popupGoods :addr="addr" ref="popupGoods" :buyMask="maskFlag" @closeBuy="closePopupBuy" :goodsDetail="goodsDetail" :goodsSpec="goodsSpec" v-if="goodsDetail.id " @handleClickSku="getGoodsDetail" /> <popupGoods :addr="addr" ref="popupGoods" :buyMask="maskFlag" @closeBuy="closePopupBuy" :goodsDetail="goodsDetail" :goodsSpec="goodsSpec" v-if="goodsDetail.id " @handleClickSku="getGoodsDetail" />
<shares @close="closeShare" :link="'/pages/cart/payment/shareOrderGoods?sn='+this.routers.sn+'&sku='+this.routers.sku+'&goodsId='+this.routers.goodsId" type="pintuan" <shares @close="closeShare" :link="'/pages/cart/payment/shareOrderGoods?sn='+this.routers.sn+'&sku='+this.routers.sku+'&goodsId='+this.routers.goodsId" type="pintuan"
:thumbnail="data.promotionGoods.thumbnail" :goodsName="data.promotionGoods.goodsName" v-if="shareFlage " /> :thumbnail="data.promotionGoods.thumbnail" :goodsName="data.promotionGoods.goodsName" v-if="shareFlag " />
</view> </view>
</template> </template>
@@ -72,13 +72,13 @@ import popupGoods from "@/components/m-buy/goods"; //购物车商品的模块
export default { export default {
data() { data() {
return { return {
flage: false, //判断接口是否正常请求 flag: false, //判断接口是否正常请求
addr: { addr: {
id: "", id: "",
}, },
maskFlag: false, //商品弹框 maskFlag: false, //商品弹框
timeStamp: 0, timeStamp: 0,
shareFlage: false, shareFlag: false,
data: "", data: "",
isMaster: true, isMaster: true,
selectedGoods: "", //选择的商品规格昵称 selectedGoods: "", //选择的商品规格昵称
@@ -116,7 +116,7 @@ export default {
}, },
methods: { methods: {
closeShare() { closeShare() {
this.shareFlage = false; this.shareFlag = false;
}, },
// 这里的话得先跳到商品详情才能购买商品 // 这里的话得先跳到商品详情才能购买商品
toBuy() { toBuy() {
@@ -131,7 +131,7 @@ export default {
}, },
// 分享 // 分享
share() { share() {
this.shareFlage = true; this.shareFlag = true;
}, },
closePopupBuy(val) { closePopupBuy(val) {
this.maskFlag = false; this.maskFlag = false;
@@ -140,7 +140,7 @@ export default {
async init(sn, sku) { async init(sn, sku) {
let res = await getPinTuanShare(sn, sku); let res = await getPinTuanShare(sn, sku);
if (res.data.success && res.data.result.promotionGoods) { if (res.data.success && res.data.result.promotionGoods) {
this.flage = true; this.flag = true;
this.data = res.data.result; this.data = res.data.result;
this.selectedGoods = res.data.result.promotionGoods; this.selectedGoods = res.data.result.promotionGoods;
let endTime = Date.parse( let endTime = Date.parse(
@@ -204,7 +204,7 @@ export default {
this.goodsDetail = response.data.result.data; this.goodsDetail = response.data.result.data;
this.selectedGoods = response.data.result.data; this.selectedGoods = response.data.result.data;
this.goodsSpec = response.data.result.specs; this.goodsSpec = response.data.result.specs;
uni.hideLoading(); if (this.$store.state.isShowToast){ uni.hideLoading() };
this.PromotionList = response.data.result.promotionMap; this.PromotionList = response.data.result.promotionMap;
// 判断是否拼团活动 如果有则显示拼团活动信息 // 判断是否拼团活动 如果有则显示拼团活动信息

View File

@@ -5,7 +5,7 @@
{{ Number(payPrice) | unitPrice }} {{ Number(payPrice) | unitPrice }}
</div> </div>
<div class="pay-btns"> <div class="pay-btns">
<div v-show="!from" @click="checkOrder">查看{{this.orderType == "RECHARGE" ? '余额' : '订单'}}</div> <div v-show="!from" @click="checkOrder">查看{{ this.orderType == "RECHARGE" ? '余额' : '订单' }}</div>
<div @click="navigateTo('/pages/tabbar/home/index', 'switch')">回到首页</div> <div @click="navigateTo('/pages/tabbar/home/index', 'switch')">回到首页</div>
</div> </div>
</div> </div>
@@ -16,7 +16,7 @@
<div> <div>
支付方式 支付方式
</div> </div>
<div>{{paymentMethod | paymentTypeFilter}}</div> <div>{{ paymentMethod | paymentTypeFilter }}</div>
</div> </div>
</div> </div>
</div> </div>
@@ -60,7 +60,7 @@ export default {
this.from = options.from || ""; this.from = options.from || "";
this.payPrice = options.payPrice || 0; this.payPrice = options.payPrice || 0;
this.orderType = options.orderType; this.orderType = options.orderType;
// this.sendMessage()
}, },
methods: { methods: {
checkOrder() { checkOrder() {
@@ -77,11 +77,6 @@ export default {
this.navigateTo("/pages/order/myOrder?status=0"); this.navigateTo("/pages/order/myOrder?status=0");
} }
}, },
changeStatus(val) {
if (val) {
this.sendMessage();
}
},
navigateTo(url, type) { navigateTo(url, type) {
if (type === "switch") { if (type === "switch") {
@@ -105,6 +100,7 @@ export default {
padding: 0 20rpx 20rpx; padding: 0 20rpx 20rpx;
width: 80%; width: 80%;
} }
.pay-btns { .pay-btns {
display: flex; display: flex;
width: 50%; width: 50%;
@@ -112,7 +108,7 @@ export default {
margin: 0 auto; margin: 0 auto;
color: #fff; color: #fff;
> div { >div {
padding: 6px 12px; padding: 6px 12px;
border: 1px solid #fff; border: 1px solid #fff;
border-radius: 100px; border-radius: 100px;
@@ -146,7 +142,7 @@ export default {
border-radius: 20rpx; border-radius: 20rpx;
background: rgba($color: $main-color, $alpha: 0.2); background: rgba($color: $main-color, $alpha: 0.2);
> h2 { >h2 {
margin-top: 20rpx; margin-top: 20rpx;
font-size: 40rpx; font-size: 40rpx;
color: $main-color; color: $main-color;

View File

@@ -2,9 +2,11 @@
<view class="add-address"> <view class="add-address">
<div class="uForm"> <div class="uForm">
<u-form :border-bottom="false" :model="form" ref="uForm" :error-type="['toast']" :rule="rules"> <u-form :border-bottom="false" :model="form" ref="uForm" :error-type="['toast']" :rule="rules">
<!-- #ifndef H5 -->
<view class="selectAddress" @click="clickUniMap"> <view class="selectAddress" @click="clickUniMap">
选择收货地址 选择收货地址
</view> </view>
<!-- #endif -->
<u-form-item class="border" label="收货人" label-width="130" prop="name"> <u-form-item class="border" label="收货人" label-width="130" prop="name">
<u-input v-model="form.name" clearable placeholder="请输入收货人姓名" /> <u-input v-model="form.name" clearable placeholder="请输入收货人姓名" />
</u-form-item> </u-form-item>
@@ -13,7 +15,9 @@
<u-input v-model="form.mobile" type="number" maxlength="11" placeholder="请输入收货人手机号码" /> <u-input v-model="form.mobile" type="number" maxlength="11" placeholder="请输入收货人手机号码" />
</u-form-item> </u-form-item>
<u-form-item label="所在区域" label-width="130" prop="___path"> <u-form-item label="所在区域" label-width="130" prop="___path">
<u-input v-model="form.___path" type="select" @click="showPicker" placeholder="请选择所在地区" /> <div @click="showPicker" >
{{ form.___path || '请选择所在地区' }}
</div>
</u-form-item> </u-form-item>
<u-form-item class="detailAddress" label="详细地址" label-width="130" prop="detail"> <u-form-item class="detailAddress" label="详细地址" label-width="130" prop="detail">
<u-input type="textarea" v-model="form.detail" maxlength="100" height="150" placeholder="街道楼牌号等" /> <u-input type="textarea" v-model="form.detail" maxlength="100" height="150" placeholder="街道楼牌号等" />
@@ -31,18 +35,18 @@
<m-city :provinceData="list" headTitle="区域选择" ref="cityPicker" @funcValue="getpickerParentValue" pickerSize="4"> <m-city :provinceData="list" headTitle="区域选择" ref="cityPicker" @funcValue="getpickerParentValue" pickerSize="4">
</m-city> </m-city>
<uniMap v-if="mapFlage" @close="closeMap" @callback="callBackAddress" /> <uniMap v-if="mapFlag" @close="closeMap" @callback="callBackAddress" />
</div> </div>
</view> </view>
</template> </template>
<script> <script>
import { addAddress, editAddress, getAddressDetail } from "@/api/address.js"; import { addAddress, editAddress, getAddressDetail } from "@/api/address.js";
import gkcity from "@/components/m-city/m-city.vue"; import city from "@/components/m-city/m-city.vue";
import uniMap from "./uniMap"; import uniMap from "@/components/uniMap";
import permision from "@/js_sdk/wa-permission/permission.js"; import permision from "@/js_sdk/wa-permission/permission.js";
export default { export default {
components: { components: {
"m-city": gkcity, "m-city": city,
uniMap, uniMap,
}, },
onShow() { onShow() {
@@ -51,7 +55,7 @@ export default {
methods: { methods: {
// 关闭地图 // 关闭地图
closeMap() { closeMap() {
this.mapFlage = false; this.mapFlag = false;
}, },
// 打开地图并访问权限 // 打开地图并访问权限
clickUniMap() { clickUniMap() {
@@ -59,8 +63,8 @@ export default {
if (plus.os.name == "iOS") { if (plus.os.name == "iOS") {
// ios系统 // ios系统
permision.judgeIosPermission("location") permision.judgeIosPermission("location")
? (this.mapFlage = true) ? (this.mapFlag = true)
: this.refuseMapOuther(); : this.refuseMap();
} else { } else {
// 安卓 // 安卓
this.requestAndroidPermission( this.requestAndroidPermission(
@@ -70,12 +74,12 @@ export default {
// #endif // #endif
// #ifndef APP-PLUS // #ifndef APP-PLUS
this.mapFlage = true; this.mapFlag = true;
// #endif // #endif
}, },
// 如果拒绝权限 提示区设置 // 如果拒绝权限 提示区设置
refuseMapOuther() { refuseMap() {
uni.showModal({ uni.showModal({
title: "温馨提示", title: "温馨提示",
content: "您已拒绝定位,请开启", content: "您已拒绝定位,请开启",
@@ -111,14 +115,15 @@ export default {
var result = await permision.requestAndroidPermission(permisionID); var result = await permision.requestAndroidPermission(permisionID);
if (result == 1) { if (result == 1) {
this.mapFlage = true; this.mapFlag = true;
} else { } else {
this.refuseMapOuther(); this.refuseMap();
} }
}, },
// 选择地址后数据的回调 // 选择地址后数据的回调
callBackAddress(val) { callBackAddress(val) {
console.log(val)
uni.showLoading({ uni.showLoading({
title: "加载中", title: "加载中",
}); });
@@ -131,10 +136,10 @@ export default {
this.form.consigneeAddressPath = val.data.result.name; //地址名称, ''分割 this.form.consigneeAddressPath = val.data.result.name; //地址名称, ''分割
this.form.lat = val.latitude; //纬度 this.form.lat = val.latitude; //纬度
this.form.lon = val.longitude; //经度 this.form.lon = val.longitude; //经度
uni.hideLoading(); uni.hideLoading();
} }
this.mapFlage = !this.mapFlage; //关闭地图 this.mapFlag = !this.mapFlag; //关闭地图
}, },
// 保存当前 地址 // 保存当前 地址
@@ -160,9 +165,7 @@ export default {
delete this.form.updateTime; delete this.form.updateTime;
editAddress(this.form).then((res) => { editAddress(this.form).then((res) => {
if (res.data.success) { if (res.data.success) {
uni.navigateTo({ uni.navigateBack();
url: `/${beforePage.route}`,
});
} }
}); });
} }
@@ -206,7 +209,7 @@ export default {
data() { data() {
return { return {
lightColor: this.$lightColor, //高亮颜色 lightColor: this.$lightColor, //高亮颜色
mapFlage: false, // 地图选择开 mapFlag: false, // 地图选择开
routerVal: "", routerVal: "",
form: { form: {
detail: "", //地址详情 detail: "", //地址详情
@@ -276,10 +279,10 @@ export default {
params.___path = params.consigneeAddressPath; params.___path = params.consigneeAddressPath;
this.$set(this, "form", params); this.$set(this, "form", params);
uni.hideLoading(); if (this.$store.state.isShowToast){ uni.hideLoading() };
}); });
} }
uni.hideLoading(); uni.hideLoading();
}, },
// 初始化rules必须要在onReady生命周期因为onLoad生命周期组件可能尚未创建完毕 // 初始化rules必须要在onReady生命周期因为onLoad生命周期组件可能尚未创建完毕
onReady() { onReady() {

View File

@@ -101,7 +101,7 @@ export default {
this.addressList = res.data.result.records; this.addressList = res.data.result.records;
console.log(this.addressList); console.log(this.addressList);
uni.hideLoading(); if (this.$store.state.isShowToast){ uni.hideLoading() };
}); });
}, },
//删除地址 //删除地址

View File

@@ -1,6 +1,6 @@
<template> <template>
<view class="address"> <view class="address">
<u-empty class="empty" v-if="this.addressList == 0" text="暂无收货地址" mode="address"></u-empty> <u-empty class="empty" v-if="this.addressList.length === 0" text="暂无收货地址" mode="address"></u-empty>
<view class="list" > <view class="list" >
<view class="item c-content" v-for="(item, index) in addressList" :key="index"> <view class="item c-content" v-for="(item, index) in addressList" :key="index">
<view class="basic"> <view class="basic">
@@ -50,7 +50,7 @@ export default {
return { return {
addressList: [], //地址列表 addressList: [], //地址列表
showAction: false, //是否显示下栏框 showAction: false, //是否显示下栏框
removeList: [ removeList: [
{ {
text: "确定", text: "确定",
@@ -86,22 +86,8 @@ export default {
* 进入页面检测当前账户是否登录 * 进入页面检测当前账户是否登录
*/ */
onShow() { onShow() {
let that = this; if (this.$options.filters.tipsToLogin()) {
if (this.$options.filters.isLogin("auth")) {
this.getAddressList(); this.getAddressList();
} else {
uni.showModal({
title: "提示",
content: "检测到您的账号还未登录,是否去登录?",
confirmColor: this.$lightColor,
success: function (res) {
if (res.confirm) {
that.$options.filters.navigateToLogin();
} else if (res.cancel) {
uni.navigateBack();
}
},
});
} }
}, },
methods: { methods: {
@@ -117,7 +103,7 @@ export default {
}); });
this.addressList = res.data.result.records; this.addressList = res.data.result.records;
uni.hideLoading(); if (this.$store.state.isShowToast){ uni.hideLoading() };
}); });
}, },
//删除地址 //删除地址

View File

@@ -0,0 +1,88 @@
<template>
<view class="address">
<u-empty class="empty" v-if="storeAddressList.length == 0" text="暂无自提地址" mode="address"></u-empty>
<view class="list" v-else>
<view class="item c-content" v-for="(item, index) in storeAddressList" :key="index">
<view class="basic" @click="selectAddressData(item)">
<text>{{ item.addressName }}</text>
<text>{{ item.mobile }}</text>
<view>
<div class="region">
<span>{{ item.address }}</span>
</div>
</view>
</view>
</view>
<view style="height: 100px"></view>
</view>
<u-action-sheet :list="removeList" :tips="tips" v-model="showAction" @click="deleteAddressMessage"></u-action-sheet>
</view>
</template>
<script>
import * as API_Trade from "@/api/trade";
import * as API_Store from "@/api/store.js";
export default {
data() {
return {
storeAddressList: [], //地址列表
showAction: false, //是否显示下栏框
removeList: [
{
text: "确定",
},
],
tips: {
text: "确定要删除该收货人信息吗?",
},
removeId: "", //删除的地址id
routerVal: "",
params: {
pageNumber: 1,
pageSize: 1000,
},
};
},
onPullDownRefresh() {
//下拉刷新
this.storeAddressList = [];
this.getAddressList();
},
onLoad: function (val) {
this.routerVal = val;
},
onShow() {
this.storeAddressList = [];
this.getAddressList();
},
onHide() {},
methods: {
async selectAddressData(val) {
await API_Trade.setStoreAddressId(val.id, this.routerVal.way);
uni.navigateBack({
delta: 1,
});
},
//获取地址列表
getAddressList() {
uni.showLoading();
API_Store.getStoreAddress(
this.routerVal.storeId,
this.params
).then((res) => {
this.storeAddressList = res.data.result.records;
console.log(this.storeAddressList);
if (this.$store.state.isShowToast){ uni.hideLoading() };
});
},
},
};
</script>
<style lang="scss" scoped>
@import "./address.scss";
</style>

View File

@@ -1,6 +1,6 @@
<template> <template>
<view class="wap"> <view class="wap">
<u-navbar back-text="" title="预存款列表"> <u-navbar title="预存款列表">
</u-navbar> </u-navbar>
<view class="wrapper-show-money"> <view class="wrapper-show-money">
<view class="money-view"> <view class="money-view">
@@ -14,7 +14,7 @@
<swiper class="swiper-box" :current="swiperCurrent"> <swiper class="swiper-box" :current="swiperCurrent">
<swiper-item class="swiper-item" v-for="index in list.length" :key="index"> <swiper-item class="swiper-item" v-for="index in list.length" :key="index">
<scroll-view class="scroll-v view-wrapper" enableBackToTop="true" scroll-with-animation scroll-y @scrolltolower="loadMore"> <scroll-view class="scroll-v view-wrapper" enableBackToTop="true" scroll-with-animation scroll-y @scrolltolower="loadMore">
<view v-if="datas.length!=0" class="view-item" v-for="(logItem, logIndex) in datas" :key="logIndex"> <view v-if="depositData.length!=0" class="view-item" v-for="(logItem, logIndex) in depositData" :key="logIndex">
<view class="view-item-detail"> <view class="view-item-detail">
<view class="-title">{{logItem.detail}}</view> <view class="-title">{{logItem.detail}}</view>
<!-- <view class="-number">{{logItem.detail}}</view> --> <!-- <view class="-number">{{logItem.detail}}</view> -->
@@ -27,8 +27,8 @@
</view> </view>
</view> </view>
<u-empty v-if="datas.length==0" mode="history" text="暂无记录" /> <u-empty v-if="depositData.length==0" mode="history" text="暂无记录" />
<u-loadmore v-else bg-color='#f8f8f8' :status="status" />
</scroll-view> </scroll-view>
</swiper-item> </swiper-item>
@@ -45,7 +45,6 @@ export default {
data() { data() {
return { return {
walletNum: 0, walletNum: 0,
status: "loadmore",
current: 0, current: 0,
swiperCurrent: 0, swiperCurrent: 0,
userInfo: "", //用户详情信息 userInfo: "", //用户详情信息
@@ -54,7 +53,7 @@ export default {
pageSize: 10, pageSize: 10,
order: "desc", order: "desc",
}, },
datas: [], //遍历的数据集合 depositData: [], //遍历的数据集合
rechargeList: "", //充值明细列表 rechargeList: "", //充值明细列表
walletLogList: "", //钱包变动列表 walletLogList: "", //钱包变动列表
list: [ list: [
@@ -82,27 +81,21 @@ export default {
/**分页获取预存款充值记录 */ /**分页获取预存款充值记录 */
getRecharge() { getRecharge() {
this.status = "loading";
getUserRecharge(this.params).then((res) => { getUserRecharge(this.params).then((res) => {
if (res.data.success) { if (res.data.success) {
if (res.data.result.records.length != 0) { if (res.data.result.records.length != 0) {
this.status = "loadmore"; this.depositData.push(...res.data.result.records);
this.datas.push(...res.data.result.records);
} else {
this.status = "nomore";
} }
} }
}); });
}, },
getWallet() { getWallet() {
this.status = "loading";
getWalletLog(this.params).then((res) => { getWalletLog(this.params).then((res) => {
if (res.data.success) { if (res.data.success) {
if (res.data.result.records.length != 0) { if (res.data.result.records.length != 0) {
this.datas.push(...res.data.result.records); this.depositData.push(...res.data.result.records);
} else {
this.status = "nomore";
} }
} }
}); });
@@ -110,7 +103,7 @@ export default {
changed(index) { changed(index) {
this.datas = []; this.depositData = [];
this.swiperCurrent = index; this.swiperCurrent = index;
this.params.pageNumber = 1; this.params.pageNumber = 1;
if (index == 0) { if (index == 0) {

View File

@@ -5,11 +5,11 @@
<div class="deposit">预存款金额</div> <div class="deposit">预存款金额</div>
<div class="money">{{walletNum | unitPrice }}</div> <div class="money">{{walletNum | unitPrice }}</div>
<div class="operation-btns"> <div class="operation-btns">
<div class="operation-btn light" @click="navgition('/pages/mine/deposit/withdrawal')">提现</div> <div class="operation-btn light" @click="navigateTo('/pages/mine/deposit/withdrawal')">提现</div>
<div class="operation-btn" @click="navgition('/pages/mine/deposit/recharge')">充值</div> <div class="operation-btn" @click="navigateTo('/pages/mine/deposit/recharge')">充值</div>
</div> </div>
</div> </div>
<div class="box list" @click="navgition('/pages/mine/deposit/index')"> <div class="box list" @click="navigateTo('/pages/mine/deposit/index')">
<div class="list-left">预存款明细</div> <div class="list-left">预存款明细</div>
<div class="list-right"> <div class="list-right">
<u-icon name="arrow-right"></u-icon> <u-icon name="arrow-right"></u-icon>
@@ -31,12 +31,6 @@ export default {
let result = await getUserWallet(); //预存款 let result = await getUserWallet(); //预存款
this.walletNum = result.data.result.memberWallet; this.walletNum = result.data.result.memberWallet;
} else { } else {
uni.showToast({
icon: "none",
duration: 3000,
title: "请先登录!",
});
this.$options.filters.navigateToLogin("redirectTo"); this.$options.filters.navigateToLogin("redirectTo");
} }
}, },
@@ -49,7 +43,7 @@ export default {
/** /**
* 跳转 * 跳转
*/ */
navgition(url) { navigateTo(url) {
uni.navigateTo({ uni.navigateTo({
url, url,
}); });

View File

@@ -1,3 +1,4 @@
<template> <template>
<view> <view>
<view class="-list"> <view class="-list">
@@ -5,7 +6,8 @@
<view class="content"> <view class="content">
<view class="price"> <view class="price">
<span> </span> <span> </span>
<u-input v-model="price" placeholder="" type="number" /> <u-input v-model="price" placeholder='金额' type="number" />
</view> </view>
</view> </view>

View File

@@ -1,39 +1,70 @@
<template> <template>
<view> <view>
<view class="-list"> <view class="-list">
<view class="title">提现金额</view> <view class="title">提现类型</view>
<view class="content"> <view class="content">
<view class="price"> <view class="price">
<span> </span> <u-input disabled :value="type === 'ALI' ? '支付宝' : '微信'" placeholder="" />
<u-input v-model="price" placeholder="" type="number" />
</view> </view>
</view>
<view class="all">
<view @click="handleAll" :style="{ color: $mainColor }">全部</view>
<view style="font-size: 24rpx; color: #999">可提现金额<span>{{ walletNum | unitPrice }}</span></view>
</view>
</view>
<view class="tips">
最低提现金额为1.00
</view>
</view> </view>
<view class="-list">
<view class="title">提现金额</view>
<view class="content">
<view class="price">
<span> </span>
<u-input v-model="price" placeholder="" type="number" />
</view>
<view class="all">
<view @click="handleAll" :style="{ color: $mainColor }">全部</view>
<view style="font-size: 24rpx; color: #999">可提现金额<span>{{ walletNum | unitPrice }}</span></view>
</view>
</view>
<view class="tips">
最低提现金额为 {{ minPrice }}
</view>
</view>
<view class="-list" v-if="type === 'ALI'">
<view class="title">真实姓名</view>
<view class="content">
<view class="price">
<u-input v-model="realName" placeholder="" />
</view>
</view>
</view>
<view class="-list" v-if="type === 'ALI'">
<view class="title">第三方登录账号</view>
<view class="content">
<view class="price">
<u-input v-model="connectNumber" placeholder="" />
</view>
</view>
</view>
<view class="submit" @click="cashd">提现</view> <view class="submit" @click="cashd">提现</view>
</view> </view>
</template> </template>
<script> <script>
import { getUserWallet, withdrawalApply } from "@/api/members"; import { getUserWallet, withdrawalApply, withdrawalSettingVO } from "@/api/members";
export default { export default {
data() { data() {
return { return {
price: 0, price: 0,
walletNum: 0, walletNum: 0,
minPrice: 0,
type: '',
connectNumber: '',
realName: ''
}; };
}, },
async mounted() { async mounted() {
let result = await getUserWallet(); //预存款 let result = await getUserWallet(); //预存款
let res = await withdrawalSettingVO();
this.walletNum = result.data.result.memberWallet; this.walletNum = result.data.result.memberWallet;
this.minPrice = res.data.result.minPrice;
this.type = res.data.result.type;
}, },
methods: { methods: {
@@ -41,7 +72,20 @@ export default {
this.price = this.price + ""; this.price = this.price + "";
if (this.$u.test.amount(parseInt(this.price))) { if (this.$u.test.amount(parseInt(this.price))) {
withdrawalApply({ price: this.price }).then((res) => { let params = { price: this.price };
if (this.type === 'ALI') {
if (!this.connectNumber || !this.realName) {
uni.showToast({
title: "请输入真实姓名和第三方登录账号",
duration: 2000,
icon: "none",
});
return;
}
params.connectNumber = this.connectNumber;
params.realName = this.realName;
}
withdrawalApply(params).then((res) => {
if (res.data.success) { if (res.data.success) {
uni.showToast({ uni.showToast({
title: "提现成功!", title: "提现成功!",

View File

@@ -7,9 +7,9 @@
<view class="title">{{ <view class="title">{{
item.distributionCashStatus == "APPLY" item.distributionCashStatus == "APPLY"
? "待处理" ? "待处理"
: item.distributionCashStatus == "PASS" : item.distributionCashStatus == "VIA_AUDITING"
? "通过" ? "通过"
: "拒绝" : "拒绝"
}}</view> }}</view>
<view class="price">+{{ item.price | unitPrice }}</view> <view class="price">+{{ item.price | unitPrice }}</view>
</view> </view>
@@ -23,25 +23,29 @@
<view class="log-way" v-if="achievementData.length != 0" v-for="(item, index) in achievementData" :key="index"> <view class="log-way" v-if="achievementData.length != 0" v-for="(item, index) in achievementData" :key="index">
<view class="log-item"> <view class="log-item">
<view class="log-item-view"> <view class="log-item-view">
<view class="title">{{item.goodsName}}</view> <view class="title">{{ item.goodsName }}</view>
<view class="price">+{{ item.rebate | unitPrice }}</view> <view class="price">提成金额+{{ item.rebate | unitPrice }}</view>
</view> </view>
<view class="log-item-view"> <view class="log-item-view">
<view>{{ item.createTime }}</view> <view>创建时间{{ item.createTime }}</view>
<view>{{item.storeName}}</view> </view>
<view class="log-item-footer">
<view>会员名称{{ item.memberName }}</view>
</view>
<view class="log-item-footers">
<view>订单号{{ item.orderSn }}</view>
</view> </view>
</view> </view>
</view> </view>
<view class="empty" v-if="empty"> <view class="empty" v-if="empty">
<u-loadmore :status="status" :icon-type="iconType" bg-color="#f7f7f7" /> <u-loadmore :status="status" :icon-type="iconType" bg-color="#f7f7f7" />
</view> </view>
</view> </view>
</template> </template>
<script> <script>
import { cashLog, distributionOrderList } from "@/api/goods"; import { cashLog, distributionOrderList } from "@/api/goods";
export default { export default {
data() { data () {
return { return {
cashLogData: [], //提现记录数据集合 cashLogData: [], //提现记录数据集合
achievementData: [], //分销业绩数据合集, achievementData: [], //分销业绩数据合集,
@@ -61,7 +65,7 @@ export default {
}, },
}; };
}, },
onLoad(option) { onLoad (option) {
let title; let title;
option.type == 0 ? (title = "分销业绩") : (title = "提现记录"); option.type == 0 ? (title = "分销业绩") : (title = "提现记录");
@@ -72,41 +76,41 @@ export default {
this.type = option.type; this.type = option.type;
option.type == 0 ? this.achievement() : this.history(); option.type == 0 ? this.achievement() : this.history();
}, },
mounted() {}, mounted () { },
onReachBottom() { onReachBottom () {
this.status = "loading"; this.status = "loading";
this.type == 0 ? this.achParams.pageNumber++ : this.params.pageNumber++; this.type == 0 ? this.achParams.pageNumber++ : this.params.pageNumber++;
this.type == 0 ? this.achievement() : this.history(); this.type == 0 ? this.achievement() : this.history();
}, },
methods: { methods: {
// 业绩 // 业绩
achievement() { achievement () {
uni.showLoading({ uni.showLoading({
title: "加载中", title: "加载中",
}); });
distributionOrderList(this.achParams).then((res) => { distributionOrderList(this.achParams).then((res) => {
if (res.data.success && res.data.result.records.length >= 1) { if (res.data.success && res.data.result.records.length >= 1) {
this.achievementData = res.data.result.records; this.achievementData.push(...res.data.result.records);
} else { } else {
this.status = "nomore"; this.status = "nomore";
this.empty = true; this.empty = true;
} }
uni.hideLoading(); if (this.$store.state.isShowToast){ uni.hideLoading() };
}); });
}, },
// 初始化提现历史 // 初始化提现历史
history() { history () {
uni.showLoading({ uni.showLoading({
title: "加载中", title: "加载中",
}); });
cashLog(this.params).then((res) => { cashLog(this.params).then((res) => {
if (res.data.success && res.data.result.records.length >= 1) { if (res.data.success && res.data.result.records.length >= 1) {
this.cashLogData = res.data.result.records; this.cashLogData.push(...res.data.result.records);
} else { } else {
this.status = "nomore"; this.status = "nomore";
this.empty = true; this.empty = true;
} }
uni.hideLoading(); if (this.$store.state.isShowToast){ uni.hideLoading() };
}); });
}, },
}, },
@@ -116,15 +120,18 @@ export default {
.empty { .empty {
margin: 40rpx 0; margin: 40rpx 0;
} }
.price { .price {
color: $main-color; color: $main-color;
font-weight: bold; font-weight: bold;
} }
.log-list { .log-list {
padding: 0 8rpx; padding: 0 8rpx;
overflow: hidden; overflow: hidden;
margin: 20rpx 0; margin: 20rpx 0;
} }
.log-way { .log-way {
margin: 10rpx 0; margin: 10rpx 0;
overflow: hidden; overflow: hidden;
@@ -132,13 +139,30 @@ export default {
border-radius: 10rpx; border-radius: 10rpx;
padding: 20rpx 0; padding: 20rpx 0;
} }
.title { .title {
font-size: 30rpx; font-size: 30rpx;
font-weight: bold; font-weight: bold;
} }
.log-item-view { .log-item-view {
padding: 8rpx 32rpx; padding: 8rpx 32rpx;
display: flex; display: flex;
font-size: 13px;
justify-content: space-between; justify-content: space-between;
} }
</style>
.log-item-footer {
padding: 8rpx 32rpx;
display: flex;
font-size: 13px;
justify-content: space-between;
}
.log-item-footers {
padding: 8rpx 32rpx;
display: flex;
font-size: 13px;
justify-content: space-between;
}
</style>

View File

@@ -78,7 +78,7 @@ export default {
if (res.data.result) { if (res.data.result) {
this.distributionData = res.data.result; this.distributionData = res.data.result;
} }
uni.hideLoading(); if (this.$store.state.isShowToast){ uni.hideLoading() };
}); });
}, },
}, },
@@ -98,7 +98,7 @@ export default {
.nav-list { .nav-list {
color: #fff; color: #fff;
padding: 40rpx 0; padding: 40rpx 0;
background: $aider-light-color; background: linear-gradient(91deg, $light-color 1%, $aider-light-color 99%);
} }
.total { .total {
padding: 10rpx 0; padding: 10rpx 0;

View File

@@ -66,42 +66,45 @@
<!-- 商品列表 --> <!-- 商品列表 -->
<view class="goods-list"> <view class="goods-list">
<u-swipe-action v-for="(item, index) in goodsList" :disabled="!params.checked" :show="item.___selected" @open="openAction(item)" :index="index" :options="options" bg-color="#fff" <scroll-view class="body-view" scroll-y @scrolltolower="renderDate">
ref="swiperAction" :key="item.id" @click="changeActionTab(item)"> <u-swipe-action v-for="(item, index) in goodsList" :disabled="!params.checked" :show="item.___selected" @open="openAction(item)" :index="index" :options="options" bg-color="#fff"
ref="swiperAction" :key="item.id" @click="changeActionTab(item)">
<div class="goods-item"> <div class="goods-item">
<view class="goods-item-img" @click="handleNavgationGoods(item)"> <view class="goods-item-img" @click="handleNavgationGoods(item)">
<u-image width="176rpx" height="176rpx" :src="item.thumbnail"></u-image> <u-image width="176rpx" height="176rpx" :src="item.thumbnail"></u-image>
</view>
<view class="goods-item-desc">
<!-- 商品描述 -->
<view class="-item-title" @click="handleNavgationGoods(item)">
{{ item.goodsName }}
</view> </view>
<!-- 商品金额 --> <view class="goods-item-desc">
<view class="-item-price" @click="handleNavgationGoods(item)"> <!-- 商品描述 -->
佣金: <view class="-item-title" @click="handleNavgationGoods(item)">
<span> {{ item.commission | unitPrice }}</span> {{ item.goodsName }}
</view> </view>
<!-- 比率佣金 --> <!-- 商品金额 -->
<view class="-item-bottom"> <view class="-item-price" @click="handleNavgationGoods(item)">
<view class="-item-bootom-money" @click="handleNavgationGoods(item)"> 佣金:
<!-- <view class="-item-bl"> <span> {{ item.commission | unitPrice }}</span>
比率: </view>
<span>{{ "5.00%" }}</span> <!-- 比率佣金 -->
</view> --> <view class="-item-bottom">
<view class="-item-yj"> <view class="-item-bootom-money" @click="handleNavgationGoods(item)">
<span>{{ item.price | unitPrice }}</span> <!-- <view class="-item-bl">
比率:
<span>{{ "5.00%" }}</span>
</view> -->
<view class="-item-yj">
<span>{{ item.price | unitPrice }}</span>
</view>
</view>
<view>
<view class="click" v-if="!params.checked" @click="handleClickGoods(item)">立即选取</view>
<view class="click" v-if="params.checked" @click="handleLink(item)">分销商品</view>
</view> </view>
</view> </view>
<view>
<view class="click" v-if="!params.checked" @click="handleClickGoods(item)">立即选取</view>
<view class="click" v-if="params.checked" @click="handleLink(item)">分销商品</view>
</view>
</view> </view>
</view> </div>
</div> </u-swipe-action>
</u-swipe-action> </scroll-view>
<view class="empty"> <view class="empty">
<!-- <u-empty v-if="empty" text="没有分销商品了" mode="list"></u-empty> --> <!-- <u-empty v-if="empty" text="没有分销商品了" mode="list"></u-empty> -->
@@ -295,15 +298,30 @@ export default {
}); });
this.goodsList.push(...res.data.result.records); this.goodsList.push(...res.data.result.records);
} }
if (this.goodsList.length == 0) { if (this.goodsList.length === 0) {
this.empty = true; this.empty = true;
} }
}); });
}, },
/**
* 底部加载数据
*/
renderDate() {
this.params.pageNumber += 1;
this.init();
},
}, },
}; };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.body-view {
overflow-y: auto;
height: calc(100vh - 44px - 80rpx - 104rpx);
}
.canvas-hide { .canvas-hide {
/* 1 */ /* 1 */
position: fixed; position: fixed;

View File

@@ -75,7 +75,7 @@ export default {
if (res.data.result) { if (res.data.result) {
this.distributionData = res.data.result; this.distributionData = res.data.result;
} }
uni.hideLoading(); if (this.$store.state.isShowToast){ uni.hideLoading() };
}); });
}, },
}, },

View File

@@ -1,37 +1,42 @@
<template> <template>
<div class="wrapper"> <div class="wrapper">
<u-parse v-html="res.content"></u-parse> <u-parse :show-with-animation="true" :lazy-load="true" :selectable="true" :html="res.content" v-if="res"></u-parse>
</div> </div>
</template> </template>
<script> <script>
import { getArticleDetail } from "@/api/article"; import { getArticleDetailByType } from "@/api/article";
export default { export default {
data() { data() {
return { return {
res: "", res: "",
way: { way: {
user: { USER_AGREEMENT: {
title: "用户协议", title: "服务协议",
type: "USER_AGREEMENT", type: "USER_AGREEMENT",
}, },
privacy: { PRIVACY_POLICY: {
title: "隐私政策", title: "隐私政策",
type: "PRIVACY_POLICY", type: "PRIVACY_POLICY",
}, },
message: { LICENSE_INFORMATION: {
title: "证照信息", title: "证照信息",
type: "LICENSE_INFORMATION", type: "LICENSE_INFORMATION",
}, },
about: { ABOUT: {
title: "关于我们", title: "关于我们",
type: "ABOUT", type: "ABOUT",
}, },
STORE_REGISTER: {
title: "店铺入驻协议",
type: "STORE_REGISTER",
},
}, },
}; };
}, },
mounted() {}, mounted() {},
onLoad(option) { onLoad(option) {
console.log(this.way)
uni.setNavigationBarTitle({ uni.setNavigationBarTitle({
title: this.way[option.type].title, title: this.way[option.type].title,
}); });
@@ -40,9 +45,10 @@ export default {
methods: { methods: {
init(option) { init(option) {
getArticleDetail(this.way[option.type].type).then((res) => { getArticleDetailByType(this.way[option.type].type).then((res) => {
if (res.data.success) { if (res.data.success) {
this.res = res.data.result; this.res = res.data.result;
console.log(res)
} }
}); });
}, },

5802
pages/mine/im/index-app.scss Normal file

File diff suppressed because one or more lines are too long

878
pages/mine/im/index.vue Normal file
View File

@@ -0,0 +1,878 @@
<template>
<view class="wrapper">
<u-navbar class="my-title" title-size="32" :title="toUser.name"></u-navbar>
<!-- 空盒子用来防止消息过少时 拉起键盘会遮盖消息 -->
<view :animation="anData" style="height:0;">
</view>
<!-- 消息体 -->
<!-- 用来获取消息体高度 -->
<view id="msgList">
<!-- 消息 -->
<view class="flex-column-start" v-if="msgList.length" v-for="(item, index) in msgList" :key="index">
<view class="flex-row-start column-time">
<!-- <view v-show="compareTime(index, item.createTime)" class="flex-row-start date-text"
v-text="beautifyTime(item.createTime)">
</view> -->
</view>
<!-- 用户消息 头像可选加入-->
<view v-if="item.my" class="flex justify-end padding-right one-show align-start padding-top">
<view class="flex justify-end" style="width: 400rpx;margin-top: 12px;">
<view>
<view class="user-name">{{ user.nickName }}</view>
<view class="margin-left padding-chat bg-user-orang" style="border-radius: 35rpx; ">
<text style="word-break: break-all;"
v-if="item.messageType === 'MESSAGE' && !emojistwo.includes(item.text)">{{ item.text }}</text>
<view v-if="item.messageType === 'MESSAGE' && emojistwo.includes(item.text)"
v-html="textReplaceEmoji(item.text)"></view>
<view v-if="item.messageType == 'GOODS'">
<view class="goods-card u-flex u-row-between u-p-b-0" style="width:100%;margin: 0 0; ">
<view class="image-box" @click="jumpGoodDesc(item)">
<image class="image" :src="JSON.parse(item.text)['thumbnail']" mode="widthFix"></image>
</view>
<view class="goods-desc" @click="jumpGoodDesc(item)">
<view class="goods-desc-name">
<text class="goods-card-goods-name">{{
JSON.parse(item.text)['goodsName']
}}</text>
</view>
<view class="goods-desc-rice" >{{
JSON.parse(item.text)['price'] | unitPrice
}}
</view>
</view>
</view>
</view>
<view v-if="item.messageType == 'ORDER'" @click="linkTosOrders(item.text)">
<view class="order-sn">
<div class="wes">订单号{{ JSON.parse(item.text)['sn'] }}</div>
<div class='order-item flex' v-if="JSON.parse(item.text).orderItems.length" v-for='(order,orderIndex) in JSON.parse(item.text).orderItems'>
<u-image mode="widthFix" width='120rpx' height='120rpx' :src="order.image" />
<view class="name-or-time">
<div class="wes-2" >{{
order.name
}}</div>
<div class="main-color goods-desc-rice">{{
order.goodsPrice | unitPrice("¥")
}}</div>
</view>
</div>
<view class="order-list">
<view class="order-time">
<text>{{ JSON.parse(item.text)['paymentTime'] }}</text>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
<view>
<u-avatar :src="user.face" :text="user.face ? '' : user.name" bg-color="#DDDDDD"></u-avatar>
</view>
</view>
<!-- 接收人消息 -->
<view v-else class="flex-row-start margin-left margin-top one-show">
<view class="chat-img flex-row-center">
<u-avatar :src="toUser.face" :text="toUser.face ? '' : toUser.name" bg-color="#DDDDDD">
</u-avatar>
</view>
<view class="flex" style="width: 500rpx;">
<view>
<view class="other-name">{{ toUser.name }}</view>
<view class="margin-left padding-chat flex-column-start bg-to-color" style="border-radius: 35rpx;">
<text style="word-break: break-all;"
v-if="item.messageType === 'MESSAGE' && !emojistwo.includes(item.text)">{{ item.text }}</text>
<view v-if="item.messageType === 'MESSAGE' && emojistwo.includes(item.text)"
v-html="textReplaceEmoji(item.text)"></view>
<view v-if="item.messageType === 'GOODS'">
<view class="goods-card u-flex u-row-between u-p-b-0" style="width:100%;margin: 0 0; ">
<view class="image-box" @click="jumpGoodDesc(item)">
<image class="image" :src="JSON.parse(item.text)['thumbnail']" mode="widthFix"></image>
</view>
<view class="goods-desc" @click="jumpGoodDesc(item)">
<view class="goods-desc-name">
<text class="goods-card-goods-name">{{
JSON.parse(item.text)['goodsName']
}}</text>
</view>
<view class="goods-desc-rice" >¥{{
JSON.parse(item.text)['price']
}}
</view>
</view>
</view>
</view>
<view v-if="item.messageType === 'ORDER'">
<view class="order-sn">
<text>订单号{{ JSON.parse(item.text)['sn'] }}</text>
<view class="order-list">
<img style="height: 120rpx; width: 120rpx; margin-top: 15rpx;"
:src="JSON.parse(item.text)['groupImages']" mode="widthFix" />
<view class="name-or-time">
<text @click="linkTosOrders(item.text)">{{
JSON.parse(item.text)['groupName']
}}</text>
<view class="order-time">
<text>{{ JSON.parse(item.text)['paymentTime'] }}</text>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
<!-- 防止消息底部被遮 -->
<view v-if="showHide && !localImGoodsId && showHideModel" class="flex-row-start margin-left margin-top"
style="height: 120rpx;">
</view>
<!-- 如果没有聊天记录定位到底部 -->
<view
:style="{ position:'fixed' , bottom:(inputHeight+66)+'px' , width: '100%' }">
<view class="cart-message" v-if="showHide && !localImGoodsId && showHideModel">
<view class="goods-card u-flex u-row-between u-p-b-0">
<view class="image-box" @click="jumpGoodDesc(item)">
<image class="image" :src="goodListData.thumbnail" mode="widthFix"></image>
</view>
<view class="goods-desc" @click="jumpGoodDesc(item)">
<view class="goods-desc-name">
<text class="goods-card-goods-name">{{
goodListData.goodsName
}}</text>
</view>
<view class="goods-desc-rice" > {{
goodListData.price | unitPrice
}}
</view>
</view>
<view class="cancel" @click="cancelModel">X</view>
<view class="send-goods" @click="sendGoodsMessage">
<view>发送商品</view>
</view>
</view>
</view>
</view>
<!-- loading是显示 -->
<!-- <view v-show="msgLoad" class=" margin-left margin-top">
<view class="chat-img flex-row-center">
<image style="height: 75rpx;width: 75rpx;" src="../../static/image/robt.png" mode="aspectFit"></image>
</view>
<view class="flex" style="width: 500rpx;">
<view class="margin-left padding-chat flex-column-start"
style="border-radius: 35rpx;background-color: #f9f9f9;">
<view class="cuIcon-loading turn-load" style="font-size: 35rpx;color: #3e9982;">
</view>
</view>
</view>
</view> -->
<!-- 防止消息底部被遮 -->
<view style="height: 120rpx;">
</view>
</view>
<!-- 底部导航栏 -->
<view :style="{position: 'fixed',bottom:inputHeight+'px'}" class="flex-column-center" :animation="animationData">
<view class="bottom-dh-char flex-row-around" style="font-size: 55rpx;">
<!-- vue无法使用软键盘"发送" -->
<input @focus="inputBindFocus" @blur="eventHandle" :adjust-position="false" v-model="msg" class="dh-input" type="text" style="background-color: #f0f0f0;" @confirm="sendMessage"
confirm-type="send" placeholder="用一句简短的话描述您的问题" />
<view @click="sendMessage" class="cu-tag bg-main-color send round">
发送
</view>
<!-- <text @click="ckAdd" class="cuIcon-roundaddfill text-brown"></text> -->
</view>
</view>
</view>
</template>
<script>
// rpx和px的比率
var l
// 可用窗口高度
var wh
// 顶部空盒子的高度
var mgUpHeight
import {
getTalkMessage,
getTalkByUser,
jumpObtain
} from "@/api/im.js";
import SocketService from "@/utils/socket_service.js";
import storage from "@/utils/storage.js";
import {
beautifyTime
} from "@/utils/filters.js"
import config from '@/config/config.js'
import { textReplaceEmoji, emojistwo } from '@/utils/emojis.js';
export default {
// 页面卸载后清除imGoodId
onUnload () {
// #ifdef H5
uni.setStorageSync("imGoodId", '');
// #endif
if (this.socketOpen == true) {
uni.closeSocket();
}
},
onLoad (options) {
// 没有goodsid则不显示 发送商品弹窗
this.showHideModel = options.goodsid
// 发送后刷新页面不显示 发送商品弹窗 local里面imGoodId不为空显示
// #ifdef H5
this.localImGoodsId = uni.getStorageSync("imGoodId");
// #endif
this.resolve = options
// 请求商品信息
if (this.resolve.goodsid) {
this.commodityDetails()
}
// 如果需要缓存消息缓存msgList即可
// 监听键盘拉起
// 因为无法控制键盘拉起的速度,所以这里尽量以慢速处理
uni.onKeyboardHeightChange(res => {
const query = uni.createSelectorQuery()
query.select('#msgList').boundingClientRect(data => {
// 若消息体没有超过2倍的键盘则向下移动差值,防止遮住消息体
var up = res.height * 2 - data.height - l * 110
if (up > 0) {
// 动态改变空盒子高度
this.messageBoxMove(up, 300)
// 记录改变的值,若不收回键盘且发送了消息用来防止消息过多被遮盖
mgUpHeight = up
}
// 收回
if (res.height == 0) {
this.messageBoxMove(0, 0)
}
}).exec();
})
var query = uni.getSystemInfoSync()
l = query.screenWidth / 750
wh = query.windowHeight
this.scrollHeight = (query.windowHeight - 44) + "px"
this.user = storage.getUserInfo()
this.toUser = storage.getTalkToUser()
if (options.talkId) {
this.params.talkId = options.talkId;
this.getTalkMessage()
} else {
this.getTalk(options.userId)
}
// this.ws.connect();
this.sokcet();
},
// 页面隐藏
onHide () {
uni.closeSocket();
},
onUnload () {
uni.closeSocket();
},
onPullDownRefresh () {
this.params.pageNumber = this.params.pageNumber + 1
this.getTalkMessage()
setTimeout(function () {
uni.stopPullDownRefresh();
}, 1000);
},
data () {
return {
textReplaceEmoji,
emojistwo,
socketOpen: false, //是否连接
storage,
fixed: 'fixed',
bottom: '50px',
width: '100%',
showHideModel: undefined,
localImGoodsId: '',
showHide: true,
msgLoad: false,
anData: {},
animationData: {},
msgList: [],
oldHeight: 0,
params: { //搜索条件
talkId: '',
pageSize: 10,
pageNumber: 1,
},
goToIndex: 0, // 前往位置
msg: "",
go: 0,
newMessageNum: 0,
user: {},
toUser: {},
scrollHeight: 0,
ws: new SocketService(),
resolve: {},
goodListData: {},
count: 0, //判断socket断开连接请求次数
inputHeight:0,
}
},
// watch: {
// 'ws.callBackMapping': {
// handler: function (val) {
// val = JSON.parse(val)
// if (val.messageResultType == 'MESSAGE') {
// this.msgList.push(val.result)
// }
// this.newMessageNum++;
// //接收到消息后发送已读
// let msg = val
// msg.operation_type = 'READ'
// this.ws.send(JSON.stringify(msg))
// }
// }
// },
methods: {
eventHandle(){
this.inputHeight = 0
},
inputBindFocus(e){
if (e.detail.height) {
this.inputHeight = e.detail.height //这个高度就是软键盘的高度
}
},
sendMessage () {
if (this.msg == "") {
return 0;
}
if (this.socketOpen == false) {
return
}
let msg = {
operation_type: "MESSAGE",
to: this.toUser.userId,
from: this.user.id,
message_type: "MESSAGE",
context: this.msg,
talk_id: this.params.talkId,
}
let data = JSON.stringify(msg);
uni.sendSocketMessage({
data: data,
});
this.msgList.push({
"text": this.msg,
"my": true,
"messageType": 'MESSAGE'
})
let type = 'down';
this.msgGo(type)
this.msg = ""
},
sendGoodsMessage () {
let msg = {
operation_type: "MESSAGE",
to: this.toUser.userId,
from: this.user.id,
message_type: "GOODS",
context: this.goodListData,
talk_id: this.params.talkId,
}
let data = JSON.stringify(msg);
uni.sendSocketMessage({
data: data
});
this.msgList.push({
"text": JSON.stringify(this.goodListData),
"my": true,
"messageType": 'GOODS'
})
this.showHide = false
// #ifdef H5
uni.setStorageSync("imGoodId", 1111111);
// #endif
this.$nextTick(() => {
uni.pageScrollTo({
scrollTop: 2000000,
duration: 300
});
})
},
sokcet () {
var _this = this;
uni.closeSocket();
this.socketOpen = false;
try {
//WebSocket的地址
var url = config.baseWsUrl + '/' + storage.getAccessToken();
// 连接
uni.connectSocket({
url: url,
});
// 监听WebSocket连接已打开
uni.onSocketOpen(function (res) {
_this.socketOpen = true;
});
if (!this.socketOpen) {
// 监听连接失败
uni.onSocketError(function (err) {
if (this.count < 3) {
if (err && err.code != 1000) {
_this.socketOpen = true;
setTimeout(() => {
uni.connectSocket({
url: url,
});
}, 2000)
}
} else {
uni.closeSocket();
}
this.count++
});
}
// 监听收到信息
uni.onSocketMessage(function (res) {
res.data = JSON.parse(res.data)
console.log(res.data.result);
if (res.data.messageResultType == 'MESSAGE') {
_this.msgList.push(res.data.result)
console.log(_this.msgList)
}
console.log(res.data)
_this.msgGo()
})
} catch (e) {
uni.closeSocket();
}
// 监听是否断线,断线进行重新连接
uni.onSocketClose((res) => {
if (res.code != null && res.code != 1000) {
this.sokcet()
}
})
},
beautifyTime,
//订单详情
linkTosOrders (val) {
let order = JSON.parse(val)
uni.navigateTo({
url: '/pages/order/orderDetail?sn=' + order.sn,
});
},
// 跳转商品详情页
jumpGoodDesc (item) {
let info = JSON.parse(item.text)
uni.navigateTo({
url: `/pages/product/goods?id=${info.id}&goodsId=${info.goodsId}`,
});
},
//取消发送
cancelModel () {
this.showHide = false
},
// 请求商品详情
commodityDetails () {
jumpObtain(this.resolve.skuid, this.resolve.goodsid).then((res) => {
this.goodListData = res.data.result.data
})
},
// 切换输入法时移动输入框(按照官方的上推页面的原理应该会自动适应不同的键盘高度-->官方bug)
goPag (kh) {
this.retractBox(0, 250)
if (this.keyHeight != 0) {
if (kh - this.keyHeight > 0) {
this.retractBox(this.keyHeight - kh, 250)
}
}
},
// 移动顶部的空盒子
messageBoxMove (x, t) {
var animation = uni.createAnimation({
duration: t,
timingFunction: 'linear',
})
this.animation = animation
animation.height(x).step()
this.anData = animation.export()
},
// 保持消息体可见
msgGo (type) {
const query = uni.createSelectorQuery()
// 延时100ms保证是最新的高度
setTimeout(() => {
// 获取消息体高度
query.select('#msgList').boundingClientRect(data => {
// 如果超过scorll高度就滚动scorll
if (type == 'up') {
this.go = data.height - this.oldHeight
} else if (type == 'down') {
this.go = data.height - wh + 120
}
// if (this.oldHeight > 0) {
// this.go = data.height - this.oldHeight
// } else {
// // if (data.height - (wh - 32) > 0) {
// this.go = data.height - wh + 120
// }
// 保证键盘第一次拉起时消息体能保持可见
var moveY = wh - data.height
// 超出页面则缩回空盒子
if (moveY - mgUpHeight < 0) {
// 小于0则视为0
if (moveY < 0) {
this.messageBoxMove(0, 200)
} else {
// 否则缩回盒子对应的高度
this.messageBoxMove(moveY, 200)
}
}
uni.pageScrollTo({
scrollTop: this.go,
duration: 0
})
this.oldHeight = data.height
}).exec();
}, 100)
},
// 回答问题的业务逻辑
answer (id) {
// 这里应该传入问题的id,模拟就用index代替了
},
// 不建议输入框聚焦时操作此动画
ckAdd () {
if (!this.showTow) {
this.retractBox(-180, 350)
} else {
this.retractBox(0, 200)
}
this.showTow = !this.showTow
},
hideKey () {
uni.hideKeyboard()
},
// 拉起/收回附加栏
retractBox (x, t) {
var animation = uni.createAnimation({
duration: t,
timingFunction: 'ease',
})
this.animation = animation
animation.translateY(x).step()
this.animationData = animation.export()
},
async getTalkMessage () {
let type = '';
await getTalkMessage(this.params).then(res => {
if (res.data.success) {
if (this.msgList.length >= 10) {
this.msgList.unshift(...res.data.result)
type = 'up'
} else {
this.msgList.unshift(...res.data.result)
type = 'down'
}
this.msgList.forEach(item => {
if (item.fromUser === this.user.id) {
item.my = true
}
})
}
})
console.log(this.msgList);
this.msgGo(type)
},
// 上拉加载
touchMoreMessage (e) {
if (e.target.scrollTop == 0) {
this.params.pageNumber = this.params.pageNumber + 1
this.getTalkMessage()
}
},
async getTalk (userId) {
getTalkByUser(userId).then(res => {
if (res.data.success) {
this.toUser = res.data.result
this.params.talkId = res.data.result.id
this.getTalkMessage()
}
})
},
// 处理消息时间是否显示
compareTime (index, datetime) {
if (datetime == undefined) {
return false;
}
if (typeof datetime == "number") {
datetime = this.unixToDate(datetime, "yyyy-MM-dd hh:mm");
}
if (this.msgList[index].is_revoke == 1) {
return false;
}
if (datetime) {
datetime = datetime.replace(/-/g, "/");
}
let time = Math.floor(Date.parse(datetime) / 1000);
let currTime = Math.floor(new Date().getTime() / 1000);
// 当前时间5分钟内时间不显示
if (currTime - time < 300) return false;
// 判断是否是最后一条消息,最后一条消息默认显示时间
if (index == this.msgList.length - 1) {
return true;
}
let nextDate
if (this.msgList[index + 1] && this.msgList[index + 1].createTime) {
nextDate = this.msgList[index + 1].createTime.replace(/-/g, "/");
if (nextDate - datetime < 300) return false;
}
return !(
this.unixToDate(new Date(datetime), "{y}-{m}-{d} {h}:{i}") ==
this.unixToDate(new Date(nextDate), "{y}-{m}-{d} {h}:{i}")
);
},
/**
* 将unix时间戳转换为指定格式
* @param unix 时间戳【秒】
* @param format 转换格式
* @returns {*|string}
*/
unixToDate (unix, format) {
if (!unix) return unix;
let _format = format || "yyyy-MM-dd hh:mm:ss";
const d = new Date(unix);
const o = {
"M+": d.getMonth() + 1,
"d+": d.getDate(),
"h+": d.getHours(),
"m+": d.getMinutes(),
"s+": d.getSeconds(),
"q+": Math.floor((d.getMonth() + 3) / 3),
S: d.getMilliseconds(),
};
if (/(y+)/.test(_format))
_format = _format.replace(
RegExp.$1,
(d.getFullYear() + "").substr(4 - RegExp.$1.length)
);
for (const k in o)
if (new RegExp("(" + k + ")").test(_format))
_format = _format.replace(
RegExp.$1,
RegExp.$1.length === 1 ?
o[k] :
("00" + o[k]).substr(("" + o[k]).length)
);
return _format;
},
}
}
</script>
<style lang="scss" scoped>
.send{
font-size: 24rpx !important;
}
.order-time {
margin-top: 15rpx;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
.wrapper {
height: auto !important;
}
.order-list {
display: flex;
color: black;
font-size: 20rpx;
font-weight: bold;
width: 95%;
}
.order-sn {
width: 350rpx;
}
.name-or-time {
width: 200rpx;
margin: 15rpx 15rpx;
}
.goods-card {
border-radius: 20rpx;
margin-top: 15rpx;
background-color: #ffffff;
padding-left: 12rpx;
width: 95%;
height: 120rpx;
display: flex;
flex-wrap: wrap;
color: #302c2b;
.image-box {
width: 122rpx;
height: 122rpx;
overflow: hidden;
.image {
width: 122rpx;
border-radius: 10rpx;
}
}
.goods-desc {
flex: 1;
overflow: hidden;
margin-left: 12rpx;
width: 400rpx;
.goods-desc-name {
font-size: 30rpx;
line-height: 1.5;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
margin-bottom: 20rpx;
.goods-card-goods-name {
color: black;
text-overflow: ellipsis;
font-size: 26rpx;
font-weight: bold;
}
}
.price {
margin-top: 50rpx;
line-height: 2;
margin-left: 5px;
font-size: 26rpx;
font-weight: 700;
}
}
.send-goods {
color: #ffffff;
height: 50rpx;
width: 130rpx;
background-color: #f21c0c;
font-size: 24rpx;
border-radius: 17rpx;
text-align: center;
line-height: 50rpx;
padding: 0 10rpx;
position: relative;
top: 20rpx;
right: 20rpx;
}
}
.cancel {
color: #737373;
position: relative;
bottom: 40rpx;
left: 12%;
}
.cart-message {
display: flex;
justify-content: center;
align-items: center;
}
.bottom-dh-char {
background-color: #f9f9f9;
width: 750rpx;
height: 110rpx;
}
.user-name {
text-align: right;
font-size: 24rpx;
color: #737373;
margin-bottom: 10rpx;
margin-right: 10rpx;
}
.other-name {
text-align: left;
font-size: 24rpx;
color: #737373;
margin-bottom: 10rpx;
margin-left: 10rpx;
}
.dh-input {
width: 500rpx;
height: 65rpx;
border-radius: 30rpx;
padding-left: 15rpx;
font-size: 22rpx;
background-color: #FFFFFF;
}
.column-time {
justify-content: center;
}
.chat-img {
border-radius: 50%;
width: 100rpx;
height: 100rpx;
background-color: #f7f7f7;
}
.padding-chat {
padding: 17rpx 20rpx;
}
.tb-nv {
width: 50rpx;
height: 50rpx;
}
.goods-desc-rice{
font-size: 24rpx;
color: $main-color;
font-weight: bold;
margin-top: 10rpx;
}
.order-item{
margin: 10rpx 0
}
uni-page-head {
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 9999;
}
</style>
<style lang="scss" scoped>
@import "./index-app.scss";
</style>

237
pages/mine/im/list.vue Normal file
View File

@@ -0,0 +1,237 @@
<template>
<view class="content">
<u-navbar class="my-title" title-size="32" :title="'消息(' + talkList.length + ')'"></u-navbar>
<scroll-view class="list-scroll-content" scroll-y @scrolltolower="loadData(tabIndex)">
<!-- 消息列表 -->
<div class="iconBox">
<view class="icon-list">
<view class="icon-item" @click="cleanUnread()">
<div class="bag bag1">
<u-icon name="trash" size="50" color="#fff"></u-icon>
</div>
<view>清除未读</view>
</view>
<view class="icon-item" @click="navigateTo('/pages/tabbar/home/title')">
<div class="bag bag2">
<u-icon name="bell" size="50" color="#fff"></u-icon>
</div>
<view>系统消息</view>
</view>
</view>
</div>
<u-search class="nav-search" v-model="userName" clearabled @change="userTalkList()" placeholder="搜索用户"
:show-action="false"></u-search>
<view class="talk-view" :key="index" v-for="(item, index) in talkList">
<view>
<view @click="onclickToTalkInfo(item)">
<view class="talk-item-view">
<view class="talk-img">
<u-avatar :src="item.face" :text="item.face ? '' : item.name" bg-color="#DDDDDD"></u-avatar>
</view>
<view class="talk-info">
<view class="talk-name u-line-2">{{ item.name }}
<u-tag class="talk-tag" size="mini" text="店铺" type="warning" v-if="item.storeFlag" />
</view>
<view class="talk-message">
<span v-if="item.lastMessageType == 'MESSAGE'">{{ item.lastTalkMessage }}</span>
<span v-if="item.lastMessageType == 'GOODS'">[商品链接]</span>
<span v-if="item.lastMessageType == 'ORDER'">[订单信息]</span>
</view>
</view>
<view class="talk-time">
<view>
{{ beautifyTime(item.lastTalkTime) }}
</view>
<view>
<u-badge type="error" absolute :offset="[45, 20]" :count="item.unread"></u-badge>
</view>
</view>
</view>
</view>
</view>
</view>
<!-- 空白页 -->
<u-empty text="暂无信息" mode="list" v-if="talkList.length === 0"></u-empty>
</scroll-view>
</view>
</template>
<script>
import { getTalkList, clearmeaager } from "@/api/im.js";
import storage from "@/utils/storage.js";
import { beautifyTime } from "@/utils/filters.js"
export default {
data () {
return {
storage,
count: {
loadStatus: "more",
},
talkList: [], //聊天列表
userName: '',
pointData: {}, //累计获取 未输入 集合
};
},
onShow () {
this.userTalkList();
},
onPullDownRefresh () {
this.userTalkList()
console.log('下拉事件');
setTimeout(function () {
uni.stopPullDownRefresh();
}, 1000);
},
/**
* 触底加载
*/
onReachBottom () {
this.userTalkList();
},
methods: {
beautifyTime,
onclickToTalkInfo (val) {
storage.setTalkToUser(val)
uni.navigateTo({
url:
"/pages/mine/im/index?talkId=" + val.id,
});
},
/**
* 获取聊天列表
*/
userTalkList () {
let params = {
userName: this.userName,
}
uni.showLoading({
title: "加载中",
});
getTalkList(params).then((res) => {
if (this.$store.state.isShowToast){ uni.hideLoading() };
if (res.data.success) {
this.talkList = res.data.result;
console.log(this.talkList, 'this.talkListthis.talkList');
}
});
},
navigateTo (url) {
uni.navigateTo({
url,
});
},
cleanUnread () {
clearmeaager().then((res) => {
console.log(res);
if (res.data.code == 200) {
this.userTalkList();
uni.showToast({
icon: "none",
title: res.data.message,
});
}
})
},
},
};
</script>
<style lang="scss" scoped>
.talk-view {
border-radius: 20rpx;
background-color: #fff;
.talk-item-view {
display: flex;
flex-wrap: wrap;
flex-direction: row;
padding: 10rpx 20rpx;
.talk-img {
width: 100rpx;
height: 100rpx;
margin-right: 10rpx;
margin-bottom: 10rpx;
}
.talk-info {
padding-left: 30rpx;
flex: 1;
.talk-name {
font-size: 28rpx;
margin-bottom: 10rpx;
font-weight: bold;
color: #333333;
}
.talk-message {
font-size: 28rpx;
margin-top: 10rpx;
color: #888787;
}
.talk-tag {
margin-left: 10rpx;
}
}
}
}
.talk-time {
position: relative;
}
.iconBox {
width: 94%;
margin: 0 3%;
background: #fff;
border-radius: 20rpx;
box-shadow: 0 4rpx 24rpx 0 rgba($color: #f6f6f6, $alpha: 1);
// transform: translateY(-30rpx);
}
.icon-list {
height: 140rpx;
text-align: center;
font-size: $font-sm;
display: flex;
justify-content: space-around;
align-items: center;
padding: 0 3%;
color: #999;
.icon-item {
position: relative;
line-height: 2em;
width: 96rpx;
:first-child {
font-size: 48rpx;
margin-bottom: 10rpx;
}
}
}
.bag {
width: 56rpx;
height: 56rpx;
border-radius: 50%;
margin: 0 auto;
}
.bag1 {
background: #ff0015;
}
.bag2 {
background: #73AF7C;
}
</style>
<style lang="scss" scoped>
@import "./index-app.scss";
</style>

166
pages/mine/im/socket.js Normal file
View File

@@ -0,0 +1,166 @@
import config from '@/config/config.js'
import storage from '@/utils/storage';
class socketIO {
constructor(data, time, url) {
this.socketTask = null
this.is_open_socket = false //避免重复连接
this.url = config.baseWsUrl + '/' + storage.getAccessToken() //连接地址
this.data = data ? data : null
this.connectNum = 1 // 重连次数
this.traderDetailIndex = 100 // traderDetailIndex ==2 重连
this.accountStateIndex = 100 // traderDetailIndex ==1 重连
this.followFlake = false // traderDetailIndex == true 重连
//心跳检测
this.timeout = time ? time : 15000 //多少秒执行检测
this.heartbeatInterval = null //检测服务器端是否还活着
this.reconnectTimeOut = null //重连之后多久再次重连
}
// 进入这个页面的时候创建websocket连接【整个页面随时使用】
connectSocketInit (data) {
this.data = data
this.socketTask = uni.connectSocket({
url: this.url,
success: () => {
console.log("正准备建立websocket中...");
// 返回实例
return this.socketTask
},
});
this.socketTask.onOpen((res) => {
this.connectNum = 1
console.log("WebSocket连接正常");
this.send(data)
clearInterval(this.reconnectTimeOut)
clearInterval(this.heartbeatInterval)
this.is_open_socket = true;
this.start();
// 注:只有连接正常打开中 ,才能正常收到消息
this.socketTask.onMessage((e) => {
// 字符串转json
let res = JSON.parse(e.data);
console.log("res---------->", res) // 这里 查看 推送过来的消息
if (res.data) {
uni.$emit('getPositonsOrder', res);
}
});
})
// 监听连接失败这里代码我注释掉的原因是因为如果服务器关闭后和下面的onclose方法一起发起重连操作这样会导致重复连接
uni.onSocketError((res) => {
console.log('WebSocket连接打开失败请检查');
this.socketTask = null
this.is_open_socket = false;
clearInterval(this.heartbeatInterval)
clearInterval(this.reconnectTimeOut)
uni.$off('getPositonsOrder')
if (this.connectNum < 6) {
uni.showToast({
title: `WebSocket连接失败正尝试第${this.connectNum}次连接`,
icon: "none"
})
this.reconnect();
this.connectNum += 1
} else {
uni.$emit('connectError');
this.connectNum = 1
}
});
// 这里仅是事件监听【如果socket关闭了会执行】
this.socketTask.onClose(() => {
console.log("已经被关闭了-------")
clearInterval(this.heartbeatInterval)
clearInterval(this.reconnectTimeOut)
this.is_open_socket = false;
this.socketTask = null
uni.$off('getPositonsOrder')
if (this.connectNum < 6) {
this.reconnect();
} else {
uni.$emit('connectError');
this.connectNum = 1
}
})
}
// 主动关闭socket连接
Close () {
if (!this.is_open_socket) {
return
}
this.socketTask.close({
success () {
uni.showToast({
title: 'SocketTask 关闭成功',
icon: "none"
});
}
});
}
//发送消息
send (data) {
console.log("data---------->", data);
// 注:只有连接正常打开中 ,才能正常成功发送消息
if (this.socketTask) {
this.socketTask.send({
data: JSON.stringify(data),
async success () {
console.log("消息发送成功");
},
});
}
}
//开启心跳检测
start () {
this.heartbeatInterval = setInterval(() => {
this.send({
"traderid": 10260,
"type": "Ping"
});
}, this.timeout)
}
//重新连接
reconnect () {
//停止发送心跳
clearInterval(this.heartbeatInterval)
//如果不是人为关闭的话,进行重连
if (!this.is_open_socket && (this.traderDetailIndex == 2 || this.accountStateIndex == 0 || this
.followFlake)) {
this.reconnectTimeOut = setInterval(() => {
this.connectSocketInit(this.data);
}, 5000)
}
}
/**
* @description 将 scoket 数据进行过滤
* @param {array} array
* @param {string} type 区分 弹窗 openposition 分为跟随和我的
*/
arrayFilter (array, type = 'normal', signalId = 0) {
let arr1 = []
let arr2 = []
let obj = {
arr1: [],
arr2: []
}
arr1 = array.filter(v => v.flwsig == true)
arr2 = array.filter(v => v.flwsig == false)
if (type == 'normal') {
if (signalId) {
arr1 = array.filter(v => v.flwsig == true && v.sigtraderid == signalId)
return arr1
} else {
return arr1.concat(arr2)
}
} else {
if (signalId > 0) {
arr1 = array.filter(v => v.flwsig == true && v.sigtraderid == signalId)
obj.arr1 = arr1
} else {
obj.arr1 = arr1
}
obj.arr2 = arr2
return obj
}
}
}
export {
socketIO
}

View File

@@ -58,7 +58,7 @@ export default {
title:"加载中" title:"加载中"
}) })
API_Message.getLogisticsMessages(this.params).then(async response => { API_Message.getLogisticsMessages(this.params).then(async response => {
uni.hideLoading() if (this.$store.state.isShowToast){ uni.hideLoading() }
const { data } = response const { data } = response
if (!data || !data.length) { if (!data || !data.length) {
this.messageList.push(...data.data) this.messageList.push(...data.data)

View File

@@ -59,7 +59,7 @@ export default {
title: "加载中" title: "加载中"
}); });
API_Message.getMessages(this.params).then(async response => { API_Message.getMessages(this.params).then(async response => {
uni.hideLoading(); if (this.$store.state.isShowToast){ uni.hideLoading() };
const { data } = response; const { data } = response;
if (!data || !data.length) { if (!data || !data.length) {
this.messageList.push(...data.data); this.messageList.push(...data.data);

View File

@@ -1,422 +1,418 @@
<template> <template>
<view class="content"> <view class="content">
<view class="navbar"> <u-navbar>
<!-- 循环出顶部nav栏 --> <u-tabs :active-color="lightColor" class="slot-wrap" :list="navList" count="count" :is-scroll="true" :current="tabCurrentIndex" @change="tabClick"></u-tabs>
<view v-for="(item, index) in navList" :key="index" class="nav-item" @click="tabClick(index)"> </u-navbar>
<text :class="{current: tabCurrentIndex === index}">{{item.text}}</text> <view class="swiper-box">
</view> <!-- 显示商品栏 -->
</view> <view v-if="tabCurrentIndex == 0" class="tab-content">
<view class="swiper-box"> <scroll-view class="list-scroll-content" scroll-y>
<!-- 显示商品栏 --> <!-- 空白页 -->
<view v-if="tabCurrentIndex == 0" class="tab-content"> <u-empty style="margin-top: 40rpx" text="暂无收藏商品数据" mode="favor" v-if="goodsEmpty"></u-empty>
<scroll-view class="list-scroll-content" scroll-y @scrolltolower="loadMore"> <!-- 商品展示数据 -->
<!-- 空白页 --> <u-swipe-action @open="openLeftChange(item, index, 'goods')" :show="item.selected" btn-width="180"
<u-empty style="margin-top:40rpx;" text="暂无收藏商品数据" mode="favor" v-if="goodsEmpty"></u-empty> :options="LeftOptions" v-else v-for="(item, index) in goodList"
<!-- 商品展示数据 --> @click="clickGoodsSwiperAction(item, index)" :index="index" :key="index">
<u-swipe-action @open="openLeftChange(item,index,'goods')" :show="item.selected" btn-width="180" <view class="goods" @click="goGoodsDetail(item)">
:options="LeftOptions" v-else v-for="(item,index) in goodList" @click="clickGoodsSwiperAction(item,index)" <u-image width="131rpx" height="131rpx" :src="item.image" mode="aspectFit">
:index="index" :key="index"> <u-loading slot="loading"></u-loading>
<view class="goods" @click="goGoodsDetail(item)"> </u-image>
<u-image width="131rpx" height="131rpx" :src="item.image" mode="aspectFit"> <view class="goods-intro">
<u-loading slot="loading"></u-loading> <view>{{ item.goodsName }}</view>
</u-image> <view class="goods-sn">{{ item.goods_sn }}</view>
<view class="goods-intro"> <view>{{ item.price | unitPrice }}</view>
<view>{{item.goodsName}}</view> </view>
<view class="goods-sn">{{item.goods_sn}}</view> </view>
<view>{{item.price | unitPrice}}</view> </u-swipe-action>
</view>
</view> </scroll-view>
</u-swipe-action> </view>
<uni-load-more :status="goodsLoad"></uni-load-more> </view>
</scroll-view> </view>
</view> </template>
<!-- 显示收藏的店铺栏 -->
<view v-else class="tab-content"> <script>
<scroll-view class="list-scroll-content" scroll-y @scrolltolower="loadMore"> import {
<!-- 空白页 --> getGoodsCollection,
<u-empty style="margin-top:40rpx;" text="暂无收藏店铺数据" mode="favor" v-if="storeEmpty"></u-empty> getStoreCollection,
<!-- 店铺展示数据 --> deleteGoodsCollection,
<u-swipe-action @open="openLeftChange(item,'store')" :show="item.selected" btn-width="180" deleteStoreCollection,
:options="LeftOptions" v-else v-for="(item,index) in storeList" :key="index" } from "@/api/members.js";
@click="clickstoreSwiperAction(item)"> export default {
<view class="store" @click="gostoreMainPage(item.id)"> data() {
<view class="intro"> return {
<view class="store-logo"> lightColor:this.$lightColor,
<u-image width="102rpx" height="102rpx" :src="item.storeLogo" :alt="item.storeName" mode="aspectFit"> // 商品左滑侧边栏
<u-loading slot="loading"></u-loading> LeftOptions: [{
</u-image> text: "取消",
</view> style: {
<view class="store-name"> backgroundColor: this.$lightColor,
<view>{{item.storeName}}</view> },
<u-tag size="mini" type="error" :color="$mainColor" v-if="item.selfOperated" text="自营" mode="plain" }, ],
shape="circle" /> tabCurrentIndex: 0, //tab的下标默认为0也就是说会默认请求商品
</view> navList: [
<view class="store-collect"> //tab显示数据
<view>进店逛逛</view> {
</view> name: "商品(0)",
</view>
</view> params: {
</u-swipe-action> pageNumber: 1,
<uni-load-more :status="storeLoad"></uni-load-more> pageSize: 10,
</scroll-view> },
</view> },
</view>
</view> ],
</template>
goodsEmpty: false, //商品数据是否为空
<script> storeEmpty: false, //店铺数据是否为空
import { goodList: [], //商品集合
getGoodsCollection, storeList: [], //店铺集合
deleteGoodsCollection, };
deleteStoreCollection, },
} from "@/api/members.js"; onShow() {
export default { this.fetchReloadOrNextPage('reload')
data() { },
return { onReachBottom() {
// 商品左滑侧边栏 this.fetchReloadOrNextPage('next')
LeftOptions: [ },
{
text: "取消", methods: {
style: { // 刷新或者下一页
backgroundColor: this.$lightColor, fetchReloadOrNextPage(type) {
}, if(type == 'next'){
}, this.navList[this.tabCurrentIndex].params.pageNumber ++;
], if (this.tabCurrentIndex == 0) {
tabCurrentIndex: 0, //tab的下标默认为0也就是说会默认请求商品 this.getGoodList();
navList: [ } else {
//tab显示数据 this.getStoreList();
{ }
text: "商品(0)", }
loadingType: "more", else{
params: { this.navList[0].params.pageNumber = 1;
pageNumber: 1, this.navList[1].params.pageNumber = 1;
pageSize: 10, this.goodList = [];
}, this.storeList = [];
}, this.getGoodList();
{ this.getStoreList();
text: "店铺(0)", }
loadingType: "more", },
params: {
pageNumber: 1, /**
pageSize: 10, * 打开商品左侧取消收藏
}, */
}, openLeftChange(val, type) {
], const {
goodsLoad: "more", //商品加载 goodList,
storeLoad: "more", //店铺加载 storeList
goodsEmpty: false, //商品数据是否为空 } = this;
storeEmpty: false, //店铺数据是否为空 let way;
goodList: [], //商品集合 type == "goods" ? (way = goodList) : (way = storeList);
storeList: [], //店铺集合 way.forEach((item) => {
}; this.$set(item, "selected", false);
}, });
onLoad() { this.$set(val, "selected", false);
this.getGoodList(); val.selected = true;
this.getstoreList(); },
},
/**
methods: { * 点击商品左侧取消收藏
/** */
* 打开商品左侧取消收藏 clickGoodsSwiperAction(val) {
*/ deleteGoodsCollection(val.skuId).then((res) => {
openLeftChange(val, type) { if (res.statusCode == 200) {
const { goodList, storeList } = this; this.storeList = [];
let way; this.goodList = [];
type == "goods" ? (way = goodList) : (way = storeList); this.getGoodList();
way.forEach((item) => { }
this.$set(item, "selected", false); });
}); },
this.$set(val, "selected", false);
val.selected = true; /**
}, * 点击店铺左侧取消收藏
*/
/** clickStoreSwiperAction(val) {
* 点击商品左侧取消收藏 deleteStoreCollection(val.id).then((res) => {
*/ if (res.statusCode == 200) {
clickGoodsSwiperAction(val) { this.storeList = [];
deleteGoodsCollection(val.skuId).then((res) => { this.getStoreList();
if (res.statusCode == 200) { }
this.storeList = []; });
this.goodList = []; },
this.getGoodList();
} /**
}); * 顶部tab点击
}, */
tabClick(index) {
/** this.tabCurrentIndex = index;
* 点击店铺左侧取消收藏 },
*/
clickstoreSwiperAction(val) { /**
deleteStoreCollection(val.storeId).then((res) => { * 查看商品详情
if (res.statusCode == 200) { */
this.storeList = []; goGoodsDetail(val) {
this.getstoreList(); //商品详情
} uni.navigateTo({
}); url: "/pages/product/goods?id=" + val.skuId + "&goodsId=" + val.goodsId,
}, });
},
/**
* 顶部tab点击 /**
*/ * 查看店铺详情
tabClick(index) { */
this.tabCurrentIndex = index; goStoreMainPage(id) {
}, //店铺主页
uni.navigateTo({
/** url: "/pages/product/shopPage?id=" + id,
* 查看商品详情 });
*/ },
goGoodsDetail(val) {
//商品详情 /**
uni.navigateTo({ * 获取商品集合
url: "/pages/product/goods?id=" + val.skuId + "&goodsId=" + val.goodsId, */
}); getGoodList() {
}, uni.showLoading({
title: "加载中",
/** });
* 查看店铺详情 getGoodsCollection(this.navList[0].params, "GOODS").then((res) => {
*/ if (this.$store.state.isShowToast){ uni.hideLoading() };
gostoreMainPage(id) { uni.stopPullDownRefresh();
//店铺主页 if (res.data.success) {
uni.navigateTo({ let data = res.data.result;
url: "/pages/product/shopPage?id=" + id, data.selected = false;
}); this.navList[0].name = `商品(${data.total})`;
},
if (data.total == 0) {
/** this.goodsEmpty = true;
* 获取商品集合 } else if (data.total < 10) {
*/ this.goodsLoad = "noMore";
getGoodList() { this.goodList.push(...data.records);
uni.showLoading({ } else {
title: "加载中", this.goodList.push(...data.records);
}); if (data.total.length < 10) this.goodsLoad = "noMore";
getGoodsCollection(this.navList[0].params, "GOODS").then((res) => { }
uni.hideLoading(); }
uni.stopPullDownRefresh(); });
if (res.data.success) { },
let data = res.data.result;
data.selected = false; /**
this.navList[0].text = `商品(${data.total})`; * 获取店铺集合
if (data.total == 0) { */
this.goodsEmpty = true; getStoreList() {
} else if (data.total < 10) { uni.showLoading({
this.goodsLoad = "noMore"; title: "加载中",
this.goodList.push(...data.records); });
} else { getStoreCollection(this.navList[1].params, "STORE").then((res) => {
this.goodList.push(...data.records); if (this.$store.state.isShowToast){ uni.hideLoading() };
if (data.total.length < 10) this.goodsLoad = "noMore"; uni.stopPullDownRefresh();
} if (res.data.success) {
} let data = res.data.result;
}); data.selected = false;
}, this.navList[1].name = `店铺(${data.total})`;
if (data.total == 0) {
/** this.storeEmpty = true;
* 获取店铺集合 } else if (data.total < 10) {
*/
getstoreList() { this.storeList.push(...data.records);
uni.showLoading({ }
title: "加载中", }
}); });
getGoodsCollection(this.navList[1].params, "store").then((res) => { },
uni.hideLoading(); },
uni.stopPullDownRefresh();
if (res.data.success) { /**
let data = res.data.result; * 下拉刷新时
data.selected = false; */
this.navList[1].text = `店铺(${data.total})`; onPullDownRefresh() {
if (data.total == 0) { if (this.tabCurrentIndex == 0) {
this.storeEmpty = true; this.navList[0].params.pageNumber = 1;
} else if (data.total < 10) { this.goodList = [];
this.storeLoad = "noMore"; this.getGoodList();
this.storeList.push(...data.records); } else {
} else { this.navList[1].params.pageNumber = 1;
this.storeList.push(...data.records); this.storeList = [];
if (data.total.length < 10) this.storeLoad = "noMore"; this.getStoreList();
} }
} },
}); };
}, </script>
/** <style lang="scss">
* 底部加载更多 page,
*/ .content {
loadMore() { background: $page-color-base;
if (this.tabCurrentIndex == 0) { height: 100%;
this.navList[0].params.pageNumber++; }
this.getGoodList();
} else { .slot-wrap{
this.navList[1].params.pageNumber++; flex: 1;
this.getstoreList(); display: flex;
} justify-content: center;
}, padding-right: 72rpx;
}, }
/** .content {
* 下拉刷新时 width: 100%;
*/ }
onPullDownRefresh() {
if (this.tabCurrentIndex == 0) { .swiper-box {
this.navList[0].params.pageNumber = 1; overflow-y: auto;
this.goodList = []; }
this.getGoodList();
} else { .list-scroll-content {
this.navList[1].params.pageNumber = 1; height: 100%;
this.storeList = []; width: 100%;
this.getstoreList(); }
}
}, /deep/ .u-swipe-content {
}; overflow: hidden;
</script> }
<style lang="scss"> .goods {
page, background-color: #fff;
.content { border-bottom: 1px solid $border-color-light;
background: $page-color-base; height: 190rpx;
height: 100%; display: flex;
} align-items: center;
.content { padding: 30rpx 20rpx;
width: 100%; margin-top: 20rpx;
overflow: hidden;
} image {
.swiper-box { width: 131rpx;
overflow-y: auto; height: 131rpx;
} border-radius: 10rpx;
}
.list-scroll-content {
height: 100%; .goods-intro {
width: 100%; flex: 1;
} font-size: $font-base;
line-height: 48rpx;
/deep/ .u-swipe-content { margin-left: 30rpx;
overflow: hidden;
} view:nth-child(1) {
.goods { line-height: 1.4em;
background-color: #fff; font-size: 24rpx;
border-bottom: 1px solid $border-color-light; max-height: 2.8em; //height是line-height的整数倍防止文字显示不全
height: 190rpx; overflow: hidden;
display: flex; color: #666;
align-items: center; }
padding: 30rpx 20rpx;
margin-top: 20rpx; view:nth-child(2) {
image { color: #cccccc;
width: 131rpx; font-size: 24rpx;
height: 131rpx; }
border-radius: 10rpx;
} view:nth-child(3) {
.goods-intro { color: $light-color;
flex: 1; }
font-size: $font-base; }
line-height: 48rpx;
margin-left: 30rpx; button {
color: $main-color;
view:nth-child(1) { height: 50rpx;
line-height: 1.4em; width: 120rpx;
font-size: 24rpx; font-size: $font-sm;
max-height: 2.8em; //height是line-height的整数倍防止文字显示不全 padding: 0;
overflow: hidden; line-height: 50rpx;
color: #666; background-color: #ffffff;
} margin-top: 80rpx;
view:nth-child(2) {
color: #cccccc; &::after {
font-size: 24rpx; border-color: $main-color;
} }
view:nth-child(3) { }
color: $light-color; }
}
} .store {
button { background-color: #fff;
color: $main-color; border: 1px solid $border-color-light;
height: 50rpx; border-radius: 16rpx;
width: 120rpx; margin: 20rpx 10rpx;
font-size: $font-sm;
padding: 0; .intro {
line-height: 50rpx; display: flex;
background-color: #ffffff; justify-content: space-between;
margin-top: 80rpx; align-items: center;
&::after { padding: 0 30rpx 0 40rpx;
border-color: $main-color; height: 170rpx;
}
} .store-logo {
} width: 102rpx;
.store { height: 102rpx;
background-color: #fff; border-radius: 50%;
border: 1px solid $border-color-light; overflow: hidden;
border-radius: 16rpx;
margin: 20rpx 10rpx; image {
.intro { width: 100%;
display: flex; height: 100%;
justify-content: space-between; border-radius: 50%;
align-items: center; }
padding: 0 30rpx 0 40rpx; }
height: 170rpx;
.store-name {
.store-logo { flex: 1;
width: 102rpx; margin-left: 30rpx;
height: 102rpx; line-height: 2em;
border-radius: 50%;
overflow: hidden; :first-child {
image { font-size: $font-base;
width: 100%; }
height: 100%;
border-radius: 50%; :last-child {
} font-size: $font-sm;
} color: #999;
.store-name { }
flex: 1; }
margin-left: 30rpx;
line-height: 2em; .store-collect {
:first-child { border-left: 1px solid $border-color-light;
font-size: $font-base; padding-left: 20rpx;
} text-align: center;
:last-child {
font-size: $font-sm; :last-child {
color: #999; color: #999;
} font-size: $font-sm;
} }
.store-collect { }
border-left: 1px solid $border-color-light; }
padding-left: 20rpx; }
text-align: center;
:last-child { .navbar {
color: #999; display: flex;
font-size: $font-sm; height: 40px;
} padding: 0 5px;
} background: #fff;
} box-shadow: 0 1px 5px rgba(0, 0, 0, 0.06);
} position: relative;
.navbar { z-index: 10;
display: flex;
height: 40px; .nav-item {
padding: 0 5px; flex: 1;
background: #fff; display: flex;
box-shadow: 0 1px 5px rgba(0, 0, 0, 0.06); justify-content: center;
position: relative; align-items: center;
z-index: 10; height: 100%;
.nav-item { font-size: 26rpx;
flex: 1;
display: flex; text {
justify-content: center; position: relative;
align-items: center; }
height: 100%;
font-size: 26rpx; text.current {
color: $light-color;
text { font-weight: bold;
position: relative; font-size: 28rpx;
}
text.current { &::after {
color: $light-color; content: "";
font-weight: bold; position: absolute;
font-size: 28rpx; left: 20rpx;
&::after { bottom: -10rpx;
content: ""; width: 30rpx;
position: absolute; height: 0;
left: 20rpx; border-bottom: 2px solid $light-color;
bottom: -10rpx; }
width: 30rpx; }
height: 0; }
border-bottom: 2px solid $light-color; }
} </style>
}
}
}
</style>

View File

@@ -1,317 +1,303 @@
<template> <template>
<view class="myTracks"> <view class="myTracks">
<u-empty text="暂无历史记录" style="margin-top:200rpx;" mode="history" v-if="whetherEmpty"></u-empty> <u-navbar title="我的足迹">
<div v-else> <div slot="right">
<view v-for="(item, index) in trackList" :key="index"> <div class="light-color edit" @click="isEdit = !isEdit">{{ !isEdit ? '编辑' : '完成'}}</div>
<view class="myTracks-title" @click="navgaiteToStore(item)">{{item.storeName}}</view> </div>
<view class="myTracks-items"> </u-navbar>
<view class="myTracks-item"> <u-notice-bar mode="vertical" :list="['右划删除浏览记录']"></u-notice-bar>
<u-checkbox-group> <u-empty text="暂无历史记录" style="margin-top:200rpx;" mode="history" v-if="whetherEmpty"></u-empty>
<u-checkbox v-model="item.___isDel" v-if="editFlag" active-color="#ff6b35" style="margin-right: 10rpx" <div v-else>
@change="changeChecked(item)"></u-checkbox> <view v-for="(item, index) in trackList" :key="index">
</u-checkbox-group> <view class="myTracks-items">
<view class="myTracks-item-img" @click.stop="navgaiteToDetail(item)">
<image :src="item.thumbnail"></image>
</view>
<view class="myTracks-item-content" @click.stop="navgaiteToDetail(item)">
<view class="myTracks-item-title">
{{ item.goodsName }}
<view class="myTracks-item-title-desc"> </view>
</view>
<view class="myTracks-item-price">
{{ item.price | unitPrice }}
</view>
</view>
</view>
</view>
<view class="myTracks-divider"></view>
</view> <u-swipe-action style="width: 100%;" :show="item.show" :index="index" :key="item.id"
<uni-load-more :status="loadStatus"></uni-load-more> @click="delTracks" @open="open" :options="options">
</div>
<view v-if="editFlag"> <view class="myTracks-item">
<view class="myTracks-action-placeholder"></view> <u-checkbox-group v-if="isEdit" class="store-line-check">
<view class="myTracks-action"> <u-checkbox shape="circle" :active-color="lightColor" v-model="item.checked"
<view class="myTracks-action-check"> @change="checkboxChangeDP(item)"></u-checkbox>
<u-checkbox-group> </u-checkbox-group>
<u-checkbox v-model="allChecked" v-if="editFlag" active-color="#ff6b35" style="margin-right: 10rpx" <view class="myTracks-item-img" @click.stop="navigateToDetail(item)">
@change="checkedAllitem"></u-checkbox> <image :src="item.thumbnail"></image>
全选 </view>
</u-checkbox-group> <view class="myTracks-item-content" @click.stop="navigateToDetail(item)">
</view> <view class="myTracks-item-title">
{{ item.goodsName }}
<view class="myTracks-item-title-desc"> </view>
</view>
<view class="myTracks-item-price">
{{ item.price | unitPrice }}
</view>
</view>
</view>
</u-swipe-action>
<view> </view>
<u-button type="warning" plain="true" @click="delAllTracks" class="myTracks-action-btn"> <view class="myTracks-divider"></view>
删除
</u-button> </view>
</view> <div @click="handleClickDeleteSelected" v-if="isEdit" class="submit">
</view> 删除所选
</view> </div>
</view> </div>
</view>
</template> </template>
<script> <script>
import { myTrackList, deleteHistoryListId } from "@/api/members.js"; import {
myTrackList,
deleteHistoryListId
} from "@/api/members.js";
export default { export default {
data() { data() {
return { return {
editFlag: false, //是否编辑 isEdit:false,
allChecked: false, //是否全选 whetherEmpty: false, //是否数据为空
loadStatus: "more", //底部下拉加载状态 params: {
whetherEmpty: false, //是否数据为空 pageNumber: 1,
params: { pageSize: 10,
pageNumber: 1, order: "desc",
pageSize: 10, sort: "updateTime",
}, },
lightColor:this.$lightColor,
options: [{
text: '删除',
style: {
backgroundColor: '#dd524d'
}
}],
trackList: [], //足迹列表
};
},
trackList: [], //足迹列表 /**
}; * 滑到底部加载下一页数据
}, */
onReachBottom() {
this.params.pageNumber++;
this.getList();
},
onShow() {
this.params.pageNumber = 1
this.trackList = [];
this.getList();
},
onPullDownRefresh() {
this.trackList = [];
this.getList();
},
methods: {
checkboxChangeDP(val){
console.log(val)
},
// 删除所选的数据
handleClickDeleteSelected(val){
const ids = this.trackList.filter(item=>item.checked).map(item=>item.goodsId);
if(!ids.length){
uni.showToast({
title:"请选择删除数据",
icon:"none"
})
}else{
this.delTracks(0,ids)
}
},
/**
* 导航到店铺
*/
navigateToStore(val) {
uni.navigateTo({
url: "/pages/product/shopPage?id=" + val.storeId,
});
},
open(index) {
// 先将正在被操作的swipeAction标记为打开状态否则由于props的特性限制
// 原本为'false',再次设置为'false'会无效
this.trackList[index].show = true;
this.trackList.map((val, idx) => {
if (index != idx) this.trackList[idx].show = false;
})
},
/**
* 跳转详情
*/
navigateToDetail(item) {
uni.navigateTo({
url: "/pages/product/goods?id=" + item.id + "&goodsId=" + item.goodsId,
});
},
/** /**
* 滑到底部加载下一页数据 * 获取我的足迹列表
*/ */
onReachBottom() { getList() {
if (this.loadStatus != "noMore") { uni.showLoading({
this.params.pageNumber++; title: "加载中",
this.getList(); });
} myTrackList(this.params).then((res) => {
}, uni.stopPullDownRefresh();
onLoad() { uni.hideLoading();
this.getList(); if (res.statusCode == 200) {
}, res.data.result.records.length &&
onPullDownRefresh() { res.data.result.records.forEach((item) => {
this.trackList = []; item.show = false;
this.getList(); item.checked = false
}, });
methods: {
/**
* 导航到店铺
*/
navgaiteToStore(val) {
uni.navigateTo({
url: "/pages/product/shopPage?id=" + val.storeId,
});
},
/** let data = res.data.result.records;
* 设置右侧导航栏文本 if (data.total == 0) {
*/ this.whetherEmpty = true;
setStyle(text) { } else {
//导航按钮文本设置 this.trackList.push(...data);
let pages = getCurrentPages(); }
let page = pages[pages.length - 1]; }
// #ifdef APP-PLUS });
let currentWebview = page.$getAppWebview(); },
let titleNView = currentWebview.getStyle().titleNView;
titleNView.buttons[0].text = text;
if (text == "完成") {
this.trackList.forEach((key) => {
key.history.forEach((item) => {
this.$set(item, "___isDel", false);
});
});
}
currentWebview.setStyle({
titleNView: titleNView,
});
// #endif
// #ifdef H5
// h5 临时方案
document.getElementsByClassName("uni-btn-icon")[1].innerText = text;
// #endif
},
/**
* 跳转详情
*/
navgaiteToDetail(item) {
uni.navigateTo({
url: "/pages/product/goods?id=" + item.id + "&goodsId=" + item.goodsId,
});
},
/** /**
* 获取我的足迹列表 * 删除足迹
*/ */
getList() { delTracks(index,ids) {
uni.showLoading({ deleteHistoryListId(ids || this.trackList[index].goodsId).then((res) => {
title: "加载中", if (res.data.code == 200) {
}); this.trackList = [];
myTrackList(this.params).then((res) => { this.params.pageNumber = 1
uni.stopPullDownRefresh(); this.getList();
uni.hideLoading(); } else {
if (res.statusCode == 200) { uni.showToast({
res.data.result && title: res.data.message,
res.data.result.forEach((item) => { duration: 2000,
item.___isDel = false; icon: "none",
}); });
}
let data = res.data.result; });
if (data.total == 0) { },
this.whetherEmpty = true; },
} else if (data.total < 10) { };
this.loadStatus = "noMore";
this.trackList.push(...data);
} else {
this.trackList.push(...data);
if (data.length < 10) this.loadStatus = "noMore";
}
}
});
},
/**
* 点击后判断是不是全选
*/
changeChecked(val) {
const isCheckedAll = this.trackList.every((key) => {
return key.___isDel == val.___isDel;
});
this.allChecked = isCheckedAll;
},
/**
* 点击全选按钮
*/
checkedAllitem() {
//全选按钮
this.trackList.forEach((key) => {
this.$set(key, "___isDel", this.allChecked);
});
},
/**
* 删除足迹
*/
delAllTracks() {
let way = [];
this.trackList.forEach((key) => {
if (key.___isDel) {
way.push(key.goodsId);
}
});
if (way.length == 0) return false;
deleteHistoryListId(way).then((res) => {
if (res.data.code == 200) {
this.trackList = [];
this.allChecked = false;
this.getList();
} else {
uni.showToast({
title: res.data.message,
duration: 2000,
icon: "none",
});
}
});
},
},
/**
* 右侧标签栏切换
*/
onNavigationBarButtonTap(e) {
if (!this.editFlag) {
this.setStyle("完成");
} else {
this.setStyle("编辑");
}
this.editFlag = !this.editFlag;
},
};
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.myTracks { .submit{
width: 100%; position: fixed;
padding-top: 2rpx; bottom: 20rpx;
} left: 10%;
width: 80%;
height: 80rpx;
color: #fff;
border-radius: 100px;
display: flex;
align-items: center;
justify-content: center;
background: $light-color;
}
.myTracks {
width: 100%;
padding-top: 2rpx;
}
.myTracks-title { .myTracks-title {
width: 100%; width: 100%;
height: 110rpx; height: 110rpx;
padding-left: 20rpx; padding-left: 20rpx;
font-size: 28rpx; font-size: 28rpx;
color: #666; color: #666;
font-weight: bold; font-weight: bold;
background-color: #fff; background-color: #fff;
align-items: center; align-items: center;
display: -webkit-box; display: -webkit-box;
display: -webkit-flex; display: -webkit-flex;
display: flex; display: flex;
} }
.myTracks-items { .myTracks-items {
padding-top: 2rpx; padding-top: 2rpx;
align-items: center; align-items: center;
display: -webkit-box; display: -webkit-box;
display: -webkit-flex; display: -webkit-flex;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
} }
.myTracks-item { .myTracks-item {
width: 100%; width: 100%;
height: 226rpx; height: 226rpx;
padding-left: 20rpx; padding-left: 20rpx;
padding-right: 20rpx; padding-right: 20rpx;
margin-bottom: 2rpx; margin-bottom: 2rpx;
// border-radius: 6/@px; // border-radius: 6/@px;
background-color: #fff; background-color: #fff;
position: relative; position: relative;
align-items: center; align-items: center;
display: -webkit-box; display: -webkit-box;
display: -webkit-flex; display: -webkit-flex;
display: flex; display: flex;
} }
.myTracks-item-img { .myTracks-item-img {
margin-right: 20rpx; margin-right: 20rpx;
border-radius: 8rpx; border-radius: 8rpx;
image {
width: 130rpx;
height: 130rpx;
border-radius: 8rpx;
}
}
.myTracks-item-title { image {
font-size: 28rpx; width: 130rpx;
color: #333; height: 130rpx;
} border-radius: 8rpx;
}
}
.myTracks-item-title-desc { .myTracks-item-title {
font-size: 28rpx; font-size: 28rpx;
color: #999; color: #333;
} }
.myTracks-item-price { .myTracks-item-title-desc {
font-size: 28rpx; font-size: 28rpx;
color: $light-color; color: #999;
padding: 10rpx 0 0 0; }
}
.myTracks-action-btn { .myTracks-item-price {
width: 130rpx; font-size: 28rpx;
height: 60rpx; color: $light-color;
line-height: 60rpx; padding: 10rpx 0 0 0;
} }
.myTracks-divider { .myTracks-action {
width: 100%; display: flex;
height: 20rpx; justify-content: space-between;
} position: fixed;
bottom: 0;
left: 0;
width: 100%;
background: #fff;
height: 75rpx;
align-items: center;
padding: 0 32rpx;
}
.myTracks-action-placeholder { .myTracks-action-btn {
height: 110rpx; width: 130rpx;
} height: 60rpx;
line-height: 60rpx;
}
.myTracks-action-check { .myTracks-divider {
align-items: center; width: 100%;
display: -webkit-box; height: 20rpx;
display: -webkit-flex; }
display: flex;
}
.myTracks-action-check {
align-items: center;
display: -webkit-box;
display: -webkit-flex;
display: flex;
}
.edit{
padding-right: 32rpx;
}
</style> </style>

View File

@@ -11,21 +11,21 @@
<u-row class="portrait-box2"> <u-row class="portrait-box2">
<u-col span="6" class="portrait-box2-col" :gutter="16"> <u-col span="6" class="portrait-box2-col" :gutter="16">
<text>累计获得</text> <text>累计获得</text>
<text class="pcolor">{{ pointData.point || 0 }}</text> <text class="pcolor">{{ pointData.totalPoint || 0 }}</text>
</u-col> </u-col>
<u-col span="6" class="portrait-box2-col"> <u-col span="6" class="portrait-box2-col">
<text>未使用</text> <text>剩余积分</text>
<text class="pcolor">{{ pointData.variablePoint || 0 }}</text> <text class="pcolor">{{ pointData.point || 0 }}</text>
</u-col> </u-col>
</u-row> </u-row>
<div class="point-list"> <div class="point-list">
<view class="point-item" v-for="(item, index) in pointList" :key="index"> <view class="point-item" v-for="(item, index) in pointList" :key="index">
<view> <view>
<view>{{ item.content }}</view> <view class="point-label">{{ item.content }}</view>
<view>{{ item.createTime}}</view> <view>{{ item.createTime}}</view>
</view> </view>
<view><span>{{item.pointType == "INCREASE" ? '+' : '-'}}</span>{{ item.variablePoint }}</view> <view :class="[item.pointType == 'INCREASE' ? 'plus' : 'reduce']"><span>{{item.pointType == "INCREASE" ? '+' : '-'}}</span>{{ item.variablePoint }}</view>
</view> </view>
<uni-load-more :status="count.loadStatus"></uni-load-more> <uni-load-more :status="count.loadStatus"></uni-load-more>
</div> </div>
@@ -72,7 +72,7 @@ export default {
title: "加载中", title: "加载中",
}); });
getPointsData(params).then((res) => { getPointsData(params).then((res) => {
uni.hideLoading(); if (this.$store.state.isShowToast){ uni.hideLoading() };
if (res.data.success) { if (res.data.success) {
let data = res.data.result.records; let data = res.data.result.records;
if (data.length < 10) { if (data.length < 10) {
@@ -109,6 +109,14 @@ export default {
font-size: 32rpx; font-size: 32rpx;
font-weight: bold; font-weight: bold;
} }
.plus{
color: $light-color;
font-weight: bold;
}
.reduce{
color: $weChat-color;
font-weight: bold;
}
.point-item { .point-item {
width: 100%; width: 100%;
@@ -150,7 +158,7 @@ export default {
border-right: 1px solid $border-color-light; border-right: 1px solid $border-color-light;
} }
.pcolor { .pcolor {
color: #4ebb9d; color: $light-color;
} }
} }
@@ -168,7 +176,7 @@ export default {
.portrait-box { .portrait-box {
background-color: $main-color; background-color: $main-color;
height: 250rpx; height: 250rpx;
background: linear-gradient(134deg, #28d094 2%, #1abc9c 98%); background: linear-gradient(91deg, $light-color 1%, $aider-light-color 99%);
border-radius: 20rpx 20rpx 0 0; border-radius: 20rpx 20rpx 0 0;
margin: 20rpx 20rpx 0; margin: 20rpx 20rpx 0;
position: relative; position: relative;
@@ -212,5 +220,10 @@ export default {
.point { .point {
font-size: 56rpx; font-size: 56rpx;
} }
}
.point-label{
font-weight: bold;
margin-bottom: 10rpx;
} }
</style> </style>

View File

@@ -7,6 +7,9 @@
<!-- #ifdef APP-PLUS --> <!-- #ifdef APP-PLUS -->
Version {{localVersion.version}} Version {{localVersion.version}}
<!-- #endif --> <!-- #endif -->
<!-- #ifdef MP-WEIXIN -->
小程序版本: {{localVersion.version}} {{ localVersion.envVersion}}
<!-- #endif -->
</view> </view>
<!-- {{localVersion}} --> <!-- {{localVersion}} -->
@@ -16,10 +19,11 @@
<u-cell-item title="功能介绍" @click="navigateTo('/pages/mine/set/versionFunctionList')"></u-cell-item> <u-cell-item title="功能介绍" @click="navigateTo('/pages/mine/set/versionFunctionList')"></u-cell-item>
<u-cell-item title="检查更新" @click="checkUpdate"></u-cell-item> <u-cell-item title="检查更新" @click="checkUpdate"></u-cell-item>
<!-- #endif --> <!-- #endif -->
<u-cell-item title="证照信息" @click="navigateTo('/pages/mine/help/tips?type=message')"></u-cell-item>
<u-cell-item title="服务协议" @click="navigateTo('/pages/mine/help/tips?type=user')"></u-cell-item> <u-cell-item title="证照信息" @click="navigateTo('/pages/mine/help/tips?type=LICENSE_INFORMATION')"></u-cell-item>
<u-cell-item title="隐私协议" @click="navigateTo('/pages/mine/help/tips?type=privacy')"></u-cell-item> <u-cell-item title="服务协议" @click="navigateTo('/pages/mine/help/tips?type=USER_AGREEMENT')"></u-cell-item>
<u-cell-item title="关于我们" :border-bottom="false" @click="navigateTo('/pages/mine/help/tips?type=about')"></u-cell-item> <u-cell-item title="隐私协议" @click="navigateTo('/pages/mine/help/tips?type=PRIVACY_POLICY')"></u-cell-item>
<u-cell-item title="关于我们" :border-bottom="false" @click="navigateTo('/pages/mine/help/tips?type=ABOUT')"></u-cell-item>
</u-cell-group> </u-cell-group>
@@ -28,8 +32,8 @@
<view style="margin:20rpx 0 0 0;">{{config.customerServiceEmail ? `客服邮箱:${config.customerServiceEmail}` : ``}}</view> <view style="margin:20rpx 0 0 0;">{{config.customerServiceEmail ? `客服邮箱:${config.customerServiceEmail}` : ``}}</view>
<view> <view>
<view style="margin:20rpx 0; color:#003a8c;" @click="navigateTo('/pages/mine/help/tips?type=user')">{{config.name}}用户协议</view> <view style="margin:20rpx 0; color:#003a8c;" @click="navigateTo('/pages/mine/help/tips?type=USER_AGREEMENT')">{{config.name}}用户协议</view>
<view>CopyRight @{{config.name}} </view> <view>CopyRight ©{{config.name}} </view>
</view> </view>
</view> </view>
</view> </view>
@@ -74,6 +78,19 @@ export default {
}; };
}); });
// #endif // #endif
// #ifdef MP-WEIXIN
const accountInfo = wx.getAccountInfoSync();
console.log("===========accountInfo==============");
console.log(accountInfo);
this.version_number = accountInfo.miniProgram.version // 小程序 版本号
this.localVersion = {
versionCode: accountInfo.miniProgram.version.replace(/\./g, ""),
version: accountInfo.miniProgram.version ,// 小程序 版本号,
envVersion:accountInfo.miniProgram.envVersion, //判断小程序是开发版本还是release版本
};
// #endif
}, },
methods: { methods: {

View File

@@ -16,9 +16,9 @@
<!-- 上传凭证 --> <!-- 上传凭证 -->
<div class="feedBack-box"> <div class="feedBack-box">
<view class="opt-view"> <view class="opt-view">
<view class="img-title">上传凭证最多5</view> <view class="img-title">上传凭证最多2</view>
<view class="images-view"> <view class="images-view">
<u-upload :header=" { accessToken: storage.getAccessToken() }" :action="action" width="150" @on-uploaded="onUploaded" :max-count="5" :show-progress="false"></u-upload> <u-upload :header=" { accessToken: storage.getAccessToken() }" :action="action" width="150" @on-uploaded="onUploaded" :max-count="2" :show-progress="false"></u-upload>
</view> </view>
</view> </view>
</div> </div>
@@ -84,7 +84,7 @@ export default {
} }
if (!this.feedBack.context) { if (!this.feedBack.context) {
uni.showToast({ uni.showToast({
title: "请填写反馈类型", title: "请填写反馈信息",
duration: 2000, duration: 2000,
icon: "none", icon: "none",
}); });

View File

@@ -16,26 +16,38 @@
</u-form-item> </u-form-item>
<u-form-item label="生日" label-width="150" right-icon="arrow-right"> <u-form-item label="生日" label-width="150" right-icon="arrow-right">
<u-input v-model="birthday" disabled placeholder="请选择出生日期" @click="showBirthday = true" /> <div style="width: 100%;" @click="showBirthday = true">{{ birthday || '请选择出生日期' }}</div>
<u-picker v-model="showBirthday" mode="time" :confirm-color="lightColor" @confirm="selectTime"></u-picker> <u-picker v-model="showBirthday" mode="time" :confirm-color="lightColor" @confirm="selectTime"></u-picker>
</u-form-item> </u-form-item>
<u-form-item label="城市" label-width="150" placeholder="请选择城市" right-icon="arrow-right"> <u-form-item label="城市" label-width="150" placeholder="请选择城市" right-icon="arrow-right">
<u-input v-model="form.___path" disabled @click="clickRegion" /> <div style="width: 100%;" @click="clickRegion">{{ form.___path || '请选择城市' }}</div>
</u-form-item> </u-form-item>
<view class="submit" @click="submit">保存</view>
<u-form-item label="手机号" label-width="150">
<view v-if="form.mobile">
{{form.mobile}}
</view>
<view v-else>
<view class="submit" @click="navigateTo(form.username)">绑定手机号码</view>
</view>
</u-form-item>
</u-form> </u-form>
<div class="bottom">
<m-city :provinceData="region" headTitle="区域选择" ref="cityPicker" @funcValue="getpickerParentValue" pickerSize="4"></m-city> <view class="submit" @click="submit">保存</view>
<view class="submit light" @click="quiteLoginOut">退出登录</view>
</div>
<m-city :provinceData="region" headTitle="区域选择" ref="cityPicker" @funcValue="getPickerParentValue" pickerSize="4"></m-city>
</view> </view>
</template> </template>
<script> <script>
import { saveUserInfo } from "@/api/members.js"; import { saveUserInfo, getUserInfo } from "@/api/members.js";
import { upload } from "@/api/common.js"; import { upload } from "@/api/common.js";
import storage from "@/utils/storage.js"; import storage from "@/utils/storage.js";
import uFormItem from "@/uview-ui/components/u-form-item/u-form-item.vue"; import uFormItem from "@/uview-ui/components/u-form-item/u-form-item.vue";
import gkcity from "@/components/m-city/m-city.vue"; import city from "@/components/m-city/m-city.vue";
export default { export default {
components: { uFormItem, "m-city": gkcity }, components: { uFormItem, "m-city": city },
data() { data() {
return { return {
lightColor: this.$lightColor, //高亮颜色 lightColor: this.$lightColor, //高亮颜色
@@ -47,6 +59,8 @@ export default {
region: storage.getUserInfo().region || [], //地址 region: storage.getUserInfo().region || [], //地址
sex: storage.getUserInfo().sex, //性别 sex: storage.getUserInfo().sex, //性别
___path: storage.getUserInfo().region, ___path: storage.getUserInfo().region,
mobile: storage.getUserInfo().mobile,
username: storage.getUserInfo().username,
}, },
birthday: storage.getUserInfo().birthday || "", //生日 birthday: storage.getUserInfo().birthday || "", //生日
photo: [ photo: [
@@ -65,10 +79,17 @@ export default {
}; };
}, },
methods: { methods: {
/**
* 退出登录
*/
quiteLoginOut() {
this.$options.filters.quiteLoginOut();
},
/** /**
* 选择地址回调 * 选择地址回调
*/ */
getpickerParentValue(e) { getPickerParentValue(e) {
this.form.region = []; this.form.region = [];
this.form.regionId = []; this.form.regionId = [];
let name = ""; let name = "";
@@ -150,6 +171,12 @@ export default {
this.form.birthday = `${time.year}-${time.month}-${time.day}`; this.form.birthday = `${time.year}-${time.month}-${time.day}`;
this.birthday = `${time.year} - ${time.month} - ${time.day}`; this.birthday = `${time.year} - ${time.month} - ${time.day}`;
}, },
navigateTo(username) {
uni.navigateTo({
url: '/pages/mine/set/securityCenter/bindMobile' + '?username=' + username,
});
},
}, },
/** /**
@@ -158,7 +185,11 @@ export default {
onLoad() {}, onLoad() {},
}; };
</script> </script>
<style>
page{
background: #fff;
}
</style>
<style lang="scss" scoped> <style lang="scss" scoped>
.submit { .submit {
height: 90rpx; height: 90rpx;
@@ -199,4 +230,21 @@ export default {
.form { .form {
background-color: #ffffff; background-color: #ffffff;
} }
.bottom{
position: fixed;
bottom: 40px;
display: flex;
align-items: center;
width: 100%;
>.submit{
background: $light-color;
color: #fff;
width: 40%;
}
}
.light{
background: rgba($color: $light-color, $alpha: 0.2) !important;
color: $light-color !important;
}
</style> </style>

View File

@@ -0,0 +1,218 @@
<template>
<view class="box">
<view class="box-tips">
<h2 class='h2'>
绑定手机号码
</h2>
<view class="verification"></view>
</view>
<view class="form">
<u-form :model="codeForm" ref="validateCodeForm">
<view v-if="!validateFlage">
<u-form-item label-width="120" label="手机号" prop="mobile">
<u-input maxlength="11" v-model="codeForm.mobile" placeholder="请输入您的手机号" />
</u-form-item>
<u-form-item class="sendCode" label-width="120" prop="code" label="验证码">
<u-input v-model="codeForm.code" placeholder="请输入验证码" />
<u-verification-code unique-key="page-edit" :seconds="seconds" @end="end" @start="start"
ref="uCode" @change="codeChange"></u-verification-code>
<view @tap="getCode" class="text-tips">{{ tips }}</view>
</u-form-item>
<view class="submit" @click="validatePhone">绑定</view>
<myVerification keep-running @send="verification" class="verification" ref="verification"
business="BIND_MOBILE" />
</view>
</u-form>
</view>
</view>
</template>
<script>
import {
sendMobile,
bindMobile
} from "@/api/login";
import myVerification from "@/components/verification/verification.vue"; //验证
import uuid from "@/utils/uuid.modified.js";
export default {
components: {
myVerification,
},
data() {
return {
uuid,
validateFlage: false, //是否进行了手机号验证
step: 0, //当前验证步骤
flage: false, //是否验证码验证
codeForm: {
mobile: "", //手机号
code: "", //验证码
username: "", //用户名
},
tips: "", //提示
seconds: 69, // 60s等待时间
// 验证码登录校验
codeRules: {
mobile: [{
validator: (rule, value, callback) => {
return this.$u.test.mobile(value);
},
message: "手机号码不正确",
trigger: ["blur"],
}, ],
code: [{
min: 4,
max: 6,
required: true,
message: "请输入验证码",
trigger: ["blur"],
}, ],
},
};
},
onLoad(options) {
this.codeForm.username = options.username;
},
onReady() {
// 必须要在onReady生命周期因为onLoad生命周期组件可能尚未创建完毕
this.$refs.validateCodeForm.setRules(this.codeRules);
},
watch: {
flage(val) {
if (val) {
if (this.$refs.uCode.canGetCode) {
uni.showLoading({
title: "正在获取验证码",
});
sendMobile(this.codeForm.mobile, "BIND_MOBILE").then((res) => {
if (this.$store.state.isShowToast){ uni.hideLoading() };
// 这里此提示会被this.start()方法中的提示覆盖
if (res.data.success) {
this.$refs.uCode.start();
} else {
uni.showToast({
title: res.data.message,
duration: 2000,
icon: "none",
});
this.flage = false;
this.$refs.verification.getCode();
}
})
} else {
this.$u.toast("请倒计时结束后再发送");
}
}
},
},
methods: {
// 验证码验证
verification(val) {
this.flage = val == this.$store.state.verificationKey ? true : false;
},
// 验证手机号
validatePhone() {
this.$refs.validateCodeForm.validate((valid) => {
if (valid) {
bindMobile(this.codeForm).then((res) => {
if (res.data.success) {
this.validateFlage = !this.validateFlage;
// 登录成功
uni.showToast({
title: "绑定成功!",
duration: 2000,
icon: "none",
});
setTimeout(() => {
uni.navigateBack({
delta: 1,
});
}, 1000);
}
});
}
});
},
codeChange(text) {
this.tips = text;
},
end() {
this.flage = false;
this.$refs.verification.getCode()
},
/**获取验证码 */
getCode() {
if (this.tips == "重新获取") {
this.$refs.verification.error(); //发送
}
if (!this.$u.test.mobile(this.codeForm.mobile)) {
uni.showToast({
title: "请输入正确手机号",
icon: "none",
});
return false;
}
if (!this.flage) {
this.$refs.verification.error(); //发送
return false;
}
},
start() {
this.$u.toast("验证码已发送");
this.flage = true;
this.$refs.verification.hide();
},
},
};
</script>
<style lang="scss" scoped>
@import url("@/pages/passport/login.scss");
/deep/ .u-form-item {
margin: 40rpx 0;
}
.sendCode {
/deep/ .u-form-item--right__content__slot {
display: flex;
}
}
.h2 {
font-size: 40rpx;
font-weight: bold;
}
page {
background: #fff;
}
.box {
padding: 80rpx 0;
border-radius: 20rpx;
}
.submit {
background: $light-color;
}
.box-tips {
margin: 0 72rpx;
}
.verification {
font-size: 24rpx;
color: #999;
margin-top: 10rpx;
}
</style>

View File

@@ -1,251 +1,277 @@
<template> <template>
<view class="box"> <view class="box">
<view class="box-tips"> <view class="box-tips">
<h2> <h2 class='h2'>
{{verificationTitle[validateFlage==false ? 0 : 1].title}} {{verificationTitle[validateFlage==false ? 0 : 1].title}}
</h2> </h2>
<view class="verification">{{verificationTitle[step].desc}}</view> <view class="verification">{{verificationTitle[step].desc}}</view>
</view> </view>
<u-form :model="codeForm" class="form" ref="validateCodeForm"> <view class="form">
<view v-if="!validateFlage"> <u-form :model="codeForm" ref="validateCodeForm">
<u-form-item label-width="120" label="手机号" prop="mobile"> <view v-if="!validateFlage">
<u-input maxlength="11" v-model="codeForm.mobile" placeholder="请输入您的手机号" /> <u-form-item label-width="120" label="手机号" prop="mobile">
</u-form-item> <u-input maxlength="11" v-model="codeForm.mobile" placeholder="请输入您的手机号" />
</u-form-item>
<u-form-item class="sendCode" label-width="120" prop="code" label="验证码">
<u-input v-model="codeForm.code" placeholder="请输入验证码" /> <u-form-item class="sendCode" label-width="120" prop="code" label="验证码">
<u-verification-code unique-key="page-edit" :seconds="seconds" @end="end" @start="start" ref="uCode" @change="codeChange"></u-verification-code> <u-input v-model="codeForm.code" placeholder="请输入验证码" />
<view @tap="getCode" class="text-tips">{{ tips }}</view> <u-verification-code unique-key="page-edit" :seconds="seconds" @end="end" @start="start"
</u-form-item> ref="uCode" @change="codeChange"></u-verification-code>
<view @tap="getCode" class="text-tips">{{ tips }}</view>
<view class="submit" @click="validatePhone">验证</view> </u-form-item>
<myVerification keep-running @send="verification" class="verification" ref="verification" business="FIND_USER" />
</view> <view class="submit" @click="validatePhone">验证</view>
<view v-if="validateFlage"> <myVerification keep-running @send="verification" class="verification" ref="verification"
<u-form-item label-width="120" label="旧密码"> business="FIND_USER" />
<u-input type="password" v-model="password" placeholder="请输入您的旧密码" /> </view>
</u-form-item> <view v-if="validateFlage">
<u-form-item label-width="120" label="旧密码">
<u-form-item label-width="120" label="新密码"> <u-input type="password" v-model="password" placeholder="请输入您的旧密码" />
</u-form-item>
<u-input type="password" v-model="newPassword" placeholder="请输入您的新密码" />
<u-form-item label-width="120" label="新密码">
</u-form-item>
<u-input type="password" v-model="newPassword" placeholder="请输入您的新密码" />
<view class="submit" @click="updatePassword">修改密码</view>
</view> </u-form-item>
</u-form>
</view> <view class="submit" @click="updatePassword">修改密码</view>
</template> </view>
</u-form>
<script> </view>
import { sendMobile, resetByMobile, modifyPass } from "@/api/login"; </view>
</template>
import { md5 } from "@/utils/md5.js"; // md5
import myVerification from "@/components/verification/verification.vue"; //验证 <script>
import uuid from "@/utils/uuid.modified.js"; import {
export default { sendMobile,
components: { resetByMobile,
myVerification, modifyPass
}, } from "@/api/login";
data() {
return { import {
uuid, md5
validateFlage: false, //是否进行了手机号验证 } from "@/utils/md5.js"; // md5
verificationTitle: [ import myVerification from "@/components/verification/verification.vue"; //验证
{ import uuid from "@/utils/uuid.modified.js";
title: "安全验证", export default {
desc: "请输入当前手机号进行安全验证", components: {
}, myVerification,
{ },
title: "修改密码", data() {
desc: "请输入新密码", return {
}, uuid,
], validateFlage: false, //是否进行了手机号验证
step: 0, //当前验证步骤 verificationTitle: [{
flage: false, //是否验证码验证 title: "安全验证",
desc: "请输入当前手机号进行安全验证",
codeForm: { },
mobile: "", //手机号 {
code: "", //验证码 title: "修改密码",
}, desc: "请输入新密码",
newPassword: "", //新密码 },
password: "", //密码 ],
tips: "", //提示 step: 0, //当前验证步骤
seconds: 60, // 60s等待时间 flage: false, //是否验证码验证
// 验证码登录校验 codeForm: {
codeRules: { mobile: "", //手机号
mobile: [ code: "", //验证码
{ },
validator: (rule, value, callback) => { newPassword: "", //新密码
return this.$u.test.mobile(value); password: "", //密码
}, tips: "", //提示
message: "手机号码不正确", seconds: 69, // 60s等待时间
trigger: ["blur"],
}, // 验证码登录校验
], codeRules: {
code: [ mobile: [{
{ validator: (rule, value, callback) => {
min: 4, return this.$u.test.mobile(value);
max: 6, },
required: true, message: "手机号码不正确",
message: "请输入验证码", trigger: ["blur"],
trigger: ["blur"], }, ],
}, code: [{
], min: 4,
}, max: 6,
}; required: true,
}, message: "请输入验证码",
onReady() { trigger: ["blur"],
// 必须要在onReady生命周期因为onLoad生命周期组件可能尚未创建完毕 }, ],
this.$refs.validateCodeForm.setRules(this.codeRules); },
}, };
watch: { },
flage(val) { onReady() {
if (val) { // 必须要在onReady生命周期因为onLoad生命周期组件可能尚未创建完毕
if (this.$refs.uCode.canGetCode) { this.$refs.validateCodeForm.setRules(this.codeRules);
uni.showLoading({ },
title: "正在获取验证码", watch: {
}); flage(val) {
sendMobile(this.codeForm.mobile, "FIND_USER").then((res) => { if (val) {
uni.hideLoading();
// 这里此提示会被this.start()方法中的提示覆盖 if (this.$refs.uCode.canGetCode) {
if (res.data.code == 200) { uni.showLoading({
this.$refs.uCode.start(); title: "正在获取验证码",
} else { });
uni.showToast({ sendMobile(this.codeForm.mobile, "FIND_USER").then((res) => {
title: res.data.message, if (this.$store.state.isShowToast){ uni.hideLoading() };
duration: 2000, // 这里此提示会被this.start()方法中的提示覆盖
icon: "none", if (res.data.success) {
}); this.$refs.uCode.start();
} } else {
}); uni.showToast({
} else { title: res.data.message,
this.$u.toast("请倒计时结束后再发送"); duration: 2000,
} icon: "none",
} });
}, this.flage = false;
}, this.$refs.verification.getCode();
}
methods: { })
// 修改密码 } else {
updatePassword() { this.$u.toast("请倒计时结束后再发送");
modifyPass({ }
newPassword: md5(this.newPassword), }
password: md5(this.password), },
}).then((res) => { },
if (res.data.success) {
uni.showToast({ methods: {
title: "修改成功!", // 修改密码
duration: 2000, updatePassword() {
icon: "none", modifyPass({
}); newPassword: md5(this.newPassword),
setTimeout(() => { password: md5(this.password),
uni.navigateBack({ }).then((res) => {
delta: 1, if (res.data.success) {
}); uni.showToast({
}, 1000); title: "修改成功!",
} duration: 2000,
}); icon: "none",
}, });
setTimeout(() => {
// 验证码验证 uni.navigateBack({
verification(val) { delta: 1,
this.flage = val == this.$store.state.verificationKey ? true : false; });
}, }, 1000);
}
// 验证手机号 });
validatePhone() { },
this.$refs.validateCodeForm.validate((valid) => {
if (valid) { // 验证码验证
resetByMobile(this.codeForm).then((res) => { verification(val) {
if (res.data.success) { this.flage = val == this.$store.state.verificationKey ? true : false;
this.validateFlage = !this.validateFlage; },
// 登录成功
uni.showToast({ // 验证手机号
title: "验证成功!", validatePhone() {
icon: "none", this.$refs.validateCodeForm.validate((valid) => {
}); if (valid) {
} resetByMobile(this.codeForm).then((res) => {
}); if (res.data.success) {
} this.validateFlage = !this.validateFlage;
}); // 登录成功
}, uni.showToast({
title: "验证成功!",
codeChange(text) { icon: "none",
this.tips = text; });
}, }
end() {}, });
}
/**判断是否是当前用户的手机号 */ });
isUserPhone() { },
let flage = false;
let user = this.$options.filters.isLogin(); codeChange(text) {
if (user.mobile != this.codeForm.mobile) { this.tips = text;
uni.showToast({ },
title: "请输入当前绑定手机号", end() {
icon: "none",
}); this.flage = false;
flage = false; this.$refs.verification.getCode()
} else { },
flage = true;
} /**判断是否是当前用户的手机号 */
isUserPhone() {
return flage; let flage = false;
}, let user = this.$options.filters.isLogin();
/**获取验证码 */ if (user.mobile != this.codeForm.mobile) {
getCode() { uni.showToast({
if (this.isUserPhone()) { title: "请输入当前绑定手机号",
if (this.tips == "重新获取") { icon: "none",
this.flage = true; });
} flage = false;
if (!this.$u.test.mobile(this.codeForm.mobile)) { } else {
uni.showToast({ flage = true;
title: "请输入正确手机号", }
icon: "none",
}); return flage;
return false; },
} /**获取验证码 */
if (!this.flage) { getCode() {
this.$refs.verification.hide(); if (this.isUserPhone()) {
return false; if (this.tips == "重新获取") {
} this.$refs.verification.error(); //发送
} }
}, if (!this.$u.test.mobile(this.codeForm.mobile)) {
start() { uni.showToast({
this.$u.toast("验证码已发送"); title: "请输入正确手机号",
this.flage = false; icon: "none",
}, });
}, return false;
}; }
</script> if (!this.flage) {
<style lang="scss" scoped> this.$refs.verification.error(); //发送
@import url("../../../passport/login.scss"); return false;
.u-form-item { }
margin: 40rpx 0; }
} },
.sendCode { start() {
/deep/ .u-form-item--right__content__slot { this.$u.toast("验证码已发送");
display: flex; this.flage = true;
}
} this.$refs.verification.hide();
page { },
background: #fff; },
} };
.box { </script>
padding: 80rpx 0; <style lang="scss" scoped>
border-radius: 20rpx; @import url("@/pages/passport/login.scss");
}
.submit { /deep/ .u-form-item {
background: $light-color; margin: 40rpx 0;
} }
.box-tips {
margin: 0 72rpx; .sendCode {
} /deep/ .u-form-item--right__content__slot {
.verification { display: flex;
font-size: 24rpx; }
color: #999; }
margin-top: 10rpx;
} .h2 {
</style> font-size: 40rpx;
font-weight: bold;
}
page {
background: #fff;
}
.box {
padding: 80rpx 0;
border-radius: 20rpx;
}
.submit {
background: $light-color;
}
.box-tips {
margin: 0 72rpx;
}
.verification {
font-size: 24rpx;
color: #999;
margin-top: 10rpx;
}
</style>

View File

@@ -2,6 +2,7 @@
<view class="securityCenter"> <view class="securityCenter">
<u-cell-group> <u-cell-group>
<u-cell-item title="修改密码" @click="navigateTo('/pages/mine/set/securityCenter/editPassword')"></u-cell-item> <u-cell-item title="修改密码" @click="navigateTo('/pages/mine/set/securityCenter/editPassword')"></u-cell-item>
<u-cell-item title="注销账户" @click="zhuxiao"></u-cell-item>
</u-cell-group> </u-cell-group>
</view> </view>
</template> </template>
@@ -15,6 +16,35 @@ export default {
}, },
methods: { methods: {
zhuxiao(){
uni.showModal({
title: "警告",
content: "您确定要注销当前账号吗?",
confirmText: "确定注销",
confirmColor: "#FF0000",
cancelText: "取消",
success: (res) => {
if (res.confirm) {
uni.showModal({
title: "谨慎操作",
content: "再次向您确认,您确定要注销当前账号吗?",
confirmText: "坚持注销",
confirmColor: "#FF0000",
cancelText: "取消",
success: (res) => {
if (res.confirm) {
uni.showToast({
title: "您的注销申请已经提交,待管理员审核后。会自动注销当前账号",
duration: 10000,
});
}
},
});
}
},
});
},
navigateTo(url) { navigateTo(url) {
uni.navigateTo({ uni.navigateTo({
url: url, url: url,

View File

@@ -1,10 +1,9 @@
<template> <template>
<view class="container"> <view class="container">
<view class="person" @click="checkUserInfo()"> <view class="person" @click="checkUserInfo()">
<u-image width=140 height="140" shape="circle" :src="userInfo.face || '/static/missing-face.png'" mode=""> <u-image width=140 height="140" shape="circle" :src="userInfo.face || userImage" mode="">
</u-image> </u-image>
<view class="user-name"> <view class="user-name">
{{ userInfo.id ? userInfo.nickName || '' : '暂未登录' }} {{ userInfo.id ? userInfo.nickName || '' : '暂未登录' }}
</view> </view>
<u-icon color="#ccc" name="arrow-right"></u-icon> <u-icon color="#ccc" name="arrow-right"></u-icon>
@@ -16,28 +15,26 @@
<!-- #ifdef APP-PLUS --> <!-- #ifdef APP-PLUS -->
<u-cell-item title="清除缓存" :value="fileSizeString" @click="clearCache"></u-cell-item> <u-cell-item title="清除缓存" :value="fileSizeString" @click="clearCache"></u-cell-item>
<!-- #endif --> <!-- #endif -->
<!-- #ifndef MP-WEIXIN -->
<u-cell-item title="安全中心" @click="navigateTo('/pages/mine/set/securityCenter/securityCenter')"></u-cell-item> <u-cell-item title="安全中心" @click="navigateTo('/pages/mine/set/securityCenter/securityCenter')"></u-cell-item>
<!-- #endif -->
<u-cell-item title="用户注销" v-if="userInfo.id" @click="logoff"></u-cell-item>
<u-cell-item title="意见反馈" @click="navigateTo('/pages/mine/set/feedBack')"></u-cell-item> <u-cell-item title="意见反馈" @click="navigateTo('/pages/mine/set/feedBack')"></u-cell-item>
<!-- #ifndef H5 --> <!-- #ifndef H5 -->
<!-- #endif --> <!-- #endif -->
<u-cell-item :title="`关于${config.name}`" @click="navigateTo('/pages/mine/set/editionIntro')"></u-cell-item> <u-cell-item :title="`关于${config.name}`" @click="navigateTo('/pages/mine/set/editionIntro')"></u-cell-item>
</u-cell-group> </u-cell-group>
<view class="submit" @click="showModalDialog">{{userInfo.id ?'退出登录':'返回登录'}}</view> <view class="submit" v-if="userInfo.id" @click="quiteLoginOut">退出登录</view>
<u-modal show-cancel-button v-model="quitShow" @confirm="confirm" :confirm-color="lightColor" :async-close="true"
:content="userInfo.id ? '确定要退出登录么?' : '确定要返回登录么?'"></u-modal>
</view> </view>
</template> </template>
<script> <script>
import { logout } from "@/api/login";
import storage from "@/utils/storage.js";
import config from "@/config/config"; import config from "@/config/config";
export default { export default {
data() { data() {
return { return {
config, config,
lightColor: this.$lightColor, userImage:config.defaultUserPhoto,
quitShow: false,
isCertificate: false, isCertificate: false,
userInfo: {}, userInfo: {},
fileSizeString: "0B", fileSizeString: "0B",
@@ -53,28 +50,19 @@ export default {
url: url, url: url,
}); });
}, },
clear() { /**
storage.setAccessToken(""); * 退出登录
storage.setRefreshToken(""); */
storage.setUserInfo({}); quiteLoginOut() {
this.$options.filters.navigateToLogin("redirectTo"); this.$options.filters.quiteLoginOut();
}, },
/** /**
* 确认退出 * 用户注销
* 清除缓存重新登录 */
*/ logoff(){
async confirm() { this.$options.filters.logoff();
await logout(); },
this.clear();
},
/**
* 显示退出登录对话框
*/
showModalDialog() {
this.quitShow = true;
},
/** /**
* 读取当前缓存 * 读取当前缓存
@@ -106,11 +94,7 @@ export default {
if (this.$options.filters.isLogin("auth")) { if (this.$options.filters.isLogin("auth")) {
this.navigateTo("/pages/mine/set/personMsg"); this.navigateTo("/pages/mine/set/personMsg");
} else { } else {
uni.showToast({ this.$options.filters.tipsToLogin();
title: "当前暂无用户请登录后重试",
duration: 2000,
icon: "none",
});
} }
}, },

View File

@@ -22,19 +22,6 @@
} }
} }
.promotion {
margin-top: 4rpx;
display: flex;
div {
span {
font-size: 24rpx;
color: $light-color;
margin-right: 10rpx;
padding: 0 4rpx;
border-radius: 2rpx;
}
}
}
.status_bar { .status_bar {
height: var(--status-bar-height); height: var(--status-bar-height);
background: #fff !important; background: #fff !important;
@@ -437,180 +424,13 @@ view {
margin-left: 4rpx; margin-left: 4rpx;
font-size: 26rpx; font-size: 26rpx;
color: #888; color: #888;
} }
.xia { .xia {
transform: scaleY(-1); transform: scaleY(-1);
} }
} }
.cate-item {
display: flex;
justify-content: center;
align-items: center;
height: 100%;
width: 80rpx;
position: relative;
font-size: 44rpx;
&:after {
content: "";
position: absolute;
left: 0;
top: 50%;
transform: translateY(-50%);
border-left: 1px solid #ddd;
width: 0;
height: 36rpx;
}
}
} }
/* 分类 */
.cate-mask {
position: fixed;
left: 0;
top: var(--window-top);
bottom: 0;
width: 100%;
background: rgba(0, 0, 0, 0);
z-index: 95;
transition: 0.3s;
.cate-content {
width: 630rpx;
height: 100%;
background: #fff;
float: right;
transform: translateX(100%);
transition: 0.3s;
}
&.none {
display: none;
}
&.show {
background: rgba(0, 0, 0, 0.4);
.cate-content {
transform: translateX(0);
}
}
}
.cate-list {
display: flex;
flex-direction: column;
height: 100%;
.cate-item {
display: flex;
align-items: center;
height: 90rpx;
padding-left: 30rpx;
font-size: 28rpx;
color: #555;
position: relative;
}
.two {
height: 64rpx;
color: #303133;
font-size: 30rpx;
background: #f8f8f8;
}
}
.price-box {
margin-top: 10rpx;
display: flex;
align-items: center;
justify-content: space-between;
padding-right: 10rpx;
font-size: 24rpx;
color: $font-color-light;
}
.price {
font-size: 26rpx;
line-height: 1;
color: $main-color;
font-weight: bold;
/deep/ span:nth-of-type(1) {
font-size: 38rpx;
}
}
/* 商品列表 */
.goods-list {
display: flex;
flex-wrap: wrap;
margin: 10rpx 20rpx 284rpx;
// background: #fff;
width: 100%;
.goods-item {
background-color: #ffffff;
display: flex;
border-radius: 16rpx;
flex-direction: column;
width: calc(50% - 30rpx);
margin-bottom: 20rpx;
padding-bottom: 20rpx;
&:nth-child(2n + 1) {
margin-right: 20rpx;
}
.goods-detail {
margin: 0 20rpx;
}
}
.image-wrapper {
width: 100%;
height: 330rpx;
border-radius: 16rpx 16rpx 0 0;
overflow: hidden;
padding: 0;
image {
width: 100%;
height: 100%;
opacity: 1;
border-radius: 16rpx 16rpx 0 0;
}
}
.title {
font-size: $font-base;
color: $font-color-dark;
line-height: 1.5;
height: 84rpx;
padding: 10rpx 0 0;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
overflow: hidden;
}
.count-config,
.store-seller-name {
font-size: $font-sm;
}
.text-hidden {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
.status_bar { .status_bar {
height: var(--status-bar-height); height: var(--status-bar-height);
width: 100%; width: 100%;

File diff suppressed because it is too large Load Diff

View File

@@ -1,31 +1,51 @@
<template> <template>
<view class="content"> <view class="content">
<view class="u-tabs-box"> <view class="u-tabs-box">
<u-tabs bg-color="#fff" :list="list" :is-scroll="false" :current="current" @change="change" <u-tabs
:active-color="$lightColor"></u-tabs> bg-color="#fff"
:list="list"
:is-scroll="false"
:current="current"
@change="change"
:active-color="$lightColor"
></u-tabs>
</view> </view>
<div class="u-tabs-search"> <div class="u-tabs-search">
<u-search placeholder="请输入订单编号" @search="handleGetOrderList(current)" @clear="handleGetOrderList(current)" <u-search
@custom="handleGetOrderList(current)" v-model="params.orderSn"></u-search> placeholder="请输入订单编号/商品名称/售后单号"
@search="submitSearchOrderList(current)"
@clear="clear(current)"
@custom="submitSearchOrderList(current)"
v-model="keywords"
>
</u-search>
</div> </div>
<scroll-view class="body-view" scroll-y @scrolltolower="renderDate"> <scroll-view class="body-view" scroll-y @scrolltolower="renderDate">
<view class="seller-view" v-for="(order, orderIndex) in orderList" :key="orderIndex"> <view
class="seller-view"
v-for="(order, orderIndex) in orderList"
:key="orderIndex"
>
<!-- 店铺名称 --> <!-- 店铺名称 -->
<view class="seller-info u-flex u-row-between" v-if="current == 0"> <view class="seller-info u-flex u-row-between" v-if="current == 0">
<view class="seller-name"> <view class="order-sn">订单编号:{{ order.sn }}</view>
<view class="name">{{ order.storeName }}</view>
</view>
<view class="order-sn">订单编号:{{order.sn}}</view>
</view> </view>
<!-- 申请记录 选项卡 --> <!-- 申请记录 选项卡 -->
<view class="seller-info u-flex u-row-between" v-if="current != 0"> <view class="seller-info u-flex u-row-between" v-if="current != 0">
<view class="order-sn">售后单号{{ order.service_sn || order.sn }}</view> <view class="order-sn"
>售后单号{{ order.service_sn || order.sn }}</view
>
<view class="order-sn">{{ order.serviceType_text }}</view> <view class="order-sn">{{ order.serviceType_text }}</view>
</view> </view>
<view v-for="(sku, goodsIndex) in order.orderItems" :key="goodsIndex"> <view v-for="(sku, goodsIndex) in order.orderItems" :key="goodsIndex">
<view class="goods-item-view" @click="onDetail(order,sku)"> <view class="goods-item-view" @click="onDetail(order, sku)">
<view class="goods-img"> <view class="goods-img">
<u-image border-radius="6" width="100%" height="100%" :src="sku.image"></u-image> <u-image
border-radius="6"
width="100%"
height="100%"
:src="sku.image"
></u-image>
</view> </view>
<view class="goods-info"> <view class="goods-info">
<view class="goods-title u-line-2">{{ sku.name }}</view> <view class="goods-title u-line-2">{{ sku.name }}</view>
@@ -38,81 +58,147 @@
<view>x{{ sku.num }}</view> <view>x{{ sku.num }}</view>
</view> </view>
</view> </view>
<view class="btn-view u-flex u-row-between"> <view class="description">
<view class="description"> <!-- 售后申请 -->
<!-- 售后申请 --> <view v-if="current === 0 && sku.afterSaleStatus">
<view v-if=" <view
current === 0 && order.groupAfterSaleStatus && v-if="sku.afterSaleStatus.includes('ALREADY_APPLIED')"
order.groupAfterSaleStatus.includes('ALREADY_APPLIED') class="cannot_apply not_center"
" class="cannot_apply"> >
<u-icon class="icon" name="info-circle-fill"></u-icon> <u-icon class="icon" name="info-circle-fill"></u-icon>
该商品已申请售后服务 该商品已申请售后服务
</view> </view>
<view class="cannot_apply" </view>
v-if="current === 0 && order.groupAfterSaleStatus && order.groupAfterSaleStatus.includes('EXPIRED') " <view v-if="current === 0 && sku.afterSaleStatus">
@click="tipsShow = true"> <view
v-if="sku.afterSaleStatus.includes('EXPIRED')"
class="cannot_apply not_center"
@click="tipsShow = true"
>
<u-icon class="icon" name="info-circle-fill"></u-icon> <u-icon class="icon" name="info-circle-fill"></u-icon>
该商品无法申请售后 该商品无法申请售后
</view> </view>
<div v-if="current === 1 || current === 2">
<!-- 申请中 -->
<view class="cannot_apply" v-if="order.serviceType == 'RETURN_GOODS'">
退货处理-{{ order.serviceStatus | serviceStatusList }}</view>
<view class="cannot_apply" v-if="order.serviceType == 'SUPPLY_AGAIN_GOODS'">
补发商品-{{ order.serviceStatus | serviceStatusList }}</view>
<view class="cannot_apply" v-if="order.serviceType == 'RETURN_MONEY'">
退款-{{ order.serviceStatus | serviceStatusList }}</view>
<view class="cannot_apply" v-if="order.serviceType == 'EXCHANGE_GOODS'">
换货-{{ order.serviceStatus | serviceStatusList }}</view>
<view class="cannot_apply" v-if="order.serviceType == 'CANCEL'">
取消订单-{{ order.serviceStatus | serviceStatusList }}</view>
</div>
<!-- 申请记录 -->
</view> </view>
<view class="after-line">
<!-- 售后申请 --> <div v-if="current === 1 || current === 2">
<view v-if="
current === 0 && order.groupAfterSaleStatus.includes('NOT_APPLIED')
" @click="applyService(sku.sn, order, sku)" class="rebuy-btn">
申请售后
</view>
<!-- 申请中 --> <!-- 申请中 -->
<view class="rebuy-btn" v-if=" <view
class="cannot_apply not_center"
v-if="order.serviceType == 'RETURN_GOODS'"
>
退货处理-{{ order.serviceStatus | serviceStatusList }}</view
>
<view
class="cannot_apply not_center"
v-if="order.serviceType == 'SUPPLY_AGAIN_GOODS'"
>
补发商品-{{ order.serviceStatus | serviceStatusList }}</view
>
<view
class="cannot_apply not_center"
v-if="order.serviceType == 'RETURN_MONEY'"
>
退款-{{ order.serviceStatus | serviceStatusList }}</view
>
<view
class="cannot_apply not_center"
v-if="order.serviceType == 'EXCHANGE_GOODS'"
>
换货-{{ order.serviceStatus | serviceStatusList }}</view
>
<view
class="cannot_apply not_center"
v-if="order.serviceType == 'CANCEL'"
>
取消订单-{{ order.serviceStatus | serviceStatusList }}</view
>
</div>
<!-- 申请记录 -->
</view>
<view class="btn-view u-flex u-row-right">
<!-- 售后申请 -->
<div class="sale" v-if="current === 0 && sku.afterSaleStatus">
<div
v-if="
order.flowPrice != 0 &&
sku.afterSaleStatus.includes('NOT_APPLIED') ||
sku.afterSaleStatus.includes('PART_AFTER_SALE')
"
@click="applyService(sku.sn, order, sku)"
>
<view class="default-btn border"> 申请售后 </view>
</div>
</div>
<view class="after-line">
<!-- 申请中 -->
<view
class="default-btn border"
v-if="
current === 2 && current === 2 &&
order.serviceStatus && order.serviceStatus &&
order.serviceStatus == 'PASS' && order.serviceStatus == 'PASS' &&
order.serviceType != 'RETURN_MONEY' order.serviceType != 'RETURN_MONEY'
" @click="onExpress(order, sku)"> "
@click="onExpress(order, sku)"
>
提交物流 提交物流
</view> </view>
<view @click="afterDetails(order, sku)" v-if="current === 1 || current === 2" class="rebuy-btn"> <view
@click="close(order, sku)"
v-if="current === 1"
class="default-btn close"
>
取消售后
</view>
<view
@click="afterDetails(order, sku)"
v-if="current === 1 || current === 2"
class="default-btn border"
>
售后详情 售后详情
</view> </view>
</view> </view>
</view> </view>
</view> </view>
<view v-if=" <view
current === 0 && order.groupAfterSaleStatus && v-if="
current === 0 &&
order.groupAfterSaleStatus &&
order.groupAfterSaleStatus != 'ALREADY_APPLIED' && order.groupAfterSaleStatus != 'ALREADY_APPLIED' &&
order.orderItems.length >= 1 order.orderItems.length >= 1
" class="btn-view u-flex u-row-between"> "
class="btn-view u-flex u-row-between"
>
<!-- 多个商品显示订单总价格 --> <!-- 多个商品显示订单总价格 -->
<view class="cannot_apply"> <view class="cannot_apply">
订单总金额:<span class="countMoney">¥{{ order.flowPrice | unitPrice }}</span> 订单总金额:<span class="countMoney"
>¥{{ order.flowPrice | unitPrice }}</span
>
</view> </view>
</view> </view>
</view> </view>
<u-loadmore bg-color="#f8f8f8" :status="status" /> <u-loadmore bg-color="#f8f8f8" :status="status" />
</scroll-view> </scroll-view>
<u-modal v-model="tipsShow" content="当订单未确认收货|已过售后服务有效期|已申请售后服务时,不能申请售后"></u-modal> <u-modal
show-cancel-button
@confirm="closeService"
v-model="cancelShow"
content="确认取消售后"
></u-modal>
<u-modal
v-model="tipsShow"
content="当订单未确认收货|已过售后服务有效期|已申请售后服务时,不能申请售后"
></u-modal>
</view> </view>
</template> </template>
<script> <script>
import uniLoadMore from "@/components/uni-load-more/uni-load-more.vue"; import uniLoadMore from "@/components/uni-load-more/uni-load-more.vue";
import { getAfterSaleList } from "@/api/after-sale.js"; import { getAfterSaleList, cancelAfterSale } from "@/api/after-sale.js";
import { getOrderList } from "@/api/order.js"; import { getOrderList } from "@/api/order.js";
import storage from "@/utils/storage";
export default { export default {
components: { components: {
@@ -134,11 +220,14 @@ export default {
], ],
current: 0, //当前表头索引 current: 0, //当前表头索引
tipsShow: false, //提示开关 tipsShow: false, //提示开关
cancelShow: false, //取消显示开关
selectedOrder: "", //选中的order
orderList: [], //订单集合 orderList: [], //订单集合
params: { params: {
pageNumber: 1, pageNumber: 1,
pageSize: 10, pageSize: 10,
sort: "createTime", sort: "createTime",
flowPrice: 0,
order: "desc", order: "desc",
}, },
@@ -147,21 +236,35 @@ export default {
pageSize: 10, pageSize: 10,
}, },
status: "loadmore", status: "loadmore",
keywords: "", // 搜索订单sn
}; };
}, },
onLoad(options) { onLoad(options) {
this.orderList = []; this.orderList = [];
this.params.pageNumber = 1; this.params.pageNumber = 1;
if (options.orderSn) this.params.orderSn = options.orderSn; if (options.orderSn) this.params.keywords = options.orderSn;
this.getOrderList(this.current); this.searchOrderList(this.current);
}, },
onPullDownRefresh() { onPullDownRefresh() {
this.change(this.current); this.change(this.current);
}, },
methods: { methods: {
handleGetOrderList(current) { /**
* 点击搜索执行搜索
*/
submitSearchOrderList(current) {
this.params.pageNumber = 1;
this.logParams.pageNumber = 1;
this.orderList = []; this.orderList = [];
this.getOrderList(current); this.searchOrderList(current);
},
// 清空
clear(current){
this.params.pageNumber = 1;
this.logParams.pageNumber = 1;
this.params.keywords = ''
this.orderList = [];
this.searchOrderList(current);
}, },
/** /**
* 切换tab页时初始化数据 * 切换tab页时初始化数据
@@ -174,8 +277,18 @@ export default {
}; };
this.orderList = []; this.orderList = [];
//如果是2 则读取售后申请记录列表 //如果是2 则读取售后申请记录列表
this.searchOrderList(index);
uni.stopPullDownRefresh();
},
/**
* 搜索初始化
* 根据当前tab传值的索引进行更改
*/
searchOrderList(index) {
if (index == 0) { if (index == 0) {
this.getOrderList(index); this.keywords ? (this.params.keywords = this.keywords) : "";
this.getOrderList();
} else { } else {
this.logParams = { this.logParams = {
pageNumber: 1, pageNumber: 1,
@@ -186,28 +299,28 @@ export default {
if (index === 1) { if (index === 1) {
this.logParams.serviceStatus = "APPLY"; this.logParams.serviceStatus = "APPLY";
} }
this.keywords ? (this.logParams.keywords = this.keywords) : "";
this.orderList = []; this.orderList = [];
this.getAfterSaleLogList(); this.getAfterSaleLogList();
} }
uni.stopPullDownRefresh();
}, },
/** /**
* 获取订单列表 * 获取订单列表
*/ */
getOrderList(index) { getOrderList() {
uni.showLoading({ uni.showLoading({
title: "加载中", title: "加载中",
mask: true, mask: true,
}); });
getOrderList(this.params).then((res) => { getOrderList(this.params).then((res) => {
uni.hideLoading(); if (this.$store.state.isShowToast){ uni.hideLoading() };
const orderlist = res.data.result.records; const orderList = res.data.result.records;
if (orderlist.length > 0) { if (orderList.length > 0) {
this.orderList = this.orderList.concat(orderlist); this.orderList = this.orderList.concat(orderList);
this.params.pageNumber += 1; this.params.pageNumber += 1;
} }
if (orderlist.length < 10) { if (orderList.length < 10) {
this.status = "nomore"; this.status = "nomore";
} else { } else {
this.status = "loading"; this.status = "loading";
@@ -215,6 +328,31 @@ export default {
}); });
}, },
close(order, sku) {
console.log(order, sku);
this.selectedOrder = order;
this.cancelShow = true;
},
async closeService() {
uni.showLoading({
title: "加载中",
});
console.log(this.selectedOrder);
let res = await cancelAfterSale(this.selectedOrder.sn);
if (res.data.success) {
uni.showToast({
title: "取消成功!",
duration: 2000,
icon: "none",
});
}
this.orderList = [];
this.searchOrderList(this.current);
if (this.$store.state.isShowToast){ uni.hideLoading() };
},
/** /**
* 售后详情 * 售后详情
*/ */
@@ -261,11 +399,9 @@ export default {
...order, ...order,
...sku, ...sku,
}; };
storage.setAfterSaleData(data);
uni.navigateTo({ uni.navigateTo({
url: `/pages/order/afterSales/afterSalesSelect?sn=${sn}&sku=${encodeURIComponent( url: `/pages/order/afterSales/afterSalesSelect?sn=${sn}`,
JSON.stringify(data)
)}`,
}); });
}, },
@@ -274,11 +410,14 @@ export default {
*/ */
onExpress(order, sku) { onExpress(order, sku) {
sku.storeName = order.storeName; sku.storeName = order.storeName;
let data = {
...order,
...sku,
};
storage.setAfterSaleData(data);
uni.navigateTo({ uni.navigateTo({
url: `./afterSalesDetailExpress?serviceSn=${ url: `./afterSalesDetailExpress?serviceSn=${order.sn}`,
order.sn
}&sku=${encodeURIComponent(JSON.stringify(sku))}`,
}); });
}, },
@@ -324,35 +463,43 @@ page,
background: $page-color-base; background: $page-color-base;
height: 100%; height: 100%;
} }
.body-view { .body-view {
overflow-y: auto; overflow-y: auto;
height: calc(100vh - 44px - 80rpx - 104rpx); height: calc(100vh - 44px - 80rpx - 104rpx);
} }
.u-tabs-search { .u-tabs-search {
padding: 20rpx; padding: 20rpx;
background: #fff; background: #fff;
} }
.countMoney { .countMoney {
margin-left: 7rpx; margin-left: 7rpx;
color: $main-color; color: $main-color;
font-size: 28rpx; font-size: 28rpx;
} }
.seller-view { .seller-view {
background-color: #fff; background-color: #fff;
margin: 20rpx 0rpx; margin: 20rpx 0rpx;
padding: 0rpx 20rpx; padding: 0rpx 20rpx;
border-radius: 20rpx; border-radius: 20rpx;
.seller-info { .seller-info {
height: 70rpx; height: 70rpx;
.seller-name { .seller-name {
font-size: 28rpx; font-size: 28rpx;
display: flex; display: flex;
flex-direction: row; flex-direction: row;
.name { .name {
margin-left: 15rpx; margin-left: 15rpx;
margin-top: -2rpx; margin-top: -2rpx;
} }
} }
.order-sn { .order-sn {
font-size: 22rpx; font-size: 22rpx;
color: #909399; color: #909399;
@@ -396,6 +543,7 @@ page,
color: $main-color; color: $main-color;
} }
} }
.btn-view { .btn-view {
padding: 16rpx 0; padding: 16rpx 0;
@@ -405,10 +553,12 @@ page,
} }
} }
} }
.description { .description {
color: #909399; color: #909399;
size: 25rpx; size: 25rpx;
} }
.cannot_apply { .cannot_apply {
text-align: center; text-align: center;
font-size: 22rpx; font-size: 22rpx;
@@ -417,31 +567,37 @@ page,
height: 70rpx; height: 70rpx;
line-height: 70rpx; line-height: 70rpx;
} }
.not_center {
text-align: left;
}
.icon { .icon {
margin-right: 10rpx; margin-right: 10rpx;
} }
.cancel-btn {
color: #999999; .sale {
border-color: #999999; width: 100%;
margin-left: 15rpx; display: flex;
height: 60rpx; justify-content: flex-end;
} }
.pay-btn {
background-color: #1abc9c; .default-btn {
color: #ffffff;
margin-left: 15rpx;
height: 60rpx;
}
.rebuy-btn {
background-color: #ffffff; background-color: #ffffff;
margin-left: 15rpx; margin-left: 15rpx;
height: 60rpx; height: 60rpx;
line-height: 60rpx; line-height: 60rpx;
text-align: center; text-align: center;
font-size: 24rpx; font-size: 24rpx;
border: 2rpx solid $light-color;
color: $light-color;
padding: 0 24rpx; padding: 0 24rpx;
border-radius: 200px; border-radius: 200px;
} }
.close {
color: $light-color;
}
.border {
border: 2rpx solid $light-color;
color: $light-color;
}
</style> </style>

View File

@@ -2,13 +2,6 @@
<view class="content"> <view class="content">
<u-form :model="form" ref="uForm"> <u-form :model="form" ref="uForm">
<view class="after-sales-goods-detail-view"> <view class="after-sales-goods-detail-view">
<view class="header">
<view>
本次售后服务将由
<text class="seller-name">{{ sku.storeName }}</text>
为您提供
</view>
</view>
<view> <view>
<view class="goods-item-view" v-for="(item,index) in sku.orderItems" v-if="item.sn == sn" <view class="goods-item-view" v-for="(item,index) in sku.orderItems" v-if="item.sn == sn"
@click="gotoGoodsDetail(sku.goods_id)"> @click="gotoGoodsDetail(sku.goods_id)">
@@ -37,9 +30,8 @@
<view class="body-view"> <view class="body-view">
<!-- 退款原因 --> <!-- 退款原因 -->
<view class="opt-view"> <view class="opt-view">
<u-form-item label="申请原因" :label-width="150"> <u-form-item label="申请原因" :label-width="150" >
<u-input v-model="form.reason" type="select" input-align="right" :select-open="reasonSelectShow" <div style="width: 100%; text-align: right;" @click="reasonSelectShow = true">{{ form.reason || '请选择申请原因' }}</div>
@click="reasonSelectShow = true" placeholder="请选择申请原因" />
</u-form-item> </u-form-item>
<u-form-item label="申请说明" :label-width="150"> <u-form-item label="申请说明" :label-width="150">
<u-input input-align="right" type="textarea" v-model="form.problemDesc" placeholder="请描述申请售后的说明" /> <u-input input-align="right" type="textarea" v-model="form.problemDesc" placeholder="请描述申请售后的说明" />
@@ -195,9 +187,7 @@ export default {
title: navTitle, //此处写页面的title title: navTitle, //此处写页面的title
}); });
this.sn = options.sn; this.sn = options.sn;
let dsku = decodeURIComponent(options.sku); this.sku = storage.getAfterSaleData();;
let newSku = JSON.parse(dsku);
this.sku = newSku;
this.form.orderItemSn = options.sn; this.form.orderItemSn = options.sn;
this.form.skuId = this.sku.skuId; this.form.skuId = this.sku.skuId;
@@ -226,7 +216,7 @@ export default {
this.reasonList = action; this.reasonList = action;
} }
}); });
uni.hideLoading(); if (this.$store.state.isShowToast){ uni.hideLoading() };
}, },
//打开地区选择器 //打开地区选择器
showCitySelect() { showCitySelect() {
@@ -290,7 +280,7 @@ export default {
this.form.applyRefundPrice = this.applyInfo.applyRefundPrice; this.form.applyRefundPrice = this.applyInfo.applyRefundPrice;
applyReturn(this.sn, this.form).then((resp) => { applyReturn(this.sn, this.form).then((resp) => {
uni.hideLoading(); if (this.$store.state.isShowToast){ uni.hideLoading() };
if (resp.data.success) { if (resp.data.success) {
this.$refs.uToast.show({ title: "提交成功", type: "success" }); this.$refs.uToast.show({ title: "提交成功", type: "success" });
uni.redirectTo({ uni.redirectTo({
@@ -312,6 +302,7 @@ export default {
return false; return false;
} }
console.log(this.form.accountType)
if (this.form.accountType == "BANK_TRANSFER") { if (this.form.accountType == "BANK_TRANSFER") {
// 银行开户行校验 // 银行开户行校验
if (this.$u.test.isEmpty(this.form.bankDepositName)) { if (this.$u.test.isEmpty(this.form.bankDepositName)) {
@@ -336,12 +327,6 @@ export default {
type: "error", type: "error",
}); });
return false; return false;
} else if (checkBankno(this.form.bankAccountNumber) === false) {
this.$refs.uToast.show({
title: "银行卡卡号不正确",
type: "error",
});
return false;
} else if (this.$u.test.chinese(this.form.bankAccountName) === false) { } else if (this.$u.test.chinese(this.form.bankAccountName) === false) {
this.$refs.uToast.show({ this.$refs.uToast.show({
title: "银行开户名输入错误", title: "银行开户名输入错误",

View File

@@ -2,13 +2,7 @@
<view class="mp-iphonex-bottom content"> <view class="mp-iphonex-bottom content">
<u-form :model="form" ref="uForm"> <u-form :model="form" ref="uForm">
<view class="after-sales-goods-detail-view"> <view class="after-sales-goods-detail-view">
<view class="header">
<view>
本次售后服务将由
<text class="seller-name">{{ sku.storeName }}</text>
为您提供
</view>
</view>
<view> <view>
<view class="goods-item-view" @click="gotoGoodsDetail(sku.skuId)"> <view class="goods-item-view" @click="gotoGoodsDetail(sku.skuId)">
<view class="goods-img"> <view class="goods-img">
@@ -30,16 +24,16 @@
<view class="opt-view"> <view class="opt-view">
<view class="img-title" style="font-size: 30rpx">填写物流信息</view> <view class="img-title" style="font-size: 30rpx">填写物流信息</view>
<u-form-item label="返回方式" :label-width="150"> <u-form-item label="返回方式" :label-width="150">
<u-input type="text" input-align="right" value="快递至第三方卖家" /> <div style="width: 100%; text-align: right;">快递至第三方卖家</div>
</u-form-item> </u-form-item>
<u-form-item label="快递公司" :label-width="150"> <u-form-item label="快递公司" :label-width="150">
<u-input v-model="form.courierCompany" type="select" input-align="right" :select-open="companySelectShow" @click="companySelectShow = true" placeholder="请选择快递公司" /> <div style="width: 100%; text-align: right;" @click="companySelectShow = true" >{{ form.courierCompany || '请选择快递公司' }}</div>
</u-form-item> </u-form-item>
<u-form-item label="快递单号" :label-width="150"> <u-form-item label="快递单号" :label-width="150">
<u-input input-align="right" v-model="form.logisticsNo" placeholder="请输入快递单号" /> <u-input input-align="right" v-model="form.logisticsNo" placeholder="请输入快递单号" />
</u-form-item> </u-form-item>
<u-form-item label="发货时间" :label-width="150"> <u-form-item label="发货时间" :label-width="150">
<u-input input-align="right" type="selects" disabled v-model="form.mDeliverTime" @click="timeshow = true" placeholder="请选择发货时间" /> <div style="width: 100%; text-align: right;" @click="timeshow = true" >{{ form.mDeliverTime || '请选择发货时间' }}</div>
</u-form-item> </u-form-item>
</view> </view>
</scroll-view> </scroll-view>
@@ -57,6 +51,7 @@
<script> <script>
import { getLogistics } from "@/api/address.js"; import { getLogistics } from "@/api/address.js";
import { fillShipInfo } from "@/api/after-sale.js"; import { fillShipInfo } from "@/api/after-sale.js";
import storage from "@/utils/storage";
export default { export default {
data() { data() {
@@ -76,7 +71,8 @@ export default {
}; };
}, },
onLoad(options) { onLoad(options) {
this.sku = JSON.parse(decodeURIComponent(options.sku));
this.sku = storage.getAfterSaleData();
let navTitle = "服务单详情"; let navTitle = "服务单详情";
uni.setNavigationBarTitle({ uni.setNavigationBarTitle({
title: navTitle, //此处写页面的title title: navTitle, //此处写页面的title
@@ -126,7 +122,7 @@ export default {
}); });
delete this.form.courierCompany; delete this.form.courierCompany;
fillShipInfo(this.serviceDetail.sn, this.form).then((res) => { fillShipInfo(this.serviceDetail.sn, this.form).then((res) => {
uni.hideLoading(); if (this.$store.state.isShowToast){ uni.hideLoading() };
if (res.statusCode === 200) { if (res.statusCode === 200) {
this.$refs.uToast.show({ this.$refs.uToast.show({
title: "提交成功", title: "提交成功",

View File

@@ -1,13 +1,7 @@
<template> <template>
<view> <view>
<view class="after-sales-goods-detail-view"> <view class="after-sales-goods-detail-view">
<view class="header">
<view>
本次售后服务将由
<text class="seller-name">{{ sku.storeName }}</text>
为您提供
</view>
</view>
<view> <view>
<view class="goods-item-view" :key="index" v-for="(item,index) in sku.orderItems" v-if="item.sn == sn" @click="navigateToGoodsDetail(sku.skuId)"> <view class="goods-item-view" :key="index" v-for="(item,index) in sku.orderItems" v-if="item.sn == sn" @click="navigateToGoodsDetail(sku.skuId)">
<view class="goods-img"> <view class="goods-img">
@@ -56,6 +50,7 @@
<script> <script>
import { getAfterSaleInfo } from "@/api/after-sale"; import { getAfterSaleInfo } from "@/api/after-sale";
import storage from "@/utils/storage";
export default { export default {
data() { data() {
return { return {
@@ -66,10 +61,7 @@ export default {
}, },
onLoad(options) { onLoad(options) {
this.sn = options.sn; this.sn = options.sn;
let dData = decodeURIComponent(options.sku); this.sku = storage.getAfterSaleData();
let newData = JSON.parse(dData);
this.sku = newData;
// 查看当前商品是否支持退款退货 // 查看当前商品是否支持退款退货
this.init() this.init()
}, },
@@ -88,9 +80,7 @@ export default {
*/ */
onSelect(value) { onSelect(value) {
uni.redirectTo({ uni.redirectTo({
url: `./afterSalesDetail?sn=${this.sn}&sku=${encodeURIComponent( url: `./afterSalesDetail?sn=${this.sn}&value=${value}`,
JSON.stringify(this.sku)
)}&value=${value}`,
}); });
}, },

View File

@@ -1,13 +1,6 @@
<template> <template>
<view v-if="serviceDetail"> <view v-if="serviceDetail">
<view class="after-sales-goods-detail-view"> <view class="after-sales-goods-detail-view">
<view class="header">
<view>
本次售后服务将由
<text class="seller-name">{{ serviceDetail.storeName }}</text>
为您提供
</view>
</view>
<view class="apply-info-view"> <view class="apply-info-view">
<view class="status-info"> <view class="status-info">
<view class="status-info-box"> <view class="status-info-box">
@@ -90,9 +83,10 @@
serviceDetail.afterSaleImage && serviceDetail.afterSaleImage &&
serviceDetail.afterSaleImage.split(',').length != 0 serviceDetail.afterSaleImage.split(',').length != 0
"> ">
<image :src="img" @click="preview(serviceDetail.afterSaleImage.split(','), index)" <view v-for="(img, index) in serviceDetail.afterSaleImage.split(',')" :key="index">
v-for="(img, index) in serviceDetail.afterSaleImage.split(',')" :key="index" <u-image width="100" height="100" :src="img" @click="preview(serviceDetail.afterSaleImage.split(','), index)"
style="width: 50px; height: 50px; margin: 0px 5px"></image> ></u-image>
</view>
</view> </view>
<!-- 如果服务类型为退款则不显示 --> <!-- 如果服务类型为退款则不显示 -->
<view class="detail-item" <view class="detail-item"
@@ -197,7 +191,7 @@
<script> <script>
import { import {
getServiceDetail, getServiceDetail,
getstoreAfterSaleAddress, getStoreAfterSaleAddress,
getAfterSaleLog, getAfterSaleLog,
getAfterSaleReason, getAfterSaleReason,
} from "@/api/after-sale.js"; } from "@/api/after-sale.js";
@@ -315,7 +309,7 @@ export default {
* 获取地址信息 * 获取地址信息
*/ */
getAddress() { getAddress() {
getstoreAfterSaleAddress(this.sn).then((res) => { getStoreAfterSaleAddress(this.sn).then((res) => {
if (res.data.success) { if (res.data.success) {
this.storeAfterSaleAddress = res.data.result; this.storeAfterSaleAddress = res.data.result;
} }
@@ -351,7 +345,7 @@ export default {
title: "加载中", title: "加载中",
}); });
getServiceDetail(this.sn).then((res) => { getServiceDetail(this.sn).then((res) => {
uni.hideLoading(); if (this.$store.state.isShowToast){ uni.hideLoading() };
this.serviceDetail = res.data.result; this.serviceDetail = res.data.result;
if ( if (
this.serviceDetail.serviceType == "RETURN_GOODS" || this.serviceDetail.serviceType == "RETURN_GOODS" ||

View File

@@ -4,7 +4,6 @@
<view class="seller-view"> <view class="seller-view">
<view class="seller-info u-flex u-row-between"> <view class="seller-info u-flex u-row-between">
<view class="seller-name"> <view class="seller-name">
<view class="name">{{ order.storeName || "" }}</view>
<view class="status">{{ orderStatusList[order.orderStatus] }}</view> <view class="status">{{ orderStatusList[order.orderStatus] }}</view>
</view> </view>
<view class="order-sn"></view> <view class="order-sn"></view>
@@ -45,13 +44,13 @@
<view class="cell-item"> <view class="cell-item">
<view class="cell-title"> 投诉凭证 </view> <view class="cell-title"> 投诉凭证 </view>
<view class="cell-view"> <view class="cell-view">
<u-upload ref="uUpload" :header=" { accessToken: storage.getAccessToken() }" upload-text="" :show-progress="false" :action="action" width="100" @on-uploaded="onUploaded" :max-count="5"> <u-upload ref="uUpload" :header=" { accessToken: storage.getAccessToken() }" :action="action" width="200" @on-uploaded="onUploaded" :max-count="5">
</u-upload> </u-upload>
</view> </view>
</view> </view>
</view> </view>
<view class="submit-btn" @click="handleSumit">提交</view> <view class="submit-btn" @click="handleSubmit">提交</view>
</view> </view>
</template> </template>
@@ -68,6 +67,7 @@ export default {
orderStatusList: { orderStatusList: {
//订单状态列表 //订单状态列表
UNDELIVERED: "待发货", UNDELIVERED: "待发货",
PARTS_DELIVERED: "部分发货",
UNPAID: "未付款", UNPAID: "未付款",
PAID: "已付款", PAID: "已付款",
DELIVERED: "已发货", DELIVERED: "已发货",
@@ -109,7 +109,15 @@ export default {
/** /**
* 提交 * 提交
*/ */
handleSumit() { handleSubmit() {
if(!this.images.length && !this.complainValue){
uni.showToast({
title:'请上传图片凭证和投诉内容',
icon:'none'
})
return
}
// 循环出商品 // 循环出商品
let goods = this.orderGoodsList.filter((item) => { let goods = this.orderGoodsList.filter((item) => {
return item.skuId == this.skuId; return item.skuId == this.skuId;
@@ -170,7 +178,7 @@ export default {
this.order = order.order; this.order = order.order;
this.orderGoodsList = order.orderItems; this.orderGoodsList = order.orderItems;
this.orderDetail = res.data.result; this.orderDetail = res.data.result;
uni.hideLoading(); if (this.$store.state.isShowToast){ uni.hideLoading() };
}); });
}, },

View File

@@ -35,6 +35,13 @@
</view> </view>
</view> </view>
<view class="speak-way" v-else>暂无对话</view> <view class="speak-way" v-else>暂无对话</view>
<view class="tips">回复对话</view>
<view class="cell-item complain-content">
<view class="cell-view content">
<u-input type="textarea" height="70rpx" auto-height v-model="complainValue" />
</view>
</view>
<view class="submit-btn" @click="handleSubmit">回复</view>
<view class="tips">平台仲裁</view> <view class="tips">平台仲裁</view>
<u-cell-group> <u-cell-group>
<u-cell-item :arrow="false" title="仲裁意见" :value="complainDetail.arbitrationResult || '暂无'"></u-cell-item> <u-cell-item :arrow="false" title="仲裁意见" :value="complainDetail.arbitrationResult || '暂无'"></u-cell-item>
@@ -43,22 +50,27 @@
</template> </template>
<script> <script>
import { getComplainDetail } from "@/api/after-sale"; import { getComplainDetail, communication } from "@/api/after-sale";
export default { export default {
data() { data() {
return { return {
complainId: "",
complainValue: "", //回复内容
complainDetail: "", //投诉详情 complainDetail: "", //投诉详情
statusData: { statusData: {
NEW: "新投诉",
NO_APPLY: "未申请", NO_APPLY: "未申请",
APPLYING: "申请中", APPLYING: "申请中",
COMPLETE: "已完成,此时可申请", COMPLETE: "已完成",
EXPIRED: "已失效,不可申请", EXPIRED: "已失效",
CANCEL: "已取消", CANCEL: "已取消",
WAIT_ARBITRATION:"等待仲裁"
}, },
}; };
}, },
onLoad(option) { onLoad(option) {
this.complainId = option.id;
this.init(option.id); this.init(option.id);
}, },
methods: { methods: {
@@ -76,6 +88,38 @@ export default {
}, },
}); });
}, },
handleSubmit() {
if (!this.complainValue) {
uni.showToast({
title: "请输入回复内容",
duration: 2000,
icon: "none",
});
return;
}
let params = {
content: this.complainValue,
complainId: this.complainId,
};
communication(params).then((res) => {
if (res.data.success) {
uni.showToast({
title: "回复成功",
duration: 2000,
icon: "none",
});
this.complainValue = '';
this.init(this.complainId);
} else {
uni.showToast({
title: res.data.message,
duration: 2000,
icon: "none",
});
}
});
},
/** /**
* 初始化投诉详情 * 初始化投诉详情
*/ */
@@ -93,7 +137,7 @@ export default {
icon: "none", icon: "none",
}); });
} }
uni.hideLoading(); if (this.$store.state.isShowToast){ uni.hideLoading() };
}); });
}, },
}, },
@@ -124,4 +168,32 @@ export default {
.tips { .tips {
margin: 40rpx 32rpx; margin: 40rpx 32rpx;
} }
.cell {
width: 100%;
background: #fff;
padding: 26rpx;
}
.complain-content {
margin: 40rpx 32rpx;
display: flex;
align-items: center;
.content {
width: 100%;
}
.title {
width: 140rpx;
}
}
.submit-btn {
width: 70%;
margin: 0 auto;
height: 80rpx;
line-height: 80rpx;
color: #fff;
text-align: center;
background: $light-color;
margin-top: 20px;
border-radius: 200px;
}
</style> </style>

View File

@@ -2,9 +2,6 @@
<view> <view>
<view class="seller-view" v-for="(item, index) in complaionData" :key="index"> <view class="seller-view" v-for="(item, index) in complaionData" :key="index">
<view class="seller-info u-flex u-row-between"> <view class="seller-info u-flex u-row-between">
<view class="seller-name">
<view class="name">{{ item.storeName }}</view>
</view>
<view class="order-sn">{{ statusData[item.complainStatus] }}</view> <view class="order-sn">{{ statusData[item.complainStatus] }}</view>
</view> </view>
<u-line color="#DCDFE6"></u-line> <u-line color="#DCDFE6"></u-line>
@@ -48,12 +45,13 @@ export default {
data() { data() {
return { return {
statusData: { statusData: {
NEW: "新订单", NEW: "新投诉",
NO_APPLY: "未申请", NO_APPLY: "未申请",
APPLYING: "申请中", APPLYING: "申请中",
COMPLETE: "已完成", COMPLETE: "已完成",
EXPIRED: "已失效", EXPIRED: "已失效",
CANCEL: "已取消", CANCEL: "已取消",
WAIT_ARBITRATION:"等待仲裁"
}, },
show: false, show: false,
content: "是否撤销投诉?", content: "是否撤销投诉?",
@@ -139,7 +137,7 @@ export default {
} else { } else {
this.empty = true; this.empty = true;
} }
uni.hideLoading(); if (this.$store.state.isShowToast){ uni.hideLoading() };
}); });
}, },
}, },

View File

@@ -0,0 +1,248 @@
<template>
<div>
<view class="logistics-detail">
<view class="card">
<div v-if="logisticsList && logisticsList.length>0">
<ul class="express-log" v-for="(packageItem, packageIndex) in logisticsList" :key="packageIndex" v-if="packageItem">
<div class="layui-layer-wrap">
<dl>
<dt>物流公司</dt>
<dd><div class="text-box">{{ packageItem.logisticsName }}</div></dd>
</dl>
<dl>
<dt>快递单号</dt>
<dd>
<div nctype="ordersSn" class="text-box">
<a class="item" :href='"https://www.baidu.com/s?wd="+packageItem.logisticsNo' target="_blank">{{ packageItem.logisticsNo }}</a>
</div>
</dd>
</dl>
<div class="div-express-log">
<ul class="express-log express-log-name">
<li v-for="(item, index) in packageItem.orderPackageItemList" :key="index">
<p class="time" style="width: 50%;"><span>商品名称</span><span>{{ item.goodsName }}</span></p>
<p class="time" style="width: 30%;"><span>发货时间</span><span>{{ item.logisticsTime }}</span></p>
<p class="time" style="width: 20%;"><span>发货数量</span><span>{{ item.deliverNumber }}</span></p>
</li>
</ul>
</div>
<div class="div-express-log">
<ul class="express-log" v-if="packageItem.traces && packageItem.traces.traces">
<li v-for="(item, index) in packageItem.traces.traces" :key="index">
<span class="time">{{ item.AcceptTime || item.acceptTime }}</span>
<span class="detail">{{ item.AcceptStation || item.remark }}</span>
</li>
</ul>
<ul class="express-log" v-else>
<li>暂无物流信息</li>
</ul>
</div>
</div>
</ul>
</div>
</view>
</view>
</div>
</template>
<script>
import { getPackage } from "@/api/trade.js";
export default {
data() {
return {
order: {},
logisticsList: [],
}
},
components: {
},
computed: {
},
onLoad(option) {
let sn = option.order_sn;
this.tracesList(sn);
},
mounted() {
},
methods: {
tracesList(sn) {
getPackage(sn).then((res) => {
if(res.data.success){
this.logisticsList = res.data.result;
}
});
},
},
}
</script>
<style >
page {
background: #fff;
}
</style>
<style lang="scss" scoped>
// @import url('./goods.scss');
.goods-item-view {
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: center;
padding: 10rpx 30rpx;
.goods-img {
flex: 1;
}
.goods-info {
padding-left: 30rpx;
flex: 3;
.goods-title {
margin-bottom: 10rpx;
color: $font-color-dark;
}
.goods-specs {
font-size: 24rpx;
margin-bottom: 10rpx;
color: #cccccc;
}
.goods-price {
font-size: 28rpx;
margin-bottom: 10rpx;
color: #ff5a10;
}
}
.goods-num {
>.good-complaint {
margin-top: 10rpx;
}
text-align: center;
flex: 1;
width: 60rpx;
color: $main-color;
}
}
.goods-info {
flex: 2;
}
.card-title {
background: #f2f2f2;
}
.logistics-detail {
margin-top: 20rpx;
padding: 0 16rpx;
}
.card {
background: #fff;
border-radius: 20rpx;
width: 100%;
> .card-title {
font-size: 24rpx;
border-top-left-radius: 20rpx;
border-top-right-radius: 20rpx;
padding: 16rpx;
}
> .time-line {
padding: 16rpx 32rpx;
}
}
.u-order-title {
font-weight: bold;
}
.u-order-desc {
font-size: 26rpx;
color: #666;
margin: 10rpx 0;
}
.u-order-time {
font-size: 24rpx;
color: #999;
}
.empty {
padding: 40rpx 0;
}
.express-log {
/*margin: 5px -10px 5px 5px;*/
padding: 20rpx;
list-style-type: none;
li {
display: flex;
margin-top: 18rpx;
}
li:nth-of-type(1) {
margin-top: 0;
}
.time {
width: 140rpx;
display: flex;
// float: left;
flex-direction: column;
font-size: 24rpx;
line-height: 40rpx;
span:nth-of-type(1) {
margin-bottom: 16rpx;
}
}
.detail {
width: 100%;
flex: 1;
margin-left: 30rpx;
display: inline-block;
font-size: 24rpx;
line-height: 40rpx;
}
li {
line-height: 60rpx;
}
}
.layui-layer-wrap {
dl {
border-top: solid 1px #f5f5f5;
margin-top: -2rpx;
overflow: hidden;
dt {
font-size: 26rpx;
line-height: 40rpx;
display: inline-block;
padding: 16rpx 1% 16rpx 0;
color: #999;
}
dd {
font-size: 26rpx;
line-height: 40rpx;
display: inline-block;
padding: 16rpx 0 16rpx 16rpx;
border-left: solid 2rpx #f5f5f5;
.text-box {
line-height: 40rpx;
color: #333;
word-break: break-all;
}
}
}
}
.div-express-log {
// max-height: 600rpx;
border: solid 2rpx #e7e7e7;
background: #fafafa;
border-radius: 10rpx;
margin-bottom: 6rpx;
// overflow-y: auto;
// overflow-x: auto;
}
</style>

View File

@@ -3,7 +3,7 @@
<view class="exaluate-member-view"> <view class="exaluate-member-view">
<view class="member-view"> <view class="member-view">
<view class="member-img"> <view class="member-img">
<u-image width="82rpx" style="border: 1px solid #ededed" height="82rpx" shape="circle" :src="comment.memberProfile || '/static/missing-face.png'"></u-image> <u-image width="82rpx" style="border: 1px solid #ededed" height="82rpx" shape="circle" :src="comment.memberProfile || userImage"></u-image>
</view> </view>
<view class="member-info"> <view class="member-info">
<view class="memName">{{ comment.memberName }}</view> <view class="memName">{{ comment.memberName }}</view>
@@ -41,9 +41,13 @@
</template> </template>
<script> <script>
import configs from '@/config/config'
export default { export default {
data() { data() {
return { return {
configs,
userImage:configs.defaultUserPhoto,
comment: {}, //评论信息 comment: {}, //评论信息
gradeList: { gradeList: {
//评价grade //评价grade

View File

@@ -11,11 +11,6 @@
<u-empty text="尚无需要评价的商品" mode="list" v-if="orderList.length == 0"></u-empty> <u-empty text="尚无需要评价的商品" mode="list" v-if="orderList.length == 0"></u-empty>
<view class="seller-view" v-for="(order, index) in orderList" :key="index"> <view class="seller-view" v-for="(order, index) in orderList" :key="index">
<!-- 店铺名称 --> <!-- 店铺名称 -->
<view class="box-title">
<view class="title_seller_name">
{{ order.storeName }}
</view>
</view>
<view v-for="(sku, _index) in order.orderItems" :key="_index"> <view v-for="(sku, _index) in order.orderItems" :key="_index">
<view class="goods-item-view"> <view class="goods-item-view">
<view> <view>
@@ -115,7 +110,8 @@ export default {
onShow() { onShow() {
this.orderList = []; this.orderList = [];
this.params.pageNumber = 1; this.params.pageNumber = 1;
this.current == 0 ? this.loadData() : this.loadComments(); this.current = 0
this.loadData()
}, },
watch: { watch: {
/** /**
@@ -202,7 +198,7 @@ export default {
title: "加载中", title: "加载中",
}); });
getOrderList(this.params).then((res) => { getOrderList(this.params).then((res) => {
uni.hideLoading(); if (this.$store.state.isShowToast){ uni.hideLoading() };
const orderList = res.data.result.records; const orderList = res.data.result.records;
if (orderList.length < 10) { if (orderList.length < 10) {
this.params.loadStatus = "noMore"; this.params.loadStatus = "noMore";
@@ -234,7 +230,7 @@ export default {
title: "加载中", title: "加载中",
}); });
getComments(this.params).then((res) => { getComments(this.params).then((res) => {
uni.hideLoading(); if (this.$store.state.isShowToast){ uni.hideLoading() };
let orderList = res.data.result.records; let orderList = res.data.result.records;
if (orderList.length < 10) { if (orderList.length < 10) {
this.params.loadStatus = "noMore"; this.params.loadStatus = "noMore";

View File

@@ -137,7 +137,7 @@ export default {
title: "加载中", title: "加载中",
}); });
commentsMemberOrder(this.form).then((res) => { commentsMemberOrder(this.form).then((res) => {
uni.hideLoading(); if (this.$store.state.isShowToast){ uni.hideLoading() };
if (res.data.success) { if (res.data.success) {
uni.showToast({ uni.showToast({
title: "发布评价成功", title: "发布评价成功",

View File

@@ -1,7 +1,11 @@
<template> <template>
<div class="wrapper"> <div class="wrapper">
<!-- 选择地址 --> <!-- 选择地址 -->
<div class="address-box" @click="clickToAddress()"> <div
class="address-box"
@click="clickToAddress()"
v-if="shippingText == 'LOGISTICS' && orderMessage.cartTypeEnum != 'VIRTUAL'"
>
<div class="user-box flex"> <div class="user-box flex">
<div class="flex-8"> <div class="flex-8">
<div v-if="!address.id">请选择地址</div> <div v-if="!address.id">请选择地址</div>
@@ -10,9 +14,16 @@
<!-- 省市区 --> <!-- 省市区 -->
<div class="flex flex-a-c"> <div class="flex flex-a-c">
<span class="default" v-if="address.isDefault">默认</span> <span class="default" v-if="address.isDefault">默认</span>
<div class="address-list" v-if="address.consigneeAddressPath.length != 0"> <div
<span class="address-item" v-for="(item,index) in address.consigneeAddressPath" :key="index"> class="address-list"
{{item}} v-if="address.consigneeAddressPath.length != 0"
>
<span
class="address-item"
v-for="(item, index) in address.consigneeAddressPath"
:key="index"
>
{{ item }}
</span> </span>
</div> </div>
</div> </div>
@@ -33,28 +44,74 @@
<!-- 背景 --> <!-- 背景 -->
<div class="bar"></div> <div class="bar"></div>
</div> </div>
<!-- 选择自提点 -->
<div class="address-box" v-if="shippingText == 'SELF_PICK_UP'">
<div @click="clickToStoreAddress()">
<div class="user-box flex">
<div class="flex-8">
<div v-if="storeAddress">
<div class="user-address">
<!-- 自提点地址 -->
<div class="user-address-detail wes-2">
{{ storeAddress.address }}
</div>
<!-- 联系手机号 -->
<div></div>
</div>
</div>
<div v-else>请选择自提点</div>
</div>
<u-icon name="arrow-right" style="color: #bababa"></u-icon>
</div>
<!-- 背景 -->
<div class="bar"></div>
</div>
</div>
<!-- 开团信息 --> <!-- 开团信息 -->
<view class="group-box" v-if="isAssemble"> <view class="group-box" v-if="isAssemble">
<view class="group-title"> <view class="group-title">
<span v-if="pintuanFlage">你正在开团购买</span> <span v-if="pintuanFlage">你正在开团购买</span>
<span v-else>为你加入仅差<span>{{routerVal.parentOrder.toBeGroupedNum }}</span>人的团购买</span> <span v-else
>为你加入仅差<span>{{ routerVal.parentOrder.toBeGroupedNum }}</span
>人的团购买</span
>
</view> </view>
<view class="group"> <view class="group">
<view> <view>
<u-image borderRadius="50%" shape="square" class="head-img" width="81rpx" height="81rpx" <u-image
:src="masterWay.face || '/static/missing-face.png'"></u-image> borderRadius="50%"
shape="square"
class="head-img"
width="81rpx"
height="81rpx"
:src="masterWay.face || userImage"
></u-image>
<view class="btn-one">团长</view> <view class="btn-one">团长</view>
</view> </view>
<view class="line"> </view> <view class="line"> </view>
<view> <view>
<!-- 如果有最后一名显示最后一名没有最后一名显示等待参团 --> <!-- 如果有最后一名显示最后一名没有最后一名显示等待参团 -->
<u-image class="head-img" v-if="endWay.face" :src="endWay.face" borderRadius="50%" shape="square" <u-image
width="81rpx" height="81rpx"> class="head-img"
v-if="endWay.face"
:src="endWay.face"
borderRadius="50%"
shape="square"
width="81rpx"
height="81rpx"
>
<view slot="loading"></view> <view slot="loading"></view>
</u-image> </u-image>
<u-image class="head-img" borderRadius="50%" shape="square" v-else width="81rpx" height="81rpx" <u-image
:src="endWay.face || '/static/missing-face.png'"></u-image> class="head-img"
borderRadius="50%"
shape="square"
v-else
width="81rpx"
height="81rpx"
:src="endWay.face || userImage"
></u-image>
<view class="wait">{{ endWay.nickname || "等待参团" }}</view> <view class="wait">{{ endWay.nickname || "等待参团" }}</view>
</view> </view>
@@ -62,83 +119,182 @@
</view> </view>
<!-- 店铺商品信息 --> <!-- 店铺商品信息 -->
<div class="box box2" v-for="(item, index) in orderMessage.cartList" :key="index"> <div
<div @click="navigateToStore(item)"> class="box box2"
<div class="store-name"> v-for="(item, index) in orderMessage.cartList"
<span>{{ item.storeName }}</span> :key="index"
</div> >
</div> <div v-if="item.checked">
<div class="promotionNotice">{{ item.promotionNotice || '' }}</div> <div class="promotionNotice">{{ item.promotionNotice || "" }}</div>
<div class="flex goods-item" v-for="(val, i) in item.skuList" :key="i"> <div
<div class="goods-image" class="flex goods-item"
@click="navigateTo('/pages/product/goods?id=' + val.goodsSku.id+'&goodsId='+val.goodsSku.goodsId)" :span="3"> v-for="(val, i) in item.checkedSkuList"
<u-image borderRadius="10rpx" width="200rpx" height="200rpx" :src="val.goodsSku.thumbnail" alt /> :key="i"
</div> >
<div @click="navigateTo('/pages/product/goods?id=' + val.goodsSku.id+'&goodsId='+val.goodsSku.goodsId)" <div
class="goods-detail"> class="goods-image"
<div class="flex"> @click="
<p class="goods-name">{{ val.goodsSku.goodsName }}</p> navigateTo(
<span class="nums">x{{ val.num }}</span> '/pages/product/goods?id=' +
val.goodsSku.id +
'&goodsId=' +
val.goodsSku.goodsId
)
"
:span="3"
>
<u-image
borderRadius="10rpx"
width="200rpx"
height="200rpx"
:src="val.goodsSku.thumbnail"
alt
/>
</div>
<div
@click="
navigateTo(
'/pages/product/goods?id=' +
val.goodsSku.id +
'&goodsId=' +
val.goodsSku.goodsId
)
"
class="goods-detail"
>
<div class="flex">
<p class="goods-name">{{ val.goodsSku.goodsName }}</p>
<span class="nums">x{{ val.num }}</span>
</div>
<p class="goods-prices">
<span></span>
<span class="goods-price">{{
$options.filters.goodsFormatPrice(val.purchasePrice)[0]
}}</span>
<span
>.{{
$options.filters.goodsFormatPrice(val.purchasePrice)[1]
}}</span
>
</p>
</div> </div>
<p class="goods-prices">
<span></span>
<span class="goods-price">{{formatPrice(val.goodsSku.price)[0]}}</span>
<span>.{{formatPrice(val.goodsSku.price)[1] }}</span>
</p>
</div> </div>
<u-row>
<u-col :offset="0" :span="4">发票信息</u-col>
<u-col
:span="8"
class="tipsColor"
textAlign="right"
@click.native="invoice()"
>
<span v-if="receiptList"
>{{ receiptList.receiptTitle }} -
{{ receiptList.receiptContent }}</span
>
<span v-else>不开发票</span>
</u-col>
</u-row>
<u-row>
<u-col
v-if="orderMessage.cartTypeEnum != 'VIRTUAL'"
:offset="0"
:span="9"
@click="shippingFlag = true"
>配送
</u-col>
<u-col
v-if="orderMessage.cartTypeEnum != 'VIRTUAL'"
:span="3"
textAlign="right"
@click="shippingFlag = true"
>
{{
shippingMethod.find((e) => {
return e.value == shippingText;
}).label
}}
</u-col>
</u-row>
<u-row>
<u-col :offset="0" :span="4" class="tl" style="text-align: left"
>备注信息</u-col
>
<u-col :span="8" textAlign="right">
<u-input
style="text-align: right"
class="uinput"
v-model="remarkVal[index].remark"
/>
</u-col>
</u-row>
</div> </div>
<u-row>
<u-col :offset="0" :span="4">发票信息</u-col>
<u-col :span="8" class="tipsColor" textAlign="right" @click.native="invoice()">
<span v-if="receiptList">{{receiptList.receiptTitle}} - {{receiptList.receiptContent}}</span>
<span v-else>不开发票</span>
</u-col>
</u-row>
<u-row>
<u-col v-if="orderMessage.cartTypeEnum != 'VIRTUAL'" :offset="0" :span="9" @click="shippingFlag = true">配送
</u-col>
<u-col v-if="orderMessage.cartTypeEnum != 'VIRTUAL'" :span="3" textAlign="right" @click="shippingFlag = true">
{{shippingMethod.find(e=>{ return e.value == shippingText; }).label }}
</u-col>
</u-row>
<u-row>
<u-col :offset="0" :span="4" class="tl" style="text-align: left">备注信息</u-col>
<u-col :span="8" textAlign="right">
<u-input style="text-align:right;" class="uinput" v-model="remarkVal[index].remark" />
</u-col>
</u-row>
</div> </div>
<!-- 发票信息 --> <!-- 发票信息 -->
<invoices :res="receiptList" @callbackInvoice="callbackInvoice" v-if="invoiceFlag" /> <invoices
<u-select v-model="shippingFlag" :list="shippingMethod"></u-select> :res="receiptList"
@callbackInvoice="callbackInvoice"
v-if="invoiceFlag"
/>
<u-select
@confirm="confirmDistribution"
v-model="shippingFlag"
v-if="shippingMethod.length != 0"
:list="shippingMethod"
></u-select>
<div class="box box5" v-if="orderMessage.priceDetailDTO"> <div class="box box5" v-if="orderMessage.priceDetailDTO">
<div> <div>
<u-row> <u-row>
<u-col :span="9">商品合计</u-col> <u-col :span="9">商品合计</u-col>
<u-col :span="3" textAlign="right"> <u-col :span="3" textAlign="right">
<span>{{ orderMessage.priceDetailDTO.goodsPrice | unitPrice }}</span> <span
>{{ orderMessage.priceDetailDTO.goodsPrice | unitPrice }}</span
>
</u-col> </u-col>
</u-row> </u-row>
</div> </div>
<div> <div>
<u-row> <u-row v-if="shippingText == 'LOGISTICS'">
<u-col v-if="orderMessage.cartTypeEnum != 'VIRTUAL'" :span="7">运费</u-col> <u-col v-if="orderMessage.cartTypeEnum != 'VIRTUAL'" :span="7"
<u-col v-if="orderMessage.cartTypeEnum != 'VIRTUAL'" :span="5" class="tr tipsColor" textAlign="right"> >运费</u-col
<span v-if="orderMessage.priceDetailDTO.freightPrice == 0">包邮</span> >
<span v-else>{{ <u-col
v-if="orderMessage.cartTypeEnum != 'VIRTUAL'"
:span="5"
class="tr tipsColor"
textAlign="right"
>
<span v-if="orderMessage.priceDetailDTO.freightPrice == 0"
>包邮</span
>
<span v-else
>{{
orderMessage.priceDetailDTO.freightPrice | unitPrice orderMessage.priceDetailDTO.freightPrice | unitPrice
}}</span> }}</span
>
</u-col> </u-col>
</u-row> </u-row>
</div> </div>
<u-row> <u-row
v-if="
orderMessage.priceDetailDTO.goodsPrice != 0 &&
orderMessage.priceDetailDTO.goodsPrice != null
"
>
<u-col :offset="0" :span="9" @click="GET_Discount()">优惠券</u-col> <u-col :offset="0" :span="9" @click="GET_Discount()">优惠券</u-col>
<u-col
<u-col :span="3" v-if="orderMessage.priceDetailDTO && orderMessage.priceDetailDTO.couponPrice" textAlign="right" :span="3"
@click="GET_Discount()"> v-if="
<span class="main-color">-{{orderMessage.priceDetailDTO.couponPrice | unitPrice}}</span> orderMessage.priceDetailDTO &&
orderMessage.priceDetailDTO.couponPrice
"
textAlign="right"
@click="GET_Discount()"
>
<span class="main-color"
>-¥{{ orderMessage.priceDetailDTO.couponPrice | unitPrice }}</span
>
</u-col> </u-col>
<!-- orderMessage.priceDetailDTO.couponPrice | unitPrice --> <!-- orderMessage.priceDetailDTO.couponPrice | unitPrice -->
<u-col :span="3" v-else textAlign="right" @click="GET_Discount()"> <u-col :span="3" v-else textAlign="right" @click="GET_Discount()">
@@ -149,8 +305,15 @@
<div> <div>
<u-row> <u-row>
<u-col :span="9">优惠金额</u-col> <u-col :span="9">优惠金额</u-col>
<u-col :span="3" textAlign="right" v-if=" orderMessage.priceDetailDTO.couponPrice"> <u-col
<span class="main-color"> -{{ orderMessage.priceDetailDTO.couponPrice | unitPrice }}</span></u-col> :span="3"
textAlign="right"
v-if="orderMessage.priceDetailDTO.couponPrice"
>
<span class="main-color">
-¥{{ orderMessage.priceDetailDTO.couponPrice | unitPrice }}</span
>
</u-col>
<u-col :span="3" textAlign="right" v-else>0.00</u-col> <u-col :span="3" textAlign="right" v-else>0.00</u-col>
</u-row> </u-row>
</div> </div>
@@ -158,18 +321,25 @@
<u-row> <u-row>
<u-col :span="6">活动优惠</u-col> <u-col :span="6">活动优惠</u-col>
<u-col :span="6" class="tr tipsColor" textAlign="right"> <u-col :span="6" class="tr tipsColor" textAlign="right">
<span <span v-if="orderMessage.priceDetailDTO.discountPrice"
v-if="orderMessage.priceDetailDTO.discountPrice">-{{orderMessage.priceDetailDTO.discountPrice | unitPrice}}</span> >-¥{{
orderMessage.priceDetailDTO.discountPrice | unitPrice
}}</span
>
<span v-else>0.00</span> <span v-else>0.00</span>
</u-col> </u-col>
</u-row> </u-row>
</div> </div>
</div> </div>
<!-- 配送地区没有提示 --> <!-- 配送地区没有提示 -->
<div class="notSupportFreight" v-if="notSupportFreight.length !=0"> <div class="notSupportFreight" v-if="notSupportFreight.length != 0">
<u-notice-bar style="width:100%" :volume-icon="false" mode="horizontal" :list="notSupportFreightGoodsList"> <u-notice-bar
style="width: 100%"
:volume-icon="false"
mode="horizontal"
:list="notSupportFreightGoodsList"
>
</u-notice-bar> </u-notice-bar>
</div> </div>
@@ -179,11 +349,25 @@
<div class="tabbar-left"> <div class="tabbar-left">
<div v-if="!orderMessage.priceDetailDTO.payPoint" class="number"> <div v-if="!orderMessage.priceDetailDTO.payPoint" class="number">
<span>¥</span> <span>¥</span>
<span class="price">{{ formatPrice(orderMessage.priceDetailDTO.flowPrice)[0] }}</span> <span class="price">{{
<span>.{{formatPrice(orderMessage.priceDetailDTO.flowPrice)[1] }} </span> $options.filters.goodsFormatPrice(
orderMessage.priceDetailDTO.flowPrice
)[0]
}}</span>
<span
>.{{
$options.filters.goodsFormatPrice(
orderMessage.priceDetailDTO.flowPrice
)[1]
}}
</span>
</div> </div>
<span v-else class="number"><span <span v-else class="number"
style="margin-right:10rpx;">{{orderMessage.priceDetailDTO.payPoint | unitPrice }}</span>积分</span> ><span style="margin-right: 10rpx">{{
orderMessage.priceDetailDTO.payPoint | unitPrice
}}</span
>积分</span
>
</div> </div>
<div class="navRiv" @click="createTradeFun()"> <div class="navRiv" @click="createTradeFun()">
<!-- #ifndef MP-WEIXIN --> <!-- #ifndef MP-WEIXIN -->
@@ -192,19 +376,18 @@
<!-- #ifdef MP-WEIXIN --> <!-- #ifdef MP-WEIXIN -->
<div class="tabbar-right">微信支付</div> <div class="tabbar-right">微信支付</div>
<!-- #endif --> <!-- #endif -->
</div> </div>
</div> </div>
</div> </div>
</template> </template>
<script> <script>
import * as API_Trade from "@/api/trade";
import * as API_Address from "@/api/address"; import * as API_Address from "@/api/address";
import * as API_Order from "@/api/order"; import * as API_Order from "@/api/order";
import invoices from "@/pages/order/invoice/setInvoice"; import * as API_Trade from "@/api/trade";
import configs from "@/config/config";
import LiLiWXPay from "@/js_sdk/lili-pay/wx-pay.js"; import LiLiWXPay from "@/js_sdk/lili-pay/wx-pay.js";
import invoices from "@/pages/order/invoice/setInvoice";
import { mapState } from "vuex";
export default { export default {
onLoad: function (val) { onLoad: function (val) {
this.routerVal = val; this.routerVal = val;
@@ -213,20 +396,27 @@ export default {
invoices, invoices,
}, },
watch: {},
data() { data() {
return { return {
configs,
userImage: configs.defaultUserPhoto,
invoiceFlag: false, //开票开关 invoiceFlag: false, //开票开关
shippingText: "LOGISTICS", shippingText: "LOGISTICS",
shippingFlag: false, shippingFlag: false,
shippingMethod: [ shippingMethod: [],
shippingWay: [
{ {
value: "LOGISTICS", value: "LOGISTICS",
label: "物流", label: "物流",
}, },
{
value: "SELF_PICK_UP",
label: "自提",
},
], ],
isAssemble: false, //是否拼团 isAssemble: false, //是否拼团
couponNums: "", //结算页面优惠券数量 // 判断是否填写过备注
remarkFlag: false,
selectAddressId: "", selectAddressId: "",
routerVal: "", routerVal: "",
params: {}, params: {},
@@ -234,6 +424,7 @@ export default {
couponList: "", couponList: "",
// 已选地址 // 已选地址
address: "", address: "",
shopAddress: "",
// 发票信息 // 发票信息
receiptList: "", receiptList: "",
// 店铺信息 // 店铺信息
@@ -241,14 +432,31 @@ export default {
data: "", data: "",
// 存储备注 // 存储备注
remarkVal: [], remarkVal: [],
remarkVal1: "",
detail: "", //返回的所有数据 detail: "", //返回的所有数据
endWay: "", //最后一个参团人 endWay: "", //最后一个参团人
masterWay: "", //团长信息 masterWay: "", //团长信息
pintuanFlage: true, //是开团还是拼团 pintuanFlage: true, //是开团还是拼团
notSupportFreight: [], //不支持运费 notSupportFreight: [], //不支持运费
notSupportFreightGoodsList: ["以下商品超出配送范围:"], notSupportFreightGoodsList: ["以下商品超出配送范围:"],
storeAddress: "",
originOrderData:"", // 原始订单数据
}; };
}, },
watch: {
// 监听备注 并在 vuex 中存储
remarkVal: {
handler(val) {
this.$store.commit("setRemark", val);
},
immediate: true,
deep: true,
},
},
computed: {
...mapState(["remark"]),
},
filters: { filters: {
/** /**
* 发票收据类型 * 发票收据类型
@@ -271,6 +479,7 @@ export default {
* 监听返回 * 监听返回
*/ */
onBackPress(e) { onBackPress(e) {
console.log("onBackPress", e);
if (e.from == "backbutton") { if (e.from == "backbutton") {
let routes = getCurrentPages(); let routes = getCurrentPages();
let curRoute = routes[routes.length - 1].options; let curRoute = routes[routes.length - 1].options;
@@ -279,12 +488,12 @@ export default {
item.route == "pages/tabbar/cart/cartList" || item.route == "pages/tabbar/cart/cartList" ||
item.route.indexOf("pages/product/goods") != -1 item.route.indexOf("pages/product/goods") != -1
) { ) {
uni.redirectTo({ uni.navigateTo({
url: item.route, url: item.route,
}); });
} }
}); });
console.log("curRoute.addId",curRoute.addId)
if (curRoute.addId) { if (curRoute.addId) {
uni.reLaunch({ uni.reLaunch({
url: "/pages/tabbar/cart/cartList", url: "/pages/tabbar/cart/cartList",
@@ -296,12 +505,19 @@ export default {
} }
}, },
onShow() { async onShow() {
// 判断是否存在写过备注信息的商品
if (this.remark && this.remark.length > 0) {
this.remarkFlag = true;
}
uni.showLoading({ uni.showLoading({
mask: true, mask: true,
}); });
this.getOrderList(); await this.getOrderList();
uni.hideLoading(); await this.getDistribution();
if (this.$store.state.isShowToast) {
uni.hideLoading();
}
if (this.routerVal.way == "PINTUAN") { if (this.routerVal.way == "PINTUAN") {
this.isAssemble = true; this.isAssemble = true;
this.routerVal.parentOrder = JSON.parse( this.routerVal.parentOrder = JSON.parse(
@@ -313,13 +529,6 @@ export default {
mounted() {}, mounted() {},
methods: { methods: {
// 格式化金钱 1999 --> [1999,00]
formatPrice(val) {
if (typeof val == "undefined") {
return val;
}
return val.toFixed(2).split(".");
},
//发票回调 选择发票之后刷新购物车 //发票回调 选择发票之后刷新购物车
async callbackInvoice(val) { async callbackInvoice(val) {
this.invoiceFlag = false; this.invoiceFlag = false;
@@ -353,6 +562,11 @@ export default {
)}` )}`
); );
}, },
clickToStoreAddress() {
this.navigateTo(
`/pages/mine/address/storeAddress?from=cart&way=${this.routerVal.way}&storeId=${this.remarkVal[0].storeId}`
);
},
// 判断团长以及团员信息 // 判断团长以及团员信息
pintuanWay() { pintuanWay() {
@@ -378,6 +592,20 @@ export default {
// 循环店铺id,商品id获取优惠券 // 循环店铺id,商品id获取优惠券
let store = []; let store = [];
let skus = []; let skus = [];
let selectedCoupon = [];
if (this.orderMessage.platformCoupon)
selectedCoupon.push(this.orderMessage.platformCoupon.memberCoupon.id);
if (
this.orderMessage.storeCoupons &&
Object.keys(this.orderMessage.storeCoupons)[0]
) {
let storeMemberCouponsId = Object.keys(
this.orderMessage.storeCoupons
)[0];
let storeCouponId =
this.orderMessage.storeCoupons[storeMemberCouponsId].memberCoupon.id;
selectedCoupon.push(storeCouponId);
}
this.orderMessage.cartList.forEach((item) => { this.orderMessage.cartList.forEach((item) => {
item.skuList.forEach((sku) => { item.skuList.forEach((sku) => {
store.push(sku.storeId); store.push(sku.storeId);
@@ -391,7 +619,7 @@ export default {
data: this.orderMessage.priceDetailDTO.goodsPrice, data: this.orderMessage.priceDetailDTO.goodsPrice,
}); });
this.navigateTo( this.navigateTo(
`/pages/cart/coupon/index?way=${this.routerVal.way}&storeId=${store}&skuId=${skus}` `/pages/cart/coupon/index?way=${this.routerVal.way}&storeId=${store}&skuId=${skus}&selectedCoupon=${selectedCoupon}`
); );
}, },
@@ -412,14 +640,26 @@ export default {
createTradeFun() { createTradeFun() {
// 防抖 // 防抖
this.$u.throttle(() => { this.$u.throttle(() => {
if (!this.address.id) { if (this.shippingText === "SELF_PICK_UP") {
uni.showToast({ if (!this.storeAddress.id) {
title: "请选择地址", uni.showToast({
duration: 2000, title: "请选择提货点",
icon: "none", duration: 2000,
}); icon: "none",
return false; });
return false;
}
} else if (this.shippingText === "LOGISTICS" && this.orderMessage.cartTypeEnum !== 'VIRTUAL') {
if (!this.address.id) {
uni.showToast({
title: "请选择地址",
duration: 2000,
icon: "none",
});
return false;
}
} }
// 创建订单 // 创建订单
let client; let client;
// #ifdef H5 // #ifdef H5
@@ -455,7 +695,7 @@ export default {
}); });
// 如果当前价格为0跳转到订单列表 // 如果当前价格为0跳转到订单列表
if (this.orderMessage.priceDetailDTO.billPrice == 0) { if (this.orderMessage.priceDetailDTO.billPrice == 0) {
uni.redirectTo({ uni.navigateTo({
url: "/pages/order/myOrder?status=0", url: "/pages/order/myOrder?status=0",
}); });
} else { } else {
@@ -504,18 +744,85 @@ export default {
} }
}); });
}, },
// 获取配送列表
async getDistribution() {
let shopRes = await API_Trade.shippingMethodList({
way: this.routerVal.way,
});
let shopList;
if (shopRes.data.success) {
shopList = shopRes.data.result;
let way = [];
console.log(shopList);
this.shippingWay.forEach((item) => {
shopList.forEach((child) => {
if (item.value == child) {
way.push(item);
}
});
});
this.shippingMethod = way;
}
},
// 选择配送
async confirmDistribution(val) {
let res = await API_Trade.setShipMethod({
shippingMethod: val[0].value,
way: this.routerVal.way,
});
this.shippingText = val[0].value;
if (res.data.success) {
this.getOrderList();
}
},
// 获取结算参数 // 获取结算参数
getOrderList() { async getOrderList() {
this.notSupportFreight = [] this.notSupportFreight = [];
// 获取结算参数 // 获取结算参数
API_Trade.getCheckoutParams(this.routerVal.way).then((res) => { API_Trade.getCheckoutParams(this.routerVal.way).then((res) => {
// 获取结算参数 进行首次判断
this.originOrderData = this.orderMessage ? JSON.parse(JSON.stringify(this.orderMessage)) : ""
if (
!res.data.result.checkedSkuList ||
res.data.result.checkedSkuList.length === 0
) {
if(!this.originOrderData.checkedSkuList.length){
uni.switchTab({
url: "/pages/tabbar/cart/cartList",
});
}
}
if (res.data.result.skuList.length <= 0) {
if(!this.originOrderData.skuList.length){
uni.navigateTo({
url: "/pages/order/myOrder?status=0",
});
}
}
let repeatData;
res.data.result.cartList.forEach((item, index) => { res.data.result.cartList.forEach((item, index) => {
this.remarkVal[index] = { // 如果已经写过备注信息的话赋值
remark: item.remark, repeatData = {
remark: this.remarkFlag
? this.remark[index].storeId == item.storeId
? this.remark[index].remark
: item.remark
: item.remark,
storeId: item.storeId, storeId: item.storeId,
}; };
this.$set(this.remarkVal, index, repeatData);
}); });
this.orderMessage = res.data.result; this.orderMessage = res.data.result;
/** /**
* 为了避免路径传值在h5中超出限制问题 * 为了避免路径传值在h5中超出限制问题
@@ -524,7 +831,7 @@ export default {
this.$store.state.canUseCoupons = res.data.result.canUseCoupons; this.$store.state.canUseCoupons = res.data.result.canUseCoupons;
this.$store.state.cantUseCoupons = res.data.result.cantUseCoupons; this.$store.state.cantUseCoupons = res.data.result.cantUseCoupons;
if (!res.data.result.memberAddress.id) { if (!res.data.result.memberAddress) {
// 获取会员默认地址 // 获取会员默认地址
this.getUserAddress(); this.getUserAddress();
} else { } else {
@@ -532,7 +839,10 @@ export default {
res.data.result.memberAddress.consigneeAddressPath = res.data.result.memberAddress.consigneeAddressPath =
res.data.result.memberAddress.consigneeAddressPath.split(","); res.data.result.memberAddress.consigneeAddressPath.split(",");
} }
if (res.data.result.storeAddress) {
this.storeAddress = res.data.result.storeAddress;
console.log("storeAddress", this.storeAddress);
}
if ( if (
res.data.result.notSupportFreight && res.data.result.notSupportFreight &&
res.data.result.notSupportFreight.length != 0 res.data.result.notSupportFreight.length != 0
@@ -552,7 +862,7 @@ export default {
</script> </script>
<style scoped> <style scoped>
page { page {
background: #ededed !important; background: #f7f7f7;
} }
</style> </style>
<style scoped lang="scss"> <style scoped lang="scss">
@@ -561,24 +871,29 @@ page {
} }
.main-color { .main-color {
color: $main-color;
font-weight: bold; font-weight: bold;
} }
.uinput { .uinput {
/deep/ input { /deep/ input {
text-align: right; text-align: right;
} }
} }
.promotionNotice { .promotionNotice {
font-size: 24rpx; font-size: 24rpx;
margin: 20rpx 0; margin: 20rpx 0;
color: $aider-light-color; color: $aider-light-color;
} }
.nums { .nums {
flex: 2; flex: 2;
color: $light-color; color: $light-color;
text-align: center; text-align: center;
} }
.wait { .wait {
font-size: 22rpx; font-size: 22rpx;
font-family: PingFang SC, PingFang SC-Regular; font-family: PingFang SC, PingFang SC-Regular;
@@ -594,6 +909,7 @@ page {
width: 143rpx; width: 143rpx;
border-bottom: 2px dotted #999; border-bottom: 2px dotted #999;
} }
.tabbar-left { .tabbar-left {
margin-left: 32rpx; margin-left: 32rpx;
} }
@@ -646,6 +962,7 @@ page {
align-items: center; align-items: center;
justify-content: center; justify-content: center;
} }
.tr { .tr {
text-align: right; text-align: right;
} }
@@ -668,6 +985,7 @@ page {
.box2 { .box2 {
margin-top: 20rpx; margin-top: 20rpx;
} }
.notSupportFreight { .notSupportFreight {
position: fixed; position: fixed;
@@ -687,6 +1005,7 @@ page {
margin: 0 32rpx; margin: 0 32rpx;
} }
} }
/deep/ .u-notice-bar-wrap { /deep/ .u-notice-bar-wrap {
width: 100% !important; width: 100% !important;
} }
@@ -764,6 +1083,7 @@ page {
color: $main-color; color: $main-color;
font-size: 26rpx; font-size: 26rpx;
font-weight: bold; font-weight: bold;
> span { > span {
font-size: 36rpx; font-size: 36rpx;
} }
@@ -774,6 +1094,7 @@ page {
color: $main-color; color: $main-color;
font-size: 28rpx; font-size: 28rpx;
font-weight: bold; font-weight: bold;
> .goods-price { > .goods-price {
font-size: 38rpx; font-size: 38rpx;
padding: 0 2rpx; padding: 0 2rpx;
@@ -815,14 +1136,16 @@ page {
text-align: left; text-align: left;
overflow: hidden; overflow: hidden;
} }
.default { .default {
background: $main-color; background: $main-color;
font-size: 24rpx; font-size: 24rpx;
border-radius: 8rpx; border-radius: 8rpx;
padding: 0rpx 12rpx; padding: 0rpx 12rpx;
color: #fff; color: #fff;
margin-right: 20rpx; margin-right: 20rpx;
} }
.address-box { .address-box {
border-radius: 40rpx; border-radius: 40rpx;
border-top-left-radius: 0 !important; border-top-left-radius: 0 !important;
@@ -837,9 +1160,11 @@ page {
font-weight: normal; font-weight: normal;
letter-spacing: 1rpx; letter-spacing: 1rpx;
} }
.user-box { .user-box {
padding: 32rpx; padding: 32rpx;
} }
.user-address-detail { .user-address-detail {
color: #333; color: #333;
font-size: 38rpx; font-size: 38rpx;
@@ -847,13 +1172,16 @@ page {
margin: 20rpx 0; margin: 20rpx 0;
letter-spacing: 1rpx; letter-spacing: 1rpx;
} }
.mobile { .mobile {
margin-left: 20rpx; margin-left: 20rpx;
} }
.price { .price {
font-size: 50rpx !important; font-size: 50rpx !important;
margin: 0 2rpx; margin: 0 2rpx;
} }
.goods-detail { .goods-detail {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
@@ -861,12 +1189,14 @@ page {
justify-content: center; justify-content: center;
flex: 8; flex: 8;
margin-left: 20rpx !important; margin-left: 20rpx !important;
> p { > p {
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
white-space: nowrap; white-space: nowrap;
} }
} }
.goods-item { .goods-item {
margin: 20rpx 0; margin: 20rpx 0;
} }

View File

@@ -1,33 +1,77 @@
<template> <template>
<view class="content"> <view class="content">
<view class="navbar"> <view class="navbar">
<view v-for="(item, index) in navList" :key="index" class="nav-item" :class="{ current: tabCurrentIndex === index }" @click="tabClick(index)">{{ item.text }}</view> <view
v-for="(item, index) in navList"
:key="index"
class="nav-item"
:class="{ current: tabCurrentIndex === index }"
@click="tabClick(index)"
>{{ item.text }}</view
>
</view> </view>
<swiper :current="tabCurrentIndex" class="swiper-box" duration="300" @change="changeTab"> <swiper
<swiper-item class="tab-content" v-for="(tabItem, tabIndex) in navList" :key="tabIndex"> :current="tabCurrentIndex"
<scroll-view class="list-scroll-content" scroll-y @scrolltolower="loadData(tabIndex)"> class="swiper-box"
duration="300"
@change="changeTab"
>
<swiper-item
class="tab-content"
v-for="(tabItem, tabIndex) in navList"
:key="tabIndex"
>
<scroll-view
class="list-scroll-content"
scroll-y
@scrolltolower="loadData(tabIndex)"
>
<!-- 空白页 --> <!-- 空白页 -->
<u-empty text="暂无订单" mode="list" v-if="tabItem.loaded === true && tabItem.orderList.length === 0"></u-empty> <u-empty
text="暂无订单"
mode="list"
v-if="tabItem.loaded === true && tabItem.orderList.length === 0"
></u-empty>
<!-- 订单列表 --> <!-- 订单列表 -->
<view class="seller-view" :key="oderIndex" v-for="(order, oderIndex) in tabItem.orderList"> <view
class="seller-view"
:key="oderIndex"
v-for="(order, oderIndex) in tabItem.orderList"
>
<!-- 店铺名称 --> <!-- 店铺名称 -->
<view class="seller-info u-flex u-row-between"> <view class="seller-info u-flex u-row-left ">
<view class="seller-name" @click="navigateToStore(order)">
<view class="name">{{ order.storeName }}</view>
</view>
<view class="order-sn">{{ <view class="order-sn">{{
order.orderStatus | orderStatusList order.orderStatus | orderStatusList
}}</view> }}</view>
</view> </view>
<view> <view>
<view> <view>
<view class="goods-item-view" @click="navigateToOrderDetail(order.sn)"> <view
<view class="goods-img" v-for="(goods, goodsIndex) in order.orderItems" :key="goodsIndex"> class="goods-item-view"
<u-image border-radius="6" width="100%" height="100%" :src="goods.image"></u-image> @click="navigateToOrderDetail(order.sn)"
>
<view
class="goods-img"
v-for="(goods, goodsIndex) in order.orderItems"
:key="goodsIndex"
>
<u-image
border-radius="6"
width="100%"
height="100%"
:src="goods.image"
></u-image>
</view> </view>
<view class="goods-info"> <view class="goods-info">
<view v-if="order.orderItems.length <= 1" class="goods-title u-line-2">{{ order.groupName }}</view> <view
<view v-if="order.orderItems.length <= 1" class="goods-price"> v-if="order.orderItems.length <= 1"
class="goods-title u-line-2"
>{{ order.groupName }}</view
>
<view
v-if="order.orderItems.length <= 1"
class="goods-price"
>
{{ order.flowPrice | unitPrice }} {{ order.flowPrice | unitPrice }}
</view> </view>
</view> </view>
@@ -43,23 +87,59 @@
<div v-else>应付金额:</div> <div v-else>应付金额:</div>
<div class="price">{{ order.flowPrice | unitPrice }}</div> <div class="price">{{ order.flowPrice | unitPrice }}</div>
</view> </view>
<view> <view class="goods-btn flex flex-a-c">
<!-- 全部 --> <!-- 全部 -->
<u-button ripple class="pay-btn" shape="circle" size="mini" v-if="order.allowOperationVO.pay" @click="waitPay(order)">立即付款</u-button> <view
ripple
class="pay-btn"
shape="circle"
size="mini"
v-if="order.allowOperationVO.pay"
@click="waitPay(order)"
>立即付款</view
>
<!-- 取消订单 --> <!-- 取消订单 -->
<u-button ripple class="cancel-btn" shape="circle" size="mini" v-if="order.allowOperationVO.cancel" @click="onCancel(order.sn)"> <view
ripple
class="cancel-btn"
shape="circle"
size="mini"
v-if="order.allowOperationVO.cancel"
@click="onCancel(order.sn)"
>
取消订单 取消订单
</u-button> </view>
<!-- 等待收货 --> <!-- 等待收货 -->
<u-button ripple shape="circle" class="rebuy-btn" size="mini" v-if="order.allowOperationVO.showLogistics" @click="navigateToLogistics(order)"> <view
ripple
shape="circle"
class="rebuy-btn"
size="mini"
v-if="order.allowOperationVO.showLogistics"
@click="navigateToLogistics(order)"
>
查看物流 查看物流
</u-button> </view>
<u-button ripple :customStyle="{'background':lightColor,'color':'#fff' }" shape="circle" class="pay-btn" size="mini" v-if="order.allowOperationVO.rog" @click="onRog(order.sn)"> <view
ripple
shape="circle"
class="pay-btn"
size="mini"
v-if="order.allowOperationVO.rog"
@click="onRog(order.sn)"
>
确认收货 确认收货
</u-button> </view>
<u-button ripple shape="circle" class="cancel-btn" size="mini" v-if="order.groupAfterSaleStatus.includes('NOT_APPLIED')" @click="applyService(order)"> <view
ripple
shape="circle"
class="cancel-btn"
size="mini"
v-if="order.groupAfterSaleStatus && ( order.groupAfterSaleStatus.includes('NOT_APPLIED') || order.groupAfterSaleStatus.includes('PART_AFTER_SALE'))"
@click="applyService(order)"
>
退款/售后 退款/售后
</u-button> </view>
<!-- TODO 后续完善 --> <!-- TODO 后续完善 -->
<!-- <u-button ripple shape="circle" class="rebuy-btn" size="mini" v-if=" <!-- <u-button ripple shape="circle" class="rebuy-btn" size="mini" v-if="
order.orderStatus === 'CANCELLED' || order.orderStatus === 'CANCELLED' ||
@@ -75,26 +155,57 @@
</scroll-view> </scroll-view>
</swiper-item> </swiper-item>
</swiper> </swiper>
<u-popup class="cancel-popup" v-model="cancelShow" mode="bottom" length="60%"> <u-popup
class="cancel-popup"
v-model="cancelShow"
mode="bottom"
length="60%"
>
<view class="header">取消订单</view> <view class="header">取消订单</view>
<view class="body"> <view class="body">
<view class="title">取消订单后,本单享有的优惠可能会一并取消,是否继续?</view> <view class="title"
>取消订单后,本单享有的优惠可能会一并取消,是否继续?</view
>
<view> <view>
<u-radio-group v-model="reason"> <u-radio-group v-model="reason">
<view class="value"> <view class="value">
<view class="radio-view" :key="index" v-for="(item, index) in cancelList"> <view
<u-radio :active-color="lightColor" label-size="25" shape="circle" :name="item.reason" @change="reasonChange">{{ item.reason }}</u-radio> class="radio-view"
:key="index"
v-for="(item, index) in cancelList"
>
<u-radio
:active-color="lightColor"
label-size="25"
shape="circle"
:name="item.reason"
@change="reasonChange"
>{{ item.reason }}</u-radio
>
</view> </view>
</view> </view>
</u-radio-group> </u-radio-group>
</view> </view>
</view> </view>
<view class="footer"> <view class="footer">
<u-button size="medium" ripple v-if="reason" shape="circle" @click="submitCancel">提交</u-button> <u-button
size="medium"
ripple
v-if="reason"
shape="circle"
@click="submitCancel"
>提交</u-button
>
</view> </view>
</u-popup> </u-popup>
<u-toast ref="uToast" /> <u-toast ref="uToast" />
<u-modal :confirm-color="lightColor" v-model="rogShow" :show-cancel-button="true" :content="'是否确认收货?'" @confirm="confirmRog"></u-modal> <u-modal
:confirm-color="lightColor"
v-model="rogShow"
:show-cancel-button="true"
:content="'是否确认收货?'"
@confirm="confirmRog"
></u-modal>
</view> </view>
</template> </template>
@@ -182,6 +293,9 @@ export default {
{ {
orderStatus: "CANCELLED", //已取消 orderStatus: "CANCELLED", //已取消
}, },
{
orderStatus: "STAY_PICKED_UP", //待自提
},
], ],
cancelShow: false, //是否显示取消 cancelShow: false, //是否显示取消
orderSn: "", //ordersn orderSn: "", //ordersn
@@ -196,17 +310,28 @@ export default {
*/ */
onBackPress(e) { onBackPress(e) {
if (e.from == "backbutton") { if (e.from == "backbutton") {
uni.reLaunch({ uni.switchTab({
url: "/pages/tabbar/user/my", url: "/pages/tabbar/user/my",
}); });
return true; //阻止默认返回行为 return true; //阻止默认返回行为
} }
}, },
onPullDownRefresh() { onPullDownRefresh() {
this.loadData(this.status); if (this.tabCurrentIndex) {
this.initData(this.tabCurrentIndex);
} else {
this.initData(0);
}
// this.loadData(this.status);
},
onShow() {
if(this.$options.filters.tipsToLogin()){
if (!this.tabCurrentIndex) {
this.initData(0);
}
}
// this.loadData(this.status);
}, },
onLoad(options) { onLoad(options) {
/** /**
@@ -215,11 +340,11 @@ export default {
*/ */
let status = Number(options.status); let status = Number(options.status);
this.status = status; this.status = status;
this.tabCurrentIndex = status; this.tabCurrentIndex = status;
if (status == 0) { // if (status == 0) {
this.loadData(status); // this.loadData(status);
} // }
}, },
watch: { watch: {
@@ -236,16 +361,11 @@ export default {
}, },
}, },
methods: { methods: {
// 售后 // 售后
applyService(order){ applyService(order) {
uni.navigateTo({ uni.navigateTo({
url: `/pages/order/afterSales/afterSales?orderSn=${order.sn}` url: `/pages/order/afterSales/afterSales?orderSn=${order.sn}`,
}); });
}, },
// 店铺详情 // 店铺详情
@@ -268,7 +388,7 @@ export default {
if (res.data.result.length >= 1) { if (res.data.result.length >= 1) {
this.cancelList = res.data.result; this.cancelList = res.data.result;
} }
uni.hideLoading(); if (this.$store.state.isShowToast){ uni.hideLoading() };
}); });
}, },
@@ -314,6 +434,7 @@ export default {
*/ */
loadData(index) { loadData(index) {
this.params.pageNumber = this.navList[index].pageNumber; this.params.pageNumber = this.navList[index].pageNumber;
// this.params.tag = this.orderStatus[index].orderStatus;
getOrderList(this.params).then((res) => { getOrderList(this.params).then((res) => {
uni.stopPullDownRefresh(); uni.stopPullDownRefresh();
if (!res.data.success) { if (!res.data.success) {
@@ -348,7 +469,7 @@ export default {
}); });
setTimeout(() => { setTimeout(() => {
this.navList[this.tabCurrentIndex].orderList.splice(index, 1); this.navList[this.tabCurrentIndex].orderList.splice(index, 1);
uni.hideLoading(); if (this.$store.state.isShowToast){ uni.hideLoading() };
}, 600); }, 600);
}, },
//取消订单 //取消订单
@@ -368,7 +489,7 @@ export default {
let list = this.navList[1].orderList; let list = this.navList[1].orderList;
let index = list.findIndex((val) => val.id === item.id); let index = list.findIndex((val) => val.id === item.id);
index !== -1 && list.splice(index, 1); index !== -1 && list.splice(index, 1);
uni.hideLoading(); if (this.$store.state.isShowToast){ uni.hideLoading() };
}, 600); }, 600);
}, },
@@ -417,13 +538,13 @@ export default {
*/ */
submitCancel() { submitCancel() {
cancelOrder(this.orderSn, { reason: this.reason }).then((res) => { cancelOrder(this.orderSn, { reason: this.reason }).then((res) => {
if (res.statusCode == 200) { if (res.data.success) {
uni.showToast({ uni.showToast({
title: "订单已取消", title: "订单已取消",
duration: 2000, duration: 2000,
icon: "none", icon: "none",
}); });
this.initData(0); this.initData(this.tabCurrentIndex);
this.cancelShow = false; this.cancelShow = false;
} else { } else {
@@ -564,6 +685,7 @@ page,
padding: 0 20rpx; padding: 0 20rpx;
.seller-name { .seller-name {
flex:10;
font-size: 28rpx; font-size: 28rpx;
font-weight: 600; font-weight: 600;
display: flex; display: flex;
@@ -576,6 +698,9 @@ page,
} }
.order-sn { .order-sn {
width:120rpx;
text-align: center;
color: $aider-light-color; color: $aider-light-color;
font-size: 26rpx; font-size: 26rpx;
} }
@@ -633,6 +758,7 @@ page,
flex: 1; flex: 1;
.price { .price {
color: $main-color; color: $main-color;
} }
} }
} }
@@ -667,28 +793,33 @@ page,
text-align: center; text-align: center;
} }
} }
.goods-btn{
.cancel-btn { display: flex;
color: #999999 !important; }
border-color: #999999 !important; .cancel-btn,.pay-btn,.rebuy-btn{
text-align: center;
margin-left: 15rpx; margin-left: 15rpx;
height: 60rpx; font-size: 24rpx;
padding: 14rpx 20rpx;
border-radius: 100px;
}
.cancel-btn {
color: #333639 !important;
background: rgba(46, 51, 56, .05) !important;
} }
.pay-btn { .pay-btn {
// #ifndef MP-WEIXIN
background-color: $light-color !important; background-color: $light-color !important;
// #endif
color: #ffffff !important; color: #ffffff !important;
margin-left: 15rpx;
height: 60rpx;
} }
.rebuy-btn { .rebuy-btn {
color: $light-color !important; color: $light-color !important;
border-color: $light-color !important; border-color: $light-color !important;
background-color: #ffffff !important; background-color: #ffffff !important;
margin-left: 15rpx;
height: 60rpx;
} }
</style> </style>

View File

@@ -9,28 +9,36 @@
</div> </div>
<!-- 物流信息 --> <!-- 物流信息 -->
<view class="info-view logi-view"> <view class="info-view logistics-view">
<view class="logi-List" v-if="logiList && logiList.traces.length != 0"> <view class="logistics-List" v-if="logisticsList && logisticsList.traces && logisticsList.traces.length != 0 ">
<view class="logi-List-title"> <view class="logistics-List-title">
{{logiList.traces[logiList.traces.length-1].AcceptStation}} {{ logisticsList.traces[logisticsList.traces.length - 1].AcceptStation }}
</view> </view>
<view class="logi-List-time"> <view class="logistics-List-time">
{{logiList.traces[logiList.traces.length-1].AcceptTime}} {{ logisticsList.traces[logisticsList.traces.length - 1].AcceptTime }}
</view> </view>
</view> </view>
<view class="logi-List" v-else> <view class="logistics-List" v-else>
<view class="verificationCode" v-if="order.verificationCode "> <view class="verificationCode" v-if="order.verificationCode">
券码 {{order.verificationCode}} 券码 {{ order.orderStatus == 'CANCELLED' ? '已失效' : order.verificationCode }}
</view> </view>
<view v-else class="logi-List-title"> <view @click="handleClickDeliver()" class="info-view logi-view" v-else-if="orderPackage && orderPackage.length">
{{'暂无物流信息'}} <view class="verificationCode">
当前订单有 {{ orderPackage.length }} 个包裹快递
</view>
<div>
点击此处查看
</div>
</view>
<view v-else class="logistics-List-title">
{{ '暂无物流信息' }}
</view> </view>
</view> </view>
</view> </view>
<!-- 地址 --> <!-- 地址 -->
<view class="info-view"> <view class="info-view" v-if="order.deliveryMethod === 'LOGISTICS' && order.orderType !== 'VIRTUAL'">
<view class="address-view"> <view class="address-view">
<view> <view>
<view class="address-title"> <view class="address-title">
@@ -42,17 +50,28 @@
</view> </view>
</view> </view>
</view> </view>
<!-- 提货地址 -->
<view class="info-view" v-if="order.deliveryMethod === 'SELF_PICK_UP'">
<view class="address-view">
<view>
<view class="order-info-view">
<view class="title">自提点地址:</view>
<view class="value address-line-height">{{ order.storeAddressPath }}</view>
</view>
<view class="order-info-view" @click="callPhone" >
<view class="title">联系方式:</view>
<view class="value">{{ order.storeAddressMobile }}<u-icon name='phone-fill' ></u-icon></view>
</view>
</view>
</view>
</view>
<!-- 商品信息 --> <!-- 商品信息 -->
<view> <view>
<view class="seller-view"> <view class="seller-view">
<!-- 店铺名称 --> <!-- 店铺名称 -->
<view class="seller-info u-flex u-row-between">
<view class="seller-name" @click="tostore(order)">
<view class="name">{{ order.storeName }}</view>
<view class="status" v-if="orderStatusList[order.orderStatus]"> {{ orderStatusList[order.orderStatus].title }}</view>
</view>
<view class="order-sn"></view>
</view>
<view> <view>
<view v-for="(sku, skuIndex) in orderGoodsList" :key="skuIndex"> <view v-for="(sku, skuIndex) in orderGoodsList" :key="skuIndex">
<view class="goods-item-view"> <view class="goods-item-view">
@@ -64,13 +83,17 @@
<view class="goods-price"> <view class="goods-price">
{{ sku.goodsPrice | unitPrice }} {{ sku.goodsPrice | unitPrice }}
<!-- <span v-if="sku.point">+{{ sku.point }}积分</span> --> <!-- <span v-if="sku.point">+{{ sku.point }}积分</span> -->
<span style="font-size: 24rpx;margin-left: 14rpx;color: #ff9900;" v-if="sku.isRefund && sku.isRefund !== 'NO_REFUND'">
{{refundPriceList(sku.isRefund)}} ({{ sku.refundPrice | unitPrice("") }})
</span>
</view> </view>
</view> </view>
<view class="goods-num"> <view class="goods-num">
<view>x{{ sku.num }}</view> <view>x{{ sku.num }}</view>
<view class="good-complaint"> <view class="good-complaint">
<u-tag size="mini" mode="plain" @click="complaint(sku)" v-if="sku.complainStatus == 'NO_APPLY'" text="投诉" type="info" /> <u-tag size="mini" mode="plain" @click="complaint(sku)" v-if="sku.complainStatus == 'NO_APPLY'"
text="投诉" type="info" />
</view> </view>
</view> </view>
</view> </view>
@@ -85,17 +108,17 @@
<view class="title">商品总价</view> <view class="title">商品总价</view>
<view class="value">{{ order.goodsPrice | unitPrice }}</view> <view class="value">{{ order.goodsPrice | unitPrice }}</view>
</view> </view>
<view class="order-info-view"> <view class="order-info-view" v-if="order.freightPrice">
<view class="title">运费</view> <view class="title">运费</view>
<view class="value">{{ order.freightPrice | unitPrice }}</view> <view class="value">{{ order.freightPrice | unitPrice }}</view>
</view> </view>
<view class="order-info-view"> <view class="order-info-view" v-if="order.priceDetailDTO">
<view class="title">优惠券</view> <view class="title">优惠券</view>
<view class="value">{{ order.couponPrice | unitPrice }}</view> <view class="value main-color">-{{ order.priceDetailDTO.couponPrice | unitPrice }}</view>
</view> </view>
<view class="order-info-view"> <view class="order-info-view">
<view class="title">活动优惠</view> <view class="title">活动优惠</view>
<view class="value">{{ order.discountPrice | unitPrice }}</view> <view class="value main-color">-{{ order.discountPrice | unitPrice }}</view>
</view> </view>
<!-- <view class="order-info-view" v-if="order.use_point"> <!-- <view class="order-info-view" v-if="order.use_point">
<view class="title">使用积分</view> <view class="title">使用积分</view>
@@ -104,16 +127,20 @@
</view> </view>
</view> </view>
<!-- 客户服务 售后取消订单查看物流投诉等 --> <!-- 客户服务 售后取消订单查看物流投诉等 -->
<view class="info-view" <view class="info-view">
v-if="orderDetail.allowOperationVO && orderDetail.allowOperationVO.cancel == true || order.orderStatus == 'DELIVERED' || order.orderStatus != 'UNPAID' && order.orderPromotionType =='PINTUAN'">
<view style="width: 100%"> <view style="width: 100%">
<view class="order-info-view"> <view class="order-info-view">
<view class="title">服务</view> <view class="title">服务</view>
</view> </view>
<view class="customer-list"> <view class="customer-list">
<view class="customer-service" v-if="orderDetail.allowOperationVO && orderDetail.allowOperationVO.cancel == true" @click="onCancel(order.sn)">取消订单</view> <view class="customer-service"
v-if="orderDetail.allowOperationVO && orderDetail.allowOperationVO.cancel == true"
@click="onCancel(order.sn)">取消订单</view>
<view class="customer-service" v-if="order.orderStatus == 'DELIVERED'" @click="onLogistics(order)">查看物流</view> <view class="customer-service" v-if="order.orderStatus == 'DELIVERED'" @click="onLogistics(order)">查看物流</view>
<view class="customer-service" v-if="order.orderStatus != 'UNPAID' && order.orderPromotionType =='PINTUAN' " @click="ByUserMessage(order)">查看拼团信息</view> <view class="customer-service" v-if="order.orderStatus != 'UNPAID' && order.orderPromotionType == 'PINTUAN'"
@click="ByUserMessage(order)">查看拼团信息</view>
<view class="customer-service"
@click="contact(order.storeId)">联系客服</view>
</view> </view>
</view> </view>
</view> </view>
@@ -129,23 +156,29 @@
<view class="order-info-view"> <view class="order-info-view">
<view class="title">下单时间</view> <view class="title">下单时间</view>
<view class="value">{{ <view class="value">{{
order.createTime order.createTime
}}</view>
</view>
<view class="order-info-view">
<view class="title">订单备注</view>
<view class="value">{{
order.remark || '暂无备注'
}}</view> }}</view>
</view> </view>
<view class="order-info-view"> <view class="order-info-view">
<view class="title">支付状态</view> <view class="title">支付状态</view>
<view class="value"> <view class="value">
{{ {{
order.payStatus == "UNPAID" order.payStatus == "UNPAID"
? "未付款" ? "未付款"
: order.payStatus == "PAID" : order.payStatus == "PAID"
? "已付款" ? "已付款"
: "" : ""
}}</view> }}</view>
</view> </view>
<view class="order-info-view"> <view class="order-info-view">
<view class="title">支付方式</view> <view class="title">支付方式</view>
<view class="value">{{ orderDetail.paymentMethodValue }}</view> <view class="value">{{ orderDetail.paymentMethodValue || '暂无'}}</view>
</view> </view>
</view> </view>
</view> </view>
@@ -153,7 +186,7 @@
<view class="info-view" v-if="order.payStatus == 'PAID'"> <view class="info-view" v-if="order.payStatus == 'PAID'">
<view> <view>
<view class="invoice-info-view"> <view class="invoice-info-view">
<view class="ltitle">发票信息</view> <view class="invoice-title">发票信息</view>
<view v-if="!order.needReceipt" class="value">无需发票</view> <view v-if="!order.needReceipt" class="value">无需发票</view>
<view v-else class="value" @click="onReceipt(orderDetail.receipt)">查看发票</view> <view v-else class="value" @click="onReceipt(orderDetail.receipt)">查看发票</view>
</view> </view>
@@ -175,13 +208,16 @@
<view> <view>
<!-- 全部 --> <!-- 全部 -->
<!-- 等待付款 --> <!-- 等待付款 -->
<u-button type="error" ripple size="mini" v-if=" order.allowOperationVO && order.allowOperationVO.pay" @click="toPay(order)">立即付款</u-button> <u-button type="error" ripple size="mini" v-if="orderDetail.allowOperationVO && orderDetail.allowOperationVO.pay"
@click="toPay(order)">立即付款</u-button>
<!-- <u-button class="rebuy-btn" size="mini" v-if="order.order_operate_allowable_vo.allow_service_cancel"> 提醒发货</u-button> --> <!-- <u-button class="rebuy-btn" size="mini" v-if="order.order_operate_allowable_vo.allow_service_cancel"> 提醒发货</u-button> -->
<!-- <div class="pay-btn">确认收货</div> --> <!-- <div class="pay-btn">确认收货</div> -->
<u-button shape="circle" ripple type="warning" size="mini" v-if="order.orderStatus == 'DELIVERED'" @click="onRog(order.sn)">确认收货</u-button> <u-button shape="circle" ripple type="warning" size="mini" v-if="order.orderStatus == 'DELIVERED'"
@click="onRog(order.sn)">确认收货</u-button>
<!-- 交易完成 未评价 --> <!-- 交易完成 未评价 -->
<u-button shape="circle" ripple size="mini" v-if="order.orderStatus == 'COMPLETE'" @click="onComment(order.sn)">评价商品</u-button> <u-button shape="circle" ripple size="mini" v-if="order.orderStatus == 'COMPLETE'"
@click="onComment(order.sn)">评价商品</u-button>
</view> </view>
</view> </view>
</view> </view>
@@ -193,7 +229,8 @@
<u-radio-group v-model="reason"> <u-radio-group v-model="reason">
<view class="value"> <view class="value">
<view class="radio-view" v-for="(item, index) in cancelList" :key="index"> <view class="radio-view" v-for="(item, index) in cancelList" :key="index">
<u-radio :active-color="lightColor" label-size="25" shape="circle" :name="item.reason" @change="reasonChange">{{ item.reason }}</u-radio> <u-radio :active-color="lightColor" label-size="25" shape="circle" :name="item.reason"
@change="reasonChange">{{ item.reason }}</u-radio>
</view> </view>
</view> </view>
</u-radio-group> </u-radio-group>
@@ -204,19 +241,20 @@
</view> </view>
</u-popup> </u-popup>
<u-toast ref="uToast" /> <u-toast ref="uToast" />
<u-modal v-model="rogShow" :show-cancel-button="true" :content="'是否确认收货?'" :confirm-color="lightColor" @confirm="confirmRog"></u-modal> <u-modal v-model="rogShow" :show-cancel-button="true" :content="'是否确认收货?'" :confirm-color="lightColor"
@confirm="confirmRog"></u-modal>
<!-- 分享 --> <!-- 分享 -->
<shares v-if="shareFlage " :thumbnail="orderDetail.orderItems[0].image" :goodsName="orderDetail.orderItems[0].goodsName" @close="shareFlage = false" /> <shares v-if="shareFlag" :thumbnail="orderDetail.orderItems[0].image"
:goodsName="orderDetail.orderItems[0].goodsName" @close="shareFlag = false" />
</view> </view>
</template> </template>
<script> <script>
import { getExpress } from "@/api/trade.js"; import { getExpress, getPackage } from "@/api/trade.js";
import { cancelOrder, confirmReceipt, getOrderDetail } from "@/api/order.js"; import { cancelOrder, confirmReceipt, getOrderDetail } from "@/api/order.js";
import { h5Copy } from "@/js_sdk/h5-copy/h5-copy.js";
import shares from "@/components/m-share/index"; //分享 import shares from "@/components/m-share/index"; //分享
import { getClearReason } from "@/api/after-sale.js"; import { getClearReason } from "@/api/after-sale.js";
@@ -228,8 +266,8 @@ export default {
data() { data() {
return { return {
lightColor: this.$lightColor, lightColor: this.$lightColor,
logiList: "", //物流信息 logisticsList: "", //物流信息
shareFlage: false, //拼团分享开关 shareFlag: false, //拼团分享开关
orderStatusList: { orderStatusList: {
UNPAID: { UNPAID: {
title: "未付款", title: "未付款",
@@ -243,6 +281,10 @@ export default {
title: "待发货", title: "待发货",
value: "商品等待发货中", value: "商品等待发货中",
}, },
PARTS_DELIVERED: {
title: "部分发货",
value: "商品已部分发货。",
},
DELIVERED: { DELIVERED: {
title: "已发货", title: "已发货",
value: "商品已发货,请您耐心等待", value: "商品已发货,请您耐心等待",
@@ -255,6 +297,10 @@ export default {
title: "已完成", title: "已完成",
value: "订单已完成,祝您生活愉快", value: "订单已完成,祝您生活愉快",
}, },
STAY_PICKED_UP: {
title: "待自提",
value: "商品正在等待提取",
},
TAKE: { TAKE: {
title: "待核验", title: "待核验",
}, },
@@ -268,15 +314,50 @@ export default {
cancelList: "", cancelList: "",
rogShow: false, rogShow: false,
reason: "", reason: "",
orderPackage:"",
}; };
}, },
onLoad(options) { onLoad(options) {
this.loadData(options.sn); this.loadData(options.sn);
this.loadLogistics(options.sn);
this.sn = options.sn; this.sn = options.sn;
}, },
methods: { methods: {
tostore(val) { //获取包裹
async getOrderPackage() {
getPackage(this.order.sn).then(res => {
if (res.data.success) {
this.orderPackage = res.data.result
}
})
},
handleClickDeliver(){
uni.navigateTo({
url: `/pages/order/deliverDetail?order_sn=${this.order.sn}`,
});
},
// 退款状态枚举
refundPriceList(status) {
switch (status) {
case 'ALL_REFUND':
return "全部退款";
case 'PART_REFUND':
return "部分退款";
case 'NO_REFUND':
return "未退款";
case 'REFUNDING':
return "退款中";
default:
return "";
}
},
callPhone(){
this.$options.filters.callPhone(this.order.storeAddressMobile )
},
//联系客服
contact(storeId){
this.$options.filters.talkIm(storeId)
},
goToShopPage(val) {
uni.navigateTo({ uni.navigateTo({
url: "/pages/product/shopPage?id=" + val.storeId, url: "/pages/product/shopPage?id=" + val.storeId,
}); });
@@ -284,13 +365,13 @@ export default {
// 获取物流信息 // 获取物流信息
loadLogistics(sn) { loadLogistics(sn) {
getExpress(sn).then((res) => { getExpress(sn).then((res) => {
this.logiList = res.data.result; this.logisticsList = res.data.result;
}); });
}, },
// 分享当前拼团信息 // 分享当前拼团信息
inviteGroup() { inviteGroup() {
this.shareFlage = true; this.shareFlag = true;
}, },
// #TODO 这块需要写一下 目前没有拼团的详细信息 // #TODO 这块需要写一下 目前没有拼团的详细信息
ByUserMessage(order) { ByUserMessage(order) {
@@ -304,7 +385,7 @@ export default {
this.orderGoodsList[0].goodsId, this.orderGoodsList[0].goodsId,
}); });
}, },
loadData(sn) { async loadData(sn) {
uni.showLoading({ uni.showLoading({
title: "加载中", title: "加载中",
}); });
@@ -313,9 +394,13 @@ export default {
this.order = order.order; this.order = order.order;
this.orderGoodsList = order.orderItems; this.orderGoodsList = order.orderItems;
this.orderDetail = res.data.result; this.orderDetail = res.data.result;
if (this.order.deliveryMethod === 'LOGISTICS') {
uni.hideLoading(); this.loadLogistics(sn);
this.getOrderPackage();
}
if (this.$store.state.isShowToast){ uni.hideLoading() };
}); });
}, },
onReceipt(val) { onReceipt(val) {
uni.navigateTo({ uni.navigateTo({
@@ -324,39 +409,11 @@ export default {
}, },
gotoGoodsDetail(sku) { gotoGoodsDetail(sku) {
uni.navigateTo({ uni.navigateTo({
url: `/pages/product/goods?id=${sku.id}&goodsId=${sku.goodsId}`, url: `/pages/product/goods?id=${sku.skuId}&goodsId=${sku.goodsId}`,
}); });
}, },
onCopy(sn) { onCopy(sn) {
// #ifdef H5 this.$options.filters.setClipboard(sn)
if (sn === null || sn === undefined) {
sn = "";
} else sn = sn + "";
const result = h5Copy(sn);
if (result === false) {
uni.showToast({
title: "不支持",
});
} else {
uni.showToast({
title: "复制成功",
icon: "none",
});
}
// #endif
// #ifndef H5
uni.setClipboardData({
data: sn,
success: function () {
uni.showToast({
title: "复制成功!",
duration: 2000,
icon: "none",
});
},
});
// #endif
}, },
/** /**
@@ -383,8 +440,8 @@ export default {
toPay(val) { toPay(val) {
val.sn val.sn
? uni.navigateTo({ ? uni.navigateTo({
url: "/pages/cart/payment/payOrder?order_sn=" + val.sn, url: "/pages/cart/payment/payOrder?order_sn=" + val.sn,
}) })
: false; : false;
}, //删除订单 }, //删除订单
deleteOrder(index) { deleteOrder(index) {
@@ -393,7 +450,7 @@ export default {
}); });
setTimeout(() => { setTimeout(() => {
this.navList[this.tabCurrentIndex].orderList.splice(index, 1); this.navList[this.tabCurrentIndex].orderList.splice(index, 1);
uni.hideLoading(); if (this.$store.state.isShowToast){ uni.hideLoading() };
}, 600); }, 600);
}, },
//取消订单 //取消订单
@@ -407,7 +464,7 @@ export default {
if (res.data.result.length >= 1) { if (res.data.result.length >= 1) {
this.cancelList = res.data.result; this.cancelList = res.data.result;
} }
uni.hideLoading(); if (this.$store.state.isShowToast){ uni.hideLoading() };
}); });
this.cancelShow = true; this.cancelShow = true;
@@ -491,9 +548,11 @@ export default {
<style lang="scss"> <style lang="scss">
@import "./goods.scss"; @import "./goods.scss";
.empty { .empty {
width: 100%; width: 100%;
} }
.customer-service { .customer-service {
background: #ededed; background: #ededed;
// padding: 12rpx 40rpx; // padding: 12rpx 40rpx;
@@ -506,51 +565,58 @@ export default {
font-size: 24rpx; font-size: 24rpx;
border-radius: 10rpx; border-radius: 10rpx;
} }
.customer-list { .customer-list {
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
} }
.logi-view {
.logistics-view {
justify-content: space-between; justify-content: space-between;
padding: 30rpx !important; padding: 30rpx !important;
margin: 0 !important; margin: 0 !important;
transform: translateY(-10px); transform: translateY(-10px);
} }
.order-status { .order-status {
color: #fff; color: #fff;
width: 100%; width: 100%;
text-align: center; text-align: center;
font-size: 36rpx; font-size: 36rpx;
margin-top: 40rpx; margin-top: 40rpx;
> div {
>div {
font-size: 24rpx; font-size: 24rpx;
margin-top: 10rpx; margin-top: 10rpx;
} }
} }
.logi-List-title {
.logistics-List-title {
margin-bottom: 10rpx; margin-bottom: 10rpx;
font-size: 26rpx; font-size: 26rpx;
} }
.logi-List-time {
.logistics-List-time {
font-size: 24rpx; font-size: 24rpx;
color: #999; color: #999;
} }
.info-detail { .info-detail {
margin-right: 30rpx; margin-right: 30rpx;
color: #333; color: #333;
} }
.order-view { .order-view {
margin: 0 !important; margin: 0 !important;
border-radius: 0 !important; border-radius: 0 !important;
width: 100%; width: 100%;
height: 200rpx; height: 200rpx;
padding: 0 !important; padding: 0 !important;
background-image: linear-gradient( background-image: linear-gradient(to right,
to right, $light-color 0%,
$light-color 0%, $aider-light-color 100%) !important;
$aider-light-color 100%
) !important;
} }
page, page,
.content { .content {
background: #f1f1f1; background: #f1f1f1;
@@ -575,18 +641,22 @@ page,
padding: 16rpx 0rpx; padding: 16rpx 0rpx;
} }
} }
.seller-view { .seller-view {
margin: 20rpx 0; margin: 20rpx 0;
padding: 15rpx 0; padding: 15rpx 0;
border-radius: 30rpx; border-radius: 30rpx;
} }
.address-title { .address-title {
font-size: 26rpx; font-size: 26rpx;
font-weight: bold; font-weight: bold;
> span {
>span {
margin-right: 20rpx; margin-right: 20rpx;
} }
} }
.info-view { .info-view {
display: flex; display: flex;
margin: 0 0 20rpx 0; margin: 0 0 20rpx 0;
@@ -621,11 +691,14 @@ page,
width: 140rpx; width: 140rpx;
font-size: 24rpx; font-size: 24rpx;
font-weight: 600; font-weight: 600;
flex:3;
min-width: 160rpx;
} }
.value { .value {
color: #666; color: #666;
font-size: 24rpx; font-size: 24rpx;
flex:10;
} }
.copy { .copy {
@@ -643,7 +716,7 @@ page,
width: 100%; width: 100%;
margin: 10rpx 0rpx; margin: 10rpx 0rpx;
.ltitle { .invoice-title {
width: 550rpx; width: 550rpx;
font-size: 28rpx; font-size: 28rpx;
color: #333333; color: #333333;
@@ -654,10 +727,12 @@ page,
} }
} }
} }
.verificationCode { .verificationCode {
font-weight: bold; font-weight: bold;
letter-spacing: 2rpx; letter-spacing: 2rpx;
} }
.bottom_view { .bottom_view {
width: 100%; width: 100%;
height: 100rpx; height: 100rpx;
@@ -718,4 +793,15 @@ page,
text-align: center; text-align: center;
} }
} }
.address-line-height{
line-height: 1.75;
}
.seller-name{
>.name{
flex:10 !important;
}
>.status{
flex:2;
}
}
</style> </style>

View File

@@ -0,0 +1,54 @@
<template>
<div>
<u-navbar :border-bottom="false"></u-navbar>
<step1 v-if="current == 1" :companyData="companyData" @callback="next()" />
<step2 v-if="current == 2" :companyData="companyData" @callback="next()" />
<step3
v-if="current == 3"
:companyData="companyData"
@callback="finished()"
/>
</div>
</template>
<script>
import { getCompanyDetail } from "@/api/entry";
import step1 from "./step1";
import step2 from "./step2";
import step3 from "./step3";
export default {
data() {
return {
companyData: "",
current: 1,
};
},
components: {
step1,
step2,
step3,
},
mounted() {
this.init();
},
methods: {
async init(next) {
const res = await getCompanyDetail();
if (res.data.success) {
this.companyData = res.data.result;
next ? this.current++ : "";
}
},
next() {
this.init("next");
},
finished() {
uni.navigateTo({
url: "/pages/passport/entry/seller/index",
});
},
},
};
</script>
<style lang="scss" scoped></style>

View File

@@ -0,0 +1,18 @@
.flag-title {
font-size: 42rpx;
font-weight: bold;
}
.submit,
.notice {
font-weight: bold;
font-size: 28rpx;
height: 92rpx;
text-align: center;
letter-spacing: 4rpx;
line-height: 92rpx;
border-radius: 20rpx;
}
.wrapper {
padding:16rpx;
}

View File

@@ -0,0 +1,165 @@
<template>
<div class="wrapper">
<u-navbar :border-bottom="false"></u-navbar>
<div>
<div class="title">店铺入驻</div>
<div class="step-list">
<div
class="step-item"
:class="{ active: current == index }"
v-for="(item, index) in entrySteps"
:key="index"
>
{{ item.title }}
</div>
</div>
<div class="submit" @click="keepOn()">开始填写</div>
<div class="notice" @click="getEntryNotice">查看店铺入驻协议</div>
</div>
</div>
</template>
<script>
import { getCompanyDetail } from "@/api/entry";
export default {
components: {},
data() {
return {
current: 999,
entrySteps: [
{
title: "填写资质信息",
value: "APPLY",
},
{
title: "提交审核",
value: "APPLYING",
},
],
storeStatusWay: [
{
title: "申请已通过,请联系管理员",
value: "OPEN",
},
{
title: "店铺已关闭,重申请联系管理员",
value: "CLOSED",
},
{
title: "审核未通过,请修改资质信息",
value: "REFUSED",
},
],
companyData: "", // 公司信息
};
},
onShow() {
if(this.$options.filters.tipsToLogin()){
this.init();
}
},
mounted() {},
onLoad(options) {},
methods: {
getEntryNotice() {
uni.navigateTo({
url: "/pages/mine/help/tips?type=STORE_REGISTER",
});
},
keepOn() {
if (this.companyData && this.companyData.storeDisable == "OPEN") {
uni.showToast({
title:"审核已通过",
icon:"none"
})
} else {
uni.navigateTo({
url: "/pages/passport/entry/seller/control",
});
}
},
async init() {
this.entrySteps = [
{
title: "填写资质信息",
value: "APPLY",
},
{
title: "提交审核",
value: "APPLYING",
},
];
const res = await getCompanyDetail();
if (res.data.success) {
this.companyData = res.data.result;
if (this.companyData) {
this.storeStatusWay.forEach((item) => {
if (item.value == this.companyData.storeDisable) {
this.entrySteps.push(item);
}
});
this.current =
this.entrySteps.findIndex(
(item) => item.value == this.companyData.storeDisable
) || 0;
} else {
this.current = 0;
}
}
},
},
};
</script>
<style>
page {
background: #fff;
}
</style>
<style lang="scss" scoped>
@import url("./entry.scss");
.wrapper {
padding: 0 80rpx;
}
.title {
padding-top: calc(104rpx);
font-style: normal;
line-height: 1;
font-weight: 500;
font-size: 56rpx;
color: #333;
padding-left: 20rpx;
}
.step-item {
padding: 30rpx 20rpx;
font-size: 40rpx;
font-weight: bold;
color: #666;
}
.step-list {
margin: 80rpx 0;
overflow: hidden;
}
.active {
color: $light-color;
background: rgba($color: $light-color, $alpha: 0.1);
border-radius: 20rpx;
}
.submit {
color: #fff;
margin-top: 120rpx;
background: rgba($light-color, 0.8);
}
.notice {
margin-top: 40rpx;
color: #333;
background: $bg-color;
}
</style>

View File

@@ -0,0 +1,393 @@
<template>
<div class="wrapper">
<u-form label-width="200" :model="form" ref="uForm">
<div class="column">
<div class="flag-title light-color">基础信息</div>
<u-form-item
required
:border-bottom="false"
prop="companyName"
label="公司名称"
><u-input
v-model="form.companyName"
:custom-style="defaultInputStyle"
/></u-form-item>
<u-form-item
required
:border-bottom="false"
prop="companyAddressPath"
label="公司所在地"
>
<div @click="showPicker()" style="margin-right: 30rpx;">选择</div>
<u-input
disabled
:custom-style="defaultInputStyle"
v-model="form.companyAddressPath"
/></u-form-item>
<u-form-item
required
:border-bottom="false"
prop="companyAddress"
label="公司详细地址"
><u-input
:custom-style="defaultInputStyle"
v-model="form.companyAddress"
/></u-form-item>
<u-form-item
required
:border-bottom="false"
prop="employeeNum"
label="员工人数"
><u-input
type="number"
:custom-style="defaultInputStyle"
v-model="form.employeeNum"
/></u-form-item>
<u-form-item
required
:border-bottom="false"
prop="companyPhone"
label="公司电话"
><u-input
type="number"
:custom-style="defaultInputStyle"
v-model="form.companyPhone"
/></u-form-item>
<u-form-item
:border-bottom="false"
prop="registeredCapital"
label="注册资金"
required
><u-input
type="number"
:custom-style="defaultInputStyle"
v-model="form.registeredCapital"
/></u-form-item>
<u-form-item
required
:border-bottom="false"
prop="linkName"
label="联系人姓名"
><u-input :custom-style="defaultInputStyle" v-model="form.linkName"
/></u-form-item>
<u-form-item
required
:border-bottom="false"
prop="linkPhone"
label="联系人电话"
><u-input
type="number"
:custom-style="defaultInputStyle"
v-model="form.linkPhone"
/></u-form-item>
<u-form-item
required
:border-bottom="false"
prop="companyEmail"
label="电子邮箱"
><u-input
:custom-style="defaultInputStyle"
v-model="form.companyEmail"
/></u-form-item>
</div>
<div class="column">
<div class="flag-title light-color">营业执照信息</div>
<u-form-item
required
:border-bottom="false"
prop="licenseNum"
label="营业执照号"
><u-input :custom-style="defaultInputStyle" v-model="form.licenseNum"
/></u-form-item>
<u-form-item
required
:border-bottom="false"
prop="scope"
label="法定经营范围"
><u-input :custom-style="defaultInputStyle" v-model="form.scope"
/></u-form-item>
<u-form-item
:border-bottom="false"
prop="licencePhoto"
label="营业执照电子版"
required
>
<div>
<u-upload
:file-list="licencePhotoFileList"
:header="{ accessToken: storage.getAccessToken() }"
:action="action"
width="200"
@on-uploaded="onUploaded($event, 'licencePhoto')"
:max-count="1"
:show-progress="false"
></u-upload>
<div class="tips">
请压缩图片在2M以内确保文字清晰以免上传或审核失败
</div>
</div>
</u-form-item>
</div>
<div class="column">
<div class="flag-title light-color">法人信息</div>
<u-form-item
required
:border-bottom="false"
prop="legalName"
label="法人姓名"
><u-input :custom-style="defaultInputStyle" v-model="form.legalName"
/></u-form-item>
<u-form-item
required
:border-bottom="false"
prop="legalId"
label="法人证件号"
><u-input :custom-style="defaultInputStyle" v-model="form.legalId"
/></u-form-item>
<u-form-item
required
:border-bottom="false"
prop="legalPhoto"
label="法人证件电子版"
>
<div>
<u-upload
:file-list="legalPhotoFileList"
:header="{ accessToken: storage.getAccessToken() }"
:action="action"
width="200"
@on-uploaded="onUploaded($event, 'legalPhoto')"
:max-count="1"
:show-progress="false"
></u-upload>
</div>
</u-form-item>
</div>
</u-form>
<div class="submit" @click="validatorStep1Form">提交/下一步</div>
<m-city
:provinceData="list"
headTitle="区域选择"
ref="cityPicker"
@funcValue="getPickerParentValue"
pickerSize="4"
>
</m-city>
</div>
</template>
<script>
import { applyFirst } from "@/api/entry";
import city from "@/components/m-city/m-city.vue";
import storage from "@/utils/storage.js";
import { upload } from "@/api/common.js";
import * as RegExp from "@/utils/RegExp.js";
export default {
components: { "m-city": city },
data() {
return {
storage,
action: upload, //图片上传数据
defaultInputStyle: {
background: "#f7f7f7",
padding: "0 20rpx",
"border-radius": "10rpx",
},
legalPhotoFileList: [],
licencePhotoFileList: [],
form: {
companyName: "",
companyAddressIdPath: [],
companyAddressPath: "",
companyAddress: "",
employeeNum: "",
registeredCapital: "",
linkName: "",
linkPhone: "",
companyPhone: "",
companyEmail: "",
licenseNum: "",
scope: "",
legalPhoto: "",
licencePhoto: "",
legalName: "",
legalId: "",
},
list: [
{
id: "",
localName: "请选择",
children: [],
},
],
rules: {
// 验证规则
companyName: [{ required: true, message: "请填写公司信息" }],
companyAddressPath: [{ required: true, message: "请选择公司所在地" }],
companyAddress: [{ required: true, message: "请填写公司详细地址" }],
employeeNum: [{ required: true, message: "请填写公司员工总数" }],
registeredCapital: [{ required: true, message: "请填写公司注册资金" }],
linkName: [{ required: true, message: "请填写联系人姓名" }],
linkPhone: [
{ required: true, message: "请填写联系人电话" },
{
// 自定义验证函数,见上说明
validator: (rule, value, callback) => {
// 上面有说返回true表示校验通过返回false表示不通过
// this.$u.test.mobile()就是返回true或者false的
return this.$u.test.mobile(value);
},
message: "手机号码不正确",
// 触发器可以同时用blur和change
trigger: ["change", "blur"],
},
],
companyPhone: [
{ required: true, message: "请填写公司电话" },
{
// 自定义验证函数,见上说明
validator: (rule, value, callback) => {
// 上面有说返回true表示校验通过返回false表示不通过
// this.$u.test.mobile()就是返回true或者false的
return this.$u.test.mobile(value);
},
message: "请填写正确的号码",
// 触发器可以同时用blur和change
trigger: ["change", "blur"],
},
],
companyEmail: [
{ required: true, message: "请填写电子邮箱" },
{
// 自定义验证函数,见上说明
validator: (rule, value, callback) => {
// 上面有说返回true表示校验通过返回false表示不通过
// this.$u.test.mobile()就是返回true或者false的
return this.$u.test.email(value);
},
message: "请填写正确的电子邮箱",
// 触发器可以同时用blur和change
trigger: ["change", "blur"],
},
],
licenseNum: [
{ required: true, message: "请填写营业执照号" },
{ pattern: RegExp.licenseNum, message: "请输入正确的营业执照号" },
],
scope: [{ required: true, message: "请填写营业执照所示经营范围" }],
legalPhoto: [{ required: true, message: "请上传法人身份证照片" }],
licencePhoto: [{ required: true, message: "请上传营业执照" }],
legalName: [{ required: true, message: "请输入法人姓名" }],
legalId: [
{ required: true, message: "请输入法人证件号" },
{ pattern: RegExp.IDCard, message: "请输入正确的证件号" },
],
},
};
},
mounted() {
this.$refs.uForm.setRules(this.rules);
},
props: ["companyData"],
watch: {
companyData: {
handler(val) {
if (val) {
this.$set(this, "form", val);
// 给图片赋值
const judgeDeepPhoto = ["legalPhoto", "licencePhoto"];
judgeDeepPhoto.forEach((key) => {
if (this.form[key]) {
this.form[key].split(",").forEach((item) => {
this[`${key}FileList`].push({ url: item });
});
}
});
}
},
deep: true,
},
},
methods: {
// 图片上传
onUploaded(lists, key) {
let images = [];
lists.forEach((item) => {
images.push(item.response.result);
});
this.form[key] = images;
},
getPickerParentValue(e) {
this.form.companyAddressIdPath = [];
let name = "";
e.forEach((item, index) => {
if (item.id) {
// 遍历数据
this.form.companyAddressIdPath.push(item.id);
if (index == e.length - 1) {
name += item.localName;
} else {
name += item.localName + ",";
}
this.form.companyAddressPath = name;
}
});
},
// 显示三级地址联动
showPicker() {
console.log(this.$refs)
this.$refs.cityPicker.show();
},
validatorStep1Form() {
this.$refs.uForm.validate(async (valid) => {
console.log(valid);
if (valid) {
const params = { ...this.form };
params.legalPhoto = params.legalPhoto.toString();
params.licencePhoto = params.licencePhoto.toString();
params.companyAddressIdPath = params.companyAddressIdPath.toString();
delete params.complexAddress;
const res = await applyFirst(params);
if (res.data.success) {
uni.showToast({
title: "提交成功!",
icon: "none",
});
this.$emit("callback");
}
}
});
},
},
};
</script>
<style>
/* page {
background: #fff;
} */
</style>
<style lang="scss" scoped>
@import url("./entry.scss");
.column {
padding: 32rpx;
margin-bottom: 20rpx;
background: #fff;
}
.submit {
color: #fff;
margin-top: 120rpx;
background: rgba($light-color, 0.8);
}
.tips {
color: #999;
font-size: 24rpx;
line-height: 1.2;
margin-top: 10rpx;
}
</style>

View File

@@ -0,0 +1,144 @@
<template>
<div class="wrapper">
<u-form label-width="250" :model="form" ref="uForm">
<div class="column">
<div class="flag-title light-color">基础信息</div>
<u-form-item
required
:border-bottom="false"
prop="settlementBankAccountName"
label="银行开户名"
><u-input
v-model="form.settlementBankAccountName"
:custom-style="defaultInputStyle"
/></u-form-item>
<u-form-item
required
:border-bottom="false"
prop="settlementBankAccountNum"
label="银行账号"
><u-input
:custom-style="defaultInputStyle"
v-model="form.settlementBankAccountNum"
/></u-form-item>
<u-form-item
required
:border-bottom="false"
prop="settlementBankBranchName"
label="开户银行支行名称"
><u-input
:custom-style="defaultInputStyle"
v-model="form.settlementBankBranchName"
/></u-form-item>
<u-form-item
required
:border-bottom="false"
prop="settlementBankJointName"
label="支行联行号"
><u-input
:custom-style="defaultInputStyle"
v-model="form.settlementBankJointName"
/></u-form-item>
</div>
</u-form>
<div class="submit" @click="validatorStep2Form">提交/下一步</div>
</div>
</template>
<script>
import { applySecond } from "@/api/entry";
export default {
data() {
return {
defaultInputStyle: {
background: "#f7f7f7",
padding: "0 20rpx",
"border-radius": "10rpx",
},
form: {
settlementBankAccountName: "",
settlementBankAccountNum: "",
settlementBankBranchName: "",
settlementBankJointName: "",
},
rules: {
// 验证规则
settlementBankAccountName: [
{ required: true, message: "请填写银行开户名称" },
],
settlementBankAccountNum: [
{ required: true, message: "请填写银行账号" },
],
settlementBankBranchName: [
{ required: true, message: "请填写开户银行支行名称" },
],
settlementBankJointName: [
{ required: true, message: "请填写支行联行号" },
],
},
};
},
mounted() {
this.$refs.uForm.setRules(this.rules);
},
props: ["companyData"],
watch: {
companyData: {
handler(val) {
this.$set(this, "form", val);
console.log(this.form)
},
deep: true,
immediate:true
},
},
methods: {
validatorStep2Form() {
this.$refs.uForm.validate(async (valid) => {
if (valid) {
const params = { ...this.form };
const res = await applySecond(params);
if (res.data.success) {
uni.showToast({
title: "提交成功!",
icon: "none",
});
this.$emit("callback");
}
}
});
},
},
};
</script>
<style>
/* page {
background: #fff;
} */
</style>
<style lang="scss" scoped>
@import url("./entry.scss");
.wrapper {
// padding: 50rpx 32rpx 16rpx 32rpx;
}
.column {
padding: 32rpx;
margin-bottom: 20rpx;
background: #fff;
}
.submit {
color: #fff;
margin-top: 120rpx;
background: rgba($light-color, 0.8);
}
.tips {
color: #999;
font-size: 24rpx;
line-height: 1.2;
margin-top: 10rpx;
}
</style>

View File

@@ -0,0 +1,376 @@
<template>
<div class="wrapper">
<u-form label-width="200" :model="form" ref="uForm">
<div class="column">
<div class="flag-title light-color">基础信息</div>
<u-form-item
required
:border-bottom="false"
prop="storeName"
label="店铺名称"
><u-input v-model="form.storeName" :custom-style="defaultInputStyle"
/></u-form-item>
<u-form-item
required
:border-bottom="false"
prop="storeLogo"
label="店铺logo"
>
<div>
<u-upload
:file-list="storeLogoFileList"
:header="{ accessToken: storage.getAccessToken() }"
:action="action"
width="200"
@on-uploaded="onUploaded($event, 'storeLogo')"
:max-count="1"
:show-progress="false"
></u-upload>
</div>
</u-form-item>
<u-form-item
required
:border-bottom="false"
prop="goodsManagementCategory"
label="店铺经营类目"
>
<div @click="showCategory()" style="margin-right: 30rpx;">选择</div>
<u-input
:custom-style="defaultInputStyle"
v-model="goodsManagementCategory"
disabled
@click="showCategory()"
/></u-form-item>
<u-form-item
required
:border-bottom="false"
prop="storeAddressPath"
label="店铺所在地"
>
<div @click="showPicker()" style="margin-right: 30rpx;">选择</div>
<u-input
:custom-style="defaultInputStyle"
v-model="form.storeAddressPath"
disabled
/>
</u-form-item>
<!-- <u-form-item
required
:border-bottom="false"
prop="storeAddressPath"
label="店铺定位"
>
<div class="get-center" @click="clickUniMap()">开始定位</div>
<div class="tips-success" v-if="form.storeCenter">已成功定位</div>
</u-form-item> -->
<u-form-item
required
:border-bottom="false"
prop="storeAddressDetail"
label="店铺详细地址"
><u-input
:custom-style="defaultInputStyle"
v-model="form.storeAddressDetail"
/></u-form-item>
<u-form-item
required
:border-bottom="false"
prop="storeDesc"
label="店铺简介"
><u-input
type="textarea"
:custom-style="defaultInputStyle"
v-model="form.storeDesc"
/></u-form-item>
</div>
</u-form>
<div class="submit" @click="validatorStep1Form">提交平台审核</div>
<m-city
:provinceData="list"
headTitle="区域选择"
ref="cityPicker"
@funcValue="getPickerParentValue"
pickerSize="4"
>
</m-city>
<u-select
v-model="enableCategory"
@confirm="confirmCategory"
:list="categoryList"
></u-select>
<uniMap v-if="mapFlag" @close="closeMap" @callback="callBackAddress" />
</div>
</template>
<script>
import { applyThird } from "@/api/entry";
import { getCategoryList } from "@/api/goods";
import city from "@/components/m-city/m-city.vue";
import storage from "@/utils/storage.js";
import { upload } from "@/api/common.js";
import uniMap from "@/components/uniMap";
import permision from "@/js_sdk/wa-permission/permission.js";
export default {
components: { "m-city": city, uniMap },
data() {
return {
storage,
mapFlag: false,
action: upload, //图片上传数据
defaultInputStyle: {
background: "#f7f7f7",
padding: "0 20rpx",
"border-radius": "10rpx",
},
goodsManagementCategory: "",
storeLogoFileList: [],
categoryList: [],
form: {
storeName: "",
storeLogo: "",
goodsManagementCategory: "",
storeAddressPath: "",
storeAddressDetail: "",
storeDesc: "",
},
list: [
{
id: "",
localName: "请选择",
children: [],
},
],
rules: {
// 验证规则
goodsManagementCategory: [
{ required: true, message: "请选择店铺经营类目" },
],
storeName: [{ required: true, message: "请填写店铺名称" }],
storeLogo: [{ required: true, message: "请上传店铺logo" }],
storeDesc: [{ required: true, message: "请填写店铺简介" }],
storeCenter: [{ required: true, message: "请选择店铺位置" }],
storeAddressIdPath: [{ required: true, message: "请选择店铺位置" }],
storeAddressDetail: [{ required: true, message: "请输入店铺详细地址" }],
},
enableCategory: false,
};
},
mounted() {
this.$refs.uForm.setRules(this.rules);
this.fetchCategoryList();
},
props: ["companyData"],
watch: {
companyData: {
handler(val) {
this.$set(this, "form", val);
// 给图片赋值
const judgeDeepPhoto = ["storeLogo"];
judgeDeepPhoto.forEach((key) => {
if (this.form[key]) {
this.form[key].split(",").forEach((item) => {
this[`${key}FileList`].push({ url: item });
});
}
});
},
deep: true,
immediate: true,
},
},
methods: {
callBackAddress(val) {
console.log(val);
this.form.storeAddressDetail = val.address;
this.form.storeCenter = `${val.longitude},${val.latitude}`;
},
// 关闭地图
closeMap() {
this.mapFlag = false;
},
// 打开地图并访问权限
clickUniMap() {
console.log("click");
// #ifdef APP-PLUS
if (plus.os.name == "iOS") {
// ios系统
permision.judgeIosPermission("location")
? (this.mapFlag = true)
: this.refuseMap();
} else {
// 安卓
this.requestAndroidPermission(
"android.permission.ACCESS_FINE_LOCATION"
);
}
// #endif
// #ifndef APP-PLUS
this.mapFlag = true;
// #endif
},
// 如果拒绝权限 提示区设置
refuseMap() {
uni.showModal({
title: "温馨提示",
content: "您已拒绝定位,请开启",
confirmText: "去设置",
success(res) {
if (res.confirm) {
//打开授权设置
// #ifndef MP-WEIXIN
uni.getSystemInfo({
success(res) {
if (res.platform == "ios") {
//IOS
plus.runtime.openURL("app-settings://");
} else if (res.platform == "android") {
//安卓
let main = plus.android.runtimeMainActivity();
let Intent = plus.android.importClass(
"android.content.Intent"
);
let mIntent = new Intent("android.settings.ACTION_SETTINGS");
main.startActivity(mIntent);
}
},
});
// #endif
}
},
});
},
// 获取安卓是否拥有地址权限
async requestAndroidPermission(permisionID) {
var result = await permision.requestAndroidPermission(permisionID);
if (result == 1) {
this.mapFlag = true;
} else {
this.refuseMap();
}
},
confirmCategory(val) {
this.form.goodsManagementCategory = val[0].value;
this.goodsManagementCategory = val[0].label;
},
async fetchCategoryList() {
const res = await getCategoryList(0);
if (res.data.success) {
if (res.data.result.length) {
this.categoryList = res.data.result.map((item) => {
return { label: item.name, value: item.id };
});
if (this.form.goodsManagementCategory) {
this.goodsManagementCategory = this.categoryList.find(
(item) => this.form.goodsManagementCategory == item.value
).label;
}
}
}
},
// 图片上传
onUploaded(lists, key) {
let images = [];
lists.forEach((item) => {
images.push(item.response.result);
});
this.form[key] = images;
},
getPickerParentValue(e) {
this.form.storeAddressIdPath = [];
console.log(e)
let name = "";
e.forEach((item, index) => {
if (item.id) {
// 遍历数据
this.form.storeAddressIdPath.push(item.id);
if (index == e.length - 1) {
name += item.localName;
} else {
name += item.localName + ",";
}
this.$set(this.form,'storeAddressPath',name)
}
});
this.form.storeCenter = e[e.length-1].center
},
// 显示三级地址联动
showPicker() {
this.$refs.cityPicker.show();
},
showCategory() {
this.enableCategory = true;
},
validatorStep1Form() {
this.$refs.uForm.validate(async (valid) => {
console.log(valid);
if (valid) {
const params = { ...this.form };
params.storeLogo = params.storeLogo.toString();
params.storeAddressIdPath = params.storeAddressIdPath.toString();
const res = await applyThird(params);
if (res.data.success) {
uni.showToast({
title: "提交成功!",
icon: "none",
});
this.$emit("callback");
}
}
});
},
},
};
</script>
<style>
/* page {
background: #fff;
} */
</style>
<style lang="scss" scoped>
@import url("./entry.scss");
.get-center {
padding: 12rpx 30rpx;
background: $light-color;
border-radius: 10rpx;
font-size: 24rpx;
color: #fff;
font-weight: bold;
display: inline;
}
.column {
padding: 32rpx;
margin-bottom: 20rpx;
background: #fff;
}
.submit {
color: #fff;
margin-top: 120rpx;
background: rgba($light-color, 0.8);
}
.tips {
color: #999;
font-size: 24rpx;
line-height: 1.2;
margin-top: 10rpx;
}
.tips-success {
color: $weChat-color;
font-size: 24rpx;
}
</style>

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