939 Commits
Author SHA1 Message Date
lifizer 5f835afd8b Feat(AI):关键词搜索匹配相关模块列表 2025-05-12 15:48:02 +08:00
modendeveloper 8ef14b73c2 Task:是否非遗角标 2025-05-10 15:46:27 +08:00
linxi 25c2290564 Tasl:旅居分享 2025-05-09 15:16:07 +08:00
linxi 94efec7281 Fix:3772 【商城小程序】产品规格大于等于三个时,商品详情页的商品价格和库存显示错误 2025-05-09 14:19:58 +08:00
linxi d49b46c950 Task:3744 【新需求】礼品卡图片自定义/ 隐藏图片上的文字和按钮 2025-05-09 13:45:48 +08:00
linxi d09b0c23e2 Task:3744 【新需求】礼品卡图片自定义 2025-05-09 11:37:50 +08:00
lifizer c8157c144e Fix(AI):[#3663]输入框中语音输入,未识别到有效语音时,增加提示“没有听清您说了什么,请再说一遍” 2025-05-07 17:42:16 +08:00
linxi ec0c003ff7 Fix:3256 【商城小程序】收货地址页面,给当前选择的地址增加一个标识,放在地址右下角 2025-05-06 17:48:46 +08:00
linxi e35ea1d5c2 Fix:3256 【商城小程序】收货地址页面,给当前选择的地址增加一个标识,放在地址右下角 2025-05-06 17:23:30 +08:00
linxi 1ddc425606 Fix:3750 【商城小程序】千县旅居—资讯点赞数未显示 2025-05-06 16:37:29 +08:00
linxi 54a274a70f Fix:3708 【商城小程序】供应商入驻时店铺封面为视频,驳回入驻申请后,再次提交入驻会提示“请上传店铺封面图” 2025-05-06 16:34:46 +08:00
linxi b1fc1e248d Fix:3750 【商城小程序】千县旅居—资讯点赞数未显示 2025-05-06 15:59:14 +08:00
linxi 51b5a77d07 Fix:2787 【商城小程序】点击进入已下架的商品详情页,页面空白并且没有提示信息,增加提示:该产品已下架或删除 2025-05-06 15:47:39 +08:00
linxi d5293f1038 Fix:3709 【商城小程序】特色店铺提交入驻申请后,视频封面不显示 2025-05-06 15:20:52 +08:00
linxi 4b1e5331ef Fix:2787 【商城小程序】点击进入已下架的商品详情页,页面空白并且没有提示信息,增加提示:该产品已下架或删除 2025-05-06 15:13:43 +08:00
linxi 8dc8bcdd59 Fix:3155 【商城小程序】轮播图底部没有渐变效果(测试机型:苹果12)体验版有问题,正式版是正常的 2025-05-06 15:08:34 +08:00
linxi e76d1a2b81 Fix:3711 【商城小程序】商详页选择的商品数量与订单页面的数据没有同步 2025-05-06 14:44:48 +08:00
linxi 6f139778a7 Feat:去除多余的组件,减少打包体积 2025-05-06 14:25:52 +08:00
linxi 6ad2aeef2e Fox:3721 【商城小程序】商品加购数量等于库存数时,继续点击增加数量按钮,页面所有内容点击无效 2025-05-06 14:25:17 +08:00
linxi fdaad4df7e Fix:3729 【商城小程序】旅居无数据时的提示信息修改为“暂无数据” 2025-04-30 11:39:20 +08:00
linxi dcd8413e22 Fix:3731 【商城小程序】千县旅居—文化图片左右边距不一致 2025-04-30 11:38:25 +08:00
linxi c50fa44fd8 Fix:3732 【商城小程序】城市切换,”当前定位“改为”当前城市“ 2025-04-30 11:34:17 +08:00
linxi 7b28b94390 Fix:旅居资讯移除点赞按钮 2025-04-30 11:24:57 +08:00
linxi f6ee332060 Task:小程序旅居接口对接 2025-04-28 16:29:05 +08:00
lifizer 8b8a467431 Fix(购物车):未登录状态点击去登录不能跳转 2025-04-27 16:48:07 +08:00
lifizer 069ef49839 Refactor(购物车&我的):增加未登录或者登录过期显示以便微信审核 2025-04-27 15:22:33 +08:00
modendeveloper 05cdb3ac34 Merge branch 'test' into dev 2025-04-27 00:06:53 +08:00
modendeveloper 491323fc17 Task:旅居列表接口对接 2025-04-27 00:06:13 +08:00
modendeveloper 3c56f3cfb5 Fix:3695 【商城小程序】进入客服页面发送图片后返回,再次进入该页面未显示消息数据 2025-04-26 16:36:08 +08:00
modendeveloper 5efd4c7ed2 Fix:3700 【商城小程序】顶部标题修改为“寻千县万村” 2025-04-26 16:15:54 +08:00
modendeveloper ce58a1577a Fix:3710 【商城小程序】在商详页购买商品时,多规格商品选择的商品数量与订单页面没有同步 2025-04-26 16:14:16 +08:00
modendeveloper c1f5b7260e Fix:3707 【商城小程序】在商详页购买商品时,减少商品数量会变为负数 2025-04-26 16:06:56 +08:00
lifizer 0885a908ea Fix(AI):[#3663]输入框中语音输入,未识别到有效语音时,增加提示“没有听清您说了什么,请再说一遍” 2025-04-24 15:59:32 +08:00
lifizer 1636c77cfd Fix(AI):[#3702]历史对话下方缺少“开启新对话”按钮,增加一个开启新对话按钮 2025-04-24 15:59:17 +08:00
lifizer 74b02ed292 Refactor(AI):支持短时间内多个会话 2025-04-23 17:34:19 +08:00
linxi 58b716c0ec Fix:3692 【商城小程序】展会详情页顶部标题改为”康养旅居“ 2025-04-23 15:00:04 +08:00
linxi 23eaec9688 Fix:3640 【商城小程序】点击切换店铺后,查看特产、文玩、康养、古镇项目、寻趣味轮播店铺,进入的是自己的店铺 2025-04-23 14:43:30 +08:00
lifizer f1d6ac62c1 Fix(AI):[#3681]AI对话点击手机侧边返回按钮,会回到小程序首页 2025-04-23 14:33:25 +08:00
lifizer 0d0b816fad Fix(AI):[#3647]点击输入框,对话记录同步上移 2025-04-22 14:18:05 +08:00
lifizer 39a54efc27 Fix(AI):[#3681]AI对话点击手机侧边返回按钮,会回到小程序首页 2025-04-22 13:34:26 +08:00
lifizer 30bb94130d Fix(AI):[#3663]输入框中语音输入,未识别到有效语音时,增加提示“没有听清您说了什么,请再说一遍” 2025-04-22 11:35:26 +08:00
lifizer 33f9d611b4 Fix(AI):[#3661]今日AI对话记录删除失败 2025-04-22 11:31:26 +08:00
linxi 3c86c4561a Fix:3648 【商城小程序】进入客服会话页面并返回后,再次进入未显示消息数据 2025-04-21 14:32:36 +08:00
linxi 19632a69ad Fix:3363 【商城小程序】农民店铺的视频资讯,视频播放后每次点击视频播放按钮外的区域都会增加浏览量 2025-04-21 14:15:15 +08:00
linxi e4428f3366 Fix:3640 【商城小程序】点击切换店铺后,查看特产、文玩、康养、古镇项目、寻趣味轮播店铺,进入的是自己的店铺 2025-04-21 14:03:23 +08:00
linxi 590c33d4d3 Fix:3638 【商城小程序】热搜榜单商品图尺寸统一为正方形,不根据原图长度自适应 2025-04-21 11:45:39 +08:00
linxi c285c32a4e Fix:2983 【商城小程序】被下架的商品在购物车中消失(改为前端数据保留,点击时提醒商品已下架或被删除) 2025-04-21 11:36:37 +08:00
linxi ed3e1f3dfc Fix:3659 【商城小程序】顶部标题修改为“寻地标好物” 2025-04-21 11:16:04 +08:00
lifizer ef10e8ad97 Merge branch 'dev' into test 2025-04-16 10:19:55 +08:00
lifizer 3ec0c8c29c Refactor(购物车&我的):增加未登录或者登录过期显示以便微信审核 2025-04-16 10:01:38 +08:00
lifizer 2f55b0bfb8 Refactor(购物车&我的):增加未登录或者登录过期显示以便微信审核 2025-04-15 15:33:01 +08:00
lifizer 3d53cc51a9 Merge branch 'dev' into test 2025-04-15 09:50:08 +08:00
lifizer 4fa9c6a594 Feat(AI):增加参数,只有通过点击才能进入,以便微信审核 2025-04-14 14:47:39 +08:00
lifizer 0bf354f8aa Merge branch 'dev' into test 2025-04-14 14:12:58 +08:00
linxi aa58754f1c Fix:客服消息商品展示价格面议 2025-04-14 10:51:42 +08:00
lifizer fdcdfc505f Conf(拦截器):增加白名单,针对后端返回401不跳转到登录界面 2025-04-14 09:09:24 +08:00
lifizer 59fee9df18 Conf(拦截器):增加白名单,针对后端返回401不跳转到登录界面 2025-04-12 09:19:09 +08:00
lifizer 6f244967a5 Merge branch 'dev' into test 2025-04-11 17:55:27 +08:00
linxi 6a3a2e74a0 Fix:3354 【礼品功能】微信支付失败后在礼品卡页面生成的待付款订单,改为跟普通订单一样,限定时间内未支付订单自动取消 2025-04-11 09:38:08 +08:00
linxi c323a28518 Fix:3354 【礼品功能】微信支付失败后在礼品卡页面生成的待付款订单,改为跟普通订单一样,限定时间内未支付订单自动取消 2025-04-11 09:29:48 +08:00
lifizer d68d4c8773 Fix(AI):[#3620]权限申请点击拒绝后,再次点击语音输入就不会再弹出权限申请弹窗 2025-04-10 16:26:54 +08:00
lifizer 4810aa7e33 Fix(AI):[#3595]热门词条轮播方式使用配置 2025-04-09 11:47:40 +08:00
modendeveloper fd4adbf383 Fix:3256 【商城小程序】收货地址页面,给当前选择的地址增加一个标识,放在地址右下角 2025-04-09 00:31:05 +08:00
modendeveloper 3829e896da Fix:3441 【商城小程序】购物车、待评价--再买一单,先结算满足优惠券使用的订单,再结算价格不满足上一个优惠券的订单时,会提示“不满足优惠券使用的条件” 2025-04-09 00:10:02 +08:00
modendeveloper a5d0ce8657 Fix:3601 【商城小程序】加购或送礼,输入数量超过商品库存,页面点击无效 2025-04-08 23:45:38 +08:00
modendeveloper ed81a95cd9 Fix:3592 【商城小程序】顶部标题修改为“非遗文创” 2025-04-08 23:21:15 +08:00
modendeveloper 0ff82a3590 Fix:3608 【商城小程序】当前用户有店铺时,从寻趣味选择任意店铺进入店铺详情,显示的是自己的店铺详情 2025-04-08 23:20:04 +08:00
lifizer ff471b6017 Fix(AI):[#3602]色块是原来的背景图,苹果手机不支持背景图固定不动,故改为渐变背景色 2025-04-08 22:18:42 +08:00
lifizer 52f2c2b003 Fix(AI):[#3607]底部操作区域增加背景颜色 2025-04-08 22:17:34 +08:00
lifizer 16abf0fdb6 Fix(AI):[#3606]苹果手机键盘底部及开启新对话按钮没有留空隙 2025-04-08 12:20:09 +08:00
lifizer f6851bfa77 Fix(AI):[#3612]进入问答页面后,点击左上角返回按钮,会直接返回小程序首页,改为返回到AI首页 2025-04-08 10:48:11 +08:00
lifizer 794e405ed2 Fix(AI):[#3611]一个用户在问答过程中退了,然后又进入重新生成一个会话,需要关闭ws 2025-04-08 10:47:31 +08:00
lifizer 689d949315 Fix(AI):[#3603, #3604]界面细节调整 2025-04-08 10:45:39 +08:00
lifizer e446b9e847 Fix(AI):[#3609]点击热门词条时,需要卡1秒才能进入问答页面,改为点击后马上进入问答页面 2025-04-08 10:18:58 +08:00
lifizer 67c94d814c Fix(AI):[#3600]键盘弹出后,开启新对话,及键盘底部会被遮挡一部分 2025-04-07 22:57:59 +08:00
lifizer 230e163c53 Feat(云灵AI):界面细节调整 2025-04-06 15:11:20 +08:00
lifizer de473eba57 Feat(云灵AI):对话接口对接完成 2025-04-06 12:57:39 +08:00
linxi 16742b3c23 Fix:3583 【商城小程序】店铺主页—有商品的店铺切换至无商品的店铺时,详情页中会显示商品项;无商品的店铺切换至有商品的店铺时,店铺详情页中不显示商品项 2025-04-06 00:06:14 +08:00
linxi b73e9ee36b Fix:3156 【商城小程序】客服消息--点击商品卡片跳转到商品详情页,在商品详情页中点击“客服”,聊天记录显示空白 2025-04-06 00:06:09 +08:00
linxi bc609f0038 Fix:3583 【商城小程序】店铺主页—有商品的店铺切换至无商品的店铺时,详情页中会显示商品项;无商品的店铺切换至有商品的店铺时,店铺详情页中不显示商品项 2025-04-06 00:06:04 +08:00
modendeveloper eb6865299c Fix:3583 【商城小程序】店铺主页—有商品的店铺切换至无商品的店铺时,详情页中会显示商品项;无商品的店铺切换至有商品的店铺时,店铺详情页中不显示商品项 2025-04-06 00:06:00 +08:00
modendeveloper 2e838088db Fix:3581 【商城小程序】开启了价格面议的商品详情页,点击【加入购物车】按钮没有提示信息 2025-04-06 00:05:55 +08:00
modendeveloper 37cd468d44 Fix:3580 【商城小程序】开启了价格面议的商品价格区域需显示为【价格面议】(页面:店铺商品列表页面、商详页的店铺数据区域) 2025-04-06 00:05:50 +08:00
modendeveloper 850f5922e2 Fix:3347 【商城小程序】送礼方买礼品后,现在没送出去就无法退款,要增加一个退款功能,以及24小时后自动退款 2025-04-06 00:05:45 +08:00
lifizer 50ff88e7df Feat(云灵AI):对话接口对接完成 2025-04-06 00:05:03 +08:00
lifizer 30f550ca92 Conf:补充tabbar图片相对地址,否则真机调试报错 2025-04-06 00:04:29 +08:00
linxi 72725d051e Fix:3583 【商城小程序】店铺主页—有商品的店铺切换至无商品的店铺时,详情页中会显示商品项;无商品的店铺切换至有商品的店铺时,店铺详情页中不显示商品项 2025-04-02 11:30:10 +08:00
linxi 8c85c4465e Fix:3156 【商城小程序】客服消息--点击商品卡片跳转到商品详情页,在商品详情页中点击“客服”,聊天记录显示空白 2025-04-02 11:01:01 +08:00
linxi 2a274766a1 Fix:3583 【商城小程序】店铺主页—有商品的店铺切换至无商品的店铺时,详情页中会显示商品项;无商品的店铺切换至有商品的店铺时,店铺详情页中不显示商品项 2025-04-02 10:13:38 +08:00
modendeveloper eb9533fb7d Fix:3583 【商城小程序】店铺主页—有商品的店铺切换至无商品的店铺时,详情页中会显示商品项;无商品的店铺切换至有商品的店铺时,店铺详情页中不显示商品项 2025-04-02 00:33:20 +08:00
modendeveloper 6f2957f514 Fix:3581 【商城小程序】开启了价格面议的商品详情页,点击【加入购物车】按钮没有提示信息 2025-04-02 00:23:18 +08:00
modendeveloper 610ea7ece1 Fix:3580 【商城小程序】开启了价格面议的商品价格区域需显示为【价格面议】(页面:店铺商品列表页面、商详页的店铺数据区域) 2025-04-02 00:21:22 +08:00
modendeveloper 35b57bbccc Fix:3347 【商城小程序】送礼方买礼品后,现在没送出去就无法退款,要增加一个退款功能,以及24小时后自动退款 2025-04-02 00:07:41 +08:00
lifizer d7ccd248b6 Refactor:删除多余的图片,减小打包体积 2025-04-01 14:23:22 +08:00
lifizer 84562cf6f1 Refactor(AI智能):采取分包 2025-04-01 14:13:57 +08:00
modendeveloper 1510d5e9d9 Fix:3416 【礼品功能】送礼页面手动删除数量后,该数量框显示空白,删除数量后,默认为1
(cherry picked from commit 68cfae2893)
2025-04-01 13:30:34 +08:00
modendeveloper f16793a06a Fix:3477 【商城小程序】开启了价格面议的商品价格区域需显示为【价格面议】(页面:搜索结果列表、商详页点击库存后弹出的规格弹窗、店铺详情页商品列表、商品收藏列表、商品足迹、文玩商品列表)
(cherry picked from commit 3bbd796a85)
2025-04-01 13:30:29 +08:00
modendeveloper 5d6ca1f03d Fix:3478 【商城小程序】所有店铺详情页(供应商店铺、特色店铺、农民店铺、 城市详情页)滑动时顶部导航颜色改为透明
(cherry picked from commit f2fba444a0)
2025-04-01 13:30:23 +08:00
modendeveloper 26b0ce03cd Fix:3170 【商城小程序】查看特色店铺详情页后返回该店铺类型列表,下滑刷新过程中会出现店铺重复展示的情况(以昆明的客栈/民宿、乡村游列表为例)
(cherry picked from commit 632886c81c)
2025-04-01 13:30:18 +08:00
modendeveloper 01028a85b0 Fix:3440 【商城小程序】我的订单—查看订单详情后返回未定位到该订单位置
(cherry picked from commit cf0c180efd)
2025-04-01 13:30:12 +08:00
modendeveloper b18b593afa Fix:3347 【商城小程序】送礼方买礼品后,现在没送出去就无法退款,要增加一个退款功能,以及24小时后自动退款
(cherry picked from commit 4333e8e76a)
2025-04-01 13:30:07 +08:00
modendeveloper 26145a1259 Fix:3347 【商城小程序】送礼方买礼品后,现在没送出去就无法退款,要增加一个退款功能,以及24小时后自动退款
(cherry picked from commit da929cfe3b)
2025-04-01 13:30:00 +08:00
modendeveloper 23dc945f43 Fix:3525 【供应链小程序】客服消息—在商城小程序端删除消息记录后,供应链小程序(商家端)的客服消息记录会跟着删除
(cherry picked from commit 4dcfa23a10)
2025-04-01 13:29:55 +08:00
modendeveloper b8ca3b66fb Fix:3531 【商城小程序】店铺选择界面调整,按钮改为红色色值:#BD3124
(cherry picked from commit 426348932f)
2025-04-01 13:29:50 +08:00
modendeveloper 6af66ec5e0 Fix:3537 【商城小程序】商详页输入商品数量超过3位或4位,数量显示效果需要优化
(cherry picked from commit 8728c6e738)
2025-04-01 13:29:45 +08:00
modendeveloper e21c4aa669 Fix:3385 【商城小程序】多份商品礼包显示已领取数量
(cherry picked from commit f2b6bc18e2)
2025-04-01 13:29:40 +08:00
modendeveloper a27c35ba2d Fix:3443 【商城小程序】个人主页--提现申请--提现记录增加暂无记录的提示
(cherry picked from commit 17810ee741)
2025-04-01 13:29:34 +08:00
modendeveloper 68cfae2893 Fix:3416 【礼品功能】送礼页面手动删除数量后,该数量框显示空白,删除数量后,默认为1 2025-04-01 12:55:36 +08:00
modendeveloper 3bbd796a85 Fix:3477 【商城小程序】开启了价格面议的商品价格区域需显示为【价格面议】(页面:搜索结果列表、商详页点击库存后弹出的规格弹窗、店铺详情页商品列表、商品收藏列表、商品足迹、文玩商品列表) 2025-04-01 12:40:53 +08:00
modendeveloper f2fba444a0 Fix:3478 【商城小程序】所有店铺详情页(供应商店铺、特色店铺、农民店铺、 城市详情页)滑动时顶部导航颜色改为透明 2025-04-01 12:05:05 +08:00
modendeveloper 632886c81c Fix:3170 【商城小程序】查看特色店铺详情页后返回该店铺类型列表,下滑刷新过程中会出现店铺重复展示的情况(以昆明的客栈/民宿、乡村游列表为例) 2025-04-01 11:57:48 +08:00
modendeveloper cf0c180efd Fix:3440 【商城小程序】我的订单—查看订单详情后返回未定位到该订单位置 2025-04-01 11:33:13 +08:00
modendeveloper 4333e8e76a Fix:3347 【商城小程序】送礼方买礼品后,现在没送出去就无法退款,要增加一个退款功能,以及24小时后自动退款 2025-04-01 11:27:08 +08:00
modendeveloper da929cfe3b Fix:3347 【商城小程序】送礼方买礼品后,现在没送出去就无法退款,要增加一个退款功能,以及24小时后自动退款 2025-04-01 11:27:01 +08:00
modendeveloper 4dcfa23a10 Fix:3525 【供应链小程序】客服消息—在商城小程序端删除消息记录后,供应链小程序(商家端)的客服消息记录会跟着删除 2025-04-01 11:08:58 +08:00
modendeveloper 426348932f Fix:3531 【商城小程序】店铺选择界面调整,按钮改为红色色值:#BD3124 2025-04-01 11:05:27 +08:00
modendeveloper 8728c6e738 Fix:3537 【商城小程序】商详页输入商品数量超过3位或4位,数量显示效果需要优化 2025-04-01 11:02:52 +08:00
modendeveloper f2b6bc18e2 Fix:3385 【商城小程序】多份商品礼包显示已领取数量 2025-04-01 10:57:47 +08:00
modendeveloper 17810ee741 Fix:3443 【商城小程序】个人主页--提现申请--提现记录增加暂无记录的提示 2025-04-01 10:31:51 +08:00
lifizer d1bc3cc351 Feat(云灵AI):对话接口对接完成 2025-03-28 15:15:14 +08:00
lifizer aaf2e74cbb Feat(云灵AI):对话接口对接完成 2025-03-27 18:26:26 +08:00
linxi d400c2c948 Merge branch 'dev' into test 2025-03-27 18:13:53 +08:00
lifizer 615b89c8a5 Feat(云灵AI):界面初始化 2025-03-27 18:12:48 +08:00
linxi 01c1a44a32 Fix:3131 【商城小程序】发布视频动态,上传视频时弹出“网络错误,请稍后再试”,点击发布可成功发布视频动态(安卓(小米,vivo)) 2025-03-27 17:08:47 +08:00
linxi c93d44a9ba Fix:3417 【商城小程序】订单详情页增加点击商品信息区域跳转商详页 2025-03-27 16:41:58 +08:00
linxi 3c187447c4 Fix:3433 【商城小程序】头像编辑--图片右下方的图片旋转及图片还原按钮图标显示不明确,点住才会有显示。加深图标颜色,使其更清楚。 2025-03-27 16:13:37 +08:00
linxi 6f881377b0 Fix:3442 【商城小程序】全国特产--搜索城市框不输入任何字段,无论当前在哪个城市,点击搜索会显示天津市 2025-03-27 16:05:22 +08:00
linxi f079db8fc0 Fix:3443 【商城小程序】个人主页--提现申请--提现记录增加暂无记录的提示 2025-03-27 16:00:40 +08:00
linxi a3693e6c9a Fix:3461 【商城小程序】接收某一个客服信息,会话页面存在聊天记录的会话均显示新信息的提示红点 2025-03-27 15:41:59 +08:00
linxi a43180b132 Fix:3461 【商城小程序】接收某一个客服信息,会话页面存在聊天记录的会话均显示新信息的提示红点 2025-03-27 15:41:29 +08:00
linxi ef4ce36eb2 Fix:3514 【商城小程序】店铺中商品名称过长,省略号后第三行仍会漏出部分字体 2025-03-27 15:23:02 +08:00
linxi 7c42efeb6b Fix:3529 【商城小程序】购物须知被遮挡 2025-03-27 15:04:17 +08:00
linxi 455b230931 Fix:3531 【商城小程序】店铺选择界面调整,按钮改为红色色值:#BD3124 2025-03-27 14:58:59 +08:00
linxi a267868890 Fix:3532 【商城小程序】店铺主页—切换登录店铺返回,再次进入店铺主页时未固定到选择店铺 2025-03-27 14:57:05 +08:00
linxi 36914c10b0 Task:多店铺选择 2025-03-25 18:32:28 +08:00
linxi a74f94a061 Task:多店铺选择 2025-03-25 11:48:30 +08:00
linxi 85b1a8f0f1 Task:多店铺选择 2025-03-24 18:13:19 +08:00
linxi a1182276a9 Task:热门词条样式控制 2025-03-20 16:32:48 +08:00
linxi a8f3e99d38 Task: 价格面议小程序端 2025-03-20 15:01:03 +08:00
linxi b148b7b869 Fix:3156 【商城小程序】客服消息--点击商品卡片跳转到商品详情页,在商品详情页中点击“客服”,聊天记录显示空白 2025-03-18 11:48:43 +08:00
linxi 89b94a71dc Fix:3343 【礼品】购买礼品数量,增加可以手动输入数字 2025-03-18 11:16:01 +08:00
linxi 4c76fedeb8 Fix:3339 【商城小程序】千县封面为视频时,功能指引文字偏下,往上移一点 2025-03-14 16:42:23 +08:00
linxi 8b3156630a Fix:3384 【商城小程序】“我的”页面从任一订单状态进入订单列表后,点击查看“全部”下的任意订单详情,返回后默认回到进入的状态列表页面 2025-03-14 14:35:45 +08:00
linxi 36fcb30879 Fix:3343 【礼品】购买礼品数量,增加可以手动输入数字 2025-03-14 14:23:08 +08:00
linxi d297245140 Fix:3344 【商城小程序】所有功能指引改为:点击整个屏幕即可下一步,跳过按钮不变 2025-03-14 11:56:11 +08:00
linxi eee5c0ae6f Fix:3346 【礼品】礼包领取状态,“查看订单详情”与“去商城看看”样式调整 2025-03-14 11:17:18 +08:00
linxi abe6d9af98 Fix:3349 【商城小程序】底部“加入购物车”一行样式增高 2025-03-14 11:07:46 +08:00
linxi 426410ffd1 Fix:3356 【礼品功能】礼包订单支付密码填写错误时的提示改为“支付密码不正确” 2025-03-14 10:59:37 +08:00
linxi 26b6c14141 Fix:3358 【商城小程序】商详页优惠券弹窗—无法取消勾选优惠券 2025-03-14 10:57:20 +08:00
modendeveloper 6b1dd27294 Fix:3197 【商城小程序】农民店铺资讯--第一次点击播放视频时浏览量增加2 2025-03-10 23:48:44 +08:00
modendeveloper 77bb949921 Fix:3322 【商城小程序】特产/文玩供应商入驻驳回后,商家资质数据在前端小程序消失 2025-03-10 23:36:16 +08:00
modendeveloper cbc313e8c5 Fix:3207 【商城小程序】供应商入驻页面—修改营业时间后点击【取消】按钮,营业时间也会被更改 2025-03-10 22:51:36 +08:00
modendeveloper b6a7c02e60 Fix:3219 【商城小程序】从商详页选择非最高减免金额优惠券,结算页面显示的优惠券信息是最高优惠券,与已选择的优惠券不对应 2025-03-10 22:45:52 +08:00
modendeveloper f7a8ba44a8 Fix:3349 【商城小程序】底部“加入购物车”一行样式增高 2025-03-10 22:28:26 +08:00
modendeveloper deb0be8eea Fix:3346 【礼品】礼包领取状态,“查看订单详情”与“去商城看看”样式调整 2025-03-10 22:24:11 +08:00
modendeveloper 7ce0c62131 Fix:3348 【商城小程序】首页搜索板块字体偏小,需放大 2025-03-10 22:04:41 +08:00
lifizer f631166047 Merge branch 'dev' into test 2025-03-06 21:30:11 +08:00
lifizer c6cc2758c9 Fix(礼品):领取领取礼品新增地址保存防抖处理 2025-03-06 21:10:17 +08:00
modendeveloper 45b8d065ae Fix:新增地址保存防抖处理 2025-03-06 20:53:58 +08:00
lifizer ed9ae77ead Feat(寻看点):增加逻辑判断,如果不是点击进入则强制跳转至首页 2025-03-06 09:49:24 +08:00
linxi 0fdee74098 Fix:指引按照正式版流程调整 2025-03-04 10:38:00 +08:00
linxi c7ec45b7e2 Fix:礼品价格 2025-03-04 10:24:15 +08:00
linxi 5dc01c9a3e Fix:去选择按钮去掉,箭头改到数字后面 2025-03-03 15:17:36 +08:00
linxi 38fde39aa7 Fix:礼品卡第一个跟最后一个重复显示了 2025-03-03 14:56:23 +08:00
linxi 754713282b Fix:删掉输入框内容后,输入框应该直接是空白的,不要显示浮动关键词 2025-03-03 14:21:58 +08:00
linxi f36bf5ca73 Fix:支付输入密码键被遮挡 2025-03-03 14:14:16 +08:00
linxi a02d6cc198 Fix:3313 【商城小程序】订单进入详情页显示无轨迹信息,点击查看后返回才显示轨迹信息 2025-03-03 13:57:53 +08:00
modendeveloper cb3ad8180d Fix:3155 【商城小程序】轮播图底部没有渐变效果(测试机型:苹果12)体验版有问题,正式版是正常的 2025-03-01 17:32:15 +08:00
modendeveloper d07fc96efc Fix:3292 【商城小程序】搜索页价格未超过5位数的不要换行 2025-03-01 17:16:34 +08:00
modendeveloper f8e83800bb Fix:3304 【商城小程序】特色店铺提交入驻,填写完资料提交后仍然出现入驻须知 2025-03-01 17:02:53 +08:00
modendeveloper 2df4d6f286 Fix:3284 【商城小程序】搜索页面—编辑搜索框内容时,浮动词条没有隐藏 2025-03-01 16:54:33 +08:00
modendeveloper e5e63f3e2f Fix:3284 【商城小程序】搜索页面—编辑搜索框内容时,浮动词条没有隐藏 2025-03-01 16:29:11 +08:00
modendeveloper e71826919c Fix:3320 【商城小程序】待发货订单申请退款,已退款页面无需显示物流信息,上一条bug只修复了退款中的页面 2025-03-01 16:16:58 +08:00
modendeveloper eefe6404e5 Fix:订单取消支付问题 2025-03-01 16:13:23 +08:00
linxi c3d6b25a5e Fix:3315 【礼品功能】待发货订单退款详情页不要显示物流信息 2025-02-28 16:03:30 +08:00
linxi 1baf5de741 Fix:订单不存在 2025-02-28 09:29:16 +08:00
modendeveloper aec2cfc207 Fix:3281 【礼品功能】赠礼商品支付时无法使用优惠券 2025-02-27 23:18:30 +08:00
modendeveloper 4d453fbd41 Fix:3271 【礼品功能】未实现礼品有地标好物,千县名品,康养食材,文玩商品属性时,默认选择专属礼品卡,所有商品默认都是通用礼品卡 2025-02-27 22:20:09 +08:00
modendeveloper 9a7456bdeb Fix:3296 【礼品功能】未登录状态,点击领取礼包,登录前闪过礼包已被领取的页面,登录后显示的是待领取状态 2025-02-27 22:06:08 +08:00
linxi b85a619027 Fix:3306 【礼品功能】礼品封面两边还要再低于中间,左右两边往下移,底部文字平行,顶部低于中间 2025-02-27 19:02:33 +08:00
modendeveloper 44798a564f Fix:收礼相关逻辑补充 2025-02-27 13:17:07 +08:00
modendeveloper 83a698185c Fix:收礼相关逻辑补充 2025-02-27 12:50:31 +08:00
modendeveloper e257419351 Fix:收礼相关逻辑补充 2025-02-27 12:39:36 +08:00
modendeveloper e56dca5b92 Fix:按钮问题 2025-02-26 22:29:14 +08:00
modendeveloper 84acc97e53 Fix:3303 【礼品功能】选择默认寄语,支付后的送礼包页面,赠言未显示默认寄语内容 2025-02-26 22:24:45 +08:00
linxi c964cf3376 Fix:3293 【礼品功能】礼品按钮位置布局按下图调整一下 2025-02-26 10:37:19 +08:00
linxi d3622f4cff Fix:3296 【礼品功能】未登录状态,点击领取礼包,登录前闪过礼包已被领取的页面,登录后显示的是待领取状态 2025-02-26 10:32:03 +08:00
linxi d6bc12d23a Fix:3299 【礼品功能】有转赠按钮,填写地址按钮会挤压变形 2025-02-26 10:05:38 +08:00
linxi cc1ceb2b4f Fix:3300 【礼品功能】填写地址领取礼包后弹窗报错信息 2025-02-26 10:03:51 +08:00
modendeveloper 8148f629de Fix:3282 【礼品功能】送礼包页面-送礼寄语未增加字数限制,页面优化调整 2025-02-25 23:55:37 +08:00
modendeveloper e092fe4d4c Fix:3278 【礼品功能】默认寄语赠送好友后,我的礼品卡页面未显示赠言 2025-02-25 23:41:01 +08:00
modendeveloper 6ac1b9d415 Fix:收礼相关逻辑补充 2025-02-25 23:37:43 +08:00
modendeveloper 12fa155630 Fix:收礼无法点击填写地址按钮 2025-02-24 21:42:50 +08:00
linxi 744e6d98f9 Fix:3246 【商城小程序】点击浮动关键词进入搜索页面,搜索框未固定显示该关键词 2025-02-24 18:06:49 +08:00
linxi 910991ad69 Fix:3255 【商城小程序】地址管理中修改默认地址后购物车默认地址未同步更改,下拉刷新小程序后才会更改 2025-02-24 17:42:24 +08:00
linxi 60e473db8a Fix:3261 【商城小程序】特色店铺资料填写完成后点击提交会再次出现入驻申请须知 2025-02-24 17:29:59 +08:00
linxi 281249830a Fix:3286 【礼品功能】礼包领取页面-调整商品图片,应与图片框贴合效果,圆角弧度需再缩小点 2025-02-24 17:22:14 +08:00
linxi 1319517a41 Fix:3289 【礼品功能】进入礼包商品详情页,礼包赠送区域会先闪烁后正常显示 2025-02-24 17:20:18 +08:00
linxi 6af05e705a Fix:3262 【礼品功能】每次领取礼品时输入新地址,都会把上一次保存的地址覆盖掉,设置新地址也要保留上一次的地址 2025-02-24 17:05:08 +08:00
linxi f9a89a7129 Fix:3262 【礼品功能】每次领取礼品时输入新地址,都会把上一次保存的地址覆盖掉,设置新地址也要保留上一次的地址 2025-02-24 17:01:26 +08:00
linxi 37be03f3ee Fix:3288 【礼品功能】送礼支付页面增加一个图片 2025-02-24 16:51:17 +08:00
linxi 20c50b8a26 Fix:3287 【礼品功能】收取礼品填写地址时输入超过11位手机号码也可领取成功 2025-02-24 16:32:11 +08:00
linxi b0613f3760 Fix:3285 【商城小程序】用户昵称有两行时,部分机型的【设置中心】按钮超出了红色区域(机型:苹果12) 2025-02-24 16:26:37 +08:00
linxi 89dcf74f17 Fix:3257 【商城小程序】搜索热销榜单中商品价格过长时会超出榜单底框显示 2025-02-24 15:48:43 +08:00
linxi 7c7ca84cd0 Fix:3275 【礼品功能】温馨提示的字体再小一号 2025-02-24 11:42:02 +08:00
linxi 7b543719e6 Fix:3282 【礼品功能】送礼包页面-送礼寄语未增加字数限制,页面优化调整 2025-02-24 11:40:51 +08:00
linxi f127123a62 Fix:3279 【礼品功能】选择封面交互形式优化,应该两边低于中间,而不是高于中间 2025-02-24 11:27:29 +08:00
linxi cd1a12ac6a Fix:3266 【礼品功能】已退回,已收货状态应该是灰色 2025-02-24 10:56:45 +08:00
modendeveloper 221de41cf3 Fix:送出礼品列表分享好友封面图字段调整 2025-02-23 23:46:09 +08:00
modendeveloper e20775c198 Task:。收礼逻辑,目前还缺收礼后再次查看,礼品的订单号,是否已经全部领取完字段 2025-02-23 23:39:13 +08:00
modendeveloper 3c0a91adb9 Fix:3266 【礼品功能】已退回,已收货状态应该是灰色 2025-02-23 23:28:31 +08:00
modendeveloper a95b30deaf Fix:3267 【礼品信息】此处赠言后面的文字,应该是送礼时填写的礼品信息 2025-02-23 23:24:58 +08:00
modendeveloper 61e1e2939f Fix:3268 【礼品功能】进入送礼页面,商品价格会变成0 2025-02-23 23:22:33 +08:00
modendeveloper cca0f24cbc Fix:3265 【礼品功能】收货信息整体往左移,左侧与按钮平行 2025-02-23 21:24:44 +08:00
modendeveloper 09ef536a37 Fix:3264 【礼品功能】当前规格库存不足时,点击送给朋友无响应,应提示:商品库存不足 2025-02-23 21:22:24 +08:00
modendeveloper 0f5f19d9a0 Task:礼品赠送/送礼、分享。收礼 2025-02-23 21:16:10 +08:00
modendeveloper aedc2fd768 Task:礼品赠送/送礼、分享。收礼 2025-02-22 19:20:33 +08:00
linxi f0a4a0edf9 Task:收礼相关接口 2025-02-21 18:25:34 +08:00
lifizer 425821ecf7 Feat(我的礼品卡):接口对接 2025-02-21 14:23:49 +08:00
modendeveloper e1328a7825 Task:礼品赠送/送礼、分享。收礼 2025-02-21 01:21:22 +08:00
lifizer 40207f11a1 Feat(我的礼品卡):接口对接 2025-02-20 13:40:17 +08:00
modendeveloper 1fbbbed4f0 Task:礼品赠送/送礼 2025-02-20 08:34:58 +08:00
linxi dbc31c72fb Task:送礼相关接口 2025-02-19 18:31:38 +08:00
modendeveloper 5dc1f5ad92 Task:礼品赠送/送礼 2025-02-17 23:36:27 +08:00
lifizer 044c1a0863 Feat(我的礼品卡):界面初始化 2025-02-17 21:43:48 +08:00
linxi fcab618a7e Task:礼品功能 2025-02-13 18:33:36 +08:00
linxi 9d1a8916fc Fix:3217 【商城小程序】按如下顺序调整一下首页的新手指引提示顺序 2025-02-12 18:26:55 +08:00
linxi f0abc1e87a Fix:3212 【商城小程序】首页千县功能指引“开始探寻”直接修改为“跳过”和“下一步”按钮 2025-02-12 18:25:37 +08:00
linxi 5ba5aff309 Fix:3217 【商城小程序】按如下顺序调整一下首页的新手指引提示顺序 2025-02-12 18:20:22 +08:00
linxi 6a66405a2f Fix:3217 【商城小程序】按如下顺序调整一下首页的新手指引提示顺序 2025-02-12 18:19:59 +08:00
linxi 2c325ad5b1 Fix:3177 【商城小程序】特产,文玩,特色店铺入驻,流程又被改回去了,没有先弹出入驻须知 2025-02-12 17:26:50 +08:00
linxi 2bc586d8b1 Fix:3022 【商城小程序】填写申请资料点击返回后再次进入,填写内容未保留(修复为填写内容仍然保留) 2025-02-12 17:26:12 +08:00
linxi b2388cf6c6 Fix:3192 【商城小程序】特色店铺入驻页面的营业时间点击无效,无法选择时间 2025-02-12 16:15:38 +08:00
linxi e45d9e1afc Fix:3175 【商城小程序】修改店铺页面的营业时间没有获取已经保存过的数据 2025-02-12 15:55:36 +08:00
modendeveloper ff205ec37f Fix:3131 【商城小程序】发布视频动态,上传视频时弹出“网络错误,请稍后再试”,点击发布可成功发布视频动态(安卓(小米,vivo))/ 调整响应超时配置 2025-01-26 20:28:58 +08:00
modendeveloper 7f5b1ad45c Fix:3116 【商城小程序】全国特产,搜索页面,右上角需要增加购物车按钮,右上角红点显示当前购物车商品数,点击进入购物车页面 2025-01-26 20:23:28 +08:00
modendeveloper 3d8bcb56d5 Fix:3181 【商城小程序】调整功能指引批注位置(机型:vivo x60 pro+) 2025-01-26 20:15:38 +08:00
modendeveloper 0802e6349e Fix:3172 【商城小程序】视频评论还是无法播放 2025-01-26 20:02:02 +08:00
modendeveloper 0372209000 Fix:3132 【商城小程序】店铺视频资讯内容无法显示,安卓(小米,vivo) 2025-01-26 17:32:49 +08:00
modendeveloper b0c019f50c Fix:3137 【商城小程序】产品--封面为视频的农民店铺列表页面未显示封面 2025-01-26 17:14:44 +08:00
modendeveloper 8e0caaca24 Fix:3011 【商城小程序】店铺主页发布动态中,简介输入字数超过140字时未弹出”字数超过限制“提示,且下方字数提示变化不正确 2025-01-26 17:08:15 +08:00
modendeveloper 6f3fa44385 Fix:3180 【商城小程序】已完成、已退款订单详情页中物流显示“暂无物流轨迹”,实际存在物流轨迹 2025-01-26 16:56:32 +08:00
modendeveloper 12c6b177bc Fix:3176 【商城小程序】特色店铺入驻页面的营业时间点击无效,无法选择时间 2025-01-26 16:34:20 +08:00
modendeveloper b532a8a675 Fix:3185 【商城小程序】消息输入字数过多会溢出消息框,超过五行的内容未显示 2025-01-26 16:15:19 +08:00
modendeveloper dbb95c9c10 Fix:3185 【商城小程序】消息输入字数过多会溢出消息框,超过五行的内容未显示 2025-01-26 16:10:24 +08:00
modendeveloper a8334b552c Fix::3182 【商城小程序】订单列表页面—待付款订单点击【立即付款】,顶部的订单类型导航栏会浮动在上层 2025-01-26 16:05:08 +08:00
modendeveloper 887206f1a9 Fix:3116 【商城小程序】全国特产,搜索页面,右上角需要增加购物车按钮,右上角红点显示当前购物车商品数,点击进入购物车页面 2025-01-23 02:13:23 +08:00
modendeveloper 0ace784593 Fix:3116 【商城小程序】全国特产,搜索页面,右上角需要增加购物车按钮,右上角红点显示当前购物车商品数,点击进入购物车页面 2025-01-23 02:13:16 +08:00
modendeveloper 37266a4e97 Fix:3144 【商城小程序】修改店铺资料页面没有营业时间 2025-01-23 01:35:40 +08:00
modendeveloper cd0a91fda5 Fix:3150 【商城小程序】特色店铺、采购批发商入驻流程未改变为先弹出入驻须知再填写资料 2025-01-23 01:18:20 +08:00
modendeveloper b27d2c97fb Fix:3150 【商城小程序】特色店铺、采购批发商入驻流程未改变为先弹出入驻须知再填写资料 2025-01-23 01:12:14 +08:00
modendeveloper 3a66811a52 Fix:[#3143]【商城小程序】供应商入驻资料填写页面—未填写营业时间也可以提交 2025-01-23 01:08:05 +08:00
modendeveloper 3f22aa26b7 Fix:3150 【商城小程序】特色店铺、采购批发商入驻流程未改变为先弹出入驻须知再填写资料 2025-01-23 00:23:28 +08:00
modendeveloper c71586fc1d Fix:3149 【商城小程序】店铺营业时间换到店主名称下方,并且店主名称往上移一点,空出的地方放营业时间 2025-01-23 00:15:56 +08:00
modendeveloper d1544978c5 Fix:3154 【商城小程序】搜索页面—搜索框无法手动输入内容(机型:苹果12。现在显示的数据是浮动词条的数据) 2025-01-23 00:04:08 +08:00
modendeveloper ba0312001b Fix:3151 【商城小程序】点击搜索框处的放大镜不会直接跳转浮动词条对应搜索结果页面,并且搜索框及按钮变长了 2025-01-22 23:59:14 +08:00
modendeveloper f0aa415852 Fix:3153 【商城小程序】全部列表中待收货订单和待收货列表含有“查看物流”键,已完成订单详情页中也有“查看物流”键,需要隐藏 2025-01-22 23:55:35 +08:00
modendeveloper 3d3f8309d1 Fix:3157 【商城小程序】已完成,已退款状态订单也需要显示物流信息 2025-01-22 23:53:41 +08:00
modendeveloper b1a1e5aae0 Fix:3152 【商城小程序】消息板块功能指引框选位置调整(苹果12) 2025-01-22 23:37:23 +08:00
modendeveloper 0691844ee9 Fix:3158 【商城小程序】从消息列表中进入对话与从商品详情页中进入对话,商家的名称不一致(统一为商户名称) 2025-01-22 23:09:16 +08:00
modendeveloper edc79a2b42 Fix:3159 【商城小程序】滑动待收货、待评价订单列表,“更多”按钮浮在订单分类名称上 2025-01-22 23:02:14 +08:00
modendeveloper 3dd6d53f90 Fix:3168 【商城小程序】搜索词过长时,历史搜索词条显示不全 2025-01-22 23:00:13 +08:00
modendeveloper 81c89f5076 Fix:2983 【商城小程序】被下架的商品在购物车中消失(改为前端数据保留,点击时提醒商品已下架或被删除) 2025-01-22 01:56:24 +08:00
modendeveloper 15619b00ff Fix:2983 【商城小程序】被下架的商品在购物车中消失(改为前端数据保留,点击时提醒商品已下架或被删除) 2025-01-22 01:55:12 +08:00
modendeveloper 63526f4f06 Fix:3011 【商城小程序】店铺主页发布动态中,简介输入字数超过140字时未弹出”字数超过限制“提示,且下方字数提示变化不正确 2025-01-22 01:48:10 +08:00
modendeveloper cab0577e03 Fix:3105 【商城小程序】特产/文玩供应商、特色店铺、采购批发商入驻,填写错误验证码,点击提交申请确认申请须知后才会提示 2025-01-22 01:43:23 +08:00
modendeveloper b19ba34db2 Fix:3141 【商城小程序】订单多物流情况下,查看物流详情页中只显示一个物流信息,隐藏底部的查看物流按钮 2025-01-22 01:33:20 +08:00
modendeveloper a96c3759b9 Fix:3124 【商城小程序】寻趣味板块新手引导框选位置调整 2025-01-22 01:23:09 +08:00
modendeveloper 2a3ca96fa0 Fix:3118 【商城小程序】新手引导框选范围需要调整 2025-01-22 01:18:41 +08:00
modendeveloper 626e747049 Fix:3114 【商城小程序】首页及搜索页面搜索框没有显示浮动词条 2025-01-22 01:15:10 +08:00
modendeveloper 94536b0876 Fix:3135 【商城小程序】目前有古镇无店铺的城市,仍然显示了暂无店铺 2025-01-22 00:31:56 +08:00
modendeveloper 3d6a2785d5 Fix:3119 【商城小程序】用户点击商品卡片不会跳转到对应的商品详情页 2025-01-22 00:26:39 +08:00
modendeveloper 5177f5881a Task:消息页改版 2025-01-22 00:00:06 +08:00
modendeveloper e53d0e4f4d Fix:3107 【商城小程序】地标好物角标图片换成这张 2025-01-21 01:19:44 +08:00
modendeveloper 32881769ed Fix:3115 【商城小程序】全国特产需要增加购物车按钮,并可以点击加入购物车 2025-01-21 00:54:51 +08:00
modendeveloper 8020afc339 Fix:3123 【商城小程序】店铺没有显示店铺营业时间 2025-01-21 00:29:44 +08:00
modendeveloper 4e28ef3d37 Fix:3122 【商城小程序】填写入驻申请资料页面没有店铺营业时间 2025-01-21 00:15:37 +08:00
modendeveloper a6816e1469 Fix:3133 【商城小程序】没有显示最后一个店铺类型 2025-01-20 23:04:51 +08:00
modendeveloper 1dd7b1e3b1 Fix:3120 【商城小程序】切换城市页面,弹出“无效的guidename” 2025-01-20 23:00:22 +08:00
modendeveloper a3a0d0c833 Task:物流拆分 2025-01-20 22:56:20 +08:00
modendeveloper b07e967e23 Fix:3022 【商城小程序】填写申请资料点击返回后再次进入,填写内容未保留(修复为填写内容仍然保留) 2025-01-19 22:11:27 +08:00
modendeveloper e18a5e5c70 Fix:3023 【商城小程序】店铺名称超过15个字,店铺logo显示会发生不同程度的压缩 2025-01-19 22:00:06 +08:00
modendeveloper f74f6e3b49 Fix:3024 【商城小程序】古镇名称超过13个字的内容会被分享键遮挡(预留分享键的空间进行换行 2025-01-19 21:37:20 +08:00
modendeveloper f80d58ef3d Fix:3024 【商城小程序】古镇名称超过13个字的内容会被分享键遮挡(预留分享键的空间进行换行 2025-01-19 21:36:43 +08:00
modendeveloper 4dea0cd681 Fix:3061 【商城小程序员】商品资质供应商名称中部分字母显示不全 2025-01-19 21:30:20 +08:00
modendeveloper 6685638c54 Fix:3094 【商城小程序】多规格商品点击购物车图标并加购成功后,再次点击购物车图标打开规格选择页面,购买数量会保留上一次的值 2025-01-19 21:24:16 +08:00
modendeveloper bd2338f16a Task:指引功能/状态接口对接 2025-01-19 02:52:58 +08:00
linxi 85854ea2f6 Task:指引页/ 图片定位完成 2025-01-18 16:45:06 +08:00
modendeveloper ec33f6f4c0 Task:指引功能 2025-01-18 12:32:13 +08:00
linxi f3be581278 Task:指引页 2025-01-17 18:17:30 +08:00
lifizer 50dab652e9 Feat(搜索):排行榜和热门配置对接 2025-01-17 16:49:59 +08:00
linxi 30c2d18412 Task:指引页 2025-01-16 18:09:07 +08:00
modendeveloper c6ff84ca5d Task:指引功能 2025-01-16 00:33:42 +08:00
linxi f19ac9ad42 Task:订单提交页面优化/ 提交订单前,若在商品详情页选择了优惠券,则提交订单页面删除该按钮 2025-01-15 18:16:01 +08:00
modendeveloper 46b858b700 Task:点击购物车图标加入购物车 2025-01-14 23:42:33 +08:00
linxi f8b6d72a59 Task:商品足迹增加商品名称 2025-01-14 15:50:04 +08:00
modendeveloper 4bc50aac9c Task:选择城市,搜索按钮颜色调整 2025-01-13 22:43:06 +08:00
modendeveloper 432177604f Task:商城详情优惠券增加关闭按钮 2025-01-13 22:36:58 +08:00
modendeveloper daf0ed691e Fix:2987 【商城小程序】寻趣味分类,古镇应该始终固定在左侧,现在往右滑动会把古镇分类挤掉,详情见视频附件 2025-01-08 22:03:19 +08:00
modendeveloper a24bfb2ff2 Fix:3011 【商城小程序】店铺主页发布动态中,简介输入字数超过140字时未弹出”字数超过限制“提示,且下方字数提示变化不正确 2025-01-08 21:23:47 +08:00
modendeveloper dc8069bca1 Fix:3002 【商城小程序】优化评论列表中多个视频不能同时播放,播放下一个视频自动暂停前一个正在播放的视频 2025-01-08 21:17:56 +08:00
modendeveloper 02627db525 Fix:3010 【商城小程序】申请店铺入驻,填写资料返回或点击撤销店铺申请,再次进入,填写的资料未保留(修复为资料仍然保留) 2025-01-08 21:05:42 +08:00
modendeveloper 4a929f4b32 Fix:2999 【商城小程序】在当前页面增减商品数量,关闭规格选择后再次打开,商品数量显示为1,点击增减,商品数量变为在之前填写的数量基础上增减 2025-01-08 20:49:09 +08:00
modendeveloper ed006c46c5 Fix:2988 【商城小程序】所有县城的租售资讯--增加“全部”分类,首次进入页面时,默认显示“全部”分类,展示所有店铺 2025-01-08 20:05:08 +08:00
modendeveloper 77953ad6fe Fix:2986 【商城小程序】寻趣味暂无店铺标识,之前改为有此标识也开放为可以进入页面,现在还要按如下方式修改一下规则 2025-01-08 19:56:20 +08:00
modendeveloper 09b677d593 Fix:2984 【商城小程序】我的收藏--被下架的商品在商品收藏中消失(改为前端数据保留,点击时提醒商品已下架或被删除) 2025-01-08 19:42:25 +08:00
modendeveloper 3ea76f4081 Fix:2983 【商城小程序】被下架的商品在购物车中消失(改为前端数据保留,点击时提醒商品已下架或被删除) 2025-01-08 19:33:12 +08:00
lifizer b265382c2e Merge branch 'dev' into test 2024-12-30 11:46:59 +08:00
linxi 0bb76095fb Fix:2975 【商城小程序】产业--租售资讯下三级分类标签需要调整放大,参考效果图,把按钮高度再加一点 2024-12-27 18:05:06 +08:00
linxi cd4bef91c2 Fix:2958 【商城小程序】点击“换一换”,浏览店铺列表出现重复店铺数据 2024-12-27 17:24:16 +08:00
linxi cc2664f116 Fix:2959 【商城小程序】先播放古镇活动版块视频,再播放主图视频,活动版块视频不会暂停 2024-12-27 17:06:24 +08:00
linxi 71aa5e5a3c Fix:2975 【商城小程序】产业--租售资讯下三级分类标签需要调整放大,参考效果图,把按钮高度再加一点 2024-12-27 16:54:54 +08:00
lifizer febca80a9b Fix(寻趣味):[#2971]页面标题替换 2024-12-27 11:56:34 +08:00
lifizer 851bcb16d7 Fix(订单/详情):[#2965]订单详情页点击复制快递单号,粘贴以后会变成订单号 2024-12-27 11:55:45 +08:00
lifizer 20a46f10dc Fix(寻趣味):[#2970]图标替换 2024-12-27 11:55:13 +08:00
lifizer 4a449485f7 Fix(全国特产/城市选择):[#2972]全国特产的特别推荐处店铺视频封面图未显示 2024-12-27 11:43:10 +08:00
modendeveloper 8aa2454a1a Task:村屋多加一级分类 2024-12-26 23:30:30 +08:00
modendeveloper 0ceb016e20 Fix:2966 【商城小程序】特色礼品主页中的商品设置低于3个,商品名称过长时,商品名称不会对应图片宽度换行显示 2024-12-26 19:56:19 +08:00
modendeveloper 8b93ab3c18 Fix:2963 【商城小程序】城市切换提示--提示框效果优化 2024-12-26 19:46:36 +08:00
modendeveloper 3c897506d2 Fix:2950 【商城小程序】非遗文化店铺封面为视频时显示空白 2024-12-24 23:35:18 +08:00
modendeveloper c7fc52d5c3 Fix:2949 【商城小程序】优惠详情中无更多可使用券时增加提示“暂无更多可使用券,快去抽奖吧~” 2024-12-24 23:07:00 +08:00
modendeveloper 403e8d1e3f Fix:2943 【商城小程序】项目-店铺列表页面封面视频无需播放,显示封面即可 2024-12-24 22:56:47 +08:00
modendeveloper 7672f8a309 Fix:2946 【商城小程序】古镇主图视频增加播放/暂停按钮 2024-12-24 22:54:04 +08:00
modendeveloper 5994f5dba4 Fix:2947 【商城小程序】活动内容为视频时,优化视频框,参考店铺视频资讯 2024-12-24 22:46:17 +08:00
modendeveloper 3639c2d04f Fix:2951 【商城小程序】之前寻趣味城市无店铺时,无法点击进入详情页,现在解除这个限制,无店铺也可以点进去,不然看不了古镇 2024-12-24 22:27:49 +08:00
modendeveloper 7f459e2b99 Fix:2948 【商城小程序】推荐店铺-页面下滑刷新店铺数据后,点击“换一换”,店铺数据显示不全且再次点击“换一换”无效 2024-12-24 22:27:29 +08:00
linxi 69d866e6ce Fix:2873 【商城小程序】县城详情页,改为一个商品,一个店铺,错开排列,每行固定一个商品,一个店铺 2024-12-24 11:34:27 +08:00
linxi 37117598ea Fix:2874 【商城小程序】农民店铺标识,改为下图所示的框 2024-12-24 11:10:48 +08:00
linxi 34ff7c403a Fix:2909 【商城小程序】商品价格过长时,商品足迹内商品价格信息显示异常 2024-12-24 10:50:10 +08:00
linxi 420a14f6d9 Fix:2826 【商城小程序】农民店铺无法取消收藏,收藏时点取消图标未变更 2024-12-24 10:26:16 +08:00
linxi a9b63ca251 Fix:2922 【地标好物】多个视频资讯改为不能同时播放 2024-12-24 10:18:56 +08:00
linxi 2b12a03703 Fix:2898 【商城小程序】点击1-3次“换一换”后继续点击无效 2024-12-23 09:20:26 +08:00
linxi 81c82aca50 Fix:2901 【商城小程序】“请上传店铺视频方面”改为“请上传店铺视频封面” 2024-12-23 09:18:14 +08:00
modendeveloper 78c83ecaa3 Fix:2903 【商城小程序】农民店铺、村屋租售,寻趣味店铺,视频资讯播放中再点击视频封面播放,两者会出现同时播放情况 2024-12-19 23:59:15 +08:00
modendeveloper b133d0132c Fix:2908 【商城小程序】搜索结果--商品价格过长时商品原价超出商品框 2024-12-19 23:41:46 +08:00
modendeveloper 555d2babde Fix:2905 【非遗文化】非遗标题名称的文字区域再延长一点,延长至红框范围 2024-12-19 23:03:20 +08:00
modendeveloper 0b4cb9696e Fix:2863 【寻趣味】配置活动删除时间插件,活动时间改为纯文本输入框 2024-12-19 23:00:37 +08:00
modendeveloper 104d0ef4e1 Fix:2864 【管理后台】古镇等级设置,后台改为纯文本输入,前端标识根据文本显示 2024-12-19 00:32:33 +08:00
modendeveloper 020bdadcae Fix:2876 【管理后台】地标好物资讯增加上传视频功能,前端地标好物资讯也需要调整为可以显示视频 2024-12-19 00:26:18 +08:00
modendeveloper ffa827c137 Fix:2858 【寻趣味】古镇内容按城市划分配置显示 2024-12-19 00:25:54 +08:00
modendeveloper 6a3445a0cc Fix:2881 【千县名品】千县,县城资讯需要增加上传视频功能 2024-12-19 00:14:12 +08:00
modendeveloper 97c7fda9bb Fix;2883 【寻趣味】活动时间要另起一行,不能跟资讯连在一起 2024-12-18 23:41:43 +08:00
modendeveloper 78e0937fca Fix:多视频只能播放一个 2024-12-18 23:34:57 +08:00
modendeveloper 27c95042d4 Fix:2887 【商城小程序】村屋资讯-多个视频资讯可同时播放(优化为点击下一个视频播放时,上一个视频自动停止) 2024-12-18 23:23:47 +08:00
modendeveloper 40431f03fc Fix:2886 【商城小程序】农民店铺-多个视频资讯可同时播放(优化为点击下一个视频播放时,上一个视频自动停止) 2024-12-18 23:18:33 +08:00
modendeveloper f64f87546e Fix:2889 【商城小程序】优化当寻趣味店铺封面为视频时,视频资讯和视频封面不能同时播放 2024-12-18 23:18:12 +08:00
modendeveloper f174a83ac0 Fix:2889 【商城小程序】优化当寻趣味店铺封面为视频时,视频资讯和视频封面不能同时播放 2024-12-18 22:48:08 +08:00
modendeveloper 01dc1711ca Fix:2882 【非遗文化】非遗主推荐,需要进行自动往右持续轮播 2024-12-18 22:38:35 +08:00
modendeveloper e0dac0207b Fix:2885 【商城小程序】养生食材,轮播推荐触控区域改为整张图片 2024-12-18 22:34:14 +08:00
modendeveloper c2901522ac Fix:2884 【商城小程序】养生圣地,轮播推荐触控区域改为整张图片 2024-12-18 22:34:02 +08:00
modendeveloper 426ca24f51 Fix:2878 【寻趣味】古镇详情页--去除古镇名称下方虚线 2024-12-18 22:29:49 +08:00
modendeveloper b687d3737a Fix:2877 【寻趣味】古镇详情页--项目--店铺封面为视频时,项目列表店铺未显示封面 2024-12-18 22:28:47 +08:00
modendeveloper 0b0abdfad8 Fix:2880 【寻趣味】古镇详情页--分享按钮位置调整,往下移一点 2024-12-18 22:21:47 +08:00
modendeveloper 99676adb48 Fix:2879 【寻趣味】古镇详情页--活动内容为视频时无法显示视频 2024-12-18 22:17:58 +08:00
modendeveloper f2f2528316 Fix:2891 【商城小程序】封面【播放/暂停键】点击范围不明确,响应不灵敏,把播放/暂停触控区域再加大一些 2024-12-18 22:10:26 +08:00
modendeveloper 9d2c99507c Fix:2890 【商城小程序】顶部名称更换“非遗技艺” 2024-12-18 21:17:44 +08:00
modendeveloper 9092d0d73d Fix:2851 【商城小程序】非遗详情页分类1图片名称去除书名号,文字过长时换行显示,最多显示2行文字,超出... 2024-12-17 22:12:14 +08:00
modendeveloper 8e8ca5a261 Fix:2797 【商城小程序】根据运营设计的调整,非遗主页的省名删除,只显示图片 2024-12-17 22:10:14 +08:00
modendeveloper eddb02d2cf Feat:分享接口对接&&换一换接口对接 2024-12-14 21:56:37 +08:00
linxi b535e21e2f Feat: 寻趣味接口对接(缺分享接口,店住名称字段) 2024-12-13 16:04:25 +08:00
linxi 50cbe66332 Feat: 寻趣味改版(新增古镇模块) 2024-12-12 18:06:03 +08:00
linxi 07bccb8b68 Feat:解除店铺入住图片数量限制 2024-12-04 14:39:26 +08:00
lifizer 89f33882b5 Merge branch 'dev' into test 2024-12-04 14:01:51 +08:00
lifizer c5c9c9146b Fix(购物车&订单):修复地址选择之后事件分发错误问题 2024-12-04 12:03:32 +08:00
linxi c0a09ad449 Fix:2742 【商城小程序】购物车页面修改地址后,定位没有相应的修改 2024-12-04 09:32:12 +08:00
linxi 5112f3314b Fix:2743 【地标好物】服务页面的【客服】文字改为【咨询】 2024-12-04 09:32:01 +08:00
lifizer b225e107e5 Eslint code 2024-12-03 09:51:31 +08:00
lifizer 21a80c6434 Fix(千县名品&寻趣味):[#2740]分享图片的头像变形了 2024-12-03 09:22:07 +08:00
modendeveloper 1a0957f4bb Merge branch 'dev' of https://gitee.com/fengyuze178/xdd-uniapp-new into dev 2024-12-02 18:40:10 +08:00
modendeveloper de6cca5bac Style:分享图片css调整 2024-12-02 18:39:45 +08:00
lifizer 10cbf5ef03 Merge branch 'dev' into test 2024-12-02 10:37:54 +08:00
lifizer 5f0f961220 Chore:代码格式化 2024-12-02 10:23:48 +08:00
lifizer 1f1c114eda Conf:关闭调试模式 2024-12-02 10:23:17 +08:00
modendeveloper f65c033bd7 Feat:分享调整 2024-11-30 18:56:59 +08:00
modendeveloper fc47a981f9 Feat:千县城市分享 2024-11-30 12:20:20 +08:00
lifizer 088f3ea370 Conf(拦截器):设置超时时长为2分钟 2024-11-29 15:43:14 +08:00
lifizer e48762c783 Fix(首页):未校验返回数据的合法性导致界面渲染错误 2024-11-29 15:32:14 +08:00
lifizer 5813924548 Conf(拦截器):修正异常捕获返回的局部变量错误导致逻辑执行异常 2024-11-29 15:13:55 +08:00
linxi 8a9862126b Fix:vivo手机兼容 2024-11-29 11:44:42 +08:00
linxi 6c44e3eb53 Feat:新品商品轮播速度调整 2024-11-29 11:44:29 +08:00
linxi ea71e61451 Fix:2734 【商城小程序】千县—农民店铺和商品封面显示优化,店铺图片封面要铺满底板边缘 2024-11-29 11:01:25 +08:00
linxi 9353aad39f Fix:2585 【商城小程序】购物车--商品数量增减超出库存或少于最低拿货数时,增加提示“商品数量超出库存”和“商品数量不能减少了呦~” 2024-11-29 10:13:30 +08:00
linxi 952a332ba1 Fix:2733 【商城小程序】默认物流地址在列表中删除/修改后购物车定位和订单默认地址未同步刷新,应该删除以后直接刷新 2024-11-29 10:01:23 +08:00
linxi b9b1a4aa30 Fix:2734 【商城小程序】千县—农民店铺和商品封面显示优化,店铺图片封面要铺满底板边缘 2024-11-29 09:46:22 +08:00
linxi 52946a4afe Fix:2735 【商城小程序】千县—农民店铺文化图片显示优化 2024-11-29 09:45:59 +08:00
linxi e0588d2ecb Feat: 新品专区商品封面调整 2024-11-28 18:16:28 +08:00
linxi d676a9e496 Fix:2721 【新品专区】商品和背景图增加同时自动轮播效果,自动轮播时是一个整体,5秒轮播一次,轮播效果查看视频 2024-11-28 17:01:32 +08:00
linxi 2d6d6cf90c Fix:2732 【新品专区】轮播图后面的两个商品区域再缩小一点 2024-11-28 16:54:32 +08:00
linxi 329adbd287 Fix:2730 【商城小程序】千县—农民店铺封面角标显示优化 2024-11-28 16:32:28 +08:00
linxi 370e347b93 Fix:2729 【非遗技艺】非遗文化自动轮播不稳定(刚才可以自动轮播,现在又不可以了) 2024-11-28 16:23:51 +08:00
linxi 9fc2579247 Fix:2725 【商城小程序】千县—农民店铺封面为视频应该显示第一帧作为封面图,并且不要显示播放按钮 2024-11-28 16:21:28 +08:00
linxi 972f5ba027 Fix:2723 【非遗技艺】搜索后切换分类,轮播区域数据没有根据搜索词条进行展示,改为搜索以后,切换分类时也保留搜索结果 2024-11-28 16:11:19 +08:00
linxi ac10ea7a4f Fix:2722 【非遗技艺】点击跳转的触控区域,放大到整个图片 2024-11-28 16:08:54 +08:00
linxi 3d2924fbd3 Fix:2721 【新品专区】商品和背景图增加同时自动轮播效果,自动轮播时是一个整体,5秒轮播一次,轮播效果查看视频 2024-11-28 16:04:37 +08:00
linxi 4dbd30aad5 Fix:2717 【地标好物】产品--无商品时不显示“已经到底啦”,改为显示暂无数据 2024-11-28 15:52:59 +08:00
linxi 11eca54e21 Fix:2718 【商城小程序】首页寻看点素材图标需要放大一点,视频可以自动播放 2024-11-28 15:42:33 +08:00
linxi 8c1fdba140 Style:分享/保存图片按钮样式调整 2024-11-28 09:25:05 +08:00
linxi feb314d279 Fix:节日专题位置被占用问题 2024-11-27 16:34:58 +08:00
linxi a104473e86 Fix:2712 【地标好物】地标好物分享图片下方增加一个保存图片按钮,点击后直接保存图片,替换掉长按保存图片功能 2024-11-27 16:19:08 +08:00
linxi d0fd7cb653 Fix:2707 【非遗文化】手机型号:iQOO neo7SE--非遗文化详情页分类2的店铺,一句话介绍超出两行时的显示效果需要优化 2024-11-27 15:54:21 +08:00
linxi 5a7a5831b0 Fix:2709 【商城小程序】千县暂无资讯增加暂无内容图片提示 2024-11-27 15:28:27 +08:00
linxi 7379cbd052 Fix:2708 【地标好物】暂无商品改为暂无内容图片 2024-11-27 15:23:27 +08:00
linxi 3cc41c3c34 Fix:2711 【非遗文化】非遗列表页面搜索功能需要对轮播区域生效 2024-11-27 15:14:10 +08:00
linxi 80ba906630 Fix:2706 【非遗文化】非遗列表页面的非遗名称字体加粗 2024-11-27 15:07:46 +08:00
linxi 53b52d71d3 Fix:2568 【商城小程序】店铺主页-修改资料、商户入驻-店铺图片、管理后台编辑店铺图片,解除上传图片数量限制(原先是限制最多上传9张) 2024-11-27 15:04:44 +08:00
linxi 99ac5f04ed Fix:2563 【商城小程序】千县—农民店铺封面为视频时未显示,需要显示视频第一帧作为封面 2024-11-27 14:59:05 +08:00
linxi 8d29cb777f Fix:2697 【地标好物】扫二维码需要直接进入相应的省份 2024-11-27 10:54:48 +08:00
linxi a302f11b95 Fix:2697 【地标好物】扫二维码需要直接进入相应的省份 2024-11-27 09:26:00 +08:00
linxi b536f2ad68 Fix:2696 【非遗文化】点击未设置链接的顶部海报无需跳转页面,否则会报错 2024-11-27 09:17:04 +08:00
linxi 3944c961d9 Fix:2695 【非遗文化】非遗未显示推荐数据 2024-11-27 09:13:56 +08:00
linxi 338c63d634 Fix:新品专区轮播图不自动播放 2024-11-26 17:47:48 +08:00
linxi 6a58bf6e45 Fix:2702 【商城小程序】千县—农民店铺详情展示效果与设计图不一致,需要调整一下 2024-11-26 17:47:26 +08:00
linxi b7b23ddab4 Fix:2703 【商城小程序】千县—农民店铺详情点击收藏图标提示“店铺已收藏”,但收藏数量和图标颜色无变化 2024-11-26 17:45:50 +08:00
linxi afd678135d Fix:新品专区背景图同步商品 2024-11-26 15:15:18 +08:00
linxi 8c392f1d57 Fix:2688 【地标好物】文化图片查看大图时增加左右滑动查看 2024-11-26 15:03:26 +08:00
linxi f4cfeb37e8 Fix:2562 【商城小程序】千县—点击进入农民店铺链接数据显示混乱 2024-11-26 14:42:40 +08:00
linxi 0ac3babdd2 Fix:2685 【新品专区】新品专区轮播图,改为每个商品对应上传一个背景图片,因为前端左右滑动商品,背景图需要同步切换 2024-11-26 09:45:21 +08:00
linxi faf51f7c6f Fix:2687 【地标好物】分享图片设置为圆角 2024-11-25 17:09:35 +08:00
linxi 78c13fe05c Fix:2683 【商城小程序】团队管理中搜索不存在会员时增加提示 2024-11-25 17:03:47 +08:00
linxi dcf15eeb54 Fix:2693 【非遗文化】【关闭】状态的省份图标及名称不会变灰,与管理后台展示的效果不一致 2024-11-25 16:54:20 +08:00
linxi 6aced33e45 Fix:2694 【非遗文化】【开启】状态的省份点击无反应 2024-11-25 16:47:54 +08:00
linxi f1460485d3 Fix:2499 【商城小程序】寻趣味,查看店铺详情后返回列表后会出现频闪 2024-11-25 16:43:25 +08:00
linxi 141fbaa330 Fix:2568 【商城小程序】店铺主页-修改资料、商户入驻-店铺图片、管理后台编辑店铺图片,解除上传图片数量限制(原先是限制最多上传9张) 2024-11-25 16:32:40 +08:00
linxi 33d8e42c6f Fix:2534 【商城小程序】千县--未登录时点赞或收藏千县店铺会跳出“非法访问”提示,随后跳转登录页面(去除”非法访问“提示) 2024-11-25 16:23:22 +08:00
linxi 7512d21e75 Fix:2629 【商城小程序】商品评价和店铺资讯超过140字时限制输入无提示,再次输入内容,发表结果会显示再次输入内容的最后两个字/ 商品评价 2024-11-25 11:49:16 +08:00
modendeveloper 74dbbd0a90 Fxi:2449 【商城小程序】寻迹千县-店铺,当资讯、攻略无内容时,提示信息改为暂无资讯/暂无攻略 2024-11-24 16:37:22 +08:00
modendeveloper 1a773023c1 Fix:2584 【商城小程序】商家资质--商品详情页中查看商家资质,名称过长时,左侧“”商家名称“”标题不要换行 2024-11-24 16:31:23 +08:00
modendeveloper 33425987f7 Fix:2629 【商城小程序】商品评价和店铺资讯超过140字时限制输入无提示,再次输入内容,发表结果会显示再次输入内容的最后两个字 2024-11-24 16:28:20 +08:00
modendeveloper 862e624913 Fix:2630 【商城小程序】地标好物增加分享按钮,点击后弹出分享图片 2024-11-24 16:10:14 +08:00
modendeveloper a8bdcd5495 Fix:2641 【地标好物】服务--导航和客服按钮无效 2024-11-24 15:27:25 +08:00
modendeveloper 82b8e53aee Fix:2643 【地标好物】切换到无数据的省份,项目-企业推荐和服务内容会同步上一个省份内容 2024-11-24 15:19:00 +08:00
modendeveloper c484d20cb2 Fix:2649 【非遗文化】【推荐】没有根据类目的切换进行联动变更 2024-11-24 14:49:18 +08:00
modendeveloper 909f462aa1 Fix:2682 【非遗文化】非遗列表页面顶部海报无法自动轮播(只有一张时无需轮播,配置两张及以上时需自动轮播) 2024-11-24 14:37:05 +08:00
modendeveloper 989c0be025 Fix:2652 【非遗文化】点击已设置链接的顶部海报,页面未跳转 2024-11-24 14:36:01 +08:00
modendeveloper 2166597ac8 Fix:2660 【非遗文化】非遗详情页此处应显示店铺的一句话介绍 2024-11-24 14:28:36 +08:00
modendeveloper 0398404f4b Fix:2669 【非遗文化】非遗的名称背景半透明范围再扩大一点,覆盖到名称 2024-11-24 14:25:57 +08:00
modendeveloper 9b90323f27 Fix:2670 【地标好物】项目--政策--文件名称过长时改为换行显示,换行时右侧>图标上下居中(不要省略号) 2024-11-24 14:22:27 +08:00
modendeveloper 453bb23186 Fix:2671 【地标好物】产品和资讯底部的“已经到底了”提示未居中(咨询) 2024-11-24 14:19:19 +08:00
modendeveloper 398a8a40a0 Fix:2672 【非遗技艺】查看大图时,增加左右滑动对图片翻页的功能 2024-11-24 14:16:12 +08:00
modendeveloper a900bc4c1b Fix:2675 【非遗文化】非遗详情页顶部视频自动播放后没有暂停按钮,增加点击视频暂停功能,并且暂停时中间放一个播放按钮,再次点击后继续播放 2024-11-24 14:13:05 +08:00
modendeveloper 2c27ec6f8f Fix:2674 【地标好物】产品和资讯底部的“已经到底了”提示未居中 2024-11-24 13:50:09 +08:00
linxi 87027d9d4e Fix:2604 【商城小程序】抽奖--双击“立即抽奖”,获得奖品两个,只弹出一个抽奖结果,应该限制快速多次点击时只抽一次奖,抽奖动画完成之前不管点多少次,都不能快速触发下一次抽奖 2024-11-21 09:28:33 +08:00
linxi 265507014e Fix:2557 【商城小程序】食补推荐列表商品图显示不完整 2024-11-20 17:39:14 +08:00
linxi 3625a45e2c Fix:2621 【商城小程序】订单详情—再买一单,修改收货地址确认框弹出之前地址已修改,点取消修改无法取消 2024-11-20 17:18:12 +08:00
linxi 0bdcae5d00 Fix:2559 【商城小程序】从文玩城市选择界面跳转到展会页面的顶部标题“康养旅居”改为“文玩艺术” 2024-11-20 17:18:03 +08:00
linxi 7f4cefda3b Fix:2578 【商城小程序】寻趣味顶部,改成:探索生活好去处 2024-11-20 17:08:56 +08:00
linxi de308dfa68 Fix:2617 【商城小程序】前端小程序中资讯显示的时间应为发布时间 2024-11-20 17:05:50 +08:00
linxi 3288c71b8a Fix:2608 【商城小程序】商户入驻--店铺图片选项改为必填项 2024-11-20 17:01:00 +08:00
linxi 257445263d Fix:2605 【商城小程序】商品评价--未显示发表时间 2024-11-20 16:48:13 +08:00
linxi 23a02352d7 Fix:2621 【商城小程序】订单详情—再买一单,修改收货地址确认框弹出之前地址已修改,点取消修改无法取消 2024-11-20 16:34:22 +08:00
linxi f5898444ab Fix:2629 【商城小程序】商品评价和店铺资讯超过140字时限制输入无提示,再次输入内容,发表结果会显示再次输入内容的最后两个字 2024-11-20 15:53:41 +08:00
linxi a14931a64e Fix:2581 【商城小程序】历史搜索--退出重新登录后,历史搜索被清空 2024-11-20 15:50:04 +08:00
linxi 5c92359a09 Fix:2657 【非遗文化】非遗文化详情页分类1简介开头输入的空格无法生效 2024-11-20 15:38:10 +08:00
linxi 9519401d75 Fix:2639 【新品专区】轮播商品--首个商品图片,文字都需比后面的商品大一点,严格按照效果图实现效果 2024-11-20 15:12:37 +08:00
linxi 3f1f2689be Fix:2640 【地标好物】产品--商品区域偏左,改为居中 2024-11-20 15:07:00 +08:00
linxi d502a276be Fix:2642 【地标好物】项目--政策--文件名称过长时不会自动换行 2024-11-20 14:57:29 +08:00
linxi 04c0f4a720 Fix:2644 【地标好物】文化--图片点击无法放大查看 2024-11-20 14:52:11 +08:00
linxi 2d1a1cc242 Fix:2648 【地标好物】项目—企业推荐—店铺名称超过15个字“...”显示 2024-11-20 14:49:31 +08:00
linxi 7bb0c67b83 Fix:2645 【地标好物】项目--政策无内容时隐藏查看更多按钮 2024-11-20 14:47:41 +08:00
linxi 18f9021c83 Fix: 2650 【地标好物】资讯--两侧与手机边缘适当留白,与底部留白平行 2024-11-20 14:35:55 +08:00
linxi 2ef47a52c2 Fix:2665 【非遗文化】非遗文化列表页面顶部海报显示不全,需按效果图尺寸设置该尺寸 2024-11-20 14:11:12 +08:00
linxi 1a8d44f1a4 Fix:2651 【地标好物】项目--服务,地图增加显示定位图标 2024-11-20 11:56:35 +08:00
linxi 33070fe21b Fix:2653 【非遗文化】【推荐】处的非遗文化名称及简介区域新增底色 2024-11-20 11:43:28 +08:00
linxi a18d191ebe Fix:2655 【非遗文化】非遗类目下无数据时,没有相关提示信息,应显示暂无内容的图片 2024-11-20 11:28:33 +08:00
linxi 0ef40fa345 Fix:2656 【非遗文化】类目下方轮播区域,数据大于等于3个时需要自动轮播,持续往右轮播,参考抽奖奖品的轮播 2024-11-20 11:19:46 +08:00
linxi 0b0c87245d Fix:2658 【商城小程序】非遗详情页分类1无法查看大图,增加点击查看大图功能 2024-11-20 10:24:34 +08:00
linxi 18190e76e4 Fix:2659 【非遗文化】进入非遗文化详情页,顶部视频未自动播放,增加自动播放功能 2024-11-20 10:19:15 +08:00
linxi 8f403fa204 Fix:2661 【非遗文化】非遗文化页面搜索无数据时,无相关提示信息,无内容时增加暂无内容图片显示 2024-11-20 10:11:01 +08:00
linxi af0efae84b Fix: 2662 【非遗文化】非遗详情页无店铺数据时没有相关提示信息 2024-11-20 10:07:45 +08:00
linxi fb881355d9 Fix:2663 【非遗文化】非遗详情页副标题改为居中显示 2024-11-20 09:55:00 +08:00
modendeveloper bf7035cd2e Feat:地标好物政策搜索页 2024-11-19 00:58:08 +08:00
modendeveloper 0edbbfcdf5 Feat(首页):新品专区(完成) 2024-11-19 00:38:58 +08:00
modendeveloper 655bb7e7e3 Style(非遗文化&地标好物): 图片、图标、背景图调整 2024-11-17 23:32:49 +08:00
linxi 43b81b5430 Feat: 非遗文化封面字段对接 2024-11-15 17:53:13 +08:00
linxi 5f9a6b358d Feat: 地标好物(服务)
(cherry picked from commit d3957be379)
2024-11-15 10:40:22 +08:00
linxi b5c87c1edb Feat: 地标好物(页面&接口)
(cherry picked from commit c18ec66653)
2024-11-15 10:40:13 +08:00
linxi 6983ebeb21 Refactor:非遗文化重构 2024-11-06 18:03:16 +08:00
modendeveloper 0b9c3aa01f Fix:2524 【管理后台。商城小程序】康养旅居--展会轮播图管理未设置展会链接时,点击跳转会出现报错信息,删除该提示 2024-10-28 23:47:12 +08:00
modendeveloper de55d5fc2e Fix:2490 【商城小程序】我的收藏—千县的收藏数据只有一个时,没有靠左排列显示 2024-10-28 23:45:11 +08:00
modendeveloper 5ff8f5f76f Task(千县名品):商铺跳转 2024-10-28 23:35:59 +08:00
linxi c8a7ea63e3 Merge branch 'dev' of https://gitee.com/fengyuze178/xdd-uniapp-new into dev 2024-10-28 11:15:43 +08:00
linxi 440b058d33 Task(千县名品):产品随机列表展示 2024-10-28 11:15:37 +08:00
lifizer 3c7af4fc42 Fix(文玩推荐城市管理):[#2527]增加链接展会功能 2024-10-28 10:40:01 +08:00
linxi f3f47d236f Task(千县名品):产品列表随机算法实现 2024-10-25 17:47:02 +08:00
linxi 1b93ef7909 Fix:2537 【商城小程序】消息列表--删除消息记录会自动引发下一条记录的删除状态 2024-10-25 14:36:47 +08:00
linxi 52dfba61de Fix:2523 【商城小程序】抽奖--在抽奖记录中领取积分,应该跳出查看积分提示,并跳转到积分记录页面 2024-10-25 11:36:42 +08:00
linxi a7aedcc873 Fix:2528 【商城小程序】消息--历史会话界面,店铺名称过长时会挤压时间显示(店铺名称过长用“...”省略,店铺名只显示一行) 2024-10-25 11:10:43 +08:00
linxi 1eac768b76 Fix:2510 【商城小程序】店铺主页-发布动态,一次性上传多张图片时最后几张会显示上传进度为0%,但点击发布后所有图片都能正常在资讯显示 2024-10-22 09:26:21 +08:00
linxi 246c66193b Merge branch 'dev' of https://gitee.com/fengyuze178/xdd-uniapp-new into dev 2024-10-21 15:28:58 +08:00
linxi 831a6d64c0 Fix:2488 【商城小程序】待发货,待收货点击申请退款正常走退款流程,不提示订单已收货 2024-10-21 15:28:51 +08:00
lifizer 00f495a099 Merge branch 'dev' of https://gitee.com/fengyuze178/xdd-uniapp-new into dev 2024-10-21 15:18:17 +08:00
lifizer 918028aa93 Fix(尖货专题页):[#2509, #2512]模板2的轮播图背景图设置 2024-10-21 15:18:05 +08:00
linxi 0c8e9fcd54 Fix:2496 【商城小程序】养生食材--商品入口图显示不全 2024-10-21 15:14:27 +08:00
linxi 5262b93c3f Fix:2497 【商城小程序】商品详情页,自动轮播至最后一张图后会向左快速返回第一张重新轮播,应在最后一张图后向右自动按顺序轮播第一张 2024-10-21 15:08:17 +08:00
linxi 84470b4ec8 Fix:2498 【商城小程序】康养旅居—养生圣地搜索时店铺封面为视频时隐藏播放按钮 2024-10-21 14:59:20 +08:00
linxi ff5dbae3a4 Fix:2490 【商城小程序】我的收藏—千县的收藏数据只有一个时,没有靠左排列显示 2024-10-21 14:21:43 +08:00
linxi 0d0ac8d883 Fix:2511 【商城小程序】申请退款驳回详情页面,显示的应该是驳回原因而不是申请退款的退款原因 2024-10-21 11:51:11 +08:00
linxi cb6545ecd7 Conf:请求库替换,移除之前的flyIo,改用luch-request 2024-10-18 14:48:22 +08:00
lifizer b0ac014816 Refactor(登录):登录按钮去掉判断逻辑,一直显示 2024-10-17 10:05:39 +08:00
lifizer e726a51922 Merge branch 'temp' into test 2024-10-17 09:58:47 +08:00
lifizer ca11455148 Conf:开发版和体验版打开调试,线上版本关闭调试 2024-10-16 16:59:28 +08:00
lifizer af2699765d Fix(订单):[#2446] 待发货的申请退款应该跳转到未发货退款页面 2024-10-14 15:08:26 +08:00
lifizer 15c427edf7 Fix(订单):[#2488]待发货,待收货点击申请退款正常走退款流程,不提示订单已收货 2024-10-14 14:27:53 +08:00
lifizer f5b3174acc Fix(养生圣地):[#2486]养生圣地第三行文字删掉 2024-10-14 14:16:26 +08:00
lifizer 820cf2dc3f Fix(养生圣地):[#2491]输入关键词后未点击键盘回车键,列表提示“暂无内容”,默认状态下不用显示暂无内容 2024-10-14 11:05:07 +08:00
lifizer ebe18f0240 Fix(养生圣地):[#2486]养生圣地第三行文字删掉 2024-10-14 11:00:20 +08:00
lifizer 447f94ed8d Fix(专题页):[#2450]商品下架或店铺删除的话改为点击不做响应 2024-10-14 10:59:35 +08:00
lifizer 10ef53ecb1 Fix(养生圣地):[#2487]应该显示一句话介绍,而不是地址 2024-10-14 10:26:29 +08:00
lifizer 08c9193475 Fix(养生圣地):[#2491]输入关键词后未点击键盘回车键,列表提示“暂无内容”,默认状态下不用显示暂无内容 2024-10-14 10:20:41 +08:00
lifizer 93d7735aa9 Fix(展会):[#2492]如果没有配置视频则不显示视频播放器 2024-10-14 10:20:01 +08:00
lifizer db13fa3ffa Fix(千县名品):[#2489]导航栏展开方向改为向下 2024-10-14 10:11:41 +08:00
modendeveloper cf868ccebe Fix:2476 【商城小程序】康养旅居页面点击返回按钮的问题 2024-10-11 23:20:30 +08:00
modendeveloper f3e036b9be Fix:2419 【商城小程序】商品详情顶部图片设置为自动轮播,2秒轮播一张图 2024-10-11 22:47:49 +08:00
modendeveloper 194a51ee19 Fix:2467 【商城小程序】全国特产--城市内的特产商品过多时,底部的商品信息显示不全 2024-10-11 22:42:38 +08:00
modendeveloper 2c6c7e82a9 Fix:2451 【商城小程序】寻趣味--点击轮播图或店铺列表图片进入店铺详情页,返回后页面刷新会回到第一个分类页面 2024-10-11 22:42:19 +08:00
modendeveloper 58e29a98c8 Fix:2448 【商城小程序】待付款订单详情页内点击【修改地址】,重复弹出确认修改的弹窗 2024-10-11 22:33:39 +08:00
modendeveloper fb23c8fccf Fix:2446 【商城小程序】待收货、待评价订单详情页—点击【更多】下的【申请退款】按钮,应该跳转待收货订单退款页面,而不是未发货退款页面 2024-10-11 21:54:37 +08:00
modendeveloper 848307944c Fix:2445 【商城小程序】未打开售后的待评价订单,点击订单详情页的【申请退款】按钮仍然可以退款。 2024-10-11 21:50:47 +08:00
modendeveloper d9c696af23 Fix:2445 【商城小程序】未打开售后的待评价订单,点击订单详情页的【申请退款】按钮仍然可以退款。 2024-10-11 21:49:07 +08:00
modendeveloper abd13edb81 Fix:2444 【商城小程序】我的收藏-千县,千县店铺收藏列表底色显示不统一 2024-10-11 21:35:13 +08:00
modendeveloper 8536ad2aca Fix:2424 【商城小程序】千县—文化图片高度存在拉伸(长宽统一改为1:1正方形) 2024-10-11 21:26:30 +08:00
modendeveloper 226a17f420 Fix:2417 【商城小程序】退款失败订单详情增加显示驳回原因 2024-10-11 21:24:02 +08:00
modendeveloper 09941be7b6 Fix:2482 【商城小程序】养生圣地,店铺封面为视频时,隐藏封面入口封面的播放图标 2024-10-11 21:18:51 +08:00
linxi 387fe8d2b8 Fix:2455 【商城小程序】养生圣地店铺搜索需要单独开个页面展示搜索结果,并且搜索结果不根据分类展示,直接展示当前城市下的所有店铺 2024-10-11 17:39:12 +08:00
linxi 37349183f2 Fix:2485 【商城小程序】按效果图上传164*250背景图,会出现背景图显示不完整的情况 2024-10-11 17:27:56 +08:00
linxi da940c7668 Fix:2482 【商城小程序】养生圣地,店铺封面为视频时,隐藏封面入口封面的播放图标 2024-10-11 16:44:45 +08:00
linxi 28ce362a39 Fix:2455 【商城小程序】养生圣地店铺搜索需要单独开个页面展示搜索结果,并且搜索结果不根据分类展示,直接展示当前城市下的所有店铺 2024-10-11 16:19:38 +08:00
linxi e493acec59 Fix:2475 【商城小程序】样式调整,预约旅居与药膳食谱名称背景框透明度设置为70%,文字超出时用省略号显示,不要换行 2024-10-11 15:41:06 +08:00
linxi b3b5f3f6e4 Fix:2472 【商城小程序】点击展会轮播图,没有跳转到展会详情,并且后台设置的轮播图,和前端显示的不是同一张图 2024-10-11 14:57:18 +08:00
linxi 857891c00b Fix:2468 【商城小程序】加入购物食材文字改为:购入同款食材 2024-10-11 14:44:12 +08:00
linxi 35641a8956 Fix:2454 【商城小程序】康养首页--最新展会信息需要做自动轮播效果,3秒轮播一次 2024-10-11 14:41:53 +08:00
linxi f55cb074c8 Fix:2459 【商城小程序】康养首页--城市列表应以三列进行展示 2024-10-11 14:39:34 +08:00
linxi 150d351152 Fix:2463 【商城小程序】康养生活—养生食材,商品名称过长,最多显示2行,超出部分用省略号 2024-10-11 14:37:49 +08:00
linxi d5cdbc4670 Fix:2471 【商城小程序】养生食材配方--食物清单中主料名称过长时会字段会穿过框外,文字超出用省略号 2024-10-11 14:32:35 +08:00
linxi ade5719c00 Fix:2474 【商城小程序】点击展会文字进入详情的触发区域改为点击整个背景色块都可以触发 2024-10-11 14:16:20 +08:00
linxi c8db02282c Fix:2478 【商城小程序】养生食材--养生榜单中榜单名称超过五个字显示... 2024-10-11 14:13:51 +08:00
linxi 179a5f005c Fix:2479 【商城小程序】分类文字间距再加宽大概二分之一,未选中时文字不加粗 2024-10-11 14:12:14 +08:00
lifizer f0e25c2a0d Fix(尖货专题页):[#2469]第二页的背景图及商品店铺,在前端显示成了第三页的内容 2024-10-11 09:59:24 +08:00
modendeveloper 021e94084f Fix:2460 【商城小程序】养生圣地--点击店铺入口图不会跳转到店铺详情页 2024-10-10 19:48:41 +08:00
modendeveloper dce372aca3 Fix:2462 【商城小程序】康养首页—展会信息—其他展会,搜索信息不存在时增加“暂无内容”提示 2024-10-10 19:46:37 +08:00
modendeveloper 12f2e42a16 Fix:2463 【商城小程序】康养生活—养生食材,商品名称过长,最多显示2行,超出部分用省略号 2024-10-10 19:40:28 +08:00
modendeveloper 1aab9ee691 Fix:2457 【商城小程序】圣地分类改为左右滑动,不要换行 2024-10-10 19:32:00 +08:00
modendeveloper eff9db385a Fix:2454 【商城小程序】康养首页--最新展会信息需要做自动轮播效果,3秒轮播一次 2024-10-10 19:25:24 +08:00
modendeveloper b3d8fefaba Fix:2459 【商城小程序】康养首页--城市列表应以三列进行展示 2024-10-10 19:17:12 +08:00
modendeveloper 8c2e785ea0 Feat:康养页面细节调整(已完成) 2024-10-09 23:58:37 +08:00
linxi b397ba232f Feat:康养接口对接,细节调优 2024-10-09 18:07:04 +08:00
modendeveloper 3d3efa89bf Feat:康养页面接口对接 2024-10-09 00:09:59 +08:00
linxi d8cb8ae6cb Feat:康养部分接口对接(圣地,食材为对接) 2024-10-08 18:03:46 +08:00
modendeveloper 566ef9de61 Feat:康养页面 2024-10-08 00:25:03 +08:00
linxi c51f177c7c Style:订单更多按钮字体调整 2024-09-27 09:31:31 +08:00
modendeveloper 1439e1206d Style:我的足迹优惠券字体调整 2024-09-26 21:33:09 +08:00
modendeveloper 714f5c3340 Fix:2413 【商城小程序】订单管理点击更多展开内容,点其他地方无法收起 2024-09-26 21:32:42 +08:00
modendeveloper 27d4727f89 Fix:2416 【商城小程序】寻趣味进入店铺详情后返回,应停留在当前刷到的位置,现在每次返回都会刷新到页面顶部 2024-09-26 21:13:18 +08:00
modendeveloper e81aa3a490 Fix:2412 【商城小程序】客服聊天窗口,输入聊天内容的时候输入法区域总会挡住输入框的一部分,安卓和苹果都会有这个情况,需要优化一下 2024-09-26 20:52:51 +08:00
modendeveloper ab5e5659fe Fix:2414 【商城小程序】寻趣味页面调整 2024-09-26 19:10:14 +08:00
modendeveloper d9e5fefdfa Fix:2415 【商城小程序】县城详情页,资讯和产业位置调换 2024-09-26 19:07:08 +08:00
lifizer 14a0477ee8 Merge branch 'dev' into test 2024-09-26 10:10:28 +08:00
lifizer 69540415ec Fix(我的):登录过期未跳转至登录界面 2024-09-25 23:10:19 +08:00
lifizer dcff3181b3 Fix(购物车):无数据时右上角的管理按钮应该不显示 2024-09-25 17:12:31 +08:00
lifizer 1016b4d7cb Fix: 千县无数据提示图更换 2024-09-25 17:07:02 +08:00
linxi 0c9f3a5081 Fix: 千县无数据提示图更换 2024-09-25 16:57:12 +08:00
linxi b7c7177f71 Fix:村屋资讯改为“”租售资讯“” 2024-09-25 09:39:27 +08:00
lifizer 8b7e35c182 Style(商品详情):显示预计获得积分数调整 2024-09-24 22:22:08 +08:00
lifizer f30d06ea11 Fix(商品详情):[#2319]显示预计获得积分数 2024-09-24 22:03:46 +08:00
lifizer 050938b8aa Merge branch 'dev' of https://gitee.com/fengyuze178/xdd-uniapp-new into dev 2024-09-24 21:48:18 +08:00
lifizer 6ecc996e8b Refactor(商品详情):规格是否无库存通过接口查询 2024-09-24 21:47:57 +08:00
lifizer ff93f79a18 Fix(商品详情):[#2319]显示预计获得积分数 2024-09-24 21:47:30 +08:00
modendeveloper 4c60c7ba52 Fix:寻趣味TAB 间隔调整 2024-09-24 21:45:28 +08:00
lifizer b84534b654 Conf:uniapp的appId配置 2024-09-24 15:21:22 +08:00
lifizer 1915394b27 Refactor(商品详情):规格是否无库存通过接口查询 2024-09-24 15:20:31 +08:00
lifizer 6ce59471f3 Merge branch 'dev' into test 2024-09-24 11:08:56 +08:00
modendeveloper 787b2eada4 Fix:2405 【商城小程序】优惠详情—取消选择优惠券后,券后价显示0,应该显示当前售价 2024-09-23 21:12:20 +08:00
lifizer aa68c01ace Fix(商品详情):[#2297]无效的规格,仍然可以点击,并且未显示价格,库存显示undefined 2024-09-23 11:52:13 +08:00
linxi 8bf30f6989 Fix:【商城小程序】待收货、待评价订单详情页—物流区域,没有显示最新一条物流信息 2024-09-23 11:25:02 +08:00
linxi 15e9ca1687 Fix:2391 【商城小程序】购物车选择地址,如没有默认地址,默认显示收货地址列表的第一个 2024-09-23 11:24:52 +08:00
linxi 4f867cb191 Fix:【商城小程序】商品足迹暂无浏览记录换一个图片 2024-09-23 10:17:30 +08:00
linxi f658302d71 Fix:【商城小程序】待收货、待评价订单详情页—物流区域,没有显示最新一条物流信息 2024-09-23 10:17:02 +08:00
modendeveloper 4104052d1a Fix:2394 【商城小程序】订单详情页--待评价订单详情页增加“更多”键 2024-09-21 11:28:31 +08:00
modendeveloper 83be020182 Fix:2398 【商城小程序】寻趣味--切换城市后很大概率刷新后店铺重复显示 2024-09-21 11:23:51 +08:00
modendeveloper 1b56642743 Fix:【商城小程序】商品详情页--缺货商品购买数量点击增加键数量显示为0,点击减少键数量显示为1 2024-09-21 11:03:16 +08:00
modendeveloper 413b464e18 Fix:【商城小程序】聊天窗口历史记录过多时,商品模块会显示在上面,改为固定在下面的位置 2024-09-21 10:36:17 +08:00
linxi 35d9d34689 Fix:【商城小程序】订单详情页--待评价订单详情页增加“更多”键 2024-09-20 16:24:31 +08:00
linxi 088c1be6f9 Fix:【商城小程序】待付款订单详情页补上修改地址的按钮 2024-09-20 15:53:51 +08:00
linxi fafd862f99 Fix:【商城小程序】待收货、待评价订单详情页—物流区域,没有显示最新一条物流信息 2024-09-20 14:32:45 +08:00
linxi 43a26d4943 Fix:【商城小程序】提交订单页面—1.无法取消选择优惠券;2.选择其他优惠券,之前选择的优惠券仍然为被勾选状态 2024-09-20 14:21:50 +08:00
linxi 12252eec5a Fix:【商城小程序】寻趣味页面调整 && 选择城市后城市名称被强制改成当前城市 2024-09-20 12:00:14 +08:00
linxi 506cc6053d Fix:【商城小程序】订单列表--已取消的订单增加“删除订单”键,只删除前端该订单,后台订单记录不用删除 2024-09-20 11:37:15 +08:00
linxi 2ba35be830 Fix:【商城小程序】商品足迹--增加“已经到底啦~”提示 2024-09-20 11:17:23 +08:00
linxi 83c1060b0c Fix:【商城小程序】村屋出租改为“”租售资讯“” 2024-09-20 11:11:44 +08:00
modendeveloper 2896442f2f Fix:【商城小程序】待收货、待评价订单详情页—物流区域,没有显示最新一条物流信息 2024-09-19 20:28:38 +08:00
modendeveloper 072a05257e Fix:【商城小程序】苹果手机—商品足迹,向下、向左、向右划动会出现空白 2024-09-19 20:17:53 +08:00
linxi 2f2497270a Fix: 【商城小程序】结算页面直接默认使用当前可用减免金额最大的优惠券 2024-09-19 18:00:55 +08:00
linxi cb3b92a2b2 Fix:【商城小程序】优惠券没有可选的话,把把“无>”隐藏 2024-09-19 17:46:42 +08:00
linxi 7c1f57bb0c Fix:【商城小程序】商品详情页--分享图标遮挡”购买数量“增加键 2024-09-19 17:44:12 +08:00
linxi daed2c3ec5 Fix:【商城小程序】优惠详情页面—取消选择优惠券时,满减处显示undefined 2024-09-19 16:18:44 +08:00
linxi b899039b89 Fix: 【商城小程序】待收货、待评价订单详情页—物流区域,没有显示最新一条物流信息 2024-09-19 15:46:32 +08:00
linxi 51ecf9b3b2 Fix: 【商城小程序】待收货、待评价订单详情页—物流区域,没有显示最新一条物流信息 2024-09-19 15:35:23 +08:00
linxi 0f582d6005 Fix:【商城小程序】购物车—猜你喜欢—第二个商品图片显示异常,显示在了页面底部(机型:苹果12) 2024-09-19 15:25:57 +08:00
linxi 011117d318 Fix:【商城小程序】商品足迹—点击顶部日期切换数据无响应 2024-09-19 14:32:51 +08:00
linxi 780a3754c0 Fix:【商城小程序】商品足迹--商品原价划线效果优化,原价颜色加深 2024-09-19 11:31:29 +08:00
linxi af6da8649c Fix:【商城小程序】店铺详情的分类栏名称修改为:商品 资讯 文化 资质 2024-09-19 11:25:28 +08:00
linxi 68765f4474 Fix:【商城小程序】寻趣味—打开寻趣味后,切换至其他页面(首页、购物车等),再返回寻趣味,需要对页面进行刷新 2024-09-19 11:21:23 +08:00
linxi 6b84821a0b Fix:【商城小程序】千县名品—店铺,文化县城介绍数据较少时,点击展开/收起按钮,没反应(云南-富源县) 2024-09-19 10:43:44 +08:00
linxi 6f059dfed1 Fix:【商城小程序】个人中心—我的收藏,收藏列表无数据时背景底色显示不一致 2024-09-19 10:30:35 +08:00
linxi 4f01467d5c Fix: 【商城小程序】选中的背景色块底部显示不完整,分类图标尺寸再放大一点,不然看起来太稀疏 2024-09-19 10:22:43 +08:00
linxi 6d0d87e6cb Fix:【商城小程序】寻趣味—搜索框提示词改为“请输入关键词~” 2024-09-19 10:20:07 +08:00
linxi f3427dfa9a Fix:商城小程序】商品足迹--商品原价划线效果优化,原价颜色加深 2024-09-19 10:18:58 +08:00
linxi bf5b30ae93 Fix:【商城小程序】登录--勾选《用户协议》后取消勾选,仍可成功登录 2024-09-19 10:00:53 +08:00
linxi 427d33b550 Fix:【商城小程序】登录--勾选《用户协议》后取消勾选,仍可成功登录 2024-09-19 09:49:58 +08:00
linxi f3c1ad8d32 Fix:【商城小程序】寻趣味--保持页面底色一致 2024-09-19 09:42:00 +08:00
linxi 3baeace156 Fix:【商城小程序】寻趣味调整一下页面 2024-09-19 09:39:30 +08:00
linxi af273b2eb8 Fix:猜你推荐下面不要用色块挡住 2024-09-19 09:28:57 +08:00
modendeveloper 30261f183a Feat:购物车推荐商品 2024-09-19 01:21:26 +08:00
linxi 6b408c41d3 Feat:寻趣味细节调整 2024-09-18 18:11:39 +08:00
linxi 305c965cc1 Merge branch 'dev' of https://gitee.com/fengyuze178/xdd-uniapp-new into dev 2024-09-18 16:29:47 +08:00
linxi e19ebec8ef Fix:【商城小程序】千县名品的页面顶部标题改为:寻迹千县 2024-09-18 16:29:40 +08:00
lifizer 6e6cc36570 Merge branch 'dev' of https://gitee.com/fengyuze178/xdd-uniapp-new into dev 2024-09-18 16:11:43 +08:00
lifizer 69e8a48283 Fix(tabbar):[#2334]底部栏中间的红色按钮下面加上“寻趣味”三个字 2024-09-18 16:11:29 +08:00
linxi edcb64fbf6 Fix:没有优惠券时最大值计算报错 2024-09-18 16:11:25 +08:00
linxi d3d22a3c87 Fix:【商城小程序】寻趣味上面的分类放大一点,调整为显示3个半图标 2024-09-18 14:28:10 +08:00
linxi 313adf37b0 Fix:商城小程序】购物车商品过多时,之前改为了不显示超出的部分,现在又把超出的部分显示出来了(历史BUG) 2024-09-18 14:24:37 +08:00
linxi 1feb90c602 Fix: 【商城小程序】购物车点击"管理"功能以后,下次进入购物车页面应该自动变为未点击状态 2024-09-18 14:05:20 +08:00
linxi 4b8ba61ee5 Fix:【商城小程序】千县--产品下的商品点击无法跳转商品详情页 2024-09-18 14:02:31 +08:00
linxi eda9664c6d Fix:【商城小程序】商品足迹--商品原价划线效果优化,原价颜色加深 2024-09-18 11:53:46 +08:00
lifizer b3f85d807d Feat(趣味):轮播广告位对接 2024-09-18 11:40:20 +08:00
modendeveloper 9b0216c857 Fix:【商城小程序】待付款订单—修改地址没有确认弹窗,修改无效(机型:苹果12) 2024-09-17 22:06:36 +08:00
modendeveloper b5e23dda59 Fix: 足迹日期星期日开始 2024-09-17 21:05:01 +08:00
lifizer cfd333cffa Style(商品足迹):界面细节调整 2024-09-14 21:45:34 +08:00
lifizer 24d2b6f96a Fix(千县名品):[#2284]店铺没有填写信息时,点击不要进入 2024-09-14 18:12:41 +08:00
linxi ce428b7ff8 Fix:【商城小程序】待收货和待评价订单详情页增加物流信息显示(蓝湖效果图已更新) 2024-09-14 17:08:46 +08:00
linxi 9eb5f0acf3 Fix:【商城小程序】商品详情页--商品图片遮挡分享图标 2024-09-14 16:40:47 +08:00
linxi fb31d538b6 Fix: 【商城小程序】提交订单--部分商品合计金额下方优惠金额与积分抵扣金额不符,少了一分钱 2024-09-14 16:39:04 +08:00
linxi 8064cd13fa Fix:【商城小程序】订单列表—待发货订单的发货时间提醒没有根据设置的预计发货时间进行显示 2024-09-14 16:35:53 +08:00
linxi e0de70ee35 Fix:商城小程序】订单列表—查看店铺按钮没反应,点击应进入店铺详情 2024-09-14 16:33:04 +08:00
linxi 5de4ab8758 Fix:【商城小程序】消息列表增加删除会话按钮,在聊天框长按的位置弹出删除按钮,点击删除将该条聊天记录删除 2024-09-14 16:25:38 +08:00
linxi ba91746cde Feat:我的足迹页面完成 2024-09-14 15:48:57 +08:00
modendeveloper 8ebf12dcc6 Fix:【商城小程序】商品详情页—优惠详情—使用规则展开/收起按钮没有反应 2024-09-14 00:52:12 +08:00
modendeveloper 9e0bc48135 Fix:两个规格之间的间距调的太宽了 2024-09-14 00:47:42 +08:00
modendeveloper a4201225fa Fix:【商城小程序】待付款订单详情页,无自动取消订单倒计时 2024-09-14 00:35:14 +08:00
modendeveloper 5ab60fda4c Fix:【商城小程序】专题页模板4,第二页的图片,店铺,全是第三页的内容 2024-09-13 23:57:08 +08:00
modendeveloper 93770e4c3d Fix: 【商城小程序】店铺修改资料--未上传封面图片也可修改成功 2024-09-13 23:39:44 +08:00
linxi 82a54220d4 Fix:【商城小程序】千县名品搜索无结果,将提示图片换一下,并居中 2024-09-13 15:39:07 +08:00
linxi 7b79d6e965 Feat:订单详情新增物流信息 2024-09-13 15:11:45 +08:00
linxi fac60f9df9 Fix:商城小程序】苹果手机—订单列表—待发货、已取消、已完成、退款中、退款成功的订单,【联系商家】、【查看详情】图标边框显示不全 2024-09-13 15:11:11 +08:00
linxi a21870c578 Fix:【商城小程序】购物车商品较多时,安卓手机滑动屏幕无法查看最后一个商品的价格和加购数量 2024-09-13 14:55:32 +08:00
linxi 6a2a2755e5 Fix:【商城小程序】购物车页面添加新地址,不会自动同步到购物车的收货地址区域 2024-09-13 14:51:11 +08:00
linxi 27be3935fa Fix:【商城小程序】商品分享功能未做,调用之前生成商品分享海报的接口 2024-09-13 11:48:49 +08:00
linxi 9c67d724fd Feat: 商品详情页优惠券最大显示2个 2024-09-13 11:32:23 +08:00
linxi e33c59ae64 Fix:【商城小程序】提交订单--优惠详情的“当前售价”无数据 2024-09-13 11:16:37 +08:00
linxi a273948165 Fix:【商城小程序】三个标题要去掉村屋这两个字,改为详情/介绍/资讯 2024-09-13 10:48:39 +08:00
lifizer 0053ddd3e4 Fix(千县名品):[#2325, #2326]千县名品点击县城直接进入县城详情页且增加产品tab 2024-09-13 10:14:44 +08:00
modendeveloper 22abd6caaf Fix:【商城小程序】待收货和待评价订单详情页增加物流信息显示(蓝湖效果图已更新) 2024-09-13 01:12:05 +08:00
modendeveloper 94aa156f50 Fix:【商城小程序】商品详情页—优惠券间隔偏大,并且没有显示预计获得积分数(缺积分字段) 2024-09-13 00:31:14 +08:00
modendeveloper c1c0cb2373 Fix:【商城小程序】商品详情页--商家资质图片变形,改为自适应高度 2024-09-13 00:12:29 +08:00
modendeveloper 58d0faa855 Fix:【商城小程序】提交订单--存在运费时合计金额下方优惠显示包含运费,不要包含运费在下面 2024-09-13 00:08:21 +08:00
modendeveloper 8f5eca5c62 Fix:【商城小程序】商品详情页—产品参数文字改为居中 2024-09-13 00:05:47 +08:00
modendeveloper 94405b6de9 Fix:【商城小程序】商品详情页--优惠券图片被压缩,改为自适应高度 2024-09-12 23:57:24 +08:00
modendeveloper d06666ec9d Fix: 【商城小程序】待付款订单详情页,无自动取消订单倒计时 2024-09-12 23:41:11 +08:00
modendeveloper 21dccd8d61 Fix:【商城小程序】结算页调整 2024-09-12 23:27:21 +08:00
modendeveloper b228155cc0 Fix:【商城小程序】商品详情页—规格详情页—【缺货】按钮与右侧规格框有重叠,规格之间的间距再调宽一点 2024-09-12 23:20:33 +08:00
modendeveloper 7b88c8d3fc Fix:【商城小程序】商品详情页—商品评价—商品规格添加圆角矩形背景色,色值:FDEDED 2024-09-12 23:13:51 +08:00
modendeveloper 5ab1254676 Fix:【商城小程序】商品详情页—【产品参数】与【商品评价】优化 2024-09-12 23:08:09 +08:00
modendeveloper 0d72a1d580 Fix: 【商城小程序】订单详情页未显示备注信息 2024-09-12 22:53:23 +08:00
modendeveloper 3efc3232b0 Fix:【商城小程序】退款/售后订单不要确认收货的按钮 2024-09-12 22:27:58 +08:00
modendeveloper f15d842419 Fix:【商城小程序】结算页备注增加默认文字,如下图 2024-09-12 22:23:54 +08:00
linxi db4dc959d4 Fix(订单列表):【商城小程序】待付款订单—立即付款,应直接跳出输入支付密码弹窗而不是订单详情页面 2024-09-12 11:15:24 +08:00
linxi 024eedaabb Feat(客服):发送商品信息功能 2024-09-12 10:16:40 +08:00
linxi 6790c14aaf Fix(县城文化):【商城小程序】千县名品—店铺,文化县城介绍数据较少或无数据时,点击展开/收起按钮,所展示的效果相反 2024-09-12 09:18:47 +08:00
modendeveloper b37d3a139e Fix(县城文化):【商城小程序】千县名品—店铺,文化县城介绍数据较少或无数据时,点击展开/收起按钮,所展示的效果相反 2024-09-11 23:40:39 +08:00
modendeveloper 3407ef7aff Fix(村屋详情):【商城小程序】千县名品--产业--村屋出租--村屋详情,村屋名称过长时不省略 2024-09-11 23:28:22 +08:00
modendeveloper 06658209eb Fix: JS计数计算精确度问题 2024-09-11 23:11:51 +08:00
modendeveloper 384d7ccae1 Fix(商品详情):【商城小程序】商品详情页中,规格名称过长时,字段溢出规格框(超过17个字后省略) 2024-09-11 23:11:28 +08:00
modendeveloper 0641013a5c Fix(商品详情):【商城小程序】商品详情页中,规格名称过长时,字段溢出规格框(超过17个字后省略) 2024-09-11 22:57:34 +08:00
modendeveloper af075a9c28 Fix(购物车):【商城小程序】购物车页面的结算部分,两边不要贴边,整体往上挪一点,按下面原型图布局再调整一下 2024-09-11 22:52:51 +08:00
modendeveloper cb75cbae9c Fix(提交订单): 【商城小程序】结算页面收货地址选择部分调整 2024-09-11 22:51:03 +08:00
modendeveloper 6f8b940be5 Fix(提交订单):多商品时商品间无距离 2024-09-11 22:50:44 +08:00
modendeveloper 1a6d0da0fd Style(购物车):细节调整 2024-09-11 22:49:58 +08:00
linxi 6f24c71d96 Refact(优惠券):优惠券重构 2024-09-11 11:08:15 +08:00
linxi b0fffe8101 Feat(商品详情):新增商家资质页 2024-09-10 18:06:11 +08:00
linxi c015eb9dff Feat(订单列表):未支付订单修改地址 2024-09-10 16:03:10 +08:00
linxi 2033fb7ed7 Feat(订单):新增再买一单功能 2024-09-10 15:11:02 +08:00
linxi 11878e7e8b Feat(订单列表):新增搜索功能 2024-09-10 15:10:41 +08:00
modendeveloper 4434360f8a Fix(购物车):地址编辑无法生效问退 2024-09-09 23:45:06 +08:00
modendeveloper 01199eeebd Style: 订单列表细节调整 2024-09-09 23:10:10 +08:00
modendeveloper 973ce36778 Style: 更换图标 2024-09-09 23:05:07 +08:00
modendeveloper 41753688cb Style: 细节调整 2024-09-09 23:03:30 +08:00
modendeveloper d6f6356ee0 Feat(商品详情):细节调整 2024-09-09 22:57:58 +08:00
modendeveloper 43841c0491 Feat(提交订单):细节调整 2024-09-09 22:56:33 +08:00
modendeveloper c9e2e6005c Feat(优惠券):UI调整(完成) 2024-09-09 22:47:08 +08:00
modendeveloper 11d40e719c Feat(登录):UI调整(100%) 2024-09-09 22:22:43 +08:00
modendeveloper 43aca09ca6 Feat(登录):UI调整(100%) 2024-09-09 22:22:24 +08:00
linxi bde972a5ad Feat(登录):UI调整(99%) 2024-09-09 18:00:46 +08:00
linxi b27d9b12fe Feat(个人中心):订单类型列表跳转调整 2024-09-09 10:20:24 +08:00
modendeveloper aaa6a2299f Feat(优惠券):UI调整(缺顶部优惠公式) 2024-09-09 00:36:05 +08:00
modendeveloper 1e0772713f Feat(规格):UI调整(已完成) 2024-09-08 19:57:48 +08:00
modendeveloper 3eb077eb3c Feat(商品详情):UI调整(已完成) 2024-09-08 19:57:27 +08:00
modendeveloper e391b2fe9b Feat(商品详情):UI调整(缺资质信息,未对接,其余OK) 2024-09-08 17:27:25 +08:00
modendeveloper 22f2e9779a Feat(提交订单):UI调整(已完成) 2024-09-08 15:10:49 +08:00
modendeveloper b9b47ef816 Feat(购物车):购物车调整(完成) 2024-09-07 16:40:44 +08:00
modendeveloper cd940e9394 Feat(订单详情):订单详情重构(缺修改地址接口,功能未实现) 2024-09-07 13:53:17 +08:00
modendeveloper 922a1614a6 Feat(订单列表):待收货提示文案,修改地址(功能尉氏县,缺接口) 2024-09-07 13:52:50 +08:00
modendeveloper 5dd83fdd92 Feat(订单列表):新增退款/售后 tab 2024-09-07 13:19:40 +08:00
modendeveloper 4951a8ad19 Feat(订单详情):订单详情重构(缺再来一单接口,功能未实现) 2024-09-07 12:19:02 +08:00
linxi 5640e3e24c Feat(订单详情):订单详情重构(未完成) 2024-09-06 18:13:17 +08:00
linxi d7e290911d Fix(个人中心):修复轮播图部分机型无法显示全部问题 2024-09-06 11:26:36 +08:00
linxi 55b0dd95b1 Merge branch 'dev' of https://gitee.com/fengyuze178/xdd-uniapp-new into dev 2024-09-05 14:58:49 +08:00
linxi 75290bf1b4 Style(订单):UI样式调整 2024-09-05 14:58:42 +08:00
lifizer a9e3ac2eda Merge branch 'dev' into test 2024-09-04 17:45:21 +08:00
lifizer 06abd34261 Fix(我的):轮播广告图不配置则不显示 2024-09-04 16:35:39 +08:00
lifizer 1a231d6715 Style(千县名品):省名称显示调整 2024-09-04 16:26:05 +08:00
linxi 8242632cb0 Feat(个人中心): 海报改轮播图,对接后台配属的图片&链接 2024-09-04 10:51:34 +08:00
lifizer b8a60be507 Fix(千县名品):[#2251]攻略专题页需要重新调整 2024-09-03 20:26:46 +08:00
linxi ee04a02cb6 Style(购物车):UI样式调整 2024-09-03 17:27:07 +08:00
linxi 992c4a7ba5 Style(寻趣味):寻趣味列表暂无数据显示底色不一致 2024-09-02 15:48:47 +08:00
linxi ae81590c9e Fix(商品):多规格商品在选购时,选择第一个规格增加数量,再改选第二个规格,数量不会刷新,但立即购买,订单页面数量显示为“1” 2024-09-02 10:30:52 +08:00
linxi 719bbebbf6 Fix(千县名品):千县名品县城一句话介绍过长时会挤压县城名称显示 2024-08-30 09:33:55 +08:00
linxi c50474c156 Feat(千县名品):千县名品首页搜索无数据时提示换图片 2024-08-29 16:36:51 +08:00
linxi fda09a5cb0 Style(千县名品):千县名品城市管理--产业管理--村屋出租,村屋展示背景颜色更换为白色 2024-08-29 16:36:32 +08:00
linxi 223bcf6ac8 Feat(首页):新增抽奖窗口显示逻辑,没有抽奖次数不显示 2024-08-29 10:39:44 +08:00
linxi 3527e4c8c7 Merge branch 'dev' of https://gitee.com/fengyuze178/xdd-uniapp-new into dev
# Conflicts:
#	pkg_product/views/famousQianxianVillageShop.vue
2024-08-28 15:18:31 +08:00
lifizer 19bb5c1084 Fix(千县名品):[#2229]千县名品店铺中,商品较少时,背景底色不一致 2024-08-28 14:48:39 +08:00
lifizer 4a354a7dcf Fix(千县名品/店铺):[#2227]底部的产业项目无法点击进入二级页面查看项目列表 2024-08-28 14:47:58 +08:00
linxi bcee082202 Fix(千县名品): 千县名品店铺--产业--村屋出租--当联系人姓名超过两个字时,村屋名称和联系人显示会遮挡封面 2024-08-28 14:12:20 +08:00
linxi e7afa28bc2 Style(千县名品): 千县名品店铺中,商品较少时,背景底色不一致 2024-08-28 11:31:21 +08:00
linxi dce2377383 Feat(客服):新增进入客服页自动发送商品信息功能 2024-08-28 11:25:35 +08:00
modendeveloper 3fac704828 Style(客服):客服UI调整 2024-08-28 00:48:10 +08:00
linxi 33526c2df0 Fix(店铺资料):修改店铺资料--连续多次点击确认修改,会自动退出到个人中心页面,点店铺主页会反复提示修改成功再退出来,店铺资质图片会重复添加 2024-08-27 18:14:57 +08:00
linxi 0cb7d5f5e8 Fix(我的收藏):我的收藏--千县店铺,有多个店铺时,选择删除某个店铺,删除后会显示“undefined”或”您还没有收藏“,刷新后显示正常 2024-08-27 10:37:42 +08:00
linxi 2aceabf991 Fix(攻略专题):店铺——攻略专题页第四页和第五页之间有白边(苹果手机) 2024-08-27 10:15:17 +08:00
linxi 6ad3ba0fd6 Fix(千县名品):千县名品店铺—资讯置顶未生效 2024-08-27 09:52:41 +08:00
linxi b092e8c9c5 Fix(我的收藏):我的收藏—千县店铺,全选数量显示为0 2024-08-26 18:11:17 +08:00
linxi 2bf5ba295e Fix(千县名品):店铺—产业—招商政策—更多政策,少做了搜索框,效果图是有搜索框的 2024-08-26 17:57:57 +08:00
linxi a97835ed27 Style(千县名品):千县名品搜索后,调整搜索时的页面样式 2024-08-26 17:22:33 +08:00
linxi 5e4f3aced6 Fix(千县名品):文化的图片全部靠左显示了 2024-08-26 16:55:16 +08:00
linxi 9803c53c3b Style(千县名品):招商政策暂无项目文字居中 2024-08-26 14:55:43 +08:00
linxi 32a7e311fc Style(千县名品):县城详情的名称文字加大加粗,参考效果图样式 2024-08-26 11:50:35 +08:00
linxi 77453380fa Style: 12期通用样式表 2024-08-26 11:49:54 +08:00
linxi 5fc4159e08 Style(村屋出租):招租村屋调整 2024-08-26 10:35:57 +08:00
lifizer 7740e8f6a8 Feat(千县店铺):村屋出租功能完成 2024-08-23 17:45:06 +08:00
lifizer a18e478c26 Merge branch 'dev' into test 2024-08-23 11:26:48 +08:00
lifizer 99dd695553 Feat(千县店铺):收藏功能对接 2024-08-23 10:55:33 +08:00
lifizer 0528865e7b Fix(店铺):[#2199]重复点击确认修改,店铺资质图片会重复添加 2024-08-21 15:22:52 +08:00
lifizer e08f597f58 Style(专题页):模板2的轮播效果调整 2024-08-21 11:31:43 +08:00
lifizer 74c5c2b768 Feat(千县名品):县店铺首页界面接口对接 2024-08-20 17:56:14 +08:00
lifizer 05b6075df3 Feat(千县名品):县店铺首页界面接口对接 2024-08-19 22:44:22 +08:00
lifizer 688d0ee264 Merge branch 'dev' into test 2024-08-19 17:02:13 +08:00
lifizer 0f85b2fc58 Refactor(千县名品):模块首页和县主页界面使用新版UI调整 2024-08-19 16:52:47 +08:00
lifizer 8b5d8d6dc7 Style(地标好物):界面UI调整 2024-08-15 17:28:23 +08:00
lifizer 734887d6d4 Refactor(地标好物):界面使用新版UI调整 2024-08-15 16:19:40 +08:00
lifizer 4878005209 Fix(我的优惠券):[#2178]我的优惠券页面,点击去使用无响应 2024-08-13 17:31:43 +08:00
lifizer ae554044d3 Fix(首页):[#2164]尖货推荐简介过长时换行,最多2行,超出的用...显示 2024-08-13 17:26:36 +08:00
lifizer 75a821eb6c Feat(民宿&节日&尖货专题页):使用模板配置渲染 2024-08-13 17:19:04 +08:00
lifizer 741ce177cd Merge branch 'dev' into test 2024-08-07 11:32:30 +08:00
lifizer 017f34bbf4 Style(首页):界面细节调整 2024-08-06 17:18:46 +08:00
lifizer efaf6feb1a Style(首页):背景颜色调整 2024-08-05 17:12:36 +08:00
lifizer 39ae37b484 Feat(首页):尖货专题对接完成 2024-08-02 23:21:02 +08:00
lifizer 52b75d0bd3 Style(首页):界面细节调整 2024-08-02 14:58:42 +08:00
lifizer 1033e0ee04 Chore(首页):代码注释&去掉多余代码 2024-07-31 21:49:37 +08:00
lifizer 46b4f05a6b Refactor(首页):改版重构-接口对接 2024-07-31 21:38:49 +08:00
lifizer b9c3ff756c Refactor(首页):改版重构-界面完成 2024-07-31 16:36:13 +08:00
lifizer 37fa7fab05 Refactor(首页):改版重构-界面完成 2024-07-30 18:14:59 +08:00
lifizer 7f4bc948df Merge branch 'dev' into test 2024-07-30 14:17:05 +08:00
lifizer b264e04e8f Chore:添加注释 2024-07-30 14:16:54 +08:00
lifizer 8056e74d43 Fix(上传):[#2109]图片超出大小限制提示错误 2024-07-30 14:16:19 +08:00
lifizer 01eaea0cdc Fix(入驻):[#2105]经纬度要求保留6位小数,实际只有前两位小数保留,后四位全部被置为0导致定位有偏差 2024-07-30 11:49:24 +08:00
lifizer 7a8a1b66f1 Merge branch 'dev' into test 2024-07-25 08:55:23 +08:00
lifizer f9be8af78f Fix(优惠券):[#2046,#2071]切换之后,选中效果错乱 2024-07-24 22:43:06 +08:00
lifizer 5b1b1f1c69 Fix(入驻/采购批发商):[#1982]撤销提交的申请后,将无法对除了省市区以外的内容进行修改,导致无法再次提交申请 2024-07-24 22:13:08 +08:00
lifizer 0ce7c578c9 Fix(商品详情):[#2009]商品预计发货时间为72小时,前端显示为null 2024-07-19 10:58:50 +08:00
lifizer 57a8c5a59d Fix(商品详情):[#1930优惠券换行问题 2024-07-17 23:09:58 +08:00
lifizer 22c171cbb4 Fix(特色礼品):[#1972]商品图片大小调整 2024-07-17 21:25:48 +08:00
lifizer 712d210d81 Fix(店铺):[#1968]店铺资讯的点赞调整 2024-07-17 21:23:38 +08:00
lifizer 186b78d426 Feat(订单):增加打开售后的逻辑判断 2024-07-17 11:13:36 +08:00
lifizer 54d19d813e Fix(提现/银行卡管理):[#1959]提现界面进入列表则不显示解除绑定按钮 2024-07-12 14:16:35 +08:00
lifizer 3659280b5b Fix(店铺):点击查看视频触发两次请求问题 2024-07-09 16:04:43 +08:00
lifizer 89190e216f Feat(店铺):点击查看资讯图片或者视频增加访问人数 2024-07-09 15:50:31 +08:00
lifizer 208980ddba Feat(店铺):点击查看资讯图片或者视频增加访问人数 2024-07-09 15:36:31 +08:00
lifizer 90a58aecd5 Fix(康养食材&文玩):[#1932]店铺封面为视频类型时,在店铺列表页面,店铺封面不显示(康养食材,文玩),改为显示视频第一帧 2024-07-05 21:19:47 +08:00
lifizer a72acdca54 Fix(康养食材):[#1936]页面滑动后,无法进行搜索操作,只有刚进入页面未滑动过的状态才能搜索 2024-07-05 21:08:30 +08:00
lifizer 4c8e79ebba Fix(店铺):字段值为null时,必填校验会报错导致无法提交数据 2024-07-05 20:48:53 +08:00
lifizer 44d4a21eba Fix(入驻):供应商入驻手机号校验错误 2024-07-05 19:40:42 +08:00
lifizer b3e67abbec Refactor(客服):接收传输使用uid字段 2024-07-05 18:52:12 +08:00
lifizer fc392a5e01 Refactor(客服):接收传输使用uid字段 2024-07-05 18:19:18 +08:00
lifizer fcf8a16cfc Merge branch 'dev' into test 2024-07-05 17:25:38 +08:00
lifizer d1813f3dca Fix(我的):界面隐藏没有上报数据 2024-07-03 15:57:35 +08:00
lifizer 7edbe49a43 Refactor(拦截器):补充相关接口不提示报错内容 2024-07-02 17:57:01 +08:00
lifizer e5ce19539d Fix(用户):[#1899]设置昵称限制最多12个字,不能输入超过12字 2024-06-28 16:07:36 +08:00
lifizer 609b8a8b60 Fix(入驻):[#1876]图片上传组件隐藏 2024-06-28 15:54:20 +08:00
lifizer 14ceb895d3 Fix(入驻):[#1876, #1844]1、审核中状态不可编辑内容;2、供应商入驻获取验证码按钮变形 2024-06-28 15:48:51 +08:00
lifizer f02a7c5514 Feat(店铺):分享功能对接 2024-06-28 14:20:43 +08:00
lifizer 6f3e25ab64 Feat(店铺):分享功能对接 2024-06-26 18:10:42 +08:00
lifizer 28ffaee0ce Feat(地址管理):自动识别对接 2024-06-26 16:45:48 +08:00
lifizer d4f61842fb Fix(登录):出生日期选中未显示 2024-06-26 16:08:29 +08:00
lifizer 2bac749ca4 Feat(店铺):编辑可以上传店铺资质 2024-06-26 15:40:08 +08:00
lifizer 86422f0f14 Feat(非遗文化):增加商品+视频展示 2024-06-26 15:33:02 +08:00
lifizer 2b15e320f4 Feat(非遗文化):增加商品+视频展示 2024-06-26 14:41:30 +08:00
lifizer f9b8ca6bf2 Feat(页面):页面埋点配置 2024-06-26 14:40:45 +08:00
lifizer ef2443dc58 Fix(入驻):[#1811]商户提交入驻申请,再次进入页面时商家资质图片不显示 2024-06-25 11:07:53 +08:00
lifizer d1304ff4c5 Fix(购物车):[#1864]购物车商家名称标题过长,导致“进店逛逛”按钮字样折行 2024-06-25 09:52:48 +08:00
lifizer 7e9eb39a32 Fix(账户明细):[#1862]有记录时不要显示暂无记录图片 2024-06-25 09:35:34 +08:00
lifizer b7cb860c5e Fix(寻趣味):[#1863]切换分类,或切换城市时,清空搜索框内容 2024-06-25 09:32:43 +08:00
lifizer 138abd46a2 Fix(寻趣味):异步加载导致界面渲染逻辑错误 2024-06-24 16:33:17 +08:00
lifizer 302a6c2b40 Fix(商品详情):需要根据不同模块来源显示商品不同信息 2024-06-24 16:32:16 +08:00
lifizer d95b57d523 Feat(用户&登录):增加性别和出生日期 2024-06-24 16:10:54 +08:00
lifizer 3e25bf9759 Fix(我的):[#1857]界面调整 2024-06-24 15:15:52 +08:00
lifizer 9ab00a372e Feat(商品详情&店铺):来源模块数据埋点 2024-06-24 15:15:20 +08:00
lifizer 2226d665ad Fix(商品详情):[#1842]隐藏销量 2024-06-24 09:56:46 +08:00
lifizer 44849db20d Fix(入驻):[#1845, #1757]类型选择存在兼容性问题 2024-06-23 11:39:24 +08:00
lifizer eed49847c4 Fix(账户明细):[31841]账户明细空白时,加上暂无消费记录的图片 2024-06-21 17:48:16 +08:00
lifizer f956c5a74c Fix(商品详情):[#1842]隐藏销量 2024-06-21 17:30:36 +08:00
lifizer 57341a6bb5 Fix(我的/订单/退款):[#1689]上传图片和退款理由两项加上必填标识 2024-06-21 17:22:07 +08:00
lifizer fedef62a44 Fix(商品详情):[#1831]产品参数-净含量较长,显示超出规定区域 2024-06-20 17:39:48 +08:00
lifizer 659cce3abe Fix(客服/聊天室):[#1840]“完成”与“发送”按钮功能一致,遮挡内容输入框 2024-06-20 17:35:52 +08:00
lifizer db21546dc9 Fix(招商):[#1839]搜索框键盘回车键无效 2024-06-20 17:27:28 +08:00
lifizer 560a2f49ed Fix(特产):[#1828]页面滑动商品后搜索功能无效 2024-06-20 17:24:37 +08:00
lifizer be61dfbc30 Fix(购物车):[#1837]秒杀商品加入购物车后,从购物车点击秒杀商品进入商品详情页显示为普通商品 2024-06-20 16:11:40 +08:00
lifizer cef0177716 Feat(页面):页面埋点配置 2024-06-17 23:13:22 +08:00
lifizer 19914b5b0d Feat(页面):未登录时页面埋点数据写入缓存以便下次登录时获取上报 2024-06-16 16:33:41 +08:00
lifizer 4e6d5598b7 Fix(分销详情):[#1738]分销详情的说明文本对接 2024-06-16 14:09:21 +08:00
lifizer 2f217e8dc1 Feat(页面):监听页面打开次数和页面停留时长接口对接 2024-06-14 17:59:10 +08:00
lifizer 344e0aa888 Feat(页面):监听页面打开次数和页面停留时长接口对接 2024-06-13 18:09:35 +08:00
lifizer 51bc828dc9 Fix(我的/订单/退款):[#1689]上传图片和退款理由两项加上必填标识 2024-06-04 17:58:05 +08:00
lifizer 2c514164da Fix(我的/提现):[#1686, #1687]不输入任何提现金额,点击“全部提现”/点击空白页面提现金额会自动输入0 2024-06-04 17:56:09 +08:00
lifizer 9458e9347c Fix(我的/设置/支付密码):[#1688]密码输入不规范时仍能保存成功 2024-06-04 17:54:30 +08:00
lifizer 86b927b487 Fix(购物车):[#1609]点击增减商品数量,取消加载效果 2024-05-27 16:23:11 +08:00
lifizer f7dcdc22f1 Fix(我的/收藏):[#1622]未选择任何项目点击“删除”,仍会弹出是否确认删除对话框 2024-05-23 16:33:53 +08:00
lifizer dbdb902e6b Fix(订单/详情):[#1614]买家留言改为靠左换行 2024-05-23 16:26:31 +08:00
lifizer c2968d5da0 Fix(我的/订单):[#1620]各状态订单查看订单详情后返回后会跳转到“全部”订单,不会回到相应订单状态 2024-05-23 16:24:38 +08:00
lifizer 870ad9d5b3 Fix(订单/退款):[#1610]未发货订单申请退款备注说明换行时文字改为靠左显示 2024-05-23 16:23:49 +08:00
lifizer 0022ff1bef Fix(我的/订单):[#1631]待评价的订单点击申请退款 不需要跳转退款页面,直接弹窗提示“订单已收货,如需退款请联系客服”即可 2024-05-23 16:07:09 +08:00
lifizer a4992cc2d2 Fix(招商):[#1607]选择省市区地址内容过长时显示异常 2024-05-22 14:38:30 +08:00
lifizer 8a387de58d Chore(首页):代码格式化&去掉多余的引用 2024-05-22 14:23:24 +08:00
lifizer e8434cf3d3 Fix(购物车):[#1609]点击增减商品数量,取消加载效果 2024-05-22 14:23:11 +08:00
lifizer ac49206b91 Fix(订单):[#1621]已完成的订单无法删除 2024-05-22 14:21:51 +08:00
lifizer e6960b8c2a Fix(我的/收藏):[#1622]未选择任何项目点击“删除”,仍会弹出是否确认删除对话框 2024-05-22 14:11:21 +08:00
lifizer de82fafe9c Chore(首页):代码格式化&去掉多余的引用 2024-05-20 11:13:04 +08:00
lifizer 4a4f8ffdd2 Fix(首页):[#1544]首页做一个回到顶部的按钮,点击后页面往上回弹到首页顶部 2024-05-20 10:56:15 +08:00
lifizer 3dc35f8464 Style:界面细节调整 2024-05-17 18:04:53 +08:00
lifizer 4cfb053573 Fix(全国特产):[#1538]城市列表界面去掉二级三级分类,直接展示所有数据方便运营推广 2024-05-16 18:07:33 +08:00
lifizer 84c5ede725 Feat(页面):监听页面打开次数和页面停留时长逻辑初步实现 2024-05-16 17:23:07 +08:00
lifizer 2b3c0e4355 Feat(抽奖):增加分享 2024-05-15 14:31:09 +08:00
lifizer 148ac41089 Merge branch 'dev' into test 2024-05-09 10:50:37 +08:00
lifizer 82a90630e9 Fix(首页):导航菜单个数少于等于10个时,应不显示底部的指示器 2024-05-09 10:49:15 +08:00
lifizer 9b412eebdb Fix(商品):[#1364]产品参数商品名称自动转行后表格线未延长,部分手机仍然存在问题 2024-04-30 18:04:05 +08:00
lifizer 801132262f Fix(购物车):[#1366]秒杀商品不能修改规格 2024-04-30 15:16:21 +08:00
lifizer 8269a7a07c Fix(入驻/特产/文玩/特色店铺入驻):[#1369]页面底部显示不全 2024-04-30 15:14:46 +08:00
lifizer f57b85193b Fix(入驻/特产/文玩/特色店铺入驻):[#1369]页面底部显示不全 2024-04-30 15:09:39 +08:00
lifizer 2fdc712d57 Fix(店铺):[#1365]店铺资讯查看图片后返回会自动刷新到资讯顶部 2024-04-30 15:09:01 +08:00
lifizer 70853005d9 Fix(店铺/上传):[#1368]店铺主页上传店铺图片,返回后没有显示刚上传的图片 2024-04-30 15:08:10 +08:00
lifizer 4064e214af Fix(民宿专题):1、缺少顶部返回按钮;2、苹果手机页面可以左右滑动 2024-04-30 10:09:09 +08:00
lifizer 6a72159035 Fix(优惠券);[#1344]不满足使用条件的显示为不可用 2024-04-29 23:19:56 +08:00
lifizer 5f93140796 Fix(优惠券);[#1344]不满足使用条件的显示为不可用 2024-04-29 23:02:55 +08:00
lifizer 8b295633b9 Fix(购物车):[#1361]购物车单个商品增加数量,全选后数字未变 2024-04-29 14:30:02 +08:00
lifizer 62a53ad6d1 Fix(订单):[#1358]下架商品从订单列表点击商品图,需提示:商品已下架 2024-04-29 14:22:54 +08:00
lifizer 9c68817612 Fix(提现):[#1202]提现金额不应该减掉手续费,实际到手的金额由后端计算即可 2024-04-29 14:03:11 +08:00
lifizer 19662f97be Fix(搜索):[#1360]商城小程序店铺搜索,商品搜索到底了直接删掉 2024-04-29 14:01:35 +08:00
lifizer 160fc7a65d Fix(入驻):[#1355, #1357]1、隐藏简介;2、增加视频封面上传 2024-04-28 19:41:59 +08:00
lifizer 2f33383251 Fix(订单/评价):[#1354]订单评价先上传9张照片时,仍可以上传视频 2024-04-28 18:07:03 +08:00
lifizer ae93b92dae Fix(搜索/商品列表):[#1352]无商品时需要显示推荐内容 2024-04-28 18:06:35 +08:00
lifizer 46314b4260 Fix(商品):[#1344, #1117]优惠券状态按照实际返回数据状态显示 2024-04-28 17:53:33 +08:00
lifizer dc50adf98d Fix(商品):[#1344, #1117]优惠券状态按照实际返回数据状态显示 2024-04-28 17:37:18 +08:00
lifizer b367938b7a Fix(商品):[#1306]库存显示为具体某一规格的库存 2024-04-28 14:03:36 +08:00
lifizer 5ca669de01 Fix(购物车):提示消息未到时间就消失 2024-04-28 13:55:09 +08:00
lifizer 4c41c9813d Fix(店铺):[#1348, #1011]界面调整 2024-04-28 13:53:28 +08:00
lifizer 40af0a58e6 Feat(搜索):键盘的回车/确定触发搜索 2024-04-27 20:21:41 +08:00
lifizer 3fb32211b2 Fix(店铺):[#1317]个人店铺主页-修改资料-上传新的封面视频,修改资料页面显示为原视频 2024-04-26 23:06:38 +08:00
lifizer dee76a7407 Fix(提现记录):[#1319]提现记录日期显示错误 2024-04-26 23:01:45 +08:00
lifizer 320ba71ca3 Fix(店铺入驻):[#1309]苹果手机兼容性处理 2024-04-26 22:51:11 +08:00
lifizer f7302a3eeb Fix(文玩):[#1115]文玩艺术版块,全部商品列表 商品数量少于5个的类目页面底部没有显示“--没有更多了--” 2024-04-26 22:33:59 +08:00
lifizer a3dd70151d Fix(入驻申请):[#1323]商户入驻,特产/文玩供应商下面的店铺入驻修改提示语 2024-04-26 18:41:22 +08:00
lifizer 5f7073ca4e Fix(订单):[#1314]待评价订单,点击更多—申请退款—直接弹窗提示“订单已收货,如需退款请联系客服”即可,无需跳转到申请退款页面 2024-04-26 18:38:06 +08:00
lifizer c91409150f Fix(购物车):[#1313]购物车点击全选后,取消选择部分商品,全选按钮仍然被勾选 2024-04-26 18:26:29 +08:00
lifizer 6aa3fbdd54 Style:界面细节调整 2024-04-26 10:01:11 +08:00
lifizer ec6575c09e Style:界面细节调整 2024-04-25 16:03:03 +08:00
lifizer 887c350a93 Style:界面细节调整 2024-04-24 16:19:17 +08:00
lifizer 8bc9558828 Style:界面细节调整 2024-04-24 14:36:24 +08:00
lifizer 5fffc98955 Fix(店铺):[#1263]个人店铺主页-修改店铺资料页面企业文化图片数据丢失 2024-04-24 14:36:06 +08:00
lifizer 8b813d1682 Fix(订单):评价上传文件回调报错导致无法预览图片 2024-04-24 14:35:22 +08:00
lifizer c65bb0e312 Style(订单):创建订单界面去掉积分和优惠券显示详细 2024-04-22 22:54:19 +08:00
lifizer 93f82ea55b Fix(订单):[#1193]订单列表已取消状态的订单的标识未显示“已取消”文字 2024-04-22 22:48:49 +08:00
lifizer 79ddcd69ce Fix(订单):[#1221]下单界面选择优惠券后无法取消勾选 2024-04-22 22:48:04 +08:00
lifizer a0c540d474 Feat(订单):使用积分逻辑增加显示判断逻辑 2024-04-22 16:30:41 +08:00
lifizer c0bf4ed2c9 Feat(订单):使用积分逻辑调整 2024-04-22 16:18:47 +08:00
lifizer 82bff005c4 Style(搜索):界面背景色调整 2024-04-22 16:01:10 +08:00
lifizer 07a63eb9d2 Fix(民宿专题):[#1201]苹果手机,首页左侧轮播专题页(民宿专题页)详情页往左划,右侧出现空白 2024-04-22 10:49:03 +08:00
lifizer 171bf1d416 Fix(搜索):[#1197, #1206]列表显示调整 2024-04-22 10:42:39 +08:00
lifizer 255a1b47a0 Fix(购物车):[#1016]规格增减数量异常未提示内容 2024-04-19 15:08:07 +08:00
lifizer bec8625b69 Feat(搜索):增加删除历史搜索记录 2024-04-19 14:57:34 +08:00
lifizer 1393a85a67 Style(搜索):界面细节调整 2024-04-19 14:39:19 +08:00
lifizer 95389ecffb Style(积分):积分规则富文本显示调整 2024-04-19 14:38:07 +08:00
lifizer edf5f64b88 Style(首页):屏蔽每次显示都更新尖货推荐 2024-04-19 14:37:48 +08:00
lifizer 94c6219d54 Fix(购物车):[#1109]苹果兼容性处理 2024-04-19 14:36:45 +08:00
lifizer 6a270836d9 Feat(订单):评价支持上传视频 2024-04-16 21:12:35 +08:00
lifizer 8f9eece29d Style(商品&店铺):界面调整 2024-04-16 18:03:47 +08:00
lifizer b50f201637 Feat(订单):增加视频上传 2024-04-16 18:00:12 +08:00
lifizer 01ff3035fe Style(积分):图片显示字段调整 2024-04-15 21:20:41 +08:00
lifizer 2394057f8d Fix(商品):[#1110]商品详情库存数太多会自动换行,改为可容纳5位数字不换行 2024-04-15 16:24:20 +08:00
lifizer 3c3904345a Fix(首页):[#1113]每次从其他页面返回首页时刷新首页,以达到每次进入首页尖货推荐都随机刷新商品列表的效果 2024-04-15 16:23:38 +08:00
lifizer cfc84ab3db Style(订单):详情界面隐藏拨打电话入口 2024-04-15 16:22:50 +08:00
lifizer 3a7feb1c39 Fix(店铺):[#1107]查看没有商品的店铺企业文化图片,返回会自动刷新到最新资讯页 2024-04-15 16:22:12 +08:00
lifizer 1284affc10 Style(搜索):界面调整 2024-04-09 09:40:06 +08:00
lifizer 3f7b1b8f79 Style(积分):界面调整 2024-04-08 23:55:31 +08:00
lifizer 016fef50aa Feat(搜索):接口对接 2024-04-08 23:46:32 +08:00
lifizer 2fde80fc1d Fix(购物车):规格改为包含小数点的名称后,无法操作 2024-04-08 20:54:36 +08:00
lifizer 0c19894fce Chore(申请入驻):富文本渲染使用rich-text 2024-04-08 17:37:24 +08:00
lifizer 22cd5160bf Feat(购物车):增加切换规格功能 2024-04-08 17:35:39 +08:00
lifizer b02bba911d Fix(抽奖):修复抽奖领取无法更新状态的问题 2024-04-08 13:07:01 +08:00
lifizer 01bed46bce Feat(积分):接口数据对接 2024-04-08 13:06:01 +08:00
lifizer 6b2da9e91d Fix(商品):[#1071]商品详情的立即购买,加入购物车两个按钮,只有在当前商品所有规格库存全部为0时,才变为灰色不可点击状态 2024-04-07 16:55:19 +08:00
lifizer ec0752a267 Fix(全国特产&文玩):[#1060]特别推荐加一个开关,关闭后前端隐藏这部分内容 2024-04-07 16:41:17 +08:00
lifizer 4c14687217 Fix(店铺):[#1068]店铺查看资讯图片返回后,改为停留在点击图片前的位置,不要返回后就刷新页面 2024-04-07 16:08:23 +08:00
lifizer 67ba00b882 Fix(店铺):[#1059]商户入驻传视频,要切换一下选项(图片/视频)才能显示 2024-04-07 16:01:25 +08:00
lifizer 2a98da3ce8 Fix(寻趣味):滚动底部需请求接口加载下一页数据 2024-04-01 22:10:02 +08:00
lifizer a8f701b614 Fix(购物车):左上角删除按钮显示逻辑应该按照已中商品 2024-04-01 22:03:25 +08:00
lifizer fbe7b0b419 Chore:公共代码统一引用 2024-04-01 21:55:22 +08:00
lifizer 624c7f17a2 Fix(购物车):[#1016]商品购买限制数量 2024-04-01 21:54:45 +08:00
lifizer 195035f7ba Chore:删除多余无用文件夹 2024-03-30 13:32:16 +08:00
lifizer f897ed8ae7 Style(订单):列表显示调整 2024-03-30 13:30:45 +08:00
lifizer 96a439a8df Fix(商品):[#1015]规格改为包含小数点的名称后,无法操作 2024-03-30 13:02:38 +08:00
lifizer bc64e2a737 Fix(天天秒杀):[#1017]已抢数量,文字数量过多会被挤到第二行 2024-03-29 23:39:59 +08:00
lifizer c49d686719 Fix(佣金明细):[#1013]苹果手机佣金明细页面,仍然能左右滑动 2024-03-29 23:29:47 +08:00
lifizer 78f1c7b3b6 Fix(商品/订单):[#1021]商品详情页购买时选择优惠券,点击“立即购买”后已显示扣除优惠金额,但点开提交订单页面的优惠券时,优惠券未勾选 2024-03-29 23:23:39 +08:00
lifizer 6eedbfd240 Fix(商品):[#1015]商品规格中含有小数点的字符,无法选中购买 2024-03-29 22:33:01 +08:00
lifizer 209295c581 Fix(订单):[#1022]订单详情,订单列表的属性改为规格 2024-03-29 18:43:29 +08:00
lifizer ce68fd6870 Merge branch 'dev' into test 2024-03-28 11:39:47 +08:00
lifizer cfd09436f1 Chore:代码格式化&删除无用的文件 2024-03-27 17:55:22 +08:00
lifizer eb87337e70 Style(商品详情):文玩店铺和其他类型类型店铺的详情界面统一为同一个 2024-03-27 17:36:41 +08:00
lifizer b96f503652 Conf(接口):生产环境的后端服务地址切换为新地址 2024-03-27 17:26:32 +08:00
lifizer e2b5b8b2c5 Fix(店铺):[#1010, #1009]店铺详情调整 2024-03-27 17:20:05 +08:00
lifizer f6a319714a Conf(标题):统一标题名称 2024-03-26 22:58:58 +08:00
lifizer 78baa1ea47 Fix(节日专题):[#1006, #1007]1、缺少返回按钮;2、页面左右滑动 2024-03-26 22:36:13 +08:00
lifizer 5bb9a2a757 Style(我的):界面调整 2024-03-26 16:09:10 +08:00
lifizer 0288c777f8 Style(我的):界面调整 2024-03-26 14:57:29 +08:00
lifizer d27c8898eb Style(店铺):界面调整 2024-03-26 11:29:49 +08:00
lifizer 49717bf52f Style(店铺):界面调整 2024-03-26 10:36:26 +08:00
lifizer 1764faeed2 Fix(我的):[#995]底部广告图增加点击跳转到页面链接 2024-03-25 16:31:55 +08:00
lifizer ed55ef1341 Style(店铺):界面调整 2024-03-25 16:30:50 +08:00
lifizer 75bec54a76 Merge branch 'dev' into test 2024-03-21 16:58:59 +08:00
lifizer 459f6b31e6 Fix(寻趣味):获取定位和获取列表是异步,导致定位成功之后获得的城市与列表数据不一致
(cherry picked from commit cb92a1f44f)
2024-03-11 11:11:01 +08:00
287 changed files with 61309 additions and 14479 deletions
+4
View File
@@ -1,7 +1,9 @@
<script> <script>
import { clearAllInterval } from '@/utils/util'
export default { export default {
onLaunch: function () { onLaunch: function () {
console.log('App Launch') console.log('App Launch')
clearAllInterval()
}, },
onShow: function () { onShow: function () {
console.log('App Show') console.log('App Show')
@@ -23,4 +25,6 @@ export default {
@import "./assets/css/base.less"; @import "./assets/css/base.less";
@import "./assets/css/reset.less"; @import "./assets/css/reset.less";
@import "./assets/css/style.less"; @import "./assets/css/style.less";
@import "./assets/css/v12-style.less";
@import "./assets/css/aiChat.less";
</style> </style>
+335
View File
@@ -0,0 +1,335 @@
<template>
<view
:class="{
'focus': inputOnFocus
}"
class="fix-page-bottom"
>
<view v-if="inputModel === 'input'" class="bottom-body flex-center-between">
<view class="history-wrap" @click="historyViewHandle">
历史
</view>
<view class="input-container">
<!-- 输入模式切换 -->
<view
class="input-model"
@click="toggleInputModel"
>
<image
:src="webUrl + '/aiChat/microphone.png'"
class="icon"
mode="widthFix"
/>
</view>
<!-- 输入框 -->
<view class="input-wrap flex-center-between">
<input
v-model.trim="prompt"
:show-confirm-bar="false"
:adjust-position="true"
:disabled="loading"
:maxlength="-1"
class="inp"
@confirm="sendHandle"
@focus="promptInputFocusHandle"
@blur="promptInputBlurHandle"
/>
<view v-if="!prompt && !inputOnFocus" class="placeholder-txt">发消息...</view>
</view>
<view
class="send-btn"
@click="sendHandle"
>
<image
:src="webUrl + '/aiChat/send.png'"
class="icon"
mode="widthFix"
/>
</view>
</view>
</view>
<!-- 语音输入 -->
<view
v-if="inputModel === 'sound'"
class="sound-input-wrap"
>
<view class="toggle-btn">
<image
:src="webUrl + '/aiChat/icon-06.png'"
class="input-icon"
mode="widthFix"
@click="toggleInputModel"
/>
</view>
<view
class="sound-wrap"
@touchstart="startRecord"
@touchend="stopRecord"
>
<view v-if="startTaskFlag" class="music-wrap">
<view class="item one" />
<view class="item two" />
<view class="item three" />
<view class="item four" />
<view class="item five" />
<view class="item six" />
<view class="item seven" />
</view>
<image
:src="webUrl + '/aiChat/microphone-big.png'"
class="icon"
mode="widthFix"
/>
<view v-if="startTaskFlag" class="music-wrap music-wrap2">
<view class="item one" />
<view class="item two" />
<view class="item three" />
<view class="item four" />
<view class="item five" />
<view class="item six" />
<view class="item seven" />
</view>
</view>
</view>
</view>
</template>
<script>
import {
makeFileTransTask,
getFileTransResult
} from '@/api/voiceToText/index'
import { VUE_APP_API_URL } from '@/config'
import cookie from '@/utils/store/cookie'
export default {
name: 'BottomSend',
props: {
loading: {
type: Boolean,
default: false
},
keyboardHeight: {
type: Number,
default: 0
}
},
data() {
return {
token: cookie.get('login_status'),
userInfo: cookie.get('userInfo'),
webUrl: this.$VUE_APP_RESOURCES_URL,
// 输入模式:input-键盘,sound-语音
inputModel: 'input',
/**
* 端午节送礼攻略
* 丽江逛吃攻略
* 云南非遗有哪些?
* 怎么申请地理标志保护产品?
* 想找个像《去有风的地方》那样的治愈县城
* 云南有哪些小众县城适合旅居?
*/
prompt: '',
recordManager: null,
// 录音权限是否开通
recordPermission: false,
taskId: '',
taskTimer: null,
startTaskFlag: false,
// 输入框是否聚焦
inputOnFocus: false
}
},
beforeDestroy() {
this.clearIntervalFn()
},
created() {
uni.getSetting({
success: res => {
if (res.authSetting['scope.record']) {
this.recordPermission = true
}
}
})
},
methods: {
promptInputFocusHandle() {
this.$emit('focus', 1)
setTimeout(() => {
this.inputOnFocus = true
}, 100)
},
promptInputBlurHandle() {
this.$emit('focus', 0)
this.inputOnFocus = false
},
toggleInputModel() {
if (!this.token) {
uni.reLaunch({ url: '/pages/auth/login' })
return
}
if (this.loading) return
if (this.inputModel === 'input') {
uni.getSetting({
success: res => {
if (!res.authSetting['scope.record']) {
uni.authorize({
scope: 'scope.record',
success: () => {
console.log('获取录音权限成功')
this.recordPermission = true
this.inputModel = 'sound'
},
fail: () => {
console.log('获取录音权限失败')
this.recordPermission = false
uni.showModal({
title: '提示',
content: '需要获取麦克风权限',
confirmText: '前往设置',
confirmColor: '#3D4CF1',
success(res2) {
if (res2.confirm) {
wx.openSetting()
}
}
})
}
})
} else {
this.recordPermission = true
this.inputModel = 'sound'
}
}
})
return
}
if (this.inputModel === 'sound') {
this.clearIntervalFn()
this.inputModel = 'input'
return
}
},
startRecord() {
if (this.loading) {
this.$toast('正在检索')
return
}
// 正在识别,不触发相关动作
if (this.startTaskFlag || this.taskTimer) {
return
}
this.recordManager = uni.getRecorderManager()
console.log('启动录音')
this.startTaskFlag = true
this.recordManager.start({
duration: 60 * 1000,
frameSize: 1,
sampleRate: 16000,
format: 'wav'
})
},
stopRecord() {
const _this = this
// 正在识别,不触发相关动作
if (this.taskTimer) {
return
}
if (_this.recordManager) {
_this.recordManager.stop()
console.log('停止录音')
_this.startTaskFlag = false
_this.recordManager.onStop((res) => {
console.log('录音结束------------')
console.log(res)
const { tempFilePath, fileSize, duration } = res
if (tempFilePath && fileSize && duration) {
_this.taskId = ''
_this.clearIntervalFn()
uni.showLoading({ title: '识别中...' })
uni.uploadFile({
url: `${VUE_APP_API_URL}/api/upload`,
filePath: tempFilePath,
header: {
Authorization: 'Bearer ' + (_this.token || '')
},
name: 'file',
success: uploadRes => {
console.log(JSON.parse(uploadRes.data))
_this.renderTransTask(uploadRes)
},
fail: err => {
console.log(err)
uni.hideLoading()
_this.$toast('没有听清您说了什么,请再说一遍')
}
})
} else {
_this.$toast('没有听清您说了什么,请再说一遍')
}
})
}
},
renderTransTask(uploadRes) {
const _this = this
const file = JSON.parse(uploadRes.data).link || ''
if (!file) return
makeFileTransTask({
file
}).then(taskRes => {
_this.taskId = taskRes.data
_this.getTransResultReq()
}).catch(() => {
uni.hideLoading()
_this.$toast('没有听清您说了什么,请再说一遍')
})
},
getTransResultReq() {
const _this = this
_this.taskTimer = setInterval(() => {
getFileTransResult({
taskId: _this.taskId
}).then(res => {
const { success, data = [] } = res
if (success && data) {
uni.hideLoading()
_this.clearIntervalFn()
if (data === '__NULL__') {
_this.$toast('没有听清您说了什么,请再说一遍')
} else {
if (data.length > 0) {
const prompt = data[0].Text
if (prompt) {
_this.$emit('send', { prompt: prompt.replace('。', '') })
}
}
}
}
}).catch(() => {
uni.hideLoading()
_this.$toast('没有听清您说了什么,请再说一遍')
})
}, 1000)
},
clearIntervalFn() {
this.taskTimer && clearInterval(this.taskTimer)
this.taskTimer = null
setTimeout(() => {
this.startTaskFlag = false
}, 300)
},
sendHandle() {
if (this.loading) return
if (!this.prompt) {
this.$toast('请输入您想问的内容')
return
}
this.$emit('send', { prompt: this.prompt })
this.prompt = ''
this.inputOnFocus = false
},
historyViewHandle() {
this.$emit('history')
}
}
}
</script>
+268
View File
@@ -0,0 +1,268 @@
<template>
<view
:class="{
'show': showLayer
}"
class="history-wrap"
>
<view class="layer" @click="closeLayer" />
<view
:style="{
'padding-top': statusBarHeight + 'px'
}"
class="history-container"
>
<view class="history-type">
<view class="title">
<view class="txt">今日</view>
<image
v-if="todayList.length > 0"
:src="webUrl + '/aiChat/delete.png'"
class="icon"
mode="widthFix"
@click="deleteRecords(1)"
/>
</view>
<view v-if="todayList.length > 0" class="list-cont">
<view
v-for="(item, index) in todayList"
:key="index"
class="item"
@click="historyItemClick(item)"
>
<view class="item-txt one-t">
{{ item.title }}
</view>
</view>
</view>
<view v-else class="no-data">
<image
:src="webUrl + '/orderIcon/nodata1.png'"
class="img"
mode="widthFix"
/>
</view>
</view>
<view class="history-type">
<view class="title">
<view class="txt">30天内</view>
<image
v-if="list.length > 0"
:src="webUrl + '/aiChat/delete.png'"
class="icon"
mode="widthFix"
@click="deleteRecords(2)"
/>
</view>
<view v-if="list.length > 0" class="list-cont">
<view
v-for="(item, index) in list"
:key="index"
class="item"
@click="historyItemClick(item)"
>
<view class="item-txt one-t">
{{ item.title }}
</view>
</view>
</view>
<view v-else class="no-data">
<image
:src="webUrl + '/orderIcon/nodata1.png'"
class="img"
mode="widthFix"
/>
</view>
</view>
<view class="history-type">
<view class="title">
<view class="txt">超过30天</view>
<image
v-if="moreList.length > 0"
:src="webUrl + '/aiChat/delete.png'"
class="icon"
mode="widthFix"
@click="deleteRecords(3)"
/>
</view>
<view v-if="moreList.length > 0" class="list-cont">
<view
v-for="(item, index) in moreList"
:key="index"
class="item"
@click="historyItemClick(item)"
>
<view class="item-txt one-t">
{{ item.title }}
</view>
</view>
</view>
<view v-else class="no-data">
<image
:src="webUrl + '/orderIcon/nodata1.png'"
class="img"
mode="widthFix"
/>
</view>
</view>
</view>
</view>
</template>
<script>
import {
getChatList,
deleteChatListByType
} from '@/api/chat/index'
export default {
name: 'AiHistoryList',
props: {
statusBarHeight: {
type: Number,
default: 0
},
// 来源模块:''-首页,'history'-历史记录
formModule: {
type: String,
default: ''
}
},
data() {
return {
webUrl: this.$VUE_APP_RESOURCES_URL,
showLayer: false,
todayList: [],
list: [],
moreList: []
}
},
methods: {
showView() {
this.showLayer = true
this.getChatListReq()
},
getChatListReq() {
getChatList().then(res => {
const { success, data } = res
if (success) {
this.todayList = data['今天'] || []
this.list = data['30天内'] || []
this.moreList = data['超过30天'] || []
}
})
},
deleteRecords(type) {
deleteChatListByType(type).then(res => {
const { success } = res
if (success) {
this.getChatListReq()
}
})
},
historyItemClick(item) {
const paramsStr = `?chatNumber=${item.chatNumber}&title=${item.title}&click=1`
if (!this.formModule) {
uni.navigateTo({
url: '/aiChat/views/history' + paramsStr
})
} else {
uni.redirectTo({
url: '/aiChat/views/history' + paramsStr
})
}
this.closeLayer()
},
closeLayer() {
this.showLayer = false
}
}
}
</script>
<style scoped lang="less">
.history-wrap {
position: fixed;
left: 0;
top: 0;
right: 0;
bottom: 0;
z-index: 1001;
transform: translateX(-100%);
opacity: 0;
transition: all 0.3s;
.layer {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: 2;
background-color: rgba(0, 0, 0, 0.5);
}
.history-container {
position: absolute;
left: 0;
top: 0;
bottom: 0;
z-index: 5;
width: 75%;
padding: 40rpx;
box-sizing: border-box;
border-top-right-radius: 60rpx;
border-bottom-right-radius: 60rpx;
overflow-y: auto;
background-color: #fff;
.history-type + .history-type {
padding: 40rpx 0 0 0;
}
.history-type {
.title {
display: flex;
align-items: center;
justify-content: space-between;
.txt {
font-size: 34rpx;
line-height: 50rpx;
}
.icon {
display: block;
width: 40rpx;
height: 40rpx;
}
}
.list-cont {
padding: 24rpx 0 0 0;
.item + .item {
margin: 12rpx 0 0 0;
}
.item {
.item-txt {
display: inline-block;
max-width: 100%;
height: 60rpx;
padding: 0 24rpx;
box-sizing: border-box;
border-radius: 30rpx;
color: #333;
font-size: 28rpx;
line-height: 60rpx;
background-color: #F1F2FF;
}
}
}
.no-data {
.img {
display: block;
width: 300rpx;
height: 300rpx;
margin: 40rpx auto 0 auto;
}
}
}
}
&.show {
opacity: 1;
transform: translateX(0);
}
}
</style>
+404
View File
@@ -0,0 +1,404 @@
import {
getSseConfigV1,
getCompletionsV2,
deleteChatItemByConversationId,
getAnalyzeKeywordsV1,
getAnalyzeKeywordsChangeV1
} from '@/api/chat/index'
import { VUE_APP_API_URL } from '@/config'
import settings from '@/config/baseSetting.js'
import { formatAiMsgContent } from '../utils/aiChat'
import cookie from '@/utils/store/cookie'
import { handleLoginFailure } from '@/utils'
export const chatMixins = {
data() {
return {
token: cookie.get('login_status'),
userInfo: cookie.get('userInfo'),
webUrl: this.$VUE_APP_RESOURCES_URL,
scrollData: {},
scrollTop: 0,
isScrollToBottom: false,
// 状态栏高度
statusBarHeight: 20,
fileHttpStr: Object.freeze(VUE_APP_API_URL + settings.sysPrefix),
keyboardHeight: 0,
optionsFrom: '',
onFocus: false,
loading: false,
chatNumber: '',
infoResData: {},
chatMessageList: [
/*
{
type: -2,
isError: false,
showCursor: false,
conversationId: '',
prompt: '',
nodes: '-------------监听 WebSocket 接受到服务器的消息事件',
content: '-------------监听 WebSocket 接受到服务器的消息事件',
listQuestion: [
'监听 WebSocket 接受到服务器的消息事件',
'监听 WebSocket 接受到服务器的消息事件',
'监听 WebSocket 接受到服务器的消息事件'
]
}
*/
],
errorMsg: Object.freeze('您提的问题未能理解,云灵思想跑偏啦,重新整理一下问题或者重新提问,让云灵再试试!')
}
},
computed: {
chatMessageListLength() {
return this.chatMessageList.length
}
},
onPageScroll(e) {
this.scrollData = e
const scrollTop = e.scrollTop
this.scrollTop = scrollTop
const query = wx.createSelectorQuery().in(this)
query.select('#fixTbabarBody').boundingClientRect(function(rect) {
const contentHeight = rect.height
const windowInfo = wx.getWindowInfo()
const windowHeight = windowInfo.windowHeight
if (scrollTop + windowHeight + 30 >= contentHeight) {
this.isScrollToBottom = true
} else {
this.isScrollToBottom = false
}
}.bind(this)).exec()
},
onUnload() {
this.closeWsFn()
// console.log('在页面卸载时取消监听')
// wx.offKeyboardHeightChange()
},
created() {
const _this = this
uni.getSystemInfo({
success: (e) => {
let statusBar = 0
// #ifdef MP-WEIXIN
statusBar = e.statusBarHeight
const custom = uni.getMenuButtonBoundingClientRect()
_this.rightDistance = e.windowWidth - custom.left + 10
// #endif
// 状态栏高度
_this.statusBarHeight = statusBar
}
})
_this.createdCallbak()
},
methods: {
createdCallbak() {
console.log('页面初始话回调')
},
inputFocusHandle(value) {
this.onFocus = value === 1
this.scrollToBottomHandle()
},
historyViewHandle() {
console.log(this.$refs.historyView)
this.$refs.historyView.showView()
},
copyContentHandle(data) {
uni.setClipboardData({
data,
success: () => {
uni.showToast({
title: '已复制'
})
}
})
},
copyMoreInfoHandle(item) {
uni.setClipboardData({
data: JSON.stringify(item.showMoreInfo),
success: () => {
uni.showToast({
title: '已复制'
})
}
})
},
shareHandle() {
wx.showShareMenu({
withShareTicket: true,
menus: ['shareAppMessage', 'shareTimeline'],
success: (res) => {
console.log(res)
},
fail: err => {
console.log(err)
}
})
},
scrollToBottomHandle() {
uni.pageScrollTo({
duration: 100,
selector: '#bottom_postion'
})
this.isScrollToBottom = true
},
// 重新生成
regenerateHandle(item) {
deleteChatItemByConversationId(item.conversationId).then(res => {
const { success } = res
if (success) {
this.chatMessageList.splice(this.chatMessageListLength - 1, 1)
this.streamReq({
prompt: item.prompt,
init: 1
})
}
})
},
// 建议提问
suggestionItemClickHandle(question) {
this.streamReq({
prompt: question,
init: 0
})
},
// 大家都在问
topicItemClickHandle(question) {
this.streamReq({
prompt: question,
init: 0
})
},
streamReq(params) {
const _this = this
// 需要校验登录状态
if (!_this.token) {
handleLoginFailure()
return
}
const prompt = params.prompt
if (params.init !== 1) {
_this.chatMessageList.push({
prompt,
type: -1
})
}
_this.$nextTick(() => {
_this.scrollToBottomHandle()
})
_this.chatMessageList.push({
content: '',
nodes: '',
isError: false,
showCursor: false,
conversationId: '',
prompt,
listQuestion: [],
type: -2,
showMoreInfo: {}
})
_this.loading = true
_this.showCursor = false
getSseConfigV1({
'chatNumber': _this.chatNumber,
prompt
}).then(resConfig => {
const conversationId = resConfig.data.conversationId
_this.chatNumber = resConfig.data.chatNumber || ''
_this.chatMessageList[_this.chatMessageListLength - 1].showCursor = true
_this.chatMessageList[_this.chatMessageListLength - 1].conversationId = conversationId
if (conversationId) {
_this.initWebSocket(conversationId, () => {
getCompletionsV2({
conversationId,
ws: true,
isNoNeedPublicErrorNotification: 1
}).then(sseRes => {
console.log(sseRes)
// _this.closeWsFn()
}).catch(err => {
console.log(err)
_this.chatErrorSetContent()
})
})
getAnalyzeKeywordsV1({
'chatNumber': _this.chatNumber,
conversationId,
prompt
}).then(keywordRes => {
if (keywordRes.success) {
const keywordResData = keywordRes.data
const show = (keywordResData.searchArtworks ||
keywordResData.searchDiscount ||
keywordResData.searchGoods ||
keywordResData.searchLandmark ||
keywordResData.searchTowns ||
keywordResData.searchTravelGuide
) && (keywordResData.resultItems && keywordResData.resultItems.length > 0)
_this.chatMessageList[_this.chatMessageListLength - 1].showMoreInfo = keywordResData
_this.chatMessageList[_this.chatMessageListLength - 1].showMoreInfo.show = show
// 展示类型
_this.chatMessageList[_this.chatMessageListLength - 1].showMoreInfo.showType = ''
if (show && keywordResData.resultItems) {
keywordResData.resultItems.map(resItem => {
_this.chatMessageList[_this.chatMessageListLength - 1].showMoreInfo.showType = resItem.type
})
}
console.log(_this.chatMessageList[_this.chatMessageListLength - 1])
}
})
} else {
_this.chatErrorSetContent()
}
}).catch(err => {
console.log(err)
_this.chatErrorSetContent()
})
},
analyzeKeywordsChangeHandle(conversationId, showMoreInfo) {
getAnalyzeKeywordsChangeV1({
conversationId,
...showMoreInfo
}).then(res => {
const { success, data } = res
if (success) {
let resultItems = []
let idx = -1
this.chatMessageList.map((item, index) => {
if (item.conversationId === conversationId) {
resultItems = data.resultItems || []
idx = index
}
})
if (idx > -1) {
this.$set(this.chatMessageList[idx].showMoreInfo, 'resultItems', resultItems)
this.$forceUpdate()
}
}
})
},
productItemClickHandle(item) {
this.$yrouter.push({
path: '/pages/shop/GoodsCon/index',
query: {
id: item.id
}
})
},
hotelItemClickHandle(item) {
this.$yrouter.push({
path: '/pagesInn/inn/innHome',
query: {
id: item.id
}
})
},
ichItemClickHandle(item) {
this.$yrouter.push({
path: '/pkg_product/views/heritage/details',
query: {
id: item.id
}
})
},
qianxianItemClickHandle(item) {
this.$yrouter.push({
path: '/pkg_product/views/famousQianxianShop',
query: {
id: item.id
}
})
},
chatErrorSetContent() {
this.chatMessageList[this.chatMessageListLength - 1].isError = true
this.chatMessageList[this.chatMessageListLength - 1].content = this.errorMsg
this.chatMessageList[this.chatMessageListLength - 1].nodes = this.errorMsg
this.closeWsFn()
},
closeWsFn() {
this.loading = false
if (this.chatMessageListLength) {
this.chatMessageList[this.chatMessageListLength - 1].showCursor = false
}
uni.closeSocket({
success: () => {
console.log('-----关闭连接')
}
})
this.$nextTick(() => {
this.scrollToBottomHandle()
})
},
initWebSocket(conversationId, cb) {
const _this = this
console.log('------------------创建连接')
uni.connectSocket({
url: VUE_APP_API_URL.replace('https', 'wss') + settings.sysPrefix + `v1/chat/websocket/${_this.userInfo.unionId}-${conversationId}`,
header: {
'content-type': 'application/json'
},
timeout: 10 * 1000,
success: () => {
console.log('------------WebSocket初始化成功')
},
fail: (err) => {
uni.showModal({
showCancel: false,
content: err
})
}
})
uni.onSocketMessage(res => {
_this.websocketOnmessage(res)
})
uni.onSocketOpen(() => {
cb && cb()
_this.websocketOnopen()
})
uni.onSocketError(err => {
_this.websocketOnerror(err)
})
},
websocketOnmessage(res) {
console.log('-------------监听 WebSocket 接受到服务器的消息事件')
const resData = JSON.parse(res.data)
if (resData) {
const message = resData.message
if (message && this.chatMessageListLength > 1) {
const mesContent = message.content
this.chatMessageList[this.chatMessageListLength - 1].nodes = formatAiMsgContent(mesContent)
this.chatMessageList[this.chatMessageListLength - 1].content = mesContent
this.chatMessageList[this.chatMessageListLength - 1].listQuestion = message.listQuestion || []
this.$forceUpdate()
this.$nextTick(() => {
this.scrollToBottomHandle()
if (message.finish) {
this.closeWsFn()
}
})
}
}
},
websocketOnopen() {
console.log('------------------监听 WebSocket 连接打开事件')
// this.websocketSend(JSON.stringify({ msg: '1' }))
},
websocketOnerror(e) {
console.log('-----------------监听 WebSocket 错误事件')
console.log(e)
},
websocketSend(msg) {
// 数据发送
try {
uni.sendSocketMessage({
data: msg,
success: () => {
console.log('-----------发送消息成功了')
}
})
} catch (err) {
console.log('send failed (' + err.code + ')')
}
}
}
}
+90
View File
@@ -0,0 +1,90 @@
// 引入markdown-it库
import MarkdownIt from './/markdown-it.min.js'
// hljs是由 Highlight.js 经兼容性修改后的文件,请勿直接升级。否则会造成uni-app-vue3-Android下有兼容问题
import hljs from './highlight/highlight-uni.min.js'
// 初始化 MarkdownIt库
const markdownIt = MarkdownIt({
// 在源码中启用 HTML 标签
html: true,
// 如果结果以 <pre ... 开头,内部包装器则会跳过。
highlight: function(str, lang) {
// if (lang && hljs.getLanguage(lang)) {
// console.error('lang', lang)
// try {
// return '<pre class="hljs" style="padding: 5px 8px;margin: 5px 0;overflow: auto;display: block;"><code>' +
// hljs.highlight('lang', str, true).value +
// '</code></pre>';
// } catch (__) {}
// }
// 经过highlight.js处理后的html
let preCode = ''
try {
preCode = hljs.highlightAuto(str).value
} catch (err) {
preCode = markdownIt.utils.escapeHtml(str)
}
// 以换行进行分割
const lines = preCode.split(/\n/).slice(0, -1)
// 添加自定义行号
let html = lines.map((item, index) => {
// 去掉空行
if (item === '') {
return ''
}
return '<li><span class="line-num" data-line="' + (index + 1) + '"></span>' + item + '</li>'
}).join('')
html = '<ol style="padding: 0px 30px;">' + html + '</ol>'
let htmlCode = `<div style="background:#0d1117;margin-top: 5px;color: #888;padding:5px 0;border-radius: 5px;">`
htmlCode += `<pre class="hljs" style="padding:0 8px;margin-bottom:5px;overflow: auto;display: block;border-radius: 5px;"><code>${html}</code></pre>`
htmlCode += '</div>'
return htmlCode
}
})
export function formatAiMsgContent(val) {
if (!val) {
return ''
}
let htmlString = ''
// 修改转换结果的htmlString值 用于正确给界面增加鼠标闪烁的效果
// 判断markdown中代码块标识符的数量是否为偶数
if (val.split('```').length % 2) {
let msgContent = val
if (msgContent[msgContent.length - 1] !== '\n') {
msgContent += '\n'
}
msgContent += ' <span class="cursor">|</span>'
htmlString = markdownIt.render(msgContent)
} else {
htmlString = markdownIt.render(val)
htmlString = markdownIt.render(val) + ' \n <span class="cursor">|</span>'
}
// console.log(htmlString)
return htmlString
}
/**
* 简单实现防抖方法
*
* 防抖(debounce)函数在第一次触发给定的函数时,不立即执行函数,而是给出一个期限值(delay),比如100ms。
* 如果100ms内再次执行函数,就重新开始计时,直到计时结束后再真正执行函数。
* 这样做的好处是如果短时间内大量触发同一事件,只会执行一次函数。
*
* @param fn 要防抖的函数
* @param delay 防抖的毫秒数
* @returns {Function}
*/
export function simpleDebounce(fn, delay = 100) {
let timer = null
return function() {
const args = arguments
if (timer) {
clearTimeout(timer)
}
timer = setTimeout(() => {
fn.apply(null, args)
}, delay)
}
}
+10
View File
@@ -0,0 +1,10 @@
pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}/*!
Theme: GitHub Dark
Description: Dark theme as seen on github.com
Author: github.com
Maintainer: @Hirse
Updated: 2021-05-15
Outdated base version: https://github.com/primer/github-syntax-dark
Current colors taken from GitHub's CSS
*/.hljs{color:#c9d1d9;background:#0d1117}.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language_{color:#ff7b72}.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#d2a8ff}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-variable{color:#79c0ff}.hljs-meta .hljs-string,.hljs-regexp,.hljs-string{color:#a5d6ff}.hljs-built_in,.hljs-symbol{color:#ffa657}.hljs-code,.hljs-comment,.hljs-formula{color:#8b949e}.hljs-name,.hljs-quote,.hljs-selector-pseudo,.hljs-selector-tag{color:#7ee787}.hljs-subst{color:#c9d1d9}.hljs-section{color:#1f6feb;font-weight:700}.hljs-bullet{color:#f2cc60}.hljs-emphasis{color:#c9d1d9;font-style:italic}.hljs-strong{color:#c9d1d9;font-weight:700}.hljs-addition{color:#aff5b4;background-color:#033a16}.hljs-deletion{color:#ffdcd7;background-color:#67060c}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+473
View File
@@ -0,0 +1,473 @@
<template>
<view
:class="scrollTop > 0 ? 'page-scroll' : ''"
class="fix-tabbar-page"
>
<hx-navbar
:back="true"
:fixed="true"
:statusBar="true"
:pageScroll.sync="scrollData"
:title="pageTitle"
color="#333"
transparent="auto"
barPlaceholder="hidden"
/>
<view
id="fixTbabarBody"
:style="{
'padding-top': (44 + statusBarHeight) + 'px'
}"
class="fix-tabbar-body"
>
<view class="chat-wrap">
<view v-if="chatMessageListLength > 0" class="chat-list-wrap">
<view
v-for="(item, index) in chatMessageList"
:key="index"
class="chat-message-item"
>
<view v-if="item.type === -1" class="chat-message-body">
<view class="item-right">
<view class="txt">
{{ item.prompt }}
</view>
</view>
</view>
<view v-if="item.type === -2" class="chat-message-body">
<view class="avatar">
<image
:src="webUrl + '/aiChat/avatar.png'"
class="chat-avatar"
mode="widthFix"
/>
</view>
<view class="item-left">
<view class="txt">
<view
ref="rich-text-box"
:class="{
'show-cursor': item.showCursor
}"
class="rich-text-box"
>
<rich-text
v-if="item.nodes && item.nodes.length"
:nodes="item.nodes"
space="nbsp"
/>
<view v-if="!(item.nodes && item.nodes.length) && loading" class="loader-wrap">
<div class="loader" />
</view>
</view>
<view
v-if="!item.showCursor && item.nodes && item.nodes.length && !item.isError"
class="bottom-btns"
>
<!-- <button
open-type="share"
plain="true"
class="item"
@click="shareHandle"
>
<image
:src="webUrl + '/icon-25.png'"
class="icon"
mode="widthFix"
/>
分享
</button> -->
<view class="item" @click="copyContentHandle(item.content)">
<image
:src="webUrl + '/aiChat/icon-02.png'"
class="icon"
mode="widthFix"
/>
复制
</view>
<view
v-if="index === (chatMessageListLength - 1)"
class="item"
@click="regenerateHandle(item)"
>
<image
:src="webUrl + '/aiChat/icon-04.png'"
class="icon"
mode="widthFix"
/>
重新生成
</view>
</view>
</view>
</view>
<!-- 换一换 -->
<view
v-if="item.showMoreInfo.show"
class="change-list-wrap"
>
<view v-if="item.showMoreInfo.showType === '特产商品'" class="list-wrap">
<view
v-for="(productItem, productIndex) in item.showMoreInfo.resultItems"
:key="productIndex"
class="product-item"
@click="productItemClickHandle(productItem)"
>
<image
:src="productItem.img"
class="img"
/>
<view class="product-info">
<view class="name one-t">
{{ productItem.name }}
</view>
<view class="price-wrap">
<view class="price">
<text class="txt"></text>{{ productItem.price }}
</view>
<view class="btn">立即查看</view>
</view>
</view>
</view>
</view>
<view v-if="item.showMoreInfo.showType === '店铺'" class="list-wrap">
<view
v-for="(hotel, hotelIndex) in item.showMoreInfo.resultItems"
:key="hotelIndex"
class="product-item"
@click="hotelItemClickHandle(hotel)"
>
<view class="hotel-type">
手工体验
</view>
<image
:src="hotel.img"
class="img"
/>
<view class="product-info">
<view class="name one-t">
{{ hotel.name }}
</view>
<view class="desc-wrap one-t">
{{ hotel.description || '' }}
</view>
</view>
</view>
</view>
<view v-if="item.showMoreInfo.showType === '非遗文化'" class="list-wrap">
<view
v-for="(ich, ichIndex) in item.showMoreInfo.resultItems"
:key="ichIndex"
class="product-item"
@click="ichItemClickHandle(ich)"
>
<image
:src="ich.img"
class="img"
/>
<view class="product-info">
<view class="name one-t">
{{ ich.name }}
</view>
<view class="desc-wrap one-t">
{{ ich.description || '' }}
</view>
</view>
</view>
</view>
<view v-if="item.showMoreInfo.showType === '千县名品'" class="list-wrap">
<view
v-for="(qianxian, qianxianIndex) in item.showMoreInfo.resultItems"
:key="qianxianIndex"
class="product-item"
@click="qianxianItemClickHandle(qianxian)"
>
<image
:src="qianxian.img"
class="img"
/>
<view class="product-info">
<view class="name name2 one-t">
{{ qianxian.name }}
</view>
</view>
</view>
</view>
<view class="change-btn">
<image
:src="webUrl + '/aiChat/icon-change.png'"
class="icon"
mode="widthFix"
@click="analyzeKeywordsChangeHandle(item.conversationId, item.showMoreInfo)"
/>
</view>
</view>
<view
v-if="index === (chatMessageListLength - 1) && item.listQuestion.length > 0"
class="suggestion-wrap"
>
<view class="suggestion-list">
<view
v-for="(question, questionIndex) in item.listQuestion"
:key="questionIndex"
class="item"
@click="suggestionItemClickHandle(question)"
>
<view class="item-cont">
<view class="txt">
{{ question }}
</view>
<image
:src="webUrl + '/aiChat/icon-03.png'"
class="pic"
mode="widthFix"
/>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
<view id="bottom_postion" class="bottom-postion" />
</view>
</view>
<view
:class="{
'focus': onFocus
}"
class="page-to-bottom"
>
<view
class="new-chat"
@click="createNewHandle"
>
<image
:src="webUrl + '/aiChat/icon-05.png'"
class="btn-icon"
mode="widthFix"
/>
开启新对话
</view>
<image
v-if="chatMessageListLength > 0 && !isScrollToBottom && !loading"
:src="webUrl + '/aiChat/down.png'"
class="icon"
mode="widthFix"
@click="scrollToBottomHandle"
/>
</view>
<bottom-send
ref="bottomSend"
:loading="loading"
:keyboard-height="keyboardHeight"
@send="streamReq"
@history="historyViewHandle"
@focus="inputFocusHandle"
/>
<AiHistoryList
ref="historyView"
:status-bar-height="statusBarHeight"
form-module="history"
/>
</view>
</template>
<script>
import { chatMixins } from '../mixins/chatMixins.js'
import AiHistoryList from '../components/historyList'
import BottomSend from '../components/bottomSend.vue'
import {
historyChatMessage
} from '@/api/chat/index'
import { formatAiMsgContent } from '../utils/aiChat'
export default {
name: 'AiChatHistoryPage',
components: {
AiHistoryList,
BottomSend
},
mixins: [chatMixins],
data() {
return {
pageTitle: ''
}
},
onLoad(options) {
this.chatNumber = options.chatNumber
this.pageTitle = options.title
this.pageTitle = this.pageTitle.length > 8 ? (this.pageTitle.substring(0, 8) + '...') : this.pageTitle
this.init()
},
methods: {
init() {
this.loading = true
historyChatMessage({
chatNumber: this.chatNumber
}).then(res => {
const { success, data = [] } = res
if (success) {
this.loading = false
try {
data.map(item => {
if (item.role === 'user') {
this.chatMessageList.push({
type: -1,
prompt: item.content
})
} else {
if (item.contentType === 'text') {
this.chatMessageList.push({
...item,
nodes: formatAiMsgContent(item.content),
prompt: this.getParentPrompt(data, item.parentMessageId),
conversationId: item.messageId,
showCursor: false,
listQuestion: item.listQuestion || [],
type: -2
})
}
}
})
} catch (err) {
uni.showModal({
title: '错误提示',
content: JSON.stringify(err)
})
console.log(err)
}
}
}).catch(() => {
this.loading = false
})
},
getParentPrompt(list = '', parentMessageId) {
let prompt = ''
list.map(item => {
if (item.messageId === parentMessageId) {
prompt = item.content
}
})
return prompt
},
// 创建新会话
createNewHandle() {
uni.setStorageSync('addNewChat', '1')
uni.navigateBack()
}
}
}
</script>
<style lang="scss" scoped>
.chat-wrap {
padding: 0 0 180rpx 0;
.chat-info-wrap {
padding: 24rpx;
.chat-list-wrap2 {
padding: 0;
}
}
}
.loading-wrap {
text-align: center;
color: #666;
line-height: 120rpx;
}
.rich-text-box {
max-width: 100%;
}
.show-cursor .cursor {
display: inline-block;
color: #3D4CF1;
font-weight: bold;
animation: blinking 1s infinite;
}
@keyframes blinking {
from {
opacity: 1.0;
}
to {
opacity: 0.0;
}
}
.focus-guide-wrap {
display: flex;
align-items: center;
justify-content: space-between;
padding: 60rpx 40rpx;
.guide-left {
.avatar {
display: block;
width: 267rpx;
height: 530rpx;
}
}
.guide-right {
padding: 30rpx;
margin: 0 0 0 40rpx;
border-radius: 20rpx;
font-size: 24rpx;
background-color: #fff;
box-shadow: 0rpx 12rpx 30rpx rgba(0,0,0,0.1);
.title {
font-weight: bold;
}
.content {
padding: 30rpx 0 0 0;
color: #999;
}
}
}
.topic-wrap {
width: 100%;
.title {
display: flex;
align-items: center;
justify-content: center;
.txt {
width: 186rpx;
height: 46rpx;
margin: 0 20rpx;
border-radius: 24rpx;
text-align: center;
line-height: 46rpx;
color: #fff;
font-size: 26rpx;
background-color: #3D4CF1;
}
.icon {
display: flex;
width: 40rpx;
}
}
.list-wrap {
width: 100%;
margin: 60rpx 0 0 0;
overflow-x: auto;
.list-cont {
display: flex;
flex-wrap: wrap;
width: 150%;
.list-item {
display: flex;
align-items: center;
height: 40rpx;
padding: 0 12rpx;
margin: 0 30rpx 30rpx 0;
border-radius: 20rpx;
font-size: 24rpx;
color: #666;
background: rgba(255,255,255,0.39);
box-shadow: 0rpx 6rpx 12rpx rgba(0,0,0,0.1);
.icon {
display: block;
width: 24rpx;
height: 24rpx;
margin: 0 8rpx 0 0;
}
}
}
}
}
</style>
+577
View File
@@ -0,0 +1,577 @@
<template>
<view
:class="scrollTop > 0 ? 'page-scroll' : ''"
class="fix-tabbar-page"
>
<hx-navbar
:back="false"
:fixed="true"
:statusBar="true"
:pageScroll.sync="scrollData"
left-icon="arrowleft"
color="#333"
transparent="auto"
barPlaceholder="hidden"
title="云灵AI智能助手"
@click-left="clickBackHandle"
/>
<page-container
:show="true"
:overlay="false"
:z-index="1"
@beforeleave="pageContainerBeforeleave"
>
<view style="opacity: 0;">
遮罩层用于监听实体键返回
</view>
</page-container>
<view
id="fixTbabarBody"
:style="{
'padding-top': (44 + statusBarHeight) + 'px'
}"
class="fix-tabbar-body"
>
<block v-if="chatMessageListLength < 1">
<view class="home-focus-wrap">
<view class="focus-guide-wrap">
<view class="guide-left">
<image
:src="webUrl + '/aiChat/logo-01.gif'"
class="avatar"
mode="widthFix"
/>
</view>
<view class="guide-right">
<view class="trangle" />
<view class="title">{{ settingInfo.helloMessageTitle }}</view>
<view class="content">{{ settingInfo.helloMessageContent }}</view>
</view>
</view>
</view>
<view class="topic-wrap">
<view class="title">
<image
:src="webUrl + '/aiChat/icon-01.png'"
class="icon"
mode="widthFix"
/>
<view class="txt">#大家都在问</view>
<image
:src="webUrl + '/aiChat/icon-01.png'"
class="icon"
mode="widthFix"
/>
</view>
<view class="list-wrap">
<view
:style="{
'width': animationWidth,
'animation': animationStr
}"
class="list-cont"
>
<view
v-for="(item, index) in topicList"
:key="index"
class="list-item"
@click="topicItemClickHandle(item.title)"
>
<image
v-if="item.isHot"
:src="webUrl + '/aiChat/hot.png'"
class="icon"
mode="widthFix"
/>
{{ item.title }}
</view>
</view>
</view>
</view>
</block>
<view class="chat-wrap">
<view v-if="chatMessageListLength > 0" class="chat-list-wrap">
<view
v-for="(item, index) in chatMessageList"
:key="index"
class="chat-message-item"
>
<view v-if="item.type === -1" class="chat-message-body">
<view class="item-right">
<view class="txt">
{{ item.prompt }}
</view>
</view>
</view>
<view v-if="item.type === -2" class="chat-message-body">
<view class="avatar">
<image
:src="webUrl + '/aiChat/avatar.png'"
class="chat-avatar"
mode="widthFix"
/>
</view>
<view class="item-left">
<view class="txt">
<view
ref="rich-text-box"
:class="{
'show-cursor': item.showCursor
}"
class="rich-text-box"
>
<rich-text
v-if="item.nodes && item.nodes.length"
:nodes="item.nodes"
space="nbsp"
/>
<view v-if="!(item.nodes && item.nodes.length) && loading" class="loader-wrap">
<div class="loading2" />
</view>
</view>
<view
v-if="!item.showCursor && item.nodes && item.nodes.length && !item.isError"
class="bottom-btns"
>
<!-- <button
open-type="share"
plain="true"
class="item"
@click="shareHandle"
>
<image
:src="webUrl + '/icon-25.png'"
class="icon"
mode="widthFix"
/>
分享
</button> -->
<view class="item" @click="copyContentHandle(item.content)">
<image
:src="webUrl + '/aiChat/icon-02.png'"
class="icon"
mode="widthFix"
/>
复制
</view>
<view
v-if="index === (chatMessageListLength - 1)"
class="item"
@click="regenerateHandle(item)"
>
<image
:src="webUrl + '/aiChat/icon-04.png'"
class="icon"
mode="widthFix"
/>
重新生成
</view>
<view class="item item2" @click="copyMoreInfoHandle(item)">拷贝</view>
</view>
</view>
</view>
<!-- 换一换 -->
<view
v-if="item.showMoreInfo.show"
class="change-list-wrap"
>
<view v-if="item.showMoreInfo.showType === '特产商品'" class="list-wrap">
<view
v-for="(productItem, productIndex) in item.showMoreInfo.resultItems"
:key="productIndex"
class="product-item"
@click="productItemClickHandle(productItem)"
>
<image
:src="productItem.img"
class="img"
/>
<view class="product-info">
<view class="name one-t">
{{ productItem.name }}
</view>
<view class="price-wrap">
<view class="price">
<text class="txt"></text>{{ productItem.price }}
</view>
<view class="btn">立即查看</view>
</view>
</view>
</view>
</view>
<view v-if="item.showMoreInfo.showType === '店铺'" class="list-wrap">
<view
v-for="(hotel, hotelIndex) in item.showMoreInfo.resultItems"
:key="hotelIndex"
class="product-item"
@click="hotelItemClickHandle(hotel)"
>
<view class="hotel-type">
手工体验
</view>
<image
:src="hotel.img"
class="img"
/>
<view class="product-info">
<view class="name one-t">
{{ hotel.name }}
</view>
<view class="desc-wrap one-t">
{{ hotel.description || '' }}
</view>
</view>
</view>
</view>
<view v-if="item.showMoreInfo.showType === '非遗文化'" class="list-wrap">
<view
v-for="(ich, ichIndex) in item.showMoreInfo.resultItems"
:key="ichIndex"
class="product-item"
@click="ichItemClickHandle(ich)"
>
<image
:src="ich.img"
class="img"
/>
<view class="product-info">
<view class="name one-t">
{{ ich.name }}
</view>
<view class="desc-wrap one-t">
{{ ich.description || '' }}
</view>
</view>
</view>
</view>
<view v-if="item.showMoreInfo.showType === '千县名品'" class="list-wrap">
<view
v-for="(qianxian, qianxianIndex) in item.showMoreInfo.resultItems"
:key="qianxianIndex"
class="product-item"
@click="qianxianItemClickHandle(qianxian)"
>
<image
:src="qianxian.img"
class="img"
/>
<view class="product-info">
<view class="name name2 one-t">
{{ qianxian.name }}
</view>
</view>
</view>
</view>
<view class="change-btn">
<image
:src="webUrl + '/aiChat/icon-change.png'"
class="icon"
mode="widthFix"
@click="analyzeKeywordsChangeHandle(item.conversationId, item.showMoreInfo)"
/>
</view>
</view>
<view
v-if="index === (chatMessageListLength - 1) && item.listQuestion.length > 0"
class="suggestion-wrap"
>
<view class="suggestion-list">
<view
v-for="(question, questionIndex) in item.listQuestion"
:key="questionIndex"
class="item"
@click="suggestionItemClickHandle(question)"
>
<view class="item-cont">
<view class="txt">
{{ question }}
</view>
<image
:src="webUrl + '/aiChat/icon-03.png'"
class="pic"
mode="widthFix"
/>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
<view id="bottom_postion" class="bottom-postion" />
</view>
</view>
<view
:class="{
'focus': onFocus
}"
class="page-to-bottom"
>
<view
v-if="chatNumber"
class="new-chat"
@click="createNewHandle"
>
<image
:src="webUrl + '/aiChat/icon-05.png'"
class="btn-icon"
mode="widthFix"
/>
开启新对话
</view>
<image
v-if="chatMessageListLength > 0 && !isScrollToBottom && !loading"
:src="webUrl + '/aiChat/down.png'"
class="icon"
mode="widthFix"
@click="scrollToBottomHandle"
/>
</view>
<bottom-send
ref="bottomSend"
:loading="loading"
:keyboard-height="keyboardHeight"
@send="streamReq"
@add="createNewHandle"
@history="historyViewHandle"
@focus="inputFocusHandle"
/>
<AiHistoryList
ref="historyView"
:status-bar-height="statusBarHeight"
/>
</view>
</template>
<script>
import { chatMixins } from '../mixins/chatMixins.js'
import {
getAiSystemInfoSetting,
getAiSystemInfoTopic
} from '@/api/public'
import AiHistoryList from '../components/historyList'
import BottomSend from '../components/bottomSend.vue'
export default {
name: 'AiChatIndexPage',
components: {
AiHistoryList,
BottomSend
},
mixins: [chatMixins],
data() {
return {
animationWidth: '150%',
animationStr: '',
settingInfo: {},
topicList: []
}
},
onShow() {
const addNewChat = uni.getStorageSync('addNewChat') === '1'
// 从历史界面点击新增对话
if (addNewChat && this.chatNumber) {
console.log(addNewChat)
uni.removeStorageSync('addNewChat')
this.createNewHandle()
}
},
onUnload() {
this.closeWsFn()
},
methods: {
createdCallbak() {
this.$nextTick(() => {
this.scrollToBottomHandle()
getAiSystemInfoSetting().then(res => {
const { success, data } = res
if (success) {
this.settingInfo = data
this.animationWidth = `${data.systemTopicDivMaxWidth * 750}rpx`
this.animationStr = `TranslateXSwiper-${data.systemTopicDivMaxWidth * 10} ${data.systemTopicDivScrollDuration}s infinite linear alternate`
}
})
getAiSystemInfoTopic().then(res => {
const { success, data } = res
if (success) {
this.topicList = data || []
}
})
})
},
// 创建新会话
createNewHandle() {
if (!this.chatNumber) return
this.closeWsFn()
this.chatNumber = ''
this.showCursor = false
this.loading = false
this.getConfigLoading = false
this.chatMessageList = []
},
clickBackHandle() {
if (!this.chatNumber) {
if (getCurrentPages().length > 1) {
uni.navigateBack()
} else {
uni.reLaunch({
url: '/pages/home/index'
})
}
} else {
this.createNewHandle()
}
},
pageContainerBeforeleave() {
if (!this.chatNumber) {
if (getCurrentPages().length > 1) {
uni.navigateBack()
} else {
uni.reLaunch({
url: '/pages/home/index'
})
}
} else {
this.createNewHandle()
}
}
}
}
</script>
<style lang="scss" scoped>
.chat-wrap {
padding: 0 0 180rpx 0;
.chat-info-wrap {
padding: 24rpx;
.chat-list-wrap2 {
padding: 0;
}
}
}
.loading-wrap {
text-align: center;
color: #666;
line-height: 120rpx;
}
.rich-text-box {
max-width: 100%;
}
.show-cursor .cursor {
display: inline-block;
color: #3D4CF1;
font-weight: bold;
animation: blinking 1s infinite;
}
@keyframes blinking {
from {
opacity: 1.0;
}
to {
opacity: 0.0;
}
}
.focus-guide-wrap {
display: flex;
align-items: center;
justify-content: space-between;
padding: 60rpx 40rpx;
.guide-left {
.avatar {
display: block;
width: 267rpx;
height: 530rpx;
}
}
.guide-right {
position: relative;
padding: 30rpx;
margin: 0 0 0 40rpx;
border-radius: 20rpx;
font-size: 28rpx;
background-color: #fff;
box-shadow: 0rpx 12rpx 30rpx rgba(0,0,0,0.1);
.trangle {
position: absolute;
bottom: 120rpx;
left: -15rpx;
width: 30rpx;
height: 30rpx;
background-color: #fff;
box-shadow: -30rpx 12rpx 30rpx rgba(0,0,0,0.1);
transform: rotate(45deg);
}
.title {
width: 110%;
font-weight: bold;
}
.content {
padding: 30rpx 0 0 0;
color: #999;
}
}
}
.topic-wrap {
width: 100%;
.title {
display: flex;
align-items: center;
justify-content: center;
.txt {
width: 186rpx;
height: 46rpx;
margin: 0 20rpx;
border-radius: 24rpx;
text-align: center;
line-height: 46rpx;
color: #fff;
font-size: 28rpx;
background-color: #3D4CF1;
}
.icon {
display: flex;
width: 40rpx;
height: 32rpx;
}
}
.list-wrap {
width: 100%;
margin: 60rpx 0 0 0;
overflow-x: hidden;
.list-cont {
display: flex;
flex-wrap: wrap;
width: 750 * 1.5rpx;
padding: 0 0 0 24rpx;
box-sizing: border-box;
// animation: translateXSwiper 10s infinite linear alternate;
.list-item {
display: flex;
align-items: center;
height: 48rpx;
padding: 0 18rpx;
margin: 0 30rpx 30rpx 0;
border-radius: 24rpx;
font-size: 28rpx;
color: #666;
background: rgba(255,255,255,0.39);
box-shadow: 0rpx 6rpx 12rpx rgba(0,0,0,0.1);
.icon {
display: block;
width: 24rpx;
height: 24rpx;
margin: 0 8rpx 0 0;
}
}
}
}
}
@keyframes translateXSwiper {
0% {
transform: translateX(0);
}
100% {
transform: translateX(-50%);
}
}
</style>
+10
View File
@@ -151,3 +151,13 @@ export function getBargainUserList(data) {
export function getBargainUserCancel(data) { export function getBargainUserCancel(data) {
return request.post("/bargain/user/cancel", data); return request.post("/bargain/user/cancel", data);
} }
/**
* 新品专区
* @param {*} data
* @returns
*/
export function queryNewZone() {
return request.get("/newGoods");
}
+39
View File
@@ -0,0 +1,39 @@
import request from '@/utils/request'
export function getSseConfigV1(data) {
return request.post('/v1/chat/sse/message', data, { login: true })
}
export function getCompletions(params) {
return request.get('/v1/chat/sse/completions', params, { login: true })
}
export function getCompletionsV2(params) {
return request.get('/v1/chat/sse/completions2', params, { login: true })
}
// 通过关键字-搜索列表
export function getAnalyzeKeywordsV1(data) {
return request.post('/v1/chat/analyzeKeywords', data, { login: true })
}
// 通过关键字-搜索列表-换一换
export function getAnalyzeKeywordsChangeV1(data) {
return request.post('/v1/chat/aiSearch', data, { login: true })
}
export function deleteChatItemByConversationId(id) {
return request.delete('/v1/chat/message/' + id, {}, { login: true })
}
export function getChatList(params) {
return request.get('/v1/chat', params, { login: true })
}
export function historyChatMessage(params) {
return request.get('/v1/chat/message', params, { login: true })
}
export function deleteChatListByType(type) {
return request.delete('/v1/chat/type/' + type, {}, { login: true })
}
+27
View File
@@ -0,0 +1,27 @@
import request from "@/utils/request";
export function getFarmerShop(id) {
return request.get("/countyFamous/farmerShop/" + id)
}
export function setFarmerShopZan(data) {
return request.post("/countyFamous/farmerShop/zan", data)
}
export function getFarmerShopNews(data) {
return request.get("/countyFamous/farmerShop/news", data)
}
export function getFarmerShopQualification(data) {
return request.get("/countyFamous/farmerShop/qualification", data)
}
export function setFarmerShopCollection(data) {
return request.post("/collection/farmerShop/add", data)
}
export function removeFarmerShopCollection(data) {
return request.post("/collection/farmerShop/remove", data)
}
+7
View File
@@ -69,3 +69,10 @@ export function getVideoList(page = 1, limit = 10) {
export function removeFavorite(ids) { export function removeFavorite(ids) {
return request.post('/collection/delete', ids) return request.post('/collection/delete', ids)
} }
/**
* 收藏千县名品县城列表
* */
export function getCountyFamousList(page = 1, limit = 10) {
return request.get('/collection/countyFamous/list', {page, limit})
}
+66
View File
@@ -0,0 +1,66 @@
import request from "@/utils/request";
/**
* 礼品卡送礼订单确认
* @param {*} data
*/
export function getGiftCardSendOrderConfirm(data) {
return request.post("/giftCard/confirm", data);
}
/**
* 礼品卡送礼订单创建
* @param {*} data
*/
export function getGiftCardSendOrder(key, data) {
return request.post("/giftCard/create/" + key, data);
}
/**
* 礼品详情
* @param {*} data
*/
export function getGiftCardDetail(data) {
return request.get("/giftCard/info", data);
}
/**
* 领取礼品卡
* @param {*} data
*/
export function getGiftCardReceive(data) {
return request.post("/giftCard/receive", data);
}
/**
* 礼品卡赠礼须知
* @param {*} data
*/
export function getGiftCardSendNotice(data) {
return request.get("/giftCard/giftNotice", data);
}
/**
* 计算订单金额
* @param {*} data
*/
export function getGiftCardSendOrderAmount(key, data) {
return request.post("giftCard/computed/" + key, data);
}
/**
* 再送一份
* @param {*} data
*/
export function getGiftCardResend(data) {
return request.post("/giftCard/makeAgain", data);
}
/**
* 获取背景图
* @param {*} data
*/
export function getGiftCardSendBackground(data) {
return request.get("giftCard/giftCardBackgroundImage", data);
}
+29
View File
@@ -0,0 +1,29 @@
import request from '@/utils/request'
/**
* 收到的礼品卡列表
* */
export function giftCardReceiveList(param) {
return request.get('/giftCard/receiveList', param)
}
/**
* 送出的礼品卡列表
* */
export function giftCardSendList(param) {
return request.get('/giftCard/sendList', param)
}
/**
* 赠礼须知
* */
export function giftNotice(param) {
return request.get('/giftCard/giftNotice', param)
}
/**
* 退款
*/
export function refund(param) {
return request.post('/giftCard/refund', param)
}
+81
View File
@@ -0,0 +1,81 @@
import request from "@/utils/request";
/**
* 康养生活-养生圣地分类列表
* @returns
*/
export function getCategory() {
return request.get("/wellness/place/category")
}
/**
* 康养生活-养生圣地列表
* @param {*} params
* @returns
*/
export function getWellnessPlace(params) {
return request.get("/wellness/place", params)
}
/**
* 康养生活-展会列表
* @param {*} params
* @returns
*/
export function getWellnessExhibition(params) {
return request.get("/wellness/exhibition", params)
}
/**
* 康养生活-展会详情
* @param {*} id
* @returns
*/
export function getWellnessExhibitionDetails(id) {
return request.get("/wellness/exhibition/" + id)
}
/**
* 康养生活-养生榜单
* @param {*} params
* @returns
*/
export function getRank(params) {
return request.get("/wellness/place/ranking", params)
}
/**
* 康养生活-养生食材列表
* @param {*} params
* @returns
*/
export function getFoods(params) {
return request.get("/wellness/place/food", params)
}
/**
* 康养生活-配方详情
* @param {*} id
* @returns
*/
export function getFoodDetails(id) {
return request.get("/wellness/recipe/" + id)
}
/**
* 康养生活-配方列表
* @param {*} params
* @returns
*/
export function getRecipe(params) {
return request.get("/wellness/recipe", params)
}
/**
* 康养生活-展会轮播图
* @returns
*/
export function getBanner() {
return request.get("/wellness/exhibition/banner")
}
+29
View File
@@ -0,0 +1,29 @@
import request from "@/utils/request";
/**
* 省份非遗数据
* @param {*} id
* @returns
*/
export function getIch(id) {
return request.get("/ich/v2/" + id);
}
/**
* 省份非遗专题数据
* @param {*} id
* @returns
*/
export function getIchContent(id) {
return request.get("/ich/v2/content/" + id);
}
/**
* 获取省份非遗推荐数据
* @param {*} params
* @returns
*/
export function getIchRecommend(params) {
return request.get("/ich/v2/recommend", params);
}
+17
View File
@@ -0,0 +1,17 @@
import request from '@/utils/request'
export function getAction(url, params) {
return request.get(url, params)
}
export function postAction(url, data) {
return request.post(url, data)
}
export function putAction(url, data) {
return request.put(url, data)
}
export function deleteAction(url, data) {
return request.delete(url, data)
}
+54
View File
@@ -220,3 +220,57 @@ export function setTopHotelNew(data) {
login: true login: true
}); });
} }
/**
* 店铺转发分享背景图片
* @param id 店铺ID int
* */
export function getHotelShareBackgroundImage(id) {
return request.get("/api/hotelMain/shareImage/" + id, {}, {login: true})
}
/**
* 店铺资讯
* @param id 店铺资讯ID int
* */
export function hotelNewsView(data) {
return request.post("/api/hotelNews/view", data, {login: true})
}
export function getFarmerShop(id) {
return request.get("/api/countyFamous/farmerShop/" + id)
}
export function getAncientTownIcon() {
return request.get("/ancientTown/icon")
}
export function getAncientTownList(params) {
return request.get("/ancientTown", params)
}
export function getAncientTownInfo(id) {
return request.get("/ancientTown/" + id)
}
export function getAncientTownActive(params) {
return request.get("/ancientTown/activity", params)
}
export function watchTownActive(data) {
return request.post("/ancientTown/activity/view", data, {login: true})
}
export function shareTown(id) {
return request.get("/ancientTown/poster/" + id, {login: true})
}
/**
* 获取用户店铺列表
*/
export function getMerchantApply() {
return request.get("/merchantApply/userHotels", {}, {login: true})
}
+7
View File
@@ -29,3 +29,10 @@ export function takePrize(lotteryRecordId){
export function getLogs(page = 1, limit = 10) { export function getLogs(page = 1, limit = 10) {
return request.get('/lottery/dice/records',{page,limit}) return request.get('/lottery/dice/records',{page,limit})
} }
/**
* 抽奖活动分享
* */
export function getLotteryShareInfo() {
return request.get('/lottery/shareImage')
}
+18
View File
@@ -161,3 +161,21 @@ export function orderVerific(verifyCode, isConfirm) {
export function orderDelay(uni) { export function orderDelay(uni) {
return request.post("/order/extendedDelivery", {uni}) return request.post("/order/extendedDelivery", {uni})
} }
/**
* 再买一单
* @param {*} params
* @returns
*/
export function aginConfirm(params) {
return request.post('/order/buyAgainConfirm', params)
}
/**
* 修改地址
* @param {*} params
* @returns
*/
export function editAddress(params) {
return request.post('/order/editAddress', params)
}
+43
View File
@@ -78,6 +78,10 @@ export function getHomestay(id) {
return request.get(`/contentHomestay/${id}`, {}, {login: false}) return request.get(`/contentHomestay/${id}`, {}, {login: false})
} }
export function getHomestayV2(id) {
return request.get(`/contentHomestay/v2/${id}`, {}, {login: false})
}
/** /**
* 节日专题 * 节日专题
* */ * */
@@ -85,6 +89,17 @@ export function getFestival() {
return request.get('/contentFestival', {}, {login: false}) return request.get('/contentFestival', {}, {login: false})
} }
export function getFestivalV2() {
return request.get('/contentFestival/v2', {}, {login: false})
}
/**
* 尖货专题
* */
export function getContentBest(id) {
return request.get(`/contentBest/${id}`, {}, {login: false})
}
/* /*
* 非遗文化 * 非遗文化
* */ * */
@@ -117,3 +132,31 @@ export function getProvinceGoods(parentId, keyword, page) {
const params = `?parentId=${parentId}&keyword=${keyword}&page=${page}&limit=10`; const params = `?parentId=${parentId}&keyword=${keyword}&page=${page}&limit=10`;
return request.get('/landmarkGoods/productList' + params, {}, {login: false}) return request.get('/landmarkGoods/productList' + params, {}, {login: false})
} }
export function getPorjectRecommend(params) {
return request.get('/landmarkGoods/hotelList', params, {login: false})
}
export function getPorjectPolicyFiles(params) {
return request.get('/landmarkGoods/policyFiles', params, {login: false})
}
export function getCulture(params) {
return request.get('/landmarkGoods/culture', params, {login: false})
}
export function getNews(params) {
return request.get('/landmarkGoods/news', params, {login: false})
}
export function hadLike(data) {
return request.post('/landmarkGoods/news/zan', data, {login: false})
}
export function hadView(data) {
return request.post('/landmarkGoods/news/view', data, {login: false})
}
export function getShareImg(id) {
return request.get('/landmarkGoods/poster/' + id, {}, {login: false})
}
+16 -2
View File
@@ -8,8 +8,8 @@ export function getSplashScreen() {
* 首页 * 首页
* @returns {*} * @returns {*}
*/ */
export function getHomeData() { export function getHomeData(params) {
return request.get("index", {}, { return request.get("/index", params, {
login: false login: false
}); });
} }
@@ -208,3 +208,17 @@ export function getShareImage() {
export function getXiaoZhi() { export function getXiaoZhi() {
return request.get("/appAdvertising", {}, {login: false}) return request.get("/appAdvertising", {}, {login: false})
} }
export function pushSystemStatic(data) {
return request.post("/systemStats/push", data, { login: false })
}
// 获取AI系统设置
export function getAiSystemInfoSetting() {
return request.get('/ai/systemInfo', {}, { login: false })
}
// 获取AI系统预设话题列表
export function getAiSystemInfoTopic() {
return request.get('/ai/systemTopic', {}, { login: false })
}
+155
View File
@@ -0,0 +1,155 @@
import request from '@/utils/request'
// 千县名品首页
export function getCountyFamousIndex() {
return request.get('/countyFamous/index', {}, { login: true })
}
// 获取千县名品省-县树形列表
export function getCountyFamousCityTree(param) {
return request.get('/countyFamous/cityTree', param, { login: true })
}
// 获取千县名品县城数据
export function getCountyFamousCityDetail(id) {
return request.get('/countyFamous/' + id, {}, { login: true })
}
// 获取千县名品县城店铺数据
export function getCountyFamousCityShop(param) {
return request.get('/countyFamous/shop', param, { login: true })
}
// 千县名品店铺点赞/取消赞
export function postCountyFamousShopZan(data) {
return request.post('/countyFamous/shop/zan', data, { login: true })
}
// 千县名品店铺点赞/取消赞
export function postCountyFamousShopAddFavorite(data) {
return request.post('/collection/countyFamous/add', data, { login: true })
}
// 千县名品店铺点赞/取消赞
export function postCountyFamousShopRemoveFavorite(data) {
return request.post('/collection/countyFamous/remove', data, { login: true })
}
// 千县名品资讯点赞/取消赞
export function postCountyFamousNewsZan(data) {
return request.post('/countyFamous/news/zan', data, { login: true })
}
// 千县名品资讯被浏览
export function postCountyFamousNewsView(data) {
return request.post('/countyFamous/news/view', data, { login: true })
}
// 获取千县名品县城资讯数据
export function getCountyFamousCityNews(param) {
return request.get('/countyFamous/news', param, { login: true })
}
// 获取千县名品县城攻略数据
export function getCountyFamousCityGuide(param) {
return request.get('/countyFamous/guide', param, { login: true })
}
// 获取千县名品县城攻略专题页
export function getCountyFamousCityGuideContent(param) {
return request.get('/countyFamous/guide/content', param, { login: true })
}
// 获取千县名品县城重点产业列表
export function getCountyFamousIndustry(param) {
return request.get('/countyFamous/industry', param, { login: true })
}
// 获取千县名品县城产业项目列表
export function getCountyFamousIndustryProject(param) {
return request.get('/countyFamous/industryProject', param, { login: true })
}
// 获取千县名品县城产业项目文件列表
export function getCountyFamousIndustryProjectFile(param) {
return request.get('/countyFamous/industryProject/file', param, { login: true })
}
// 获取千县名品县城招商政策文件列表
export function getCountyFamousInvestmentFile(param) {
return request.get('/countyFamous/investmentFile', param, { login: true })
}
// 获取千县名品县城村屋列表
export function getCountyFamousVillage(param) {
return request.get('/countyFamous/village', param, { login: true })
}
// 获取千县名品县城村屋详情
export function getCountyFamousVillageDetail(id) {
return request.get('/countyFamous/village/' + id, {}, { login: true })
}
// 获取千县名品县城村屋资讯
export function getCountyFamousVillageNews(param) {
return request.get('/countyFamous/village/news', param, { login: true })
}
// 获取千县分享图
export function getShareImg(id) {
return request.get('/countyFamous/poster/' + id, {login: true})
}
export function getSaleList(params) {
return request.get('/countyFamous/village/category', params, {login: true})
}
// 旅居列表
export function getJiaLouList(params) {
return request.get('/countyFamous/sojourn', params, {login: true})
}
// 旅居详情
export function getJiaLouDetail(id) {
return request.get('/countyFamous/sojourn/' + id, {}, {login: true})
}
// 旅居资讯数据
export function getJiaLouNews(params) {
return request.get('/countyFamous/sojourn/news', params, {login: true})
}
// 收藏旅居
export function postJiaLouCollect(data) {
return request.post('/collection/sojourn/add', data, {login: true})
}
// 取消收藏旅居
export function postJiaLouRemoveCollect(data) {
return request.post('/collection/sojourn/remove', data, {login: true})
}
// 收藏旅居列表
export function getJiaLouCollectList(params) {
return request.get('/collection/sojourn/list', params, {login: true})
}
// 旅居点赞
export function postJiaLouZan(data) {
return request.post('/countyFamous/sojourn/zan', data, {login: true})
}
// 旅居资讯查看
export function postJiaLouNewsView(data) {
return request.post('/countyFamous/news/view', data, {login: true})
}
// 旅居资讯点赞
export function postJiaLouNewsZan(data) {
return request.post('/countyFamous/news/zan', data, {login: true})
}
// 分享旅居
export function postJiaLouShare(id) {
return request.get('/countyFamous/sojourn/poster/' + id, {login: true})
}
+6
View File
@@ -0,0 +1,6 @@
import request from '@/utils/request'
// 文玩店铺列表
export function getSearchPageConfig() {
return request.get('/searchPage', {}, { login: false })
}
+28
View File
@@ -25,6 +25,15 @@ export function getProductDetail(id, data) {
}); });
} }
/*
* 商品规格选中
* */
export function getProductSkuBySelected(data) {
return request.post("/product/getSkuBySelected", data, {
login: true
});
}
/* /*
* 商品分销二维码 * 商品分销二维码
* */ * */
@@ -144,6 +153,20 @@ export function changeCartNum(id, number) {
}); });
} }
/*
* 购物车 获取商品规格
* */
export function getCartGoodAttr(id, uniqueId) {
return request.get(`/product/attr/${id}?uniqueId=${uniqueId}`)
}
/*
* 购物车 商品规格修改
* */
export function cartGoodChangeAttr(data) {
return request.post('/cart/changeAttr', data)
}
/** /**
* 搜索推荐关键字 * 搜索推荐关键字
*/ */
@@ -196,3 +219,8 @@ export function storeListApi(data) {
login: false login: false
}); });
} }
// 商品列表
export function getHotels(param) {
return request.get('/api/hotelMain/search', param, { login: false })
}
+60
View File
@@ -273,6 +273,13 @@ export function postAddress(data) {
return request.post("/address/edit", data); return request.post("/address/edit", data);
} }
/*
* 自动识别收货地址
* */
export function analysisAddress(data) {
return request.post("/address/analysis", data);
}
/* /*
* 获取收藏产品 * 获取收藏产品
* */ * */
@@ -539,3 +546,56 @@ export function getRechargeApi() {
export function getUserCenterBanner() { export function getUserCenterBanner() {
return request.get("userCenterBanner"); return request.get("userCenterBanner");
} }
/*
* 用户积分信息
*/
export function getUserPointInfo(param) {
return request.get('/user/points/info', param, { login: true })
}
/*
* 用户积分记录
*/
export function getUserPointBill(param) {
return request.get('/user/points/bill', param, { login: true })
}
/*
* 用户分销说明
*/
export function getUserSpreadRule(param) {
return request.get('/userSpreadRule', param, { login: false })
}
/**
* 我的足迹
* @param {*} params
* @returns
*/
export function getHistory(params) {
return request.get('/history/list', params)
}
/**
* 购物车猜你喜欢
* @param {*} params
* @returns
*/
export function getUserLike(params) {
return request.get('/cart/guessYouLike',params)
}
/**
* 用户功能指引状态
* @param {*} params
* @returns
*/
export function queryUserGuide(params) {
return request.get('/user/guide/status', params)
}
export function setUserGuide(params) {
return request.post('/user/guide/status', params)
}
+9
View File
@@ -0,0 +1,9 @@
import request from '@/utils/request'
export function makeFileTransTask(data) {
return request.post('/app/voiceToText/makeFileTransTask', data, { login: true })
}
export function getFileTransResult(data) {
return request.post('/app/voiceToText/getFileTransResult', data, { login: true })
}
File diff suppressed because it is too large Load Diff
+19 -2
View File
@@ -54,8 +54,13 @@
} }
.value { .value {
width: 200rpx;
color: #9D9D9D; color: #9D9D9D;
font-size: 24rpx; font-size: 24rpx;
text-align: right;
}
.value2 {
width: auto;
} }
.red { .red {
@@ -180,9 +185,10 @@
.title { .title {
width: 160rpx; width: 160rpx;
padding: 16rpx;
border-right: 2rpx solid #D2D2D2;
color: #ADADAD; color: #ADADAD;
.title-cont {
padding: 16rpx;
}
} }
} }
@@ -191,6 +197,17 @@
} }
.value { .value {
width: calc(100% - 160rpx);
border-left: 2rpx solid #D2D2D2;
.value-cont {
padding: 16rpx;
word-wrap: break-word;
word-break: break-all;
word-break: normal;
white-space: initial;
}
}
.btn {
width: 100%; width: 100%;
padding: 16rpx; padding: 16rpx;
} }
+4 -5
View File
@@ -17,16 +17,15 @@
} }
.search-box { .search-box {
width: 686rpx; width: 90%;
height: 60rpx; height: 60rpx;
margin: 0 auto;
padding: 0 24rpx 0 32rpx; padding: 0 24rpx 0 32rpx;
box-sizing: border-box; box-sizing: border-box;
background: #F7F7F7; background: #F7F7F7;
border-radius: 30rpx; border-radius: 30rpx;
input { input {
width: 560rpx; width: 540rpx;
font-size: 24rpx; font-size: 24rpx;
} }
@@ -66,8 +65,8 @@
} }
.active { .active {
border-left: 6rpx solid #FD574B; border-left: 6rpx solid #C52733;
color: #FD574B; color: #C52733;
font-weight: bold; font-weight: bold;
} }
} }
+3 -6
View File
@@ -9,10 +9,9 @@
} }
.box-share { .box-share {
width: 600rpx;
.box-img { .box-img {
position: relative; position: relative;
width: 500rpx;
height: 632rpx;
border-radius: 40rpx; border-radius: 40rpx;
overflow: hidden; overflow: hidden;
} }
@@ -26,14 +25,12 @@
} }
.main-img { .main-img {
width: 500rpx; width: 100%;
height: 632rpx;
border-radius: 40rpx; border-radius: 40rpx;
} }
.btn { .btn {
width: 500rpx; width: 100%;
height: 100rpx;
margin-top: 20rpx; margin-top: 20rpx;
} }
} }
+7 -5
View File
@@ -843,6 +843,8 @@ page {
} }
.goodWrapper .item .text { .goodWrapper .item .text {
display: flex;
flex-flow: column;
width: 5.37*100rpx; width: 5.37*100rpx;
position: relative; position: relative;
} }
@@ -866,7 +868,6 @@ page {
.goodWrapper .item .text .money { .goodWrapper .item .text .money {
font-size: 0.26*100rpx; font-size: 0.26*100rpx;
margin-top: 0.17*100rpx;
} }
.goodWrapper .item .text .evaluate { .goodWrapper .item .text .evaluate {
@@ -3254,6 +3255,7 @@ page {
.my-order .list .item .item-info .text .money { .my-order .list .item .item-info .text .money {
text-align: right; text-align: right;
color: #333;
} }
.my-order .list .item .totalPrice { .my-order .list .item .totalPrice {
@@ -3422,7 +3424,7 @@ page {
.order-details .wrapper .item .conter { .order-details .wrapper .item .conter {
color: #868686; color: #868686;
width: 5*100rpx; width: 4.5*100rpx;
text-align: right; text-align: right;
} }
@@ -3459,10 +3461,10 @@ page {
} }
.order-details .footer .bnt { .order-details .footer .bnt {
width: 1.76*100rpx; width: 1.36*100rpx;
height: 0.6*100rpx; height: 0.5*100rpx;
text-align: center; text-align: center;
line-height: 0.6*100rpx; line-height: 0.5*100rpx;
border-radius: 0.5*100rpx; border-radius: 0.5*100rpx;
color: #fff; color: #fff;
font-size: 0.27*100rpx; font-size: 0.27*100rpx;
+202
View File
@@ -0,0 +1,202 @@
/*================变量==================*/
@primary-color: #C52733;
@dark-color: #333333;
@white-color: #fff;
@colors: #C52733, #333333, #fff, #666, #F0F0F0, #999999, #E92727, #FFC543, #69C573;
@classnames: primary, dark, white, secondary-dark, grey, dark1, red, yellow, success;
/*=====================================*/
each(@colors, {
@color: extract(@colors, @index);
@classname: extract(@classnames, @index);
.v12-@{classname} {
background-color: @color !important;
background: @color !important;
}
.v12-@{classname}-text{
color: @color !important;
}
.v12-@{classname}-border{
border: 1px solid @color !important;
}
});
/*===================字体大小======================*/
.generateFontSize(@i) when (@i <= 80) {
.v12-font-@{i} {
font-size: @i * 1rpx !important;
}
.generateFontSize(@i + 2);
}
.generateFontSize(0);
.v12-font-bold{
font-weight: bold !important;
}
.generateFontWeight(@n, @i: 100) when (@i <= @n) {
.v12-font-weight-@{i} {
font-weight: @i !important;
}
.generateFontWeight(@n, (@i + 100))
}
.generateFontWeight(900);
/*==================内外边距====================*/
.generateMarginAndPadding(@n, @i:0) when (@i<= @n) {
@baseNum: @i * 8rpx;
.v12-mt-@{i} {
margin-top: @baseNum;
}
.v12-ml-@{i} {
margin-left: @baseNum;
}
.v12-mr-@{i} {
margin-right: @baseNum;
}
.v12-mb-@{i} {
margin-bottom: @baseNum;
}
.v12-ma-@{i} {
margin-left: @baseNum;
margin-right: @baseNum;
margin-bottom: @baseNum;
margin-top: @baseNum;
}
.v12-mx-@{i} {
margin-left: @baseNum;
margin-right: @baseNum;
}
.v12-my-@{i} {
margin-bottom: @baseNum;
margin-top: @baseNum;
}
.v12-pt-@{i} {
padding-top: @baseNum;
}
.v12-pl-@{i} {
padding-left: @baseNum;
}
.v12-pr-@{i} {
padding-right: @baseNum;
}
.v12-pb-@{i} {
padding-bottom: @baseNum;
}
.v12-pa-@{i} {
padding-top: @baseNum;
padding-bottom: @baseNum;
padding-right: @baseNum;
padding-left: @baseNum;
}
.v12-px-@{i} {
padding-right: @baseNum;
padding-left: @baseNum;
}
.v12-py-@{i} {
padding-top: @baseNum;
padding-bottom: @baseNum;
}
.generateMarginAndPadding(@n, (@i + 1))
}
.generateMarginAndPadding(40);
/*==================圆角====================*/
.generateRadius(@n, @i: 0) when (@i <= @n) {
@baseRadius: @i * 1rpx;
.v12-radius-@{i} {
border-radius: @baseRadius !important;
}
.generateRadius(@n, (@i + 1))
}
.generateRadius(100);
/*=========================================*/
.generateSpacing(@n, @i: 0) when(@i <= @n) {
@baseSpacing:@i * 1rpx;
.v12-spacing-@{i} {
letter-spacing: @baseSpacing !important;
}
.generateSpacing(@n, (@i + 1))
}
.generateSpacing(100);
/*====================flex 函数表达式=====================*/
.v12-d-flex{
display: flex !important;
}
.v12-flex-column {
flex-direction: column;
}
.v12-align-center{
display: flex;
align-items: center;
}
.v12-align-start{
display: flex;
align-items: start;
}
.v12-align-end{
display: flex;
align-items: end;
}
.v12-align-baseline{
display: flex;
align-items: baseline;
}
.v12-justify-center{
display: flex;
justify-content: center;
}
.v12-justify-around{
display: flex;
justify-content: space-around;
}
.v12-justify-between{
display: flex;
justify-content: space-between;
}
.v12-justify-start{
display: flex;
justify-content: flex-start;
}
.v12-justify-end{
display: flex;
justify-content: flex-end;
}
.v12-d-grid-columns-2 {
display: grid;
grid-template-columns: 1fr 1fr;
}
.v12-gap-10{
grid-gap: 20rpx 20rpx;
}
.v12-text-right{
text-align: right;
}
.v12-text-left{
text-align: left;
}
.v12-text-center{
text-align: center;
}
.v12-btn{
width: 136rpx;
height: 50rpx;
text-align: center;
line-height: 50rpx;
border-radius: 50rpx;
color: #fff;
font-size: 27rpx;
}
.v12-full-width{
width: 100%;
}
.v12-nowrap{
white-space: nowrap
}
+1
View File
@@ -63,6 +63,7 @@ export default {
date = date.replace(/-/g, '/'); date = date.replace(/-/g, '/');
let timestamp = new Date(date).getTime(); let timestamp = new Date(date).getTime();
let now = new Date().getTime(); let now = new Date().getTime();
return timestamp - now; return timestamp - now;
}, },
+9 -4
View File
@@ -1,6 +1,7 @@
<template> <template>
<view class="components-checkbox-icon jc-center ai-center" :class="{'isSelected':isSelected}" @click="change"> <view class="components-checkbox-icon jc-center ai-center" :class="{'isSelected':isSelected}" @click="change">
<image class="icon-hook" :src="$VUE_APP_RESOURCES_URL+'/20240109175325131970.png'" mode="scaleToFill" v-if="isSelected"/> <!-- <image class="icon-hook" :src="webUrl + '/20240109175325131970.png'" mode="scaleToFill" v-if="isSelected"/> -->
<u-icon name="checkmark-circle-fill" color="#C52733" v-if="isSelected"></u-icon>
</view> </view>
</template> </template>
@@ -19,6 +20,11 @@ export default {
} }
} }
}, },
data() {
return {
webUrl: Object.freeze(this.$VUE_APP_RESOURCES_URL)
}
},
computed: { computed: {
isSelected: function() { isSelected: function() {
return this.defaultState return this.defaultState
@@ -38,7 +44,7 @@ export default {
width: 32rpx; width: 32rpx;
height: 32rpx; height: 32rpx;
box-sizing: border-box; box-sizing: border-box;
border: 2rpx solid #D5D7D8; border: 2px solid #D5D7D8;
border-radius: 50%; border-radius: 50%;
} }
@@ -48,7 +54,6 @@ export default {
} }
.isSelected { .isSelected {
border: 3px solid #FD5749; border: 3px solid #C52733;
background: #FD5749;
} }
</style> </style>
+11 -4
View File
@@ -1,6 +1,6 @@
<template> <template>
<view @tap.stop="open"> <view class="address-text-wrapper" @tap.stop="open">
<text class="uni-input">{{ value }}</text> <view class="uni-input one-t address-text">{{ value }}</view>
<uni-popup ref="popup" type="bottom" safe-area> <uni-popup ref="popup" type="bottom" safe-area>
<view class="cityselect"> <view class="cityselect">
<view class="cityselect-header"> <view class="cityselect-header">
@@ -87,7 +87,7 @@ export default {
components: { components: {
uniPopup uniPopup
}, },
props: ["callback", "items", "defaultValue"], props: ["callback", "items", "defaultValue", 'disabled'],
data() { data() {
return { return {
value: "请选择", value: "请选择",
@@ -107,7 +107,7 @@ export default {
}, },
defaultValue(newValue) { defaultValue(newValue) {
this.value = newValue; this.value = newValue;
// this.adjustDefaultValue(); this.adjustDefaultValue();
} }
}, },
mounted() { mounted() {
@@ -147,6 +147,7 @@ export default {
return idx; return idx;
}, },
open() { open() {
if(this.disabled) return;
if (this.$refs.popup.showPopup) { if (this.$refs.popup.showPopup) {
this.$refs.popup.close(); this.$refs.popup.close();
return; return;
@@ -220,6 +221,12 @@ export default {
</script> </script>
<style lang="less"> <style lang="less">
.address-text-wrapper {
width: 100%;
.address-text {
width: 100%;
}
}
.cityselect { .cityselect {
width: 100%; width: 100%;
height: 75%; height: 75%;
+75 -28
View File
@@ -1,27 +1,46 @@
<template> <template>
<view class="components-coupons"> <view class="components-coupons">
<image class="coupons__cover" :src="data.image" mode="widthFix"/> <view class="image-wrap">
<image
:src="data.image"
class="coupons__cover"
mode="widthFix"
/>
<view @click="selectCoupon" class="check-radio" :class="{'v12-primary': data.checked}">
<radio
v-if="radioModel && data.status === 0"
:value="data.id"
:checked="data.checked"
color="#C52733"
borderColor="#C52733"
/>
</view>
</view>
<view class="coupons__section flex jc-between ai-center"> <view class="coupons__section flex jc-between ai-center">
<view>有效期至 <view>
<text>{{ data.endTime }}</text> <text class="v12-dark-text v12-font-weight-500 v12-font-28">有效期至</text>
</view> <text class='v12-primary-text v12-font-weight-500 v12-font-28'>{{ data.endTime }}</text>
<view class="coupons__tag coupons__tag-expire" v-if="data.status===2">已到期</view>
<view class="coupons__tag" @click="goGoods()" v-if="data.status===0 && !radioModel">去使用</view>
<view @click="selectCoupon">
<radio :value="data.id" :checked="data.checked" color="#FF564A" v-if="radioModel && data.status===0"/>
</view>
</view> </view>
<!-- status: 0-未使用1-已使用2-已过期 -->
<view
v-if="data.status === 2"
class="coupons__tag coupons__tag-expire v12-font-24"
>已到期</view>
<view
v-if="data.status === 0 && !radioModel"
class="coupons__tag coupons__tag-expire v12-font-24"
>不可用</view>
</view>
<view class="coupons__rules"> <view class="coupons__rules">
<view class="coupons__rules-title" @click="changeRules()">使用规则 <view class="coupons__rules-title v12-font-22" @click="changeRules()">使用规则
<image :class="{'open':isOpen}" :src="webUrl+'/20231125220409665027.png'" mode="scaleToFill"/> <image :class="{'open':isOpen}" :src="webUrl + '/20231125220409665027.png'" mode="scaleToFill"/>
</view> </view>
<view <view
:class="isOpen ? 'auto-height' : ''" :class="isOpen ? 'auto-height' : ''"
class="coupon-html" class="coupon-html"
> >
<rich-text :nodes="data.description" /> <rich-text class='v12-font-22 v12-dark1-text' :nodes="data.description" />
</view> </view>
</view> </view>
</view> </view>
@@ -31,7 +50,13 @@
export default { export default {
name: "Coupons", name: "Coupons",
props: { props: {
data: Object, data: {
type: Object,
default: () => {
return {}
}
},
// 是否显示选择框
radioModel: { radioModel: {
type: Boolean, type: Boolean,
default: false default: false
@@ -51,39 +76,61 @@ export default {
changeRules() { changeRules() {
this.isOpen = !this.isOpen this.isOpen = !this.isOpen
}, },
goGoods() {
uni.switchTab({url: '/pages/home/landMark'})
// this.$global.navToGoods(this.data.productId)
},
selectCoupon() { selectCoupon() {
if (!this.radioModel) return if (!this.radioModel) return
this.$emit('change', this.data.id) // 已选中则可以取消选中
this.$emit('change', this.data.checked ? '' : this.data.id)
} }
} }
} }
</script> </script>
<style scoped lang="less"> <style scoped lang="less">
.check-radio{
position: absolute;
bottom: 10px;
right: 16px;
height: 32rpx;
width: 32rpx;
border-radius: 50%;
border: 2px solid #C52733;
display: flex;
align-items: center;
justify-content: center;
overflow: hidden;
radio {
margin-right: -6px;
}
}
.image-wrap{
width: 100%;
display: flex;
align-items: center;
justify-content: center;
padding: 30rpx 0;
border-radius: 20rpx;
position: relative
}
.components-coupons { .components-coupons {
width: 686rpx; width: 686rpx;
box-sizing: border-box; box-sizing: border-box;
border: 2rpx solid #FF564A;
border-radius: 16rpx; border-radius: 16rpx;
overflow: hidden; overflow: hidden;
background: #fff;
image { image {
vertical-align: middle; vertical-align: middle;
} }
.coupons__cover { .coupons__cover {
width: 100%; width: 600rpx;
height: auto; height: 200rpx;
border-radius: 20rpx;
} }
.coupons__section { .coupons__section {
width: 100%; width: 100%;
box-sizing: border-box; box-sizing: border-box;
padding: 18rpx 20rpx 16rpx 16rpx; padding: 18rpx 20rpx 16rpx 50rpx;
font-size: 32rpx; font-size: 32rpx;
line-height: 1; line-height: 1;
@@ -113,7 +160,7 @@ export default {
} }
.coupons__rules { .coupons__rules {
padding: 0 20rpx 20rpx 16rpx; padding: 0 20rpx 20rpx 50rpx;
.coupons__rules-title { .coupons__rules-title {
color: #999999; color: #999999;
@@ -130,11 +177,11 @@ export default {
} }
} }
.coupon-html { .coupon-html {
height: 80rpx;
overflow: hidden; overflow: hidden;
transition: all .3s; transition: all .3s ease-in-out;
height: 60rpx;
&.auto-height { &.auto-height {
height: auto; height: auto !important;
} }
} }
} }
+171 -34
View File
@@ -1,21 +1,104 @@
<template> <template>
<view class="popup-coupons"> <view class="popup-coupons">
<view class="popup-box"> <view class="popup-box">
<view class="popup-title bold tc">选择优惠券</view> <view class="popup-title bold tc v12-justify-between">
<SubSection :current="current" :can-use="canUse" :not-use="notUse" radioModel @change="changeNav"/> <text></text>
<text>优惠详情</text>
<view class="list-box"> <u-icon name="close" color="#666" size="14" @click.stop="close"></u-icon>
<view style="margin-bottom: 20rpx" v-for="(item,index) in list" :key="index"> </view>
<Coupons :data="item" radioModel @change="selectCoupon"/> <SubSection
:current="current"
:can-use="canUse"
:not-use="notUse"
radio-model
@change="changeNav"
v-if="showTab"
/>
<view class="v12-radius-20 v12-white v12-align-center v12-justify-around v12-pa-3" v-else>
<view class="">
<view class="v12-text-center v12-font-28">
券后价
</view>
<view class="v12-mt-3 v12-text-center v12-red-text">
<text class="v12-font-28">
</text>
<text class="v12-font-44">
{{ computePrice }}
</text>
</view>
</view>
<view class="v12-text-center v12-font-44">
=
</view>
<view class="">
<view class="v12-text-center v12-font-28">
当前售价
</view>
<view class="v12-mt-3 v12-text-center">
<text class="v12-font-28">
</text>
<text class="v12-font-44">
{{ currentPrice }}
</text>
</view>
</view>
<view class="v12-text-center v12-font-44">
-
</view>
<view class="">
<view class="v12-text-center">
满减
</view>
<view class="v12-mt-3 v12-text-center v12-font-44">
{{ selectItem.couponPrice || 0 }}
</view>
</view>
</view> </view>
<view class="tc" v-if="list.length===0"> <view class="list-box">
<view class="larg-one v12-mb-3">
<Coupons
:data="largOne"
:radio-model="current === 0"
@change="selectCoupon"
/>
</view>
<view class="v12-font-32 v12-dark-text v12-spacing-2 v12-font-bold v12-mb-3">
更多可使用券
</view>
<view
v-for="(item, index) in list"
:key="index"
style="margin-bottom: 20rpx"
>
<Coupons
:data="item"
:radio-model="current === 0"
@change="selectCoupon"
v-if="index !== maxIndex"
/>
<view v-if="list.length === 1" class="no-quan v12-font-28 v12-dark1-text text-center">
暂无更多可使用优惠券快去抽奖去吧~
</view>
</view>
<view
v-if="list.length === 0"
class="tc"
>
<image class="zero-coupons" :src="webUrl+'/20231201201733142658.png'" mode="scaleToFill"/> <image class="zero-coupons" :src="webUrl+'/20231201201733142658.png'" mode="scaleToFill"/>
</view> </view>
</view> </view>
</view> </view>
<button disabled></button> <button disabled></button>
<view class="btn-done bold flex jc-center ai-center" :class="{'btn-disabled':current===1}" @click="setCoupon" v-if="current===0">确定 <view
v-if="current === 0"
:class="{ 'btn-disabled': current === 1 }"
class="btn-done bold flex jc-center ai-center v12-primary"
@click="setCoupon"
>
确定
</view> </view>
</view> </view>
</template> </template>
@@ -26,16 +109,58 @@ import Coupons from '@/components/Coupons.vue'
export default { export default {
name: 'CouponsPopup', name: 'CouponsPopup',
components: {SubSection, Coupons}, components: { SubSection, Coupons },
props: { props: {
twoList: { twoList: {
type: Object, type: Object,
default: {} default: {
usable: [],
unusable: []
}
},
showTab: {
type: Boolean,
default: true
},
currentPrice: {
default: 0,
type: Number
},
id: {
type: Number,
default: 0
}
},
data() {
return {
webUrl: this.$VUE_APP_RESOURCES_URL,
current: 0,
couponId: uni.getStorageSync('couponId') || 0,
selectItem: {
couponPrice: 0
},
}
},
watch: {
id: {
immediate: true,
handler(value) {
console.log('couponId', value);
if(value) {
this.selectCoupon(value)
}
}
} }
}, },
computed: { computed: {
list() { list() {
let temp = this.current === 0 ? this.twoList['usable'] : this.twoList['unusable'] const temp = this.current === 0 ? this.twoList['usable'] : this.twoList['unusable']
if (this.current === 0) {
const localCouponId = uni.getStorageSync('couponId') || 0
temp.map(item => {
item.checked = localCouponId === item.id
})
}
return this.$global.deepClone(temp) return this.$global.deepClone(temp)
}, },
canUse() { canUse() {
@@ -43,53 +168,64 @@ export default {
}, },
notUse() { notUse() {
return this.twoList['unusable'].length return this.twoList['unusable'].length
}
}, },
watch: { computePrice() {
current() { return this.force2Decimal(this.currentPrice - this.selectItem.couponPrice) || this.currentPrice
this.selectCoupon(this.couponId)
}
}, },
data() { maxIndex() {
return { const maxIndex = this.list.reduce((a, b, c) => {
webUrl: this.$VUE_APP_RESOURCES_URL, return (this.list[a].couponPrice < b.couponPrice) ? c : a
current: 0, }, 0)
couponId: 0 return maxIndex
},
largOne() {
if(this.list[this.maxIndex]) {
this.selectCoupon(this.list[this.maxIndex].id)
uni.setStorageSync('couponId', this.list[this.maxIndex].id)
} }
// this.$emit('max', this.list[this.maxIndex] || {})
return this.list[this.maxIndex] || {}
}
}, },
mounted() { mounted() {
this.couponId = uni.getStorageSync('couponId') || 0 this.$emit('max', this.largOne)
this.selectCoupon(this.couponId)
}, },
methods: { methods: {
close() {
this.$emit('close')
},
force2Decimal(value) {
return this.$force2Decimal(value);
},
changeNav(index) { changeNav(index) {
this.current = index this.current = index
}, },
selectCoupon(id) { selectCoupon(id) {
const isCancel = this.couponId === id this.couponId = id
this.couponId = isCancel ? 0 : id this.selectItem = this.list.find(e => e.id === id) || {}
// this.$emit('select', this.selectItem)
this.list?.forEach(item => { this.list.map(item => {
if (!isCancel) {
item.checked = id === item.id item.checked = id === item.id
} else {
item.checked = false
}
}) })
}, },
setCoupon() { setCoupon() {
if (this.current === 1) return if (this.current === 1) return
// if (this.couponId !== 0) { console.log(this.current, '====1=======');
uni.setStorageSync('couponId', this.couponId) uni.setStorageSync('couponId', this.couponId)
// } this.$emit('change', this.selectItem || {})
this.$emit('close') this.$emit('ok', this.couponId)
} }
} }
} }
</script> </script>
<style scoped lang="less"> <style scoped lang="less">
.text-center{
text-align: center;
}
.popup-coupons { .popup-coupons {
background: #F0F0F0;
.popup-box { .popup-box {
padding: 34rpx 32rpx; padding: 34rpx 32rpx;
} }
@@ -103,6 +239,7 @@ export default {
.list-box { .list-box {
max-height: 640rpx; max-height: 640rpx;
height: 640rpx;
margin-top: 32rpx; margin-top: 32rpx;
overflow-y: auto; overflow-y: auto;
} }
+224
View File
@@ -0,0 +1,224 @@
<template>
<view v-if="show" class="guide-remark white" @touchmove.stop.prevent="" @click="next">
<view class="guid-wrap">
<image
v-for="(img, index) in functionGuideData.imgs"
:key="index"
:style="[img.style]"
:src="img.url"
@click.stop="handleImg(img)"
mode="aspectFit|aspectFill|widthFix"
lazy-load="true" >
</image>
<view class="box" :style="[functionGuideData.position]">
<!-- <view class="tips flex" :style="{top: functionGuideData.tipsPosition || '-110rpx'}">
{{ functionGuideData.tips }}
</view> -->
</view>
<!-- <view class="btn-wrap flex_center" :style="[functionGuideData.btnGroupPosition]">
<view class="btn flex_center" @click="jump">跳过</view>
<view class="next-btn v12-primary flex_center" @click="next">{{ functionGuideData.step==maxStep ? '知道了' : '下一步' }}</view>
</view> -->
</view>
</view>
</template>
<script>
let timer = null
let flag = false
export default {
props: {
maxStep: {
type: Number,
default: 3
},
guideData: {
type: Object,
default: ()=> {
return {
step: 1,
tips: '', // 介绍
tipsPosition: '', // 介绍 显示位置
btnGroupPosition: '', // 按钮组显示位置
position: {}
}
}
}
},
data() {
return {
show: false,
functionGuideData: {}
}
},
watch: {
guideData: {
deep: true,
immediate: false,
handler(data) {
this.functionGuideData = data
}
}
},
methods: {
handleImg(img) {
if(!img.isBtn) return
if(img.isBtn === 'next') {
this.next()
return
}
if(img.isBtn === 'jump') {
this.jump()
return
}
},
init() {
if (this.show) return
setTimeout(() => {
// const show = uni.getStorageSync('showGuide')
const show = false
if (!show) {
this.show = true
this.$parent.setFunctionGuideData({ step: 1 })
}
}, 1000)
},
jump() {
this.$parent.setFunctionGuideData({ step: 'jump' })
this.setFunctionGuideState()
// 标记状态,只有首次访问小程序时显示指引
uni.setStorageSync('showGuide', 1)
},
next() {
this.throttle(() => {
if (this.functionGuideData.step == this.maxStep) {
this.jump()
return
}
let step = this.functionGuideData.step
this.$parent.setFunctionGuideData({ step: step + 1 })
}, 800)
},
setFunctionGuideState() {
this.show = false
this.$emit('hide')
},
/* 节流 */
throttle(fn) {
if (!flag) {
flag = true
typeof fn === 'function' && fn()
timer = setTimeout(() => {
flag = false
}, 800)
}
}
}
}
</script>
<style lang="scss" scoped>
.btn-wrap{
position: absolute;
z-index: 99;
}
.guid-wrap{
position: relative;
height: inherit;
width: inherit;
}
.next-btn {
color: #fff;
padding: 2rpx 10rpx;
}
.plus {
width: 140rpx;
height: 2rpx;
position: relative;
.in-border {
border: 2rpx dashed #fff;
width: 110rpx;
height: 110rpx;
border-radius: 50%;
position: absolute;
left: 10rpx;
top: -55rpx;
}
.plus-icon {
background: #fff;
border-radius: 50%;
overflow: hidden;
width: 92rpx;
height: 92rpx;
}
}
.guide-remark {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 20230828;
.box {
position: absolute;
z-index: 10;
width: 686rpx;
border-radius: 24rpx;
left: 32rpx;
box-shadow: 0 0 0 120vh rgba(0, 0, 0, .6);
transition: all 0.3s ease;
.tips {
width: 100%;
background: #bee9ff;
border-radius: 24rpx;
padding: 20rpx 50rpx;
box-sizing: border-box;
position: absolute;
left: 0;
top: -110rpx;
z-index: 2;
font-size: 28rpx;
transition: top 0.3s ease;
}
.btn-group {
width: 100%;
position: absolute;
left: 50%;
transform: translateX(-50%);
font-size: 32rpx;
z-index: 2;
transition: bottom 0.3s ease;
.btn {
width: 240rpx;
height: 84rpx;
border-radius: 52rpx;
border: 2rpx solid #FFFFFF;
background: #fff;
margin: 0 30rpx;
white-space: nowrap;
}
}
}
}
.flex {
display: flex;
align-items: center;
}
.flex_center {
@extend .flex;
justify-content: center;
}
</style>
+82 -33
View File
@@ -1,38 +1,60 @@
<template> <template>
<view class="orderGoods"> <view class="orderGoods">
<view v-if="title.length>0" class="total acea-row row-middle" > <view
<view class="acea-row row-left row-middle" style="position: relative;"> v-if="title.length > 0"
<image style="width: 32rpx;height: 32rpx;margin-right: 12rpx;" src="http://admin-api.xdd618.com/file/pic/20210807230759738342.png" mode=""></image> class="v12-pa-3 acea-row row-middle"
<text class="title">{{title}}</text> >
<!-- <text class="pink-dot"></text> --> <view
style="position: relative;"
class="acea-row row-left row-middle"
>
<!-- <image
style="width: 32rpx;height: 32rpx;margin-right: 12rpx;"
src="http://admin-api.xdd618.com/file/pic/20210807230759738342.png" mode=""
/> -->
<text class="title v12-font-32">
{{ title }}
</text>
</view> </view>
</view> </view>
<view v-else class="total">{{ cartInfo.length }}件商品</view> <view
v-else
class=""
>{{ cartInfo.length }}件商品</view>
<view class="goodWrapper"> <view class="goodWrapper">
<view class="item acea-row row-between-wrapper" style="flex-wrap: nowrap;" v-for="cart in cartInfo" :key="cart.id"> <view
v-for="cart in cartInfo"
:key="cart.id"
class="item acea-row row-between-wrapper v12-mt-3"
style="flex-wrap: nowrap; border:none"
>
<view class="pictrue" style="margin-right: 20rpx;"> <view class="pictrue" style="margin-right: 20rpx;">
<image :src="cart.productInfo.image" class="image" /> <image :src="cart.productInfo.image" class="image" />
</view> </view>
<view class="text"> <view class="text" style="height: 100%;justify-content: space-between;">
<view class="acea-row row-between-wrapper"> <view class="acea-row row-between-wrapper">
<view class="name line1">{{ cart.productInfo.storeName }}</view> <view class="name line1 one-t v12-font-bold">{{ cart.productInfo.storeName }}</view>
<!-- <view class="num">x {{ cart.cartNum }}</view> -->
</view> </view>
<!-- <view <view class="acea-row row-middle row-between attr-wrap">
class="attr line1"
v-if="cart.productInfo.attrInfo"
>{{ cart.productInfo.attrInfo.sku }}</view> -->
<view class="acea-row row-middle row-between">
<view <view
class="attr"
style="height: 38rpx;line-height:38rpx;background-color: #FFF3F2;border-radius: 19rpx;padding: 4rpx 20rpx;"
v-if="cart.productInfo.attrInfo" v-if="cart.productInfo.attrInfo"
>属性{{ cart.productInfo.attrInfo.sku }}</view> class="more-t v12-font-24 v12-secondary-dark-text"
<view v-if="evaluate == 3" class="evaluate" style="bottom: 0 !important;position: relative;height: 36rpx !important;width: 90rpx !important;line-height: 36rpx !important;font-size: 32rpx;border-radius: 18rpx;" @click="routerGo(cart)">评价</view> >
规格{{ cart.productInfo.attrInfo.sku }}
</view>
<view
v-if="evaluate == 3"
class="evaluate"
@click="routerGo(cart)"
>评价</view>
</view> </view>
<view class="money font-color-lightred acea-row row-between"> <view class="money font-color-lightred acea-row row-between">
<text>{{ cart.truePrice }}</text> <view class="v12-font-bold">
<text class="num" style="margin-left: 10rpx;">x{{ cart.cartNum }}</text> <text class="v12-font-28 v12-dark-text">应付</text>
<text class="v12-font-22"></text>
<text class="v12-primary-text v12-font-28">{{ cart.truePrice }}</text>
</view>
<text class="num v12-dark-text">x{{ cart.cartNum }}</text>
</view> </view>
</view> </view>
</view> </view>
@@ -68,21 +90,48 @@ export default {
}; };
</script> </script>
<style scoped> <style scoped>
.pink-dot{ .orderGoods{
width:24rpx; border-radius: 20rpx 20rpx 0 0;
height:24rpx; }
background:rgba(255,86,74,0.4); .item{
border-radius:50%; height: 160rpx !important;
position: absolute; }
z-index: 0;
bottom: 24rpx;
right: -12rpx;
}
.title{ .title{
font-size:26rpx; font-size:26rpx;
color:#080F1A; color:#080F1A;
font-weight: bold; font-weight: bold;
} }
.goodWrapper .item .pictrue {
width: 160rpx;
height: 160rpx;
}
.goodWrapper .item .pictrue .image {
display: block;
width: 160rpx;
height: 160rpx;
border-radius: 16rpx;
}
.attr-wrap {
position: relative;
margin-top: 8rpx;
align-items: flex-start;
}
.text .attr {
max-width: calc(100% - 130rpx);
margin: 0 !important;
padding: 6rpx 20rpx;
border-radius: 20rpx;
line-height: 28rpx;
box-sizing: border-box;
background-color: #FFF3F2;
}
.evaluate {
position: relative;
top: 0;
height: 36rpx;
width: 90rpx;
border-radius: 36rpx !important;
line-height: 36rpx;
font-size: 28rpx;
}
</style> </style>
+2 -2
View File
@@ -1,6 +1,6 @@
<template> <template>
<view class="slider-banner product-bg"> <view class="slider-banner product-bg">
<swiper class="swiper-wrapper" @change="handleChange" v-if="imgUrls.length > 0" :indicator-dots='true' indicator-color="rgba(255, 255, 255, .3)" indicator-active-color="#ffffff"> <swiper autoplay circular interval="2000" class="swiper-wrapper" @change="handleChange" v-if="imgUrls.length > 0" :indicator-dots='true' indicator-color="rgba(255, 255, 255, .3)" indicator-active-color="#ffffff">
<block v-for="(item, imgUrlsIndex) in imgUrls" :key="imgUrlsIndex"> <block v-for="(item, imgUrlsIndex) in imgUrls" :key="imgUrlsIndex">
<swiper-item> <swiper-item>
<image v-if="!checkIfVideo(item)" :src="item" class="slide-image" /> <image v-if="!checkIfVideo(item)" :src="item" class="slide-image" />
@@ -38,7 +38,7 @@ export default {
currentVideo:null, currentVideo:null,
ProductConSwiper: { ProductConSwiper: {
autoplay: { autoplay: {
disableOnInteraction: false, disableOnInteraction: true,
delay: 2000 delay: 2000
}, },
loop: true, loop: true,
+196 -77
View File
@@ -1,52 +1,65 @@
<template> <template>
<view> <view>
<view class="product-window" :class="attr.cartAttr === true ? 'on' : ''"> <view class="product-window" :class="attr.cartAttr === true ? 'on' : ''" :style="{paddingBottom: paddingBottom}">
<view class="textpic acea-row row-between-wrapper"> <view class="textpic acea-row row-between-wrapper">
<view class="pictrue" @click="previewImg(attr.productSelect.image)"> <view class="pictrue" @click="previewImg(attrObj.productSelect.image)">
<image :src="attr.productSelect.image" class="image" /> <image :src="attrObj.productSelect.image" class="image" />
</view> </view>
<view class="text"> <view class="text">
<view class="line1">{{ attr.productSelect.store_name }}</view> <view v-if="!isNegotiable" class="money font-color-lightred v12-font-">
<view class="money font-color-lightred">
<text class="num">{{ attr.productSelect.price }}</text> <text class="num v12-font-40">{{ attrObj.productSelect.price }}</text>
<text class="stock">库存: {{ attr.productSelect.stock }}</text> <text class="v12-ml-2 v12-font-weight-300 v12-font-22" style="color: #BBBBBB; text-decoration: line-through;"></text>
<text class="v12-mr-2 v12-font-weight-300 v12-font-22" style="color: #BBBBBB; text-decoration: line-through;">{{ attrObj.productSelect.otPrice }}</text>
<text class="v12-white-text v12-red v12-font-22 v12-radius-40 v12-px-1 v12-font-weight-400">会员价</text>
<!-- <text class="stock">库存: {{ attrObj.productSelect.stock }}</text> -->
</view> </view>
<view class="v12-primary-text" v-else>价格面议</view>
<view class="more-t">{{ attrObj.productSelect.store_name }}</view>
</view> </view>
<view class="iconfont icon-guanbi" @click="closeAttr"></view> <view class="iconfont icon-guanbi" @click="closeAttr"></view>
</view> </view>
<view class="productWinList"> <view class="productWinList">
<view class="item" v-for="(item, indexw) in attr.productAttr" :key="indexw">
<view class="title">{{ item.attrName }}</view>
<view class="listn acea-row row-middle">
<view <view
v-for="(itemn, indexn) in item.attrValue" v-for="(item, index) in attrObj.productAttr"
:key="indexn" :key="index"
:class="{ class="item"
'on': item.index == indexn,
'disabled': productValue[itemn.attr].stock === 0
}"
class="itemn"
@click="tapAttr(indexw, indexn, itemn)"
> >
{{ itemn.attr }} <view class="title">{{ item.attrName }}</view>
<text <view class="listn acea-row v12-justify-start">
v-if="productValue[itemn.attr].stock === 0"
class="tag"
>缺货</text>
</view>
</view>
</view>
</view>
<view class="cart">
<view class="title">数量</view>
<view class="carnum acea-row row-left">
<view class="item reduce" :class="cartNum <= 1 ? 'on' : ''" @click="CartNumDes">-</view>
<view class="item num">{{ cartNum }}</view>
<view <view
class="item plus" v-for="(subItem, subIndex) in item.attrValue"
:key="subIndex"
:class="{
'actived': subItem.check,
'disabled': !subItem.canUsed
}"
class="itemn v12-radius-40"
@click="tapAttr(index, subIndex, subItem)"
>
{{ subItem.attr }}
<text v-if="!subItem.canUsed" class="less-tag" style="color: #fff !important;">缺货</text>
</view>
</view>
</view>
</view>
<view class="cart v12-justify-between v12-align-center">
<view class="titlev12-dark-text f12-font-32">购买数量</view>
<view class="carnum acea-row row-left">
<view style="border-radius: 40rpx 0rpx 0rpx 40rpx" class="cart-btn item reduce v12-font-36 v12-font-bold v12-white-text v12-dark1 v12-dark1-border" :class="cartNum <= 1 ? 'on' : ''" @click="CartNumDes">-</view>
<input
type="number"
:min="1"
:max="attrObj.productSelect.stock"
@blur="inputNumer(cartNumber)"
v-model="cartNumber"
style="height: 55rpx !important; width:80rpx !important"
class="item v12-font-36 v12-font-bold v12-dark-text cart-btn" />
<view
style="border-radius:0 40rpx 40rpx 0"
class="item plus v12-font-bold v12-white-text v12-primary v12-primary-border v12-font-36 cart-btn"
:class=" :class="
cartNum >= attr.productSelect.stock cartNum >= attrObj.productSelect.stock
? 'on' ? 'on'
: '' : ''
" "
@@ -54,6 +67,22 @@
>+</view> >+</view>
</view> </view>
</view> </view>
<view class="v12-px-2 v12-mt-3" v-if="showOk">
<u-button
shape="circle"
color="#C52733"
@click="$emit('ok')"
:disabled="(attr.productSelect.stock === 0 && attr.cartAttr)"
>加入购物车</u-button>
</view>
<view class="v12-px-2 v12-mt-3" v-if="isGift">
<u-button
shape="circle"
color="#C52733"
@click="$emit('gift')"
:disabled="(attr.productSelect.stock === 0 && attr.cartAttr)"
>送给朋友</u-button>
</view>
</view> </view>
<view class="mask" @touchmove.prevent :hidden="attr.cartAttr === false" @click="closeAttr"></view> <view class="mask" @touchmove.prevent :hidden="attr.cartAttr === false" @click="closeAttr"></view>
</view> </view>
@@ -62,73 +91,163 @@
export default { export default {
name: "ProductWindow", name: "ProductWindow",
props: { props: {
isNegotiable: {
type: Boolean,
default: false
},
isGift: {
type: Boolean,
default: false
},
paddingBottom: {
type: String,
default: '160rpx'
},
showOk: {
type: Boolean,
default: false
},
attr: { attr: {
type: Object, type: Object,
default: () => {} default: () => {
}, return {
productValue: { productAttr: []
type: Object, }
default: () => {} }
}, },
cartNum: { cartNum: {
type: Number, type: Number,
default: () => 1 default: () => 1
} }
}, },
data: function() { data() {
return {}; return {
cartNumber: this.cartNum,
attrObj: {
productSelect: {},
productAttr: []
}
}
},
watch: {
cartNum: {
handler(val) {
console.log(val, 'cardNum');
this.cartNumber = val || 1
},
deep: true
},
cartNumber(val) {
if (val > this.attrObj.productSelect.stock) {
val = this.attrObj.productSelect.stock
}
this.$emit('input', +val)
this.$emit("changeFun", { action: "ChangeCartNum", value: +val })
}
},
created() {
this.$set(this, 'attrObj', JSON.parse(JSON.stringify(this.attr)))
}, },
methods: { methods: {
previewImg:function(imgUrl){ inputNumer(e) {
if(e === '') {
this.cartNumber = 1
this.$forceUpdate()
}
if(+e > this.attrObj.productSelect.stock) {
this.cartNumber = this.attrObj.productSelect.stock
this.$forceUpdate()
}
},
reRender(data) {
this.$set(this, 'attrObj', JSON.parse(JSON.stringify(data)))
// console.log(this.attrObj.productAttr)
this.$forceUpdate()
},
previewImg(imgUrl) {
uni.previewImage({ uni.previewImage({
urls:[imgUrl] urls:[imgUrl]
}) })
}, },
closeAttr: function() { closeAttr() {
this.$emit("changeFun", { action: "changeattr", value: false }); this.$emit("changeFun", { action: "changeattr", value: false })
}, },
CartNumDes: function() { CartNumDes() {
this.$emit("changeFun", { action: "ChangeCartNum", value: false }); if(this.cartNumber === 1) return
console.log(this.cartNumber, 'cartNumber');
this.cartNumber--
this.$emit("changeFun", { action: "ChangeCartNum", value: this.cartNumber })
}, },
CartNumAdd: function() { CartNumAdd() {
this.$emit("changeFun", { action: "ChangeCartNum", value: 1 }); if(this.cartNumber >= this.attrObj.productSelect.stock) return
this.cartNumber++
this.$emit("changeFun", { action: "ChangeCartNum", value: this.cartNumber })
}, },
tapAttr: function(indexw, indexn, itemn) { tapAttr(index, subIndex, subItem) {
if (this.productValue[itemn.attr].stock === 0) { // 缺货的点击了没效果
if (!subItem.canUsed || subItem.check) {
return return
} }
// 修改商品规格不生效的原因: this.attrObj.productAttr[index].attrValue.map((subItem, subIdx) => {
// H5端下面写法,attr更新,但是除H5外其他端不支持, subItem.check= false
// 尽量避免下面的骚写法,不要在子组件内更新props if (subIndex === subIdx) {
// 这里修改是为了能获取到被选中的属性 subItem.check = true
this.attr.productAttr[indexw].index = indexn; }
let that = this; })
let value = that const value = this.getCheckedValue().sort().join(",")
.getCheckedValue() this.cartNumber = 1
.sort() this.$emit("changeFun", {
.join(",");
that.$emit("changeFun", {
action: "ChangeAttr", action: "ChangeAttr",
value: { value: {
value, value,
indexw, index,
indexn subIndex
} }
}); })
}, },
//获取被选中属性 // 获取被选中属性
getCheckedValue: function() { getCheckedValue() {
let productAttr = this.attr.productAttr; const productAttr = this.attrObj.productAttr
let value = []; const value = []
for (let i = 0; i < productAttr.length; i++) { productAttr.map(item => {
for (let j = 0; j < productAttr[i].attrValueArr.length; j++) { item.attrValue.map(subItem => {
if (productAttr[i].index === j) { if (subItem.check) {
value.push(productAttr[i].attrValueArr[j]); value.push(subItem.attr)
}
})
})
return value
} }
} }
} }
return value;
}
}
};
</script> </script>
<style scope>
.itemn{
margin: 28rpx 0 0 34rpx !important;
width: auto;
}
.money{
margin-top: 0 !important
}
.actived{
border-color: #C52733 !important;
color: #fff !important;
background: #C52733
}
.cart-btn{
height:52rpx !important;
width:52rpx !important
}
.less-tag{
position: absolute;
background: #FF5562;
border-radius: 8rpx;
height: 38rpx;
line-height: 38rpx;
right: -15px;
top: -10px;
padding: 0 3px;
font-size: 24rpx;
font-weight:400
}
</style>
+54
View File
@@ -0,0 +1,54 @@
<template>
<view class="">
<u-popup :show="show" @close="close" @open="open" closeable>
<view class="v12-px-3">
<view class="v12-text-center v12-font-32 v12-py-3 v12-secondary-dark-text">
服务说明
</view>
<view class="wrap v12-dark-text">
<view class="service-title">
<text class="v12-dark-text v12-font-32">
售后服务
</text>
</view>
<view class="">
<text class="v12-font-28 v12-font-bold">
{{ info }}
</text>
</view>
</view>
</view>
</u-popup>
</view>
</template>
<script>
export default {
props: {
info: ''
},
data() {
return {
show:false
}
},
methods: {
close() {
this.show = false
this.$emit('close')
},
open() {
this.show = true
this.$emit('open')
}
}
}
</script>
<style>
.wrap{
background: rgba(197,39,51,0.1);
border-radius: 16rpx;
padding: 20rpx;
}
</style>
+1 -1
View File
@@ -80,7 +80,7 @@ export default {
overscroll-behavior: contain; overscroll-behavior: contain;
} }
.poster-pop { .poster-pop {
width: 4.5 * 100rpx; width: 6 * 100rpx;
height: 8 * 100rpx; height: 8 * 100rpx;
position: fixed; position: fixed;
left: 50%; left: 50%;
+14 -6
View File
@@ -38,14 +38,15 @@ export default {
<template> <template>
<view class="sub-section flex"> <view class="sub-section flex">
<view class="sub-section__item flex jc-center ai-center" :class="{'sub-section__active':index===0}" <view class="sub-section__item flex jc-center ai-center"
@click="change(0)"> @click="change(0)">
可使用 ({{ canUse }}) 可使用 ({{ canUse }})
</view> </view>
<view class="sub-section__item flex jc-center ai-center" :class="{'sub-section__active':index===1}" <view class="sub-section__item flex jc-center ai-center"
@click="change(1)"> @click="change(1)">
{{radioModel?'不可用':'已到期'}} ({{ notUse }}) {{radioModel?'不可用':'已到期'}} ({{ notUse }})
</view> </view>
<view class="sub-section__active" :style="{left: (80 + index * 360) + 'rpx'}"></view>
</view> </view>
</template> </template>
@@ -54,20 +55,27 @@ export default {
width: 686rpx; width: 686rpx;
height: 80rpx; height: 80rpx;
box-sizing: border-box; box-sizing: border-box;
border: 2rpx solid #FF564A; border-radius: 20rpx;
border-radius: 4rpx;
font-size: 32rpx; font-size: 32rpx;
overflow: hidden;
position: relative;
.sub-section__item { .sub-section__item {
width: 50%; width: 50%;
background: #FFFFFF; background: #FFFFFF;
color: #333333; color: #333333;
font-weight: bold; font-weight: bold;
position: relative;
} }
.sub-section__active { .sub-section__active {
background: #FF564A; position: absolute;
color: #FFFFFF; width: 140rpx;
height: 8rpx;
background: linear-gradient(to right, #C52733 0%, rgba(211,92,101,0.91) 54%, rgba(255,255,255,0.62) 100%);
border-radius: 0rpx 0rpx 26rpx 26rpx;
bottom: (80 - 34) / 2 * 1rpx;
transition: left ease-in-out 0.3s;
} }
} }
</style> </style>
+83 -7
View File
@@ -1,9 +1,9 @@
<template> <template>
<view class="evaluateWtapper"> <view class="evaluateWtapper">
<view <view
class="evaluateItem"
v-for="(item, evaluateWtapperIndex) in reply" v-for="(item, evaluateWtapperIndex) in reply"
:key="evaluateWtapperIndex" :key="evaluateWtapperIndex"
class="evaluateItem"
> >
<view class="pic-text acea-row row-middle"> <view class="pic-text acea-row row-middle">
<view class="pictrue"> <view class="pictrue">
@@ -11,14 +11,49 @@
</view> </view>
<view class="acea-row row-middle"> <view class="acea-row row-middle">
<view class="name line1">{{ item.nickname }}</view> <view class="name line1">{{ item.nickname }}</view>
<view class="time">{{ item.createTime }} </view>
</view>
</view>
<view class="v12-px-4">
<view class="v12-secondary-dark-text v12-font-24 attr-bg"> {{ item.sku }}</view>
<view class="start" :class="'star' + item.star"></view> <view class="start" :class="'star' + item.star"></view>
</view> </view>
</view> <view class="evaluate-infor v12-font-24">{{ item.comment }}</view>
<view class="time">{{ item.createTime }} {{ item.sku||'' }}</view>
<view class="evaluate-infor">{{ item.comment }}</view>
<view class="imgList acea-row"> <view class="imgList acea-row">
<view class="pictrue" v-for="(itemn, eq) in item.picturesArr" :key="eq"> <view v-if="item.video" class="pictrue">
<image :src="itemn" class="image" @click="previewImage(item.picturesArr,eq)" /> <view
@click="pauseOtherVideo('video' + evaluateWtapperIndex)"
v-if="activeVideo !== 'video' + evaluateWtapperIndex"
class="play-icon"
>
<u-icon name="play-right-fill" color="#fff" size="48"></u-icon>
</view>
<image
v-if="activeVideo !== 'video' + evaluateWtapperIndex"
:src="item.video + '?vframe/jpg/offset/1'"
class="image"
@click="pauseOtherVideo('video' + evaluateWtapperIndex)"
>
</image>
<video
v-else
:src="item.video"
:poster="item.video + '?vframe/jpg/offset/1'"
controls
autoplay
play-btn-position="center"
:id="'video' + evaluateWtapperIndex"
class="image"
@play="pauseOtherVideo('video' + evaluateWtapperIndex)"
/>
</view>
<view
v-for="(itemn, eq) in item.picturesArr"
:key="eq"
class="pictrue"
>
<image :src="itemn" class="image" @click="previewImage(item.picturesArr, eq)" />
</view> </view>
</view> </view>
<view class="reply" v-if="item.merchantReplyContent"> <view class="reply" v-if="item.merchantReplyContent">
@@ -40,7 +75,10 @@ export default {
} }
}, },
data: function() { data: function() {
return {}; return {
videoPlayers: [],
activeVideo: null,
};
}, },
mounted: function() {}, mounted: function() {},
methods: { methods: {
@@ -50,7 +88,45 @@ export default {
current:imgs[index], current:imgs[index],
urls:imgs urls:imgs
}) })
},
// 播放视频时暂停其他视频
pauseOtherVideo(video) {
this.activeVideo = video;
if(this.videoPlayers.includes(video)) {
this.videoPlayers.forEach((item) => {
if(item !== video) {
uni.createVideoContext(item, this).pause();
}
})
} else {
this.videoPlayers.push(video);
}
} }
} }
}; };
</script> </script>
<style lang="less" scoped>
.attr-bg{
background: rgba(197,39,51,0.1);
padding: 7rpx 5px;
width: fit-content;
border-radius: 12rpx;
}
.time{
padding: 0 !important;
}
.evaluateWtapper .evaluateItem .imgList .pictrue{
position: relative;
width: 300rpx;
.play-icon {
position: absolute;
top: 0;
left: 0;
bottom: 0;
right: 0;
margin: auto;
width: 80rpx;
height: 80rpx;
}
}
</style>
+57
View File
@@ -0,0 +1,57 @@
<template>
<view v-if="showImg" class="ai-entrance">
<image
:src="settingInfo.mainImage"
mode="widthFix"
class="img"
@click="enterAiChat()"
/>
</view>
</template>
<script>
import {
getAiSystemInfoSetting
} from '@/api/public'
export default {
name: 'AiEntrance',
data() {
return {
showImg: false,
settingInfo: {}
}
},
created() {
this.init()
},
methods: {
init() {
getAiSystemInfoSetting().then(res => {
const { success, data } = res
if (success) {
this.settingInfo = data
this.showImg = data.showOnAppIndex === 1
}
})
},
enterAiChat() {
uni.navigateTo({
url: '/aiChat/views/index?click=1'
})
}
}
}
</script>
<style scoped lang="less">
.ai-entrance {
position: fixed;
right: 0;
top: 50%;
z-index: 5;
transform: translateY(-50%);
.img {
width: 88rpx;
}
}
</style>
+17 -2
View File
@@ -1,13 +1,28 @@
<template> <template>
<view class="noCommodity"> <view class="noCommodity">
<view class="noPictrue"> <view class="noPictrue">
<image :src="webUrl+'/20210203153900181449.png'" class="image"/> <image
v-if="type === 'good'"
:src=" webUrl + '/20210203153900181449.png'"
class="image"
/>
<image
v-if="type === 'hotel'"
:src=" webUrl + '/no-hotel.png'"
class="image"
/>
</view> </view>
</view> </view>
</template> </template>
<script> <script>
export default { export default {
name: "NoGoodData", name: 'NoGoodData',
props: {
type: {
type: String,
default: 'good'
}
},
data: function() { data: function() {
return { return {
webUrl: this.$VUE_APP_RESOURCES_URL webUrl: this.$VUE_APP_RESOURCES_URL
+1
View File
@@ -75,6 +75,7 @@
current: cind, current: cind,
indicator: 'default' indicator: 'default'
}); });
this.$emit('click')
}, },
getheight() { getheight() {
let that = this; let that = this;
+87
View File
@@ -0,0 +1,87 @@
### 使用组件
```html
<time-picker-popup ref="TimePickerPopupRef" :value="value" @confirm="confirm"></time-picker-popup>
```
### 引入组件
```javascript
import TimePickerPopup from '@/components/time-picker-popup/time-picker-popup.vue';
```
### 注册组件
```javascript
export default {
components: { TimePickerPopup },
data() {
return {
value: ['00', '00', '00', '00']
}
},
onReady() {
this.open();
},
methods: {
confirm(data) {
uni.showToast({
title: `${data[0]}:${data[1]}-${data[2]}:${data[3]}`
})
},
open() {
this.$refs.TimePickerPopupRef.open();
}
}
}
```
### 参数
```javascript
// 当前选中的值
value: {
type: Array,
default: () => (['00', '00', '00', '00'])
},
// 标题
title: {
type: String,
default: '时间'
},
// 取消按钮文字
cancelText: {
type: String,
default: '取消'
},
// 取消按钮颜色
canceColor: {
type: String,
default: '#666666'
},
// 确定按钮文字
confirmText: {
type: String,
default: '确定'
},
// 确定按钮颜色
confirmColor: {
type: String,
default: '#2bb781'
},
// 分割符
segmentation: {
type: String,
default: '-'
},
// 设置选择器中间选中框的类名 注意页面或组件的style中写了scoped时,需要在类名前写/deep/
indicatorClass: {
type: String,
default: 'picker-view__indicator'
},
// 设置选择器中间选中框的样式
indicatorStyle: {
type: String,
default: ''
},
```
@@ -0,0 +1,159 @@
<template>
<!-- 时间选择器弹窗 -->
<uni-popup ref="popup" type="bottom" :safe-area="false">
<view class="custom-picker">
<view class="custom-picker__header">
<view class="cancel" :style="{ color: canceColor }" @tap="onCancel">{{ cancelText }}</view>
<view class="title">{{ title }}</view>
<view class="confirm" :style="{ color: confirmColor }" @tap="onConfirm">{{ confirmText }}</view>
</view>
<picker-view :indicator-class="indicatorClass" :indicator-style="indicatorStyle" class="picker-view"
:value="value" @change="bindChange" @pickstart="pickstart" @pickend="pickend">
<picker-view-column>
<view class="picker-view__item" v-for="(item,index) in rangeList[0]" :key="index">{{item}}</view>
</picker-view-column>
<picker-view-column>
<view class="picker-view__item" v-for="(item,index) in rangeList[1]" :key="index">{{item}}</view>
</picker-view-column>
<view class="picker-view__segmentation">{{ segmentation }}</view>
<picker-view-column>
<view class="picker-view__item" v-for="(item,index) in rangeList[2]" :key="index">{{item}}</view>
</picker-view-column>
<picker-view-column>
<view class="picker-view__item" v-for="(item,index) in rangeList[3]" :key="index">{{item}}</view>
</picker-view-column>
</picker-view>
</view>
</uni-popup>
</template>
<script>
import utils, {
props,
range
} from './utils.js';
export default {
name: 'TimePickerPopup',
props: props,
data() {
return {
rangeList: utils.range,
pickerValue: [0, 0, 0, 0],
isScoll: false, // 是否正在滚动
}
},
methods: {
/**
* 开启弹窗
*/
open() {
// 判断是否传入props -> value
if (Array.isArray(this.value) && this.value.length) {
this.pickerValue = this.value.map((item, index) => this.rangeList[index].findIndex(child =>
child == this.value[index]));
} else {
this.pickerValue = [0, 0, 0, 0];
}
this.$refs.popup.open();
},
/**
* 关闭弹窗
*/
close() {
this.$refs.popup.close();
// 重置选中数据
this.pickerValue = [0, 0, 0, 0];
},
/**
* 点击确定
*/
onConfirm() {
if (!this.isScoll) {
let data = this.value || ['00', '00', '00', '00'];
if (this.pickerValue && this.pickerValue.length) {
data = this.pickerValue.map((item, index) => String(this.rangeList[index][item]));
}
this.$emit('confirm', data);
this.close();
}
},
/**
* 点击取消
*/
onCancel() {
this.close();
},
/**
* 滚动开始
*/
pickstart() {
this.isScoll = true;
},
/**
* 滚动结束
*/
pickend() {
this.isScoll = false;
},
/**
* 选择器改变
* @param {Object} e
*/
bindChange(e) {
this.pickerValue = e.detail.value;
},
}
}
</script>
<style lang="scss" scoped>
.custom-picker {
width: 100%;
height: 620rpx;
background-color: #fff;
padding-bottom: 0;
padding-bottom: constant(safe-area-inset-bottom);
padding-bottom: env(safe-area-inset-bottom);
&__header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 30rpx 40rpx;
.cancel {
color: #666;
}
.title {
font-size: 32rpx;
color: #333;
}
.confirm {
color: #2bb781;
}
}
}
.picker-view {
width: 100%;
height: 100%;
margin-top: 20rpx;
&__item {
line-height: 100rpx;
text-align: center;
}
/deep/ &__indicator {
height: 100rpx;
color: #2bb781;
}
&__segmentation {
display: flex;
align-items: center;
}
}
</style>
+69
View File
@@ -0,0 +1,69 @@
// 组件props
const props = {
// 当前选中的值
value: {
type: Array,
default: () => (['00', '00', '00', '00'])
},
// 标题
title: {
type: String,
default: '时间'
},
// 取消按钮文字
cancelText: {
type: String,
default: '取消'
},
// 取消按钮颜色
canceColor: {
type: String,
default: '#666666'
},
// 确定按钮文字
confirmText: {
type: String,
default: '确定'
},
// 确定按钮颜色
confirmColor: {
type: String,
default: '#2bb781'
},
// 分割符
segmentation: {
type: String,
default: '-'
},
// 设置选择器中间选中框的类名 注意页面或组件的style中写了scoped时,需要在类名前写/deep/
indicatorClass: {
type: String,
default: 'picker-view__indicator'
},
// 设置选择器中间选中框的样式
indicatorStyle: {
type: String,
default: ''
},
}
// 滚动数据
let range = [
[],
[],
[],
[]
];
for (let i = 0; i < 24; i++) {
range[0].push(i >= 10 ? String(i) : `0${i}`);
range[2].push(i >= 10 ? String(i) : `0${i}`);
}
for (let i = 0; i < 60; i++) {
range[1].push(i >= 10 ? String(i) : `0${i}`);
range[3].push(i >= 10 ? String(i) : `0${i}`);
}
export default {
props,
range
}
@@ -1,16 +1,24 @@
<template name="sunui-upimg"> <template name="sunui-upimg">
<view class="sunui-uploader-bd"> <view class="sunui-uploader-bd">
<view class="sunui-uploader-files"> <view class="sunui-uploader-files">
<view
v-if="showBlankPlaceholder"
:style="'width:' + upload_img_wh + 'rpx; height:' + upload_img_wh + 'rpx;'"
class="sunui-uploader-file"
/>
<block v-for="(item, index) in upload_before_list" :key="index"> <block v-for="(item, index) in upload_before_list" :key="index">
<view class="sunui-uploader-file" :class="[item.upload_percent < 100 ? 'sunui-uploader-file-status' : '']" :style="'width:' + upload_img_wh + 'rpx; height:' + upload_img_wh + 'rpx;'"> <view class="sunui-uploader-file" :class="[item.upload_percent < 100 ? '' : '']" :style="'width:' + upload_img_wh + 'rpx; height:' + upload_img_wh + 'rpx;'">
<image class="sunui-uploader-img" :style="'width:' + upload_img_wh + 'rpx; height:' + upload_img_wh + 'rpx;'" :src="item.path" mode="aspectFill" @tap="preview(index)" v-if="type === 'image'" /> <image class="sunui-uploader-img" :style="'width:' + upload_img_wh + 'rpx; height:' + upload_img_wh + 'rpx;'" :src="item.path" mode="aspectFill" @tap="preview(index)" v-if="type === 'image'" />
<video :id="`myVideo_${index}`" :src="item.path" :data-index="index" @play="videoPlay" @error="videoError" controls :enable-play-gesture="true" objectFit="contain" :style="'width:' + upload_img_wh + 'rpx; height:' + upload_img_wh + 'rpx;'" v-if="type === 'video'"></video> <video :id="`myVideo_${index}`" :src="item.path" :data-index="index" @play="videoPlay" @error="videoError" controls :enable-play-gesture="true" objectFit="contain" :style="'width:' + upload_img_wh + 'rpx; height:' + upload_img_wh + 'rpx;'" v-if="type === 'video'"></video>
<view class="sunui-img-removeicon right" @tap.stop="remove(index)" v-show="upimg_move">x</view> <view class="sunui-img-removeicon right" @tap.stop="remove(index)" v-show="upimg_move">x</view>
<view class="sunui-loader-filecontent" v-if="item.upload_percent < 100">{{item.upload_percent}}%</view> <!-- <view class="sunui-loader-filecontent" v-if="item.upload_percent < 100">{{item.upload_percent}}%</view> -->
</view> </view>
</block> </block>
<view v-show="upload_before_list.length < upload_count" hover-class="sunui-uploader-hover" class="sunui-uploader-inputbox" @tap="choose" :style="'width:' + upload_img_wh + 'rpx; height:' + upload_img_wh + 'rpx;'"> <view v-show="upload_before_list.length < upload_count" hover-class="sunui-uploader-hover" class="sunui-uploader-inputbox" @tap="choose" :style="'width:' + upload_img_wh + 'rpx; height:' + upload_img_wh + 'rpx;'">
<view :style="'line-height:'+ upload_img_wh + 'rpx;'"><text class="iconfont icon-mn_shangchuantupian" style="color: #666;"></text></view> <view :style="'line-height:'+ upload_img_wh + 'rpx;'">
<text v-if="type === 'image'" class="iconfont icon-mn_shangchuantupian" style="color: #666;"></text>
<u-icon v-if="type === 'video'" size="48px" name="play-circle" style="color: #666;"></u-icon>
</view>
</view> </view>
</view> </view>
</view> </view>
@@ -48,6 +56,11 @@ export default {
}, },
name: 'sunui-upimg', name: 'sunui-upimg',
props: { props: {
//
showBlankPlaceholder: {
type: Boolean,
default: false
},
upload_video_max: { upload_video_max: {
type: Number, type: Number,
default: 30 // (M) default: 30 // (M)
@@ -94,6 +107,21 @@ export default {
default: true default: true
} }
}, },
watch: {
dataList: {
handler(val) {
this.upload_before_list = val
this.upload_cache_list = []
if (val.length > 0) {
val.map(item => {
item && this.upload_cache_list.push(item.path)
})
}
this.emit()
},
immediate: true
}
},
onReady(res) { onReady(res) {
this.$nextTick(() => { this.$nextTick(() => {
for (let i = 0; i < 10; i++) { for (let i = 0; i < 10; i++) {
@@ -101,40 +129,6 @@ export default {
} }
}); });
}, },
created() {
},
mounted() {
},
watch: {
// url(val) {
// this.upload_before_list.map((item) => {
// this.upload_cache_list.push(item.path);
// });
// this.emit();
// }
dataList:{
handler(val){
console.log('dataList change'+JSON.stringify(val));
this.upload_before_list = val;
if(this.upload_before_list.length>0){
this.upload_cache_list = [];
this.upload_before_list.map((item) => {
//
if(item.path.substring(0,4) == 'http' && item.path.substring(0,11) != 'http://tmp/')
{
this.upload_cache_list.push(item.path);
}
});
}else{
this.upload_cache_list = [];
}
this.emit();
},
immediate: true
}
},
methods: { methods: {
videoPlay(e) { videoPlay(e) {
let index = e.currentTarget.dataset.index; let index = e.currentTarget.dataset.index;
@@ -145,10 +139,10 @@ export default {
} }
}, },
videoError(e) { videoError(e) {
uni.showModal({ // uni.showModal({
content: '网络错误,请稍后重试!', // content: '',
showCancel: false // showCancel: false
}); // });
}, },
uploadFile(paths) { uploadFile(paths) {
const promises = paths.map((path) => { const promises = paths.map((path) => {
@@ -161,9 +155,9 @@ export default {
}); });
}); });
/* uni.showLoading({ uni.showLoading({
title: `正在上传...`, title: `正在上传...`,
}); */ })
Promise.all(promises).then((data) => { Promise.all(promises).then((data) => {
// uni.hideLoading(); // uni.hideLoading();
@@ -171,9 +165,10 @@ export default {
this.upload_cache_list.push(...data); this.upload_cache_list.push(...data);
console.log("after uploaded upload_cache_list:"+JSON.stringify(this.upload_cache_list)) console.log("after uploaded upload_cache_list:"+JSON.stringify(this.upload_cache_list))
this.emit(); this.emit();
uni.hideLoading()
}).catch((res) => { }).catch((res) => {
console.log(res); console.log(res);
// uni.hideLoading(); uni.hideLoading()
}); });
}, },
choose() { choose() {
@@ -190,6 +185,7 @@ export default {
if (Math.ceil(res.size / 1024) < this.upload_video_max * 1024) { if (Math.ceil(res.size / 1024) < this.upload_video_max * 1024) {
await this.upload_img_size.push(Math.ceil(res.size / 1024)); await this.upload_img_size.push(Math.ceil(res.size / 1024));
await this.upload_before_list.push(res); await this.upload_before_list.push(res);
this.$forceUpdate()
} else { } else {
this.upload_exceeded_list.push(1); this.upload_exceeded_list.push(1);
@@ -224,13 +220,14 @@ export default {
if (Math.ceil(res.tempFiles[i].size / 1024) < this.upload_max * 1024) { if (Math.ceil(res.tempFiles[i].size / 1024) < this.upload_max * 1024) {
await this.upload_img_size.push(Math.ceil(res.tempFiles[i].size / 1024)); await this.upload_img_size.push(Math.ceil(res.tempFiles[i].size / 1024));
await this.upload_before_list.push(res.tempFiles[i]); await this.upload_before_list.push(res.tempFiles[i]);
this.$forceUpdate()
// TODO v3.1 // TODO v3.1
} else { } else {
res.tempFilePaths.splice(i, 1); res.tempFilePaths.splice(i, 1);
this.upload_exceeded_list.push(i === 0 ? 1 : i + 1); this.upload_exceeded_list.push(i === 0 ? 1 : i + 1);
uni.showModal({ uni.showModal({
title: '提示', title: '提示',
content: `${[...new Set(this.upload_exceeded_list)].join(',')}图片超出限制${this.upload_max}MB,已过滤`, content: `图片超出限制${this.upload_max}MB,已过滤`,
showCancel: false, showCancel: false,
confirmText: '确认', confirmText: '确认',
success(res) { success(res) {
@@ -244,6 +241,7 @@ export default {
} }
this.upload_cache = await res.tempFilePaths; this.upload_cache = await res.tempFilePaths;
this.upload(this.upload_auto); this.upload(this.upload_auto);
this.$forceUpdate()
}, },
fail: (err) => { fail: (err) => {
console.log(err); console.log(err);
@@ -343,7 +341,12 @@ export default {
uploadTask.onProgressUpdate(async (res) => { uploadTask.onProgressUpdate(async (res) => {
// this.upload_before_list[this.upload_before_list.length-1].upload_percent = await res.progress; // this.upload_before_list[this.upload_before_list.length-1].upload_percent = await res.progress;
for(let i in this.upload_before_list) { if(this.upload_before_list[i].upload_percent != 100) { this.upload_before_list[i].upload_percent = await res.progress; break; } }; for (let i in this.upload_before_list) {
if (this.upload_before_list[i].upload_percent != 100) {
console.log(res.progress, '-----------res.progress-----------');
this.upload_before_list[i].upload_percent = await res.progress
}
};
}); });
} }
} }
@@ -378,7 +381,7 @@ export default {
} }
.icon-mn_shangchuantupian { .icon-mn_shangchuantupian {
font-size: 3em; font-size: 48px;
} }
.sunui-uploader-img { .sunui-uploader-img {
@@ -397,7 +400,7 @@ export default {
.sunui-uploader-inputbox { .sunui-uploader-inputbox {
position: relative; position: relative;
margin-bottom: 16rpx; margin: 0 16rpx 16rpx 0;
box-sizing: border-box; box-sizing: border-box;
background-color: #ededed; background-color: #ededed;
display: flex; display: flex;
@@ -446,7 +449,6 @@ export default {
color: #fff; color: #fff;
z-index: 9; z-index: 9;
} }
.sunui-uploader-bd { .sunui-uploader-bd {
padding: 0; padding: 0;
margin: 0; margin: 0;
@@ -0,0 +1,320 @@
<template>
<uni-popup ref="popup" type="bottom">
<view class="tpf-time-range-section">
<view class="tpf-time-range-title-section flex flex-align-center flex-pack-justify">
<text class="tpf-time-range-title-txt tpf-time-range-cancel" @tap="closePopup('cancel')">取消</text>
<text class="tpf-time-range-title-txt tpf-time-range-title">营业时间</text>
<text class="tpf-time-range-title-txt tpf-time-range-sure" @tap="closePopup('sure')">确定</text>
</view>
<view class="tpf-time-range-main flex flex-l flex-align-center flex-pack-justify">
<view class="tpf-time-range-item flex flex-v flex-align-center">
<picker-view class="flex-1 tpf-picker-view" :value="startDefaultTimeArr" indicator-style="height: 50px;" @change="startTimeChange">
<picker-view-column>
<view class="tpf-time-range-picker-item flex flex-align-center flex-pack-center" v-for="(item,index) in createTimeRange.hours" :key="index">{{item}}</view>
</picker-view-column>
<picker-view-column>
<view class="tpf-time-range-picker-item flex flex-align-center flex-pack-center" v-for="(item,index) in createTimeRange.startMinutes" :key="index">{{item}}</view>
</picker-view-column>
</picker-view>
</view>
<text class="tpf-time-divide"> - </text>
<view class="tpf-time-range-item flex flex-v flex-align-center">
<picker-view class="flex-1 tpf-picker-view" :value="endDefaultTimeArr" indicator-style="height: 50px;" @change="endTimeChange">
<picker-view-column>
<view class="tpf-time-range-picker-item flex flex-align-center flex-pack-center" v-for="(item,index) in createTimeRange.hours" :key="index">{{item}}</view>
</picker-view-column>
<picker-view-column>
<view class="tpf-time-range-picker-item flex flex-align-center flex-pack-center" v-for="(item,index) in createTimeRange.endMinutes" :key="index">{{item}}</view>
</picker-view-column>
</picker-view>
</view>
</view>
</view>
</uni-popup>
</template>
<script>
/**
* TimeRange 时间范围选择
* @description 对时间(时、分)区间进行选择,限制选择范围
* @property {string} startTime 定义开始时间
* @property {string} startDefaultTime 定义开始默认时间
* @property {string} endTime 定义结束时间
* @property {string} endDefaultTime 定义结束默认时间
* @event {Function()} name
*/
export default{
name:"TpfTimeRange",
props:{
// 开始时间
startTime:{
type:String,
default:"00:00",
validator:(value)=>{
return /(((2[0-3])|([0-1][0-9])):[0-5][0-9])|24:00/.test(value);
}
},
// 开始默认时间
startDefaultTime:{
type:String,
// #ifdef MP-WEIXIN
default:"00:00",
// #endif
// #ifndef MP-WEIXIN
default(){
return this.startTime;
},
// #endif
validator:(value)=>{
return /(((2[0-3])|([0-1][0-9])):[0-5][0-9])|24:00/.test(value);
}
},
// 结束时间
endTime:{
type:String,
default:"23:59",
validator:(value)=>{
return /(((2[0-3])|([0-1][0-9])):[0-5][0-9])|24:00/.test(value);
}
},
// 结束默认时间
endDefaultTime:{
type:String,
// #ifdef MP-WEIXIN
default:"23:59",
// #endif
// #ifndef MP-WEIXIN
default(){
return this.endTime;
},
// #endif
validator:(value)=>{
return /(((2[0-3])|([0-1][0-9])):[0-5][0-9])|24:00/.test(value);
}
}
},
data(){
return {
startDefaultTimeArr:[0,0],
endDefaultTimeArr:[0,0],
}
},
methods:{
startTimeChange(e){
this.startDefaultTimeArr = e.detail.value;
if(this.compareTwoTimeRange(e.detail.value,this.endDefaultTimeArr)) this.endDefaultTimeArr = e.detail.value;
},
endTimeChange(e){
this.endDefaultTimeArr = e.detail.value;
if(this.compareTwoTimeRange(this.startDefaultTimeArr,e.detail.value)) this.startDefaultTimeArr = e.detail.value;
},
open(){
this.$refs.popup.open();
},
closePopup(action=""){
if(action == "cancel"){
this.$refs.popup.close();
return false;
}
if(this.compareTwoTimeRange(this.startDefaultTimeArr , this.endDefaultTimeArr)){
uni.showToast({
title:"开始时间不能大于结束时间",
icon:'none'
});
return false;
}
let startTime = this.createTimeRange.hours[this.startDefaultTimeArr[0]]+":"+this.createTimeRange.startMinutes[this.startDefaultTimeArr[1]];
let endTime = this.createTimeRange.hours[this.endDefaultTimeArr[0]]+":"+this.createTimeRange.endMinutes[this.endDefaultTimeArr[1]];
this.$emit('timeRange',[
startTime,endTime
]);
this.$refs.popup.close();
},
compareTwoTimeRange(arr1=[],arr2=[]){
if(arr1[0]>arr2[0] || (arr1[0] == arr2[0] && arr1[1] > arr2[1])) return true;
return false;
},
},
beforeCreate(){
// 初始化小时
let hour = [],minute=[];
for(let h=0;h<=24;h++){
hour.push(h<10?'0'+h:h+'');
}
for(let m=0;m<60;m++){
minute.push(m<10?'0'+m:m+'');
}
this.timeRange = {hour,minute};
},
created() {
},
computed:{
createTimeRange(){
let {startTime,startDefaultTime,endTime,endDefaultTime} = this.timeRangeDateChange;
let startTimeArr = startTime.split(":"),endTimeArr = endTime.split(":");
let hours = this.timeRange.hour.slice(
this.timeRange.hour.findIndex(item=>item == startTimeArr[0]),
this.timeRange.hour.findIndex(item=>item == endTimeArr[0])+1,
);
let startMinutes = null;
if(startTimeArr[0] == endTimeArr[0]){
startMinutes = this.timeRange.minute.slice(
this.timeRange.minute.findIndex(item=>item == startTimeArr[1]),
this.timeRange.minute.findIndex(item=>item == endTimeArr[1])+1,
);
}else{
if(this.startDefaultTimeArr[0] == 0){
startMinutes = this.timeRange.minute.slice(
this.timeRange.minute.findIndex(item=>item == startTimeArr[1])
);
}
else if(this.startDefaultTimeArr[0] == hours.length-1){
startMinutes = this.timeRange.minute.slice(
0,
this.timeRange.minute.findIndex(item=>item == endTimeArr[1])+1
);
}else{
startMinutes = this.timeRange.minute; // 完整数据
}
}
let endMinutes = null;
if(startTimeArr[0] == endTimeArr[0]){
endMinutes = this.timeRange.minute.slice(
this.timeRange.minute.findIndex(item=>item == startTimeArr[1]),
this.timeRange.minute.findIndex(item=>item == endTimeArr[1])+1,
);
}
else{
if(this.endDefaultTimeArr[0] == 0){
endMinutes = this.timeRange.minute.slice(
this.timeRange.minute.findIndex(item=>item == startTimeArr[1])
);
}
else if(this.endDefaultTimeArr[0] == hours.length-1){
endMinutes = this.timeRange.minute.slice(
0,
this.timeRange.minute.findIndex(item=>item == endTimeArr[1])+1
);
}else{
endMinutes = this.timeRange.minute; // 完整数据
}
}
return {
hours,
startMinutes,
endMinutes,
}
},
// 用于监听属性的变化
timeRangeDateChange(){
let {startTime,startDefaultTime,endTime,endDefaultTime} = this;
startTime = startTime<endTime?startTime:endTime;
startDefaultTime = startDefaultTime>=startTime && startDefaultTime<=endTime?startDefaultTime:startTime;
endDefaultTime = endDefaultTime>=startTime && endDefaultTime<=endTime && endDefaultTime>=startDefaultTime?endDefaultTime:startDefaultTime;
return {
startTime,
startDefaultTime,
endTime,
endDefaultTime
}
}
},
watch:{
timeRangeDateChange:{
handler(newVal,oldVal){
let {startTime,startDefaultTime,endTime,endDefaultTime} = newVal;
let startTimeArr = startTime.split(":"),endTimeArr = endTime.split(":");
let startDefaultTimeArr = startDefaultTime.split(":"),endDefaultTimeArr = endDefaultTime.split(":");
let hours = this.timeRange.hour.slice(
this.timeRange.hour.findIndex(item=>item == startTimeArr[0]),
this.timeRange.hour.findIndex(item=>item == endTimeArr[0])+1,
);
this.$set(this.startDefaultTimeArr,0, hours.includes(startDefaultTimeArr[0])?hours.findIndex(item=>item == startDefaultTimeArr[0]):0);
this.$set(this.endDefaultTimeArr,0, hours.includes(endDefaultTimeArr[0])?hours.findIndex(item=>item == endDefaultTimeArr[0]):this.startDefaultTimeArr[0]);
let startMinute = null,endMinute = null;
if(startTimeArr[0] == endTimeArr[0]){
startMinute = endMinute = this.timeRange.minute.slice(
this.timeRange.minute.findIndex(item=>item == startTimeArr[1]),
this.timeRange.minute.findIndex(item=>item == endTimeArr[1])+1,
);
}
else{
if(startDefaultTime.split(":")[0] == startTimeArr[0]){
startMinute = this.timeRange.minute.slice(
this.timeRange.minute.findIndex(item=>item == startTimeArr[1]),
);
}
else if(startDefaultTime.split(":")[0] == endTimeArr[0]){
startMinute = this.timeRange.minute.slice(
0,
this.timeRange.minute.findIndex(item=>item == endTimeArr[1])+1,
);
}else{
startMinute = this.timeRange.minute;
}
if(endDefaultTime.split(":")[0] == startTimeArr[0]){
endMinute = this.timeRange.minute.slice(
this.timeRange.minute.findIndex(item=>item == startTimeArr[1]),
);
}else if(endDefaultTime.split(":")[0] == endTimeArr[0]){
endMinute = this.timeRange.minute.slice(
0,
this.timeRange.minute.findIndex(item=>item == endTimeArr[1])+1,
);
}else{
endMinute = this.timeRange.minute;
}
}
this.$set(this.startDefaultTimeArr,1, startMinute.includes(startDefaultTimeArr[1])?startMinute.findIndex(item=>item == startDefaultTimeArr[1]):0);
this.$set(this.endDefaultTimeArr,1, endMinute.includes(endDefaultTimeArr[1])?endMinute.findIndex(item=>item == endDefaultTimeArr[1]):this.startDefaultTimeArr[1]);
},
deep:true, // 深度监听
immediate:true, // 初始化立即执行
}
}
}
</script>
<style lang="scss">
.flex{display:flex;}
.flex-v{flex-direction:column;}
.flex-wrap{flex-wrap:wrap;}
.flex-row-wrap{flex-flow:row wrap;}
.flex-1{flex:1;}
.flex-align-center{align-items:center;}
.flex-pack-center{justify-content:center;}
.flex-pack-justify{justify-content:space-between;}
.flex-pack-around{justify-content:space-around;}
.tpf-time-range-section{
background-color: #FFF;
}
.tpf-time-range-title-section{
padding: 20rpx;
border-bottom: 1px #f2f2f2 solid;
}
.tpf-time-range-title-txt{
font-size: 28rpx;
}
.tpf-time-range-title{
font-size:32rpx;
}
.tpf-time-range-main{
padding: 0 20rpx 20rpx;
}
.tpf-time-range-item{
height: 400rpx;
width: 300rpx;
}
.tpf-start-time{
padding: 20rpx 0;
}
.tpf-picker-view{
width:280rpx;
}
</style>
+229
View File
@@ -0,0 +1,229 @@
<template>
<view class="xdd-product-item" @click="viewHandle(item)">
<view class="focus-img">
<image
v-if="!item.isFarmerShop"
:src="item[imageKey]"
class="img"
/>
<image
:src="item.farmerShopCover"
v-if="item.farmerShopCoverType === 1 && item.isFarmerShop"
class="img"
mode="heightFix|widthFix">
</image>
<image
:src="item.farmerShopCover + '?vframe/jpg/offset/1'"
mode="heightFix|widthFix"
v-if="item.farmerShopCoverType !== 1 && item.isFarmerShop"
:show-center-play-btn="false"
:show-fullscreen-btn="false"
:show-play-btn="false"
class="img"
:poster="item.farmerShopCover + '?vframe/jpg/offset/1'">
</image>
<image
v-if="item.isOldBrand"
:src="webUrl + '/home/old-mark.png'"
class="mark-img"
/>
<image
v-if="item.isLandmarkGoods"
:src="webUrl + '/home/mark-land.png'"
class="mark-img"
style="right: 20rpx"
/>
<image
v-if="item.isCountyFamous"
:src="webUrl + '/home/qixian-mark.png'"
class="mark-img"
/>
<image
v-if="item.isIch"
:src="webUrl + '/home/ich-mark.png'"
class="mark-img"
style="right: 20rpx; width: 70rpx"
/>
<image
v-if="item.isFarmerShop"
:src="webUrl + '/orderIcon/nm.png'"
class="mark-img-nm"
/>
</view>
<view v-if="item.isFarmerShop" class="more-t v12-pt-2 v12-font-bold v12-font-28 v12-px-2" >{{ item.farmerShopContent }}</view>
<view class="info-wrap" v-if="!item.isFarmerShop">
<view class="name more-t">
{{ item[nameKey] }}
</view>
<view v-if="item.bestContent" class="desc more-t">
{{ item.bestContent }}
</view>
<view v-if="item.couponName && showCoupon" class="coupon">
<view class="tag"></view>
<view class="tag">{{ item.couponName }}</view>
</view>
<view class="price-wrap">
<view class="price">
<text class="price-txt price-red">{{ item[priceKey] }}</text>
</view>
<view class="btn" @click.stop="$emit('add', item)">
<image
:src="webUrl + '/home/icon-cart.png'"
class="img"
/>
</view>
</view>
</view>
<view
v-if="item.isFarmerShop"
class="v12-justify-start v12-align-center v12-pt-2 v12-px-2 v12-pb-2">
<view class="btn v12-mr-2">
<image :src="item.farmerShopLogo" class="nm-img-logo v12-radius-100"></image>
</view>
<view class="one-t v12-font-24 v12-dark1-text" style="width:230rpx">{{ item.farmerShopName }}/{{ item.farmerShopCityName || '-' }}</view>
</view>
</view>
</template>
<script>
export default {
name: 'XddProductItem',
props: {
item: {
type: Object,
default: () => {
return {}
}
},
imageKey: {
type: String,
default: 'image'
},
nameKey: {
type: String,
default: 'storeName'
},
priceKey: {
type: String,
default: 'price'
},
// 是否显示优惠券
showCoupon: {
type: Boolean,
default: true
}
},
data() {
return {
webUrl: this.$VUE_APP_RESOURCES_URL
}
},
methods: {
viewHandle(item) {
this.$emit('view', item)
}
}
}
</script>
<style lang="less">
.nm-img-logo {
display: block;
width: 48rpx;
height: 48rpx;
}
.mark-img-nm{
position: absolute;
top: 0;
right: 0;
z-index: 3;
display: block;
width: 100%;
height: 100%;
border-radius: 0 25rpx 0 0;
}
.xdd-product-item {
border-radius: 20rpx;
background-color: #fff;
overflow: hidden;
.focus-img {
position: relative;
.img {
position: relative;
z-index: 2;
display: block;
width: 345rpx;
height: 345rpx;
border-radius: 20rpx;
}
.mark-img {
position: absolute;
top: 0;
right: 0;
z-index: 3;
display: block;
width: 84rpx;
height: 74rpx;
}
}
.info-wrap {
padding: 12rpx;
.name {
font-size: 28rpx;
line-height: 40rpx;
color: #333;
}
.desc {
width: 320rpx;
padding: 10rpx 0 0 0;
color: #FFC543;
font-size: 24rpx;
}
.coupon {
display: flex;
padding: 10rpx 0 0 0;
.tag + .tag {
margin: 0 0 0 -1rpx;
}
.tag {
height: 32rpx;
padding: 0 6rpx;
border-radius: 8rpx;
border: 1rpx solid #C52733;
color: #C52733;
line-height: 32rpx;
font-size: 10px;
}
}
.price-wrap {
display: flex;
justify-content: space-between;
align-items: flex-end;
padding: 10rpx 0 0 0;
.price {
font-size: 24rpx;
line-height: 40rpx;
.price-txt {
font-size: 40rpx;
font-weight: bold;
}
}
.price-red {
margin: 0 10rpx 0 0;
color: #C52733;
}
.price-grey {
color: #C4C4C4;
}
.btn {
.img {
display: block;
width: 48rpx;
height: 48rpx;
}
}
}
}
}
</style>
+217
View File
@@ -0,0 +1,217 @@
<template>
<view
:style="{
'background-image': 'url(' + webUrl + '/home/tabbar-bg.png);'
}"
class="xdd-tabbar-wrap"
>
<view class="center-img" id="quweiIcon" @click="switchTabFn('/pages/cloud/haveFun')">
<image
:src="webUrl + '/home/tabbar-center.png'"
class="img"
/>
<view
:class="currIndex === 4 ? 'curr' : ''"
class="name"
>寻趣味</view>
</view>
<view class="tabbar-list">
<view
v-for="(tabbarItem, tabbarIndex) in tabbar"
:key="tabbarIndex"
class="tabbar-item"
>
<view
v-for="(item, index) in tabbarItem"
:key="index"
:class="currIndex === item.index ? 'curr' : ''"
:id="'icon' + index"
class="item"
@click="gotoPage(item.url, item.type, item.index)"
>
<view class="img-wrap">
<!-- 预加载两张图片可以在点击切换的时候不闪屏 -->
<image
:src="item.onIcon"
class="img on"
/>
<image
:src="item.offIcon"
class="img off"
/>
</view>
<view class="name">{{ item.name }}</view>
</view>
</view>
</view>
</view>
</template>
<script>
export default {
name: 'XddTabbar',
props: {
currIndex: {
type: Number,
default: 0
}
},
data() {
return {
webUrl: this.$VUE_APP_RESOURCES_URL,
tabbar: [[
{
name: '首页',
onIcon: this.$VUE_APP_RESOURCES_URL + '/home/tabbar-01-on.png',
offIcon: this.$VUE_APP_RESOURCES_URL + '/home/tabbar-01-off.png',
url: '/pages/home/index',
type: 1,
index: 0
},
{
name: '消息',
onIcon: this.$VUE_APP_RESOURCES_URL + '/home/tabbar-02-on.png',
offIcon: this.$VUE_APP_RESOURCES_URL + '/home/tabbar-02-off.png',
url: '/pkg_common/views/roomLogs',
type: 2,
index: 1
}
],[
{
name: '购物车',
onIcon: this.$VUE_APP_RESOURCES_URL + '/home/tabbar-03-on.png',
offIcon: this.$VUE_APP_RESOURCES_URL + '/home/tabbar-03-off.png',
url: '/pages/cart',
type: 1,
index: 2
},
{
name: '我的',
onIcon: this.$VUE_APP_RESOURCES_URL + '/home/tabbar-04-on.png',
offIcon: this.$VUE_APP_RESOURCES_URL + '/home/tabbar-04-off.png',
url: '/pages/user/User/index',
type: 1,
index: 3
}
]]
}
},
mounted() {
this.getElementData('#quweiIcon')
this.getIconData('#icon1')
},
methods: {
getElementData(el) {
const query = uni.createSelectorQuery().in(this)
query.select(el).boundingClientRect().exec((res)=> {
if(res[0]) {
this.$emit('getElementData', res[0])
}
})
},
getIconData(el) {
const query = uni.createSelectorQuery().in(this)
query.select(el).boundingClientRect().exec((res)=> {
if(res[0]) {
this.$emit('getIcon', res[0])
}
})
},
/**
* 跳转至目标页面
* type: 1-tabbar页面,2-非tabbar页面
*/
gotoPage(url, type = 1, index) {
if (this.currIndex === index) return
if (type === 1) {
this.switchTabFn(url)
}
if (type === 2) {
uni.navigateTo({ url })
}
},
switchTabFn(url) {
uni.switchTab({ url })
}
}
}
</script>
<style scoped lang="less">
.xdd-tabbar-wrap {
position: fixed;
bottom: 21rpx;
left: 21rpx;
right: 21rpx;
z-index: 99;
height: 164rpx;
background-size: 708rpx 164rpx;
background-repeat: no-repeat;
.center-img {
position: absolute;
top: -16rpx;
left: 50%;
z-index: 5;
transform: translateX(-50%);
.img {
width: 136rpx;
height: 136rpx;
}
.name {
text-align: center;
font-size: 24rpx;
color: #9a9a9a;
transform: translateY(-4rpx);
&.curr {
color: #C52733;
}
}
}
.tabbar-list {
position: relative;
z-index: 2;
display: flex;
justify-content: space-between;
padding: 70rpx 0 0 0;
.tabbar-item {
display: flex;
align-items: center;
width: calc(50% - 78rpx);
.img-wrap {
.img {
display: block;
width: 44rpx;
height: 44rpx;
margin: 0 auto;
&.on {
display: none;
}
&.off {
display: block;
}
}
}
.name {
padding: 10rpx 0 0 0;
text-align: center;
font-size: 24rpx;
color: #9a9a9a;
}
.item {
width: 140rpx;
&.curr {
.name {
color: #C52733;
}
.on {
display: block;
}
.off {
display: none;
}
}
}
}
}
}
</style>
@@ -100,7 +100,7 @@
} }
</script> </script>
<style lang="scss"> <style lang="scss" scoped>
input { input {
display: none; display: none;
} }
@@ -248,7 +248,7 @@
background: #EBEBEB; background: #EBEBEB;
display: flex; display: flex;
justify-content: center; justify-content: center;
z-index: 2; z-index: 999;
flex-wrap: wrap; flex-wrap: wrap;
transition:all 0.2s ease-in 0.2s; transition:all 0.2s ease-in 0.2s;
} }
+18
View File
@@ -0,0 +1,18 @@
const baseStr = 'edc_epro_prod:'
const settings = {
storage: {
systemInfo: `${baseStr}systemInfo`,
firstLaunch: `${baseStr}firstLaunch`,
token: `${baseStr}token`,
userInfo: `${baseStr}userInfo`,
webInfo: `${baseStr}webInfo`
},
/* 拦截器超时时长 */
timeout: 120 * 1000,
/* 系统接口前缀,没有统一的填空字符串 */
sysPrefix: '/',
/* 是否收集错误日志 */
collectRequestError: false
}
export default settings
+10 -10
View File
@@ -1,11 +1,3 @@
// export const VUE_APP_API_URL = "https://shop.xdd618.com/api";
// export const VUE_APP_API_URL = "https://www.xdd618.com/api";
// export const SERVICE_API_URL = "https://service-test.xdd618.com/api";
// export const SERVICE_API_URL = "https://service.xdd618.com/api";
// export const SOCKET_URL = "wss://service-test.xdd618.com/ws";
// export const SOCKET_URL = "wss://service.xdd618.com/ws";
const NODE_ENV = process.env.VUE_APP_ENV || 'development' const NODE_ENV = process.env.VUE_APP_ENV || 'development'
let BASE_URL = '' let BASE_URL = ''
let SERVICE_URL = '' let SERVICE_URL = ''
@@ -14,11 +6,17 @@ if (NODE_ENV === 'development' || NODE_ENV === 'test') {
BASE_URL = 'https://shop.xdd618.com/api' BASE_URL = 'https://shop.xdd618.com/api'
SERVICE_URL = 'https://service-test.xdd618.com/api' SERVICE_URL = 'https://service-test.xdd618.com/api'
SERVICE_WS_URL = 'wss://service-test.xdd618.com/ws' SERVICE_WS_URL = 'wss://service-test.xdd618.com/ws'
wx.setEnableDebug({
enableDebug: false
})
} }
if (NODE_ENV === 'prod') { if (NODE_ENV === 'prod') {
BASE_URL = 'https://www.xdd618.com/api' BASE_URL = 'https://wxapp.xdd618.com/api'
SERVICE_URL = 'https://service.xdd618.com/api' SERVICE_URL = 'https://service.xdd618.com/api'
SERVICE_WS_URL = 'wss://service.xdd618.com/ws' SERVICE_WS_URL = 'wss://service.xdd618.com/ws'
wx.setEnableDebug({
enableDebug: false
})
} }
export const VUE_APP_API_URL = BASE_URL export const VUE_APP_API_URL = BASE_URL
@@ -26,7 +24,9 @@ export const SERVICE_API_URL = SERVICE_URL
export const SOCKET_URL = SERVICE_WS_URL export const SOCKET_URL = SERVICE_WS_URL
export const VUE_APP_RESOURCES_URL = "https://www.xdd618.com/api/file/pic"; export const VUE_APP_RESOURCES_URL = "https://wxapp.xdd618.com/api/file/pic"
export const STATIC_RESOURCE_URL = "https://resource.xdd618.com/image" export const STATIC_RESOURCE_URL = "https://resource.xdd618.com/image"
export const WX_LIVE_APPID = "wx2b03c6e691cd7370"; export const WX_LIVE_APPID = "wx2b03c6e691cd7370";
export const pageViewDataCacheKey = 'pageViewDataCacheKey'
+5
View File
@@ -0,0 +1,5 @@
import { getPageViewDataToLocalCache } from '@/utils/util'
export const pageToWatchData = Object.assign({
'appIndex': []
}, getPageViewDataToLocalCache())
+20 -15
View File
@@ -49,25 +49,30 @@ export function takeOrderHandle(orderId) {
export function delOrderHandle(orderId) { export function delOrderHandle(orderId) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
dialog.confirm({ uni.showModal({
mes: "确认删除该订单?", title: '提示',
opts() { content: '确认删除该订单?',
delOrder(orderId) success(res) {
.then(res => { if (res.confirm) {
delOrder(orderId).then(res => {
uni.showToast({ uni.showToast({
title: '删除成功', icon: 'success', duration: 2000 title: '删除成功',
}); icon: 'success',
resolve(res); duration: 2000
}) })
.catch(err => { resolve(res)
}).catch(err => {
uni.showToast({ uni.showToast({
title: '删除失败', icon: 'none', duration: 2000 title: '删除失败',
}); icon: 'none',
reject(err); duration: 2000
}); })
reject(err)
})
} }
}); }
}); })
})
} }
export function payOrderHandle(orderId, type, from) { export function payOrderHandle(orderId, type, from) {
+39 -20
View File
@@ -15,8 +15,11 @@ import {
WX_LIVE_APPID WX_LIVE_APPID
} from "@/config"; } from "@/config";
import uView from "uview-ui"; import uView from "uview-ui";
import GooSkeleton from '@/components/GooSkeleton/index.vue'
import { pageToWatchData } from '@/config/page'
Vue.use(uView); Vue.use(uView)
Vue.component('GooSkeleton', GooSkeleton)
Vue.mixin(mixin) Vue.mixin(mixin)
// 注册全局组件 // 注册全局组件
@@ -30,7 +33,8 @@ Vue.prototype.$VUE_APP_RESOURCES_URL = VUE_APP_RESOURCES_URL
Vue.prototype.$STATIC_RESOURCE_URL = STATIC_RESOURCE_URL Vue.prototype.$STATIC_RESOURCE_URL = STATIC_RESOURCE_URL
Vue.prototype.$VUE_APP_API_URL = VUE_APP_API_URL Vue.prototype.$VUE_APP_API_URL = VUE_APP_API_URL
Vue.prototype.$WX_LIVE_APPID = WX_LIVE_APPID Vue.prototype.$WX_LIVE_APPID = WX_LIVE_APPID
Vue.prototype.$global = global; Vue.prototype.$global = global
Vue.prototype.$pageToWatchData = pageToWatchData
Vue.prototype.$validator = function (rule) { Vue.prototype.$validator = function (rule) {
return new schema(rule); return new schema(rule);
@@ -42,31 +46,44 @@ Vue.prototype.$validator = function (rule) {
// cookie.clearAll(); // cookie.clearAll();
// cookie.set(CACHE_KEY, 1); // cookie.set(CACHE_KEY, 1);
// } // }
//强制转为几位小数,不足的补0 // 强制转为几位小数,不足的补0
var forceToDecimal = function changeToDecimal(x, len, ignore = false) { const forceToDecimal = function changeToDecimal(value, len = 1) {
var f_x = parseFloat(x); const f_x = parseFloat(value)
if (isNaN(f_x)) { if (isNaN(f_x)) {
return 0; return 0
} }
var f = Math.round(f_x * 100) / 100; let s = f_x.toString()
if (ignore) { let rs = s.indexOf('.')
f = Math.floor(f_x * 100) / 100;
}
var s = f.toString();
var rs = s.indexOf('.');
if (rs < 0) { if (rs < 0) {
rs = s.length; rs = s.length
s += '.'; s += '.'
} }
while (s.length <= rs + len) { while (s.length <= rs + len) {
s += '0'; s += '0'
} }
return s; const tempArr = s.split('.')
const decimalArr = tempArr[1].split('')
let res = tempArr[0] + '.'
for (let i = 0; i < len; i++) {
res += decimalArr[i]
}
return res
} }
//强制转为2位小数,不足的补0 // 强制转为2位小数,不足的补0
var force2Decimal = function change2Decimal(x, ignore = false) { const force2Decimal = function change2Decimal(value) {
return forceToDecimal(x, 2, false); return forceToDecimal(value, 2)
}
const toast = (title = '', position = 'center', success = function() {}) => {
uni.showToast({
title,
mask: false,
icon: 'none',
duration: 2500,
position,
success
})
} }
Vue.prototype.$force2Decimal = force2Decimal Vue.prototype.$force2Decimal = force2Decimal
@@ -75,7 +92,9 @@ Vue.prototype.$forceToDecimal = forceToDecimal
Vue.config.productionTip = false Vue.config.productionTip = false
App.mpType = 'app' App.mpType = 'app'
Vue.prototype.$store = store Vue.prototype.$store = store
Vue.prototype.$dialog = dialog; Vue.prototype.$dialog = dialog
Vue.prototype.$toast = toast
const app = new Vue(App) const app = new Vue(App)
+80
View File
@@ -0,0 +1,80 @@
import { queryUserGuide, setUserGuide } from '@/api/user'
export default {
data() {
return {
scrollView: '',
functionGuideData: {
step: 0,
tips: '',
tipsPosition: '',
btnGroupPosition: '',
position: {}
},
screenWidth: 0,
scrollLeft: 0,
totalWidth: 0,
scrollViewWidth: 0,
imgs: [],
_step: 0
}
},
onLoad() {
// this.setGuide('countyFamousIndex', 0)
// this.setGuide('landmarkGoodsIndex', 0)
// this.setGuide('findFunIndex', 0)
// this.setGuide('wellnessFoodIndex', 0)
// this.setGuide('ichIndex', 0)
// this.setGuide('wenwanIndex', 0)
// this.setGuide('goodsIndex', 0)
// this.setGuide('index', 0)
},
methods: {
setGuide(type, status = 1) {
const params = {
guideName: type,
guideStatus: status
}
setUserGuide(params).then(res => {
if(type === 'index') {
this.queryGuide(type)
}
})
},
queryGuide(type) {
const params = {
guideName: type
}
queryUserGuide(params).then(res => {
const { data, success } = res
if(success && data.guideStatus === 0) {
this.$refs.FunctionGuide.init()
}
if(type === 'index' && data.guideStatus === 1) {
this.isOldUser = true
}
if(type === 'index' && data.guideStatus === 0) {
this.isOldUser = false
}
})
},
setFunctionGuideData(data) {
this.functionGuideData = {
...this.functionGuideData,
...data
}
this.showFunctionGuide()
},
getElementData(el, cb) {
const query = uni.createSelectorQuery().in(this)
query.select(el).boundingClientRect().exec((res)=> {
console.log(res, 'getElementData');
if(res[0]) {
cb(res[0])
} else {
this.$refs.FunctionGuide.show = false
}
})
},
}
}
+385
View File
@@ -0,0 +1,385 @@
import {
getCartCount,
getProductCode,
getProductDetail,
postCartAdd,
getProductSkuBySelected
} from '@/api/store'
export default {
data() {
return {
isWenwan: 0,
qualifications: [],
source: '',
isOpen: false,
attrTxt: '',
attrValue: '',
id: null,
productValueArr: [],
attr: {
cartAttr: false,
cart_num: 1,
defaultSku: [],
defaultSkuIndex: [],
productAttr: [],
productSelect: {
cart_num: 1,
earnPoints: 0,
image: '',
otPrice: 0,
price: 0,
stock: 0,
store_name: '',
unique: ''
}
},
cart_num: 1
}
},
methods: {
getSkuActiveStatus(selectedSku) {
getProductSkuBySelected({ id: this.id, selectedSku }).then(res => {
const { success, data } = res
if (success) {
for (const key in data) {
if (data[key]) {
this.attr.productAttr.map(item => {
if (item.attrName === key) {
item.attrValue.map(subItem => {
data[key].map(dataItem => {
if (dataItem.sku === subItem.attr) {
subItem.canUsed = dataItem.canUsed
}
})
})
}
})
}
}
console.log(this.$refs);
this.$refs.attrWindow.reRender(this.attr)
}
})
},
productCon() {
getProductDetail(this.id).then(res => {
const { data } = res
this.storeInfo = {...data.storeInfo}
if(data.storeInfo.stock === 0) {
uni.showToast({
title: "产品库存不足,请选择其他商品",
icon: "none",
duration: 5000
})
return
}
this.isWenwan = data.isWenwan
this.qualifications = data.qualifications || []
// 给 attr 赋值,将请求回来的规格赋值给 attr
if (this.source !== 'pre' && this.source !== 'day' && this.source !== 'kill' && this.source !== 'spe') {
// this.$set(this.attr, 'productAttr', data.productAttr)
this.attr.productAttr = data.productAttr || []
this.productValueArr = []
for (const key in data.productValue) {
this.productValueArr.push({
attrItemkey: key,
...data.productValue[key]
})
}
// 初始化认为所有的规格都是可以选的
this.attr.productAttr.map(item => {
item.attrValue.map(subItem => {
subItem.canUsed = true
})
})
}
this.attr.defaultSku = data.defaultSku
this.attr.defaultSkuIndex = data.defaultSkuIndex
this.DefaultSelect()
// 是否单一规格
const onlyOne = Object.keys(data.productValue).length === 1
if(onlyOne) {
this.handleOk()
return
}
this.attr.cartAttr = !this.isOpen ? true : false
})
},
getAttrItemData(attr) {
let result = {}
this.productValueArr.map(item => {
if (item.attrItemkey === attr) {
result = item
}
})
return result
},
// 默认选中属性
DefaultSelect() {
const productAttr = this.attr.productAttr
const productAttrLength = productAttr.length
this.attr.productAttr.map((item, index) => {
item.attrValue.map((subItem, subIndex) => {
if (this.attr.defaultSkuIndex[index] === subIndex) {
subItem.check = true
} else {
subItem.check = false
}
})
})
const skuKey = (this.attr.defaultSku || []).join(',')
if (!skuKey) {
return
}
const productSelect = this.getAttrItemData(skuKey)
this.attrValue = skuKey
this.attrTxt = '已选择'
if (productSelect && productAttrLength) {
// this.$set(
// this.attr.productSelect,
// 'store_name',
// this.storeInfo.storeName
// )
// this.$set(this.attr.productSelect, 'image', productSelect.image)
// this.$set(this.attr.productSelect, 'price', productSelect.price)
// this.$set(this.attr.productSelect, 'otPrice', productSelect.otPrice)
// this.$set(this.attr.productSelect, 'stock', productSelect.stock)
// this.$set(this.attr.productSelect, 'unique', productSelect.unique)
// this.$set(this.attr.productSelect, 'earnPoints', productSelect.earnPoints)
// this.$set(this.attr.productSelect, 'cart_num', 1)
// this.$set(this, 'attrValue', value.sort().join(',')) // 作废
// this.$set(this, 'attrValue', skuKey)
// this.$set(this, 'attrTxt', '已选择')
this.attr.productSelect = {
image: productSelect.image,
price: productSelect.price,
otPrice: productSelect.otPrice,
stock: productSelect.stock,
earnPoints: productSelect.earnPoints,
unique: productSelect.unique,
store_name: this.storeInfo.storeName,
cart_num: 1
}
this.getSkuActiveStatus(skuKey)
} else if (!productSelect && productAttrLength) {
// this.$set(
// this.attr.productSelect,
// 'store_name',
// this.storeInfo.storeName
// )
// this.$set(this.attr.productSelect, 'image', this.storeInfo.image)
// this.$set(this.attr.productSelect, 'price', this.storeInfo.price)
// this.$set(this.attr.productSelect, 'otPrice', this.storeInfo.otPrice)
// this.$set(this.attr.productSelect, 'stock', 0)
// this.$set(this.attr.productSelect, 'earnPoints', 0)
// this.$set(this.attr.productSelect, 'unique', '')
// this.$set(this.attr.productSelect, 'cart_num', 0)
// this.$set(this, 'attrValue', '')
// this.$set(this, 'attrTxt', '请选择')
this.attr.productSelect = {
image: this.storeInfo.image,
price: this.storeInfo.price,
otPrice: this.storeInfo.otPrice,
stock: 0,
earnPoints: 0,
unique: '',
store_name: this.storeInfo.storeName,
cart_num: 1
}
} else if (!productSelect && !productAttrLength) {
// this.$set(
// this.attr.productSelect,
// 'store_name',
// this.storeInfo.storeName
// )
// this.$set(this.attr.productSelect, 'image', this.storeInfo.image)
// this.$set(this.attr.productSelect, 'price', this.storeInfo.price)
// this.$set(this.attr.productSelect, 'otPrice', this.storeInfo.otPrice)
// this.$set(this.attr.productSelect, 'stock', this.storeInfo.stock)
// this.$set(this.attr.productSelect, 'earnPoints', 0)
// this.$set(
// this.attr.productSelect,
// 'unique',
// this.storeInfo.unique || ''
// )
// this.$set(this.attr.productSelect, 'cart_num', 1)
this.attr.productSelect = {
image: this.storeInfo.image,
price: this.storeInfo.price,
otPrice: this.storeInfo.otPrice,
stock: this.storeInfo.stock,
earnPoints: 0,
unique: this.storeInfo.unique || '',
store_name: this.storeInfo.storeName,
cart_num: 1
}
// this.$set(this, 'attrValue', '')
// this.$set(this, 'attrTxt', '请选择')
}
},
// 点击加入购物车按钮
addToCart(item, id = 'id') {
console.log(item, 'addToCart --------- item');
this.id = item[id]
this.$nextTick(() => {
this.productCon()
})// if(this.attr.cartAttr && !this.isOpen){
// return this.isOpen = true
// }
console.log(this.$refs.attrWindow, '--222--');
},
handleOk() {
const productSelect = this.getAttrItemData(this.attrValue)
// 如果有属性,没有选择,提示用户选择
const hasNo = (this.attr.productAttr.length && productSelect === undefined && this.isOpen) || productSelect.stock === 0
if (hasNo) {
uni.showToast({
title: "产品库存不足,请选择其他商品",
icon: "none",
duration: 5000
})
return
}
const q = {
productId: this.id,
cartNum: this.attr.productSelect.cart_num,
new: 0,
uniqueId: this.attr.productSelect !== undefined ? this.attr.productSelect.unique : ''
}
postCartAdd(q).then(res => {
this.isOpen = false
this.attr.cartAttr = false
this.$set(this.attr.productSelect, 'cart_num', 1)
this.cart_num = 1
uni.showToast({
title: "添加购物车成功",
icon: "none",
duration: 2000
})
})
},
ChangeCartNum(changeValue) {
// changeValue:是否 加|减
// 获取当前变动属性
const productSelect = this.getAttrItemData(this.attrValue)
// 如果没有属性,赋值给商品默认库存
if (productSelect === undefined && !this.attr.productAttr.length) {
productSelect = this.attr.productSelect
}
// 无属性值即库存为0;不存在加减
if (productSelect === undefined) return
let stock = productSelect.stock || 0
let num = this.attr.productSelect
if (changeValue) {
if(changeValue > 1) {
num.cart_num = changeValue
} else {
num.cart_num++
}
if (num.cart_num > stock) {
if(stock < 1) {
this.$set(this.attr.productSelect, 'cart_num', 1)
this.$set(this, 'cart_num', 1)
} else {
this.$set(this.attr.productSelect, 'cart_num', stock)
this.$set(this, 'cart_num', stock)
}
} else {
if (num.cart_num < 1) {
this.$set(this.attr.productSelect, 'cart_num', 1)
this.$set(this, 'cart_num', 1)
} else {
this.$set(this.attr.productSelect, 'cart_num', num.cart_num)
// this.$set(this, 'cart_num', num.cart_num)
}
}
} else {
num.cart_num--
if (num.cart_num < 1) {
this.$set(this.attr.productSelect, 'cart_num', 1)
this.$set(this, 'cart_num', 1)
} else {
this.$set(this.attr.productSelect, 'cart_num', num.cart_num)
this.$set(this, 'cart_num', num.cart_num)
}
}
},
// 关闭属性
changeattr(msg) {
// 修改了规格
this.attr.cartAttr = msg
this.$set(this.attr.productSelect, 'cart_num', 1)
this.$forceUpdate()
this.isOpen = false
},
// 打开属性插件
selecAttrTap() {
this.$set(this.attr.productSelect, 'cart_num', 1)
this.attr.cartAttr = true
this.isOpen = true
this.$forceUpdate()
},
ChangeAttr(res) {
const { index, subIndex, value } = res
// 修改了规格
const productSelect = this.getAttrItemData(value)
if (productSelect) {
this.attr.productAttr[index].attrValue.map((subItem, subIdx) => {
subItem.check= false
if (subIndex === subIdx) {
subItem.check = true
}
})
this.$set(this.attr.productSelect, 'image', productSelect.image)
this.$set(this.attr.productSelect, 'price', productSelect.price)
this.$set(this.attr.productSelect, 'otPrice', productSelect.otPrice)
this.$set(this.attr.productSelect, 'stock', productSelect.stock)
this.$set(this.attr.productSelect, 'unique', productSelect.unique)
this.$set(this.attr.productSelect, 'earnPoints', productSelect.earnPoints)
this.$set(this.attr.productSelect, 'cart_num', 1)
this.$set(this, 'attrValue', value)
this.$set(this, 'attrTxt', '已选择')
this.getSkuActiveStatus(value)
} else {
this.$set(this.attr.productSelect, 'image', this.storeInfo.image)
this.$set(this.attr.productSelect, 'price', this.storeInfo.price)
this.$set(this.attr.productSelect, 'otPrice', this.storeInfo.otPrice)
this.$set(this.attr.productSelect, 'stock', 0)
this.$set(this.attr.productSelect, 'unique', '')
this.$set(this.attr.productSelect, 'earnPoints', 0)
this.$set(this.attr.productSelect, 'cart_num', 0)
this.$set(this, 'attrValue', '')
this.$set(this, 'attrTxt', '请选择')
}
},
changeFun(opt) {
if (typeof opt !== 'object') opt = {}
let action = opt.action || ''
let value = opt.value === undefined ? '' : opt.value
this.cart_num = 1
this[action] && this[action](value)
},
// queryCartCount (isAnima) {
// const isLogin = this.isLogin
// if (isLogin) {
// getCartCount({
// numType: 0
// }).then(res => {
// this.CartCount = res.data.count
// //加入购物车后重置属性
// if (isAnima) {
// this.animated = true
// setTimeout(function () {
// this.animated = false
// }, 500)
// }
// })
// }
// },
}
}
+38
View File
@@ -0,0 +1,38 @@
import {
pageToWatchShowCount,
pageToWatchShowTimer,
getCurrDateTime,
TimeDifference
} from '@/utils/util'
export const pageListenMixins = {
data(){
return {
pageViewDateTime: ''
}
},
onShow() {
this.pageViewDateTime = getCurrDateTime()
this.pageToWatchShowCount(this.pageKeyId)
this.videoContext = uni.createVideoContext('indexVideo', this);
},
onUnload() {
this.pageToHideHandle()
},
methods: {
pageToWatchShowCount,
pageToWatchShowTimer,
pageToHideHandle() {
const visitTime = TimeDifference(this.pageViewDateTime, getCurrDateTime())
if (visitTime > 0) {
this.pageToWatchShowTimer(this.pageKeyId, {
statsName: this.pageKeyId,
statsTime: this.pageViewDateTime,
visitTime
})
}
this.pageViewDateTime = ''
console.log('清除页面监听-----%s', this.pageKeyId)
}
}
}
+17700
View File
File diff suppressed because it is too large Load Diff
+215 -121
View File
@@ -39,7 +39,20 @@
{ {
"path": "pages/home/landMark", "path": "pages/home/landMark",
"style": { "style": {
"navigationBarTitleText": "地标好物" "navigationBarTitleText": "地标好物"
}
},
{
"path": "pages/home/searchPage",
"style": {
"navigationBarTitleText": "搜索"
}
},
{
"path": "pages/home/newZone",
"style": {
"navigationBarTitleText": "新品专区",
"navigationBarBackgroundColor": "#FFFFFF"
} }
}, },
{ {
@@ -58,7 +71,7 @@
{ {
"path": "pages/shop/GoodSearch/index", "path": "pages/shop/GoodSearch/index",
"style": { "style": {
"navigationBarTitleText": "搜索商品" "navigationBarTitleText": "搜索"
} }
}, },
{ {
@@ -78,7 +91,7 @@
{ {
"path": "pages/shop/GoodsList/index", "path": "pages/shop/GoodsList/index",
"style": { "style": {
"navigationBarTitleText": "商品列表" "navigationBarTitleText": "搜索"
} }
}, },
{ {
@@ -90,7 +103,15 @@
{ {
"path": "pages/cloud/haveFun", "path": "pages/cloud/haveFun",
"style": { "style": {
"navigationBarTitleText": "寻趣味" "navigationBarTitleText": "趣游生活"
}
},
{
"path": "pages/town/index",
"style": {
"navigationBarTextStyle": "white",
"navigationStyle": "custom",
"navigationBarTitleText": "趣游生活"
} }
}, },
{ {
@@ -139,6 +160,13 @@
"navigationBarTextStyle": "white" "navigationBarTextStyle": "white"
} }
}, },
{
"path": "pages/shop/GoodsCon/qualifications",
"style": {
"navigationBarTitleText": "商家资质",
"navigationBarTextStyle": "black"
}
},
{ {
"path": "pages/user/address/AddAddress/index", "path": "pages/user/address/AddAddress/index",
"style": { "style": {
@@ -201,6 +229,14 @@
"navigationBarBackgroundColor": "#FFFFFF" "navigationBarBackgroundColor": "#FFFFFF"
} }
}, },
{
"path": "pages/user/History/index",
"style": {
"navigationBarTitleText": "商品足迹",
"navigationBarBackgroundColor": "#FFFFFF",
"enablePullDownRefresh": false
}
},
{ {
"path": "pages/user/UserBill/index", "path": "pages/user/UserBill/index",
"style": { "style": {
@@ -287,96 +323,6 @@
"navigationBarTitleText": "退货列表" "navigationBarTitleText": "退货列表"
} }
}, },
{
"path": "pages/orderAdmin/OrderIndex/index",
"style": {
"navigationBarTitleText": "商家订单统计"
}
},
{
"path": "pages/orderAdmin/AdminOrderList/index",
"style": {
"navigationBarTitleText": "订单"
}
},
{
"path": "pages/orderAdmin/GoodsDeliver/index",
"style": {
"navigationBarTitleText": "发货"
}
},
{
"path": "pages/orderAdmin/AdminOrder/index",
"style": {
"navigationBarTitleText": "商家订单列表"
}
},
{
"path": "pages/orderAdmin/Statistics/index",
"style": {
"navigationBarTitleText": "商家统计数据"
}
},
{
"path": "pages/orderAdmin/OrderCancellation/index",
"style": {
"navigationBarTitleText": "商家取消订单"
}
},
{
"path": "pages/activity/Poster/index",
"style": {
"navigationBarTitleText": "推广海报"
}
},
{
"path": "pages/activity/DargainDetails/index",
"style": {
"navigationBarTitleText": "帮砍价"
}
},
{
"path": "pages/activity/GoodsBargain/index",
"style": {
"navigationBarTitleText": "砍价列表"
}
},
{
"path": "pages/activity/BargainRecord/index",
"style": {
"navigationBarTitleText": "砍价记录"
}
},
{
"path": "pages/activity/GoodsGroup/index",
"style": {
"navigationBarTitleText": "团购商品列表"
}
},
{
"path": "pages/activity/GroupDetails/index",
"style": {
"navigationBarTitleText": "团购商品详情"
}
},
{
"path": "pages/activity/GroupRule/index",
"style": {
"navigationBarTitleText": "团购规则"
}
},
{
"path": "pages/activity/GoodsSeckill/index",
"style": {
"navigationBarTitleText": "秒杀"
}
},
{
"path": "pages/activity/SeckillDetails/index",
"style": {
"navigationBarTitleText": "秒杀详情"
}
},
{ {
"path": "pages/map/index", "path": "pages/map/index",
"style": { "style": {
@@ -448,6 +394,12 @@
"style": { "style": {
"navigationBarTitleText": "我的喜欢" "navigationBarTitleText": "我的喜欢"
} }
},
{
"path": "pages/user/Points/index",
"style": {
"navigationBarTitleText": "积分"
}
} }
], ],
"subPackages": [ "subPackages": [
@@ -461,6 +413,13 @@
"navigationStyle": "custom" "navigationStyle": "custom"
} }
}, },
{
"path": "inn/farmerStore",
"style": {
"navigationBarTitleText": "",
"navigationStyle": "custom"
}
},
{ {
"path": "inn/innGoodList", "path": "inn/innGoodList",
"style": { "style": {
@@ -609,13 +568,56 @@
{ {
"path": "views/healthList", "path": "views/healthList",
"style": { "style": {
"navigationBarTitleText": "康养 · 食材" "navigationBarTitleText": "选择城市",
"navigationBarBackgroundColor": "#FFFFFF"
}
},
{
"path": "views/expoList",
"style": {
"navigationBarTitleText": "康养旅居",
"navigationBarBackgroundColor": "#FFFFFF"
}
},
{
"path": "views/expoDetails",
"style": {
"navigationBarTitleText": "文化艺术",
"navigationBarBackgroundColor": "#FFFFFF"
}
},
{
"path": "views/healthSanctum",
"style": {
"navigationBarTitleText": "康养旅居",
"navigationBarBackgroundColor": "#FFFFFF"
}
},
{
"path": "views/healthFoods",
"style": {
"navigationBarTitleText": "康养旅居",
"navigationBarBackgroundColor": "#FAEED8"
}
},
{
"path": "views/healthFoodDetails",
"style": {
"navigationBarTitleText": "康养旅居",
"navigationBarBackgroundColor": "#FFFFFF"
}
},
{
"path": "views/healthSearch",
"style": {
"navigationBarTitleText": "搜索",
"navigationBarBackgroundColor": "#FFFFFF"
} }
}, },
{ {
"path": "views/heritage", "path": "views/heritage",
"style": { "style": {
"navigationBarTitleText": "非遗文" "navigationBarTitleText": "非遗文"
} }
}, },
{ {
@@ -624,12 +626,32 @@
"navigationBarTitleText": "" "navigationBarTitleText": ""
} }
}, },
{
"path": "views/heritage/index",
"style": {
"navigationBarTitleText": "非遗文创",
"navigationBarBackgroundColor": "#FAEED8"
}
},
{
"path": "views/heritage/details",
"style": {
"navigationBarTitleText": "非遗文创",
"navigationBarBackgroundColor": "#FAEED8"
}
},
{ {
"path": "views/heritageVideo", "path": "views/heritageVideo",
"style": { "style": {
"navigationBarTitleText": "" "navigationBarTitleText": ""
} }
}, },
{
"path": "views/heritageGoodAndVideo",
"style": {
"navigationBarTitleText": ""
}
},
{ {
"path": "views/homestay", "path": "views/homestay",
"style": { "style": {
@@ -652,7 +674,47 @@
{ {
"path": "views/famousList", "path": "views/famousList",
"style": { "style": {
"navigationBarTitleText": "千县名品" "navigationBarTitleText": "千县万村"
}
},
{
"path": "views/famousQianxian",
"style": {
"navigationBarTitleText": "寻千县万村"
}
},
{
"path": "views/famousQianxianShop",
"style": {
"navigationBarTitleText": "寻千县万村",
"navigationStyle": "custom"
}
},
{
"path": "views/famousQianxianTheme",
"style": {
"navigationBarTitleText": "寻千县万村",
"navigationStyle": "custom"
}
},
{
"path": "views/famousQianxianVillageShop",
"style": {
"navigationBarTitleText": "寻千县万村",
"navigationStyle": "custom"
}
},
{
"path": "views/sojoumStore",
"style": {
"navigationBarTitleText": "",
"navigationStyle": "custom"
}
},
{
"path": "views/famousQianxianInvestment",
"style": {
"navigationBarTitleText": "招商政策"
} }
}, },
{ {
@@ -689,8 +751,8 @@
"path": "views/nativeList", "path": "views/nativeList",
"style": { "style": {
"navigationBarTitleText": "特产", "navigationBarTitleText": "特产",
"navigationBarTextStyle": "white", "navigationBarTextStyle": "black",
"navigationBarBackgroundColor": "#FF564A" "navigationBarBackgroundColor": "#fff"
} }
}, },
{ {
@@ -710,6 +772,24 @@
{ {
"root": "pkg_user", "root": "pkg_user",
"pages": [ "pages": [
{
"path": "views/giftList",
"style": {
"navigationBarTitleText": "我的礼品卡"
}
},
{
"path": "views/gift/gift",
"style": {
"navigationBarTitleText": "送礼包"
}
},
{
"path": "views/gift/receive",
"style": {
"navigationBarTitleText": "好友赠送的礼包"
}
},
{ {
"path": "views/myFavorite", "path": "views/myFavorite",
"style": { "style": {
@@ -769,6 +849,27 @@
} }
] ]
}, },
{
"root": "aiChat",
"pages": [
{
"path": "views/index",
"style": {
"navigationBarTitleText": "云灵AI智能助手",
"navigationStyle": "custom",
"navigationBarTextStyle": "white"
}
},
{
"path": "views/history",
"style": {
"navigationBarTitleText": "云灵AI智能助手",
"navigationStyle": "custom",
"navigationBarTextStyle": "white"
}
}
]
},
{ {
"root": "v4", "root": "v4",
"pages": [ "pages": [
@@ -856,14 +957,6 @@
"navigationBarTitleText": "文玩" "navigationBarTitleText": "文玩"
} }
}, },
{
"path": "views/store",
"style": {
"navigationBarTitleText": "文玩店铺详情",
"navigationStyle": "custom",
"navigationBarTextStyle": "white"
}
},
{ {
"path": "views/storeList", "path": "views/storeList",
"style": { "style": {
@@ -883,38 +976,39 @@
}, },
"globalStyle": { "globalStyle": {
"navigationBarTextStyle": "black", "navigationBarTextStyle": "black",
"navigationBarTitleText": "uni-app", "navigationBarTitleText": "地标文化特产",
"navigationBarBackgroundColor": "#F8F8F8", "navigationBarBackgroundColor": "#F8F8F8",
"backgroundColor": "#F8F8F8" "backgroundColor": "#F8F8F8"
}, },
"tabBar": { "tabBar": {
"color": "#8B8F99", "color": "#8B8F99",
"custom": true,
"selectedColor": "#FF564A", "selectedColor": "#FF564A",
"borderStyle": "black", "borderStyle": "black",
"backgroundColor": "#ffffff", "backgroundColor": "#ffffff",
"list": [ "list": [
{ {
"pagePath": "pages/home/index", "pagePath": "pages/home/index",
"iconPath": "static/tabbar/icon-home.png", "iconPath": "/static/images/tabbar/tabbar-01-on.png",
"selectedIconPath": "static/tabbar/icon-home-hot.png", "selectedIconPath": "/static/images/tabbar/tabbar-01-on.png",
"text": "首页" "text": "首页"
}, },
{ {
"pagePath": "pages/home/landMark", "pagePath": "pages/cloud/haveFun",
"iconPath": "static/tabbar/icon-land.png", "iconPath": "/static/images/tabbar/tabbar-01-on.png",
"selectedIconPath": "static/tabbar/icon-land-hot.png", "selectedIconPath": "/static/images/tabbar/tabbar-01-on.png",
"text": "地标好物" "text": "寻趣味"
}, },
{ {
"pagePath": "pages/cart", "pagePath": "pages/cart",
"iconPath": "static/tabbar/icon-cart.png", "iconPath": "/static/images/tabbar/tabbar-01-on.png",
"selectedIconPath": "static/tabbar/icon-cart-hot.png", "selectedIconPath": "/static/images/tabbar/tabbar-01-on.png",
"text": "购物车" "text": "购物车"
}, },
{ {
"pagePath": "pages/user/User/index", "pagePath": "pages/user/User/index",
"iconPath": "static/tabbar/icon-user.png", "iconPath": "/static/images/tabbar/tabbar-01-on.png",
"selectedIconPath": "static/tabbar/icon-user-hot.png", "selectedIconPath": "/static/images/tabbar/tabbar-01-on.png",
"text": "我的" "text": "我的"
} }
] ]
@@ -925,7 +1019,7 @@
{ {
"name": "商品详情", "name": "商品详情",
"path": "pages/shop/GoodsCon/index", "path": "pages/shop/GoodsCon/index",
"query": "id=277" "query": "id=588"
}, },
{ {
"name": "店铺详情", "name": "店铺详情",
@@ -963,8 +1057,8 @@
"query": "" "query": ""
}, },
{ {
"name": "特色礼品", "name": "搜索",
"path": "pkg_product/views/giftList", "path": "pages/shop/GoodsList/index",
"query": "" "query": ""
} }
] ]
@@ -130,7 +130,7 @@ export default {
// this.videoContext = uni.createVideoContext('myVideo'); // this.videoContext = uni.createVideoContext('myVideo');
// this.videoContext.requestFullScreen(); // this.videoContext.requestFullScreen();
this.$yrouter.push('/pages/VideoPlayBackList/VideoPlayBackDetail?videoUrl='+video.video); this.$yrouter.push('/pages/VideoPlayBackList/VideoPlayBackDetail?videoUrl='+video.video + '&id=' + video.id);
}, },
liveClick:function(video){ liveClick:function(video){
var liveAppId = this.$WX_LIVE_APPID; var liveAppId = this.$WX_LIVE_APPID;
@@ -4,27 +4,32 @@
</view> </view>
</template> </template>
<script> <script>
import uniPopup from '@/components/uni-popup/uni-popup.vue'; import uniPopup from '@/components/uni-popup/uni-popup.vue'
import { pageListenMixins } from '@/mixins/pageListenMixins'
export default { export default {
components:{ components:{
uniPopup uniPopup
}, },
mixins: [pageListenMixins],
data() { data() {
return { return {
curPlayVideoUrl:'', curPlayVideoUrl:'',
isVideoPopupShow:false isVideoPopupShow:false,
pageKeyId: ''
} }
}, },
onReady: function(res) { onReady(res) {
this.videoContext = uni.createVideoContext('myVideo'); this.videoContext = uni.createVideoContext('myVideo');
this.videoContext.requestFullScreen(); this.videoContext.requestFullScreen();
}, },
onLoad:function(e){ onLoad(options) {
if (!options.click) {
this.curPlayVideoUrl = e.videoUrl; uni.switchTab({ url: '/pages/home/index' })
//this.$refs.popup.open(); return
}
this.curPlayVideoUrl = options.videoUrl
const id = options.id
this.pageKeyId = `findVideo_videoId_${id}`
}, },
methods: { methods: {
videoErrorCallback: function(e) { videoErrorCallback: function(e) {
+32 -30
View File
@@ -32,71 +32,73 @@
</template> </template>
<script> <script>
import {getStoreVideoType, getArticleList} from "@/api/public"; import {getStoreVideoType, getArticleList} from '@/api/public'
import {getVideoList} from "@/api/user"; import {getVideoList} from '@/api/user'
import { pageListenMixins } from '@/mixins/pageListenMixins'
export default { export default {
mixins: [pageListenMixins],
data() { data() {
return { return {
webUrl: this.$VUE_APP_RESOURCES_URL, webUrl: this.$VUE_APP_RESOURCES_URL,
typeList: [{"label": "全部", "value": ""}], typeList: [{'label': '全部', 'value': ''}],
type: "", type: '',
page: 1, page: 1,
limit: 10, limit: 10,
keyword: "", keyword: '',
list: [], list: [],
isWait: false isWait: false,
pageKeyId: Object.freeze('findVideoList')
} }
}, },
onLoad() { onLoad(options) {
this.getType(); if (!options.click) {
this.fetchList(); uni.switchTab({ url: '/pages/home/index' })
return
}
this.getType()
this.fetchList()
}, },
onReachBottom() { onReachBottom() {
this.page++; this.page++
this.fetchList(); this.fetchList()
}, },
methods: { methods: {
getType() { getType() {
getStoreVideoType().then(({data}) => { getStoreVideoType().then(({data}) => {
if (data.length > 0) { if (data.length > 0) {
data.forEach(item => { data.forEach(item => {
this.typeList.push(item); this.typeList.push(item)
}) })
} }
}); })
}, },
changeType(item) { changeType(item) {
this.type = item.value; this.type = item.value
this.page = 1; this.page = 1
this.list = []; this.list = []
this.fetchList(); this.fetchList()
}, },
fetchList() { fetchList() {
if (this.isWait) return; if (this.isWait) return
this.isWait = true; this.isWait = true
const params = {
let params = {
type: this.type, type: this.type,
page: this.page, page: this.page,
limit: this.limit limit: this.limit
}; }
getVideoList(params).then(res => { getVideoList(params).then(res => {
if (res.status === 200) { if (res.status === 200) {
for (let i = 0; i < res.data.length; i++) { for (let i = 0; i < res.data.length; i++) {
res.data[i].hide = true; res.data[i].hide = true
this.list.push(res.data[i]) this.list.push(res.data[i])
} }
} }
this.isWait = false; this.isWait = false
}); })
}, },
goDetail(item) { goDetail(item) {
this.$yrouter.push("/pages/VideoPlayBackList/VideoPlayBackDetail?videoUrl=" + item.video); this.$yrouter.push("/pages/VideoPlayBackList/VideoPlayBackDetail?videoUrl=" + item.video + '&id=' + item.id + '&click=1')
} }
} }
} }
-131
View File
@@ -1,131 +0,0 @@
<template>
<view class="bargain-record" ref="container">
<view class="item" v-for="(item, bargainrecordIndex) in bargain" :key="bargainrecordIndex">
<view class="picTxt acea-row row-between-wrapper">
<view class="pictrue">
<image :src="item.image" />
</view>
<view class="text acea-row row-column-around">
<view class="line1">{{ item.title }}</view>
<count-down
:isDay="true"
:tipText="'倒计时 '"
:dayText="' 天 '"
:hourText="' 时 '"
:minuteText="' 分 '"
:secondText="' 秒'"
:datatime="item.datatime"
></count-down>
<view class="money font-color-red">
已砍至
<text class="symbol"></text>
<text class="num">{{ item.residuePrice }}</text>
</view>
</view>
</view>
<view class="bottom acea-row row-between-wrapper">
<view class="purple" v-if="item.status === 1">活动进行中</view>
<view class="success" v-else-if="item.status === 3">砍价成功</view>
<view class="end" v-else>活动已结束</view>
<view class="acea-row row-middle row-right">
<view
class="bnt cancel"
v-if="item.status === 1"
@click="getBargainUserCancel(item.bargainId)"
>取消活动</view>
<view
class="bnt bg-color-red"
v-if="item.status === 1"
@click="goDetail(item.bargainId)"
>继续砍价</view>
<view class="bnt bg-color-red" v-else @click="goList">重开一个</view>
</view>
</view>
</view>
<Loading :loaded="status" :loading="loadingList"></Loading>
</view>
</template>
<script>
import CountDown from "@/components/CountDown";
import { getBargainUserList, getBargainUserCancel } from "@/api/activity";
import Loading from "@/components/Loading";
export default {
name: "BargainRecord",
components: {
CountDown,
Loading
},
props: {},
data: function() {
return {
bargain: [],
status: false, //砍价列表是否获取完成 false 未完成 true 完成
loadingList: false, //当前接口是否请求完成 false 完成 true 未完成
page: 1, //页码
limit: 20 //数量
};
},
mounted: function() {
this.getBargainUserList();
},
onReachBottom() {
!this.loadingList && this.getBargainUserList();
},
methods: {
goDetail: function(id) {
this.$yrouter.push({
path: "/pages/activity/DargainDetails/index",
query: { id, partake: 0 }
});
},
goList: function() {
this.$yrouter.push({
path: "/pages/activity/GoodsBargain/index"
});
},
getBargainUserList: function() {
var that = this;
if (that.loadingList) return;
if (that.status) return;
getBargainUserList({ page: that.page, limit: that.limit })
.then(res => {
that.status = res.data.length < that.limit;
that.bargain.push.apply(that.bargain, res.data);
that.page++;
that.loadingList = false;
})
.catch(res => {
uni.showToast({
title: res.msg,
icon: "none",
duration: 2000
});
});
},
getBargainUserCancel: function(bargainId) {
var that = this;
getBargainUserCancel({ bargainId: bargainId })
.then(res => {
uni.showToast({
title: res.msg,
icon: "success",
duration: 2000
});
that.status = false;
that.loadingList = false;
that.page = 1;
that.bargain = [];
that.getBargainUserList();
})
.catch(res => {
uni.showToast({
title: res.msg,
icon: "none",
duration: 2000
});
});
}
}
};
</script>
-617
View File
@@ -1,617 +0,0 @@
<template>
<view class="bargain">
<!-- 在header上加 on 为请求支援 -->
<view :class="[bargainPartake != userInfo.uid ? 'header on' : 'header']">
<view class="people">{{ lookCount }}人查看 {{ shareCount }}人分享 {{ userCount }}人参与</view>
<!-- 帮助砍价帮砍成功-->
<view class="pictxt acea-row row-center-wrapper" v-if="bargainPartake != userInfo.uid">
<view class="pictrue">
<image :src="bargainUserInfo.avatar" />
</view>
<view class="text">
{{ bargainUserInfo.nickname }}
<text>邀请您帮忙砍价</text>
</view>
</view>
<count-down
:isDay="true"
:tipText="'倒计时 '"
:dayText="' 天 '"
:hourText="' 时 '"
:minuteText="' 分 '"
:secondText="' 秒'"
:datatime="datatime"
></count-down>
</view>
<view class="wrapper">
<view class="pictxt acea-row row-between-wrapper" @click="openAlone">
<view class="pictrue">
<image :src="bargain.image" />
<view class="bargain_view">
查看商品
<view class="iconfont icon-jiantou iconfonts"></view>
</view>
</view>
<view class="text acea-row row-column-around">
<view class="line2" v-text="bargain.title"></view>
<view class="money font-color-red">
已砍至:
<text class="num" v-text="price"></text>
</view>
<view class="acea-row row-middle">
<view class="successNum" v-text="'原价' + bargain.price"></view>
<view class="successNum" v-text="'已有' + bargainSumCount + '人砍价成功'"></view>
</view>
</view>
</view>
<view class="cu-progress acea-row row-middle round margin-top">
<view
class="acea-row row-middle bg-red"
:style="{ width: loading ? pricePercent + '%' : '' }"
></view>
</view>
<view class="balance acea-row row-between-wrapper">
<view v-text="'已砍' + alreadyPrice + '元'"></view>
<view v-if="surplusPrice === 0">砍价成功</view>
<view v-else v-text="'还剩' + surplusPrice + '元'"></view>
</view>
<!-- 帮助砍价帮砍成功-->
<view
class="bargainSuccess"
v-if="bargainPartake != userInfo.uid && !statusUser && !helpListLoading"
>
<span class="iconfont icon-xiaolian"></span>已成功帮助好友砍价
</view>
<!-- 砍价成功-->
<view
class="bargainSuccess"
v-if="
surplusPrice === 0 &&
bargainPartake === userInfo.uid &&
userBargainStatus === 1 &&
!helpListLoading
"
>
<span class="iconfont icon-xiaolian"></span>恭喜您砍价成功,快去支付吧~
</view>
<view
v-if="userBargainStatus == 0 && bargainPartake === userInfo.uid"
class="bargainBnt"
@click="goParticipate"
>立即参与砍价</view>
<view
class="bargainBnt"
@click="goPoster"
v-if="
surplusPrice > 0 &&
bargainPartake === userInfo.uid &&
userBargainStatus === 1 &&
!helpListLoading
"
>邀请好友帮砍价</view>
<view
class="bargainBnt"
@click="getBargainHelp"
v-else-if="
bargainPartake != userInfo.uid &&
userBargainStatus == 1 &&
statusUser &&
!helpListLoading
"
>帮好友砍一刀</view>
<view
class="bargainBnt"
@click="getBargainStart"
v-if="bargainPartake != userInfo.uid && !statusUser && !helpListLoading"
>我也要参与</view>
<view
class="bargainBnt"
@click="goPay"
v-if="
surplusPrice === 0 &&
bargainPartake === userInfo.uid &&
userBargainStatus === 1
"
>立即支付</view>
<view class="bargainBnt on" @click="goList">抢更多商品</view>
<view class="tip">
已有
<span class="font-color-red" v-text="helpCount"></span>
位好友成功帮您砍价
</view>
<view class="lock"></view>
</view>
<view class="bargainGang">
<view class="title font-color-red acea-row row-center-wrapper">
<view class="pictrue">
<image :src="webUrl+'/20230304134450627525.png'" />
</view>
<view class="titleCon">砍价帮</view>
<view class="pictrue on">
<image :src="webUrl+'/20230304134450627525.png'" />
</view>
</view>
<view class="list">
<view
class="item acea-row row-between-wrapper"
v-for="(item, bargainHelpListIndex) in bargainHelpList"
:key="bargainHelpListIndex"
>
<view class="pictxt acea-row row-between-wrapper">
<view class="pictrue">
<image :src="item.avatar" />
</view>
<view class="text">
<view class="name line1" v-text="item.nickname"></view>
<view class="line1" v-text="item.add_time"></view>
</view>
</view>
<view class="money font-color-red">
<text class="iconfont icon-kanjia"></text>
砍掉{{ item.price }}元
</view>
</view>
</view>
<view
class="load font-color-red"
v-if="!helpListStatus && !helpListLoading"
@click="getBargainHelpList"
>点击加载更多</view>
<view class="lock"></view>
</view>
<view class="goodsDetails">
<view class="title font-color-red acea-row row-center-wrapper">
<view class="pictrue">
<image :src="webUrl+'/20230304134450627525.png'" />
</view>
<view class="titleCon">商品详情</view>
<view class="pictrue on">
<image :src="webUrl+'/20230304134450627525.png'" />
</view>
</view>
<view class="conter" v-html="bargain.description"></view>
<view class="lock"></view>
</view>
<view class="goodsDetails">
<view class="title font-color-red acea-row row-center-wrapper">
<view class="pictrue">
<image :src="webUrl+'/20230304134450627525.png'" />
</view>
<view class="titleCon">活动规则</view>
<view class="pictrue on">
<image :src="webUrl+'/20230304134450627525.png'" />
</view>
</view>
<view class="conter" v-html="bargain.rule"></view>
</view>
<view class="bargainTip" :class="active === true ? 'on' : ''">
<!-- <view class="pictrue">
<image src="@/static/images/bargainBg.jpg" />
<view class="iconfont icon-guanbi" @click="close"></view>
</view>-->
<view class="cutOff" v-if="bargainPartake === userInfo.uid">
您已砍掉
<text class="font-color-red" v-text="bargainHelpPrice"></text>元,听说分享次数越多砍价成功的机会越大哦!
</view>
<view class="cutOff on" v-else>
<view class="help font-color-red" v-text="'成功帮砍' + bargainHelpPrice + '元'"></view>,您也可以砍价低价拿哦,快去挑选心仪的商品吧~
</view>
<view class="tipBnt" @click="goPoster" v-if="bargainPartake === userInfo.uid">邀请好友帮砍价</view>
<view class="tipBnt" @click="getBargainStart" v-else>我也要参与</view>
</view>
<view class="mask" @touchmove.prevent :hidden="active === false" @click="close"></view>
</view>
</template>
<script>
import CountDown from "@/components/CountDown";
import {
getBargainDetail,
getBargainShare,
getBargainStart,
getBargainHelp,
getBargainHelpPrice,
getBargainHelpList,
getBargainHelpCount,
getBargainStartUser
} from "@/api/activity";
import { postCartAdd } from "@/api/store";
import { mapGetters } from "vuex";
import {} from "@/libs/wechat";
import { isWeixin, parseQuery, handleQrCode } from "@/utils/index";
const NAME = "DargainDetails";
export default {
name: "DargainDetails",
components: {
CountDown
},
props: {},
data: function() {
return {
webUrl: this.$VUE_APP_RESOURCES_URL,
price: 0,
bargainId: 0, //砍价编号
bargainPartake: 0, //参与砍价
bargain: [], //砍价产品信息
partake: null,
bargainSumCount: 0, //砍价成功人数
activeMsg: "",
active: false,
loading: false,
datatime: 0,
lookCount: 0, //查看人数
shareCount: 0, //分享人数
userCount: 0, //参与人数
bargainHelpPrice: 0, //砍掉金额
bargainHelpList: [],
helpListStatus: false, //砍价列表是否获取完成 false 未完成 true 完成
helpListLoading: false, //当前接口是否请求完成 false 完成 true 未完成
page: 1, //页码
limit: 2, //数量
helpCount: 0, //砍价帮总人数
surplusPrice: 0, //剩余金额
alreadyPrice: 0, //已砍掉价格
pricePercent: 0, //砍价进度条
bargainUserInfo: [], //砍价 开启砍价用户信息
userBargainStatus: 2, //砍价状态
statusUser: false ,// 是否帮别人砍,没砍是true,砍了false
share:{
title:'',
path: `/pages/activity/DargainDetails/index/?id=${this.$yroute.query.id}&partake=${this.userInfo.uid}`,
imageUrl:'',
desc:'',
content:''
}
};
},
computed: mapGetters(["userInfo", "isLogin"]),
// watch: {
// $yroute: function(n) {
// var that = this;
// if (n.name === NAME) {
// that.mountedStart();
// }
// }
// },
mounted: function() {
var that = this;
that.mountedStart();
setTimeout(function() {
that.loading = true;
}, 500);
},
methods: {
//参与砍价
goParticipate() {
if (this.bargainPartake === this.userInfo.uid) this.getBargainStart();
else this.getBargainStartUser();
this.getBargainHelpCount();
},
openAlone: function() {
this.$yrouter.push({ path: "/detail/" + this.bargain.productId });
},
mountedStart: function() {
var that = this;
let url = handleQrCode();
if (url) {
that.bargainId = url.bargainId;
that.partake = url.uid;
} else {
that.bargainId = that.$yroute.query.id;
that.partake = parseInt(that.$yroute.query.partake);
}
if (
this.partake === undefined ||
this.partake <= 0 ||
isNaN(this.partake)
) {
that.bargainPartake = that.userInfo.uid;
// that.$yrouter.push({
// path: "/pages/activity/DargainDetails/index",
// query: { id: that.bargainId, partake: that.bargainPartake }
// });
} else {
that.bargainPartake = parseInt(this.partake);
}
that.getBargainHelpCountStart();
that.getBargainDetail();
that.getBargainShare(0);
// if (that.bargainPartake !== that.userInfo.uid) that.getBargainStartUser();
if (that.bargainPartake === that.userInfo.uid) {
// that.getBargainStart();
} else {
that.getBargainStartUser();
}
},
goPay: function() {
var data = {};
var that = this;
data.productId = that.bargain.productId;
data.cartNum = that.bargain.num;
data.uniqueId = "";
data.bargainId = that.bargainId;
data.new = 1;
postCartAdd(data)
.then(res => {
that.$yrouter.push({
path: "/pages/order/OrderSubmission/index",
query: { id: res.data.cartId }
});
})
.catch(err => {
uni.showToast({
title:
err.msg || err.response.data.msg || err.response.data.message,
icon: "none",
duration: 2000
});
});
},
goPoster: function() {
var that = this;
that.getBargainShare(that.bargainId);
this.$yrouter.push({
path: "/pages/activity/Poster/index",
query: { id: that.bargainId, type: 2 }
});
},
goList: function() {
this.$yrouter.push({
path: "/pages/activity/GoodsBargain/index"
});
},
//砍价分享
//bargainId 0 获取 查看人数 分享人数 参与人数
//bargainId 砍价产品编号 添加分享次数 获取 查看人数 分享人数 参与人数
getBargainShare: function(bargainId) {
var that = this;
getBargainShare({ bargainId: bargainId }).then(res => {
that.lookCount = res.data.lookCount;
that.shareCount = res.data.shareCount;
that.userCount = res.data.userCount;
});
},
// 获取产品详情
getBargainDetail: function() {
var that = this;
getBargainDetail(that.bargainId)
.then(res => {
res.data.bargain = res.data.bargain.replace(
/\<img/gi,
'<img style="max-width:100%;height:auto;"'
);
that.bargain = res.data.bargain;
that.datatime = that.bargain.stopTime / 1000;
that.getBargainHelpCount();
})
.catch(res => {
uni.showToast({
title: res.msg,
icon: "none",
duration: 2000
});
});
},
//开启砍价
getBargainStart: function() {
var that = this;
getBargainStart({ bargainId: that.bargainId })
.then(() => {
that.bargainPartake = that.userInfo.uid;
that.getBargainHelp();
})
.catch(res => {
uni.showToast({
title: res.msg,
icon: "none",
duration: 2000
});
});
},
//参与砍价
getBargainHelp: function() {
var that = this;
if (
that.surplusPrice === 0 &&
that.bargainPartake !== that.userInfo.uid
) {
return uni.showToast({
title: "好友已经砍价成功",
icon: "success",
duration: 2000
});
}
var data = {
bargainId: that.bargainId,
bargainUserUid: that.bargainPartake
};
getBargainHelp(data)
.then(res => {
that.activeMsg = res.data.status;
if (
res.data.status === "SUCCESSFUL" &&
that.bargainPartake !== that.userInfo.uid
) {
uni.showToast({
title: "您已经砍过了",
icon: "none",
duration: 2000
});
return;
}
that.helpListStatus = false;
that.page = 1;
that.bargainHelpList = [];
that.getBargainHelpPrice();
})
.catch(res => {
uni.showToast({
title: res.msg,
icon: "none",
duration: 2000
});
});
},
//获取砍掉的金额
getBargainHelpPrice: function() {
var that = this;
getBargainHelpPrice({
bargainId: that.bargainId,
bargainUserUid: that.bargainPartake
})
.then(res => {
that.bargainHelpPrice = res.data.price;
that.getBargainHelpCount();
that.getBargainHelpList();
switch (that.activeMsg) {
case "SUCCESSFUL":
break;
case "SUCCESS":
that.active = true;
break;
}
})
.catch(res => {
uni.showToast({
title: res.msg,
icon: "none",
duration: 2000
});
});
},
//砍价帮
getBargainHelpList: function() {
var that = this;
if (that.helpListLoading === true) return;
if (that.helpListStatus === true) return;
that.helpListLoading = true;
getBargainHelpList({
bargainId: that.bargainId,
bargainUserUid: that.bargainPartake,
page: that.page,
limit: that.limit
})
.then(res => {
that.helpListStatus = res.data.length < that.limit;
that.helpListLoading = false;
that.page++;
that.bargainHelpList.push.apply(that.bargainHelpList, res.data);
})
.catch(res => {
uni.showToast({
title: res.msg,
icon: "none",
duration: 2000
});
});
},
getBargainHelpCountStart: function() {
var that = this;
getBargainHelpCount({
bargainId: that.bargainId,
bargainUserUid: that.bargainPartake
})
.then(() => {})
.catch(() => {
this.$yrouter.push({
path: "/pages/activity/DargainDetails/index",
query: { id: that.bargainId, partake: that.userInfo.uid }
});
// that.$router.push({
// path:
// "/activity/dargain_detail/" +
// that.bargainId +
// "/" +
// that.userInfo.uid
// });
});
},
getBargainHelpCount: function() {
var that = this;
getBargainHelpCount({
bargainId: that.bargainId,
bargainUserUid: that.bargainPartake
})
.then(res => {
that.userBargainStatus = res.data.status;
that.helpCount = res.data.count;
that.surplusPrice = res.data.price;
that.alreadyPrice = res.data.alreadyPrice;
that.pricePercent = res.data.pricePercent;
that.price = (that.bargain.price - that.alreadyPrice).toFixed(2);
console.log(that);
})
.catch(() => {
that.bargainPartake = that.userInfo.uid;
// that.$yrouter.push({
// path: "/pages/activity/DargainDetails/index",
// query: { id: that.bargainId, partake: that.userInfo.uid }
// });
});
},
getBargainStartUser: function() {
var that = this;
getBargainStartUser({
bargainId: that.bargainId,
bargainUserUid: that.bargainPartake
})
.then(res => {
that.bargainUserInfo = res.data;
that.getBargainHelpList();
})
.catch(res => {
uni.showToast({
title: res.msg,
icon: "none",
duration: 2000
});
});
},
close: function() {
this.active = false;
}
}
// ,
// onShareAppMessage() {
// return {
// path: `/pages/activity/DargainDetails/index/?id=${this.$yroute.query.id}&partake=${this.userInfo.uid}`
// };
// }
};
</script>
<style lang="less">
page {
background-color: #eb3729;
}
.bargainBnt_hui {
font-size: 0.3 * 100rpx;
font-weight: bold;
color: #fff;
width: 6 * 100rpx;
height: 0.8 * 100rpx;
border-radius: 0.4 * 100rpx;
background: #bbb;
text-align: center;
line-height: 0.8 * 100rpx;
margin-top: 0.32 * 100rpx;
}
.bargain_view {
left: 0;
right: 0;
height: 0.48 * 100rpx;
background: rgba(0, 0, 0, 0.5);
opacity: 1;
border-radius: 0 0 0.06 * 100rpx 0.06 * 100rpx;
position: absolute;
bottom: 0;
font-size: 0.22 * 100rpx;
color: #fff;
text-align: center;
line-height: 0.48 * 100rpx;
}
.iconfonts {
font-size: 0.22 * 100rpx;
}
</style>
-84
View File
@@ -1,84 +0,0 @@
<template>
<view class="bargain-list">
<!-- <view class="header">
<image src="@/static/images/cut-bg.png" alt="">
</view>-->
<view class="list" v-if="bargainLis.length > 0">
<view class="item acea-row row-between-wrapper" v-for="(item, bargainLisIndex) in bargainLis"
:key="bargainLisIndex">
<view class="pictrue">
<image :src="item.image" />
</view>
<view class="text acea-row row-column-around">
<view class="line1" v-text="item.title"></view>
<view class="num">
<text class="iconfont icon-pintuan"></text>
{{ item.people }}人正在参与
</view>
<view class="money font-color-red">
可砍至:
<text class="price">{{item.minPrice}}</text>
</view>
</view>
<view class="cutBnt bg-color-red" @click="goDetail(item.id)">
<text class="iconfont icon-kanjia"></text>参与砍价
</view>
</view>
<view class="load font-color-red" v-if="!status" @click="getBargainList">点击加载更多</view>
</view>
</view>
</template>
<script>
import {
getBargainList
} from "@/api/activity";
export default {
name: "GoodsBargain",
components: {},
props: {},
data: function() {
return {
bargainLis: [], //砍价列表
status: false, //砍价列表是否获取完成 false 未完成 true 完成
loading: false, //当前接口是否请求完成 false 完成 true 未完成
page: 1, //页码
limit: 20 //数量
};
},
mounted: function() {
this.getBargainList();
},
methods: {
getBargainList: function() {
var that = this;
if (that.loading) return;
if (that.status) return;
that.loading = true;
getBargainList({
page: that.page,
limit: that.limit
}).then(res => {
that.status = res.data.length < that.limit;
that.bargainLis.push.apply(that.bargainLis, res.data);
that.page++;
that.loading = false;
});
},
goDetail: function(id) {
this.$yrouter.push({
path: "/pages/activity/DargainDetails/index",
query: {
id,
partake: 0
}
});
}
}
};
</script>
<style>
page {
background-color: rgb(245, 245, 245);
}
</style>
-91
View File
@@ -1,91 +0,0 @@
<template>
<view class="group-list" ref="container">
<view class="list" v-if="combinationList.length>0">
<view
class="item acea-row row-between-wrapper"
v-for="(item, combinationListIndex) in combinationList"
:key="combinationListIndex"
@click="link(item.id)"
>
<view class="pictrue">
<image :src="item.image" />
</view>
<view class="text">
<view class="line1" v-text="item.title"></view>
<view class="acea-row">
<view class="team acea-row row-middle cart-color">
<view class="iconfont icon-pintuan"></view>
<view class="num" v-text="item.people + '人团'"></view>
</view>
</view>
<view class="bottom acea-row row-between-wrapper">
<view class="money">
<text class="num" v-text="item.price"></text>
<text class="y-money" v-text="'¥' + item.productPrice"></text>
</view>
<view class="groupBnt bg-color-red">
去拼团
<text class="iconfont icon-jiantou"></text>
</view>
</view>
</view>
</view>
<Loading :loaded="status" :loading="loadingList"></Loading>
</view>
<view class="noCommodity" style="background-color: #fff;" v-if="combinationList.length === 0">
<view class="noPictrue">
<image :src="webUrl+'/20210203153900181449.png'" class="image" />
</view>
</view>
</view>
</template>
<script>
import { getCombinationList } from "@/api/activity";
import Loading from "@/components/Loading";
export default {
name: "GoodsGroup",
components: {
Loading
},
props: {},
data: function() {
return {
webUrl:this.$VUE_APP_RESOURCES_URL,
combinationList: [],
status: false, //砍价列表是否获取完成 false 未完成 true 完成
loading: false, //当前接口是否请求完成 false 完成 true 未完成
page: 1, //页码
limit: 20, //数量
loadingList: false
};
},
mounted: function() {
// document.querySelector('body').setAttribute('style', 'background-color:#eb3729');
this.getCombinationList();
},
onReachBottom() {
!this.loadingList && this.getCombinationList();
},
methods: {
getCombinationList: function() {
var that = this;
if (that.loading) return;
if (that.status) return;
getCombinationList({ page: that.page, limit: that.limit }).then(res => {
that.status = res.data.length < that.limit;
that.combinationList.push.apply(that.combinationList, res.data);
that.page++;
that.loading = false;
});
},
link: function(id) {
this.$yrouter.push({
path: "/pages/activity/GroupDetails/index",
query: { id }
});
}
}
};
</script>
-261
View File
@@ -1,261 +0,0 @@
<template>
<view class="flash-sale" ref="container">
<view class="header" v-if="headerImg">
<image :src="headerImg"/>
</view>
<scroll-view scroll-y="false" scroll-x="true">
<view class="timeScroll">
<view v-for="(item, index) in timeList" :key="index">
<view v-if="active==index" class="timeItem active" @click="setTime(index)">
<view class="time">{{ item.time }}</view>
<view class="state">{{ item.state }}</view>
</view>
<view v-if="active!=index" class="timeItem" @click="setTime(index)">
<view class="time">{{ item.time }}</view>
<view class="state">{{ item.state }}</view>
</view>
</view>
</view>
</scroll-view>
<view v-for="(item, index) in timeList" :key="index">
<view v-if="active == index">
<view class="countDown font-color-red acea-row row-center-wrapper">
<view v-if="item.status === 0" class="activity">活动已结束</view>
<count-down
:isDay="false"
:tipText="'距结束仅剩 '"
:dayText="false"
:hourText="' : '"
:minuteText="' : '"
:secondText="false"
:datatime="datatime"
v-if="item.status === 1"
></count-down>
<view v-if="item.status === 2" class="activity">活动即将开始</view>
</view>
<view class="list">
<view
class="item acea-row row-between-wrapper"
v-for="(itemSeckill, indexSeckill) in seckillList"
:key="indexSeckill"
>
<view class="pictrue">
<image :src="itemSeckill.image"/>
</view>
<view class="text acea-row row-column-around">
<view class="line1" v-text="itemSeckill.title"></view>
<view class="money">
限时价
<text class="num font-color-red" v-text="'¥' + itemSeckill.price"></text>
</view>
<view class="progress cart-color">
<view class="bg-red" :style="{ width: loading ? itemSeckill.percent + '%' : '' }"></view>
<view class="piece font-color-red" v-text="'仅剩' + itemSeckill.stock + '件'"></view>
</view>
</view>
<view
class="grab bg-color-red"
v-if="item.status === 1 && itemSeckill.stock > 0"
@click="goDetail(itemSeckill.id)"
>马上抢
</view>
<view class="grab" v-if="item.status === 1 && itemSeckill.stock <= 0">已售磬</view>
<view class="grab bg-color-red" v-if="item.status === 2">即将开始</view>
<view class="grab bg-color-red" v-if="item.status === 0">已结束</view>
</view>
</view>
<view
class="noCommodity"
style="background-color: #fff;"
v-if="seckillList.length === 0 && page > 1"
>
<view class="noPictrue">
<image :src="webUrl+'/20210203153900181449.png'" class="image"/>
</view>
</view>
</view>
</view>
</view>
</template>
<script>
import {getSeckillConfig, getSeckillList} from "@/api/activity";
import CountDown from "@/components/CountDown";
export default {
name: "GoodsSeckill",
components: {
CountDown
},
props: {},
data: function () {
return {
webUrl: this.$VUE_APP_RESOURCES_URL,
headerImg: "",
timeList: [],
sticky: false,
loading: false,
datatime: 0,
active: 0,
seckillList: [],
status: false, //砍价列表是否获取完成 false 未完成 true 完成
loadingList: false, //当前接口是否请求完成 false 完成 true 未完成
page: 1, //页码
limit: 5, //数量
title: []
};
},
mounted: function () {
this.mountedStart();
},
onReachBottom() {
!this.loadingList && this.getSeckillList();
},
methods: {
changeTime: function (index) {
this.active = index;
this.getSeckillList();
},
mountedStart: function () {
var that = this;
uni.showLoading();
getSeckillConfig().then(res => {
that.$set(that, "headerImg", res.data.lovely);
that.$set(that, "timeList", res.data.seckillTime);
that.$set(that, "active", res.data.seckillTimeIndex);
let title = [];
title = res.data.seckillTime.map((item, index) => {
return {
name: "div",
attrs: {
class: "timeItem"
},
children: [
{
name: "div",
attrs: {
class: "time"
},
children: [
{
type: "text",
text: item.time
}
]
},
{
name: "div",
attrs: {
class: "state"
},
children: [
{
type: "text",
text: item.state
}
]
}
]
};
});
that.$set(that, "title", title);
that.datatime = that.timeList[that.active].stop;
that.getSeckillList();
that.$nextTick(function () {
that.sticky = true;
uni.hideLoading();
});
});
},
setTime: function (index) {
var that = this;
that.page = 1;
that.loadingList = false;
that.status = false;
that.active = index;
that.datatime = that.timeList[that.active].stop;
this.seckillList = [];
that.getSeckillList();
},
getSeckillList: function () {
var that = this;
if (that.loadingList) return;
if (that.status) return;
var time = that.timeList[that.active].id;
getSeckillList(time, {
page: that.page,
limit: that.limit
}).then(res => {
that.status = res.data.length < that.limit;
that.seckillList.push.apply(that.seckillList, res.data);
that.page++;
uni.hideLoading();
});
},
goDetail: function (id) {
var that = this;
var time = that.timeList[that.active].stop;
this.$yrouter.push({
path: "/pages/activity/SeckillDetails/index",
query: {
id,
time
}
});
}
}
};
</script>
<style scoped lang="less">
.timeScroll {
display: flex;
align-items: center;
flex-direction: row;
}
.timeItem {
font-size: 0.22 * 100rpx;
color: #282828;
width: 150rpx;
text-align: center;
padding: 0.11 * 100rpx 0;
background-color: none;
&.active {
.time {
color: #eb3729;
}
.state {
background-color: #eb3729;
color: #fff;
opacity: 1;
border-radius: 30rpx;
padding: 0 0.2 * 100rpx;
font-weight: 800;
height: 0.37 * 100rpx;
line-height: 0.37 * 100rpx;
}
}
}
.timeItem .time {
font-size: 0.32 * 100rpx;
font-weight: bold;
height: 0.37 * 100rpx;
line-height: 0.37 * 100rpx;
}
.timeItem .state {
height: 0.37 * 100rpx;
line-height: 0.37 * 100rpx;
}
.activity {
color: #333;
}
.flash-sale .list .item .grab {
background-color: #999;
}
</style>
-375
View File
@@ -1,375 +0,0 @@
<template>
<view :class="[posterImageStatus ? 'noscroll product-con' : 'product-con']" v-show="domStatus">
<product-con-swiper :imgUrls="imgUrls"></product-con-swiper>
<view class="wrapper">
<view class="share acea-row row-between row-bottom">
<view class="money font-color-red">
<text class="num" v-text="storeInfo.price"></text>
<text class="y-money" v-text="'¥' + storeInfo.productPrice"></text>
</view>
</view>
<view class="introduce" v-text="storeInfo.title"></view>
<view class="label acea-row row-between-wrapper">
<view v-text="'类型:' + storeInfo.people + '人团'"></view>
<view v-text="'库存:' + storeInfo.stock + storeInfo.unitName"></view>
<view v-text="'已拼:' + storeInfo.sales + storeInfo.unitName"></view>
</view>
</view>
<view class="notice acea-row row-middle">
<view class="num font-color-red">
<text class="iconfont icon-laba"></text>
已拼{{ storeInfo.sales
}}{{ storeInfo.unitName }}
<text class="line">|</text>
</view>
<view class="swiper-no-swiping swiper">
<swiper class="swiper-wrapper" :options="swiperTip" :autoplay="true" :interval="3000">
<block v-for="(item, itemNewIndex) in itemNew" :key="itemNewIndex">
<swiper-item>
<view class="line1">{{ item }}</view>
</swiper-item>
</block>
</swiper>
</view>
</view>
<view class="assemble">
<view v-for="(item, groupListindex) in groupList" :key="groupListindex">
<view class="item acea-row row-between-wrapper" v-if="groupListindex < groupListCount">
<view class="pictxt acea-row row-between-wrapper">
<view class="pictrue">
<image :src="item.avatar" class="image" />
</view>
<view class="text line1" v-text="item.nickname"></view>
</view>
<view class="right acea-row row-middle">
<view>
<view class="lack">
<text>还差</text>
<text class="font-color-red" v-text="item.count"></text>
<text>人成团</text>
</view>
<count-down
:isDay="false"
:tipText="'剩余 '"
:dayText="false"
:hourText="':'"
:minuteText="':'"
:secondText="false"
:datatime="item.stopTime/1000"
></count-down>
</view>
<view class="spellBnt" @click="groupRule(item.id)">
去拼单
<text class="iconfont icon-jiantou"></text>
</view>
</view>
</view>
</view>
<view class="more" v-if="groupList.length > groupListCount" @click="setGroupListCount">
查看更多
<text class="iconfont icon-xiangxia"></text>
</view>
</view>
<view class="playWay">
<view class="title acea-row row-between-wrapper">
<view>拼团玩法</view>
</view>
<view class="way acea-row row-middle">
<view class="item">
<text class="num"></text>开团/参团
</view>
<view class="iconfont icon-arrow"></view>
<view class="item">
<text class="num"></text>邀请好友
</view>
<view class="iconfont icon-arrow"></view>
<view class="item">
<view>
<text class="num"></text>满员发货
</view>
</view>
</view>
</view>
<view class="userEvaluation">
<view class="title acea-row row-between-wrapper">
<view v-text="'用户评价(' + replyCount + ')'"></view>
<view class="praise" @click="goReply">
<text class="font-color-red" v-text="replyChance + '%'"></text>好评率
<text class="iconfont icon-jiantou"></text>
</view>
</view>
<UserEvaluation :reply="reply"></UserEvaluation>
</view>
<view class="product-intro">
<view class="title">产品介绍</view>
<view class="conter" v-html="storeInfo.description"></view>
<!-- <view class="conter" v-html=""></view> -->
</view>
<view style="height:100rpx;"></view>
<view class="footer-group acea-row row-between-wrapper">
<!-- <view class="customerSer acea-row row-center-wrapper row-column">
<view class="iconfont icon-kefu"></view>
<view>客服</view>
</view>-->
<view class="customerSer acea-row row-center-wrapper row-column" @click="setCollect">
<view class="iconfont" :class="userCollect ? 'icon-shoucang1' : 'icon-shoucang'"></view>
<text>收藏</text>
</view>
<view class="bnt bg-color-violet" @click="openAlone">单独购买</view>
<view class="bnt bg-color-red" @click="openTeam">立即开团</view>
</view>
<ProductWindow v-if="cartNum" v-on:changeFun="changeFun" :attr="attr" :cartNum="cartNum"></ProductWindow>
<StorePoster
v-on:setPosterImageStatus="setPosterImageStatus"
:posterImageStatus="posterImageStatus"
:posterData="posterData"
></StorePoster>
</view>
</template>
<script>
// import { swiper, swiperSlide } from "vue-awesome-swiper";
import ProductConSwiper from "@/components/ProductConSwiper";
import CountDown from "@/components/CountDown";
import UserEvaluation from "@/components/UserEvaluation";
import ProductWindow from "@/components/ProductWindow";
import StorePoster from "@/components/StorePoster";
import { getCombinationDetail } from "@/api/activity";
import { postCartAdd } from "@/api/store";
import { imageBase64 } from "@/api/public";
import {
getCoupon,
getCollectAdd,
getCollectDel,
getUserInfo
} from "@/api/user";
const NAME = "GroupDetails";
export default {
name: "GroupDetails",
components: {
ProductConSwiper,
CountDown,
UserEvaluation,
// swiper,
// swiperSlide,
ProductWindow,
StorePoster
},
props: {},
data: function() {
return {
domStatus: false,
posterData: {
image: "",
title: "",
price: "",
code: ""
},
posterImageStatus: false,
reply: [],
replyCount: 0,
replyChance: 0,
imgUrls: [],
storeInfo: {},
itemNew: {},
groupListCount: 2,
groupList: {},
swiperTip: {
direction: "vertical",
autoplay: {
disableOnInteraction: false,
delay: 2000
},
loop: true,
speed: 1000,
observer: true,
observeParents: true
},
attr: {
cartAttr: false,
productSelect: {
image: "",
store_name: "",
price: "",
stock: "",
unique: "",
cart_num: 1
}
},
cartNum: 1,
userCollect: false
};
},
watch: {
$yroute: function(n) {
var that = this;
if (n.name === NAME) {
that.mountedStart();
}
}
},
onShow: function() {
this.mountedStart();
},
methods: {
openAlone: function() {
this.$yrouter.push({
path: "/pages/shop/GoodsCon/index",
query: { id: this.storeInfo.productId }
});
// this.$yrouter.replace({ path: "/detail/" + this.storeInfo.productId });
},
//收藏商品
setCollect: function() {
let that = this,
id = that.storeInfo.id,
category = "product";
if (that.userCollect) {
getCollectDel(id, category).then(function() {
that.userCollect = !that.userCollect;
});
} else {
getCollectAdd(id, category).then(function() {
that.userCollect = !that.userCollect;
});
}
},
mountedStart: function() {
var that = this;
let id = that.$yroute.query.id;
getCombinationDetail(id).then(res => {
that.userCollect = res.data.userCollect;
res.data.storeInfo.description = res.data.storeInfo.description.replace(
/\<img/gi,
'<img style="max-width:100%;height:auto;"'
);
that.$set(that, "storeInfo", res.data.storeInfo);
that.$set(that, "imgUrls", res.data.storeInfo.sliderImageArr);
that.$set(that, "itemNew", res.data.pinkOkList);
that.$set(that, "groupList", res.data.pink);
that.$set(that, "reply", [res.data.reply]);
that.$set(that, "replyCount", res.data.replyCount);
that.$set(that, "replyChance", res.data.replyChance);
that.setProductSelect();
that.posterData.image = that.storeInfo.image;
if (that.storeInfo.title.length > 30) {
that.posterData.title = that.storeInfo.title.substring(0, 30) + "...";
} else {
that.posterData.title = that.storeInfo.title;
}
that.posterData.price = that.storeInfo.price;
that.posterData.code = that.storeInfo.code_base;
that.domStatus = true;
//that.getImageBase64();
});
},
getImageBase64: function() {
let that = this;
imageBase64(this.posterData.image, that.posterData.code).then(res => {
that.posterData.image = res.data.image;
that.posterData.code = res.data.code;
});
},
setPosterImageStatus: function() {
// var sTop = document.body || document.documentElement;
// sTop.scrollTop = 0;
this.posterImageStatus = !this.posterImageStatus;
},
groupRule: function(id) {
var that = this;
that.$yrouter.push({
path: "/pages/activity/GroupRule/index",
query: { id }
});
},
goReply: function() {
var that = this;
that.$yrouter.push({
path: "/pages/shop/EvaluateList/index",
query: { id: that.storeInfo.product_id }
});
},
setGroupListCount: function() {
this.groupListCount = this.groupListCount + 2;
},
//将父级向子集多次传送的函数合二为一;
changeFun: function(opt) {
if (typeof opt !== "object") opt = {};
let action = opt.action || "";
let value = opt.value === undefined ? "" : opt.value;
this[action] && this[action](value);
},
changeattr: function(res) {
var that = this;
that.attr.cartAttr = res;
},
ChangeCartNum: function(res) {
var that = this;
that.attr.productSelect.cart_num = 1;
that.cartNum = 1;
uni.showToast({
title: "每人每次限购1" + that.storeInfo.unitName,
icon: "none",
duration: 2000
});
},
setProductSelect: function() {
var that = this;
var attr = that.attr;
attr.productSelect.image = that.storeInfo.image;
attr.productSelect.store_name = that.storeInfo.title;
attr.productSelect.price = that.storeInfo.price;
attr.productSelect.stock = that.storeInfo.stock;
attr.cartAttr = false;
that.$set(that, "attr", attr);
},
openTeam: function() {
var that = this;
if (that.attr.cartAttr == false) {
that.attr.cartAttr = !this.attr.cartAttr;
} else {
var data = {};
data.productId = that.storeInfo.productId;
data.cartNum = that.attr.productSelect.cart_num;
data.uniqueId = that.attr.productSelect.unique;
data.combinationId = that.storeInfo.id;
data.new = 1;
postCartAdd(data)
.then(res => {
that.$yrouter.push({
path: "/pages/order/OrderSubmission/index",
query: { id: res.data.cartId }
});
})
.catch(err => {
uni.showToast({
title:
err.msg || err.response.data.msg || err.response.data.message,
icon: "none",
duration: 2000
});
});
}
}
}
};
</script>
<style scoped lang="less">
.product-con .wrapper {
padding-bottom: 0.26 * 100rpx;
}
.noscroll {
height: 100%;
overflow: hidden;
}
.product-con .footer-group .bnt {
// flex:1;
width: 43%;
}
.product-con .footer-group .bnt.bg-color-violet {
background-color: #fa8013;
}
</style>
-248
View File
@@ -1,248 +0,0 @@
<template>
<view class="group-con">
<view class="header acea-row row-between-wrapper">
<view class="pictrue">
<image :src="storeCombination.image" />
</view>
<view class="text">
<view class="line1" v-text="storeCombination.title"></view>
<view class="money">
<text></text>
<text class="num" v-text="storeCombination.price"></text>
<text class="team cart-color" v-text="storeCombination.people + '人拼'"></text>
</view>
</view>
<view v-if="pinkBool === -1" class="iconfont icon-pintuanshibai"></view>
<view v-else-if="pinkBool === 1" class="iconfont icon-pintuanchenggong font-color-red"></view>
</view>
<view class="wrapper">
<view class="title acea-row row-center-wrapper">
<view class="line"></view>
<view class="name acea-row row-center-wrapper">
<text>剩余</text>
<count-down
:isDay="false"
:tipText="false"
:dayText="false"
:hourText="' : '"
:minuteText="' : '"
:secondText="false"
:datatime="pinkT.stopTime/1000"
></count-down>
<text>结束</text>
</view>
<view class="line"></view>
</view>
<view class="tips-warp">
<text class="tips font-color-red" v-if="pinkBool === 1">恭喜您拼团成功</text>
<text class="tips" v-else-if="pinkBool === -1">还差{{ count }}拼团失败</text>
<text class="tips font-color-red" v-else-if="pinkBool === 0">拼团中还差{{ count }}人拼团成功</text>
</view>
<view
class="list acea-row row-middle"
:class="[pinkBool === 1 || pinkBool === -1 ? 'result' : '',iShidden ? 'on' : '']"
>
<view class="pictrue">
<image :src="pinkT.avatar" />
</view>
<view class="acea-row row-middle" v-if="pinkAll.length > 0">
<view class="pictrue" v-for="(item, pinkAllIndex) in pinkAll" :key="pinkAllIndex">
<image :src="item.avatar" />
</view>
</view>
<view class="pictrue" v-for="countIndex in count" :key="countIndex">
<image class="img-none" :src="webUrl+'/20230304204903336964.png'" />
</view>
</view>
<view
v-if="(pinkBool === 1 || pinkBool === -1) && count > 9"
class="lookAll acea-row row-center-wrapper"
@click="lookAll"
>
{{ iShidden ? "收起" : "查看全部" }}
<text class="iconfont" :class="iShidden ? 'icon-xiangshang' : 'icon-xiangxia'"></text>
</view>
<view
class="teamBnt bg-color-red"
v-if="userBool === 1 && isOk == 0 && pinkBool === 0"
@click="goPoster"
>邀请好友参团</view>
<view
class="teamBnt bg-color-red"
v-else-if="userBool === 0 && pinkBool === 0 && count > 0"
@click="pay"
>我要参团</view>
<view
class="teamBnt bg-color-red"
v-if="pinkBool === 1 || pinkBool === -1"
@click="goDetail(storeCombination.id)"
>再次开团</view>
<view class="cancel" @click="getCombinationRemove" v-if="pinkBool === 0 && userBool === 1">
<text class="iconfont icon-guanbi3"></text>
<text>取消开团</text>
</view>
<view class="lookOrder" v-if="pinkBool === 1" @click="goOrder">
<text>查看订单信息</text>
<text class="iconfont icon-xiangyou"></text>
</view>
</view>
</view>
</template>
<script>
import CountDown from "@/components/CountDown";
import { getCombinationPink, getCombinationRemove } from "@/api/activity";
import { postCartAdd } from "@/api/store";
import { isWeixin, parseQuery, handleQrCode } from "@/utils/index";
const NAME = "GroupRule";
export default {
name: NAME,
components: {
CountDown
},
props: {},
data: function() {
return {
webUrl: this.$VUE_APP_RESOURCES_URL,
currentPinkOrder: "", //当前拼团订单
isOk: 0, //判断拼团是否完成
pinkBool: 0, //判断拼团是否成功|0=失败,1=成功
userBool: 0, //判断当前用户是否在团内|0=未在,1=在
pinkAll: [], //团员
pinkT: [], //团长信息
storeCombination: [], //拼团产品
pinkId: 0,
count: 0, //拼团剩余人数
iShidden: false
};
},
watch: {
$yroute(n) {
var that = this;
if (n.name === NAME) {
that.pinkId = that.$yroute.query.id;
that.getCombinationPink();
}
}
},
mounted: function() {
var that = this;
let url = handleQrCode();
if (url) {
that.pinkId = url.pinkId;
} else {
that.pinkId = that.$yroute.query.id;
}
that.getCombinationPink();
},
methods: {
pay: function() {
var that = this;
var data = {};
data.productId = that.storeCombination.productId;
data.cartNum = that.pinkT.totalNum;
data.uniqueId = "";
data.combinationId = that.storeCombination.id;
data.new = 1;
postCartAdd(data)
.then(res => {
that.$yrouter.push({
path: "/pages/order/OrderSubmission/index",
query: {
id: res.data.cartId,
pinkid: that.pinkId
}
});
})
.catch(err => {
uni.showToast({
title:
err.msg || err.response.data.msg || err.response.data.message,
icon: "none",
duration: 2000
});
});
},
goPoster: function() {
var that = this;
this.$yrouter.push({
path: "/pages/activity/Poster/index",
query: {
id: that.pinkId,
type: 1
}
});
},
goOrder: function() {
var that = this;
this.$yrouter.push({
path: "/pages/order/OrderDetails/index",
query: {
id: that.currentPinkOrder
}
});
},
//拼团列表
goList: function() {
this.$yrouter.push({
path: "/pages/activity/GoodsGroup/index"
});
},
//拼团详情
goDetail: function(id) {
this.$yrouter.push({
path: "/pages/activity/GroupDetails/index",
query: {
id
}
});
},
//拼团信息
getCombinationPink: function() {
var that = this;
getCombinationPink(that.pinkId).then(res => {
that.$set(that, "storeCombination", res.data.storeCombination);
that.$set(that, "pinkT", res.data.pinkT);
that.$set(that, "pinkAll", res.data.pinkAll);
that.$set(that, "count", res.data.count);
that.$set(that, "userBool", res.data.userBool);
that.$set(that, "pinkBool", res.data.pinkBool);
that.$set(that, "isOk", res.data.isOk);
that.$set(that, "currentPinkOrder", res.data.currentPinkOrder);
});
},
//拼团取消
getCombinationRemove: function() {
var that = this;
getCombinationRemove({
id: that.pinkId,
cid: that.storeCombination.id
})
.then(res => {
uni.showToast({
title: res.msg,
icon: "none",
duration: 2000
});
})
.catch(res => {
uni.showToast({
title: res.msg,
icon: "none",
duration: 2000
});
});
},
lookAll: function() {
this.iShidden = !this.iShidden;
}
}
};
</script>
<style lang="less">
.tips-warp {
text-align: center;
margin-top: 20rpx;
}
</style>
-79
View File
@@ -1,79 +0,0 @@
<template>
<view class="poster-poster" v-if="status === false">
<view class="tip">
<text class="iconfont icon-shuoming"></text>提示长按图片保存至手机相册
</view>
<view class="poster">
<image :src="image" mode="widthFix" show-menu-by-longpress />
</view>
</view>
</template>
<script>
import { getBargainPoster, getCombinationPoster } from "@/api/activity";
export default {
name: "Poster",
components: {},
props: {},
data: function() {
return {
status: true,
id: 0,
image: ""
};
},
mounted: function() {
var that = this;
var id = that.$yroute.query.id;
var type = that.$yroute.query.type;
that.id = id;
if (type == 2) {
that.getBargainPoster();
} else {
that.getCombinationPoster();
}
},
methods: {
getBargainPoster: function() {
var that = this;
getBargainPoster({ bargainId: that.id, from: "wechat" })
.then(res => {
that.image = res.data.url;
that.status = false;
})
.catch(res => {
uni.showToast({
title: res.msg,
icon: "none",
duration: 2000
});
});
},
// 拼团海报
getCombinationPoster: function() {
var that = this;
getCombinationPoster({ id: that.id, from: "wechat" })
.then(res => {
that.image = res.data.url;
that.status = false;
})
.catch(res => {
uni.showToast({
title: res.msg,
icon: "none",
duration: 2000
});
});
}
}
};
</script>
<style scoped lang="less">
page {
background-color: #eb3729;
}
.poster-poster {
height: unset !important;
}
</style>
-235
View File
@@ -1,235 +0,0 @@
<template>
<view :class="[posterImageStatus ? 'noscroll product-con' : 'product-con']" v-show="domStatus">
<product-con-swiper :imgUrls="imgUrls"></product-con-swiper>
<view class="nav acea-row row-between-wrapper">
<view class="money">
<text class="num" v-text="storeInfo.price"></text>
<text class="y-money" v-text="'¥' + storeInfo.price"></text>
</view>
<view class="acea-row row-middle">
<view class="times">
<view>距秒杀结束仅剩</view>
<count-down
:isDay="false"
:tipText="false"
:dayText="false"
:hourText="' : '"
:minuteText="' : '"
:secondText="false"
:datatime="datatime"
></count-down>
</view>
<view class="iconfont icon-jiantou"></view>
</view>
</view>
<view class="wrapperRush">
<view class="introduce acea-row row-between">
<view class="infor" v-text="storeInfo.title"></view>
<!-- <view class="iconfont icon-fenxiang" @click="setPosterImageStatus"></view> -->
</view>
<view class="label acea-row row-middle">
<view class="stock" v-text="'库存:' + storeInfo.stock + '件'"></view>
<view v-text="'销量:' + storeInfo.sales + '件'"></view>
</view>
</view>
<view class="product-intro">
<view class="title">产品介绍</view>
<view class="conter" v-html="storeInfo.description"></view>
</view>
<view style="height:100rpx;"></view>
<view class="footerRush acea-row row-between-wrapper">
<!-- <view
class="customerSer acea-row row-center-wrapper row-column"
@click="routerGo()"
>
<view class="iconfont icon-kefu"></view>
<view>客服</view>
</view> -->
<view class="bnt bg-color-red" @click="tapBuy">立即购买</view>
</view>
<ProductWindow v-on:changeFun="changeFun" :attr="attr" :cartNum="cartNum"></ProductWindow>
<StorePoster
v-on:setPosterImageStatus="setPosterImageStatus"
:posterImageStatus="posterImageStatus"
:posterData="posterData"
></StorePoster>
</view>
</template>
<style scoped lang="less">
.noscroll {
height: 100%;
overflow: hidden;
}
</style>
<script>
import ProductConSwiper from "@/components/ProductConSwiper";
import CountDown from "@/components/CountDown";
import ProductWindow from "@/components/ProductWindow";
import StorePoster from "@/components/StorePoster";
import { getSeckillDetail } from "@/api/activity";
import { postCartAdd } from "@/api/store";
import { imageBase64 } from "@/api/public";
const NAME = "SeckillDetails";
export default {
name: "SeckillDetails",
components: {
ProductConSwiper,
CountDown,
ProductWindow,
StorePoster
},
props: {},
data: function() {
return {
domStatus: false,
posterData: {
image: "",
title: "",
price: "",
code: ""
},
posterImageStatus: false,
action: "",
imgUrls: [],
storeInfo: [],
replyCount: 0,
reply: [],
cartNum: 1,
attr: {
cartAttr: false,
productSelect: {
image: "",
store_name: "",
price: "",
stock: "",
unique: "",
cart_num: 1
}
},
datatime: 0
};
},
watch: {
$yroute: function(n) {
var that = this;
if (n.name === NAME) {
that.mountedStart();
}
}
},
mounted: function() {
this.mountedStart();
},
methods: {
routerGo(item) {
this.$yrouter.push({ path: '/pages/user/CustomerList/index' })
},
mountedStart: function() {
var that = this;
let id = that.$yroute.query.id;
that.datatime = parseInt(that.$yroute.query.time);
getSeckillDetail(id).then(res => {
res.data.storeInfo.description = res.data.storeInfo.description.replace(
/\<img/gi,
'<img style="max-width:100%;height:auto;"'
);
that.$set(that, "storeInfo", res.data.storeInfo);
that.$set(that, "imgUrls", res.data.storeInfo.sliderImageArr);
that.$set(that, "replyCount", res.data.replyCount);
that.$set(that, "reply", res.data.reply);
that.posterData.image = that.storeInfo.image_base;
that.updateTitle();
if (that.storeInfo.title.length > 30) {
that.posterData.title = that.storeInfo.title.substring(0, 30) + "...";
} else {
that.posterData.title = that.storeInfo.title;
}
that.posterData.price = that.storeInfo.price;
that.posterData.code = that.storeInfo.code_base;
that.setProductSelect();
that.domStatus = true;
});
},
updateTitle() {
// document.title = this.storeInfo.title || this.$yroute.meta.title;
},
setPosterImageStatus: function() {
// var sTop = document.body || document.documentElement;
// sTop.scrollTop = 0;
this.posterImageStatus = !this.posterImageStatus;
},
//将父级向子集多次传送的函数合二为一;
changeFun: function(opt) {
if (typeof opt !== "object") opt = {};
let action = opt.action || "";
let value = opt.value === undefined ? "" : opt.value;
this[action] && this[action](value);
},
changeattr: function(res) {
var that = this;
that.attr.cartAttr = res;
},
ChangeCartNum: function(res) {
var that = this;
if (res) {
if (that.attr.productSelect.cart_num < that.storeInfo.stock) {
that.attr.productSelect.cart_num++;
this.cartNum++;
}
} else {
if (that.attr.productSelect.cart_num > 1) {
that.attr.productSelect.cart_num--;
this.cartNum--;
}
}
},
setProductSelect: function() {
var that = this;
var attr = that.attr;
attr.productSelect.image = that.storeInfo.image;
attr.productSelect.store_name = that.storeInfo.title;
attr.productSelect.price = that.storeInfo.price;
attr.productSelect.stock = that.storeInfo.stock;
attr.cartAttr = false;
that.$set(that, "attr", attr);
},
selecAttrTap: function() {
this.cartAttr = true;
},
tapBuy: function() {
var that = this;
if (that.attr.cartAttr == false) {
that.attr.cartAttr = !this.attr.attrcartAttr;
} else {
var data = {};
data.productId = that.storeInfo.productId;
data.cartNum = that.attr.productSelect.cart_num;
data.uniqueId = that.attr.productSelect.unique;
data.secKillId = that.storeInfo.id;
data.new = 1;
postCartAdd(data)
.then(res => {
that.$yrouter.push({
path: "/pages/order/OrderSubmission/index",
query: { id: res.data.cartId }
});
})
.catch(err => {
uni.showToast({
title: err.msg || err.response.data.msg|| err.response.data.message,
icon: 'none',
duration: 2000
});
});
}
}
}
};
</script>
<style scoped lang="less">
.product-con .nav {
padding: 0 0.2*100rpx;
}
</style>
+209 -77
View File
@@ -1,6 +1,6 @@
<template> <template>
<view class="pages-auth"> <view class="pages-auth v12-justify-between v12-flex-column">
<view class="tip-1">为了提供更优质的服务需要获取</view> <!-- <view class="tip-1">为了提供更优质的服务需要获取</view>
<view class="tip-2">您的头像昵称</view> <view class="tip-2">您的头像昵称</view>
<view class="wechat flex jc-between ai-center"> <view class="wechat flex jc-between ai-center">
@@ -12,18 +12,9 @@
</view> </view>
</view> </view>
<image class="select" :src="webUrl+'/20220613104953149068.png'" mode="scaleToFill"/> <image class="select" :src="webUrl+'/20220613104953149068.png'" mode="scaleToFill"/>
</view> </view> -->
<view class="agree-box">
<checkbox-group @change="changeAgree">
<label>
<checkbox value="yes" style="transform:scale(0.8)"/>
</label>
<text @click="changeShow">我已阅读并同意
<text class="btn-show">用户服务协议及隐私政策</text>
</text>
</checkbox-group>
</view>
<view class="dialog-mask" v-if="show"> <view class="dialog-mask" v-if="show">
<view class="dialog-body"> <view class="dialog-body">
@@ -40,19 +31,130 @@
<view class="dialog-mask" v-if="showFillOut"> <view class="dialog-mask" v-if="showFillOut">
<view class="dialog-fill flex flex-col ai-center"> <view class="dialog-fill flex flex-col ai-center">
<view class="title bold">请完善您的头像和昵称</view> <!-- <view class="title bold">请完善您的信息</view> -->
<button class="avatar-wrapper" open-type="chooseAvatar" @chooseavatar="onChooseAvatar"> <view class="v12-align-center v12-justify-start v12-py-4" style="width:550rpx">
<image class="avatar" :src="avatarUrl"></image> <view class="v12-mr-3">
<image class="app-logo__image--inner" :src="webUrl+'/orderIcon/applogo.png'" mode="aspectFit|aspectFill|widthFix" lazy-load="true"></image>
</view>
<view class="v12-dark-text v12-font-bold">
<text class="v12-font-40">
地标文化特产
</text>
<text class="v12-mx-1">
|
</text>
<text class="v12-font-24">
申请使用
</text>
</view>
</view>
<view class="v12-dark-text v12-font-40 v12-mt-3 v12-font-bold" style="width:550rpx">
获取你的昵称头像
</view>
<view class="v12-align-center v12-justify-between v12-mb-3 v12-mt-6" style="width:550rpx">
<view class="v12-align-center">
<view class="v12-dark-text v12-mr-3">
头像
</view>
<button
class="avatar-wrapper v12-ma-0"
open-type="chooseAvatar"
@chooseavatar="onChooseAvatar"
>
<image
:src="avatarUrl"
class="avatar"
/>
</button> </button>
<input type="nickname" class="input-wrapper" placeholder="请输入昵称" @input="inputName" @confirm="inputName" </view>
@blur="inputName"/> <view>
<view class="btn-submit" @click="onSubmit">确认</view> <u-icon name="arrow-right"></u-icon>
</view> </view>
</view> </view>
<view class="v12-align-center v12-justify-between v12-my-4" style="width:550rpx">
<view class="v12-align-center">
<view class="v12-dark-text v12-mr-3">
昵称
</view>
<input
type="nickname"
maxlength="12"
class="input-wrapper "
placeholder="请填写您的昵称"
v-model="nickname"
@input="inputName"
@confirm="inputName"
@blur="inputName"
/>
</view>
<view>
<u-icon name="close" @click="clearName"></u-icon>
</view>
</view>
<!-- <view class="input-wrapper">
<picker
:value="form.birthday"
mode="date"
class="picker"
@change="birthdayChange"
>
{{ form.birthday || '请选择出生日期' }}
</picker>
</view> -->
<!-- <view class="gender-row">
性别
<u-radio-group
v-model="form.gender"
placement="row"
>
<u-radio
:name="1"
:customStyle="{marginRight: '16px'}"
active-color="#C41617"
label="男"
/>
<u-radio
:name="2"
active-color="#C41617"
label="女"
/>
</u-radio-group>
</view> -->
<view class="v12-justify-between v12-py-6 " style="width: 550rpx">
<view class="v12-primary-border v12-primary v12-white-text v12-btn v12-px-8 v12-py-1" @click="onSubmit">允许</view>
<view class="v12-dark-border v12-dark-text v12-btn v12-px-8 v12-py-1" @click="back">拒绝</view>
</view>
</view>
</view>
<view class="app-logo v12-align-center v12-flex-column">
<image class="app-logo__image" :src="webUrl+'/orderIcon/applogo.png'" mode="aspectFit|aspectFill|widthFix" lazy-load="true"></image>
<view class="v12-mt-3 v12-font-32 v12-dark-text v12-font-weight-600">发现家乡好物</view>
</view>
<view class="btn-box"> <view class="btn-box">
<button class="btn-yes" type="default" v-if="canIUseGetUserProfile" @tap="getUserInfoProfile">同意</button> <button class="btn-yes v12-primary" type="mini" @tap="getUserInfoProfile">快捷登录</button>
<button class="btn-no" type="default" @tap="back">拒绝</button> <!-- <button class="btn-no" type="default" @tap="back">拒绝</button> -->
</view>
<view class="agree-box v12-align-center">
<u-checkbox-group
@change="changeAgree"
v-model="isAgree"
>
<u-checkbox
activeColor="#C52733"
size="16"
name="yes"
>
</u-checkbox>
</u-checkbox-group>
<text @click="changeShow">我已阅读并同意
<text class="btn-show">用户服务协议及隐私政策</text>
</text>
<!-- <checkbox-group @change="changeAgree">
<label>
<checkbox value="yes" style="transform:scale(0.6)" iconColor="#C52733" />
</label>
</checkbox-group> -->
</view> </view>
</view> </view>
</template> </template>
@@ -61,33 +163,30 @@
import {mapActions, mapMutations, mapState} from 'vuex' import {mapActions, mapMutations, mapState} from 'vuex'
import cookie from '@/utils/store/cookie' import cookie from '@/utils/store/cookie'
import {login, uploadImage} from '@/utils' import {login, uploadImage} from '@/utils'
import {getAgree} from "@/api/public"; import {getAgree} from "@/api/public"
import {postUserEdit} from "@/api/user"; import {postUserEdit} from "@/api/user"
const defaultAvatarUrl = "/20230506100714762257.png"
export default { export default {
data() { data() {
return { return {
webUrl: this.$VUE_APP_RESOURCES_URL, webUrl: this.$VUE_APP_RESOURCES_URL,
authorize: false, authorize: false,
canIUseGetUserProfile: false,
agreeInfo: {}, agreeInfo: {},
isAgree: false, isAgree: [],
show: false, show: false,
showFillOut: false, showFillOut: false,
nickname: "", nickname: '',
avatarUrl: this.$VUE_APP_RESOURCES_URL + defaultAvatarUrl, avatarUrl: this.$VUE_APP_RESOURCES_URL + '/20230506100714762257.png',
form: {
gender: '',
birthday: ''
}
} }
}, },
computed: { computed: {
...mapState(['isAuthorization', '$deviceType', 'token']), ...mapState(['isAuthorization', '$deviceType', 'token']),
}, },
onLoad() { onLoad() {
if (wx.getUserProfile) {
this.canIUseGetUserProfile = true
}
// 先校验用户是否授权,如果没有授权,显示授权按钮 // 先校验用户是否授权,如果没有授权,显示授权按钮
getAgree().then(({data}) => this.agreeInfo = data); getAgree().then(({data}) => this.agreeInfo = data);
}, },
@@ -106,7 +205,10 @@ export default {
this.show=!this.show; this.show=!this.show;
}, },
changeAgree(event) { changeAgree(event) {
this.isAgree = event.detail.value.length > 0 this.isAgree = event
},
clearName() {
this.nickname = ''
}, },
toLogin() { toLogin() {
this.$yrouter.push({ this.$yrouter.push({
@@ -121,18 +223,19 @@ export default {
}) })
}, },
doneRedirect() { doneRedirect() {
let redirectUrl = cookie.get('redirect') || ""; let redirectUrl = cookie.get('redirect') || ''
redirectUrl = redirectUrl.replace(/\ /g, ''); redirectUrl = redirectUrl.replace(/\ /g, '')
//如果已经是授权页,跳转主页 // 如果已经是授权页,跳转主页
if (redirectUrl == '/pages/authorization/index' || redirectUrl.length === 0) { if (redirectUrl == '/pages/authorization/index' || redirectUrl.length === 0) {
redirectUrl = '/pages/home/index'; redirectUrl = '/pages/home/index'
} }
this.$yrouter.reLaunch({ this.$yrouter.reLaunch({
path: redirectUrl, path: redirectUrl
}) })
}, },
getUserInfoProfile() { getUserInfoProfile() {
if (!this.isAgree) { const _this = this
if (!_this.isAgree[0]) {
uni.showToast({ uni.showToast({
title: "请先阅读并同意《用户服务协议及隐私政策》", title: "请先阅读并同意《用户服务协议及隐私政策》",
icon: "none", icon: "none",
@@ -140,33 +243,33 @@ export default {
}) })
return return
} }
wx.getUserProfile({ wx.getUserProfile({
lang: 'zh_CN', lang: 'zh_CN',
desc: '需要获取您的信息用来展示', desc: '需要获取您的信息用来展示',
success: res => { success: res => {
_this.loginReq(res)
}
})
},
loginReq(res) {
uni.showLoading({ uni.showLoading({
title: '登录中', title: '登录中'
}) })
login(res).then(e => { login(res).then(e => {
let db_nickname = e.data.nickname; const db_nickname = e.data.nickname
if (db_nickname === null || db_nickname === undefined || db_nickname === '' || db_nickname === '微信用户') {
if (db_nickname === null || db_nickname === undefined || db_nickname === "" || db_nickname === "微信用户") { this.showFillOut = true
this.showFillOut = true;
} else { } else {
this.doneRedirect(); this.doneRedirect()
} }
}).catch(error => { }).catch(error => {
uni.showToast({ uni.showToast({
title: error, title: error,
icon: 'none', icon: 'none',
duration: 2000, duration: 2000
}) })
}) })
}, },
})
},
onChooseAvatar(e) { onChooseAvatar(e) {
const {avatarUrl} = e.detail; const {avatarUrl} = e.detail;
this.avatarUrl = avatarUrl; this.avatarUrl = avatarUrl;
@@ -174,6 +277,10 @@ export default {
inputName(e) { inputName(e) {
this.nickname = e.detail.value; this.nickname = e.detail.value;
}, },
birthdayChange(e) {
const value = e.detail.value
this.form.birthday = value
},
onSubmit() { onSubmit() {
let that = this; let that = this;
@@ -205,9 +312,11 @@ export default {
}, },
saveUserInfo() { saveUserInfo() {
let param = { const param = {
nickname: this.nickname, nickname: this.nickname,
avatar: this.avatarUrl avatar: this.avatarUrl,
gender: this.form.gender || 0,
birthday: this.form.birthday || ''
} }
postUserEdit(param).then(res => { postUserEdit(param).then(res => {
if (res.status === 200) { if (res.status === 200) {
@@ -232,10 +341,20 @@ export default {
} }
</script> </script>
<style lang="scss"> <style lang="less">
.app-logo{
margin-top: 70rpx;
}
.app-logo__image--inner{
width: 100rpx;
height: 100rpx;
border-radius: 50%;
}
.pages-auth { .pages-auth {
padding: 148rpx 48rpx; padding: 148rpx 48rpx;
padding: 148rpx 48rpx;
height: 100vh;
box-sizing: border-box;
.tip-1 { .tip-1 {
font-size: 28rpx; font-size: 28rpx;
line-height: 40rpx; line-height: 40rpx;
@@ -279,12 +398,12 @@ export default {
} }
.agree-box { .agree-box {
margin: 200rpx 0 60rpx; // margin: 200rpx 0 60rpx;
font-size: 28rpx; font-size: 28rpx;
color: #666; color: #333;
padding: 0 20rpx;
.btn-show { .btn-show {
color: #000; color: #4099FF;
} }
} }
@@ -302,7 +421,7 @@ export default {
top: 50%; top: 50%;
left: 50%; left: 50%;
transform: translate(-50%, -50%); transform: translate(-50%, -50%);
width: 630rpx; width: 686rpx;
height: 70vh; height: 70vh;
box-sizing: border-box; box-sizing: border-box;
padding: 60rpx; padding: 60rpx;
@@ -335,8 +454,7 @@ export default {
transform: translate(-50%, -50%); transform: translate(-50%, -50%);
box-sizing: border-box; box-sizing: border-box;
overflow: hidden; overflow: hidden;
width: 516rpx; width: 686rpx;
height: 576rpx;
border-radius: 24rpx; border-radius: 24rpx;
background: #fff; background: #fff;
@@ -348,15 +466,14 @@ export default {
} }
.avatar-wrapper { .avatar-wrapper {
width: 180rpx; width: 80rpx;
height: 180rpx; height: 80rpx;
margin-top: 38rpx;
padding: 0; padding: 0;
background: none; background: none;
.avatar { .avatar {
width: 180rpx; width: 80rpx;
height: 180rpx; height: 80rpx;
border-radius: 50%; border-radius: 50%;
} }
} }
@@ -366,21 +483,28 @@ export default {
} }
.input-wrapper { .input-wrapper {
width: 360rpx;
height: 72rpx; height: 72rpx;
margin-top: 32rpx;
background: rgba(248, 249, 251, 1); background: rgba(248, 249, 251, 1);
color: #999; color: #999;
font-size: 32rpx; font-size: 32rpx;
text-align: left;
border-radius: 40rpx;
padding: 0 20rpx;
}
.gender-row {
display: flex;
align-items: center;
margin-top: 32rpx;
}
.picker {
text-align: center; text-align: center;
line-height: 72rpx;
} }
.btn-submit { .btn-submit {
position: absolute;
bottom: 0;
left: 0;
width: 100%; width: 100%;
height: 100rpx; height: 100rpx;
margin: 32rpx 0 0 0;
box-sizing: border-box; box-sizing: border-box;
border-top: 2rpx solid #E0E0E0; border-top: 2rpx solid #E0E0E0;
color: #3A87FC; color: #3A87FC;
@@ -392,9 +516,10 @@ export default {
} }
.btn-box { .btn-box {
width: 338rpx; // width: 338rpx;
margin: 0 auto; // margin: 0 auto;
padding: 0 20rpx;
padding-bottom: 340rpx;
button::after { button::after {
border: none; border: none;
} }
@@ -405,8 +530,10 @@ export default {
} }
.btn-yes { .btn-yes {
background: #FF564A;
color: #fff; color: #fff;
width: 100%;
border-radius: 40rpx;
letter-spacing: 1px;
} }
.btn-no { .btn-no {
@@ -416,4 +543,9 @@ export default {
} }
} }
} }
.app-logo__image{
width: 200rpx;
height: 200rpx;
border-radius: 50%;
}
</style> </style>
+959 -114
View File
File diff suppressed because it is too large Load Diff
+218 -57
View File
@@ -10,14 +10,14 @@
@confirm="search" @confirm="search"
> >
<image <image
:src="webUrl + '/20220903142935869059.png'" :src="webUrl + '/orderIcon/search.png'"
class="icon" class="icon"
mode="scaleToFill" mode="scaleToFill"
@click="search" @click="search"
/> />
</view> </view>
</view> </view>
<view class="aside"> <view class="aside" id="aside">
<view <view
v-for="(item, index) in listGroup" v-for="(item, index) in listGroup"
:key="index" :key="index"
@@ -44,7 +44,7 @@
<view class="fixed-box"> <view class="fixed-box">
<view class="line-location flex ai-center"> <view class="line-location flex ai-center">
<image :src="webUrl + '/20220903142929759087.png'" mode="scaleToFill"></image> <image :src="webUrl + '/20220903142929759087.png'" mode="scaleToFill"></image>
<text class="bold" v-if="location">当前定位{{ location }}</text> <text class="bold" v-if="location">当前城市{{ location }}</text>
<view style="color:#f66" @click="reload()" v-else>定位失败 <view style="color:#f66" @click="reload()" v-else>定位失败
<image :src="webUrl + '/20231215213824297278.png'" mode="scaleToFill" /> <image :src="webUrl + '/20231215213824297278.png'" mode="scaleToFill" />
</view> </view>
@@ -57,9 +57,20 @@
@click="bannerItemTapHandle(banner)" @click="bannerItemTapHandle(banner)"
/> />
</view> </view>
<!--9-2 推荐信息--> <!--全国特产和文玩的推荐信息-->
<view class="recommendInfo" v-if="recommendInfo && type < 2"> <view
<template v-if="(type === 0 && recommendInfo.hotelList) || (type === 1 && recommendInfo.productList)"> v-if="recommendInfo && type < 2"
class="recommendInfo"
>
<!--bug#1060-增加控制-->
<template
v-if="recommendInfo.displayStatus === 1 &&
(
(type === 0 && recommendInfo.hotelList) ||
(type === 1 && recommendInfo.productList)
)
"
>
<view class="red-border-title">{{ recommendInfo.title }}</view> <view class="red-border-title">{{ recommendInfo.title }}</view>
<image <image
:src="recommendInfo.backgroundImage" :src="recommendInfo.backgroundImage"
@@ -79,7 +90,11 @@
class="item flex-0 flex flex-col jc-between ai-center" class="item flex-0 flex flex-col jc-between ai-center"
@click="goToStore(item.hotelId || '')" @click="goToStore(item.hotelId || '')"
> >
<image class="cover" :src="item.hotelImage" mode="scaleToFill" /> <image
:src="item.hotelImage + (item.hotelImage.indexOf('.mp4') > -1 ? '?vframe/jpg/offset/1' : '')"
class="cover"
mode="scaleToFill"
/>
<image class="logo" :src="item.hotelLogo" mode="scaleToFill" /> <image class="logo" :src="item.hotelLogo" mode="scaleToFill" />
<view style="width: 100%;box-sizing: border-box;padding:0 8rpx"> <view style="width: 100%;box-sizing: border-box;padding:0 8rpx">
<view class="name tc one-t">{{ item.hotelName }}</view> <view class="name tc one-t">{{ item.hotelName }}</view>
@@ -114,7 +129,7 @@
@click="select(item)" @click="select(item)"
> >
<view class="has-goods" v-if="type === 0 && item.hasData === 0">暂无特产</view> <view class="has-goods" v-if="type === 0 && item.hasData === 0">暂无特产</view>
<view class="has-goods" v-if="type > 0 && type < 6 && item.hasShop === 0">暂无店铺</view> <view class="has-goods" v-if="type > 0 && type < 6 && item.hasShop === 0 && item.hasAncientTown === 0">暂无店铺</view>
<view class="has-goods" v-if="type === 6 && item.hasData === 0">暂无景点</view> <view class="has-goods" v-if="type === 6 && item.hasData === 0">暂无景点</view>
<image :src="item.icon" mode="scaleToFill"></image> <image :src="item.icon" mode="scaleToFill"></image>
<view class="one-t">{{ item.cityName }}</view> <view class="one-t">{{ item.cityName }}</view>
@@ -122,37 +137,40 @@
</view> </view>
</mescroll-body> </mescroll-body>
</view> </view>
<FunctionGuide :maxStep="maxStep" @hide="setGuide(pageKeyId)" :guideData="functionGuideData" ref="FunctionGuide"></FunctionGuide>
</view> </view>
</template> </template>
<script> <script>
import MescrollMixins from "@/mixins/mescroll-mixins.js"; import MescrollMixins from '@/mixins/mescroll-mixins.js'
import {fetchCity} from "@/api/wenwan"; import {fetchCity} from '@/api/wenwan'
import MescrollBody from "@/components/mescroll-uni/mescroll-body.vue"; import MescrollBody from '@/components/mescroll-uni/mescroll-body.vue'
import {getCurAddress, getLocation} from "@/utils/common.js"; import {getCurAddress, getLocation} from '@/utils/common.js'
import { pageListenMixins } from '@/mixins/pageListenMixins'
import FunctionGuide from '@/components/FunctionGuide'
import GuideMixins from '@/mixins/GuideMixins'
export default { export default {
name: "choseCity", name: 'ChoseCity',
components: { components: {
MescrollBody MescrollBody,
FunctionGuide
}, },
props: {},
mixins: [ mixins: [
MescrollMixins({ MescrollMixins({
getPageData(mescroll) { getPageData(mescroll) {
// 此时mescroll会携带page的参数: mescroll.endSuccess(10)
// let pageNum = mescroll.num; // 页码, 默认从1开始
// let pageSize = mescroll.size; // 页长, 默认每页10条
mescroll.endSuccess(10);
} }
}) }),
pageListenMixins,
GuideMixins
], ],
data() { data() {
return { return {
webUrl: this.$VUE_APP_RESOURCES_URL, webUrl: this.$VUE_APP_RESOURCES_URL,
upOption: { upOption: {
noMoreSize: 10, //如果列表已无数据,可设置列表的总数量要大于半页才显示无更多数据;避免列表数据过少(比如只有一条数据),显示无更多数据会不好看; 默认5 // 如果列表已无数据,可设置列表的总数量要大于半页才显示无更多数据;避免列表数据过少(比如只有一条数据),显示无更多数据会不好看; 默认5
noMoreSize: 10,
auto: false, auto: false,
empty: { empty: {
tip: '暂无城市' tip: '暂无城市'
@@ -162,25 +180,129 @@ export default {
auto: true auto: true
}, },
listGroup: [], listGroup: [],
provinceName: "", provinceName: '',
listCity: [], listCity: [],
navActive: 0, navActive: 0,
keyword: "", keyword: '',
// 0、特产;1、文玩;2、七彩云上;3、特色礼品;4、康养食材;5、千县名品;6、景点门票
type: null, type: null,
location: "", location: '',
banner: {}, banner: {},
recommendInfo: null // 推荐信息 // 推荐信息
}; recommendInfo: null,
pageKeyId: ''
}
},
computed: {
maxStep() {
const stepsMap = {
0: 1,
1: 2,
}
return stepsMap[this.type] || 1
}
}, },
onLoad(options) { onLoad(options) {
this.type = Number(options.type); const type = Number(options.type)
this.location = options.city; this.type = type
switch(type) {
case 0:
this.pageKeyId = 'goodsIndex'
break
case 1:
this.pageKeyId = 'wenwanIndex'
break
case 3:
this.pageKeyId = 'customizedGiftIndex'
break
case 4:
this.pageKeyId = 'wellnessFoodIndex'
break
case 5:
this.pageKeyId = 'countyFamousIndex'
break
default:
this.pageKeyId = ''
break
}
this.location = options.city
if (this.location === undefined) { if (this.location === undefined) {
this.getMapData(); this.getMapData()
}
this.init()
if([0,1] .includes(type)) {
this.queryGuide(this.pageKeyId)
} }
this.init();
}, },
methods: { methods: {
showFunctionGuide() {
if(this._step == this.functionGuideData.step) return
if(this.functionGuideData.step == 1) {
this._step = this.functionGuideData.step
const imgs = [
{
url: this.webUrl + '/引导页素材/全国特产/Group 1-1.png',
style: {
position: 'absolute',
zIndex: 99,
width: '357rpx',
top: '100rpx',
left: '-110rpx',
right: 0,
margin: 'auto',
height: '382rpx',
/* px: ; */
},
isBtn: false
},
{
url: this.webUrl + '/引导页素材/全国特产/Group 1-2.png',
style: {
position: 'absolute',
zIndex: 99,
width: '117rpx',
top: 125*2+'rpx',
left: -120*2+'rpx',
right: 0,
margin: 'auto',
height: '46rpx',
},
isBtn: 'jump'
},
{
url: this.webUrl + '/引导页素材/全国特产/Group 1-3.png',
style: {
position: 'absolute',
zIndex: 99,
width: '117rpx',
top: 125*2+'rpx',
left: 170*2+'rpx',
height: '46rpx',
},
isBtn: 'next'
},
]
this.getElementData('#aside', res=>{
this.setFunctionGuideData({
imgs: imgs,
tipsPosition: '420rpx',
btnGroupPosition: '',
position: {
top: res.top*2 + 'rpx',
left: res.left*2 + 'rpx',
width: `${res.width*2}rpx`,
height: `${res.height*2}rpx`,
}
})
})
return
} else {
if(this.type === 1) {
this.$refs.FunctionGuide.show = false
}
return
}
},
reload() { reload() {
uni.getSetting({ uni.getSetting({
success(res) { success(res) {
@@ -218,20 +340,20 @@ export default {
}) })
}, },
async getMapData() { async getMapData() {
const map = await getLocation(); const map = await getLocation()
if (map) { if (map) {
const {latitude, longitude} = map[1]; const {latitude, longitude} = map[1]
const address = await getCurAddress(latitude, longitude); const address = await getCurAddress(latitude, longitude)
this.location = address[1].data.result.ad_info.city; this.location = address[1].data.result.ad_info.city
} }
}, },
init() { init() {
fetchCity(this.type).then(res => { fetchCity(this.type).then(res => {
if (res.success) { if (res.success) {
this.listGroup = res.data.group; this.listGroup = res.data.group
if (this.listGroup.length > 0) { if (this.listGroup.length > 0) {
this.listCity = this.listGroup[0].city; this.listCity = this.listGroup[0].city
this.provinceName = this.listGroup[0].label; this.provinceName = this.listGroup[0].label
this.recommendInfo = this.listGroup[0].recommendInfo this.recommendInfo = this.listGroup[0].recommendInfo
this.banner = { this.banner = {
...this.listGroup[0], ...this.listGroup[0],
@@ -243,28 +365,29 @@ export default {
}) })
}, },
asideTap(index) { asideTap(index) {
this.navActive = index; this.navActive = index
this.listCity = this.listGroup[index].city; this.listCity = this.listGroup[index].city
this.provinceName = this.listGroup[index].label; this.provinceName = this.listGroup[index].label
this.recommendInfo = this.listGroup[index].recommendInfo this.recommendInfo = this.listGroup[index].recommendInfo
this.banner = { this.banner = {
...this.listGroup[index], ...this.listGroup[index],
icon: this.listGroup[index].icon, icon: this.listGroup[index].icon,
url: this.listGroup[index].uniappUrl url: this.listGroup[index].uniappUrl
} }
//触发加载请求 // 触发加载请求
this.mescroll.scrollTo(0, 0); this.mescroll.scrollTo(0, 0)
this.mescroll && this.mescroll.resetUpScroll(false); this.mescroll && this.mescroll.resetUpScroll(false)
}, },
emptyClick: function () { emptyClick: function () {
//触发加载请求 //触发加载请求
this.mescroll && this.mescroll.triggerDownScroll() this.mescroll && this.mescroll.triggerDownScroll()
}, },
search() { search() {
if(this.keyword === '') return
this.listGroup.findIndex((group, index) => { this.listGroup.findIndex((group, index) => {
let result; let result
group.city.forEach(item => { group.city.forEach(item => {
result = item.cityName.indexOf(this.keyword, 0); result = item.cityName.indexOf(this.keyword, 0)
if (result !== -1) { if (result !== -1) {
this.asideTap(index); this.asideTap(index);
return null; return null;
@@ -276,8 +399,8 @@ export default {
}) })
}, },
select(item) { select(item) {
if (this.type === 0 && item.hasData === 0) return; if (this.type === 0 && item.hasData === 0) return
if ((this.type === 1 || this.type === 2) && item.hasShop === 0) return; if ((this.type === 1 || this.type === 2) && item.hasShop === 0 && item.hasAncientTown === 0) return
uni.setStorageSync("cityName", item.cityName) uni.setStorageSync("cityName", item.cityName)
switch (this.type) { switch (this.type) {
@@ -285,20 +408,20 @@ export default {
uni.navigateTo({ uni.navigateTo({
url: `/pkg_product/views/nativeList?cityId=${item.cityId}` url: `/pkg_product/views/nativeList?cityId=${item.cityId}`
}) })
break; break
case 1: case 1:
uni.navigateTo({ uni.navigateTo({
url: `/wenwan/views/storeList?cityId=${item.cityId}` url: `/wenwan/views/storeList?cityId=${item.cityId}`
}) })
break; break
case 6: case 6:
uni.navigateTo({ uni.navigateTo({
url: `/pkg_product/views/scenicSpot?cityId=${item.cityId}` url: `/pkg_product/views/scenicSpot?cityId=${item.cityId}`
}) })
break; break
default: default:
uni.navigateBack() uni.navigateBack()
break; break
} }
}, },
goToStore(id) { goToStore(id) {
@@ -306,14 +429,49 @@ export default {
return return
} }
uni.navigateTo({ uni.navigateTo({
url: "/pagesInn/inn/innHome?id=" + id url: '/pagesInn/inn/innHome?id=' + id + '&from=' + this.getOptionsParams()
}) })
}, },
goToGoods(productId) { goToGoods(productId) {
if (!productId) { if (!productId) {
return return
} }
this.$global.navToGoods(productId) uni.navigateTo({
url: `/pages/shop/GoodsCon/index?id=${productId}&from=${this.getOptionsParams()}`
})
},
goToExhibition(linkExhibitionId) {
if (!linkExhibitionId) {
return
}
uni.navigateTo({
url: `/pkg_product/views/expoDetails?id=${linkExhibitionId}&from=${this.getOptionsParams()}`
})
},
getOptionsParams() {
// 0、特产;1、文玩;2、七彩云上;3、特色礼品;4、康养食材;5、千县名品;6、景点门票
let from = ''
switch(this.type) {
case 0:
from = 'techan'
break
case 1:
from = 'wenwan'
break
case 3:
from = 'gift'
break
case 4:
from = 'wellness'
break
case 5:
from = 'famous'
break
default:
from = ''
break
}
return from
}, },
bannerItemTapHandle(banner) { bannerItemTapHandle(banner) {
if (!banner) { if (!banner) {
@@ -332,6 +490,9 @@ export default {
case 2: case 2:
this.goToGoods(banner.linkProductId) this.goToGoods(banner.linkProductId)
break break
case 3:
this.goToExhibition(banner.linkExhibitionId)
break
default: default:
break break
} }
@@ -432,10 +593,10 @@ export default {
} }
.item.on { .item.on {
border-left: 6rpx solid #FD574B; border-left: 6rpx solid #C52733;
.name { .name {
color: #FD574B; color: #C52733;
font-weight: bold; font-weight: bold;
} }
} }
@@ -455,7 +616,7 @@ export default {
box-sizing: border-box; box-sizing: border-box;
margin: 18rpx 0; margin: 18rpx 0;
padding: 8rpx 0 0 8rpx; padding: 8rpx 0 0 8rpx;
border-left: 6rpx solid #FD574B; border-left: 6rpx solid #C52733;
color: #262626; color: #262626;
font-size: 30rpx; font-size: 30rpx;
line-height: 30rpx; line-height: 30rpx;
+113 -105
View File
@@ -1,9 +1,19 @@
<template> <template>
<view class="cloud-page"> <view class="cloud-page">
<view class="search-box"> <view class="search-box flex">
<uni-search-bar placeholder="输入搜索关键词" @confirm="search" @clear="clearName"></uni-search-bar> <view class="city-box" @click="goCity('cloud')">
<image
:src="webUrl+'/20220903142929759087.png'"
mode="scaleToFill"
/>
<text>{{ cityName }}</text>
</view>
<uni-search-bar
placeholder="输入搜索关键词"
@confirm="search"
@clear="clearName"
/>
</view> </view>
<view class="nav-box"> <view class="nav-box">
<view <view
v-for="(item, index) in typeList" v-for="(item, index) in typeList"
@@ -12,93 +22,100 @@
@click="changeType(index)" @click="changeType(index)"
> >
<image :src="item.icon" mode="scaleToFill"></image> <image :src="item.icon" mode="scaleToFill"></image>
<view class="nav">{{item.name}}</view> <view class="nav">{{ item.name }}</view>
</view> </view>
</view> </view>
<view class="list-box"> <view class="list-box">
<text class="type-name">{{typeList[type]['name']}}</text> <view
v-if="hotelList.length"
<view class="city-box" @click="goCity('cloud')"> class="list"
<image :src="webUrl+'/20220903142929759087.png'" mode="scaleToFill"></image> >
<text>{{cityName}}</text>
</view>
<view class="list" v-if="hotelList.length">
<custom-waterfalls-flow :value="hotelList" imageKey="cover"> <custom-waterfalls-flow :value="hotelList" imageKey="cover">
<view class="item" v-for="(item,index) in hotelList" :key="index" slot="slot{{index}}" <view
@click="goInnDetail(item)"> v-for="(item,index) in hotelList"
:key="index"
slot="slot{{index}}"
class="item"
@click="goInnDetail(item)"
>
<view class="cover-box"> <view class="cover-box">
<image class="cover" :src="item.cover" mode="scaleToFill"></image> <image
:src="item.cover"
mode="scaleToFill"
class="cover"
/>
<view class="my-mask"> <view class="my-mask">
<image class="icon" :src="webUrl+'/20220510142728577618.png'" mode="scaleToFill"></image> <image
<text>{{item.cityName}}</text> class="icon"
:src="webUrl+'/20220510142728577618.png'"
mode="scaleToFill"
/>
<text>{{ item.cityName }}</text>
</view> </view>
</view> </view>
<view class="more-t">{{item.content}}</view> <view class="more-t">{{ item.content }}</view>
<view class="flex ai-center" style="margin-bottom: 18rpx;"> <view class="flex ai-center" style="margin-bottom: 18rpx;">
<image class="logo" :src="item.logo" mode="scaleToFill"></image> <image
<text class="one-t">{{item.name}}</text> class="logo"
:src="item.logo"
mode="scaleToFill"
/>
<text class="one-t">{{ item.name }}</text>
</view> </view>
</view> </view>
</custom-waterfalls-flow> </custom-waterfalls-flow>
</view> </view>
<view class="v4-nodata" v-else> <view class="v4-nodata" v-else>
<image src="@/static/images/img_nodata.png" mode="scaleToFill" /> <image src="@/static/images/img_nodata.png" mode="scaleToFill" />
<view class="text">暂无数据</view> <view class="text">暂无数据</view>
</view> </view>
</view> </view>
</view> </view>
</template> </template>
<script> <script>
import config from '@/utils/mapConfig'; import config from '@/utils/mapConfig'
import { import {
getHotelTypeList, getHotelTypeList,
getHotelList getHotelList
} from "@/api/inn.js"; } from '@/api/inn.js'
export default {
export default {
data() { data() {
return { return {
webUrl: this.$VUE_APP_RESOURCES_URL, webUrl: this.$VUE_APP_RESOURCES_URL,
typeList: [], typeList: [],
name: "", name: '',
page: 1, page: 1,
type: 0, type: 0,
tabName: "", // 跳转初始分类名 // 跳转初始分类名
tabName: '',
hotelList: [], hotelList: [],
cityName: "丽江市", cityName: '丽江市',
paramCity: "" paramCity: ''
} }
}, },
onLoad(){ onLoad(){
this.fetchTypeList() this.fetchTypeList()
}, },
onShow() { onShow() {
let name = uni.getStorageSync("name"); const name = uni.getStorageSync('name')
if (name) { if (name) {
this.tabName = name; this.tabName = name
uni.removeStorageSync("name"); uni.removeStorageSync('name')
} }
const memCityName = uni.getStorageSync('cityName')
let memCityName = uni.getStorageSync("cityName")
if (memCityName.length) { if (memCityName.length) {
this.cityName = memCityName; this.cityName = memCityName
this.paramCity = memCityName; this.paramCity = memCityName
this.page = 1; this.page = 1
this.hotelList = []; this.hotelList = []
this.fetchList(); this.fetchList()
uni.removeStorageSync('cityName')
uni.removeStorageSync("cityName")
} }
}, },
onReachBottom() { onReachBottom() {
this.page++; this.page++
this.fetchList(); this.fetchList()
}, },
methods: { methods: {
goCity() { goCity() {
@@ -108,18 +125,16 @@
}, },
//获取当前定位地址 //获取当前定位地址
getCurAddress() { getCurAddress() {
var that = this; const that = this
//定位 //定位
uni.showLoading({ uni.showLoading({
title: '定位中...' title: '定位中...'
}); })
uni.getLocation({ uni.getLocation({
type: 'wgs84', type: 'wgs84',
success: function(res) { success: function(res) {
let latitude = res.latitude; let latitude = res.latitude
let longitude = res.longitude; let longitude = res.longitude
// #ifdef H5 // #ifdef H5
Vue.jsonp( Vue.jsonp(
'https://apis.map.qq.com/ws/geocoder/v1/?location=' + latitude + ',' + longitude + '&key=' + 'https://apis.map.qq.com/ws/geocoder/v1/?location=' + latitude + ',' + longitude + '&key=' +
@@ -128,12 +143,12 @@
}).then(json => { }).then(json => {
// Success. // Success.
uni.hideLoading(); uni.hideLoading();
that.cityName = json.result.ad_info.city; that.cityName = json.result.ad_info.city
that.paramCity = json.result.ad_info.city; that.paramCity = json.result.ad_info.city
//定位成功刷新数据 //定位成功刷新数据
that.fetchList() that.fetchList()
}).catch(err => { }).catch(err => {
uni.hideLoading(); uni.hideLoading()
}) })
// #endif // #endif
@@ -144,70 +159,65 @@
success: function(res) { success: function(res) {
uni.hideLoading(); uni.hideLoading();
that.cityName = res.data.result.ad_info.city; that.cityName = res.data.result.ad_info.city
that.paramCity = res.data.result.ad_info.city; that.paramCity = res.data.result.ad_info.city
//定位成功刷新数据 //定位成功刷新数据
that.fetchList() that.fetchList()
}, },
fail: function(res) { fail: function(res) {
uni.hideLoading(); uni.hideLoading()
}, }
complete: function() {} })
});
// #endif // #endif
}, },
fail: function(res) { fail: function(res) {
uni.hideLoading(); uni.hideLoading()
} }
}); })
}, },
fetchTypeList() { fetchTypeList() {
this.hotelList = [] this.hotelList = []
getHotelTypeList().then(res => { getHotelTypeList().then(res => {
if (res.status === 200) { const { status, data } = res
for (let i = 0; i < res.data.length; i++) { if (status === 200) {
if (this.tabName == res.data[i].name) this.type = i; for (let i = 0; i < data.length; i++) {
if (this.tabName == data[i].name) {
this.type = i
} }
}
this.typeList = res.data this.typeList = data
const memCityName = uni.getStorageSync('cityName')
let memCityName = uni.getStorageSync("cityName")
if (memCityName.length) { if (memCityName.length) {
this.cityName = memCityName; this.cityName = memCityName
this.paramCity = memCityName; this.paramCity = memCityName
this.page = 1; this.page = 1
this.list = []; this.list = []
this.fetchList(); this.fetchList()
uni.removeStorageSync('cityName')
uni.removeStorageSync("cityName")
} else { } else {
this.getCurAddress(); this.getCurAddress()
} }
} }
}) })
}, },
search(e) { search(e) {
this.name = e.value; this.name = e.value
this.page = 1; this.page = 1
this.hotelList = []; this.hotelList = []
this.fetchList(); this.fetchList()
}, },
clearName() { clearName() {
this.name = ""; this.name = ''
this.page = 1; this.page = 1
this.hotelList = []; this.hotelList = []
this.fetchList(); this.fetchList()
}, },
changeType(index) { changeType(index) {
this.type = index; this.type = index
this.page = 1; this.page = 1
this.hotelList = []; this.hotelList = []
this.fetchList(); this.fetchList()
}, },
fetchList() { fetchList() {
getHotelList({ getHotelList({
name: this.name, name: this.name,
@@ -216,31 +226,29 @@
cityName: this.paramCity cityName: this.paramCity
}).then(res => { }).then(res => {
if (res.status === 200) { if (res.status === 200) {
this.paramCity = this.cityName; this.paramCity = this.cityName
for (let i = 0; i < res.data.length; i++) { for (let i = 0; i < res.data.length; i++) {
res.data[i].hide = true; res.data[i].hide = true
this.hotelList.push(res.data[i]) this.hotelList.push(res.data[i])
} }
} }
}) })
}, },
goInnDetail(item) {
goInnDetail: function(item) {
//跳转到客栈详情 //跳转到客栈详情
this.$yrouter.push({ this.$yrouter.push({
path: "/pagesInn/inn/innHome", path: '/pagesInn/inn/innHome',
query: { query: {
id: item.id id: item.id
} }
}); })
},
} }
} }
}
</script> </script>
<style scoped lang="less"> <style scoped lang="less">
.cloud-page { .cloud-page {
.search-box { .search-box {
padding: 0 12rpx; padding: 0 12rpx;
background: #fff; background: #fff;
@@ -377,5 +385,5 @@
} }
} }
} }
} }
</style> </style>
+17 -6
View File
@@ -17,6 +17,9 @@
</view> </view>
<view class="more-t">{{ item.content }}</view> <view class="more-t">{{ item.content }}</view>
<view class="flex ai-center bottom"> <view class="flex ai-center bottom">
<view
class="logo"
>
<image <image
v-if="item.logo" v-if="item.logo"
:src="item.logo" :src="item.logo"
@@ -28,7 +31,8 @@
:src="webUrl + '/20230609145651814148.png'" :src="webUrl + '/20230609145651814148.png'"
class="logo" class="logo"
/> />
<text class="one-t">{{ item.name }}</text> </view>
<text class="one-t v12-ml-1">{{ item.name }}</text>
</view> </view>
</view> </view>
</template> </template>
@@ -51,18 +55,24 @@ export default {
} }
</script> </script>
<style scoped lang="less"> <style scoped lang="less">
.logo {
width: 46rpx;
height: 46rpx;
vertical-align: middle;
border-radius: 50%;
}
.cover-box-wrap { .cover-box-wrap {
margin: 20rpx 0 0 0; margin: 20rpx 0 0 0;
.cover-box { .cover-box {
position: relative; position: relative;
width: 328rpx; width: 338rpx;
height: auto; height: auto;
border-radius: 14rpx; border-radius: 14rpx;
overflow: hidden; overflow: hidden;
} }
.cover { .cover {
width: 328rpx; width: 338rpx;
height: 328rpx; height: 338rpx;
vertical-align: middle; vertical-align: middle;
} }
.icon { .icon {
@@ -73,8 +83,8 @@ export default {
vertical-align: middle; vertical-align: middle;
} }
.logo { .logo {
width: 36rpx; width: 46rpx;
height: 36rpx; height: 46rpx;
vertical-align: middle; vertical-align: middle;
margin: 0 8rpx; margin: 0 8rpx;
border-radius: 50%; border-radius: 50%;
@@ -105,6 +115,7 @@ export default {
} }
.bottom { .bottom {
margin: 0 0 20rpx 0; margin: 0 0 20rpx 0;
align-content: center;
} }
} }
</style> </style>
+528 -43
View File
@@ -1,22 +1,65 @@
<template> <template>
<view class="have-fun"> <view class="have-fun tabbar-page">
<view class="top-box"> <view class="top-box">
<view class="search-box flex jc-between ai-center"> <view class="v12-justify-start v12-align-center">
<view class="flex jc-end">
<view class="city-box" @click="goCity('cloud')" id="city-box">
<text style="white-space:nowrap; width: 90rpx" class="v12-primary-text one-t">{{ cityName }}</text>
<image :src="webUrl+'/icon/fun-city-change.png'" mode="scaleToFill"></image>
</view>
</view>
<view class="search-box v12-primary-border flex jc-between ai-center">
<input <input
v-model="name" v-model="name"
type="text" type="text"
placeholder="搜索店铺" placeholder="请输入关键词~"
placeholder-style="color:#949494" placeholder-style="color:#949494"
@confirm="search" @confirm="search"
> >
<view class="search-btn v12-primary v12-white-text v12-radius-60" @click="search">
<text class="v12-font-bold">搜索</text>
<image <image
class="icon" class="icon v12-ml-1"
:src="webUrl+'/20220903142935869059.png'" :src="webUrl+'/orderIcon/搜索 (1).png'"
mode="scaleToFill" mode="scaleToFill"
@click="search"
/> />
</view> </view>
<scroll-view class="type-box flex" scroll-x enable-flex> </view>
</view>
<view class="v12-pa-2" style="position: relative">
<view class="v12-radius-20 v12-px-2 v12-py-1 tip-wrap v12-align-center v12-justify-between">
<view class="v12-align-center">
<image
class="map-icon"
mode="scaleToFill"
:src="webUrl + '/orderIcon/map_white.png'"
></image>
<text style="width: 95%" class="v12-font-24 v12-white-text">定位显示你在 {{ cityName }} 点击可切换其他城市</text>
</view>
<view @click="goCity('cloud')" class="qh-btn v12-white v12-radius-10 v12-font-24 v12-font-bold v12-dark-text v12-px-2">点击切换</view>
</view>
</view>
<view>
<view class="type-box flex" id="type-box">
<view class="first-box">
<view class="first-box__inner">
<view
:class="{
'active': typeIndex === -1
}"
class="item flex-0 flex flex-col jc-center ai-center"
@click="tapType(-1)"
>
<image :src="townConfig.icon" mode="scaleToFill"/>
<view class="name">{{ townConfig.label }}</view>
</view>
</view>
</view>
<!-- <view style="padding-left: 0" class="type-box flex " >
</view> -->
<view class="scroll-box">
<view <view
v-for="(item, index) in typeList" v-for="(item, index) in typeList"
:key="index" :key="index"
@@ -29,13 +72,59 @@
<image :src="item.icon" mode="scaleToFill"/> <image :src="item.icon" mode="scaleToFill"/>
<view class="name">{{ item.name }}</view> <view class="name">{{ item.name }}</view>
</view> </view>
</scroll-view>
</view> </view>
<view class="body"> </view>
<view class="flex jc-end"> </view>
<view class="city-box" @click="goCity('cloud')"> </view>
<image :src="webUrl+'/20220903142929759087.png'" mode="scaleToFill"></image> <view class="type-banner-wrap">
<text>{{ cityName }}</text> <view v-if="currType.titleImage" class="title">
<image
:src="currType.titleImage"
mode="heightFix"
class="img"
/>
</view>
<view v-if="currType.carousel" class="slider-wrap">
<swiper
indicatorDots="true"
indicator-color="rgba(255, 255, 255, .3)"
indicator-active-color="#ffffff"
autoplay
circular
style="height: 330rpx;"
>
<block
v-for="(item, bannerIndex) in currType.carousel"
:key="bannerIndex"
>
<swiper-item>
<view class="swiper-item" @click="typeBannerItemClick(item)">
<image :src="item.carouselImage" class="img" />
</view>
</swiper-item>
</block>
</swiper>
</view>
</view>
<view class="body" v-if="typeIndex === -1" id="body1">
<view class="town-card" v-for="(town, i) in townList" :key="i" @click="toTown(town)">
<!-- <view class="town-title">{{ town.name }}</view> -->
<image :src="town.frontImage" mode="scaleToFill"/>
<view class="v12-primary enter-btn">点击进入
<view class="icon-box"><u-icon name="arrow-rightward" color="#fff" size="8"></u-icon></view>
</view>
</view>
<view class="v4-nodata" v-if="townList.length === 0">
<image src="@/static/images/img_nodata.png" mode="scaleToFill"/>
<view class="text">暂无数据</view>
</view>
</view>
<view class="body" v-else>
<view class="v12-justify-between v12-align-center">
<text class="v12-font-bold" v-if="currType.carousel">推荐</text>
<view class="v12-dark1-text v12-font-28 v12-align-center" @click="handleRefresh">
<u-icon name="reload"></u-icon>
换一换
</view> </view>
</view> </view>
<view v-if="isLoad"> <view v-if="isLoad">
@@ -68,30 +157,47 @@
<view class="text">暂无数据</view> <view class="text">暂无数据</view>
</view> </view>
</view> </view>
<goo-skeleton v-else /> <goo-skeleton
v-else
:show-avatar="false"
/>
</view> </view>
<FunctionGuide @hide="setGuide('findFunIndex')" :maxStep="3" :guideData="functionGuideData" ref="FunctionGuide"></FunctionGuide>
<xdd-tabbar :curr-index="4" />
</view> </view>
</template> </template>
<script> <script>
import { getHotelList, getHotelTypeList } from "@/api/inn.js" import { getHotelList, getHotelTypeList, getAncientTownIcon, getAncientTownList } from "@/api/inn.js"
import { getCurAddress, getLocation } from "@/utils/common" import { getCurAddress, getLocation } from "@/utils/common"
import GooSkeleton from '@/components/GooSkeleton/index.vue'
import FunHotelItem from './components/HotelItem' import FunHotelItem from './components/HotelItem'
import { pageListenMixins } from '@/mixins/pageListenMixins'
import XddTabbar from '@/components/xdd-tabbar'
import FunctionGuide from '@/components/FunctionGuide'
import GuideMixins from '@/mixins/GuideMixins'
export default { export default {
components: { components: {
GooSkeleton, FunHotelItem,
FunHotelItem XddTabbar,
FunctionGuide
}, },
mixins: [pageListenMixins, GuideMixins],
data() { data() {
return { return {
webUrl: this.$VUE_APP_RESOURCES_URL, webUrl: this.$VUE_APP_RESOURCES_URL,
name: '', name: '',
page: 1, page: 1,
typeList: [], typeList: [],
typeIndex: 0, typeIndex: -1,
// 当前选中的类型
currType: {},
cityName: '', cityName: '',
hotelList: [], hotelList: [],
isLoad: false isLoad: false,
pageKeyId: Object.freeze('findFunIndex'),
isNext: false,
townConfig: {},
townList: [],
randomSeed: null
} }
}, },
computed: { computed: {
@@ -102,23 +208,238 @@ export default {
hotelEvenList() { hotelEvenList() {
const arr = this.hotelList.filter(function(item, index) { return index % 2 === 0 }) const arr = this.hotelList.filter(function(item, index) { return index % 2 === 0 })
return arr return arr
}
},
onReachBottom() {
// 后端接口结构需要调整下,需要补充总页数,前端可判断当前页数大于等于总页数则不发送网络请求
if(this.isNext) {
this.page++
const random = this.randomSeed ? 1 : 0
this.fetchList(random, this.randomSeed)
} }
}, },
onLoad() { onLoad() {
this.getMapData() this.currType = {}
getHotelTypeList().then(({data}) => { getHotelTypeList().then(({data}) => {
this.typeList = data; this.typeList = data
this.currType = this.typeIndex === -1 ? {} : data[this.typeIndex]
this.getMapData()
}) })
this.getIcon()
this.queryGuide('findFunIndex')
}, },
onShow() { onShow() {
const memCityName = uni.getStorageSync('cityName') const memCityName = uni.getStorageSync('cityName')
// this.typeIndex = 0
this.name = ''
if (memCityName.length) { if (memCityName.length) {
this.cityName = memCityName this.cityName = memCityName
uni.removeStorageSync('cityName') uni.removeStorageSync('cityName')
this.name = ''
}
},
watch: {
cityName: {
handler(value) {
if(value) {
this.search() this.search()
} }
}, },
immediate: true,
deep: true
}
},
methods: { methods: {
showFunctionGuide() {
if(this._step == this.functionGuideData.step) return
if(this.functionGuideData.step == 1) {
this._step = this.functionGuideData.step
this.getElementData('#city-box', res=>{
const imgs = [
{
url: this.webUrl + '/引导页素材/寻趣味/Group 1/Group 1-1.png',
style: {
position: 'absolute',
zIndex: 99,
width: '390rpx',
top: 0*2+'rpx',
left: res.width*2+'rpx',
height: '162rpx',
/* px: ; */
},
isBtn: false
},
{
url: this.webUrl + '/引导页素材/寻趣味/Group 1/Group 1-2.png',
style: {
position: 'absolute',
zIndex: 99,
width: '117rpx',
top: 80*2+'rpx',
left: -60*2+'rpx',
right: 0,
margin: 'auto',
height: '46rpx',
},
isBtn: 'jump'
},
{
url: this.webUrl + '/引导页素材/寻趣味/Group 1/Group 1-3.png',
style: {
position: 'absolute',
zIndex: 99,
width: '117rpx',
top: 80*2+'rpx',
left: 200*2+'rpx',
height: '46rpx',
},
isBtn: 'next'
},
]
this.setFunctionGuideData({
imgs: imgs,
tipsPosition: '420rpx',
btnGroupPosition: '',
position: {
top: res.top + 'px',
left: res.left + 'px',
width: `${res.width}px`,
height: `${res.height}px`,
}
})
})
return
} else {
if(this.functionGuideData.step == 2) {
this._step = this.functionGuideData.step
this.getElementData('#type-box', res=>{
const imgs = [
{
url: this.webUrl + '/引导页素材/寻趣味/Group 2/Group 2-1.png',
style: {
position: 'absolute',
zIndex: 99,
width: '504rpx',
top: 170*2+'rpx',
left: 0+'rpx',
right: 0,
margin: 'auto',
height: '191rpx',
/* px: ; */
},
isBtn: false
},
{
url: this.webUrl + '/引导页素材/寻趣味/Group 2/Group 2-3.png',
style: {
position: 'absolute',
zIndex: 99,
width: '117rpx',
top: 270*2+'rpx',
left: -160*2+'rpx',
right: 0,
margin: 'auto',
height: '46rpx',
},
isBtn: 'jump'
},
{
url: this.webUrl + '/引导页素材/寻趣味/Group 2/Group 2-2.png',
style: {
position: 'absolute',
zIndex: 99,
width: '117rpx',
top: 270*2+'rpx',
left: 160*2+'rpx',
height: '46rpx',
},
isBtn: 'next'
},
]
this.setFunctionGuideData({
imgs: imgs,
tipsPosition: '420rpx',
btnGroupPosition: '',
position: {
top: res.top + 'px',
left: res.left + 'px',
width: `${res.width}px`,
height: `${(res.height-20)}px`,
}
})
})
return
}
if(this.functionGuideData.step == 3) {
this._step = this.functionGuideData.step
this.getElementData('#body1', res=>{
const imgs = [
{
url: this.webUrl + '/引导页素材/寻趣味/Group 3/Group 3-1.png',
style: {
position: 'absolute',
zIndex: 99,
width: '290rpx',
top: 90*2+'rpx',
left: 0,
right: 0,
margin: 'auto',
height: '165rpx',
/* px: ; */
},
isBtn: false
},
{
url: this.webUrl + '/引导页素材/寻趣味/Group 3/Group 3-2.png',
style: {
position: 'absolute',
zIndex: 99,
width: '97rpx',
top: 60*2+'rpx',
left: 60*2+'rpx',
right: 0,
margin: 'auto',
height: '55rpx',
},
isBtn: 'jump'
},
]
this.setFunctionGuideData({
imgs: imgs,
tipsPosition: '420rpx',
btnGroupPosition: '',
position: {
top: (res.top) + 'px',
left: res.left+10 + 'px',
width: `${res.width-20}px`,
height: `${res.height-20}px`,
}
})
})
return
}
return
}
},
handleRefresh() {
uni.showLoading()
this.page = 1
this.hotelList = []
this.fetchList(1, this.randomSeed)
},
toTown(town) {
uni.navigateTo({
url: `/pages/town/index?id=${town.id}`
})
},
getIcon() {
getAncientTownIcon().then(res => {
this.townConfig = res.data
})
},
goCity() { goCity() {
uni.navigateTo({ uni.navigateTo({
url: `/pages/chose-city/chose-city?type=2&city=${this.cityName}` url: `/pages/chose-city/chose-city?type=2&city=${this.cityName}`
@@ -126,7 +447,7 @@ export default {
}, },
goInnDetail(item) { goInnDetail(item) {
uni.navigateTo({ uni.navigateTo({
url: `/pagesInn/inn/innHome?id=${item.id}` url: `/pagesInn/inn/innHome?id=${item.id}&from=fun`
}) })
}, },
async getMapData() { async getMapData() {
@@ -134,13 +455,19 @@ export default {
if (map.length > 1) { if (map.length > 1) {
const {latitude, longitude} = map[1] const {latitude, longitude} = map[1]
const address = await getCurAddress(latitude, longitude) const address = await getCurAddress(latitude, longitude)
if(!this.cityName) {
this.cityName = address[1].data.result.ad_info.city this.cityName = address[1].data.result.ad_info.city
this.search() }
// this.search()
} }
}, },
tapType(index) { tapType(index) {
if (this.typeIndex === index) return if (this.typeIndex === index) return
this.typeIndex = index this.typeIndex = index
this.randomSeed = null
this.currType = index === -1 ? {} : this.typeList[index]
this.name = ''
this.search() this.search()
}, },
search() { search() {
@@ -149,19 +476,35 @@ export default {
this.hotelList = [] this.hotelList = []
this.fetchList() this.fetchList()
}, },
fetchList() { fetchList(random = 0, randomSeed) {
if(this.typeIndex === -1) {
const params = {
cityName: this.cityName,
page: 1,
limit: 999
}
getAncientTownList(params).then(res => {
this.townList = res.data.records
})
return
}
const param = { const param = {
page: this.page, page: this.page,
type: this.typeList[this.typeIndex].id, type: this.typeList[this.typeIndex].id,
cityName: this.cityName cityName: this.cityName,
random: random,
randomSeed: this.page > 1 ? randomSeed : null
} }
const name = this.name.trim() const name = this.name.trim()
if (name.length > 0) { if (name.length > 0) {
param.name = name param.name = name
} }
getHotelList(param).then(res => { getHotelList(param).then(res => {
const { success, data } = res const { success, data, msg } = res
if (success) { if (success) {
if(random === 1) {
this.randomSeed = msg
}
for (let i = 0; i < data.length; i++) { for (let i = 0; i < data.length; i++) {
const cover = data[i].cover const cover = data[i].cover
data[i].hide = true data[i].hide = true
@@ -173,28 +516,144 @@ export default {
data[i].videoCover = '' data[i].videoCover = ''
} }
this.hotelList.push(data[i]) this.hotelList.push(data[i])
if(data.length < 10) {
this.isNext = false
} else {
this.isNext = true
}
} }
} }
}).finally(() => { }).finally(() => {
this.isLoad = true this.isLoad = true
uni.hideLoading()
}) })
},
typeBannerItemClick(item) {
if (!item.hotelId) return
uni.navigateTo({ url: `/pagesInn/inn/innHome?id=${item.hotelId}` })
} }
} }
} }
</script> </script>
<style scoped lang="less"> <style scoped lang="less">
.map-icon{
width: 30rpx;
height: 30rpx;
margin-right: 5rpx;
}
.qh-btn{
padding-top: 4rpx;
padding-bottom: 4rpx;
// border: thin dashed #999;
white-space: nowrap;
}
.tip-wrap{
background: #AAAEB3;
position: relative;
align-items: self-start !important;
&::before{
position: absolute;
content: '';
border-left: 15rpx solid transparent;
border-right: 15rpx solid transparent;
border-top: 20rpx solid transparent;
border-bottom: 20rpx solid #AAAEB3;
top: -30rpx;
left: 10%;
}
}
.icon-box{
border: 1rpx solid #fff;
border-radius: 100%;
width: 16rpx;
height: 16rpx;
margin-left: 5rpx;
padding: 2rpx;
}
.enter-btn{
color: #fff;
width: fit-content;
display: flex;
align-items: center;
padding: 10rpx 16rpx;
position: absolute;
right: 0;
bottom: 0;
border-radius: 30rpx 0;
font-size: 24rpx;
}
.town-title{
border-radius: 100rpx;
/* border-color: #333; */
// mix-blend-mode: difference;
width: fit-content;
padding: 5rpx 20rpx;
border: 1rpx solid #fff;
color: #fff;
position: absolute;
margin: auto;
top: 20rpx;
left: 0;
right: 0;
}
.town-card{
width: 100%;
height: 400rpx;
background: #fff;
border-radius: 30rpx;
position: relative;
overflow: hidden;
margin-bottom: 30rpx;
image{
width: -webkit-fit-content;
width: inherit;
height: -webkit-fit-content;
height: inherit;
}
}
.first-box{
padding-right: 15rpx;
position: sticky;
left: 0;
background-color: #f5f5f5;
z-index: 9;
}
.first-box__inner{
padding: 10rpx;
background: #fff;
border-radius: 30rpx;
}
.scroll-box{
display: flex;
height: fit-content;
background: #fff;
overflow-x: scroll;
padding: 10rpx;
border-radius: 30rpx;
}
.search-btn{
position: absolute;
top: 2rpx;
bottom: 2rpx;
right: 2rpx;
padding: 0rpx 20rpx;
display: flex;
align-items: center;
font-size: 28rpx;
}
.have-fun { .have-fun {
//padding-top: 120rpx; //padding-top: 120rpx;
.top-box { .top-box {
padding: 32rpx 0 20rpx; padding: 32rpx 0 0rpx;
background: #fff; background: #f5f5f5;
.search-box { .search-box {
width: 686rpx; position: relative;
width: 575rpx;
height: 60rpx; height: 60rpx;
box-sizing: border-box; box-sizing: border-box;
margin: 0 auto; // margin: 0 auto;
padding: 0 24rpx 0 32rpx; padding: 0 24rpx 0 32rpx;
border: 2rpx solid #BBD2D2; border: 2rpx solid #BBD2D2;
border-radius: 30rpx; border-radius: 30rpx;
@@ -210,20 +669,20 @@ export default {
} }
.type-box { .type-box {
height: 180rpx; height: 200rpx;
box-sizing: border-box; box-sizing: border-box;
white-space: nowrap; white-space: nowrap;
padding: 20rpx 20rpx 0 48rpx; padding: 0rpx 20rpx 0 20rpx;
.item { .item {
width: 160rpx; width: 154rpx;
height: 160rpx; height: 154rpx;
margin-right: 20rpx; // margin-right: 20rpx;
border-radius: 26rpx; border-radius: 26rpx;
image { image {
width: 72rpx; width: 92rpx;
height: 72rpx; height: 92rpx;
} }
.name { .name {
@@ -245,16 +704,16 @@ export default {
} }
.body { .body {
padding: 20rpx 32rpx; padding: 0 20rpx 20rpx;
background: #F9F9F9; background: #f5f5f5;
} }
.city-box { .city-box {
display: inline-flex; display: inline-flex;
align-items: center; align-items: center;
padding: 8rpx 18rpx 8rpx 16rpx; padding: 8rpx 20rpx 8rpx 20rpx;
border-radius: 30px; border-radius: 30px;
background: #fff; background: #f5f5f5;
image { image {
width: 32rpx; width: 32rpx;
@@ -272,7 +731,7 @@ export default {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
.list { .list {
width: 328rpx; width: 348rpx;
.item { .item {
width: 100%; width: 100%;
box-sizing: border-box; box-sizing: border-box;
@@ -280,4 +739,30 @@ export default {
} }
} }
} }
.tabbar-page {
padding: 0 0 180rpx 0;
}
.type-banner-wrap {
padding: 0 20rpx;
background-color: #f5f5f5;
.title {
padding: 0 0 20rpx;
.img {
display: block;
height: 48rpx;
}
}
.slider-wrap {
width: 100%;
height: 330rpx;
padding: 0 0 20rpx 0;
.swiper-item {
.img {
display: block;
width: 100%;
height: 330rpx;
}
}
}
}
</style> </style>
+76
View File
@@ -0,0 +1,76 @@
<template>
<view>
<view class="culture v12-d-grid-columns-2">
<view class="img-item " v-for="(item, index) in list" :key="index" @click="viewImg(item)">
<image class="img-item" :src="item" mode="widthFix|heightFix" lazy-load="false"></image>
</view>
</view>
<image
v-if="list.length === 0"
:src="webUrl + '/orderIcon/wu.png'"
class="img-nodata"
mode="scaleToFill"
/>
</view>
</template>
<script>
import {
getCulture,
} from "@/api/product"
export default {
props: {
landmarkDataId: null
},
data() {
return {
webUrl: this.$VUE_APP_RESOURCES_URL,
list: []
}
},
watch: {
landmarkDataId(value) {
if(value) {
this.getData()
}
}
},
mounted() {
this.getData()
},
methods: {
viewImg(item) {
uni.previewImage({
current: item, // 当前显示图片的http链接
urls: this.list || [] // 需要预览的图片http链接列表
})
},
getData() {
getCulture({landmarkDataId: this.landmarkDataId}).then(res => {
this.list = res.data.cultureImages || []
})
}
}
}
</script>
<style lang="scss" scoped>
.culture{
grid-gap: 20rpx 20rpx;
padding: 20rpx;
}
.img-item{
width: 340rpx;
height: 320rpx;
border-radius: 16rpx;
}
.img-nodata {
position: relative;
top: 0;
left: 50%;
transform: translate(-50%, 0);
width: 352rpx;
height: 338rpx;
margin-bottom: 60rpx;
}
</style>
+135
View File
@@ -0,0 +1,135 @@
<template>
<view class="list-box flex flex-wrap">
<view
v-for="item in goods"
:key="item.id"
class="item"
@click="goGoods(item.productId)"
>
<image
:src="webUrl + '/home/mark-land.png'"
class="mark-img"
/>
<image
:src="item.storeImage"
mode="scaleToFill"
class="good-img"
/>
<view class="content flex flex-col jc-between">
<view class="more-t bold">{{ item.title }}</view>
<view class="one-t desc">{{ item.description }}</view>
<view class="flex jc-between ai-center">
<text class="price">{{ item.price }}</text>
<image
@click.stop="$emit('add', item)"
:src="webUrl + '/home/icon-cart.png'"
class="btn"
/>
</view>
</view>
</view>
<image
v-if="goods.length === 0"
:src="webUrl + '/20231023131208675588.png'"
class="img-nodata"
mode="scaleToFill"
/>
</view>
</template>
<script>
export default {
props: {
goods: {
default: () => []
}
},
data() {
return {
webUrl: this.$VUE_APP_RESOURCES_URL,
}
},
methods: {
goGoods(id) {
uni.navigateTo({
url: `/pages/shop/GoodsCon/index?id=${id}&from=landmark`
})
}
}
}
</script>
<style lang="scss" scoped>
.img-nodata {
position: relative;
top: 0;
left: 50%;
transform: translate(-50%, 0);
width: 352rpx;
height: 338rpx;
margin-bottom: 60rpx;
}
.list-box {
margin-top: 24rpx;
padding: 0 20rpx;
.item {
position: relative;
width: 344rpx;
margin-right: 22rpx;
margin-bottom: 22rpx;
border-radius: 20rpx;
background: #FFFFFF;
overflow: hidden;
.mark-img {
position: absolute;
top: 0;
right: 0;
z-index: 3;
display: block;
width: 84rpx;
height: 74rpx;
}
.good-img {
display: block;
width: 344rpx;
height: 344rpx;
}
.content {
height: 156rpx;
padding: 8rpx 8rpx 18rpx 8rpx;
.more-t {
font-size: 28rpx;
line-height: 36rpx;
color: #333;
}
.desc {
padding: 5rpx 0;
height: 34rpx;
color: #FFC543;
font-size: 24rpx;
}
.price {
font-size: 40rpx;
line-height: 40rpx;
font-weight: bold;
color: #C52733;
}
.btn {
display: block;
width: 48rpx;
height: 48rpx;
}
}
}
.item:nth-child(2n) {
margin-right: 0;
}
}
.list-wrap {
margin: 20rpx 0 0 0;
padding: 0 20rpx;
.loadend {
width: 100%;
}
}
</style>
+330
View File
@@ -0,0 +1,330 @@
<template>
<view>
<view v-if="infoArray.length > 0" class="info-wrapper">
<view class="info-list">
<view v-for="(item, index) in infoArray" :key="index" class="info-item">
<view
:class="item.isTop === 1 ? 'info-item-top' : ''"
:style="{
'background-image': item.isTop
? 'url(' + webUrl + '/page/hotel/info-top-bg.png)'
: 'none',
}"
class="info-item-header"
>
<view class="name">
{{ item.title }}
</view>
<view class="intro">
{{ item.content }}
</view>
</view>
<view class="info-item-body">
<video
v-if="item.type === 2"
@play="infoItemViewClick(item, index)"
play-btn-position="center"
:show-fullscreen-btn="false"
class="video-item v12-mt-0"
:src="item.video"
controls
:id="'video-item' + index"
:poster="item.video + '?vframe/jpg/offset/1'"></video>
<img-box
v-else
:imgList="item.images"
:num="item.images.length"
:img-radius="10"
style="width: 100%"
@click="infoItemViewClick(item)"
/>
</view>
<view class="info-item-bottom">
<view class="time">
{{
item.createTime
? item.createTime.replace(/-/g, ".").substr(0, 10)
: ""
}}
</view>
<view class="btns">
<view class="flex">
<image
:src="webUrl + '/20230803152147141807.png'"
class="icon"
/>
<text class="seeNum-txt v12-font-28">{{ item.pv }}</text>
</view>
<view class="flex">
<image
v-if="!item.hasZan"
:src="webUrl + '/page/hotel/zan-off-2.png'"
class="zan-off-icon"
@click="likeInfoItemHandle(item, index, item.zan + 1, true)"
/>
<image
v-else
:src="webUrl + '/page/hotel/zan-on-2.png'"
class="zan-on-icon"
@click="likeInfoItemHandle(item, index, item.zan - 1, false)"
/>
<text
v-show="item.zan > 0"
:class="item.hasZan ? 'on' : ''"
class="seeNum-txt v12-font-28 v12-ml-1"
>{{ item.zan }}</text
>
</view>
</view>
</view>
</view>
</view>
<image
:src="webUrl + '/home/no-data-bg.png'"
mode="widthFix"
class="no-data-loadend"
style="width: 100%;"
/>
</view>
<image
v-if="infoArray.length === 0"
:src="webUrl + '/orderIcon/wu.png'"
class="img-nodata"
mode="scaleToFill"
/>
</view>
</template>
<script>
import {
getNews,
hadLike,
hadView
} from "@/api/product"
import imgBox from '@/components/imageTypeSet/imagebox.vue'
export default {
props: {
landmarkDataId: null
},
components: {
imgBox
},
data() {
return {
webUrl: this.$VUE_APP_RESOURCES_URL,
infoArray: [],
videoPlayers:[]
}
},
watch: {
landmarkDataId(value) {
if(value) {
this.getData()
}
}
},
created() {
this.getData()
},
methods: {
getData() {
const params = {
landmarkDataId: this.landmarkDataId,
page: 1,
limit: 9999
}
getNews(params).then(res => {
this.infoArray = res.data.records || []
})
},
likeInfoItemHandle(item, index, value, voValue) {
hadLike({ landmarkNewsId: item.id }).then(res => {
const { success } = res
if (success) {
this.$dialog.toast({
mes: '操作成功!'
})
this.$set(this.infoArray[index], 'zan', value)
this.$set(this.infoArray[index], 'hasZan', voValue)
}
})
},
infoItemViewClick(item, index) {
if(item.type === 2) {
// const coverCtx = uni.createVideoContext('coverVideo', this)
// coverCtx.pause()
const playerId = 'video-item' + index
if(this.videoPlayers.includes(playerId)) {
this.videoPlayers.forEach(player => {
if(player === playerId) return
const playerCtx = uni.createVideoContext(player, this)
playerCtx.pause()
})
} {
this.videoPlayers.push(playerId)
this.videoPlayers.forEach(player => {
if(player === playerId) return
const playerCtx = uni.createVideoContext(player, this)
playerCtx.pause()
})
}
this.$emit('video')
}
uni.$u.debounce(() => {
hadView({ landmarkNewsId: item.id }).finally(() => {
this.infoArray.map(info => {
if (info.id === item.id) {
info.pv += 1
}
})
})
}, 500)
},
}
};
</script>
<style lang="scss" scoped>
.video-item {
width: 100%;
height: 400rpx;
border-radius: 10rpx;
}
.info-wrapper{
padding: 20px 10px;
}
.info-item + .info-item {
margin: 22rpx 0 0 0;
}
.info-item {
border-radius: 10rpx;
background-color: #fff;
.info-item-header {
position: relative;
padding: 20rpx 20rpx 0 20rpx;
&.info-item-top {
padding-top: 60rpx;
background-size: 100% 80rpx;
background-repeat: no-repeat;
background-image: url();
}
.name {
font-size: 16px;
color: #333;
font-weight: bold;
}
.intro {
margin: 10rpx 0 0 0;
color: #666;
font-size: 14px;
}
}
.info-item-body {
padding: 0 20rpx 20rpx 20rpx;
.video {
padding: 20rpx 0 0 0;
.video-item {
width: 100%;
height: 400rpx;
border-radius: 10rpx;
}
}
}
.info-item-bottom {
display: flex;
align-items: center;
padding: 20rpx;
border-top: 1px solid #f1f1f1;
font-size: 16px;
.time {
flex: 1;
color: #999999;
font-size: 28rpx;
}
.btns {
display: flex;
color: #999;
.flex + .flex {
margin: 0 0 0 32rpx;
}
.flex {
align-items: center;
}
.icon {
width: 32rpx;
height: 32rpx;
margin: 0 8rpx 0 0;
}
.zan-off-icon {
width: 32rpx;
height: 32rpx;
}
.zan-on-icon {
width: 32rpx;
height: 32rpx;
}
.seeNum-txt {
&.on {
color: #D81E06;
}
}
.more-btn {
position: relative;
.more-wrapper {
position: absolute;
right: -20rpx;
top: -150rpx;
z-index: 5;
width: 200rpx;
border-radius: 12rpx;
background-color: #fff;
box-shadow: 0px 1px 6px rgba(0,0,0,0.16);
.more-item + .more-item {
border-top: 1px solid #d5d5d5;
}
.more-item {
display: flex;
align-items: center;
justify-content: center;
height: 70rpx;
font-size: 14px;
color: #333;
.more-icon {
width: 36rpx;
height: 36rpx;
margin: 0 10rpx 0 0;
}
}
}
}
}
}
}
.info-item-top {
padding-top: 60rpx;
background-size: 100% 80rpx;
background-repeat: no-repeat;
background-image: url();
}
.name {
font-size: 16px;
color: #333;
font-weight: bold;
}
.intro {
margin: 10rpx 0 0 0;
color: #666;
font-size: 14px;
}
.img-nodata {
position: relative;
top: 0;
left: 50%;
transform: translate(-50%, 0);
width: 352rpx;
height: 338rpx;
margin-bottom: 60rpx;
}
</style>
+163
View File
@@ -0,0 +1,163 @@
<template>
<view class="policy">
<view class="list-item" v-for="(item, index) in currentList" :key="index" @click="fileItemClick(item)">
<view class="v12-justify-start v12-align-center">
<view class="v12-font-bold v12-font-28">·</view>
<view class="item-title">{{ item.title }}</view>
</view>
<view class="item-action v12-dark"><u-icon name="arrow-right" color="#fff" size="8"></u-icon></view>
</view>
<view class="more-wrap">
<view class="more-btn v12-primary v12-align-center" @click="showMore" v-if="list.length > 0">
{{ isMore ? '查看更多' : '查看更多' }}
<view class="item-action v12-white"><u-icon name="arrow-right" color="#C52733 " size="12"></u-icon></view>
</view>
</view>
<image
v-if="list.length === 0"
:src="webUrl + '/orderIcon/wu.png'"
class="img-nodata"
mode="scaleToFill"
/>
</view>
</template>
<script>
import {
getPorjectPolicyFiles,
} from "@/api/product"
export default {
props: {
landmarkDataId: null
},
data() {
return {
webUrl: this.$VUE_APP_RESOURCES_URL,
list: [],
currentList: [],
isMore: false
}
},
watch: {
landmarkDataId(value) {
if(value) {
this.getData()
}
}
},
mounted() {
this.getData()
},
methods: {
getData() {
const params = {
landmarkDataId: this.landmarkDataId,
page: 1,
limit: 99999
}
getPorjectPolicyFiles(params).then(res => {
this.list = res.data.records || []
if(this.isMore) {
this.currentList = this.list
} else {
this.currentList = this.list.filter((item, index) => index < 3)
}
})
},
showMore() {
// this.isMore = !this.isMore
// if(this.isMore) {
// this.currentList = this.list
// } else {
// this.currentList = this.list.filter((item, index) => index < 3)
// }
uni.navigateTo({ url: `/pages/home/searchPage?id=${this.landmarkDataId}&type=2` })
},
fileItemClick(file) {
const url = file.attachment || ''
if (!url) return
uni.downloadFile({
url,
success: res => {
const filePath = res.tempFilePath
wx.openDocument({
filePath,
fail: (err) => {
console.log(err)
}
})
}
})
},
}
}
</script>
<style lang="scss" scoped>
.more-btn{
.item-action{
width: 20rpx;
height: 20rpx;
margin-left: 10rpx;
}
}
.policy{
padding: 20rpx;
background: #f0f0f0;
border-radius: 24rpx;
}
.list-item{
display: flex;
justify-content: space-between;
background: #fff;
margin-bottom: 20rpx;
border-radius: 24rpx;
align-items: center;
padding: 10rpx 20rpx;
}
.item-action{
font-size: 22rpx;
width: 24rpx;
height: 24rpx;
color: #fff;
padding: 5rpx;
border-radius: 50%;
display: flex;
justify-content: center;
align-items: center;
line-height: 24rpx;
}
.item-title{
font-size: 24rpx;
color: #333;
margin-left: 10rpx;
max-width: 520rpx;
}
.log-img{
width: 68rpx;
height: 68rpx;
background: rgba(197,39,51,0.39);
border-radius: 50%;
}
.more-wrap{
display: flex;
align-content: center;
justify-content: center;
}
.more-btn{
color: #fff;
font-size: 28rpx;
padding: 5rpx 20rpx;
border-radius: 30rpx;
}
.img-nodata {
position: relative;
top: 0;
left: 50%;
transform: translate(-50%, 0);
width: 352rpx;
height: 338rpx;
margin-bottom: 60rpx;
}
</style>
+148
View File
@@ -0,0 +1,148 @@
<template>
<view class="projects">
<view class="tabs-wrap">
<view
@click="handleTab(item.value)"
class="tab-item"
:class="{
'tab-isActived': actived === item.value
}"
v-for="(item, index) in tabs"
:key="index">
<view
:class="{
'tab-isActived': actived === item.value,
'no-actived-1': actived === 2 && item.value === 1,
'no-actived-2': actived === 1 && item.value === 2,
'no-actived-3': actived === 3 && item.value === 2,
'no-actived-4': actived === 2 && item.value === 3,
}"
>
<image class="tab-icon" :src="webUrl + '/orderIcon/' + item.icon" mode="aspectFit|aspectFill|widthFix"></image>
{{ item.name }}
<!-- <view>
<view>{{ item.name }}</view>
</view> -->
</view>
</view>
</view>
<view
class="content"
:class="{
'first-one': actived === 1,
'last-one': actived === 3
}"
>
<recommend v-if="actived === 1" :landmarkDataId="landmarkDataId"></recommend>
<policy v-if="actived === 2" :landmarkDataId="landmarkDataId"></policy>
<serviec v-if="actived === 3" :info="info"></serviec>
</view>
</view>
</template>
<script>
import recommend from './recommend.vue'
import policy from './policy.vue'
import serviec from './serviec.vue'
export default {
components: {
recommend,
policy,
serviec
},
props: {
landmarkDataId: null,
info: {
default:() => {}
}
},
data() {
return {
webUrl: this.$VUE_APP_RESOURCES_URL,
actived: 1,
tabs: [
{name: '企业推荐', value: 1, icon: 'qytj.png'},
{name: '政策', value: 2, icon: 'zc.png'},
{name: '服务', value: 3, icon: 'fw.png'},
]
}
},
methods: {
handleTab(value) {
this.actived = value
}
}
}
</script>
<style lang="scss" scoped>
.tab-icon{
height: 30rpx;
width: 30rpx;
margin-right: 10rpx;
}
.fit-box-inner{
background: #f0f0f0;
width: initial;
height: inherit;
width: 40rpx;
}
.first-one{
border-radius: 0 24rpx 24rpx 24rpx !important;
}
.last-one{
border-radius: 24rpx 0 24rpx 24rpx !important;
}
.fit-box{
width: 40rpx;
height: initial;
background: #fff;
display: flex;
}
.projects{
padding: 20rpx;
}
.tabs-wrap{
display: flex;
justify-content: space-between;
}
.tab-item{
text-align: center;
flex: 1;
font-size: 32rpx;
font-weight: bold;
background: #fff;
view{
padding: 20rpx 0;
background: #f0f0f0;
width: inherit;
height: inherit;
display: flex;
justify-content: center;
align-items: center
}
}
.no-actived-1{
border-radius: 0 0 24rpx 0 !important;
}
.no-actived-2{
border-radius: 0 0 0 24rpx !important;
}
.no-actived-3{
border-radius: 0 0 24rpx 0 !important;
}
.no-actived-4{
border-radius: 0 0 0 24rpx !important;
}
.tab-isActived{
background: #fff !important;
border-radius: 24rpx 24rpx 0 0 !important;
position: relative;
}
.content{
background: #fff;
padding: 20rpx 10rpx;
border-radius: 24rpx;
}
</style>
+162
View File
@@ -0,0 +1,162 @@
<template>
<view class="recommend">
<view class="list-item" v-for="(item, index) in currentList" :key="index" @click="toStore(item.hotelId)">
<view class="v12-justify-start v12-align-center">
<view class="log-img">
<image class="log-img" :src="item.logo" mode="aspectFit|aspectFill|widthFix"></image>
</view>
<view class="item-title one-t">{{ item.name }}</view>
</view>
<view class="item-action-wrap v12-primary">
点击查看
<view class="item-action v12-white"><u-icon name="arrow-right" color="#C52733" size="8"></u-icon></view>
</view>
</view>
<view class="more-wrap" v-if="isMore ? isMore : list.length > 3">
<view class="more-btn v12-primary" @click="showMore">
{{ isMore ? '收起' : '查看更多' }}
<view class="item-action v12-white"><u-icon name="arrow-right" color="#C52733 " size="12"></u-icon></view>
</view>
</view>
<image
v-if="list.length === 0"
:src="webUrl + '/orderIcon/wu.png'"
class="img-nodata"
mode="scaleToFill"
/>
</view>
</template>
<script>
import {
getPorjectRecommend,
} from "@/api/product"
export default {
props: {
landmarkDataId: null
},
data() {
return {
webUrl: this.$VUE_APP_RESOURCES_URL,
list: [],
currentList: [],
isMore: false
}
},
watch: {
landmarkDataId(value) {
if(value) {
this.getData()
}
}
},
mounted() {
this.getData()
},
methods: {
getData() {
getPorjectRecommend({landmarkDataId: this.landmarkDataId}).then(res => {
this.list = res.data || []
if(this.isMore) {
this.currentList = this.list
} else {
this.currentList = this.list.filter((item, index) => index < 3)
}
})
},
toStore(id) {
if (!id) {
return
}
uni.navigateTo({
url: '/pagesInn/inn/innHome?id=' + id
})
},
showMore() {
this.isMore = !this.isMore
if(this.isMore) {
this.currentList = this.list
} else {
this.currentList = this.list.filter((item, index) => index < 3)
}
}
}
}
</script>
<style lang="scss" scoped>
.more-btn{
display: flex;
align-items: center;
justify-content: center;
.item-action{
width: 20rpx;
height: 20rpx;
margin-left: 10rpx;
padding: 5rpx;
}
}
.recommend{
padding: 20rpx;
background: #f0f0f0;
border-radius: 24rpx;
}
.list-item{
display: flex;
justify-content: space-between;
background: #fff;
margin-bottom: 20rpx;
border-radius: 24rpx;
align-items: center;
padding: 10rpx 20rpx;
}
.item-action-wrap{
font-size: 22rpx;
display: flex;
align-items: center;
border-radius: 30rpx;
color: #fff;
padding: 5rpx 10rpx;
}
.item-action{
width: 20rpx;
height: 20rpx;
display: flex;
align-items: center;
justify-content: center;
border-radius: 50%;
margin-left: 10rpx;
}
.item-title{
font-size: 26rpx;
color: #333;
margin-left: 20rpx;
max-width: 180rpx;
}
.log-img{
width: 68rpx;
height: 68rpx;
border-radius: 50%;
}
.more-wrap{
display: flex;
align-content: center;
justify-content: center;
}
.more-btn{
color: #fff;
font-size: 28rpx;
padding: 5rpx 20rpx;
border-radius: 30rpx;
}
.img-nodata {
position: relative;
top: 0;
left: 50%;
transform: translate(-50%, 0);
width: 352rpx;
height: 338rpx;
margin-bottom: 60rpx;
}
</style>
+124
View File
@@ -0,0 +1,124 @@
<template>
<view class="service">
<view class="map-cont">
<map
:longitude="info.longitude"
:latitude="info.latitude"
:markers="[{latitude: info.latitude,longitude: info.longitude,width: 20, height: 25, iconPath: webUrl + '/page/qianxian/icon-location.png'}]"
style="width: 100%;height: 100%; border-radius: 20rpx;"
/>
</view>
<view class="v12-mt-3 info-wrap">
<view>
<view class="v12-font-32 v12-font-bold v12-mb-2">{{ info.name || '' }}</view>
<view class="v12-font-24 v12-mb-1 v12-dark1-text">办公时间:{{ info.officeTime || '' }}</view>
<view class="v12-font-24 v12-mb-1 v12-dark1-text">{{ info.address || '' }}</view>
</view>
<view class="action-wrap">
<view @click="showLocation">
<view>
<image :src="webUrl + '/page/qianxian/icon-addr.png'" class="img" />
</view>
<view class="text-center">导航</view>
</view>
<view @click="call">
<view>
<image :src="webUrl + '/page/qianxian/icon-phone.png'" class="img" />
</view>
<view class="text-center">咨询</view>
</view>
</view>
</view>
<view style="padding: 0 20rpx;"><u-divider></u-divider></view>
<view class="intro-wrap">
<view class="v12-dark-text v12-font-bold">
简介
</view>
<view class="intro-text">
{{ info.intro || '' }}
</view>
</view>
</view>
</template>
<script>
export default {
props: {
info: {
default: () => {}
}
},
data() {
return {
webUrl: this.$VUE_APP_RESOURCES_URL,
}
},
mounted() {
console.log(this.info);
},
methods: {
showLocation() {
console.log(this.info);
if (!this.info.latitude || !this.info.longitude) {
this.$dialog.error('暂无位置信息')
} else {
uni.openLocation({
latitude: this.info.latitude,
longitude: this.info.longitude
})
}
},
call() {
if (this.info.tel) {
uni.makePhoneCall({
phoneNumber: this.info.tel
})
} else {
this.$dialog.error('电话为空')
}
},
}
}
</script>
<style lang="scss" scoped>
.intro-text{
color: #999;
font-size: 24rpx;
margin-top: 20rpx;
}
.intro-wrap{
padding: 0 20rpx 20rpx;
}
.action-wrap{
display: flex;
align-items: center;
.text-center{
text-align: center;
font-size: 24rpx;
color: #666;
}
}
.info-wrap{
display: flex;
justify-content: space-between;
padding: 40rpx 20rpx 0;
}
.service{
position: relative;
}
.map-cont {
height: 400rpx;
border-radius: 20rpx;
background: #f2f1ed;
padding: 20rpx;
box-sizing: border-box;
}
.img{
display: block;
width: 64rpx;
height: 64rpx;
margin: 0 0 16rpx 16rpx;
}
</style>
+147
View File
@@ -0,0 +1,147 @@
<template>
<view v-if="posterImageStatus" class="poster-first">
<view class="poster-pop">
<img
src="@/static/images/poster-close.png"
mode="widthFix"
class="close"
@click="posterImageClose"
/>
<image
:src="posterImage"
alt="tp"
class="poster-image"
:show-menu-by-longpress="false"
mode="widthFix"
/>
<view class="v12-white-text v12-radius-20 share-btn" @click="saveImg(posterImage)">保存图片</view>
</view>
<view class="mask"></view>
</view>
</template>
<script>
import { getShareImg } from "@/api/product";
export default {
name: "LandMarkShareImg",
data: function () {
return {
posterImage: "",
posterImageStatus: false,
};
},
methods: {
saveImg(url) {
uni.showLoading({
mask:true,
})
uni.downloadFile({
url: url, // 文件的下载地址
success(res) {
if (res.statusCode === 200) {
let tempFilePath = res.tempFilePath; // 临时文件路径
uni.saveImageToPhotosAlbum({
filePath: tempFilePath,
success:(success)=> {
uni.showToast({
title: "保存成功",
icon: "none",
mask: true,
});
},
fail(err) {
uni.showToast({
title: "保存失败,请重新尝试",
icon: "none",
mask: true,
});
},
})
}
},
});
},
posterImageClose() {
this.posterImageStatus = false;
this.$emit("setPosterImageStatus");
},
savePosterPath(id) {
uni.showLoading({ title: "海报生成中", mask: true });
getShareImg(id)
.then((res) => {
this.posterImage = res.data;
this.posterImageStatus = true;
})
.finally(() => {
uni.hideLoading();
});
},
},
};
</script>
<style scoped lang="less" lang="less">
.share-btn{
text-align: center;
padding: 20rpx 0;
font-size: 28rpx;
background: #ff564a;
}
.poster-first {
overscroll-behavior: contain;
}
.poster-pop {
width: 6 * 100rpx;
height: 8 * 100rpx;
position: fixed;
left: 50%;
transform: translateX(-50%);
z-index: 99;
top: 50%;
margin-top: -4.6 * 100rpx;
}
.poster-pop .canvas {
background-color: #ffffff;
height: 8 * 100rpx;
}
.poster-pop .poster-image {
width: 100%;
height: auto;
border-radius: 20rpx;
}
.poster-pop .close {
width: 0.46 * 100rpx;
height: 0.75 * 100rpx;
position: fixed;
right: 0;
top: -0.73 * 100rpx;
display: block;
}
.poster-pop .save-poster {
background-color: #df2d0a;
font-size: 0.22 * 100rpx;
color: #fff;
text-align: center;
height: 0.76 * 100rpx;
line-height: 0.76 * 100rpx;
width: 100%;
margin-top: -0.04 * 100rpx;
}
.poster-pop .keep {
color: #fff;
text-align: center;
font-size: 0.25 * 100rpx;
margin-top: 0.1 * 100rpx;
}
.mask {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: rgba(0, 0, 0, 0.6);
z-index: 9;
}
</style>
+1702 -940
View File
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+383 -365
View File
@@ -1,429 +1,444 @@
<script> <template>
import {getProvince, getProvinceGoods, getProvinceList} from "@/api/product"; <view class="pkg-product-land-mark">
<view v-if="isLoad">
<view class="top-wrap">
<view class="top-box">
<view class="nav flex" id="nav-dibiao">
<view
v-for="(item,index) in navList"
:key="index"
:class="{
'active': navIndex === index
}"
class="flex flex-0 ai-center nav-item"
@click="changeNav(index)"
>
<image
:src="webUrl + '/home/landmark-icon.png'"
class="bg"
/>
{{ item.provinceName }}
</view>
</view>
<view class="view-box">
<view class="map-box">
<image
:src="mapData.mapImage"
mode="widthFix"
class="img-map"
/>
</view>
<view class="share-btn" @click="toShare"><u-icon name="share-square" color="#C52733"></u-icon>分享给好友</view>
</view>
</view>
</view>
<view
class="middle-img-wrap"
>
<image
v-if="mapData.middleImage"
:src="mapData.middleImage"
mode="widthFix"
class="img"
/>
<view class="tabs-wrap">
<view @click="handleTab(item.value)" :class="{ 'tab-actived' : item.value === actived }" class="tab-item" v-for="(item, index) in tabs" :key="index">{{ item.name }}</view>
</view>
</view>
<view class="list-wrap" id="list-wrap">
<view v-if="actived === 1">
<projects :landmarkDataId="landmarkDataId" :info="mapData.serviceInfo"></projects>
</view>
<view v-if="actived === 2">
<culture :landmarkDataId="landmarkDataId"></culture>
</view>
<view v-if="actived === 3">
<information :landmarkDataId="landmarkDataId"></information>
</view>
<view v-if="actived === 4">
<goods :goods="goods" v-if="goods.length > 0" @add='addToCart($event, "productId")'></goods>
<!-- <image
v-if="isCompleteLoadGood"
:src="webUrl + '/home/no-data-bg.png'"
mode="widthFix"
class="loadend"
/> -->
<view class="v12-px-6" >
<u-divider :text="goods.length === 0 ? ' · 暂无数据 · ' : ' · 已经到底啦 · '" textPosition="center"></u-divider>
</view>
</view>
</view>
</view>
<goo-skeleton
v-else
:show-avatar="false"
/>
<shareImg ref="shareImg"></shareImg>
<ProductWindow
ref="attrWindow"
:attr="attr"
:cartNum="cart_num"
:showOk="true"
@changeFun="changeFun"
@ok="handleOk"
/>
<FunctionGuide @hide="setGuide('landmarkGoodsIndex')" :maxStep="2" :guideData="functionGuideData" ref="FunctionGuide"></FunctionGuide>
</view>
</template>
<script>
import {
getProvince,
getProvinceGoods,
getProvinceList
} from "@/api/product"
import goods from "./components/goods.vue"
import { pageListenMixins } from '@/mixins/pageListenMixins'
import goCartMixin from '@/mixins/goCartMixins'
import projects from './components/projects.vue'
import culture from "./components/culture.vue"
import information from "./components/information.vue"
import shareImg from "./components/shareImg.vue"
import ProductWindow from '@/components/ProductWindow'
import FunctionGuide from '@/components/FunctionGuide'
import GuideMixins from '@/mixins/GuideMixins'
export default { export default {
name: "landMark", name: 'LandMarkPage',
components: {
goods,
projects,
culture,
information,
shareImg,
ProductWindow,
FunctionGuide
},
mixins: [pageListenMixins, goCartMixin, GuideMixins],
data() { data() {
return { return {
actived: 1,
tabs: [
{name: '项目', value: 1},
{name: '文化', value: 2},
{name: '资讯', value: 3},
{name: '产品', value: 4},
],
webUrl: this.$VUE_APP_RESOURCES_URL, webUrl: this.$VUE_APP_RESOURCES_URL,
keyword: '', keyword: '',
isLoad: false,
page: 1, page: 1,
navList: [], navList: [],
navIndex: 0, navIndex: 0,
mapData: null, mapData: null,
mapLocations: [],
goods: [], goods: [],
directionClass: ['', 'up', 'right', 'down', 'left'], isCompleteLoadGood: false,
pageKeyId: Object.freeze('landmarkGoodsIndex'),
posterImageStatus: false,
sceneId: null
} }
}, },
computed: { computed: {
topBoxBgColor() { landmarkDataId() {
return this.navList.length > 0 ? this.navList[this.navIndex]['backgroundColor'] : '#FFFFFF'; return this.navList[this.navIndex] ? this.navList[this.navIndex]['id'] : null
},
viewBoxBgColor() {
return this.mapData?.backgroundColor || '#FFFFFF';
},
scale() {
return 718 / (this.mapData?.mapImageWidth || 1);
} }
}, },
onLoad() { onLoad(opts) {
this.getNavList(); console.log('进入地标页');
console.log(opts, '地标opts');
if(opts && opts.scene) {
console.log(opts.scene, 'opts.scene');
this.sceneId = decodeURIComponent(opts.scene).split('&')[0].split('=')[1]
}
this.getNavList()
this.queryGuide('landmarkGoodsIndex')
},
onHide() {
this.pageToHideHandle()
}, },
onReachBottom() { onReachBottom() {
this.page++; if (this.isCompleteLoadGood) {
this.fetchGoods(); return
}
this.page++
this.fetchGoods()
}, },
methods: { methods: {
showFunctionGuide() {
if(this._step == this.functionGuideData.step) return
if(this.functionGuideData.step == 1) {
this._step = this.functionGuideData.step
this.getElementData('#nav-dibiao', res=>{
const imgs = [
{
url: this.webUrl + '/引导页素材/地标好物/Group1/Group 1-1.png',
style: {
position: 'absolute',
zIndex: 99,
width: '495rpx',
top: 50*2+'rpx',
left: 0,
right: 0,
margin: 'auto',
height: '194rpx',
/* px: ; */
},
isBtn: false
},
{
url: this.webUrl + '/引导页素材/地标好物/Group1/Group 1-2.png',
style: {
position: 'absolute',
zIndex: 99,
width: '117rpx',
top: 160*2+'rpx',
left: -160*2+'rpx',
right: 0,
margin: 'auto',
height: '46rpx',
},
isBtn: 'jump'
},
{
url: this.webUrl + '/引导页素材/地标好物/Group1/Group 1-3.png',
style: {
position: 'absolute',
zIndex: 99,
width: '117rpx',
top: 160*2+'rpx',
left: 160*2+'rpx',
height: '46rpx',
},
isBtn: 'next'
},
]
this.setFunctionGuideData({
imgs: imgs,
tipsPosition: '420rpx',
btnGroupPosition: '',
position: {
top: res.top + 'px',
left: res.left + 'px',
width: `${res.width}px`,
height: `${res.height}px`,
}
})
})
return
} else {
if(this.functionGuideData.step == 2) {
this._step = this.functionGuideData.step
this.getElementData('#list-wrap', res=>{
const imgs = [
{
url: this.webUrl + '/引导页素材/地标好物/Group2/Group 2-1.png',
style: {
position: 'absolute',
zIndex: 99,
width: '450rpx',
top: 300*2+'rpx',
left: 0,
right: 0,
margin: 'auto',
height: '174rpx',
/* px: ; */
},
isBtn: false
},
{
url: this.webUrl + '/引导页素材/地标好物/Group2/Group 2-2.png',
style: {
position: 'absolute',
zIndex: 99,
width: '117rpx',
top: 280*2+'rpx',
left: -120*2+'rpx',
right: 0,
margin: 'auto',
height: '46rpx',
},
isBtn: 'jump'
},
{
url: this.webUrl + '/引导页素材/地标好物/Group2/Group 2-3.png',
style: {
position: 'absolute',
zIndex: 99,
width: '117rpx',
top: 280*2+'rpx',
left: 180*2+'rpx',
height: '46rpx',
},
isBtn: 'next'
},
]
uni.pageScrollTo({
scrollTop: res.top,
duration: 300
})
this.setFunctionGuideData({
imgs: imgs,
tipsPosition: '420rpx',
btnGroupPosition: '',
position: {
bottom: 0,
left: res.left + 'px',
width: `${res.width}px`,
height: `${(res.height) + 41}px`,
}
})
})
return
}
return
}
},
toShare() {
this.$refs.shareImg.savePosterPath(this.landmarkDataId)
},
handleTab(value) {
this.actived = value
},
getNavList() { getNavList() {
getProvinceList().then(({data}) => { getProvinceList().then(({data}) => {
this.navList = data; this.navList = data
this.changeNav(this.navIndex); if(this.sceneId) {
}); this.navIndex = this.navList.map(e => +e.id).indexOf(+this.sceneId)
console.log(this.navIndex, 'navIndex');
}
this.changeNav(this.navIndex)
})
}, },
search() {
this.page = 1;
this.fetchGoods();
},
changeNav(index) { changeNav(index) {
this.navIndex = index; this.navIndex = index
this.page = 1; this.page = 1
this.getMap(); this.goods = []
this.fetchGoods(); this.isCompleteLoadGood = false
this.actived = 1
this.getMap()
this.fetchGoods()
}, },
getMap() { getMap() {
const id = this.navList[this.navIndex]['id'] const id = this.navList[this.navIndex]['id']
getProvince(id).then(({data}) => { getProvince(id).then(({data}) => {
this.mapData = data; this.mapData = data || {}
this.mapLocations = data.mapLocations; this.isLoad = true
this.calcPosition();
});
},
// 计算位置
calcPosition() {
this.mapLocations?.forEach(item => {
item.gx = item.x * this.scale;
item.gy = item.y * this.scale;
}) })
}, },
fetchGoods() { fetchGoods() {
const id = this.navList[this.navIndex]['id'] const id = this.navList[this.navIndex]['id']
getProvinceGoods(id, this.keyword, this.page).then(({data}) => { getProvinceGoods(id, this.keyword, this.page).then(({data}) => {
if (this.page === 1) this.goods = []; const len = data.length
for (let i = 0; i < data.length; i++) { for (let i = 0; i < len; i++) {
this.goods.push(data[i]); this.goods.push(data[i])
} }
if (len === 0 || len < 10) {
this.isCompleteLoadGood = true
}
})
},
goGoods(id) {
uni.navigateTo({
url: `/pages/shop/GoodsCon/index?id=${id}&from=landmark`
}) })
} }
} }
} }
</script> </script>
<template>
<view class="pkg-product-land-mark" v-if="mapData">
<view class="top-box" :style="{'backgroundColor':topBoxBgColor}">
<view class="view-box">
<view class="search-box flex ai-center">
<input
v-model="keyword"
type="text"
placeholder="搜索商品"
placeholder-style="color:#999"
@confirm="search()"
/>
<image
:src="webUrl+'/20231223183627184005.png'"
mode="scaleToFill"
style="width:30rpx;height:30rpx"
@click="search()"
/>
</view>
<view class="map-box">
<image class="img-map" :src="mapData.mapImage" mode="widthFix"/>
<view class="item" :style="{'left':item.gx+'rpx','top':item.gy+'rpx'}" v-for="item in mapLocations" @click="$global.navToGoods(item.productId)">
<view class="round">
<view class="line" :class="'line-'+directionClass[item.labelDirection]"></view>
</view>
<view class="label flex ai-end" :class="'label-'+directionClass[item.labelDirection]">
<image class="cover flex-0" :src="item.mapImage" mode="scaleToFill" v-if="item.labelDirection===4"/>
<view class="title flex ai-center">{{ item.mapTitle }}</view>
<image class="cover flex-0" :src="item.mapImage" mode="scaleToFill" v-if="item.labelDirection!==4"/>
</view>
</view>
</view>
</view>
<view class="nav flex">
<view class="flex flex-0 ai-center" :class="{'active': navIndex===index}" v-for="(item,index) in navList"
:key="index" @click="changeNav(index)">{{ item.provinceName }}
</view>
</view>
</view>
<view class="main-box" v-if="mapData.recommended.storeImage"
@click="$global.navToGoods(mapData.recommended.productId)">
<image class="bg-main" :src="mapData.recommended.storeImage" mode="scaleToFill"/>
<view class="box-mask flex flex-col jc-end">
<view class="one-t bold">{{ mapData.recommended.title }}</view>
<view class="more-t">{{ mapData.recommended.description }}</view>
</view>
</view>
<view class="list-box flex flex-wrap">
<view class="item" v-for="item in goods" :key="item.id" @click="$global.navToGoods(item.productId)">
<image :src="item.storeImage" mode="scaleToFill"/>
<view class="content flex flex-col jc-between">
<view class="more-t bold">{{ item.title }}</view>
<view class="flex jc-between ai-center">
<text class="price">{{ item.price }}</text>
<image class="btn" :src="webUrl+'/20231114151028082368.png'" mode="scaleToFill"/>
<!-- <view class="btn flex jc-center ai-center">立即购买</view>-->
</view>
</view>
</view>
</view>
<image class="img-nodata" :src="webUrl+'/20231023131208675588.png'" mode="scaleToFill"
v-if="goods.length===0"/>
</view>
</template>
<style scoped lang="less"> <style scoped lang="less">
.share-btn{
color: #C52733;
background: rgba(211,92,101,0.5);
font-size: 24rpx;
width: fit-content;
padding: 8rpx 10rpx;
border-radius: 20rpx 0 0 20rpx;
position: absolute;
right: 0;
top: 80%;
display: flex;
align-items: center;
}
.tabs-wrap{
display: flex;
justify-content: space-around;
padding: 20rpx 20rpx 0;
color: #333;
font-weight: bold;
font-size: 36rpx;
}
.tab-item{
}
.tab-actived{
color: #fff;
font-weight: bold;
background: linear-gradient(to right, #C52733 0%, rgba(211,92,101,0.91) 54%, rgba(255,255,255,0.62) 100%);
border-radius: 38rpx 0rpx 0 38rpx;
padding: 0 20rpx;
}
.top-wrap{
padding: 20rpx 20rpx 0;
}
.pkg-product-land-mark { .pkg-product-land-mark {
background: #F7F3ED; background: #f0f0f0;
min-height: 100vh;
image {
vertical-align: middle;
}
.top-box { .top-box {
padding: 32rpx 0 20rpx; border-radius: 20rpx;
background-color: #fff;
.view-box { .view-box {
position: relative; position: relative;
margin: 0 16rpx; padding: 20rpx;
border-radius: 40rpx; border-radius: 20rpx;
overflow: hidden; overflow: hidden;
.search-box {
position: absolute;
top: 20rpx;
left: 34rpx;
width: 650rpx;
height: 64rpx;
padding: 0 32rpx;
box-sizing: border-box;
border-radius: 32rpx;
background: #FFFFFF;
z-index: 10;
input {
width: 100%;
height: 100%;
line-height: 64rpx;
font-size: 28rpx;
}
}
.map-box {
position: relative;
width: 718rpx;
.img-map { .img-map {
width: 718rpx; display: block;
height: auto; width: 100%;
}
.item {
position: absolute;
.round {
width: 8rpx;
height: 8rpx;
border-radius: 50%;
box-shadow: 0 0 0 8rpx rgba(225, 38, 65, .4);;
background: #E12641;
}
.line {
position: relative;
border: 2rpx solid #E12641;
}
.line-up {
left: 50%;
transform: translate(-50%, -100%);
width: 0;
height: 30rpx;
}
.line-right {
top: 50%;
transform: translate(0, -50%);
width: 30rpx;
height: 0;
}
.line-down {
left: 50%;
transform: translate(-50%, 0);
width: 0;
height: 30rpx;
}
.line-left {
top: 50%;
transform: translate(-100%, -50%);
width: 30rpx;
height: 0;
}
.label {
position: relative;
.cover {
width: 60rpx;
height: 60rpx;
box-sizing: border-box;
border: 6rpx solid #E12641;
border-radius: 50%;
z-index: 20;
}
.title {
height: 32rpx;
box-sizing: border-box;
margin-bottom: 10rpx;
padding: 0 16rpx;
background: #E12641;
color: #FFFFFF;
font-size: 22rpx;
line-height: 32rpx;
white-space: nowrap;
z-index: 10;
} }
} }
.label-up {
top: -80rpx;
left: -50%;
.title {
margin-right: -9rpx;
border-radius: 20rpx 0 0 20rpx;
}
}
.label-right {
top: -40rpx;
left: 32rpx;
.title {
margin-right: -9rpx;
border-radius: 20rpx 0 0 20rpx;
}
}
.label-down {
left: -50%;
.title {
margin-right: -9rpx;
border-radius: 20rpx 0 0 20rpx;
}
}
.label-left {
left: -100%;
transform: translate(-30rpx, -40rpx);
.title {
margin-left: -9rpx;
border-radius: 0 20rpx 20rpx 0;
}
}
}
}
}
.nav { .nav {
padding: 30rpx 20rpx 0; padding: 20rpx 20rpx 0 20rpx;
overflow-x: scroll; overflow-x: scroll;
.nav-item + .nav-item {
view { margin: 0 0 0 20rpx;
height: 52rpx;
box-sizing: border-box;
padding: 0 18rpx;
border: 4rpx solid transparent;
color: #FFFFFF;
font-size: 32rpx;
} }
.nav-item {
.active {
border-color: #FFFFFF;
border-radius: 26rpx;
}
}
}
.main-box {
position: relative; position: relative;
width: 718rpx; box-sizing: border-box;
height: 360rpx; padding: 0 32rpx 20rpx 0;
margin: 24rpx 16rpx; color: #333;
border-radius: 16rpx; font-size: 32rpx;
overflow: hidden; .bg {
display: none;
.bg-main {
width: 718rpx;
height: 360rpx;
}
.box-mask {
position: absolute; position: absolute;
left: 0;
bottom: 0; bottom: 0;
width: 100%; right: 6rpx;
height: 200rpx; width: 63rpx;
box-sizing: border-box;
padding: 20rpx 16rpx 16rpx;
background: linear-gradient(180deg, rgba(0, 0, 0, 0) 0%, #000000 100%);
color: #FFFFFF;
.one-t {
margin-bottom: 16rpx;
font-size: 46rpx;
line-height: 52rpx;
}
.more-t {
width: 100%;
box-sizing: border-box;
padding-top: 10rpx;
border-top: 1rpx solid #FFFFFF;
font-size: 28rpx;
line-height: 32rpx;
}
}
}
.list-box {
margin-top: 24rpx;
padding: 0 16rpx 34rpx;
.item {
width: 234rpx;
height: 380rpx;
margin-right: 8rpx;
margin-bottom: 24rpx;
border-radius: 12rpx;
background: #FFFFFF;
overflow: hidden;
image {
width: 234rpx;
height: 234rpx;
}
.content {
height: 122rpx;
margin: 6rpx 6rpx 18rpx;
.more-t {
font-size: 28rpx;
line-height: 36rpx;
color: #333333;
}
.price {
font-size: 28rpx;
line-height: 36rpx;
color: #DC1616;
}
.btn {
width: 118rpx;
height: 42rpx; height: 42rpx;
//background: linear-gradient(180deg, #EFEDC7 0%, #EAC94B 100%); }
//border-radius: 4rpx; }
//color: #764A00; .active {
//font-size: 24rpx; font-size: 40rpx;
font-weight: bold;
.bg {
display: block;
} }
} }
} }
}
.item:nth-child(3n) { .middle-img-wrap {
margin-right: 0; margin: 20rpx 0 0 0;
background: #fff;
padding: 20rpx;
.img {
display: block;
width: 100%;
border-radius: 20rpx;
} }
} }
.img-nodata { .img-nodata {
position: relative; position: relative;
top: 0; top: 0;
@@ -434,4 +449,7 @@ export default {
margin-bottom: 60rpx; margin-bottom: 60rpx;
} }
} }
.loadend {
width: 100%;
}
</style> </style>
+454
View File
@@ -0,0 +1,454 @@
<template>
<view class="pkg-product-land-mark" v-if="mapData">
<view class="top-box" :style="{'backgroundColor':topBoxBgColor}">
<view class="view-box">
<view class="search-box flex ai-center">
<input
v-model="keyword"
type="text"
placeholder="搜索商品"
placeholder-style="color:#999"
@confirm="search()"
/>
<image
:src="webUrl+'/20231223183627184005.png'"
mode="scaleToFill"
style="width:30rpx;height:30rpx"
@click="search()"
/>
</view>
<view class="map-box">
<image class="img-map" :src="mapData.mapImage" mode="widthFix"/>
<view
v-for="(item, index) in mapLocations"
:key="index"
class="item"
:style="{'left':item.gx+'rpx','top':item.gy+'rpx'}"
@click="goGoods(item.productId)"
>
<view class="round">
<view class="line" :class="'line-'+directionClass[item.labelDirection]"></view>
</view>
<view class="label flex ai-end" :class="'label-'+directionClass[item.labelDirection]">
<image class="cover flex-0" :src="item.mapImage" mode="scaleToFill" v-if="item.labelDirection===4"/>
<view class="title flex ai-center">{{ item.mapTitle }}</view>
<image class="cover flex-0" :src="item.mapImage" mode="scaleToFill" v-if="item.labelDirection!==4"/>
</view>
</view>
</view>
</view>
<view class="nav flex">
<view class="flex flex-0 ai-center" :class="{'active': navIndex===index}" v-for="(item,index) in navList"
:key="index" @click="changeNav(index)">{{ item.provinceName }}
</view>
</view>
</view>
<view class="main-box" v-if="mapData.recommended.storeImage"
@click="goGoods(mapData.recommended.productId)">
<image class="bg-main" :src="mapData.recommended.storeImage" mode="scaleToFill"/>
<view class="box-mask flex flex-col jc-end">
<view class="one-t bold">{{ mapData.recommended.title }}</view>
<view class="more-t">{{ mapData.recommended.description }}</view>
</view>
</view>
<view class="list-box flex flex-wrap">
<view class="item" v-for="item in goods" :key="item.id" @click="goGoods(item.productId)">
<image :src="item.storeImage" mode="scaleToFill"/>
<view class="content flex flex-col jc-between">
<view class="more-t bold">{{ item.title }}</view>
<view class="flex jc-between ai-center">
<text class="price">{{ item.price }}</text>
<image class="btn" :src="webUrl+'/20231114151028082368.png'" mode="scaleToFill"/>
<!-- <view class="btn flex jc-center ai-center">立即购买</view>-->
</view>
</view>
</view>
</view>
<image class="img-nodata" :src="webUrl+'/20231023131208675588.png'" mode="scaleToFill"
v-if="goods.length===0"/>
</view>
</template>
<script>
import {getProvince, getProvinceGoods, getProvinceList} from "@/api/product";
import { pageListenMixins } from '@/mixins/pageListenMixins'
export default {
name: 'LandMarkPage',
mixins: [pageListenMixins],
data() {
return {
webUrl: this.$VUE_APP_RESOURCES_URL,
keyword: '',
page: 1,
navList: [],
navIndex: 0,
mapData: null,
mapLocations: [],
goods: [],
directionClass: ['', 'up', 'right', 'down', 'left'],
pageKeyId: Object.freeze('landmarkGoodsIndex')
}
},
computed: {
topBoxBgColor() {
return this.navList.length > 0 ? this.navList[this.navIndex]['backgroundColor'] : '#FFFFFF';
},
viewBoxBgColor() {
return this.mapData?.backgroundColor || '#FFFFFF';
},
scale() {
return 718 / (this.mapData?.mapImageWidth || 1);
}
},
onLoad() {
this.getNavList();
},
onHide() {
this.pageToHideHandle()
},
onReachBottom() {
this.page++;
this.fetchGoods();
},
methods: {
getNavList() {
getProvinceList().then(({data}) => {
this.navList = data;
this.changeNav(this.navIndex);
});
},
search() {
this.page = 1;
this.fetchGoods();
},
changeNav(index) {
this.navIndex = index;
this.page = 1;
this.getMap();
this.fetchGoods();
},
getMap() {
const id = this.navList[this.navIndex]['id']
getProvince(id).then(({data}) => {
this.mapData = data;
this.mapLocations = data.mapLocations;
this.calcPosition();
});
},
// 计算位置
calcPosition() {
this.mapLocations?.forEach(item => {
item.gx = item.x * this.scale;
item.gy = item.y * this.scale;
})
},
fetchGoods() {
const id = this.navList[this.navIndex]['id']
getProvinceGoods(id, this.keyword, this.page).then(({data}) => {
if (this.page === 1) this.goods = [];
for (let i = 0; i < data.length; i++) {
this.goods.push(data[i]);
}
})
},
goGoods(id) {
uni.navigateTo({
url: `/pages/shop/GoodsCon/index?id=${id}&from=landmark`
})
}
}
}
</script>
<style scoped lang="less">
.pkg-product-land-mark {
background: #F7F3ED;
image {
vertical-align: middle;
}
.top-box {
padding: 32rpx 0 20rpx;
.view-box {
position: relative;
margin: 0 16rpx;
border-radius: 40rpx;
overflow: hidden;
.search-box {
position: absolute;
top: 20rpx;
left: 34rpx;
width: 650rpx;
height: 64rpx;
padding: 0 32rpx;
box-sizing: border-box;
border-radius: 32rpx;
background: #FFFFFF;
z-index: 10;
input {
width: 100%;
height: 100%;
line-height: 64rpx;
font-size: 28rpx;
}
}
.map-box {
position: relative;
width: 718rpx;
.img-map {
width: 718rpx;
height: auto;
}
.item {
position: absolute;
.round {
width: 8rpx;
height: 8rpx;
border-radius: 50%;
box-shadow: 0 0 0 8rpx rgba(225, 38, 65, .4);;
background: #E12641;
}
.line {
position: relative;
border: 2rpx solid #E12641;
}
.line-up {
left: 50%;
transform: translate(-50%, -100%);
width: 0;
height: 30rpx;
}
.line-right {
top: 50%;
transform: translate(0, -50%);
width: 30rpx;
height: 0;
}
.line-down {
left: 50%;
transform: translate(-50%, 0);
width: 0;
height: 30rpx;
}
.line-left {
top: 50%;
transform: translate(-100%, -50%);
width: 30rpx;
height: 0;
}
.label {
position: relative;
.cover {
width: 60rpx;
height: 60rpx;
box-sizing: border-box;
border: 6rpx solid #E12641;
border-radius: 50%;
z-index: 20;
}
.title {
height: 32rpx;
box-sizing: border-box;
margin-bottom: 10rpx;
padding: 0 16rpx;
background: #E12641;
color: #FFFFFF;
font-size: 22rpx;
line-height: 32rpx;
white-space: nowrap;
z-index: 10;
}
}
.label-up {
top: -80rpx;
left: -50%;
.title {
margin-right: -9rpx;
border-radius: 20rpx 0 0 20rpx;
}
}
.label-right {
top: -40rpx;
left: 32rpx;
.title {
margin-right: -9rpx;
border-radius: 20rpx 0 0 20rpx;
}
}
.label-down {
left: -50%;
.title {
margin-right: -9rpx;
border-radius: 20rpx 0 0 20rpx;
}
}
.label-left {
left: -100%;
transform: translate(-30rpx, -40rpx);
.title {
margin-left: -9rpx;
border-radius: 0 20rpx 20rpx 0;
}
}
}
}
}
.nav {
padding: 30rpx 20rpx 0;
overflow-x: scroll;
view {
height: 52rpx;
box-sizing: border-box;
padding: 0 18rpx;
border: 4rpx solid transparent;
color: #FFFFFF;
font-size: 32rpx;
}
.active {
border-color: #FFFFFF;
border-radius: 26rpx;
}
}
}
.main-box {
position: relative;
width: 718rpx;
height: 360rpx;
margin: 24rpx 16rpx;
border-radius: 16rpx;
overflow: hidden;
.bg-main {
width: 718rpx;
height: 360rpx;
}
.box-mask {
position: absolute;
left: 0;
bottom: 0;
width: 100%;
height: 200rpx;
box-sizing: border-box;
padding: 20rpx 16rpx 16rpx;
background: linear-gradient(180deg, rgba(0, 0, 0, 0) 0%, #000000 100%);
color: #FFFFFF;
.one-t {
margin-bottom: 16rpx;
font-size: 46rpx;
line-height: 52rpx;
}
.more-t {
width: 100%;
box-sizing: border-box;
padding-top: 10rpx;
border-top: 1rpx solid #FFFFFF;
font-size: 28rpx;
line-height: 32rpx;
}
}
}
.list-box {
margin-top: 24rpx;
padding: 0 16rpx 34rpx;
.item {
width: 234rpx;
height: 380rpx;
margin-right: 8rpx;
margin-bottom: 24rpx;
border-radius: 12rpx;
background: #FFFFFF;
overflow: hidden;
image {
width: 234rpx;
height: 234rpx;
}
.content {
height: 122rpx;
margin: 6rpx 6rpx 18rpx;
.more-t {
font-size: 28rpx;
line-height: 36rpx;
color: #333333;
}
.price {
font-size: 28rpx;
line-height: 36rpx;
color: #DC1616;
}
.btn {
width: 118rpx;
height: 42rpx;
//background: linear-gradient(180deg, #EFEDC7 0%, #EAC94B 100%);
//border-radius: 4rpx;
//color: #764A00;
//font-size: 24rpx;
}
}
}
.item:nth-child(3n) {
margin-right: 0;
}
}
.img-nodata {
position: relative;
top: 0;
left: 50%;
transform: translate(-50%, 0);
width: 352rpx;
height: 338rpx;
margin-bottom: 60rpx;
}
}
</style>
+172
View File
@@ -0,0 +1,172 @@
<template>
<view class="new-zone-page">
<view class="zone-title">
<rich-text :nodes="details.title"></rich-text>
</view>
<view class="banner-zone v12-mt-2">
<image class="banner-zone" :src="bannerImage" ></image>
<!-- <swiper :current="current" interval="3000" circular style="height:760rpx">
<swiper-item v-for="(item, index) in details.newProducts" :key="index">
</swiper-item>
</swiper> -->
<view class="swiper-wrap">
<swiper @change="handleChange" style="height: 100%;" autoplay circular next-margin="460rpx" interval="4000">
<swiper-item v-for="(item, index) in details.newProducts" :key="index" @click="toGoods(item)">
<view class="new-card" :class="{'is-actived': current == index}">
<image :src="item.productCover" class="new-card-img" mode="heightFix|widthFix"></image>
<view class="box-emp"></view>
<view class="new-info">
<view class="v12-font-26 one-t" style="width: 100px;text-align:center">{{ item.productTitle }}</view>
<view class="v12-font-bold">
<text></text>
<text class=" v12-font-36">{{ item.productPrice }}</text>
</view>
<view class="buy-btn">即刻选购</view>
</view>
</view>
</swiper-item>
</swiper>
</view>
</view>
<view class="v12-mt-2 v12-align-center">
<view class="primary-title" v-if="details.contentTitle">
{{ details.contentTitle }}
<view class="title-line"></view>
</view>
<view class="secondary-title v12-ml-2" v-if="details.contentSubTitle">
{{ details.contentSubTitle }}
</view>
</view>
<view class="cover-img v12-mt-2" v-for="(item, index) in details.contents" :key="index" @click="toGoods(item)">
<image :src="item.contentImage" class="cover-img" mode="heightFix|widthFix"></image>
</view>
</view>
</template>
<script>
import { queryNewZone } from '@/api/activity'
export default{
data() {
return {
details: {},
current: 0,
}
},
onLoad() {
queryNewZone().then(res => {
this.details = res.data
})
},
computed: {
bannerImage() {
return this.details.newProducts && this.details.newProducts[this.current] && this.details.newProducts[this.current].bannerImage
}
},
methods: {
handleChange(e) {
this.current = e.detail.current
},
toGoods(item) {
uni.navigateTo({
url: `/pages/shop/GoodsCon/index?id=${item.productId}`
})
}
}
}
</script>
<style lang="scss" scoped>
.new-info{
display: flex;
align-items: center;
flex-direction: column;
}
.box-emp{
width: 100%;
height: 85rpx;
}
.buy-btn{
border-radius: 100px;
width: fit-content;
color: #fff;
background: #C52733;
font-size: 28rpx;
padding: 4rpx 20rpx;
}
.swiper-wrap{
position: absolute;
width: 100%;
height: 400rpx;
left: 20rpx;
bottom: 40rpx;
}
.new-card{
width: 220rpx;
height: 240rpx;
background: #fff;
border-radius: 20rpx;
position: absolute;
bottom: -17rpx;
transition: all ease-in-out 0.3s;
scale: 0.85;
left: 15rpx;
}
.is-actived{
// width: 225rpx;
// height: 260rpx;
bottom: 0;
scale: 1;
left: 0;
}
.cover-img{
width: 706rpx;
height: 400rpx;
border-radius: 20rpx;
}
.new-card-img{
position: absolute;
width: 150rpx;
height: 150rpx;
top: -75rpx;
left: 0;
right: 0;
margin: auto;
border-radius: 50%;
}
.primary-title{
width: fit-content;
position: relative;
font-size: 34rpx;
color: #333333;
font-weight: 800;
}
.secondary-title{
font-family: Source Han Sans SC;
font-weight: 500;
font-size: 28rpx;
color: #999999;
line-height: 40rpx;
}
.title-line{
width: 100%;
height: 6rpx;
background: linear-gradient(to right, #C52733 0%, rgba(202,56,67,0.92) 51%, rgba(255,255,255,0) 100%);
border-radius: 6rpx;
position: absolute;
bottom: 3rpx;
}
.new-zone-page{
min-height: 100vh;
background-color: #fff;
padding: 20rpx;
}
.banner-zone{
width: 706rpx !important;
height: 760rpx !important;
border-radius: 20rpx !important;
position: relative !important;
}
</style>

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