Compare commits

...

393 Commits

Author SHA1 Message Date
woody 99a1e3e2bc Merge branch 'bd-test' of 47.94.45.65:angelo/web-base-h5 into bd-online 2025-10-11 17:18:02 +08:00
woody 16c2be0ec0 Merge branch 'bd-dev' of 47.94.45.65:angelo/web-base-h5 into bd-test 2025-10-11 17:00:28 +08:00
woody 5a981d2945 feat(withdrawal): 提现需绑定银行卡 2025-10-11 16:59:28 +08:00
woody e19e4b8084 Merge branch 'bd-test' of 47.94.45.65:angelo/web-base-h5 into bd-online 2025-10-11 13:56:49 +08:00
woody 17162db314 Merge branch 'bd-dev' of 47.94.45.65:angelo/web-base-h5 into bd-test 2025-10-11 10:46:26 +08:00
woody fa3e5e88cc feat(withdraw): 提现改回灵活用工 2025-10-11 10:44:30 +08:00
woody 872b3eb6e8 Merge branch 'bd-dev' of 47.94.45.65:angelo/web-base-h5 into bd-test 2025-10-10 15:50:08 +08:00
woody 8c4807f35d chore: 打包优化 2025-10-10 14:55:43 +08:00
woody aefeadb529 Merge branch 'bd-test' of 47.94.45.65:angelo/web-base-h5 into bd-online 2025-10-09 16:45:54 +08:00
woody 6d5ce02d4d Merge branch 'bd-dev' of 47.94.45.65:angelo/web-base-h5 into bd-test 2025-10-09 14:30:32 +08:00
woody 1ac73046f6 feat(region): 收益区域选择逻辑变更,如果是后台配置的收益区域,也可以更改 2025-10-09 14:30:15 +08:00
woody c4a323a51d Merge branch 'bd-test' of 47.94.45.65:angelo/web-base-h5 into bd-online 2025-09-28 11:50:22 +08:00
woody be422797a0 Merge branch 'bd-dev' of 47.94.45.65:angelo/web-base-h5 into bd-test 2025-09-28 11:46:54 +08:00
woody 141c7dfe1d fix(other): specailArea 只有为2时校验 2025-09-28 11:46:40 +08:00
woody 171ec86d16 Merge branches 'bd-dev' and 'bd-test' of 47.94.45.65:angelo/web-base-h5 into bd-test 2025-09-28 10:33:23 +08:00
woody 6017769dd2 fix(rankingPopup): 前三名展示错误问题修复 2025-09-28 10:33:11 +08:00
woody 6e34276e21 Merge branch 'bd-dev' of 47.94.45.65:angelo/web-base-h5 into bd-test 2025-09-28 10:07:11 +08:00
woody 2d991a18d1 feat(rankingPopup): 排行榜隐藏memberCode 2025-09-28 10:06:53 +08:00
woody 2bd4aa0601 Merge branch 'bd-dev' of 47.94.45.65:angelo/web-base-h5 into bd-test 2025-09-28 10:01:40 +08:00
woody e090eaf1cc feat(shareRegist): 分享注册页面样式调整 2025-09-28 09:48:41 +08:00
woody 399a894ef0 Merge branch 'bd-test' of 47.94.45.65:angelo/web-base-h5 into bd-online 2025-09-28 09:18:37 +08:00
woody e2e529064f Merge branch 'bd-dev' of 47.94.45.65:angelo/web-base-h5 into bd-test 2025-09-26 09:45:04 +08:00
woody 6e93dcdde3 fix(ranking): 关闭人数排行后判断金额排行是否有数据 2025-09-26 09:44:43 +08:00
woody e47d5dd3f7 Merge branch 'bd-dev' of 47.94.45.65:angelo/web-base-h5 into bd-test 2025-09-26 09:20:39 +08:00
woody 6b1169ea43 fix(rankingPopup): 排行榜逻辑完善,如果列表为空不展示排行榜 2025-09-26 09:20:24 +08:00
woody 3ca3a82479 Merge branch 'bd-dev' of 47.94.45.65:angelo/web-base-h5 into bd-test 2025-09-25 15:45:06 +08:00
woody f59e54b08b fix(rankingPopup): 列表样式调整 2025-09-25 15:44:51 +08:00
woody 74656aeea2 Merge branch 'bd-dev' of 47.94.45.65:angelo/web-base-h5 into bd-test 2025-09-25 14:31:52 +08:00
woody 495d23317d feat(ranking): 弹窗样式优化 2025-09-25 14:31:39 +08:00
woody e9b58a3074 Merge branch 'bd-dev' of 47.94.45.65:angelo/web-base-h5 into bd-test 2025-09-25 11:19:07 +08:00
woody f066a7aab9 feat(rankIng): 添加排行榜弹窗 2025-09-25 11:18:52 +08:00
woody b193027784 Merge branch 'bd-dev' of 47.94.45.65:angelo/web-base-h5 into bd-test 2025-09-24 15:28:29 +08:00
woody 3c2b8f7475 fix(other): promise resolve 2025-09-24 15:28:17 +08:00
woody 9b19901c44 Merge branch 'bd-dev' of 47.94.45.65:angelo/web-base-h5 into bd-test 2025-09-24 14:57:45 +08:00
woody 2e4edbd887 fix(other): 升级单异步校验问题处理 2025-09-24 14:57:32 +08:00
woody 185b1a92c8 fix(shoppingCar): 购物车会员专区问题修复 2025-09-24 09:55:23 +08:00
woody c0af6ff148 Merge branch 'bd-dev' of 47.94.45.65:angelo/web-base-h5 into bd-test 2025-09-24 09:50:33 +08:00
woody 304d889296 fix(shoppingCar): 购物车会员专区问题修复 2025-09-24 09:50:21 +08:00
woody 6ea155c07d Merge branch 'bd-dev' of 47.94.45.65:angelo/web-base-h5 into bd-test 2025-09-23 11:56:59 +08:00
woody 9d4cc859d6 fix(other): 修复页面销毁时触发会员编号触发表单校验的问题 2025-09-23 11:56:22 +08:00
woody ea6202f4e0 Merge branch 'bd-test' of 47.94.45.65:angelo/web-base-h5 into bd-online 2025-09-23 10:23:37 +08:00
woody 5c28e46135 Merge branch 'bd-dev' of 47.94.45.65:angelo/web-base-h5 into bd-test 2025-09-23 09:47:45 +08:00
woody c56669d17e fix(shareRegist): 会员注册姓名必须中文 2025-09-23 09:47:30 +08:00
woody 3cf83e0f9c Merge branch 'bd-test' of 47.94.45.65:angelo/web-base-h5 into bd-online 2025-09-22 16:17:28 +08:00
woody 02352d026e Merge branch 'bd-dev' of 47.94.45.65:angelo/web-base-h5 into bd-test 2025-09-22 16:17:16 +08:00
woody 2220bb756d fix(goods-list): 列表样式问题修复 2025-09-22 16:17:04 +08:00
woody 85506618dd Merge branch 'bd-test' of 47.94.45.65:angelo/web-base-h5 into bd-online 2025-09-22 16:07:09 +08:00
woody 7b2f31b8d9 Merge branch 'bd-dev' of 47.94.45.65:angelo/web-base-h5 into bd-test 2025-09-22 15:12:59 +08:00
woody 06ff3180e5 feat(share): add loading mask 2025-09-22 15:12:45 +08:00
woody 0843a77520 Merge branch 'bd-dev' of 47.94.45.65:angelo/web-base-h5 into bd-test 2025-09-22 15:10:07 +08:00
woody d92be1e979 feat(goods-list): 首页如果为分享注册会员,直接展示商品列表 2025-09-22 15:09:52 +08:00
woody 51b0b4e81d Merge branch 'bd-test' of 47.94.45.65:angelo/web-base-h5 into bd-online 2025-09-22 11:42:29 +08:00
woody 95c6c0beb0 Merge branch 'bd-dev' of 47.94.45.65:angelo/web-base-h5 into bd-test 2025-09-22 11:37:44 +08:00
woody 05d64f77ef fix(shareRegist): 隐藏推荐编号 2025-09-22 11:37:30 +08:00
woody 0564546b61 Merge branch 'bd-test' of 47.94.45.65:angelo/web-base-h5 into bd-online 2025-09-22 09:07:13 +08:00
woody 76f5432c6a Merge branch 'bd-dev' of 47.94.45.65:angelo/web-base-h5 into bd-test 2025-09-17 11:22:08 +08:00
woody ee2960ee33 fix(index): 注册后首页无专区问题修复 2025-09-17 11:20:38 +08:00
woody 17554526d0 Merge branch 'bd-dev' of 47.94.45.65:angelo/web-base-h5 into bd-test 2025-09-17 10:46:57 +08:00
woody 6a27c8bca2 fix(index): 首页获取专区列表改为在onshow时执行 2025-09-17 10:41:47 +08:00
sangelxiu1 3fe086d4d4 ## Fix - 新注册会员 会员专区无法点击商品及更多 2025-09-17 09:44:32 +08:00
woody 885d72be0e Merge branch 'bd-test' of 47.94.45.65:angelo/web-base-h5 into bd-online 2025-09-17 09:28:26 +08:00
sangelxiu1 a8ecc34db8 ## 北大
loginType = 1 分享注册用户
 只展示升级专区 改名为 (会员专区)
 隐藏推广tab
 我的
 隐藏订单以上
 隐藏市场动态
 其他
 钱包
 自助购票
 自助服务
 银行信息
 收益区域
 活动专区
 --------------------------------
 下单
 升级专区 -> 会员专区
 会员信息 -> 升级改会员
 待支付 -> 隐藏钱包
2025-09-16 14:37:35 +08:00
woody 72320830bd Merge branch 'bd-dev' of 47.94.45.65:angelo/web-base-h5 into bd-test 2025-09-16 10:18:04 +08:00
woody de5fa75abe fix(performanceDistribution): 数据查询-月度业绩隐藏全部下拉选项 2025-09-16 10:17:51 +08:00
woody f55dcef6e7 Merge branch 'bd-dev' of 47.94.45.65:angelo/web-base-h5 into bd-test 2025-09-16 09:54:08 +08:00
woody d86a499d7a fix(region-select): 修复区域选择如果被选完页面报错的问题 2025-09-16 09:53:47 +08:00
sangelxiu1 74f530e85b ## Opt - 首页网站备案信息 2025-09-11 15:45:43 +08:00
sangelxiu1 a522c465b2 ## Opt - 首页网站备案信息 2025-09-11 15:45:29 +08:00
sangelxiu1 d5bdd43252 ## Opt - 兼容ios open 2025-09-11 11:54:57 +08:00
sangelxiu1 5db2a8476f ## Opt - 兼容ios open 2025-09-11 11:54:28 +08:00
woody d3142faa59 Merge branch 'bd-dev' of 47.94.45.65:angelo/web-base-h5 into bd-test 2025-09-04 14:20:32 +08:00
woody 7036a53cae feat(bindBank): 绑定银行卡逻辑迁移 2025-09-04 14:20:15 +08:00
woody 22ad7a49bf Merge branch 'bd-test' of 47.94.45.65:angelo/web-base-h5 into bd-online 2025-09-04 11:05:47 +08:00
woody aa286697e8 Merge branch 'bd-dev' of 47.94.45.65:angelo/web-base-h5 into bd-test 2025-09-04 11:05:22 +08:00
woody f592fee699 feat(withDrawal): 移除灵活用工弹窗 2025-09-04 11:05:08 +08:00
woody e5d283095d Merge branch 'bd-test' of 47.94.45.65:angelo/web-base-h5 into bd-online 2025-08-27 09:38:43 +08:00
woody 086b7e22c6 Merge branch 'bd-dev' of 47.94.45.65:angelo/web-base-h5 into bd-test 2025-08-27 09:32:03 +08:00
woody c91f1d3fe0 feat(specialArea): 秒杀专区展示进度条 2025-08-27 09:31:51 +08:00
woody 45b15b6910 Merge branch 'bd-dev' of 47.94.45.65:angelo/web-base-h5 into bd-test 2025-08-27 09:29:06 +08:00
woody 499d8abec3 fix(specialArea): 类型转换 2025-08-27 09:28:52 +08:00
woody 1149ad6bc9 Merge branch 'bd-dev' of 47.94.45.65:angelo/web-base-h5 into bd-test 2025-08-27 09:23:16 +08:00
woody 7d4f09cb9c fix(specialArea): 仅秒杀专区展示库存剩余进度 2025-08-27 09:22:57 +08:00
woody c0bd874c22 Merge branch 'bd-test' of 47.94.45.65:angelo/web-base-h5 into bd-online 2025-08-18 11:45:30 +08:00
woody b011045709 Merge branch 'bd-dev' of 47.94.45.65:angelo/web-base-h5 into bd-test 2025-08-18 09:36:07 +08:00
woody dc1d7a6e64 feat(request): 获取用户信息接口500时重新登录 2025-08-18 09:35:52 +08:00
woody 4fe3051d53 Merge branch 'bd-test' of gitee.com:cabbage_qd/web-base-h5 into bd-online 2025-08-15 09:25:49 +08:00
woody 547ca3374d Merge branch 'bd-dev' of gitee.com:cabbage_qd/web-base-h5 into bd-test 2025-08-15 09:10:34 +08:00
woody b92c7e5684 feat(numberToCurrency): 货币符号写死 2025-08-15 09:10:09 +08:00
woody d4c3b718e0 feat(withdrawl): 提现明细个税改服务费 2025-08-14 11:17:53 +08:00
woody 70390c189d Merge branch 'bd-dev' of gitee.com:cabbage_qd/web-base-h5 into bd-test 2025-08-12 17:04:42 +08:00
woody af0c7fa19f feat(withdrawl): 提现明细个税改服务费 2025-08-12 17:04:26 +08:00
woody 33d282baa2 Merge branch 'bd-test' of gitee.com:cabbage_qd/web-base-h5 into bd-online 2025-08-12 11:59:08 +08:00
woody 80c1fb9ee5 Merge branch 'bd-dev' of gitee.com:cabbage_qd/web-base-h5 into bd-test 2025-08-12 11:58:37 +08:00
woody 1a75355f4c feat(withdrawalGuide): 更换图片地址 2025-08-12 11:58:19 +08:00
woody 928a26a273 Merge branch 'bd-test' of gitee.com:cabbage_qd/web-base-h5 into bd-online 2025-08-11 09:38:20 +08:00
woody f04bb52461 Merge branch 'bd-dev' of gitee.com:cabbage_qd/web-base-h5 into bd-test 2025-08-11 09:16:01 +08:00
woody 442bef52bc feat(region): 区域收益选择组件标题文案优化 2025-08-11 09:15:42 +08:00
woody 36edd3527e feat(region): 区域选择文案优化 2025-08-11 09:12:07 +08:00
woody 4869f35ff2 fix(pay): 支付页面展示会员信息问题处理 2025-08-09 13:27:07 +08:00
woody c6f14fd89a Merge branch 'bd-dev' of gitee.com:cabbage_qd/web-base-h5 into bd-test 2025-08-09 13:26:27 +08:00
woody 7118b92e63 fix(pay): 支付页面展示会员信息问题处理 2025-08-09 13:26:12 +08:00
woody 7e95a7e900 Merge branch 'bd-dev' of gitee.com:cabbage_qd/web-base-h5 into bd-test 2025-08-07 13:50:23 +08:00
woody e5ea18ac82 fix(realname): use disabled instead of readonly 2025-08-07 13:50:10 +08:00
woody 2bd528fc76 Merge branch 'bd-dev' of gitee.com:cabbage_qd/web-base-h5 into bd-test 2025-08-07 13:38:01 +08:00
woody 6b03902c9c fix(realName): 实名认证,身份证相关信息不可编辑 2025-08-07 13:37:51 +08:00
woody fdeb815c92 Merge branch 'bd-dev' of gitee.com:cabbage_qd/web-base-h5 into bd-test 2025-08-07 11:53:29 +08:00
woody 62f3f0c914 Merge branch 'feat/id-card' of gitee.com:cabbage_qd/web-base-h5 into bd-dev 2025-08-07 11:53:14 +08:00
woody e19dd52a14 Merge branch 'bd-dev' of gitee.com:cabbage_qd/web-base-h5 into bd-test 2025-08-07 11:51:46 +08:00
woody 0dda952b4f fix(specialArea): 售罄商品禁止跳转详情 2025-08-07 11:51:32 +08:00
woody 2dfedbb333 Merge branch 'bd-dev' of gitee.com:cabbage_qd/web-base-h5 into bd-test 2025-08-07 11:42:17 +08:00
woody cf72ed367c feat(specialArea): 秒杀售罄展示样式优化 2025-08-07 11:41:56 +08:00
woody cded041165 Merge branch 'bd-test' of gitee.com:cabbage_qd/web-base-h5 into bd-online 2025-08-07 10:54:59 +08:00
woody cd0d051c65 Merge branch 'bd-dev' of gitee.com:cabbage_qd/web-base-h5 into bd-test 2025-08-07 10:54:49 +08:00
woody 07759cfd66 fix(index): 首页展示秒杀问题修复 2025-08-07 10:54:33 +08:00
woody 78acf713ad Merge branch 'bd-test' of gitee.com:cabbage_qd/web-base-h5 into bd-online 2025-08-07 09:20:53 +08:00
woody f3bfd8593e feat(realName): 实名认证对接ocr接口 2025-08-07 09:02:40 +08:00
woody 70c8e39554 Merge branch 'bd-dev' of gitee.com:cabbage_qd/web-base-h5 into bd-test 2025-08-06 12:56:16 +08:00
woody 81c3030a2f feat(special): 直播专区->秒杀专区 2025-08-06 11:59:03 +08:00
woody 06750ee854 Merge branch 'bd-dev' of gitee.com:cabbage_qd/web-base-h5 into bd-test 2025-08-06 11:50:40 +08:00
woody 4aa22a8fee feat(pay): 支付页面秒杀专区展示会员信息 2025-08-06 11:50:21 +08:00
woody b6fe04ea07 feat(performanceEchart): 移除无用组件 2025-08-05 18:06:59 +08:00
woody 4bc1929b30 feat(distribution): 移除无用页面 2025-08-05 17:57:06 +08:00
woody bfb31e493e Merge branch 'bd-dev' of gitee.com:cabbage_qd/web-base-h5 into bd-test 2025-08-05 17:28:37 +08:00
woody 7491582f9b feat(specialAreaList): 样式调整 2025-08-05 17:28:19 +08:00
woody dc3ca438c7 Merge branch 'bd-dev' of gitee.com:cabbage_qd/web-base-h5 into bd-test 2025-08-05 14:37:52 +08:00
woody 4a042d163a feat(specialArea): 秒杀功能实现 2025-08-05 14:37:33 +08:00
woody 56fccaa842 Merge branch 'bd-test' of gitee.com:cabbage_qd/web-base-h5 into bd-online 2025-08-05 09:05:13 +08:00
woody 976dc29fe4 fix(region-select): 移动端兼容问题修复 2025-08-01 14:06:28 +08:00
woody 4ae74d241c feat(region-select): 兼容问题修复 2025-08-01 14:06:21 +08:00
woody 77e20a6c42 fix(region-index): 移除固定高度 2025-08-01 14:06:14 +08:00
woody 48b8eff593 Merge branch 'bd-dev' of gitee.com:cabbage_qd/web-base-h5 into bd-test 2025-08-01 14:04:50 +08:00
woody d2c8e7cd76 fix(region-select): 移动端兼容问题修复 2025-08-01 14:04:35 +08:00
woody e38b3d7a4e Merge branch 'bd-dev' of gitee.com:cabbage_qd/web-base-h5 into bd-test 2025-08-01 13:49:11 +08:00
woody 1ff6ec9d13 feat(region-select): 兼容问题修复 2025-08-01 13:48:45 +08:00
woody c4cfd9e281 Merge branch 'bd-dev' of gitee.com:cabbage_qd/web-base-h5 into bd-test 2025-08-01 13:34:13 +08:00
woody 359410ae57 fix(region-index): 移除固定高度 2025-08-01 13:33:55 +08:00
woody 4c29418f9b Merge branch 'bd-dev' of gitee.com:cabbage_qd/web-base-h5 into bd-test 2025-08-01 10:47:47 +08:00
woody 515eaaf274 feat(region): 区域选择逻辑完善 2025-08-01 10:47:25 +08:00
woody 61163cae97 fix(pay): 修复支付页面收起时充值展示支付密码的问题 2025-08-01 10:11:17 +08:00
woody 3621083f68 Merge branch 'bd-dev' of gitee.com:cabbage_qd/web-base-h5 into bd-test 2025-08-01 09:38:50 +08:00
woody fa0336a450 fix(pay): 修复支付页面收起时充值展示支付密码的问题 2025-08-01 09:38:29 +08:00
woody 09f6157991 feat(sale): 添加秒杀专区,剩余库存展示 2025-07-31 17:59:22 +08:00
woody dc1553e244 Merge branch 'bd-dev' of gitee.com:cabbage_qd/web-base-h5 into bd-test 2025-07-29 15:52:23 +08:00
woody 3cf560dd7d feat(mine): 我的-市场动态-活动专区位置调整 2025-07-29 15:52:11 +08:00
woody 1622032fa2 Merge branch 'bd-dev' of gitee.com:cabbage_qd/web-base-h5 into bd-test 2025-07-29 15:32:36 +08:00
woody bc142f686b feat(cart): 购物车添加加购物品校验逻辑 2025-07-29 15:32:20 +08:00
woody 487bef330a feat(region): 放开可选择区域 2025-07-29 09:31:33 +08:00
woody 29ffe52ab9 hotfix(mine/region): 暂时不可更改收益区域 2025-07-29 09:10:37 +08:00
woody a35ba61785 feat(region): add props 2025-07-28 17:50:58 +08:00
woody d79feb1634 feat(region): 前台用户可以自主更改收益区域 2025-07-28 13:45:41 +08:00
woody c30f3226a8 feat(raised-tabbar): 样式调整 2025-07-25 17:52:25 +08:00
woody abc9fc5b98 feat(raised-tabbar): tab组件样式调整 2025-07-25 16:49:19 +08:00
woody 93cad9032e feat(tabbar): tabBar改造 2025-07-25 16:00:11 +08:00
woody eb7a4f68eb feat(bonus): 添加区域收益,修复见点收益不展示的问题 2025-07-25 13:29:29 +08:00
woody 8b948a5ebe fix(bonus): 移除无用组件 2025-07-25 10:46:07 +08:00
woody bcc36ad68b Merge branch 'bd-region-select' of gitee.com:cabbage_qd/web-base-h5 into bd-dev 2025-07-25 10:41:32 +08:00
woody b220b728ee feat(bonus): 移除奖金无用页面 2025-07-25 10:00:41 +08:00
woody 0253e396bf feat(region-select): 样式调整 2025-07-25 09:42:30 +08:00
woody cb69eea60d feat(region-select): 添加收益区域查看页面 2025-07-25 09:07:39 +08:00
woody e9f8842fd2 feat(sgsy): 奖金明细添加见点收益字段 2025-07-24 15:15:40 +08:00
woody edcc03d9a6 Merge branch 'bd-dev' of gitee.com:cabbage_qd/web-base-h5 into bd-region-select 2025-07-24 11:04:58 +08:00
woody 8e1fc10696 feat(share): default share bg 2025-07-24 10:47:40 +08:00
yeweikangxx123 645c1abad4 fix(util): 精度问题处理 2025-07-23 23:41:45 +08:00
woody 7b6507933f feat(order): 移除货币符号 2025-07-23 16:46:02 +08:00
woody 5ce4f3de27 Merge branch 'bd-dev' of gitee.com:cabbage_qd/web-base-h5 into bd-region-select 2025-07-23 16:30:05 +08:00
woody 1f1e5037a3 feat(order): 订单页面展示字段调整 2025-07-23 16:09:41 +08:00
woody 8a9bd2e7cb feat(regionselect): 添加区域选择组件 2025-07-23 16:05:07 +08:00
woody 561821d172 feat(order): 订单页面移除货币符号 2025-07-23 15:47:55 +08:00
woody 22c0f61093 feat(hiOrder): 分享注册移除货币符号 2025-07-23 15:41:46 +08:00
woody 3dd715d993 feat(hiOrder): 隐藏运输方式和发货方式, 收获信息表单项添加required 2025-07-23 13:27:23 +08:00
woody 3fcd2a40e7 feat(hiList): pkParent 2025-07-22 16:40:30 +08:00
woody 0bb73339c4 fix(pay): 修复removeToken不存在的问题 2025-07-22 16:35:49 +08:00
woody 6d19c48be1 feat(hiList): use code 2025-07-22 16:13:29 +08:00
woody 18a56b47d5 feat(specialArea): 底部栏高亮问题修复 2025-07-22 16:07:00 +08:00
woody f098aae2d9 feat(share): 分享页逻辑处理,隐藏按钮 2025-07-22 15:50:16 +08:00
woody f0bc328d52 feat(pay): 分享下单注册支付 2025-07-22 15:28:02 +08:00
woody 76a91884c9 feat(sharePay): 分享下单支付 2025-07-22 09:12:50 +08:00
woody 499f07942a feat(mine): pkAwwardsValue < 40 非皇冠奖衔展示历史业绩 2025-07-18 13:28:08 +08:00
woody df3779c2db feat(mine): 强制保留两位小数 2025-07-18 11:17:48 +08:00
woody 73f6f1abf1 feat(mine): 拓展结余展示调整 2025-07-18 11:10:19 +08:00
woody 81505df53f fix(mine): 拓展结余展示万级单位 2025-07-16 10:40:43 +08:00
woody c16f8eacf7 feat(mine): fix balance 2025-07-15 13:43:32 +08:00
woody e819dc852c feat(mine): 原拓展结余改为当期结余,添加拓展结余 2025-07-15 09:41:25 +08:00
woody 578c0f8178 feat(specialArea): 商品角标大小调整 2025-07-12 14:01:55 +08:00
woody 3cd7a533e1 feat(pay/index): 充值页面输入框大小调整 2025-07-12 13:41:49 +08:00
woody 073775840b feat(pay/index): 充值页面添加快捷充值按钮 2025-07-11 14:56:28 +08:00
woody a16b7d70c2 feat(specialList): 移除专区列表一级分类全部选项 2025-07-10 13:54:58 +08:00
woody 0960c2d205 feat(withDrawal): 提现账户不展示问题处理 2025-07-08 16:28:37 +08:00
woody 74a109be7a fix(withDrawal): 提现disable 2025-07-08 16:22:09 +08:00
woody 187d2411e2 feat(withDrawal): 提现取消银行卡校验,提现成功后展示小程序码弹窗 2025-07-08 15:59:09 +08:00
woody 7f08fc4883 feat(withdrawal): 提现页面弹窗提示 2025-07-08 14:27:34 +08:00
woody 620d63ce00 Merge branch 'bd-online' of gitee.com:cabbage_qd/web-base-h5 into bd-dev 2025-07-08 14:04:16 +08:00
woody 017a4af8f6 fix(refund/detail): 退款列表样式问题修复 2025-07-08 10:14:22 +08:00
woody 744cacfd7c fix(pay): 支付页面修复&&逻辑 2025-07-08 09:43:36 +08:00
woody d2db18d57e feat(pay): merge pay 2025-07-08 09:32:48 +08:00
woody ee01aba367 feat(success): 充值文案展示 2025-07-08 09:20:27 +08:00
woody 50175fb2b5 feat(pay/success): 支付成功页面参数处理 2025-07-08 09:20:16 +08:00
woody ee2d1bced8 feat(refund/detail): 退款金额保留两位小数 2025-07-08 09:20:09 +08:00
woody 472b36fa0d fix(pay): 充值支付逻辑完善 2025-07-08 09:20:04 +08:00
woody 3bb3f240f1 feat(refund): 添加退款列表 2025-07-08 09:19:55 +08:00
woody dee1eedaa2 feat(pay/success): 支付成功逻辑处理 2025-07-08 09:19:38 +08:00
woody d4e830798b feat(success): add setTimeout for registerInfo 2025-07-08 09:19:30 +08:00
woody 7eccc44b80 feat(pay/success): 充值文案调整 2025-07-08 09:19:25 +08:00
woody c4a25055bc feat(success): 支付成功页面添加轮询逻辑 2025-07-08 09:19:14 +08:00
woody cdc06aaf90 feat(specialareaList): showToast add duration 2025-07-08 09:19:06 +08:00
woody 2dc99ba6c2 feat(pay): 添加支付成功页面 2025-07-08 09:18:41 +08:00
woody aaf0fef512 feat(success): 充值文案展示 2025-07-07 14:53:51 +08:00
woody fd50c66b45 feat(pay/success): 支付成功页面参数处理 2025-07-07 14:39:17 +08:00
woody b97b5aecf5 feat(refund/detail): 退款金额保留两位小数 2025-07-05 16:08:44 +08:00
woody d7a22a9bb3 fix(pay): 充值支付逻辑完善 2025-07-05 15:45:42 +08:00
woody 196a4c0909 feat(refund): 添加退款列表 2025-07-05 15:23:16 +08:00
woody 741bd8656d feat(specialArea): 添加角标 2025-07-05 13:51:23 +08:00
woody cb8e6eeb13 feat(pay/success): 支付成功逻辑处理 2025-07-03 16:44:18 +08:00
woody 2ed0e7b409 feat(success): add setTimeout for registerInfo 2025-07-03 15:41:45 +08:00
woody 9610a30b6c feat(pay): 支付功能实现 2025-07-03 15:20:46 +08:00
woody c53c7f86e3 feat(pay/success): 充值文案调整 2025-07-03 14:17:42 +08:00
woody a11f104adc feat(success): 支付成功页面添加轮询逻辑 2025-07-03 13:24:47 +08:00
woody 51099d3e71 feat(specialareaList): showToast add duration 2025-07-03 09:56:13 +08:00
woody 492dd04657 feat(pay): 添加支付成功页面 2025-07-03 09:40:07 +08:00
woody 665e18d3de Merge branch 'bd-dev' of gitee.com:cabbage_qd/web-base-h5 into bd-test 2025-06-26 14:13:57 +08:00
woody b1b3f47d22 feat(registerList): 注册列表移除交易时间 2025-06-26 10:44:36 +08:00
woody 8710d4f4ce Merge branch 'bd-dev' of gitee.com:cabbage_qd/web-base-h5 into bd-test 2025-06-26 10:32:01 +08:00
woody 7382ba3754 fix(mine): 拓展结余进度条问题修复 2025-06-26 10:31:47 +08:00
woody 2a9b81f429 Merge branch 'bd-dev' of gitee.com:cabbage_qd/web-base-h5 into bd-test 2025-06-26 09:26:43 +08:00
woody a2544cb18c feat(mine): 拓展结余展示逻辑变更 2025-06-26 09:26:27 +08:00
woody a8b88a7ca7 Merge branch 'bd-dev' of gitee.com:cabbage_qd/web-base-h5 into bd-test 2025-06-25 09:00:39 +08:00
woody ec55de2d7b feat(mine): 拓展结余样式调整 2025-06-24 17:25:14 +08:00
woody 16d4fc43a6 feat(mine): 添加拓展结余展示 2025-06-24 16:44:10 +08:00
woody 224283c09a Merge branch 'bd-dev' of gitee.com:cabbage_qd/web-base-h5 into bd-test 2025-06-18 15:57:47 +08:00
woody b38e4cbfb1 feat(global): 测试账号memberCode变更CN->BD 2025-06-18 15:57:29 +08:00
woody 08d5253fb1 feat(pay): 支付页面联调 2025-06-18 15:26:16 +08:00
woody 1bf6ebc801 Merge branch 'bd-dev' of gitee.com:cabbage_qd/web-base-h5 into bd-test 2025-06-17 14:37:29 +08:00
woody 73784ad663 feat(other): 订单确认页面移除创客相关接口 2025-06-17 14:37:10 +08:00
woody bc1ea11e37 feat(gloabl): 列表商品展示使用封面图字段cover 2025-06-06 11:25:12 +08:00
woody e4b055b75a fix(bonus): 奖金明细页面调整优化 bug-149 2025-06-05 14:15:01 +08:00
woody e9ecdda872 feat(index): 首页立即续约逻辑暂时注释 2025-06-03 09:28:06 +08:00
woody 5736cf0ebc feat(buy): 移除购票页面输入支付密码20位长度限制 2025-05-30 13:20:34 +08:00
woody a2dfe1216f feat(specialArea): 会员专区首页去除货币符号,小数位处理 2025-05-30 10:42:09 +08:00
woody 8a3cb6787c feat(config): 全局货币符号控制展示隐藏 2025-05-30 10:41:39 +08:00
woody 96508a557c feat(global): pv展示文案改为业绩 bug-132 2025-05-30 10:41:13 +08:00
woody 3818465563 feat(wl): 查看物流包裹名称优化 2025-05-30 09:06:40 +08:00
woody c3f7b0050f feat(wl): 查看物流页面样式调整 2025-05-29 14:21:56 +08:00
woody 2cb764e18a fix(ticket): 性别问题修复, 购票提交按钮居中问题处理 2025-05-28 16:22:21 +08:00
woody 72fcef675d fix(ticket): 购票bug修复,移除自定义导航栏 2025-05-28 15:29:20 +08:00
woody d36a41b103 feat(ticket): 移除购票默认值 2025-05-28 11:03:00 +08:00
woody 3a7d66807f feat(ticket): 门票撤单及编辑功能完善 2025-05-28 10:45:36 +08:00
woody b63155a5ac feat(ticket): 添加门票功能 2025-05-28 09:16:29 +08:00
woody 8743a64873 merge: 代码合并 2025-05-27 11:20:20 +08:00
woody 0026dbca10 feat(mine): 移除创客空间 2025-05-27 11:17:39 +08:00
woody 9b17d3b477 feat(mine): 我的页面根据会员号隐藏奖衔内容 2025-05-27 11:04:06 +08:00
woody bf2230600d feat(mine): 我的页面根据会员号隐藏奖衔内容 2025-05-27 11:03:22 +08:00
woody 8adb203a5a Merge branch 'lx-online' of gitee.com:cabbage_qd/web-base-h5 into bd-dev 2025-05-27 10:09:44 +08:00
woody 37a91fe8a5 Merge branch 'lx-dev' of gitee.com:cabbage_qd/web-base-h5 into lx-online 2025-05-27 09:05:10 +08:00
woody cbadf2ae09 feat(selfSerivce): 自助服务-户籍变更跳转逻辑处理 2025-05-26 18:01:20 +08:00
woody b66e3243de feat(selfSerivce): 自助服务-户籍变更跳转逻辑处理 2025-05-26 17:58:09 +08:00
woody 1f11f6ba79 feat(domicle): 户籍变更页面去除审核相关字段,移除变更费用,情况说明非必填 2025-05-26 16:31:06 +08:00
woody 17f6fb9228 feat(domicle): 户籍变更页面去除审核相关字段,移除变更费用,情况说明非必填 2025-05-26 16:27:53 +08:00
woody e388b3a10f feat(updateAddress): add loading 2025-05-26 11:48:46 +08:00
woody cc09124476 feat(updateAddress): 修复修改地址成功后返回列表页不刷新的问题 2025-05-26 11:48:41 +08:00
woody 497126ac47 feat(updateAddress): add loading 2025-05-26 11:47:31 +08:00
woody f911c08d96 feat(updateAddress): 修复修改地址成功后返回列表页不刷新的问题 2025-05-26 11:43:38 +08:00
woody 5f0d1cceff feat(updateAddress): 修改地址去除审核状态相关展示 2025-05-26 11:15:29 +08:00
woody 21d10de6e2 feat(updateAddress): 修改地址去除审核状态相关展示 2025-05-26 11:14:14 +08:00
woody 30558bbeae fix(order): 订单详情添加规格, 添加代码格式化 2025-05-23 17:40:13 +08:00
woody f214679ace feat(bindBank): 手机号格式校验 2025-05-23 17:39:15 +08:00
woody af8f0487cb chore(lint): add lint 2025-05-23 17:38:55 +08:00
woody a25c956424 feat(global): 手机号正则校验处理 2025-05-22 17:47:14 +08:00
woody 33000a32bb feat(addAddress): 修改地址手机号正则提示 2025-05-22 17:32:33 +08:00
woody 606001aa17 feat(mine): 删除推荐、抗衰达人接口及页面 2025-05-21 15:13:47 +08:00
woody 0d95e7df59 Merge branch 'lx-online' of gitee.com:cabbage_qd/web-base-h5 into bd-dev 2025-05-21 10:07:14 +08:00
woody 663deb7c3c Merge branch 'lx-dev' of gitee.com:cabbage_qd/web-base-h5 into lx-online 2025-05-21 10:05:08 +08:00
woody 2df9abaf42 feat(bonus): 奖金明细合计样式调整 2025-05-20 15:13:51 +08:00
woody c3851b2f26 feat(bonus-sgsy): 奖金明细-首购收益移除级差收益与直推收益 2025-05-20 10:40:43 +08:00
woody 1e1aa3a6a0 feat(bonus): 奖金明细-合计标题改名 2025-05-20 10:33:55 +08:00
woody 835e6984ca feat(request): update request 2025-05-20 10:28:15 +08:00
woody 9f34a5cc9f feat(bonus): 奖金明细页面添加本月实发合计 2025-05-20 10:27:43 +08:00
woody 3b457b4eb3 feat(specialAreaDetail): 商品详情视频主图处理 2025-05-19 09:40:09 +08:00
woody 37a91c6044 Merge branch 'lx-online' of gitee.com:cabbage_qd/web-base-h5 into bd-dev 2025-05-15 10:14:09 +08:00
woody 37049df9ec Merge branch 'lx-dev' of gitee.com:cabbage_qd/web-base-h5 into lx-online 2025-05-15 10:10:12 +08:00
woody 664baccdac Merge branch 'lx-online' of gitee.com:cabbage_qd/web-base-h5 into bd-dev 2025-05-14 14:47:46 +08:00
woody affc9f316b feat(mine): 个人页面奖衔相关展示调整 2025-05-14 14:17:36 +08:00
woody 0cfd371b11 fix(mine): 修复接口500导致奖衔字段undefined后页面后续交互被阻塞的问题 2025-05-14 14:17:29 +08:00
woody 8a41de8643 feat(mine): 个人页面奖衔相关展示调整 2025-05-13 17:30:57 +08:00
woody 02050ea5a7 Merge branch 'lx-online' of gitee.com:cabbage_qd/web-base-h5 into bd-dev 2025-05-12 09:36:31 +08:00
woody e617378fcc fix(mine): 修复接口500导致奖衔字段undefined后页面后续交互被阻塞的问题 2025-05-10 20:58:16 +08:00
woody 5bfb9f8f63 fix(mine): 修复接口500导致奖衔字段undefined后页面后续交互被阻塞的问题 2025-05-10 20:53:50 +08:00
woody b5e1d3974c feat(api): 移除无用接口 2025-05-09 16:09:55 +08:00
woody bbc69676e3 feat(login): 验证码相关逻辑验证,重置支付密码获取验证码更换接口 2025-05-09 14:07:56 +08:00
woody 7d9d9e2bf3 fix(mine): 字段展示逻辑变更, 小区仅需字段含义变为需要计算获得 2025-05-08 17:57:38 +08:00
woody 5970497069 feat(request): baseurl 2025-05-08 12:50:43 +08:00
woody 113e5e61ff feat(mine): 添加奖衔距离相关文案 2025-05-08 12:50:06 +08:00
woody 16d41c4857 fix(mine):展示距离下个奖衔进度文案 bug 2025-05-08 11:56:49 +08:00
woody 0984e3910d chore(manifest): add dev proxy 2025-04-29 11:47:56 +08:00
woody 96b56e2a12 feat(order): 订单-支付按钮主题色处理 2025-04-28 17:36:41 +08:00
woody 8432603d76 fix(details): 商品详情购物车数量问题修复 2025-04-28 11:50:18 +08:00
woody 449015c33e fix(index): bug-52 隐藏累计销量 2025-04-28 11:41:31 +08:00
woody aaeb240673 feat(index): 首页banner样式调整 2025-04-28 11:31:27 +08:00
woody 3ced29bb63 feat(area-product-list): update size style 2025-04-28 11:22:00 +08:00
woody 7b50c09175 feat(index): add banner add margin 2025-04-28 11:11:55 +08:00
woody 90c154f8ea feat(index): 专区列表替换为组件, 专区列表组件添加size 2025-04-28 11:00:10 +08:00
woody 94cab75c5d feat(index): update index style 2025-04-28 09:49:59 +08:00
woody e618f90599 feat(area-product-list): 商品价格颜色调整为红色 2025-04-27 16:56:41 +08:00
woody 94ab145112 feat(performanceDistribution): 月度业绩移除数字单位 2025-04-27 14:46:57 +08:00
woody d79812d6fb feat(request): baseUrl 2025-04-27 14:07:56 +08:00
woody ff671ff19c Merge branch 'base-dev' of gitee.com:cabbage_qd/web-base-h5 into feat/product-list 2025-04-27 14:06:36 +08:00
woody a88c997e5a feat(index): 首页渐变色样式变更 2025-04-27 14:05:28 +08:00
woody efec6f264a feat(specialArea): 会员专区布局样式处理 2025-04-27 10:59:43 +08:00
woody 7d3147be53 feat(sgsy): 奖金明细 - 首购收益,展示字段逻辑变更, 无论是否为0都展示 2025-04-27 09:17:57 +08:00
woody 8582e0c9b3 feat(product-list): 专区商品列表组件开发 2025-04-25 18:07:27 +08:00
woody e1d88137ae feat(cartBall): 购物车坐标位置优化 2025-04-25 11:54:43 +08:00
woody 7316794ba9 feat(circulation): 暂时屏蔽三单循环内的轮次展示 2025-04-25 10:13:27 +08:00
woody 7e4d43b517 feat(specialArea/list): tab页签展示逻辑变更,当只有一个的情况下不展示,修复了之前异步的问题 2025-04-25 10:04:52 +08:00
woody b3c76bf7a5 feat(specialArea): 会员专区商品列表tab分类改名 2025-04-25 09:28:54 +08:00
woody 082efbb9d4 feat(request): update dev baseUrl 2025-04-24 19:56:14 +08:00
woody 66c825ada4 fix(mine): 当月业绩进度条展示错误修复 2025-04-24 19:55:39 +08:00
woody 496a21acea fix(mine): 当月业绩进度条展示错误修复 2025-04-24 19:55:20 +08:00
woody 8d6a31589d chore(package): rename package name 2025-04-24 17:50:24 +08:00
woody 27f4be0621 feat(userSecure): 移除月度累计业绩入口,删除更新邮箱相关内容 2025-04-24 14:47:05 +08:00
woody d6a998fb1a feat(mine): 我的页面结算等级字体样式调整 2025-04-24 14:29:47 +08:00
woody 49ca3babc9 feat(request): request baseUrl 改为相对路径 2025-04-24 14:20:56 +08:00
woody eaf598a51e fix(specialArea): bug-42 修复注册专区等下单支付成功后,订单后退路径不正确的问题, 购物车状态机添加set方法 2025-04-24 14:19:12 +08:00
woody 00f02dc653 feat(comment): 移除作者注释 2025-04-24 10:08:32 +08:00
woody d13db2a700 feat(comment): rm author comment 2025-04-24 10:06:53 +08:00
woody d637665bc2 feat(comment): rm author comment 2025-04-24 10:00:38 +08:00
woody 7acc462799 fix(mine): 当月业绩进度条展示问题修复 2025-04-23 15:36:57 +08:00
woody 1b8742bcc2 feat(global): update theme 2025-04-23 11:51:12 +08:00
woody 74af716566 feat(order): background transparent 2025-04-23 11:09:43 +08:00
woody a56794e2e2 feat(order): 主题色样式问题处理 2025-04-23 11:08:53 +08:00
woody 68c423c703 feat(global): 主题色变更 2025-04-22 17:47:02 +08:00
woody 6957f1d7b5 feat(index): 首页商品列表样式变更 2025-04-22 15:16:47 +08:00
woody 024c0c585f feat(mine): 展示当月业绩 2025-04-22 11:07:09 +08:00
woody a64f593b4d feat(mine): 测试支付账号更换 2025-04-22 10:06:07 +08:00
woody dd1e06b057 feat(mine): 移除获取会员奖衔信息接口,直接从用户信息里获取 2025-04-22 09:48:22 +08:00
woody ce54b039e9 fix(index): #bug37 页面白屏问题修复 2025-04-22 09:10:22 +08:00
woody d101d66417 fix(mine): fix progress bar style 2025-04-21 20:18:57 +08:00
woody 6280f3b418 feat(app): set token if url has token query 2025-04-19 11:52:43 +08:00
appleyou e89e3ac5e8 fix(withDrawlDetail): 修复移除i18n导致的页面面展示异常问题 2025-04-15 13:56:04 +08:00
ywk 8c27455ed4 fix(forgetPassword): fix placeholder not correct bug 2025-04-15 13:47:07 +08:00
ywk 030f0e0771 fix(mine/bonus): 我的页面奖衔相关展示逻辑变更,奖金隐藏查看详情 2025-04-14 09:44:09 +08:00
ywk 1174d23ab1 fix(bonus): 展示复购收益tab 2025-04-11 16:46:01 +08:00
ywk e2505e6d13 chore(manifest): update config 2025-04-11 15:36:57 +08:00
ywk 6867961891 fix(global): 移除联系客服 2025-04-11 11:33:42 +08:00
ywk 97a8fd35ee fix(auth): update expires_in 2025-04-11 11:10:38 +08:00
ywk 2d9af0472d style(noticePopup): 代码格式化 2025-04-11 10:43:47 +08:00
ywk 6b2e35480b feat(pay): 支付按钮添加disabled状态 2025-04-11 10:42:20 +08:00
ywk 8779a723cd fix(pay): 充值支付字段缺失导致报错问题修复 2025-04-11 10:05:35 +08:00
ywk 1a7dd1b626 fix(bonus): navList为空时占位问题修复 2025-04-10 09:51:18 +08:00
ywk aa18b0f15a fix(order): 头部z-index问题处理 2025-04-10 09:36:42 +08:00
ywk 6db470a5b9 fix(shoppingCart): bug#16 购物车页面缓存导致的bug修复 2025-04-10 09:20:26 +08:00
ywk 83621a2d03 fix(cartBtmList): bug#15 rm debug 2025-04-10 09:06:49 +08:00
ywk 7bac32fd48 fix(navBar): 后退导航栏z-index数值过大 2025-04-09 19:15:35 +08:00
ywk 529ac10447 fix(noticePopup): 修复样式问题导致首页下方留白过多的问题 2025-04-09 18:56:29 +08:00
ywk 506f0226ce fix(cartBtmList): 修复购物车空态展示问题及结算按钮disable状态问题 2025-04-09 18:11:24 +08:00
ywk 076038ea73 chore(request): 相对路径替换绝对路径 2025-04-09 16:45:58 +08:00
ywk 4ecc3ed932 fix(transDetail): 修复清空筛选项后,再次点击筛选条件无法高亮的问题 2025-04-09 16:31:29 +08:00
ywk 3eae134342 feat(request): update dev baseUrl 2025-04-09 16:25:02 +08:00
ywk 6285d314c2 feat(request): update request baseUrl 2025-04-09 15:38:15 +08:00
ywk d6d6f9f362 fix(regiest): bug-4 fix pkCountry undefined 2025-04-09 12:48:05 +08:00
ywk 188527c872 fix(regiest): bug-5 隐藏阅读协议 2025-04-09 12:34:37 +08:00
ywk 3ce035070e fix(order): bug-6 订单业绩bv不展示 2025-04-09 11:59:40 +08:00
ywk 7186ecb48f fix(mine): bug-8 隐藏电子会员卡入口 2025-04-09 11:58:07 +08:00
ywk 639961e2ce fix(addAddress): bug-10 删除售后电话 2025-04-09 11:55:43 +08:00
ywk c92769d6f4 fix(selfService): bug-11 隐藏订单自提入口 2025-04-09 11:53:56 +08:00
ywk 2a83859ab8 fix(mine): bug-14 移除我的市场和礼品地址入口 2025-04-09 11:46:37 +08:00
ywk 0955855195 fix(selfService): bug-9 移除无用项 2025-04-09 11:41:37 +08:00
ywk 8d2d3f4424 feat(bindBank): 三方接口原因,暂时屏蔽部分逻辑 2025-04-09 11:20:55 +08:00
ywk a682b278c2 feat(realName): 展示身份证上传 2025-04-09 11:10:35 +08:00
ywk 87488fb54d feat(transDetail): 筛选交互优化 2025-04-09 10:48:03 +08:00
ywk 4edb5d9190 feat(realName): 实名认证去除部分字段 2025-04-09 10:20:50 +08:00
ywk f72f4930fa chore(package): add env 2025-04-09 09:30:26 +08:00
cabbage 21b75f40b8 ## 代金券改为法宝券; 2025-04-08 20:12:18 +08:00
ywk fa545caa2d fix(balance): 国际化问题处理 2025-04-08 20:10:00 +08:00
ywk 08545536d3 feat(prettier): add prettier for code 2025-04-08 17:51:03 +08:00
ywk 1648e0da0d feat(mine): 样式问题处理 2025-04-08 16:45:01 +08:00
ywk ab388f9971 feat(pay): 屏蔽在线支付入口 2025-04-08 13:44:54 +08:00
ywk 56867615ad feat(mine): 页面布局优化 2025-04-08 09:37:18 +08:00
ywk 316a06292e feat(mine): 位置变更 2025-04-07 18:06:30 +08:00
ywk 36461e76b6 feat(userData): 移除无用字段,处理用户昵称保存报错的问题,订单列表高级筛选问题修复 2025-04-07 18:00:26 +08:00
ywk 27f7a374f4 feat(email): 不展示站内信及意见反馈 2025-04-07 16:49:34 +08:00
ywk 2e0bfece93 feat(login): 获取用户信息后跳转首页 2025-04-07 16:42:52 +08:00
ywk 596ad9d456 fix(userData): remove uesless field 2025-04-07 16:26:25 +08:00
ywk ce3df63cb3 fix(regiest): 修复安置地区变化时无法触发表单校验的bug 2025-04-07 16:06:47 +08:00
ywk 57393066d7 feat(regiest): rm useless form field 2025-04-07 13:16:14 +08:00
ywk 21cfa2b371 feat(request): baseUrl update 2025-04-07 11:41:04 +08:00
ywk e40c56e3af fix(cart): 移除无用接口 2025-04-07 11:21:11 +08:00
ywk 6d925b04ae fix(api): rm cart api 2025-04-07 11:04:19 +08:00
yeweikangxx123 d90402bc38 fix(cl-tabbar): 优化skin添加默认值 2025-04-02 23:13:16 +08:00
yeweikangxx123 f090c5dc63 fix(cl-tabbar): 修复user.skin不存在时导致底部tab无法正确展示的问题 2025-04-02 23:10:59 +08:00
jiangchao d79a69d5ad ## 国际化只保留中文; 2025-04-02 07:48:13 +08:00
yeweikangxx123 6ad4659a5e feat(global): 全局国际化文案替换 2025-04-01 21:35:18 +08:00
yeweikangxx123 9e86e11f6f fix(style): 修复css预处理器无法处理/deep/ 导致编译崩溃的问题 2025-04-01 17:06:24 +08:00
jiangchao 5c9a9f9e09 ## 去掉值树和直推排行; 2025-04-01 16:17:59 +08:00
jiangchao a12579e416 ## HBuilder打包;去掉不用的接口; 2025-04-01 15:58:19 +08:00
246 changed files with 44530 additions and 25021 deletions

12
.editorconfig Normal file
View File

@ -0,0 +1,12 @@
root = true
[*]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
[*.md]
trim_trailing_whitespace = false

39
.eslintrc.js Normal file
View File

@ -0,0 +1,39 @@
module.exports = {
env: {
browser: true,
es2021: true,
node: true,
},
extends: ['eslint:recommended', '@vue/eslint-config-prettier'],
parserOptions: {
ecmaVersion: 2021,
sourceType: 'module',
},
globals: {
uni: 'readonly',
wx: 'readonly',
plus: 'readonly',
getCurrentPages: 'readonly',
getApp: 'readonly',
},
rules: {
// Vue规则
'vue/multi-word-component-names': 'off',
'vue/no-unused-vars': 'error',
'vue/valid-v-for': 'error',
'vue/require-v-for-key': 'error',
'vue/no-deprecated-filter': 'error',
// JavaScript规则
'no-unused-vars': 'warn',
'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
// 代码风格
semi: ['error', 'never'],
quotes: ['error', 'single'],
'comma-dangle': ['error', 'only-multiline'],
indent: ['error', 2],
'eol-last': ['error', 'always'],
},
}

39
.prettierignore Normal file
View File

@ -0,0 +1,39 @@
# Dependencies
node_modules/
# Build output
dist/
build/
out/
unpackage/ # uni-app output
# Lock files
package-lock.json
yarn.lock
# Git
.git/
# OS generated
.DS_Store
# uni-app specific
uni_modules/
.hbuilderx/
# Logs
*.log
# Docs
docs/
# IDE settings
.vscode/
.idea/
# Temporary files
*.tmp
*.temp
# Configuration files that shouldn't be formatted
manifest.json

8
.prettierrc.json Normal file
View File

@ -0,0 +1,8 @@
{
"semi": false,
"singleQuote": true,
"trailingComma": "es5",
"printWidth": 80,
"tabWidth": 2,
"arrowParens": "avoid"
}

24
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,24 @@
{
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "explicit",
"source.organizeImports": "explicit"
},
"editor.defaultFormatter": "esbenp.prettier-vscode",
"[vue]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[javascript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[json]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"eslint.validate": ["javascript", "vue"],
"prettier.requireConfig": true,
"editor.tabSize": 2,
"editor.insertSpaces": true,
"files.eol": "\n",
"files.insertFinalNewline": true,
"files.trimTrailingWhitespace": true
}

41
App.vue
View File

@ -1,31 +1,26 @@
<!--
* @Descripttion:
* @version:
* @Author: kBank
* @Date: 2022-11-21 15:11:22
-->
<script>
import { setToken } from '@/config/auth.js'
export default {
onLaunch: function () {
let url = window.location.href.split('/#/')[1].split('?')[0]
onLaunch: function (options) {
//
if (options.query?.token) {
setToken(options.query?.token)
}
const whiteList = [
'pages/shareRegist/index',
'pages/shareRegist/success',
'pages/login/index',
'pages/wechatPay/bfPay/',
'pages/wechatPay/hfPay/',
'pages/pay/success',
// 'pages/wechatPay/bfPay/',
// 'pages/wechatPay/hfPay/',
'pages/shareArea/hiList',
'pages/shareArea/hiOrder',
'pages/pay/hiPay'
'pages/pay/hiPay',
]
if (whiteList.indexOf(url) !== -1) {
} else {
this.$store.dispatch('GetInfo')
this.$store.dispatch('getCarLength')
}
if (whiteList.indexOf(options.path) !== -1) return
this.$store.dispatch('GetInfo')
this.$store.dispatch('getCarLength')
uni.hideTabBar({})
},
onShow: function () {
@ -36,13 +31,13 @@ export default {
</script>
<style lang="scss">
body{
background-color: #f2f2f2;
}
body {
background-color: #f2f2f2;
}
/*每个页面公共css */
@import '@/uni_modules/uview-ui/index.scss';
::v-deep .uni-picker-container{
z-index: 100000!important;
::v-deep .uni-picker-container {
z-index: 100000 !important;
}
</style>

View File

@ -1,9 +1,4 @@
<!--
* @Descripttion:
* @version:
* @Author: 王三华
* @Date: 2022-11-21 15:11:22
-->

View File

@ -0,0 +1,153 @@
<template>
<view class="quick-recharge-panel">
<view class="panel-title">请选择充值金额</view>
<view class="amount-grid">
<view
v-for="(amount, index) in amounts"
:key="index"
class="amount-item"
:class="{ selected: selectedIndex === index }"
@click="selectAmount(amount, index)"
>
<view class="amount-value">
<text class="amount-number">{{ formatAmount(amount) }}</text>
</view>
</view>
</view>
</view>
</template>
<script>
export default {
name: 'QuickRechargePanel',
props: {
//
amounts: {
type: Array,
default: () => [100, 200, 500, 1000, 2000, 5000],
},
//
currencySymbol: {
type: String,
default: '',
},
//
defaultSelected: {
type: Number,
default: -1,
},
},
data() {
return {
selectedIndex: this.defaultSelected,
}
},
methods: {
selectAmount(amount, index) {
this.selectedIndex = index
this.$emit('amount-selected', {
amount,
index,
})
},
//
clear() {
this.selectedIndex = -1
},
//
formatAmount(amount) {
return amount.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',')
},
},
}
</script>
<style lang="scss" scoped>
.quick-recharge-panel {
margin-top: 20rpx;
padding: 20rpx;
background: #fff;
border-radius: 20rpx;
box-shadow: 0px 2px 20rpx 0px rgba(204, 204, 204, 0.3);
}
.panel-title {
font-size: 28rpx;
font-weight: 600;
color: #333333;
margin-bottom: 30rpx;
text-align: center;
}
.amount-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 20rpx;
}
.amount-item {
position: relative;
padding: 24rpx 10rpx;
background: #f8f9fa;
border-radius: 16rpx;
text-align: center;
transition: all 0.3s ease;
cursor: pointer;
border: 2rpx solid transparent;
&:hover {
transform: translateY(-2rpx);
box-shadow: 0px 4px 20rpx 0px rgba(0, 91, 172, 0.15);
}
&.selected {
background: linear-gradient(135deg, #005bac 0%, #0070d4 100%);
color: #fff;
border-color: #005bac;
box-shadow: 0px 4px 20rpx 0px rgba(0, 91, 172, 0.3);
.amount-value {
color: #fff;
}
}
&:active {
transform: translateY(0);
}
}
.amount-value {
display: flex;
align-items: center;
justify-content: center;
font-weight: 600;
color: #333333;
}
.currency-symbol {
font-size: 24rpx;
margin-right: 4rpx;
opacity: 0.8;
}
.amount-number {
font-size: 52rpx;
font-weight: 700;
letter-spacing: 2rpx;
}
//
@media (max-width: 375px) {
.amount-grid {
grid-template-columns: repeat(3, 1fr);
}
.amount-item {
padding: 25rpx 15rpx;
}
.amount-number {
font-size: 40rpx;
}
}
</style>

997
components/RankingPopup.vue Normal file
View File

@ -0,0 +1,997 @@
<template>
<view>
<!-- 直推人数排行榜弹窗 -->
<u-popup
class="ranking-popup"
mode="center"
:show="showPeopleRanking"
:closeOnClickOverlay="false"
border-radius="20"
>
<view style="width: 90vw; height: 85vh" class="popup-container">
<!-- 弹窗头部 -->
<view class="popup-header">
<view class="header-title">直推人数排行榜</view>
</view>
<!-- 前三名特殊展示区域 -->
<view class="top-three-section">
<view class="podium-container">
<!-- 第二名 -->
<view class="podium-item second-place" v-if="peopleTopThree[1]">
<view class="player-area">
<view class="rank-number">
<img src="@/static/images/rank-2.svg" alt="" />
</view>
<!-- <view class="member-code">{{
peopleTopThree[1].memberCode
}}</view> -->
<view
class="member-name"
:class="{ highlight: peopleTopThree[1].isLoginMember == 1 }"
>
{{ peopleTopThree[1].memberName | formatMemberName }}
</view>
<view class="score">{{ peopleTopThree[1].count }}</view>
</view>
</view>
<!-- 第一名 -->
<view class="podium-item first-place" v-if="peopleTopThree[0]">
<view class="player-area">
<view class="rank-number">
<img src="@/static/images/rank-1.svg" alt="" />
</view>
<!-- <view class="member-code">
{{ peopleTopThree[0].memberCode }}
</view> -->
<view
class="member-name"
:class="{ highlight: peopleTopThree[0].isLoginMember == 1 }"
>
{{ peopleTopThree[0].memberName | formatMemberName }}
</view>
<view class="score">{{ peopleTopThree[0].count }}</view>
</view>
</view>
<!-- 第三名 -->
<view class="podium-item third-place" v-if="peopleTopThree[2]">
<view class="player-area">
<view class="rank-number">
<img src="@/static/images/rank-3.svg" alt="" />
</view>
<!-- <view class="member-code">{{
peopleTopThree[2].memberCode
}}</view> -->
<view
class="member-name"
:class="{ highlight: peopleTopThree[2].isLoginMember == 1 }"
>
{{ peopleTopThree[2].memberName | formatMemberName }}
</view>
<view class="score">{{ peopleTopThree[2].count }}</view>
</view>
</view>
</view>
</view>
<!-- 4-30名滚动列表 -->
<view class="ranking-list">
<scroll-view
class="scroll-container"
scroll-y="true"
:show-scrollbar="false"
>
<view
class="list-item"
v-for="(item, index) in peopleRemainingList"
:key="index"
>
<view class="item-rank">{{ index + 4 }}</view>
<view class="item-info">
<!-- <view class="item-code">{{ item.memberCode }}</view> -->
<view
class="item-name"
:class="{ highlight: item.isLoginMember == 1 }"
>
{{ item.memberName | formatMemberName }}
</view>
</view>
<view class="item-score">
<span>{{ item.count }}</span>
<span></span>
</view>
</view>
<view class="list-footer" v-if="peopleRemainingList.length === 0">
<text class="empty-text">暂无更多数据</text>
</view>
</scroll-view>
</view>
<!-- 底部关闭按钮 -->
<view class="popup-footer">
<view class="close-text-btn" @click="closePeopleRanking">
</view>
</view>
</view>
</u-popup>
<!-- 直推金额排行榜弹窗 -->
<u-popup
class="ranking-popup"
width="85%"
height="85%"
mode="center"
:show="showAmountRanking"
:closeOnClickOverlay="false"
border-radius="20"
>
<view style="width: 90vw; height: 85vh" class="popup-container">
<!-- 弹窗头部 -->
<view class="popup-header">
<view class="header-title">直推金额排行榜</view>
</view>
<!-- 前三名特殊展示区域 -->
<view class="top-three-section">
<view class="podium-container">
<!-- 第二名 -->
<view class="podium-item second-place" v-if="amountTopThree[1]">
<view class="player-area">
<view class="rank-number">
<img src="@/static/images/rank-2.svg" alt="" />
</view>
<view
class="member-name"
:class="{ highlight: amountTopThree[1].isLoginMember == 1 }"
>
{{ amountTopThree[1].memberName | formatMemberName }}
</view>
<!-- <view class="member-code">{{
amountTopThree[1].memberCode
}}</view> -->
<view class="score">{{
formatAmount(amountTopThree[1].amount)
}}</view>
</view>
</view>
<!-- 第一名 -->
<view class="podium-item first-place" v-if="amountTopThree[0]">
<view class="player-area">
<view class="rank-number">
<img src="@/static/images/rank-1.svg" alt="" />
</view>
<view
class="member-name"
:class="{ highlight: amountTopThree[0].isLoginMember == 1 }"
>
{{ amountTopThree[0].memberName | formatMemberName }}
</view>
<!-- <view class="member-code">{{
amountTopThree[0].memberCode
}}</view> -->
<view class="score">{{
formatAmount(amountTopThree[0].amount)
}}</view>
</view>
</view>
<!-- 第三名 -->
<view class="podium-item third-place" v-if="amountTopThree[2]">
<view class="player-area">
<view class="rank-number">
<img src="@/static/images/rank-3.svg" alt="" />
</view>
<view
class="member-name"
:class="{ highlight: amountTopThree[2].isLoginMember == 1 }"
>
{{ amountTopThree[2].memberName | formatMemberName }}
</view>
<!-- <view class="member-code">{{
amountTopThree[2].memberCode
}}</view> -->
<view class="score">{{
formatAmount(amountTopThree[2].amount)
}}</view>
</view>
</view>
</view>
</view>
<!-- 4-30名滚动列表 -->
<view class="ranking-list">
<!-- <view class="list-header">
<text class="list-title">完整排行榜</text>
</view> -->
<scroll-view
class="scroll-container"
scroll-y="true"
:show-scrollbar="false"
>
<view
class="list-item"
v-for="(item, index) in amountRemainingList"
:key="index"
>
<view class="item-rank">{{ index + 4 }}</view>
<view class="item-info">
<!-- <view class="item-code">{{ item.memberCode }}</view> -->
<view
class="item-name"
:class="{ highlight: item.isLoginMember == 1 }"
>
{{ item.memberName | formatMemberName }}
</view>
</view>
<view class="item-score">
<span>{{ item.amount }}</span>
</view>
</view>
<view class="list-footer" v-if="amountRemainingList.length === 0">
<text class="empty-text">暂无更多数据</text>
</view>
</scroll-view>
</view>
<!-- 底部关闭按钮 -->
<view class="popup-footer">
<view class="close-text-btn" @click="closeAmountRanking">
</view>
</view>
</view>
</u-popup>
<!-- 加载状态 -->
<u-loading-page
:loading="loading"
loading-text="加载中..."
></u-loading-page>
</view>
</template>
<script>
import * as api from '@/config/index.js'
export default {
name: 'RankingPopup',
data() {
return {
//
showPeopleRanking: false,
showAmountRanking: false,
loading: false,
//
peopleRankingList: [],
peopleTopThree: [],
peopleRemainingList: [],
//
amountRankingList: [],
amountTopThree: [],
amountRemainingList: [],
//
userInfo: uni.getStorageSync('User') || {},
}
},
filters: {
formatMemberName(val) {
return val?.slice(0, 8) || ''
},
},
methods: {
//
async showRankingPopups() {
this.loading = true
try {
//
await Promise.all([this.loadPeopleRanking(), this.loadAmountRanking()])
//
if (this.peopleTopThree.length > 0) {
this.showPeopleRanking = true
} else if (this.amountTopThree.length > 0) {
this.showAmountRanking = true
} else {
this.$emit('onRankingComplete')
}
} catch (error) {
console.error('加载排行榜数据失败:', error)
uni.showToast({
title: '加载失败',
icon: 'error',
})
} finally {
this.loading = false
}
},
//
getCurrentYearMonth() {
const now = new Date()
const year = now.getFullYear()
const month = String(now.getMonth() + 1).padStart(2, '0') // 0
return { year, month }
},
//
async loadPeopleRanking() {
try {
const { year, month } = this.getCurrentYearMonth()
const params = {
year,
month,
faker: true,
}
const res = await api.getTopPeople(params)
console.log(res.data)
if (res.code === 200 && res.data) {
//
const mappedData = res.data.map(item => ({
...item,
memberName: item.memberName,
memberCode: item.memberCode,
count: item.numberOfPeople, //
isLoginMember: item.memberId === this.userInfo.memberId ? 1 : 0, //
}))
this.peopleRankingList = mappedData.slice(0, 30) // 30
this.peopleTopThree = this.peopleRankingList.slice(0, 3)
this.peopleRemainingList = this.peopleRankingList.slice(3)
}
} catch (error) {
console.error('加载人数排行榜失败:', error)
throw error
}
},
//
async loadAmountRanking() {
try {
const { year, month } = this.getCurrentYearMonth()
const params = {
year,
month,
faker: true,
}
const res = await api.getTopAmount(params)
if (res.code === 200 && res.data) {
//
const mappedData = res.data.map(item => ({
...item,
memberName: item.memberName,
memberCode: item.memberCode,
amount: item.numberOfAmount, //
isLoginMember: item.memberId === this.userInfo.memberId ? 1 : 0, //
}))
this.amountRankingList = mappedData.slice(0, 30) // 30
this.amountTopThree = this.amountRankingList.slice(0, 3)
this.amountRemainingList = this.amountRankingList.slice(3)
}
} catch (error) {
console.error('加载金额排行榜失败:', error)
throw error
}
},
//
closePeopleRanking() {
this.showPeopleRanking = false
if (this.amountTopThree.length > 0) {
setTimeout(() => {
this.showAmountRanking = true
}, 300)
} else {
this.$emit('onRankingComplete')
}
},
//
closeAmountRanking() {
this.showAmountRanking = false
//
this.$emit('onRankingComplete')
},
//
formatAmount(amount) {
return amount
},
},
}
</script>
<style lang="scss" scoped>
::v-deep .u-popup__content {
background-color: rgba(0, 0, 0, 0);
}
.popup-container {
width: 100%;
height: 100%;
background: linear-gradient(
135deg,
#003d7a 0%,
#005bac 30%,
#0077cc 70%,
#4a90e2 100%
);
border-radius: 20rpx;
display: flex;
flex-direction: column;
overflow: hidden;
position: relative;
//
&::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: radial-gradient(
ellipse at 30% 20%,
rgba(255, 255, 255, 0.1) 0%,
transparent 50%
);
pointer-events: none;
z-index: 1;
}
}
@keyframes sparkle {
0% {
transform: translateY(0);
}
100% {
transform: translateY(-100rpx);
}
}
.popup-header {
padding: 30rpx 40rpx 20rpx;
flex-shrink: 0;
position: relative;
z-index: 2;
.header-title {
font-size: 38rpx;
font-weight: bold;
color: #ffffff;
text-shadow:
0 2rpx 8rpx rgba(0, 0, 0, 0.6),
0 0 15rpx rgba(74, 144, 226, 0.8),
0 0 25rpx rgba(255, 255, 255, 0.4);
text-align: center;
position: relative;
animation: title-bling 2s ease-in-out infinite alternate;
}
}
.top-three-section {
padding: 20rpx 20rpx 40rpx;
flex-shrink: 0;
position: relative;
z-index: 2;
}
.podium-container {
display: flex;
justify-content: center;
align-items: flex-end;
position: relative;
margin: 0 10rpx;
height: 290rpx;
//
// &::after {
// content: '';
// position: absolute;
// bottom: 0;
// left: 50%;
// transform: translateX(-50%);
// width: 85%;
// height: 30rpx;
// background: linear-gradient(135deg, #424242 0%, #616161 50%, #424242 100%);
// border-radius: 15rpx 15rpx 0 0;
// box-shadow: 0 -6rpx 20rpx rgba(0, 0, 0, 0.3);
// }
}
.podium-item {
display: flex;
flex-direction: column;
align-items: center;
position: relative;
margin: 0 8rpx;
.player-area {
border-radius: 20rpx;
min-width: 140rpx;
text-align: center;
transition: all 0.3s ease;
display: flex;
flex-direction: column;
align-items: center;
justify-content: flex-end;
position: relative;
z-index: 3;
}
//
// &::after {
// content: '';
// position: absolute;
// bottom: 0;
// left: 50%;
// transform: translateX(-50%);
// border-radius: 12rpx 12rpx 0 0;
// box-shadow:
// 0 -6rpx 15rpx rgba(0, 0, 0, 0.25),
// inset 0 3rpx 6rpx rgba(255, 255, 255, 0.15);
// }
.rank-number {
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-size: 26rpx;
font-weight: bold;
color: #fff;
margin-bottom: 15rpx;
position: relative;
img {
filter: drop-shadow(0 4rpx 8rpx rgba(0, 0, 0, 0.3));
transition: all 0.3s ease;
}
}
.member-name {
font-size: 24rpx;
color: #fff;
text-align: center;
margin-bottom: 8rpx;
font-weight: bold;
max-width: 110rpx;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
padding: 6rpx 10rpx;
border-radius: 15rpx;
}
.member-code {
color: #fff;
text-align: center;
margin-top: 8rpx;
font-size: 24rpx;
font-weight: 600;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
padding: 4rpx 8rpx;
border-radius: 12rpx;
backdrop-filter: blur(5rpx);
}
.score {
font-size: 22rpx;
color: #fff;
font-weight: bold;
min-width: 60rpx;
text-align: center;
}
}
//
.second-place {
.player-area {
transform: translateY(10rpx);
}
&::after {
width: 130rpx;
height: 100rpx;
background: linear-gradient(135deg, #c0c0c0 0%, #e8e8e8 50%, #c0c0c0 100%);
}
// .member-name {
// font-size: 26rpx;
// }
// .member-code {
// font-size: 26rpx;
// }
// .score {
// font-size: 26rpx;
// }
.rank-number img {
height: 70rpx;
width: 70rpx;
animation: silver-glow 2s ease-in-out infinite alternate;
}
}
// -
.first-place {
.player-area {
transform: translateY(-40rpx);
}
&::after {
width: 150rpx;
height: 140rpx;
background: linear-gradient(135deg, #ffd700 0%, #ffed4e 50%, #ffd700 100%);
box-shadow:
0 -8rpx 20rpx rgba(0, 0, 0, 0.3),
inset 0 3rpx 6rpx rgba(255, 255, 255, 0.3),
0 0 25rpx rgba(255, 215, 0, 0.4);
}
.rank-number img {
height: 80rpx;
width: 80rpx;
animation: champion-glow 2s ease-in-out infinite alternate;
}
.member-name {
font-size: 28rpx;
color: #ffd700;
animation: champion-text-glow 2s ease-in-out infinite alternate;
}
.member-code {
font-size: 28rpx;
color: #ffd700;
font-weight: 600;
}
.score {
color: #ffd700;
font-size: 28rpx;
font-weight: 900;
}
}
//
.third-place {
.player-area {
transform: translateY(10rpx);
}
.rank-number img {
height: 65rpx;
width: 65rpx;
animation: bronze-glow 2s ease-in-out infinite alternate;
}
// .member-name {
// font-size: 22rpx;
// }
// .member-code {
// font-size: 22rpx;
// }
// .score {
// font-size: 22rpx;
// }
}
@keyframes title-bling {
0% {
text-shadow:
0 2rpx 8rpx rgba(0, 0, 0, 0.6),
0 0 15rpx rgba(74, 144, 226, 0.8),
0 0 25rpx rgba(255, 255, 255, 0.4);
}
100% {
text-shadow:
0 2rpx 8rpx rgba(0, 0, 0, 0.6),
0 0 25rpx rgba(74, 144, 226, 1),
0 0 35rpx rgba(255, 255, 255, 0.7),
0 0 45rpx rgba(0, 119, 204, 0.5);
}
}
@keyframes golden-pulse {
0% {
background: radial-gradient(
ellipse at center,
rgba(255, 215, 0, 0.2) 0%,
transparent 70%
);
}
100% {
background: radial-gradient(
ellipse at center,
rgba(255, 215, 0, 0.4) 0%,
transparent 70%
);
}
}
@keyframes champion-glow {
0% {
filter: drop-shadow(0 4rpx 8rpx rgba(0, 0, 0, 0.3))
drop-shadow(0 0 10rpx rgba(255, 215, 0, 0.3));
transform: scale(1);
}
100% {
filter: drop-shadow(0 4rpx 8rpx rgba(0, 0, 0, 0.3))
drop-shadow(0 0 20rpx rgba(255, 215, 0, 0.6));
transform: scale(1.05);
}
}
@keyframes champion-text-glow {
0% {
text-shadow: 0 2rpx 8rpx rgba(255, 215, 0, 0.8);
}
100% {
text-shadow:
0 2rpx 8rpx rgba(255, 215, 0, 0.8),
0 0 15rpx rgba(255, 215, 0, 0.5);
}
}
@keyframes silver-glow {
0% {
filter: drop-shadow(0 4rpx 8rpx rgba(0, 0, 0, 0.3))
drop-shadow(0 0 8rpx rgba(192, 192, 192, 0.3));
}
100% {
filter: drop-shadow(0 4rpx 8rpx rgba(0, 0, 0, 0.3))
drop-shadow(0 0 15rpx rgba(192, 192, 192, 0.5));
}
}
@keyframes bronze-glow {
0% {
filter: drop-shadow(0 4rpx 8rpx rgba(0, 0, 0, 0.3))
drop-shadow(0 0 8rpx rgba(205, 127, 50, 0.3));
}
100% {
filter: drop-shadow(0 4rpx 8rpx rgba(0, 0, 0, 0.3))
drop-shadow(0 0 15rpx rgba(205, 127, 50, 0.5));
}
}
.ranking-list {
flex: 1;
background: linear-gradient(
135deg,
rgba(255, 255, 255, 0.98) 0%,
rgba(248, 250, 252, 0.95) 100%
);
margin: 20rpx 20rpx 0 20rpx;
border-radius: 25rpx 25rpx 0 0;
overflow: hidden;
backdrop-filter: blur(15rpx);
display: flex;
flex-direction: column;
position: relative;
z-index: 2;
box-shadow:
0 -8rpx 25rpx rgba(0, 0, 0, 0.1),
inset 0 1rpx 0 rgba(255, 255, 255, 0.8);
}
.list-header {
padding: 30rpx 40rpx 20rpx;
border-bottom: 2rpx solid rgba(139, 69, 19, 0.1);
flex-shrink: 0;
background: linear-gradient(
135deg,
rgba(255, 255, 255, 0.9) 0%,
rgba(248, 250, 252, 0.8) 100%
);
.list-title {
font-size: 28rpx;
font-weight: bold;
color: #2d3748;
position: relative;
text-align: center;
&::after {
content: '';
position: absolute;
bottom: -8rpx;
left: 50%;
transform: translateX(-50%);
width: 60rpx;
height: 3rpx;
background: linear-gradient(90deg, transparent, #9c27b0, transparent);
border-radius: 2rpx;
}
}
}
.scroll-container {
flex: 1;
height: 0; /* 关键在flex布局中scroll-view需要明确高度 */
}
.list-item {
display: flex;
align-items: center;
padding: 24rpx 30rpx;
border-bottom: 1rpx solid rgba(226, 232, 240, 0.8);
position: relative;
transition: all 0.3s ease;
&:last-child {
border-bottom: none;
}
&:hover {
background: linear-gradient(
135deg,
rgba(159, 122, 234, 0.05) 0%,
rgba(139, 92, 246, 0.03) 100%
);
transform: translateX(5rpx);
}
.item-rank {
font-size: 24rpx;
font-weight: bold;
color: #64748b;
text-align: center;
margin-right: 20rpx;
background: linear-gradient(135deg, #f1f5f9 0%, #e2e8f0 100%);
border-radius: 50%;
width: 40rpx;
height: 40rpx;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.08);
}
.item-info {
flex: 2;
display: flex;
align-items: center;
justify-content: space-between;
}
.item-name {
font-size: 28rpx;
color: #1e293b;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-weight: 600;
&.highlight {
color: #7c3aed;
font-weight: bold;
background: linear-gradient(135deg, #7c3aed, #a855f7);
background-clip: text;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
position: relative;
&::before {
content: '';
position: absolute;
left: -8rpx;
top: 50%;
transform: translateY(-50%);
width: 4rpx;
height: 20rpx;
background: linear-gradient(135deg, #7c3aed, #a855f7);
border-radius: 2rpx;
}
}
}
.item-code {
font-size: 22rpx;
color: #64748b;
white-space: nowrap;
}
.item-score {
flex: 1;
font-size: 24rpx;
color: #374151;
font-weight: bold;
min-width: 100rpx;
text-align: center;
border-radius: 20rpx;
display: flex;
justify-content: flex-end;
}
}
.list-footer {
padding: 40rpx;
text-align: center;
.empty-text {
font-size: 26rpx;
color: #64748b;
font-style: italic;
}
}
.popup-footer {
padding: 20rpx;
flex-shrink: 0;
position: relative;
z-index: 2;
.close-text-btn {
background: linear-gradient(
135deg,
rgba(255, 255, 255, 0.95) 0%,
rgba(248, 250, 252, 0.9) 100%
);
color: #005bac;
text-align: center;
padding: 20rpx 50rpx;
border-radius: 50rpx;
font-size: 30rpx;
font-weight: bold;
box-shadow:
0 8rpx 25rpx rgba(0, 0, 0, 0.15),
inset 0 1rpx 0 rgba(255, 255, 255, 0.8),
0 0 0 1rpx rgba(0, 91, 172, 0.3);
transition: all 0.3s ease;
position: relative;
overflow: hidden;
&::before {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(
90deg,
transparent,
rgba(255, 255, 255, 0.4),
transparent
);
transition: left 0.5s ease;
}
&:active {
transform: scale(0.98);
background: linear-gradient(
135deg,
rgba(248, 250, 252, 0.9) 0%,
rgba(241, 245, 249, 0.85) 100%
);
box-shadow:
0 4rpx 15rpx rgba(0, 0, 0, 0.1),
inset 0 2rpx 4rpx rgba(0, 0, 0, 0.1);
&::before {
left: 100%;
}
}
&:hover::before {
left: 100%;
}
}
}
</style>

View File

@ -0,0 +1,127 @@
<template>
<view class="example-page">
<view class="header">
<text class="title">排行榜弹窗组件示例</text>
</view>
<view class="content">
<view class="button-group">
<u-button
type="primary"
size="large"
@click="showRanking"
:loading="loading"
>
显示排行榜
</u-button>
</view>
<view class="info-section">
<text class="info-title">使用说明</text>
<text class="info-text"
>1. 点击按钮将依次显示直推人数和直推金额排行榜</text
>
<text class="info-text">2. 前三名会特殊展示在顶部</text>
<text class="info-text">3. 4-30名可在下方滚动查看</text>
<text class="info-text">4. 关闭人数排行后自动显示金额排行</text>
</view>
</view>
<!-- 排行榜弹窗组件 -->
<RankingPopup ref="rankingPopup" @onRankingComplete="onRankingComplete" />
</view>
</template>
<script>
import RankingPopup from './RankingPopup.vue'
export default {
name: 'RankingPopupExample',
components: {
RankingPopup,
},
data() {
return {
loading: false,
}
},
methods: {
//
async showRanking() {
this.loading = true
try {
await this.$refs.rankingPopup.showRankingPopups()
} catch (error) {
console.error('显示排行榜失败:', error)
} finally {
this.loading = false
}
},
//
onRankingComplete() {
console.log('排行榜展示完成')
uni.showToast({
title: '排行榜展示完成',
icon: 'success',
})
},
},
}
</script>
<style lang="scss" scoped>
.example-page {
min-height: 100vh;
background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
padding: 40rpx;
}
.header {
text-align: center;
margin-bottom: 60rpx;
.title {
font-size: 36rpx;
font-weight: bold;
color: #333;
}
}
.content {
max-width: 600rpx;
margin: 0 auto;
}
.button-group {
text-align: center;
margin-bottom: 60rpx;
}
.info-section {
background: rgba(255, 255, 255, 0.9);
padding: 40rpx;
border-radius: 20rpx;
box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.1);
.info-title {
display: block;
font-size: 28rpx;
font-weight: bold;
color: #333;
margin-bottom: 20rpx;
}
.info-text {
display: block;
font-size: 24rpx;
color: #666;
line-height: 1.6;
margin-bottom: 12rpx;
&:last-child {
margin-bottom: 0;
}
}
}
</style>

View File

@ -1,9 +1,4 @@
<!--
* @Descripttion:
* @version:
* @Author: 王三华
* @Date: 2023-05-30 20:18:30
-->
<template>
<view>

View File

@ -1,9 +1,4 @@
<!--
* @Descripttion:
* @version:
* @Author: 王三华
* @Date: 2023-05-30 20:18:30
-->
<template>
<view>

View File

@ -1,9 +1,4 @@
<!--
* @Descripttion:
* @version:
* @Author: 王三华
* @Date: 2023-06-25 20:05:35
-->
<template>
<u-popup :show="agreeMent"
:closeable="true"
@ -1040,8 +1035,8 @@
<u-button type="success"
class="uBtn"
shape="circle"
color="linear-gradient(to right, #fb3024, #fb3024 )"
@tap="agreeMent=false">{{$t('w_0035')}}</u-button>
color="linear-gradient(to right, #005BAC, #005BAC )"
@tap="agreeMent=false">{{'确定'}}</u-button>
</view>
</view>

View File

@ -319,7 +319,7 @@
.small-btn {
width: 312rpx;
height: 72rpx;
background: #FB3024;
background: #005BAC;
border-radius: 34rpx;
font-size: 28rpx;
font-weight: 400;
@ -332,13 +332,13 @@
.small-text-btn {
width: 312rpx;
height: 72rpx;
border: 1px solid #FB3024;
border: 1px solid #005BAC;
border-radius: 34rpx;
display: flex;
justify-content: center;
align-items: center;
font-size: 28rpx;
color: #FB3024;
color: #005BAC;
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,310 @@
<template>
<view class="area-product-list" :class="sizeClass">
<view class="area-header">
<view class="header-bg"></view>
<text class="area-title">{{ title }}</text>
<u-button
v-if="list.length > 0"
type="primary"
size="mini"
shape="circle"
:custom-style="{
background: '#ffffff',
border: 'none',
position: 'relative',
zIndex: 1,
height: '46rpx',
lineHeight: '46rpx',
width: 'fit-content',
padding: '0 12rpx',
margin: '0',
}"
@click="goToMore"
>
<view class="more-btn-content">
<text class="more-text">更多</text>
<u-icon name="arrow-right" color="#005bac" size="14"></u-icon>
</view>
</u-button>
</view>
<view class="product-container">
<view
class="product-item"
v-for="item in list"
:key="item.pkWares"
@click="handleProductClick(item)"
>
<image
:src="item.cover || item.cover1"
class="product-image"
mode="aspectFill"
/>
<view class="product-info">
<view class="product-name">{{ item.waresName }}</view>
<view class="product-price-row">
<view class="product-price">
{{ formatCurrency(item.waresPrice) }}
</view>
<u-button
v-if="false"
type="primary"
size="mini"
shape="circle"
:custom-style="{
background: '#005bac',
margin: '0px',
width: '48rpx',
height: '48rpx',
minWidth: '48rpx',
}"
@click.native.stop="handleAddToCart(item)"
>
<u-icon name="plus" color="#ffffff" size="12"></u-icon>
</u-button>
</view>
</view>
</view>
</view>
</view>
</template>
<script>
import { numberToCurrencyNo, isLocal, isLocaled } from '@/util/numberToCurrency'
import { addShopping } from '@/config/goods'
import { formatCurrency } from '@/util/index.js'
export default {
props: {
title: {
type: String,
default: '',
},
list: {
type: Array,
default: () => [],
},
specialAreaId: {
type: [Number, String],
default: '',
},
size: {
type: String,
default: 'normal', // 'normal' or 'small'
validator: value => ['normal', 'small'].includes(value),
},
},
computed: {
sizeClass() {
return this.size === 'small' ? 'area-product-list--small' : ''
},
},
methods: {
isLocaled,
formatCurrency,
formatPrice(price) {
// 使numberToCurrencyNoisLocal
return isLocal(numberToCurrencyNo(price))
},
goToMore() {
//
uni.navigateTo({
url: `/pages/specialArea/index?id=${this.specialAreaId}`,
})
},
handleProductClick(item) {
//
this.$emit('product-click', item)
},
handleAddToCart(item) {
const params = {
pkCountry: this.pkCountry,
specialArea: item.specialArea,
number: 1,
waresCode: item.waresCode,
productGroup: item.productGroup,
}
addShopping(params).then(res => {
if (res.code == 200) {
uni.showToast({
title: '购物车添加成功',
icon: 'success',
mask: true,
})
this.$store.dispatch('getCarLength')
}
})
},
},
}
</script>
<style lang="scss" scoped>
.area-product-list {
background-color: #ffffff;
padding: 20rpx;
padding-top: 0;
border-radius: 16rpx;
margin-bottom: 24rpx;
position: relative;
transition: all 0.3s ease; // Add transition for smoother size changes
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08); //
&--small {
padding: 16rpx;
padding-top: 0;
margin-bottom: 20rpx;
border-radius: 12rpx;
.area-header {
margin-bottom: 20rpx;
padding: 16rpx 0;
height: 40rpx;
}
.header-bg {
left: -16rpx;
right: -16rpx;
border-top-left-radius: 6px;
border-top-right-radius: 6px;
}
.area-title {
font-size: 28rpx;
}
.more-btn-content {
// Adjust button style directly as u-button size='mini' might not be flexible enough
:deep(.u-button) {
height: 40rpx !important;
line-height: 40rpx !important;
padding: 0 10rpx !important;
}
.more-text {
font-size: 20rpx;
margin-right: 2rpx;
}
:deep(.u-icon) {
font-size: 12px !important; // u-icon size might need !important
}
}
.product-container {
margin: 0 -8rpx;
}
.product-item {
padding: 0 8rpx;
}
.product-image {
width: 180rpx;
height: 180rpx;
border-radius: 6rpx;
}
.product-info {
margin-top: 10rpx;
}
.product-name {
font-size: 24rpx;
margin-bottom: 6rpx;
}
.product-price-row .product-price {
font-size: 20rpx;
}
}
}
.area-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 24rpx;
position: relative;
padding: 20rpx 0;
height: 46rpx;
}
.header-bg {
position: absolute;
top: 0;
left: -20rpx;
right: -20rpx;
height: 100%;
background: linear-gradient(to bottom, #add8e6, #ffffff);
z-index: 0;
border-top-left-radius: 8px;
border-top-right-radius: 8px;
}
.area-title {
font-size: 32rpx;
font-weight: bold;
color: #333333;
position: relative;
z-index: 1;
}
.more-btn-content {
display: flex;
align-items: center;
justify-content: center;
height: 100%;
flex-grow: 0;
}
.more-text {
font-size: 24rpx;
color: #005bac;
margin-right: 4rpx;
}
.product-container {
display: flex;
flex-wrap: wrap;
margin: 0 -10rpx;
}
.product-item {
width: 33.33%;
padding: 0 10rpx;
box-sizing: border-box;
}
.product-image {
width: 200rpx;
height: 200rpx;
border-radius: 8rpx;
background-color: #f5f5f5;
object-fit: cover;
display: block;
margin: 0 auto;
}
.product-info {
margin-top: 12rpx;
position: relative;
}
.product-name {
font-size: 28rpx;
color: #333;
margin-bottom: 8rpx;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.product-price-row {
display: flex;
justify-content: space-between;
align-items: center;
.product-price {
font-size: 24rpx;
font-weight: bold;
color: #f82c1a;
}
}
</style>

View File

@ -55,7 +55,7 @@ export default {
.navBar {
position: fixed;
margin: 14rpx 24rpx;
z-index: 1000000000;
z-index: 500;
width: 28px;
height: 28px;
background: rgba(255, 255, 255, 0.7);

View File

@ -1,418 +0,0 @@
<!--
* @Descripttion:
* @version:
* @Author: 王三华
* @Date: 2023-05-18 14:42:53
-->
<template>
<view class="main">
<view v-if="userInfo.pkCountry != 1" class="top">
<view class="search-bottom">
<view class="time-text">{{ $t("w_0138") }}</view>
<view class="time1">
<picker :value="query.startDate" mode="date" @change="bindDateChange">
<view v-if="query.startDate != ''" class="uni-input">{{
query.startDate
}}</view>
<view v-else class="uni-input">{{ $t("CK_KS_4") }}</view>
</picker>
</view>
<view class="text_s">{{ $t("w_0139") }}</view>
<view class="time1">
<picker :value="query.endDate" mode="date" @change="bindDateChange1">
<view v-if="query.endDate != ''" class="uni-input">{{
query.endDate
}}</view>
<view v-else class="uni-input">{{ $t("CK_KS_5") }}</view>
</picker>
</view>
<view class="search-icons" @click="submit">
<image
class="search-icon-s"
src="../../static/images/search.png"
></image>
</view>
</view>
</view>
<view class="search-content">
<view class="search-list">
<view v-for="item in dataList" class="search-view">
<view class="flex_s">
<view class="data-left">
{{ $t("N_I_130") }}
</view>
<view class="data-right">
{{ item.settleDate }}
</view>
</view>
<view class="flex_s">
<view class="data-left"> {{ $t("N_I_148") }}(¥) </view>
<view class="data-right style1" @click="getDetails(item, 20)">
{{ item.makerDirectIncome | toThousandthAndKeepDecimal }}
</view>
</view>
<view class="flex_s">
<view class="data-left"> {{ $t("N_I_149") }}(¥) </view>
<view class="data-right style1" @click="getDetails(item, 21)">
{{ item.makerShareIncome | toThousandthAndKeepDecimal }}
</view>
</view>
<view class="flex_s">
<view class="data-left"> {{ $t("N_I_137") }}(¥) </view>
<view class="data-right">
{{ item.serviceSpend | toThousandthAndKeepDecimal }}
</view>
</view>
<view class="flex_s">
<view class="data-left"> {{ $t("N_I_138") }}(¥) </view>
<view class="data-right">
{{ item.makerRealSubtotal | toThousandthAndKeepDecimal }}
</view>
</view>
<view class="border_s">
<view class="button" v-if="checkRule == true" @click="urlTap">
{{ $t("CK_KS_25") }}
</view>
</view>
<view style="clear: both"></view>
<view style="height: 20rpx; background-color: #fff"></view>
</view>
</view>
</view>
<u-popup
:show="show"
mode="center"
closeOnClickOverlay
closeable
round="10"
@close="close"
>
<view class="kuang">
<view
v-for="item in tableDetails"
v-show="tableDetails.length > 0"
class="kuang_i"
>
<view class="kuang_ii">
<view>来源会员编号</view>
<view>{{ item.sourceMemberCode }}</view>
</view>
<view class="kuang_ii">
<view>来源会员名称</view>
<view>{{ item.sourceMemberName }}</view>
</view>
<view class="kuang_ii">
<view>奖金金额</view>
<view>{{ item.realIncome | toThousandthAndKeepDecimal}}</view>
</view>
</view>
<view v-show="tableDetails.length == 0" class="kong"> 暂无数据 </view>
</view>
</u-popup>
</view>
</template>
<script>
import * as api from "@/config/login.js";
import { setToken } from "@/config/auth.js";
import store from "@/store";
export default {
data() {
return {
tableDetails: [],
show: false,
getBonusTypeList: [],
index: null,
dataList: [],
userInfo: [],
query: {
startDate: "",
endDate: "",
sourceMemberCode: "",
sourceMemberName: "",
pkBonusItems: "",
},
page: {
pageNum: 1,
pageSize: 50,
},
};
},
props: ["num", "checkRule"],
onLoad() {},
created() {
// this.getType()
this.userInfo = uni.getStorageSync("User");
this.getDataList();
},
methods: {
getDetails(row, bonusValue) {
api
.markBonus({
startDate: row.settleDate,
bonusValue: bonusValue,
})
.then((res) => {
console.log(
"%c [ res ]-151",
"font-size:13px; background:#fb0ce4; color:#ff50ff;",
res
);
this.tableDetails = res.rows;
this.show = true;
});
},
close() {
this.show = false;
},
urlTap() {
uni.navigateTo({ url: "/pages/bonusSource/index" });
},
getInfo() {
api
.getInfo()
.then((res) => {
if (res) {
this.userInfo = res.data;
}
})
.catch((error) => {
reject(error);
});
},
submit() {
this.getDataList();
},
getType() {
api
.getBonusType()
.then((res) => {
if (res) {
this.getBonusTypeList = res.rows;
}
})
.catch((error) => {
reject(error);
});
},
bindPickerChange(e) {
this.index = e.detail.value;
},
bindDateChange(e) {
this.query.startDate = e.detail.value;
},
bindDateChange1(e) {
this.query.endDate = e.detail.value;
},
getDataList(num) {
api
.queryBonusMaker(
this.query,
`?pageNum=${num || 1}&pageSize=${this.page.pageSize}`
)
.then((res) => {
if (res) {
this.dataList.push(...res.rows);
}
})
.catch((error) => {
reject(error);
});
},
submit() {},
},
};
</script>
<style>
.border_s {
border-bottom: 1rpx solid #eee;
height: 10rpx;
}
.button {
padding: 0 30rpx;
/* width: 150rpx; */
height: 52rpx;
line-height: 52rpx;
color: #fff;
font-size: 28rpx;
text-align: center;
background: #fb3024;
margin: 30rpx 0 0 0;
float: right;
border-radius: 24rpx;
}
.type {
color: #fb3024 !important;
}
.flex_s {
width: 100%;
display: flex;
justify-content: space-between;
padding-bottom: 15rpx;
}
.data-left {
color: #999;
font-size: 26rpx;
}
.data-right {
color: #333;
font-size: 26rpx;
}
.search-view {
/* display: flex; */
/* justify-content: space-between; */
padding: 30rpx 20rpx 0 20rpx;
border-bottom: 20rpx solid #eee;
/* border-bottom: 1px solid #eee; */
margin: 0;
}
.search-list {
margin-bottom: 25rpx;
background-color: #fff;
}
.search-content {
margin-top: 25rpx;
}
.text_s {
color: #333;
font-size: 26rpx;
}
.search-icon-s {
width: 22rpx;
height: 22rpx;
}
.search-icons {
width: 47rpx;
height: 47rpx;
background: #fb3024;
border-radius: 50%;
margin-left: 20rpx;
display: flex;
justify-content: center;
align-items: center;
margin: 30rpx 20rpx 0 0;
}
.time1 {
width: 158rpx;
height: 75rpx;
border-bottom: 1rpx solid #eee;
margin: 0 50rpx 30rpx 50rpx;
color: #999;
text-align: center;
font-size: 24rpx;
/* margin-bottom: 30rpx; */
}
.time-text {
color: #999;
font-size: 26rpx;
}
.search-bottom {
height: 100rpx;
line-height: 100rpx;
display: flex;
margin-left: 20rpx;
}
.texts {
color: #333;
font-size: 26rpx;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
/* width:200rpx; */
text-align: right;
}
.select-text {
display: flex;
margin-right: 20rpx;
font-size: 26rpx;
color: #333;
position: relative;
}
.selIcon {
width: 20rpx;
height: 20rpx;
margin-top: 10rpx;
margin-left: 5rpx;
}
.text-s {
font-size: 26rpx;
color: #999;
margin-right: 10rpx;
}
.place {
font-size: 26rpx;
color: #999;
}
.border-colors {
border: none;
font-size: 26rpx;
color: #333;
margin-left: 30rpx;
}
page {
background-color: #f2f2f2;
}
.search-icon {
width: 25rpx;
height: 25rpx;
position: absolute;
left: 30rpx;
top: 12rpx;
}
.search-bg {
}
.top {
/* height: 200rpx; */
background-color: #fff;
padding: 20rpx 0 20rpx 0;
}
.search-tops {
display: flex;
justify-content: space-between;
height: 65rpx;
line-height: 65rpx;
padding-bottom: 40rpx;
border-bottom: 1px solid #eee;
}
.search-bg {
width: 432rpx;
height: 35rpx;
background: #f5f6f8;
border-radius: 33rpx;
display: flex;
position: relative;
padding: 20rpx 50rpx;
margin-left: 20rpx;
}
.style1 {
cursor: pointer;
text-decoration: underline;
color: #d61820;
}
.kuang {
height: 800rpx;
background: #eee;
padding: 60rpx 20rpx;
overflow-y: auto;
}
.kuang_i {
padding: 20rpx 20rpx;
border-radius: 8px;
background: #fff;
font-size: 14px;
color: #999;
margin-bottom: 20rpx;
}
.kuang_ii {
display: flex;
align-items: center;
justify-content: space-between;
}
::v-deep .u-popup__content {
width: 80%;
}
.kong {
text-align: center;
line-height: 250px;
}
</style>

View File

@ -1,25 +1,20 @@
<!--
* @Descripttion:
* @version:
* @Author: 王三华
* @Date: 2023-05-18 14:42:53
-->
<template>
<view class="main">
<view v-if="userInfo.pkCountry!=1" class="top">
<view class="search-bottom">
<view class="time-text">{{$t('w_0138')}}</view>
<view class="time-text">{{'查询时间'}}</view>
<view class="time1">
<picker :value="query.startDate" mode="date" @change="bindDateChange">
<view v-if="query.startDate!=''" class="uni-input">{{query.startDate}}</view>
<view v-else class="uni-input">{{$t('CK_KS_4')}}</view>
<view v-else class="uni-input">{{'开始日期'}}</view>
</picker>
</view>
<view class="text_s">{{$t('w_0139')}}</view>
<view class="text_s">{{'至'}}</view>
<view class="time1">
<picker :value="query.endDate" mode="date" @change="bindDateChange1">
<view v-if="query.endDate!=''" class="uni-input">{{query.endDate}}</view>
<view v-else class="uni-input">{{$t('CK_KS_5')}}</view>
<view v-else class="uni-input">{{'结束日期'}}</view>
</picker>
</view>
<view class="search-icons" @click="submit">
@ -33,7 +28,7 @@
<view v-for="item in dataList" class="search-view">
<view class="flex_s">
<view class="data-left">
{{$t('N_I_130')}}
{{'奖金日期'}}
</view>
<view class="data-right">
{{item.settleDate}}
@ -41,7 +36,7 @@
</view>
<view class="flex_s">
<view class="data-left">
{{$t('N_I_147')}}(¥)
{{'复购券直推收益'}}(¥)
</view>
<view class="data-right">
{{item.repurCoupon | numberToCurrency}}
@ -49,7 +44,7 @@
</view>
<view class="flex_s">
<view class="data-left">
{{$t('w_0192')}}(¥)
{{'复购券均分收益'}}(¥)
</view>
<view class="data-right">
{{item.repurCouponShare | numberToCurrency}}
@ -57,7 +52,7 @@
</view>
<view class="flex_s">
<view class="data-left">
{{$t('N_I_137')}}(¥)
{{'平台服务费'}}(¥)
</view>
<view class="data-right">
{{item.serviceSpend | numberToCurrency}}
@ -65,17 +60,17 @@
</view>
<view class="flex_s">
<view class="data-left">
{{$t('N_I_138')}}(¥)
{{'实发小计'}}(¥)
</view>
<view class="data-right">
{{item.repurCouponSubtotal | numberToCurrency}}
</view>
</view>
<view class="border_s">
<!-- <view class="border_s">
<view class="button" v-if="checkRule==true" @click="urlTap">
{{$t('CK_KS_25')}}
{{'查看详情'}}
</view>
</view>
</view> -->
<view style="clear: both;"></view>
<view style="height: 20rpx;background-color: #fff;"></view>
</view>
@ -180,13 +175,13 @@ export default {
color: #fff;
font-size: 28rpx;
text-align: center;
background: #FB3024;
background: #005BAC;
margin: 30rpx 0 0 0;
float: right;
border-radius: 24rpx;
}
.type{
color: #FB3024 !important;
color: #005BAC !important;
}
.flex_s{
width: 100%;
@ -228,7 +223,7 @@ export default {
.search-icons{
width: 47rpx;
height: 47rpx;
background: #FB3024;
background: #005BAC;
border-radius: 50%;
margin-left: 20rpx;
display: flex;

View File

@ -1,25 +1,20 @@
<!--
* @Descripttion:
* @version:
* @Author: çŽä¸å<EFBFBD>
* @Date: 2023-05-18 14:42:53
-->
<template>
<view class="main">
<view v-if="userInfo.pkCountry!=1" class="top">
<view class="search-bottom">
<view class="time-text">{{$t('w_0138')}}</view>
<view class="time-text">{{'查询时间'}}</view>
<view class="time1">
<picker :value="query.startDate" mode="date" @change="bindDateChange">
<view v-if="query.startDate!=''" class="uni-input">{{query.startDate}}</view>
<view v-else class="uni-input">{{$t('CK_KS_4')}}</view>
<view v-else class="uni-input">{{'开始日期'}}</view>
</picker>
</view>
<view class="text_s">{{$t('w_0139')}}</view>
<view class="text_s">{{'至'}}</view>
<view class="time1">
<picker :value="query.endDate" mode="date" @change="bindDateChange1">
<view v-if="query.endDate!=''" class="uni-input">{{query.endDate}}</view>
<view v-else class="uni-input">{{$t('CK_KS_5')}}</view>
<view v-else class="uni-input">{{'结束日期'}}</view>
</picker>
</view>
<view class="search-icons" @click="submit">
@ -33,7 +28,7 @@
<view v-for="item in dataList" class="search-view">
<view class="flex_s">
<view class="data-left">
{{$t('N_I_130')}}
{{'奖金日期'}}
</view>
<view class="data-right">
{{item.settleDate}}
@ -41,7 +36,7 @@
</view>
<view class="flex_s" v-if="userInfo.pkCountry==1">
<view class="data-left">
{{$t('w_0154')}}({{ isLocaled() }})
{{'复购直推收益'}}({{ isLocaled() }})
</view>
<view class="data-right">
{{item.repurPushIncome |toThousandthAndKeepDecimal}}
@ -49,7 +44,7 @@
</view>
<view class="flex_s">
<view class="data-left">
{{$t('w_0155')}}({{ isLocaled() }})
{{'复购级差收益'}}({{ isLocaled() }})
</view>
<view class="data-right">
{{item.repurRangeIncome | toThousandthAndKeepDecimal}}
@ -57,7 +52,7 @@
</view>
<view class="flex_s">
<view class="data-left">
{{$t('N_I_141')}}({{ isLocaled() }})
{{'复购拓展收益'}}({{ isLocaled() }})
</view>
<view class="data-right">
{{item.repurExpandIncome | toThousandthAndKeepDecimal}}
@ -65,7 +60,7 @@
</view>
<view class="flex_s" v-if="userInfo.pkCountry==1">
<view class="data-left">
{{$t('N_I_136')}}({{ isLocaled() }})
{{'重复消费'}}({{ isLocaled() }})
</view>
<view class="data-right">
{{item.backPoints | toThousandthAndKeepDecimal}}
@ -73,7 +68,7 @@
</view>
<view class="flex_s" v-if="userInfo.pkCountry==1">
<view class="data-left" >
{{$t('N_I_137')}}({{ isLocaled() }})
{{'平台服务费'}}({{ isLocaled() }})
</view>
<view class="data-right">
{{item.serviceSpend | toThousandthAndKeepDecimal}}
@ -81,17 +76,17 @@
</view>
<view class="flex_s">
<view class="data-left">
{{$t('N_I_138')}}({{ isLocaled() }})
{{'实发小计'}}({{ isLocaled() }})
</view>
<view class="data-right">
{{item.repurRealSubtotal | toThousandthAndKeepDecimal}}
</view>
</view>
<view class="border_s">
<!-- <view class="border_s">
<view class="button" v-if="checkRule==true" @click="urlTap">
{{$t('CK_KS_25')}}
{{'查看详情'}}
</view>
</view>
</view> -->
<view style="clear: both;"></view>
<view style="height: 20rpx;background-color: #fff;"></view>
</view>
@ -199,13 +194,13 @@ export default {
color: #fff;
font-size: 28rpx;
text-align: center;
background: #FB3024;
background: #005BAC;
margin: 30rpx 0 0 0;
float: right;
border-radius: 24rpx;
}
.type{
color: #FB3024 !important;
color: #005BAC !important;
}
.flex_s{
width: 100%;
@ -247,7 +242,7 @@ export default {
.search-icons{
width: 47rpx;
height: 47rpx;
background: #FB3024;
background: #005BAC;
border-radius: 50%;
margin-left: 20rpx;
display: flex;

View File

@ -1,326 +0,0 @@
<!--
* @Descripttion:
* @version:
* @Author: 王三华
* @Date: 2023-05-18 14:42:53
-->
<template>
<view class="main">
<view v-if="userInfo.pkCountry!=1" class="top">
<view class="search-bottom">
<view class="time-text">{{$t('w_0138')}}</view>
<view class="time1">
<picker :value="query.startDate" mode="date" @change="bindDateChange">
<view v-if="query.startDate!=''" class="uni-input">{{query.startDate}}</view>
<view v-else class="uni-input">{{$t('CK_KS_4')}}</view>
</picker>
</view>
<view class="text_s">{{$t('w_0139')}}</view>
<view class="time1">
<picker :value="query.endDate" mode="date" @change="bindDateChange1">
<view v-if="query.endDate!=''" class="uni-input">{{query.endDate}}</view>
<view v-else class="uni-input">{{$t('CK_KS_5')}}</view>
</picker>
</view>
<view class="search-icons" @click="submit">
<image class="search-icon-s" src="../../static/images/search.png"></image>
</view>
</view>
</view>
<view class="search-content">
<view class="search-list">
<view v-for="item in dataList" class="search-view">
<view class="flex_s">
<view class="data-left">
{{$t('N_I_130')}}
</view>
<view class="data-right">
{{item.settleDate}}
</view>
</view>
<view class="flex_s">
<view class="data-left">
{{$t('N_I_143')}}(¥)
</view>
<view class="data-right">
{{item.directIncome | numberToCurrency}}
</view>
</view>
<view class="flex_s">
<view class="data-left">
{{$t('N_I_137')}}(¥)
</view>
<view class="data-right">
{{item.serviceIncome | numberToCurrency}}
</view>
</view>
<view class="flex_s">
<view class="data-left">
{{$t('N_I_138')}}(¥)
</view>
<view class="data-right">
{{item.realIncomeTotal| numberToCurrency}}
</view>
</view>
<view class="border_s">
<view class="button" v-if="checkRule==true" @click="urlTap">
{{$t('CK_KS_25')}}
</view>
</view>
<view style="clear: both;"></view>
<view style="height: 20rpx;background-color: #fff;"></view>
</view>
</view>
</view>
</view>
</template>
<script>
import * as api from '@/config/login.js'
import { setToken } from '@/config/auth.js'
import store from '@/store'
export default {
data() {
return {
getBonusTypeList:[],
index:null,
dataList:[],
userInfo:[],
query:{
startDate:'',
endDate:'',
sourceMemberCode:'',
sourceMemberName:'',
pkBonusItems: ''
},
page:{
pageNum:1,
pageSize:50
}
}
},
props:["num","checkRule"],
onLoad() {
},
created() {
// this.getType()
this.userInfo = uni.getStorageSync('User')
this.getDataList()
},
methods: {
urlTap() {
uni.navigateTo({ url: '/pages/bonusSource/index' })
},
getInfo(){
api.getInfo().then(res => {
if (res) {
this.userInfo = res.data
}
}).catch(error => {
reject(error)
})
},
submit() {
this.getDataList()
},
getType(){
api.getBonusType().then(res => {
if (res) {
this.getBonusTypeList = res.rows
}
}).catch(error => {
reject(error)
})
},
bindPickerChange(e) {
this.index = e.detail.value
},
bindDateChange(e) {
this.query.startDate = e.detail.value
},
bindDateChange1(e) {
this.query.endDate = e.detail.value
},
getDataList(num) {
api.queryBonusHaiFun(this.query,`?pageNum=${num||1}&pageSize=${this.page.pageSize}`).then(res => {
if (res) {
this.dataList.push(...res.rows)
}
}).catch(error => {
reject(error)
})
},
submit() {
},
},
}
</script>
<style>
.border_s{
border-bottom: 1rpx solid #eee;
height: 10rpx;
}
.button{
padding: 0 30rpx;
/* width: 150rpx; */
height: 52rpx;
line-height: 52rpx;
color: #fff;
font-size: 28rpx;
text-align: center;
background: #FB3024;
margin: 30rpx 0 0 0;
float: right;
border-radius: 24rpx;
}
.type{
color: #FB3024 !important;
}
.flex_s{
width: 100%;
display: flex;
justify-content: space-between;
padding-bottom: 15rpx;
}
.data-left{
color: #999;
font-size: 26rpx;
}
.data-right{
color: #333;
font-size: 26rpx;
}
.search-view{
/* display: flex; */
/* justify-content: space-between; */
padding: 30rpx 20rpx 0 20rpx;
border-bottom: 20rpx solid #eee;
/* border-bottom: 1px solid #eee; */
margin:0 ;
}
.search-list{
margin-bottom: 25rpx;
background-color: #fff;
}
.search-content{
margin-top: 25rpx;
}
.text_s{
color: #333;
font-size: 26rpx;
}
.search-icon-s{
width: 22rpx;
height: 22rpx;
}
.search-icons{
width: 47rpx;
height: 47rpx;
background: #FB3024;
border-radius: 50%;
margin-left: 20rpx;
display: flex;
justify-content: center;
align-items: center;
margin: 30rpx 20rpx 0 0;
}
.time1{
width: 158rpx;
height: 75rpx;
border-bottom: 1rpx solid #eee;
margin: 0 50rpx 30rpx 50rpx;
color: #999;
text-align: center;
font-size: 24rpx;
/* margin-bottom: 30rpx; */
}
.time-text{
color: #999;
font-size: 26rpx;
}
.search-bottom{
height: 100rpx;
line-height: 100rpx;
display: flex;
margin-left: 20rpx;
}
.texts{
color: #333;
font-size: 26rpx;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
/* width:200rpx; */
text-align: right;
}
.select-text{
display: flex;
margin-right: 20rpx;
font-size: 26rpx;
color: #333;
position: relative;
}
.selIcon{
width: 20rpx;
height: 20rpx;
margin-top: 10rpx;
margin-left: 5rpx;
}
.text-s{
font-size: 26rpx;
color: #999;
margin-right: 10rpx;
}
.place{
font-size: 26rpx;
color: #999;
}
.border-colors{
border: none;
font-size: 26rpx;
color: #333;
margin-left:30rpx;
}
page{
background-color: #f2f2f2;
}
.search-icon{
width: 25rpx;
height: 25rpx;
position: absolute;
left: 30rpx;
top: 12rpx;
image{
}
}
.search-bg{
}
.top{
/* height: 200rpx; */
background-color: #fff;
padding: 20rpx 0 20rpx 0;
}
.search-tops{
display: flex;
justify-content: space-between;
height: 65rpx;
line-height: 65rpx;
padding-bottom: 40rpx;
border-bottom: 1px solid #eee;
}
.search-bg{
width: 432rpx;
height:35rpx;
background: #F5F6F8;
border-radius: 33rpx;
display: flex;
position: relative;
padding: 20rpx 50rpx;
margin-left: 20rpx;
}
</style>

View File

@ -1,326 +0,0 @@
<!--
* @Descripttion:
* @version:
* @Author: 王三华
* @Date: 2023-05-18 14:42:53
-->
<template>
<view class="main">
<view v-if="userInfo.pkCountry!=1" class="top">
<view class="search-bottom">
<view class="time-text">{{$t('w_0138')}}</view>
<view class="time1">
<picker :value="query.startDate" mode="date" @change="bindDateChange">
<view v-if="query.startDate!=''" class="uni-input">{{query.startDate}}</view>
<view v-else class="uni-input">{{$t('CK_KS_4')}}</view>
</picker>
</view>
<view class="text_s">{{$t('w_0139')}}</view>
<view class="time1">
<picker :value="query.endDate" mode="date" @change="bindDateChange1">
<view v-if="query.endDate!=''" class="uni-input">{{query.endDate}}</view>
<view v-else class="uni-input">{{$t('CK_KS_5')}}</view>
</picker>
</view>
<view class="search-icons" @click="submit">
<image class="search-icon-s" src="../../static/images/search.png"></image>
</view>
</view>
</view>
<view class="search-content">
<view class="search-list">
<view v-for="item in dataList" class="search-view">
<view class="flex_s">
<view class="data-left">
{{$t('N_I_130')}}
</view>
<view class="data-right">
{{item.settleDate}}
</view>
</view>
<view class="flex_s">
<view class="data-left">
{{$t('N_I_142')}}(¥)
</view>
<view class="data-right">
{{item.hiFunIncome | numberToCurrency}}
</view>
</view>
<view class="flex_s">
<view class="data-left">
{{$t('N_I_137')}}(¥)
</view>
<view class="data-right">
{{item.serviceSpend | numberToCurrency}}
</view>
</view>
<view class="flex_s">
<view class="data-left">
{{$t('N_I_138')}}(¥)
</view>
<view class="data-right">
{{item.hiFunRealSubtotal | numberToCurrency}}
</view>
</view>
<view class="border_s">
<view class="button" v-if="checkRule==true" @click="urlTap">
{{$t('CK_KS_25')}}
</view>
</view>
<view style="clear: both;"></view>
<view style="height: 20rpx;background-color: #fff;"></view>
</view>
</view>
</view>
</view>
</template>
<script>
import * as api from '@/config/login.js'
import { setToken } from '@/config/auth.js'
import store from '@/store'
export default {
data() {
return {
getBonusTypeList:[],
index:null,
dataList:[],
userInfo:[],
query:{
startDate:'',
endDate:'',
sourceMemberCode:'',
sourceMemberName:'',
pkBonusItems: ''
},
page:{
pageNum:1,
pageSize:50
}
}
},
props:["num","checkRule"],
onLoad() {
},
created() {
// this.getType()
this.userInfo = uni.getStorageSync('User')
this.getDataList()
},
methods: {
urlTap() {
uni.navigateTo({ url: '/pages/bonusSource/index' })
},
getInfo(){
api.getInfo().then(res => {
if (res) {
this.userInfo = res.data
}
}).catch(error => {
reject(error)
})
},
submit() {
this.getDataList()
},
getType(){
api.getBonusType().then(res => {
if (res) {
this.getBonusTypeList = res.rows
}
}).catch(error => {
reject(error)
})
},
bindPickerChange(e) {
this.index = e.detail.value
},
bindDateChange(e) {
this.query.startDate = e.detail.value
},
bindDateChange1(e) {
this.query.endDate = e.detail.value
},
getDataList(num) {
api.queryBonusHiFun(this.query,`?pageNum=${num||1}&pageSize=${this.page.pageSize}`).then(res => {
if (res) {
this.dataList.push(...res.rows)
}
}).catch(error => {
reject(error)
})
},
submit() {
},
},
}
</script>
<style>
.border_s{
border-bottom: 1rpx solid #eee;
height: 10rpx;
}
.button{
padding: 0 30rpx;
/* width: 150rpx; */
height: 52rpx;
line-height: 52rpx;
color: #fff;
font-size: 28rpx;
text-align: center;
background: #FB3024;
margin: 30rpx 0 0 0;
float: right;
border-radius: 24rpx;
}
.type{
color: #FB3024 !important;
}
.flex_s{
width: 100%;
display: flex;
justify-content: space-between;
padding-bottom: 15rpx;
}
.data-left{
color: #999;
font-size: 26rpx;
}
.data-right{
color: #333;
font-size: 26rpx;
}
.search-view{
/* display: flex; */
/* justify-content: space-between; */
padding: 30rpx 20rpx 0 20rpx;
border-bottom: 20rpx solid #eee;
/* border-bottom: 1px solid #eee; */
margin:0 ;
}
.search-list{
margin-bottom: 25rpx;
background-color: #fff;
}
.search-content{
margin-top: 25rpx;
}
.text_s{
color: #333;
font-size: 26rpx;
}
.search-icon-s{
width: 22rpx;
height: 22rpx;
}
.search-icons{
width: 47rpx;
height: 47rpx;
background: #FB3024;
border-radius: 50%;
margin-left: 20rpx;
display: flex;
justify-content: center;
align-items: center;
margin: 30rpx 20rpx 0 0;
}
.time1{
width: 158rpx;
height: 75rpx;
border-bottom: 1rpx solid #eee;
margin: 0 50rpx 30rpx 50rpx;
color: #999;
text-align: center;
font-size: 24rpx;
/* margin-bottom: 30rpx; */
}
.time-text{
color: #999;
font-size: 26rpx;
}
.search-bottom{
height: 100rpx;
line-height: 100rpx;
display: flex;
margin-left: 20rpx;
}
.texts{
color: #333;
font-size: 26rpx;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
/* width:200rpx; */
text-align: right;
}
.select-text{
display: flex;
margin-right: 20rpx;
font-size: 26rpx;
color: #333;
position: relative;
}
.selIcon{
width: 20rpx;
height: 20rpx;
margin-top: 10rpx;
margin-left: 5rpx;
}
.text-s{
font-size: 26rpx;
color: #999;
margin-right: 10rpx;
}
.place{
font-size: 26rpx;
color: #999;
}
.border-colors{
border: none;
font-size: 26rpx;
color: #333;
margin-left:30rpx;
}
page{
background-color: #f2f2f2;
}
.search-icon{
width: 25rpx;
height: 25rpx;
position: absolute;
left: 30rpx;
top: 12rpx;
image{
}
}
.search-bg{
}
.top{
/* height: 200rpx; */
background-color: #fff;
padding: 20rpx 0 20rpx 0;
}
.search-tops{
display: flex;
justify-content: space-between;
height: 65rpx;
line-height: 65rpx;
padding-bottom: 40rpx;
border-bottom: 1px solid #eee;
}
.search-bg{
width: 432rpx;
height:35rpx;
background: #F5F6F8;
border-radius: 33rpx;
display: flex;
position: relative;
padding: 20rpx 50rpx;
margin-left: 20rpx;
}
</style>

View File

@ -1,334 +0,0 @@
<!--
* @Descripttion:
* @version:
* @Author: 王三华
* @Date: 2023-05-18 14:42:53
-->
<template>
<view class="main">
<view v-if="userInfo.pkCountry!=1" class="top">
<view class="search-bottom">
<view class="time-text">{{$t('w_0138')}}</view>
<view class="time1">
<picker :value="query.startDate" mode="date" @change="bindDateChange">
<view v-if="query.startDate!=''" class="uni-input">{{query.startDate}}</view>
<view v-else class="uni-input">{{$t('CK_KS_4')}}</view>
</picker>
</view>
<view class="text_s">{{$t('w_0139')}}</view>
<view class="time1">
<picker :value="query.endDate" mode="date" @change="bindDateChange1">
<view v-if="query.endDate!=''" class="uni-input">{{query.endDate}}</view>
<view v-else class="uni-input">{{$t('CK_KS_5')}}</view>
</picker>
</view>
<view class="search-icons" @click="submit">
<image class="search-icon-s" src="../../static/images/search.png"></image>
</view>
</view>
</view>
<view class="search-content">
<view class="search-list">
<view v-for="item in dataList" class="search-view">
<view class="flex_s">
<view class="data-left">
{{$t('N_I_130')}}
</view>
<view class="data-right">
{{item.settleDate}}
</view>
</view>
<view class="flex_s">
<view class="data-left">
{{$t('N_I_144')}}(¥)
</view>
<view class="data-right">
{{item.cloudDirectIncome | numberToCurrency}}
</view>
</view>
<view class="flex_s">
<view class="data-left">
{{$t('N_I_145')}}(¥)
</view>
<view class="data-right">
{{item.cloudRepurIncome | numberToCurrency}}
</view>
</view>
<view class="flex_s">
<view class="data-left">
{{$t('N_I_137')}}(¥)
</view>
<view class="data-right">
{{item.serviceSpend | numberToCurrency}}
</view>
</view>
<view class="flex_s">
<view class="data-left">
{{$t('N_I_138')}}(¥)
</view>
<view class="data-right">
{{item.cloudRealSubtotal | numberToCurrency}}
</view>
</view>
<view class="border_s">
<view class="button" v-if="checkRule==true" @click="urlTap">
{{$t('CK_KS_25')}}
</view>
</view>
<view style="clear: both;"></view>
<view style="height: 20rpx;background-color: #fff;"></view>
</view>
</view>
</view>
</view>
</template>
<script>
import * as api from '@/config/login.js'
import { setToken } from '@/config/auth.js'
import store from '@/store'
export default {
data() {
return {
getBonusTypeList:[],
index:null,
dataList:[],
userInfo:[],
query:{
startDate:'',
endDate:'',
sourceMemberCode:'',
sourceMemberName:'',
pkBonusItems: ''
},
page:{
pageNum:1,
pageSize:50
}
}
},
props:["num","checkRule"],
onLoad() {
},
created() {
// this.getType()
this.userInfo = uni.getStorageSync('User')
this.getDataList()
},
methods: {
urlTap() {
uni.navigateTo({ url: '/pages/bonusSource/index' })
},
getInfo(){
api.getInfo().then(res => {
if (res) {
this.userInfo = res.data
}
}).catch(error => {
reject(error)
})
},
submit() {
this.getDataList()
},
getType(){
api.getBonusType().then(res => {
if (res) {
this.getBonusTypeList = res.rows
}
}).catch(error => {
reject(error)
})
},
bindPickerChange(e) {
this.index = e.detail.value
},
bindDateChange(e) {
this.query.startDate = e.detail.value
},
bindDateChange1(e) {
this.query.endDate = e.detail.value
},
getDataList(num) {
api.queryBonusCloud(this.query,`?pageNum=${num||1}&pageSize=${this.page.pageSize}`).then(res => {
if (res) {
this.dataList.push(...res.rows)
}
}).catch(error => {
reject(error)
})
},
submit() {
},
},
}
</script>
<style>
.border_s{
border-bottom: 1rpx solid #eee;
height: 10rpx;
}
.button{
padding: 0 30rpx;
/* width: 150rpx; */
height: 52rpx;
line-height: 52rpx;
color: #fff;
font-size: 28rpx;
text-align: center;
background: #FB3024;
margin: 30rpx 0 0 0;
float: right;
border-radius: 24rpx;
}
.type{
color: #FB3024 !important;
}
.flex_s{
width: 100%;
display: flex;
justify-content: space-between;
padding-bottom: 15rpx;
}
.data-left{
color: #999;
font-size: 26rpx;
}
.data-right{
color: #333;
font-size: 26rpx;
}
.search-view{
/* display: flex; */
/* justify-content: space-between; */
padding: 30rpx 20rpx 0 20rpx;
border-bottom: 20rpx solid #eee;
/* border-bottom: 1px solid #eee; */
margin:0 ;
}
.search-list{
margin-bottom: 25rpx;
background-color: #fff;
}
.search-content{
margin-top: 25rpx;
}
.text_s{
color: #333;
font-size: 26rpx;
}
.search-icon-s{
width: 22rpx;
height: 22rpx;
}
.search-icons{
width: 47rpx;
height: 47rpx;
background: #FB3024;
border-radius: 50%;
margin-left: 20rpx;
display: flex;
justify-content: center;
align-items: center;
margin: 30rpx 20rpx 0 0;
}
.time1{
width: 158rpx;
height: 75rpx;
border-bottom: 1rpx solid #eee;
margin: 0 50rpx 30rpx 50rpx;
color: #999;
text-align: center;
font-size: 24rpx;
/* margin-bottom: 30rpx; */
}
.time-text{
color: #999;
font-size: 26rpx;
}
.search-bottom{
height: 100rpx;
line-height: 100rpx;
display: flex;
margin-left: 20rpx;
}
.texts{
color: #333;
font-size: 26rpx;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
/* width:200rpx; */
text-align: right;
}
.select-text{
display: flex;
margin-right: 20rpx;
font-size: 26rpx;
color: #333;
position: relative;
}
.selIcon{
width: 20rpx;
height: 20rpx;
margin-top: 10rpx;
margin-left: 5rpx;
}
.text-s{
font-size: 26rpx;
color: #999;
margin-right: 10rpx;
}
.place{
font-size: 26rpx;
color: #999;
}
.border-colors{
border: none;
font-size: 26rpx;
color: #333;
margin-left:30rpx;
}
page{
background-color: #f2f2f2;
}
.search-icon{
width: 25rpx;
height: 25rpx;
position: absolute;
left: 30rpx;
top: 12rpx;
image{
}
}
.search-bg{
}
.top{
/* height: 200rpx; */
background-color: #fff;
padding: 20rpx 0 20rpx 0;
}
.search-tops{
display: flex;
justify-content: space-between;
height: 65rpx;
line-height: 65rpx;
padding-bottom: 40rpx;
border-bottom: 1px solid #eee;
}
.search-bg{
width: 432rpx;
height:35rpx;
background: #F5F6F8;
border-radius: 33rpx;
display: flex;
position: relative;
padding: 20rpx 50rpx;
margin-left: 20rpx;
}
</style>

View File

@ -1,415 +1,421 @@
<!--
* @Descripttion:
* @version:
* @Author: 王三<EFBFBD>
* @Date: 2023-05-18 14:42:53
-->
<template>
<view class="main">
<view v-if="userInfo.pkCountry!=1" class="top">
<view class="search-bottom">
<view class="time-text">{{$t('w_0138')}}</view>
<view class="time1">
<picker :value="query.startDate" mode="date" @change="bindDateChange">
<view v-if="query.startDate!=''" class="uni-input">{{query.startDate}}</view>
<view v-else class="uni-input">{{$t('CK_KS_4')}}</view>
</picker>
</view>
<view class="text_s">{{$t('w_0139')}}</view>
<view class="time1">
<picker :value="query.endDate" mode="date" @change="bindDateChange1">
<view v-if="query.endDate!=''" class="uni-input">{{query.endDate}}</view>
<view v-else class="uni-input">{{$t('CK_KS_5')}}</view>
</picker>
</view>
<view class="search-icons" @click="submit">
<image class="search-icon-s" src="../../static/images/search.png"></image>
</view>
</view>
</view>
<view class="search-content">
<view class="search-list">
<view v-for="item in dataList" class="search-view">
<view style="height: 20rpx;"></view>
<view class="flex_s">
<view class="data-left">
{{$t('N_I_130')}}
</view>
<view class="data-right">
{{item.settleDate }}
</view>
</view>
<view class="flex_s">
<view class="data-left">
{{$t('N_I_131')}}({{ isLocaled() }})
</view>
<view class="data-right">
{{item.directIncome| toThousandthAndKeepDecimal }}
</view>
</view>
<view class="flex_s">
<view class="data-left">
{{$t('N_I_132')}}({{ isLocaled() }})
</view>
<view class="data-right">
{{item.expandIncome| toThousandthAndKeepDecimal}}
</view>
</view>
<!-- <view class="flex_s">
<view class="main">
<view v-if="userInfo.pkCountry != 1" class="top">
<view class="search-bottom">
<view class="time-text">{{ '查询时间' }}</view>
<view class="time1">
<picker :value="query.startDate" mode="date" @change="bindDateChange">
<view v-if="query.startDate != ''" class="uni-input">{{
query.startDate
}}</view>
<view v-else class="uni-input">{{ '开始日期' }}</view>
</picker>
</view>
<view class="text_s">{{ '至' }}</view>
<view class="time1">
<picker :value="query.endDate" mode="date" @change="bindDateChange1">
<view v-if="query.endDate != ''" class="uni-input">{{
query.endDate
}}</view>
<view v-else class="uni-input">{{ '结束日期' }}</view>
</picker>
</view>
<view class="search-icons" @click="submit">
<image
class="search-icon-s"
src="../../static/images/search.png"
></image>
</view>
</view>
</view>
<view class="search-content">
<view class="search-list">
<view v-for="item in dataList" class="search-view">
<view style="height: 20rpx"></view>
<view class="flex_s">
<view class="data-left">
{{ '奖金日期' }}
</view>
<view class="data-right">
{{ item.settleDate }}
</view>
</view>
<view class="flex_s">
<view class="data-left"> {{ '直推收益' }} </view>
<view class="data-right">
{{ item.directIncome | toThousandthAndKeepDecimal }}
</view>
</view>
<view class="flex_s">
<view class="data-left"> {{ '拓展收益' }} </view>
<view class="data-right">
{{ item.expandIncome | toThousandthAndKeepDecimal }}
</view>
</view>
<view class="flex_s">
<view class="data-left"> {{ '辅导收益' }} </view>
<view class="data-right">
{{ item.coachIncome | toThousandthAndKeepDecimal }}
</view>
</view>
<!-- <view class="flex_s">
<view class="data-left">
{{$t('N_I_133')}}({{ isLocaled() }})
</view>
<view class="data-right">
{{item.coachIncome | toThousandthAndKeepDecimal}}
</view>
</view>
<view class="flex_s">
<view class="data-left">
{{$t('N_I_134')}}({{ isLocaled() }})
{{'分红收益'}}
</view>
<view class="data-right">
{{item.shareIncome| toThousandthAndKeepDecimal}}
</view>
</view> -->
<view class="flex_s" v-if="userInfo.pkCountry==1">
<view class="flex_s" v-if="userInfo.pkCountry == 1">
<view class="data-left"> {{ '服务补贴' }} </view>
<view class="data-right">
{{ item.serviceIncome | toThousandthAndKeepDecimal }}
</view>
</view>
<view class="flex_s">
<view class="data-left">见点收益</view>
<view class="data-right">
{{ item.globalPoints | toThousandthAndKeepDecimal }}
</view>
</view>
<view class="flex_s">
<view class="data-left">区域收益</view>
<view class="data-right">
{{ item.storeIncome | toThousandthAndKeepDecimal }}
</view>
</view>
<!-- <view class="flex_s">
<view class="data-left">
{{$t('N_I_135')}}({{ isLocaled() }})
</view>
<view class="data-right">
{{item.serviceIncome| toThousandthAndKeepDecimal}}
</view>
</view>
<view class="flex_s" v-if="item.repurRangeIncome && (item.repurRangeIncome*1 > 0)">
<view class="data-left">
极差收益({{ isLocaled() }})
级差收益
</view>
<view class="data-right">
{{item.repurRangeIncome| toThousandthAndKeepDecimal}}
</view>
</view>
<view class="flex_s" v-if="userInfo.pkCountry==1&&item.globalPoints>0">
<view class="flex_s">
<view class="data-left">
{{$t('直推极差')}}({{ isLocaled() }})
{{$t('直推级差')}}
</view>
<view class="data-right">
{{item.globalPoints| toThousandthAndKeepDecimal}}
</view>
</view>
<view class="flex_s" v-if="userInfo.pkCountry==1">
<view class="data-left">
{{$t('N_I_136')}}({{ isLocaled() }})
</view>
<view class="data-right">
{{item.backPoints| toThousandthAndKeepDecimal}}
</view>
</view>
<view class="flex_s" v-if="userInfo.pkCountry==1">
<view class="data-left">
{{$t('N_I_137')}}({{ isLocaled() }})
</view>
<view class="data-right">
{{item.serviceSpend| toThousandthAndKeepDecimal}}
</view>
</view>
<view class="flex_s">
<view class="data-left">
{{$t('N_I_138')}}({{ isLocaled() }})
</view>
<view class="data-right">
{{item.purRealSubtotal| toThousandthAndKeepDecimal}}
</view>
</view>
<view class="border_s">
</view> -->
<view class="flex_s" v-if="userInfo.pkCountry == 1">
<view class="data-left"> {{ '重复消费' }} </view>
<view class="data-right">
{{ item.backPoints | toThousandthAndKeepDecimal }}
</view>
</view>
<view class="flex_s" v-if="userInfo.pkCountry == 1">
<view class="data-left">
{{ '平台服务费' }}
</view>
<view class="data-right">
{{ item.serviceSpend | toThousandthAndKeepDecimal }}
</view>
</view>
<view class="flex_s">
<view class="data-left"> {{ '实发小计' }} </view>
<view class="data-right">
{{ item.purRealSubtotal | toThousandthAndKeepDecimal }}
</view>
</view>
<!-- <view class="border_s">
<view class="button" v-if="checkRule==true" @click="urlTap">
{{$t('CK_KS_25')}}
{{'查看详情'}}
</view>
</view>
<view style="clear: both;"></view>
<view style="height: 20rpx;background-color: #fff;"></view>
</view>
</view>
</view>
</view>
</view> -->
<view style="clear: both"></view>
<view style="height: 20rpx; background-color: #fff"></view>
</view>
</view>
</view>
</view>
</template>
<script>
import * as api from '@/config/login.js'
import {
setToken
} from '@/config/auth.js'
import store from '@/store'
import {
isLocaled
} from '@/util/numberToCurrency'
import * as api from '@/config/login.js'
import { setToken } from '@/config/auth.js'
import store from '@/store'
import { isLocaled } from '@/util/numberToCurrency'
export default {
data() {
return {
getBonusTypeList: [],
index: null,
dataList: [],
userInfo: [],
query: {
startDate: '',
endDate: '',
sourceMemberCode: '',
sourceMemberName: '',
pkBonusItems: ''
},
page: {
pageNum: 1,
pageSize: 50
}
}
},
props: ["num", "checkRule"],
onLoad() {
},
created() {
// this.getType()
this.userInfo = uni.getStorageSync('User')
this.getDataList()
},
methods: {
isLocaled,
urlTap() {
uni.navigateTo({
url: '/pages/bonusSource/index'
})
},
getInfo() {
api.getInfo().then(res => {
if (res) {
this.userInfo = res.data
}
}).catch(error => {
reject(error)
})
},
submit() {
this.getDataList()
},
getType() {
api.getBonusType().then(res => {
if (res) {
this.getBonusTypeList = res.rows
}
}).catch(error => {
reject(error)
})
},
bindPickerChange(e) {
this.index = e.detail.value
},
bindDateChange(e) {
this.query.startDate = e.detail.value
},
bindDateChange1(e) {
this.query.endDate = e.detail.value
},
getDataList(num) {
api.queryBonusFirst(this.query, `?pageNum=${num||1}&pageSize=${this.page.pageSize}`).then(res => {
if (res) {
this.dataList.push(...res.rows)
}
}).catch(error => {
reject(error)
})
},
submit() {
},
},
}
export default {
data() {
return {
getBonusTypeList: [],
index: null,
dataList: [],
userInfo: [],
query: {
startDate: '',
endDate: '',
sourceMemberCode: '',
sourceMemberName: '',
pkBonusItems: '',
},
page: {
pageNum: 1,
pageSize: 50,
},
}
},
props: ['num', 'checkRule'],
onLoad() {},
created() {
// this.getType()
this.userInfo = uni.getStorageSync('User')
this.getDataList()
},
methods: {
isLocaled,
urlTap() {
uni.navigateTo({
url: '/pages/bonusSource/index',
})
},
getInfo() {
api
.getInfo()
.then(res => {
if (res) {
this.userInfo = res.data
}
})
.catch(error => {
reject(error)
})
},
submit() {
this.getDataList()
},
getType() {
api
.getBonusType()
.then(res => {
if (res) {
this.getBonusTypeList = res.rows
}
})
.catch(error => {
reject(error)
})
},
bindPickerChange(e) {
this.index = e.detail.value
},
bindDateChange(e) {
this.query.startDate = e.detail.value
},
bindDateChange1(e) {
this.query.endDate = e.detail.value
},
getDataList(num) {
api
.queryBonusFirst(
this.query,
`?pageNum=${num || 1}&pageSize=${this.page.pageSize}`
)
.then(res => {
if (res) {
this.dataList.push(...res.rows)
}
})
.catch(error => {
reject(error)
})
},
submit() {},
},
}
</script>
<style>
.border_s {
border-bottom: 1rpx solid #eee;
height: 10rpx;
}
.border_s {
border-bottom: 1rpx solid #eee;
height: 10rpx;
}
.button {
padding: 0 30rpx;
/* width: 150rpx; */
height: 52rpx;
line-height: 52rpx;
color: #fff;
font-size: 28rpx;
text-align: center;
background: #FB3024;
margin: 30rpx 0 0 0;
float: right;
border-radius: 24rpx;
}
.button {
padding: 0 30rpx;
/* width: 150rpx; */
height: 52rpx;
line-height: 52rpx;
color: #fff;
font-size: 28rpx;
text-align: center;
background: #005bac;
margin: 30rpx 0 0 0;
float: right;
border-radius: 24rpx;
}
.type {
color: #FB3024 !important;
}
.type {
color: #005bac !important;
}
.flex_s {
width: 100%;
display: flex;
justify-content: space-between;
padding-bottom: 15rpx;
}
.flex_s {
width: 100%;
display: flex;
justify-content: space-between;
padding-bottom: 15rpx;
}
.data-left {
color: #999;
font-size: 26rpx;
}
.data-left {
color: #999;
font-size: 26rpx;
}
.data-right {
color: #333;
font-size: 26rpx;
}
.data-right {
color: #333;
font-size: 26rpx;
}
.search-view {
/* display: flex; */
/* justify-content: space-between; */
padding: 30rpx 20rpx 0 20rpx;
border-bottom: 20rpx solid #eee;
/* border-bottom: 1px solid #eee; */
margin: 0;
}
.search-view {
/* display: flex; */
/* justify-content: space-between; */
padding: 16rpx 20rpx 0 20rpx;
border-bottom: 20rpx solid #eee;
/* border-bottom: 1px solid #eee; */
margin: 0;
}
.search-list {
margin-bottom: 25rpx;
background-color: #fff;
}
.search-list {
margin-bottom: 25rpx;
background-color: #fff;
}
.search-content {
margin-top: 25rpx;
}
.search-content {
margin-top: 25rpx;
}
.text_s {
color: #333;
font-size: 26rpx;
}
.text_s {
color: #333;
font-size: 26rpx;
}
.search-icon-s {
width: 22rpx;
height: 22rpx;
}
.search-icon-s {
width: 22rpx;
height: 22rpx;
}
.search-icons {
width: 47rpx;
height: 47rpx;
background: #FB3024;
border-radius: 50%;
margin-left: 20rpx;
display: flex;
justify-content: center;
align-items: center;
margin: 30rpx 20rpx 0 0;
}
.search-icons {
width: 47rpx;
height: 47rpx;
background: #005bac;
border-radius: 50%;
margin-left: 20rpx;
display: flex;
justify-content: center;
align-items: center;
margin: 30rpx 20rpx 0 0;
}
.time1 {
width: 158rpx;
height: 75rpx;
border-bottom: 1rpx solid #eee;
margin: 0 50rpx 30rpx 50rpx;
color: #999;
text-align: center;
font-size: 24rpx;
/* margin-bottom: 30rpx; */
}
.time1 {
width: 158rpx;
height: 75rpx;
border-bottom: 1rpx solid #eee;
margin: 0 50rpx 30rpx 50rpx;
color: #999;
text-align: center;
font-size: 24rpx;
/* margin-bottom: 30rpx; */
}
.time-text {
color: #999;
font-size: 26rpx;
}
.time-text {
color: #999;
font-size: 26rpx;
}
.search-bottom {
height: 100rpx;
line-height: 100rpx;
display: flex;
margin-left: 20rpx;
}
.search-bottom {
height: 100rpx;
line-height: 100rpx;
display: flex;
margin-left: 20rpx;
}
.texts {
color: #333;
font-size: 26rpx;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
/* width:200rpx; */
text-align: right;
}
.texts {
color: #333;
font-size: 26rpx;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
/* width:200rpx; */
text-align: right;
}
.select-text {
display: flex;
margin-right: 20rpx;
font-size: 26rpx;
color: #333;
position: relative;
}
.select-text {
display: flex;
margin-right: 20rpx;
font-size: 26rpx;
color: #333;
position: relative;
}
.selIcon {
width: 20rpx;
height: 20rpx;
margin-top: 10rpx;
margin-left: 5rpx;
}
.selIcon {
width: 20rpx;
height: 20rpx;
margin-top: 10rpx;
margin-left: 5rpx;
}
.text-s {
font-size: 26rpx;
color: #999;
margin-right: 10rpx;
}
.text-s {
font-size: 26rpx;
color: #999;
margin-right: 10rpx;
}
.place {
font-size: 26rpx;
color: #999;
}
.place {
font-size: 26rpx;
color: #999;
}
.border-colors {
border: none;
font-size: 26rpx;
color: #333;
margin-left: 30rpx;
}
.border-colors {
border: none;
font-size: 26rpx;
color: #333;
margin-left: 30rpx;
}
page {
background-color: #f2f2f2;
}
page {
background-color: #f2f2f2;
}
.search-icon {
width: 25rpx;
height: 25rpx;
position: absolute;
left: 30rpx;
top: 12rpx;
.search-icon {
width: 25rpx;
height: 25rpx;
position: absolute;
left: 30rpx;
top: 12rpx;
image {}
}
image {
}
}
.search-bg {}
.search-bg {
}
.top {
/* height: 200rpx; */
background-color: #fff;
padding: 20rpx 0 20rpx 0;
}
.top {
/* height: 200rpx; */
background-color: #fff;
padding: 20rpx 0 20rpx 0;
}
.search-tops {
display: flex;
justify-content: space-between;
height: 65rpx;
line-height: 65rpx;
padding-bottom: 40rpx;
border-bottom: 1px solid #eee;
}
.search-tops {
display: flex;
justify-content: space-between;
height: 65rpx;
line-height: 65rpx;
padding-bottom: 40rpx;
border-bottom: 1px solid #eee;
}
.search-bg {
width: 432rpx;
height: 35rpx;
background: #F5F6F8;
border-radius: 33rpx;
display: flex;
position: relative;
padding: 20rpx 50rpx;
margin-left: 20rpx;
}
</style>
.search-bg {
width: 432rpx;
height: 35rpx;
background: #f5f6f8;
border-radius: 33rpx;
display: flex;
position: relative;
padding: 20rpx 50rpx;
margin-left: 20rpx;
}
</style>

View File

@ -1,54 +1,33 @@
<!--
* @Descripttion:
* @version:
* @Author: 王三华
* @Date: 2023-07-01 09:38:17
-->
<template>
<view>
<view class="quan"
@click.stop="goCart">
<img :src="smallCarLength>0?img1:img2"
<img :src="smallCarLength>0?cart:cartEmpty"
alt="">
<view class="qiu"
v-show="smallCarLength > 0">{{ smallCarLength }}</view>
</view>
<u-popup :show="downShow"
mode="bottom"
closeOnClickOverlay
closeable
round="10"
@close="close">
<view class="title">{{ $t('N_I_194') }}</view>
<cartBtmList ref='cartBtmList'></cartBtmList>
<u-popup
:show="downShow"
mode="bottom"
closeOnClickOverlay
closeable
round="10"
@close="close"
>
<view class="title">{{ '购物车' }}</view>
<cartBtmList ref="cartBtmList" @orderCallBack="orderCallBack"></cartBtmList>
</u-popup>
</view>
</template>
<script>
import { mapGetters } from 'vuex'
import { mapGetters, mapActions } from 'vuex'
import cartBtmList from '@/components/cartBtmList.vue'
export default {
components: {
cartBtmList,
},
data() {
return {
downShow: false,
img1: require('@/static/images/cartBall1.png'),
img2: require('@/static/images/cartBall.png'),
}
},
computed: {
...mapGetters(['smallCarLength']),
},
watch: {
carLength(n, o) {
this.smallCarLength = n
},
},
props: {
carLength: {
type: Number | String,
@ -59,22 +38,30 @@ export default {
default: 1,
},
},
mounted() {
this.$store.dispatch('getCarLength', this.specialArea)
// .then((res) => {
// this.smallCarLength = res.data.smallCount
// })
components: {
cartBtmList,
},
data() {
return {
downShow: false,
cart: require('@/static/images/cart-not-empty.png'),
cartEmpty: require('@/static/images/cart-empty.png'),
}
},
computed: {
...mapGetters(['smallCarLength']),
},
created() {
this.getCar()
},
methods: {
close() {
this.downShow = false
this.getCar()
},
getCar() {
this.$store.dispatch('getCarLength', this.specialArea)
// .then((res) => {
// this.smallCarLength = res.data.smallCount
// })
},
goCart() {
this.downShow = true
@ -83,6 +70,9 @@ export default {
})
// uni.switchTab({ url: '/pages/shoppingCar/index' })
},
orderCallBack() {
this.close()
},
},
}
</script>
@ -97,8 +87,8 @@ export default {
}
.quan {
position: absolute;
right: 24rpx;
bottom: 33%;
right: 84rpx;
bottom: 30%;
background: #fff;
border-radius: 50%;
box-shadow: 0px 2px 20px 0px rgba(204, 204, 204, 1);
@ -130,4 +120,4 @@ export default {
::v-deep .u-popup__content {
overflow: hidden;
}
</style>
</style>

View File

@ -1,6 +1,6 @@
<!--
* @Descripttion:
* @version:
* @Descripttion:
* @version:
* @Author: kBank
* @Date: 2022-11-21 15:11:22
-->
@ -12,13 +12,6 @@
v-for="(item, index) in shopCarList"
:key="item.specialArea"
>
<!-- <view class="kuang_t">
{{ item.specialAreaVal }}
</view> -->
<!-- <u-checkbox-group v-model="item.isSelect"
shape="circle"
placement="column"
@change="checkboxChange($event,item)"> -->
<view
v-for="(ctem, cndex) in item.shoppingCartList"
:key="cndex"
@ -38,7 +31,7 @@
{{ ctem.waresPrice | numberToCurrency | isLocal }}
</view>
<view class="tit3"
>PV: {{ ctem.achieve | numberToCurrency | isLocal }}</view
>业绩: {{ ctem.achieve | numberToCurrency | isLocal }}</view
>
</view>
</view>
@ -55,7 +48,7 @@
}}{{
(stem.waresItemsParamsList.length > 0 &&
stem.waresItemsParamsList[0].specsName) ||
""
''
}}</view
>
<!-- <view class="tit4"></view> -->
@ -63,7 +56,7 @@
>x{{
(stem.waresItemsParamsList.length > 0 &&
stem.waresItemsParamsList[0].quantity) ||
""
''
}}</view
>
</view>
@ -86,7 +79,7 @@
<!-- </u-checkbox-group> -->
</view>
</view>
<view class="kong_t" v-show="shopCarList.length == 0">
<view class="kong_t" v-show="cartEmpty">
<img class="kong" src="@/static/images/kong.png" alt=""
/></view>
<view class="zhan"></view>
@ -100,7 +93,7 @@
<view class="r1">{{
totalPrice | numberToCurrency | isLocal
}}</view>
<view class="l1">PV:{{ totalAchive | numberToCurrency }}</view>
<view class="l1">业绩:{{ totalAchive | numberToCurrency }}</view>
</view>
</view>
</view>
@ -110,11 +103,11 @@
class="uBtn"
shape="circle"
:loading="isLoading"
:loadingText="$t('w_0313')"
:loadingText="'购买中'"
@tap="goBuy"
:disabled="shopCarList.length == 0"
color="#FB3024"
>{{ $t("w_0312") }}
:disabled="submitDisabled"
color="#005BAC"
>{{ '去结算' }}
</u-button>
</view>
</view>
@ -136,7 +129,7 @@
<view class="popList_i" v-for="item in tableData" :key="item.pkId">
<u-checkbox :name="item.pkId"> </u-checkbox>
<view class="popList_ii">
<img :src="item.cover1" alt="" />
<img :src="item.cover || item.cover1" alt="" />
<view>
<view>{{ item.waresName }}</view>
<view>{{ item.waresCode }}</view>
@ -158,10 +151,12 @@
</template>
<script>
import * as api from "@/config/goods";
import * as api from '@/config/goods'
import { canOrder } from '@/config/order'
export default {
data() {
return {
newShareMember: false,
isSelectAll: [],
shopCarList: [],
isLoading: false,
@ -177,20 +172,34 @@ export default {
dialogVisible2: false,
selTable: [],
allTable: [],
total: "0.00",
total: '0.00',
// show:false,
// title:this.$t('w_0034'),
// title:'',
// content:''
};
}
},
computed: {
submitDisabled() {
if (this.goodsCheck[0]?.orderItemsParams) {
return this.goodsCheck[0]?.orderItemsParams?.length === 0
}
return true
},
cartEmpty() {
return (
this.shopCarList.length === 0 ||
this.shopCarList[0]?.shoppingCartList?.length === 0
)
},
},
watch: {
selTable: {
handler(n, o) {
let total = 0;
n.forEach((item) => {
total += Number(item.waresPrice) * item.quantity;
});
this.total = total;
let total = 0
n.forEach(item => {
total += Number(item.waresPrice) * item.quantity
})
this.total = total
},
deep: true,
},
@ -205,6 +214,8 @@ export default {
// this.getCarList()
},
onShow() {
this.newShareMember = uni.getStorageSync('User')?.loginType !== 0
console.log('this.nerShareMember', this.newShareMember)
// this.getCarList()
},
methods: {
@ -213,198 +224,181 @@ export default {
let a = {
specialArea: this.goodsCheck[0].specialArea,
orderItemsParams: [],
};
a.orderItemsParams = this.selTable.map((item) => {
}
a.orderItemsParams = this.selTable.map(item => {
return {
waresCode: item.waresCode,
quantity: item.quantity,
waresItemsParamList: item.productGroup,
energySilo: 1,
};
});
a.orderItemsParams.forEach((item) => {
item.waresItemsParamList = item.waresItemsParamList.map((ctem) => {
}
})
a.orderItemsParams.forEach(item => {
item.waresItemsParamList = item.waresItemsParamList.map(ctem => {
return {
pkWaresSpecsSku: ctem.pkSkuId,
quantity: ctem.quantity,
};
});
});
api.energyShopSilo(a).then((res) => {
}
})
})
api.energyShopSilo(a).then(res => {
if (res.code == 200) {
this.dialogVisible2 = false;
let shoppArr = this.goodsCheck[0].orderItemsParams.map((item) => {
return item.shoppingId;
});
this.dialogVisible2 = false
let shoppArr = this.goodsCheck[0].orderItemsParams.map(item => {
return item.shoppingId
})
if (this.goodsCheck[0].specialArea == 1) {
uni.navigateTo({
url:
"/pages/regiest/index?specialArea=" +
'/pages/regiest/index?specialArea=' +
this.goodsCheck[0].specialArea +
"&shoppArr=" +
'&shoppArr=' +
JSON.stringify(shoppArr) +
"&selTable=" +
'&selTable=' +
JSON.stringify(this.selTable),
});
})
} else if (this.goodsCheck[0].specialArea == 2) {
uni.navigateTo({
url:
"/pages/other/index?specialArea=" +
'/pages/other/index?specialArea=' +
this.goodsCheck[0].specialArea +
"&shoppArr=" +
'&shoppArr=' +
JSON.stringify(shoppArr) +
"&selTable=" +
'&selTable=' +
JSON.stringify(this.selTable),
});
})
}
}
});
})
} else {
uni.showToast({
title: "请选择赠品",
icon: "none",
});
title: '请选择赠品',
icon: 'none',
})
}
},
handleSelectionChange(val) {
let arr = [];
this.tableData.forEach((item) => {
val.forEach((ctem) => {
let arr = []
this.tableData.forEach(item => {
val.forEach(ctem => {
if (item.pkId == ctem) {
arr.push(item);
arr.push(item)
}
});
});
this.selTable = arr;
})
})
this.selTable = arr
},
selectAll(e) {
let i = 0;
let i = 0
// isSelected
if (e.length > 0) {
this.shopCarList.forEach((item) => {
item.isSelected = true;
item.shoppingCartList.forEach((ctem) => {
ctem.isSelected = true;
item.isSelect.push(ctem.shoppingId);
});
});
this.shopCarList.forEach((item) => {
this.shopCarList.forEach(item => {
item.isSelected = true
item.shoppingCartList.forEach(ctem => {
ctem.isSelected = true
item.isSelect.push(ctem.shoppingId)
})
})
this.shopCarList.forEach(item => {
if (item.isSelected) {
i++;
i++
}
});
this.isTo = i;
})
this.isTo = i
// this.checkArea()
} else {
this.shopCarList.forEach((item) => {
item.isSelected = false;
item.shoppingCartList.forEach((ctem) => {
ctem.isSelected = false;
item.isSelect = [];
});
});
this.shopCarList.forEach((item) => {
this.shopCarList.forEach(item => {
item.isSelected = false
item.shoppingCartList.forEach(ctem => {
ctem.isSelected = false
item.isSelect = []
})
})
this.shopCarList.forEach(item => {
if (item.isSelected) {
i++;
i++
}
});
this.isTo = i;
})
this.isTo = i
// this.checkArea()
}
},
delAll() {
let arr = [];
this.shopCarList.forEach((item) => {
item.isSelect.forEach((ctem) => {
let arr = []
this.shopCarList.forEach(item => {
item.isSelect.forEach(ctem => {
arr.push({
shoppingId: ctem,
});
});
});
api.batchDelShopping({ deleteList: arr }).then((res) => {
this.getCarList();
})
})
})
api.batchDelShopping({ deleteList: arr }).then(res => {
this.getCarList()
// this.getShoppingCount()
uni.showToast({
title: this.$t("w_0089"),
icon: "none",
title: '删除成功',
icon: 'none',
duration: 1500,
});
});
})
})
},
goBuy() {
let shoppArr = this.goodsCheck[0].orderItemsParams.map((item) => {
return item.shoppingId;
});
uni.setStorageSync("allGoods", JSON.stringify(shoppArr));
canOrder(shoppingArr) {
return new Promise((resolve, reject) => {
canOrder({
shoppingIds: shoppingArr,
specialArea: this.specialArea,
}).then(res => {
if (res.code == 200 && res.data?.flag === 0) {
resolve(true)
} else {
reject(res.data?.msg)
}
})
})
},
async goBuy() {
let shoppArr = this.goodsCheck[0].orderItemsParams.map(item => {
return item.shoppingId
})
try {
await this.canOrder(shoppArr)
} catch (msg) {
uni.showToast({
title: msg,
icon: 'none',
})
return
}
uni.setStorageSync('allGoods', JSON.stringify(shoppArr))
if (
this.goodsCheck[0].specialArea == 1 ||
this.goodsCheck[0].specialArea == 24
) {
// let deleteList = []
// shoppArr.forEach((item) => {
// deleteList.push({
// shoppingId: item,
// })
// })
// api
// .validShop({
// specialArea: this.goodsCheck[0].specialArea,
// deleteList: deleteList,
// })
// .then((res) => {
// if (res.code == 200) {
// uni.navigateTo({
// url:
// '/pages/regiest/index?specialArea=' +
// this.goodsCheck[0].specialArea +
// '&shoppArr=' +
// JSON.stringify(shoppArr),
// })
// } else {
// uni.showToast({
// title: res.msg,
// icon: 'none',
// mask: true,
// })
// }
// })
let deleteList = [];
shoppArr.forEach((item) => {
let deleteList = []
shoppArr.forEach(item => {
deleteList.push({
shoppingId: item,
});
});
api
.validShop({
specialArea: this.goodsCheck[0].specialArea,
deleteList: deleteList,
})
.then((res) => {
if (res.code == 200) {
api
.energyShop({
specialArea: this.goodsCheck[0].specialArea,
deleteList: deleteList,
})
.then((response) => {
if (response.data && response.data.length > 0) {
this.tableData = response.data;
this.tableData.forEach((item) => {
this.$set(item, "quantity", 1);
});
this.dialogVisible2 = true;
} else {
uni.navigateTo({
url:
"/pages/regiest/index?specialArea=" +
this.goodsCheck[0].specialArea +
"&shoppArr=" +
JSON.stringify(shoppArr),
});
}
});
}
});
})
// sangelxiu1
this.newShareMember = uni.getStorageSync('User')?.loginType !== 0
if(this.newShareMember){
uni.navigateTo({
url:
'/pages/regiest/shareRegister?specialArea=' +
41 +
'&shoppArr=' +
JSON.stringify(shoppArr),
})
}else{
uni.navigateTo({
url:
'/pages/regiest/index?specialArea=' +
this.goodsCheck[0].specialArea +
'&shoppArr=' +
JSON.stringify(shoppArr),
})
}
} else if (this.goodsCheck[0].specialArea == 21) {
if (
this.userInfo.registerShare == 0 ||
@ -412,144 +406,92 @@ export default {
) {
uni.navigateTo({
url:
"/pages/shareArea/haiShare?allData=" +
'/pages/shareArea/haiShare?allData=' +
JSON.stringify(this.goodsCheck[0].orderItemsParams),
});
})
} else {
uni.setStorageSync(
"haiConfirm",
'haiConfirm',
JSON.stringify(this.goodsCheck[0].orderItemsParams)
);
)
uni.navigateTo({
url: "/pages/other/haiConfirm?shoppArr=" + JSON.stringify(shoppArr),
});
url: '/pages/other/haiConfirm?shoppArr=' + JSON.stringify(shoppArr),
})
}
} else if (this.goodsCheck[0].specialArea == 7) {
uni.navigateTo({
url:
"/pages/hiFans/index?specialArea=" +
'/pages/hiFans/index?specialArea=' +
this.goodsCheck[0].specialArea +
"&shoppArr=" +
'&shoppArr=' +
JSON.stringify(shoppArr),
});
})
} else {
if (this.goodsCheck[0].specialArea == 2) {
// let deleteList = []
// shoppArr.forEach((item) => {
// deleteList.push({
// shoppingId: item,
// })
// })
// api
// .validShop({
// specialArea: this.goodsCheck[0].specialArea,
// deleteList: deleteList,
// })
// .then((res) => {
// if (res.code == 200) {
// uni.navigateTo({
// url:
// '/pages/other/index?specialArea=' +
// this.goodsCheck[0].specialArea +
// '&shoppArr=' +
// JSON.stringify(shoppArr),
// })
// } else {
// uni.showToast({
// title: res.msg,
// icon: 'none',
// mask: true,
// })
// }
// })
let deleteList = [];
shoppArr.forEach((item) => {
let deleteList = []
shoppArr.forEach(item => {
deleteList.push({
shoppingId: item,
});
});
api
.validShop({
specialArea: this.goodsCheck[0].specialArea,
deleteList: deleteList,
})
.then((res) => {
if (res.code == 200) {
api
.energyShop({
specialArea: this.goodsCheck[0].specialArea,
deleteList: deleteList,
})
.then((response) => {
if (response.data && response.data.length > 0) {
this.tableData = response.data;
this.tableData.forEach((item) => {
this.$set(item, "quantity", 1);
});
this.dialogVisible2 = true;
} else {
uni.navigateTo({
url:
"/pages/other/index?specialArea=" +
this.goodsCheck[0].specialArea +
"&shoppArr=" +
JSON.stringify(shoppArr),
});
}
});
}
});
})
uni.navigateTo({
url:
'/pages/other/index?specialArea=' +
this.goodsCheck[0].specialArea +
'&shoppArr=' +
JSON.stringify(shoppArr),
})
} else if (this.goodsCheck[0].specialArea == 30) {
if (this.goodsCheck[0].orderItemsParams.length > 1) {
uni.showToast({
title: "续约专区每次只能购买一件商品",
icon: "none",
});
return false;
title: '续约专区每次只能购买一件商品',
icon: 'none',
})
return false
} else {
let num = this.goodsCheck[0].orderItemsParams.some(
(item) => item.quantity > 1
);
item => item.quantity > 1
)
if (num) {
uni.showToast({
title: "续约专区每次只能购买一件商品",
icon: "none",
});
return false;
title: '续约专区每次只能购买一件商品',
icon: 'none',
})
return false
} else {
uni.navigateTo({
url:
"/pages/other/index?specialArea=" +
'/pages/other/index?specialArea=' +
this.goodsCheck[0].specialArea +
"&shoppArr=" +
'&shoppArr=' +
JSON.stringify(shoppArr),
});
})
}
}
} else if(this.goodsCheck[0].specialArea == 31){
} else if (this.goodsCheck[0].specialArea == 31) {
if (this.totalPrice < 1000) {
uni.showToast({
title: "购买商品总价格不能低于1000元",
icon: "none",
title: '购买商品总价格不能低于1000元',
icon: 'none',
duration: 1500,
});
}else{
})
} else {
uni.navigateTo({
url:
"/pages/other/index?specialArea=" +
this.goodsCheck[0].specialArea +
"&shoppArr=" +
JSON.stringify(shoppArr),
});
url:
'/pages/other/index?specialArea=' +
this.goodsCheck[0].specialArea +
'&shoppArr=' +
JSON.stringify(shoppArr),
})
}
}else {
} else {
uni.navigateTo({
url:
"/pages/other/index?specialArea=" +
'/pages/other/index?specialArea=' +
this.goodsCheck[0].specialArea +
"&shoppArr=" +
'&shoppArr=' +
JSON.stringify(shoppArr),
});
})
}
}
},
@ -561,97 +503,61 @@ export default {
number: e.value,
specialArea: item.specialArea,
})
.then((res) => {
.then(res => {
if (res.code == 200) {
this.dealData();
this.dealData()
} else {
this.getCarList();
this.getCarList()
}
// this.getShoppingCount()
});
})
},
// checkArea() {
// let arr = []
// this.shopCarList.forEach((item) => {
// item.shoppingCartList.forEach((ctem) => {
// if (item.isSelect.indexOf(ctem.shoppingId) > -1) {
// arr.push({
// specialArea: item.specialArea,
// orderItemsParams: [
// {
// waresCode: ctem.waresCode,
// shoppingId: ctem.shoppingId,
// waresName: ctem.waresName,
// achieve: ctem.achieve,
// waresPrice: ctem.waresPrice,
// cover1: ctem.cover1,
// quantity: ctem.number,
// waresItemsParamList: ctem.waresItemsParamList,
// waresSkuList: ctem.waresSkuList || [],
// source: ctem.source || '',
// },
// ],
// })
// }
// })
// })
// const arrayHashmap = arr.reduce((obj, item) => {
// obj[item.specialArea]
// ? obj[item.specialArea].orderItemsParams.push(
// ...item.orderItemsParams
// )
// : (obj[item.specialArea] = item)
// return obj
// }, {})
// this.goodsCheck = Object.values(arrayHashmap)
// this.checkPrice()
// },
//
checkPrice() {
let totalPrice = 0;
let totalAchive = 0;
let num = 0;
this.goodsCheck.forEach((item) => {
item.orderItemsParams.forEach((ctem) => {
totalPrice += parseFloat(ctem.waresPrice * ctem.quantity);
totalAchive += parseFloat(ctem.achieve * ctem.quantity);
num += ctem.quantity;
});
});
let totalPrice = 0
let totalAchive = 0
let num = 0
this.goodsCheck.forEach(item => {
item.orderItemsParams.forEach(ctem => {
totalPrice += parseFloat(ctem.waresPrice * ctem.quantity)
totalAchive += parseFloat(ctem.achieve * ctem.quantity)
num += ctem.quantity
})
})
// if (this.goodsCheck.length != 1) {
this.totalPrice = totalPrice.toFixed(2);
this.totalAchive = totalAchive.toFixed(2);
this.num = num;
this.totalPrice = totalPrice.toFixed(2)
this.totalAchive = totalAchive.toFixed(2)
this.num = num
// }
},
checkboxChange(e, item) {
if (e.length > 0) {
this.$set(item, "isSelected", true);
this.$set(item, "isSelect", e);
this.$set(item, 'isSelected', true)
this.$set(item, 'isSelect', e)
// this.checkArea()
} else {
this.$set(item, "isSelected", false);
this.$set(item, "isSelect", e);
this.$set(item, 'isSelected', false)
this.$set(item, 'isSelect', e)
// this.checkArea()
}
let i = 0;
this.shopCarList.forEach((item) => {
let i = 0
this.shopCarList.forEach(item => {
if (item.isSelected) {
i++;
i++
}
});
this.isTo = i;
let blin = true;
this.shopCarList.forEach((item) => {
})
this.isTo = i
let blin = true
this.shopCarList.forEach(item => {
if (item.isSelect.length != item.shoppingCartList.length) {
blin = false;
blin = false
}
});
})
if (blin) {
this.isSelectAll = [1];
this.isSelectAll = [1]
} else {
this.isSelectAll = [];
this.isSelectAll = []
}
},
//
@ -660,29 +566,29 @@ export default {
{
shoppingId: ctem.shoppingId,
},
];
api.batchDelShopping({ deleteList: deleteList }).then((res) => {
this.getCarList();
]
api.batchDelShopping({ deleteList: deleteList }).then(res => {
this.getCarList()
// this.getShoppingCount()
uni.showToast({
title: this.$t("w_0089"),
icon: "none",
title: '删除成功',
icon: 'none',
duration: 1500,
});
});
})
})
},
getCarList(specialArea) {
if (specialArea) {
this.specialArea = specialArea;
this.userInfo = uni.getStorageSync("User");
this.specialArea = specialArea
this.userInfo = uni.getStorageSync('User')
if (this.specialArea == 1) {
if (uni.getStorageSync("pkCountry")) {
this.pkCountry = uni.getStorageSync("pkCountry");
if (uni.getStorageSync('pkCountry')) {
this.pkCountry = uni.getStorageSync('pkCountry')
} else {
this.pkCountry = this.userInfo.pkSettleCountry;
this.pkCountry = this.userInfo.pkSettleCountry
}
} else {
this.pkCountry = this.userInfo.pkSettleCountry;
this.pkCountry = this.userInfo.pkSettleCountry
}
}
api
@ -690,35 +596,35 @@ export default {
specialArea: this.specialArea,
pkCountry: this.pkCountry,
})
.then((res) => {
res.data.forEach((item) => {
item.isSelected = false;
item.isSelect = [];
item.shoppingCartList.forEach((ctem) => {
ctem.isSelected = false;
ctem.waresItemsParamList = [];
.then(res => {
res.data.forEach(item => {
item.isSelected = false
item.isSelect = []
item.shoppingCartList.forEach(ctem => {
ctem.isSelected = false
ctem.waresItemsParamList = []
if (item.specialArea != 21) {
ctem.productParams.forEach((stem) => {
ctem.productParams.forEach(stem => {
if (stem.waresItemsParamsList.length > 0) {
stem.waresItemsParamsList[0].pkWaresSpecsSku =
stem.waresItemsParamsList[0].pkSkuId;
stem.waresItemsParamsList[0].productName = stem.productName;
ctem.waresItemsParamList.push(stem.waresItemsParamsList[0]);
stem.waresItemsParamsList[0].pkSkuId
stem.waresItemsParamsList[0].productName = stem.productName
ctem.waresItemsParamList.push(stem.waresItemsParamsList[0])
}
});
})
} else {
}
});
});
this.shopCarList = res.data;
this.goPay();
this.dealData();
});
})
})
this.shopCarList = res.data
this.goPay()
this.dealData()
})
},
goPay() {
let arr = [];
this.shopCarList.forEach((item) => {
item.shoppingCartList.forEach((ctem) => {
let arr = []
this.shopCarList.forEach(item => {
item.shoppingCartList.forEach(ctem => {
arr.push({
specialArea: item.specialArea,
orderItemsParams: [
@ -735,19 +641,18 @@ export default {
waresSkuList: ctem.waresSkuList || [],
},
],
});
});
});
})
})
})
const arrayHashmap = arr.reduce((obj, item) => {
obj[item.specialArea]
? obj[item.specialArea].orderItemsParams.push(
...item.orderItemsParams
)
: (obj[item.specialArea] = item);
return obj;
}, {});
this.goodsCheck = Object.values(arrayHashmap);
: (obj[item.specialArea] = item)
return obj
}, {})
this.goodsCheck = Object.values(arrayHashmap)
},
//
dealData() {
@ -756,8 +661,8 @@ export default {
specialArea: this.shopCarList[0].specialArea,
orderItemsParams: [],
},
];
this.shopCarList[0].shoppingCartList.forEach((ctem) => {
]
this.shopCarList[0].shoppingCartList.forEach(ctem => {
arr[0].orderItemsParams.push({
waresCode: ctem.waresCode,
waresName: ctem.waresName,
@ -769,13 +674,13 @@ export default {
quantity: ctem.number,
waresItemsParamList: ctem.waresItemsParamList,
waresSkuList: ctem.waresSkuList || [],
});
});
this.goodsCheck = arr;
this.checkPrice();
})
})
this.goodsCheck = arr
this.checkPrice()
},
},
};
}
</script>
<style lang="scss" scoped>
@ -878,7 +783,7 @@ export default {
font-size: 36rpx;
font-family: Source Han Sans CN;
font-weight: bold;
color: #fb3024;
color: #f82c1a;
}
.tit3 {
@ -929,7 +834,7 @@ export default {
width: 28rpx;
height: 28rpx;
line-height: 28rpx;
background: #fb3024;
background: #005bac;
box-shadow: 0rpx 3rpx 7rpx 0rpx rgba(0, 0, 0, 0.25);
border-radius: 50%;
text-align: center;
@ -961,7 +866,9 @@ export default {
.h1 {
font-size: 10px;
font-family: PingFang SC-Medium, PingFang SC;
font-family:
PingFang SC-Medium,
PingFang SC;
font-weight: 500;
color: #333333;
margin-right: 20rpx;
@ -971,7 +878,7 @@ export default {
font-size: 36rpx;
font-family: Source Han Sans CN;
font-weight: 400;
color: #fb3024;
color: #f82c1a;
margin-right: 20rpx;
}
@ -992,7 +899,7 @@ export default {
}
.deldel {
color: #fb3024;
color: #005bac;
margin-left: 20rpx;
}

View File

@ -1,121 +1,159 @@
<!--
* @Descripttion:
* @version:
* @Author: kBank
* @Date: 2022-11-21 15:11:22
-->
<template>
<view>
<u-tabbar :value="current?current:0"
v-if="user.skin==0"
@change="tabbarChange"
:fixed="true"
:placeholder="false"
:border="false"
:safeAreaInsetBottom="true"
inactiveColor="#666666"
activeColor="#333333">
<u-tabbar-item :text="$t('ENU_MENU_10')">
<image class="u-page__item__slot-icon"
slot="active-icon"
src="@/static/images/one1.png"></image>
<image class="u-page__item__slot-icon"
slot="inactive-icon"
src="@/static/images/one2.png"></image>
<u-tabbar
v-if="systemSkin === 0"
:value="current ? current : 0"
@change="tabbarChange"
:fixed="true"
:placeholder="false"
:border="false"
:safeAreaInsetBottom="true"
inactiveColor="#666666"
activeColor="#333333"
>
<u-tabbar-item :text="'首页'">
<image
class="u-page__item__slot-icon"
slot="active-icon"
src="@/static/images/one1.png"
></image>
<image
class="u-page__item__slot-icon"
slot="inactive-icon"
src="@/static/images/one2.png"
></image>
</u-tabbar-item>
<u-tabbar-item :text="$t('ENU_APPROVE_B_522')">
<image class="u-page__item__slot-icon"
slot="active-icon"
src="@/static/images/two1.png"></image>
<image class="u-page__item__slot-icon"
slot="inactive-icon"
src="@/static/images/two2.png"></image>
<u-tabbar-item :text="'会员专区'">
<image
class="u-page__item__slot-icon"
slot="active-icon"
src="@/static/images/five1.jpg"
></image>
<image
class="u-page__item__slot-icon"
slot="inactive-icon"
src="@/static/images/five2.jpg"
></image>
</u-tabbar-item>
<u-tabbar-item :text="$t('ENU_MENU_30')">
<image class="u-page__item__slot-icon"
slot="active-icon"
src="@/static/images/five1.jpg"></image>
<image class="u-page__item__slot-icon"
slot="inactive-icon"
src="@/static/images/five2.jpg"></image>
<u-tabbar-item :text="'个人推广'">
<image
class="u-page__item__slot-icon"
slot="active-icon"
src="@/static/images/share-act.svg"
></image>
<image
class="u-page__item__slot-icon"
slot="inactive-icon"
src="@/static/images/share.svg"
></image>
</u-tabbar-item>
<u-tabbar-item :text="$t('N_I_194')"
:badge="shopCarLength">
<image class="u-page__item__slot-icon"
slot="active-icon"
src="@/static/images/three1.png"></image>
<image class="u-page__item__slot-icon"
slot="inactive-icon"
src="@/static/images/three2.png"></image>
<u-tabbar-item :text="'购物车'" :badge="shopCarLength">
<image
class="u-page__item__slot-icon"
slot="active-icon"
src="@/static/images/three1.png"
></image>
<image
class="u-page__item__slot-icon"
slot="inactive-icon"
src="@/static/images/three2.png"
></image>
</u-tabbar-item>
<u-tabbar-item :text="$t('w_0350')">
<image class="u-page__item__slot-icon"
slot="active-icon"
src="@/static/images/fore1.png"></image>
<image class="u-page__item__slot-icon"
slot="inactive-icon"
src="@/static/images/fore2.png"></image>
<u-tabbar-item :text="'我的'">
<image
class="u-page__item__slot-icon"
slot="active-icon"
src="@/static/images/fore1.png"
></image>
<image
class="u-page__item__slot-icon"
slot="inactive-icon"
src="@/static/images/fore2.png"
></image>
</u-tabbar-item>
</u-tabbar>
<u-tabbar :value="current?current:0"
class="greenEd"
v-if="user.skin==2"
@change="tabbarChange"
:fixed="true"
:placeholder="false"
:border="false"
:safeAreaInsetBottom="true"
inactiveColor="#666666"
activeColor="#333333">
<u-tabbar-item :text="$t('ENU_MENU_10')">
<image class="u-page__item__slot-icon1"
slot="active-icon"
src="@/static/images/one11.jpg"></image>
<image class="u-page__item__slot-icon1"
slot="inactive-icon"
src="@/static/images/one11.jpg"></image>
<u-tabbar
:value="current ? current : 0"
class="greenEd"
v-if="systemSkin === 2"
@change="tabbarChange"
:fixed="true"
:placeholder="false"
:border="false"
:safeAreaInsetBottom="true"
inactiveColor="#666666"
activeColor="#333333"
>
<u-tabbar-item :text="'首页'">
<image
class="u-page__item__slot-icon1"
slot="active-icon"
src="@/static/images/one11.jpg"
></image>
<image
class="u-page__item__slot-icon1"
slot="inactive-icon"
src="@/static/images/one11.jpg"
></image>
</u-tabbar-item>
<u-tabbar-item :text="$t('ENU_APPROVE_B_522')">
<image class="u-page__item__slot-icon1"
slot="active-icon"
src="@/static/images/two11.jpg"></image>
<image class="u-page__item__slot-icon1"
slot="inactive-icon"
src="@/static/images/two11.jpg"></image>
<u-tabbar-item :text="'会员专区'">
<image
class="u-page__item__slot-icon2"
slot="active-icon"
src="@/static/images/five11.jpg"
></image>
<image
class="u-page__item__slot-icon2"
slot="inactive-icon"
src="@/static/images/five11.jpg"
></image>
</u-tabbar-item>
<u-tabbar-item :text="$t('ENU_MENU_30')">
<image class="u-page__item__slot-icon2"
slot="active-icon"
src="@/static/images/five11.jpg"></image>
<image class="u-page__item__slot-icon2"
slot="inactive-icon"
src="@/static/images/five11.jpg"></image>
<u-tabbar-item :text="'个人推广'">
<image
class="u-page__item__slot-icon1"
slot="active-icon"
src="@/static/images/share-act.svg"
></image>
<image
class="u-page__item__slot-icon1"
slot="inactive-icon"
src="@/static/images/share.svg"
></image>
</u-tabbar-item>
<u-tabbar-item :text="$t('N_I_194')"
:badge="shopCarLength">
<image class="u-page__item__slot-icon1"
slot="active-icon"
src="@/static/images/three11.jpg"></image>
<image class="u-page__item__slot-icon1"
slot="inactive-icon"
src="@/static/images/three11.jpg"></image>
<u-tabbar-item :text="'购物车'" :badge="shopCarLength">
<image
class="u-page__item__slot-icon1"
slot="active-icon"
src="@/static/images/three11.jpg"
></image>
<image
class="u-page__item__slot-icon1"
slot="inactive-icon"
src="@/static/images/three11.jpg"
></image>
</u-tabbar-item>
<u-tabbar-item :text="$t('w_0350')">
<image class="u-page__item__slot-icon1"
slot="active-icon"
src="@/static/images/fore11.jpg"></image>
<image class="u-page__item__slot-icon1"
slot="inactive-icon"
src="@/static/images/fore11.jpg"></image>
<u-tabbar-item :text="'我的'">
<image
class="u-page__item__slot-icon1"
slot="active-icon"
src="@/static/images/fore11.jpg"
></image>
<image
class="u-page__item__slot-icon1"
slot="inactive-icon"
src="@/static/images/fore11.jpg"
></image>
</u-tabbar-item>
</u-tabbar>
</view>
</template>
<script>
import { mapGetters } from "vuex";
import { mapGetters } from 'vuex'
export default {
props: {
current: Number,
@ -124,31 +162,35 @@ export default {
return {
list: [
{
text: this.$t('ENU_MENU_10'),
text: '首页',
path: 'pages/index/index',
},
{
text: this.$t('ENU_APPROVE_B_522'),
path: 'pages/email/index',
},
{
text: this.$t('ENU_MENU_30'),
text: '会员专区',
path: 'pages/specialArea/index',
},
{
text: this.$t('N_I_194'),
text: '个人推广',
path: 'pages/mine/share/index',
},
{
text: '购物车',
path: 'pages/shoppingCar/index',
},
{
text: this.$t('w_0350'),
text: '我的',
path: 'pages/mine/index',
},
],
}
},
computed: {
...mapGetters(['shopCarLength','user']),
...mapGetters(['shopCarLength', 'user']),
systemSkin() {
return this.user?.skin || 0
},
},
methods: {
tabbarChange(e) {
@ -165,25 +207,59 @@ export default {
width: 20px;
height: 20px;
}
.u-page__item__slot-icon1 {
width: 35px;
height: 35px;
// margin-bottom: 20px
}
.u-page__item__slot-icon2 {
width: 35px;
height: 35px;
// margin-bottom: 20px
}
.greenEd{
::v-deep .u-tabbar__content{
background: linear-gradient(to bottom, #fff, #b6fdda);
.greenEd {
::v-deep .u-tabbar__content {
background: linear-gradient(to bottom, #fff, #b6fdda);
}
::v-deep .u-tabbar__content__item-wrapper{
height: 80px
::v-deep .u-tabbar__content__item-wrapper {
height: 80px;
}
::v-deep .u-tabbar-item{
::v-deep .u-tabbar-item {
// margin-bottom: 30px;
}
}
/* iPhone安全区域适配 */
/* 绿色主题的安全区域适配 */
.greenEd {
::v-deep .u-tabbar__content {
background: linear-gradient(to bottom, #fff, #b6fdda);
/* 绿色主题的安全区域背景 */
&::after {
background: #b6fdda;
}
}
}
/* 针对不同屏幕尺寸的优化 */
@media screen and (max-height: 667px) {
/* iPhone SE等小屏设备 */
::v-deep .u-tabbar__content__item-wrapper {
height: 70px;
}
}
@media screen and (min-height: 812px) {
/* iPhone X及以上机型 */
::v-deep .u-tabbar__content__item-wrapper {
height: 80px;
}
}
</style>

View File

@ -94,9 +94,7 @@
userInfo: uni.getStorageSync('User'),
};
},
mounted() {
this.getDirectrank();
},
methods: {
closeTap() {
//
@ -104,23 +102,7 @@
this.$forceUpdate(); //
this.$emit("callznMethodTrigger");
},
getDirectrank() {
const currentDate = new Date();
this.themonth = currentDate.getMonth() + 1;
api.getMemberDirectpush().then((res) => {
if (res.code == 200) {
if (res.data &&res.data.length > 0) {
this.popupList = res.data;
let arr = res.data;
let newArr = arr.filter((item, index) => index >= 3); // 3
this.popupList2 = newArr;
this.noticeFlag = true;
} else {
this.$emit("callznMethodTrigger");
}
}
});
},
},
};
</script>
@ -238,9 +220,9 @@
}
.poupmain {
// background: yellow;
margin-top: 220rpx;
padding: 0 20rpx;
font-size: 26rpx;
.main_title {
@ -304,6 +286,6 @@
clip-path: polygon(50% 0%, 100% 38%, 82% 100%, 18% 100%, 0% 38%);
}
}
}
</style>
</style>

View File

@ -3,7 +3,7 @@
<div class="width-auto">
<view class="titleF">
<view class="title">
{{$t('N_I_105')}}
{{'活跃会员对比'}}
</view>
<picker :range="dateTypeList" :value="index" range-key="label" @change="bindPickerChange">
<view class="mClass">
@ -137,13 +137,13 @@ export default {
let option = {
title: {
text: "",
subtext: this.$t('N_I_106'),
subtext: '人数',
},
tooltip: {},
legend: {
top: "bottom",
bottom: '5%',
data: [this.$t('S_C_18'), this.$t('S_C_19')],
data: ['左区', '右区'],
},
xAxis: {
data: arr1,
@ -170,7 +170,7 @@ export default {
},
series: [
{
name: this.$t('S_C_18'),
name: '左区',
type: "bar",
data: arr2,
itemStyle: {
@ -182,7 +182,7 @@ export default {
barWidth: "18px",
},
{
name: this.$t('S_C_19'),
name: '右区',
type: "bar",
data: arr3,
itemStyle: {

View File

@ -1,9 +1,4 @@
<!--
* @Descripttion:
* @version:
* @Author: 王三华
* @Date: 2023-05-18 14:42:53
-->
<template>
<view class="main">
<view class="search-content">
@ -11,7 +6,7 @@
<view v-for="item in dataList" class="search-view">
<view class="flex_s">
<view class="data-left">
{{$t('MN_T_1')}}
{{'会员编号'}}
</view>
<view class="data-right">
{{item.memberCode}}
@ -19,7 +14,7 @@
</view>
<view class="flex_s">
<view class="data-left">
{{$t('CK_KS_14')}}
{{'会员姓名'}}
</view>
<view class="data-right">
{{item.memberName}}
@ -27,7 +22,7 @@
</view>
<view class="flex_s">
<view class="data-left">
{{$t('PER_DA_5')}}
{{'注册等级'}}
</view>
<view class="data-right">
{{item.pkRegisterGradeStr}}
@ -35,7 +30,7 @@
</view>
<view class="flex_s">
<view class="data-left">
{{$t('w_0141')}}
{{'注册日期'}}
</view>
<view class="data-right">
{{item.creationTime}}
@ -43,7 +38,7 @@
</view>
<view class="flex_s">
<view class="data-left">
{{$t('N_I_103')}}
{{'累计业绩'}}
</view>
<view class="data-right">
{{item.consumeMoney | numberToCurrency}}
@ -145,13 +140,13 @@ export default {
color: #fff;
font-size: 28rpx;
text-align: center;
background: #FB3024;
background: #005BAC;
margin: 30rpx 0 0 0;
float: right;
border-radius: 24rpx;
}
.type{
color: #FB3024 !important;
color: #005BAC !important;
}
.flex_s{
width: 100%;
@ -193,7 +188,7 @@ export default {
.search-icons{
width: 47rpx;
height: 47rpx;
background: #FB3024;
background: #005BAC;
border-radius: 50%;
margin-left: 20rpx;
display: flex;

View File

@ -1,13 +1,8 @@
<!--
* @Descripttion:
* @version:
* @Author: 王三华
* @Date: 2023-07-21 15:20:16
-->
<template>
<div class="width-auto">
<view class="title">
{{$t('w_1041')}}
{{'业绩分布'}}
</view>
<div class="flex-s">
<div
@ -33,13 +28,13 @@ export default {
{
value: 0,
age: 0,
name: this.$t('S_C_18'),
name: '左区',
itemStyle: { color: '#EE5858' },
},
{
value: 0,
age: 0,
name: this.$t('S_C_19'),
name: '右区',
itemStyle: { color: '#FBB046' },
},
],

View File

@ -1,19 +1,8 @@
<!--
* @Descripttion:
* @version:
* @Author: 王三华
* @Date: 2023-07-21 14:59:53
-->
<!--
* @Descripttion:
* @version:
* @Author: 王三华
* @Date: 2023-05-15 14:38:28
-->
<template>
<div class="width-auto">
<view class="title">
{{$t('S_C_71')}}
{{'新增业绩'}}
</view>
<div class="flex-s">
<div
@ -69,14 +58,14 @@ export default {
let option = {
title: {
text: '',
subtext: this.$t('w_0339'),
subtext: '业绩(万)',
},
tooltip: {
trigger: 'axis',
},
legend: {
top: 'bottom',
data: [this.$t('S_C_18'), this.$t('S_C_19')],
data: ['左区', '右区'],
itemWidth: 20, //
itemHeight: 10, //
},
@ -105,7 +94,7 @@ export default {
},
series: [
{
name: this.$t('S_C_18'),
name: '左区',
type: 'line',
data: arr2,
symbol: 'none',
@ -121,7 +110,7 @@ export default {
},
},
{
name: this.$t('S_C_19'),
name: '右区',
type: 'line',
data: arr3,
symbol: 'none',

View File

@ -1,6 +1,6 @@
<template>
<div class="width-auto">
<div class="title">{{$t('N_I_123')}}</div>
<div class="title">{{'等级业绩'}}</div>
<div class="left-s">
<div id="mounthData3" :style="myChartStyle">

View File

@ -1,295 +1,293 @@
<template>
<view class="main">
<view class="search-content">
<view class="search-list">
<view v-for="item in dataList" class="search-view">
<view class="flex_s">
<view class="data-left">
{{$t('MN_T_1')}}
</view>
<view class="data-right">
{{item.memberCode}}
</view>
</view>
<view class="flex_s">
<view class="data-left">
{{$t('CK_KS_14')}}
</view>
<view class="data-right">
{{item.memberName}}
</view>
</view>
<view class="flex_s">
<view class="data-left">
{{$t('MN_F_T_1090')}}
</view>
<view class="data-right">
{{item.orderAmount| numberToCurrency}}
</view>
</view>
<view class="flex_s">
<view class="data-left">
{{$t('w_0306')}}(PV)
</view>
<view class="data-right">
{{item.orderAchieve| numberToCurrency}}
</view>
</view>
<view class="flex_s">
<view class="data-left">
{{$t('PER_DA_5')}}
</view>
<view class="data-right">
{{item.pkRegisterGradeVal}}
</view>
</view>
<view class="flex_s">
<view class="data-left">
{{$t('MY_ORD_15')}}
</view>
<view class="data-right">
{{item.creationTime}}
</view>
</view>
<view class="main">
<view class="search-content">
<view class="search-list">
<view v-for="item in dataList" class="search-view">
<view class="flex_s">
<view class="data-left">
{{ '会员编号' }}
</view>
<view class="data-right">
{{ item.memberCode }}
</view>
</view>
<view class="flex_s">
<view class="data-left">
{{ '会员姓名' }}
</view>
<view class="data-right">
{{ item.memberName }}
</view>
</view>
<view class="flex_s">
<view class="data-left">
{{ '消费金额' }}
</view>
<view class="data-right">
{{ item.orderAmount | numberToCurrency }}
</view>
</view>
<view class="flex_s">
<view class="data-left">
{{ '消费业绩' }}
</view>
<view class="data-right">
{{ item.orderAchieve | numberToCurrency }}
</view>
</view>
<view class="flex_s">
<view class="data-left">
{{ '注册等级' }}
</view>
<view class="data-right">
{{ item.pkRegisterGradeVal }}
</view>
</view>
<view class="flex_s">
<view class="data-left">
{{ '创建时间' }}
</view>
<view class="data-right">
{{ item.creationTime }}
</view>
</view>
<view style="clear: both;"></view>
<view style="height: 20rpx;background-color: #fff;"></view>
</view>
</view>
</view>
</view>
<view style="clear: both"></view>
<view style="height: 20rpx; background-color: #fff"></view>
</view>
</view>
</view>
</view>
</template>
<script>
import * as api from '@/config/distribute.js'
import {
setToken
} from '@/config/auth.js'
import store from '@/store'
export default {
data() {
return {
dataList: [],
page: {
pageNum: 1,
pageSize: 50
}
}
},
props: {
placeDept: {
type: String,
default: "0",
},
},
onLoad() {
},
created() {
this.getDataList()
},
methods: {
getDataList(num) {
this.page.placeDept = this.placeDept
this.page.pageNum = num || 1
api.getAchieveDetails(this.page).then(res => {
this.dataList = res.rows
}).catch(error => {
reject(error)
})
},
},
}
import * as api from '@/config/distribute.js'
import { setToken } from '@/config/auth.js'
import store from '@/store'
export default {
data() {
return {
dataList: [],
page: {
pageNum: 1,
pageSize: 50,
},
}
},
props: {
placeDept: {
type: String,
default: '0',
},
},
onLoad() {},
created() {
this.getDataList()
},
methods: {
getDataList(num) {
this.page.placeDept = this.placeDept
this.page.pageNum = num || 1
api
.getAchieveDetails(this.page)
.then(res => {
this.dataList = res.rows
})
.catch(error => {
reject(error)
})
},
},
}
</script>
<style>
.border_s {
border-bottom: 1rpx solid #eee;
height: 10rpx;
}
.border_s {
border-bottom: 1rpx solid #eee;
height: 10rpx;
}
.button {
padding: 0 30rpx;
/* width: 150rpx; */
height: 52rpx;
line-height: 52rpx;
color: #fff;
font-size: 28rpx;
text-align: center;
background: #FB3024;
margin: 30rpx 0 0 0;
float: right;
border-radius: 24rpx;
}
.button {
padding: 0 30rpx;
/* width: 150rpx; */
height: 52rpx;
line-height: 52rpx;
color: #fff;
font-size: 28rpx;
text-align: center;
background: #005bac;
margin: 30rpx 0 0 0;
float: right;
border-radius: 24rpx;
}
.type {
color: #FB3024 !important;
}
.type {
color: #005bac !important;
}
.flex_s {
width: 100%;
display: flex;
justify-content: space-between;
padding-bottom: 15rpx;
}
.flex_s {
width: 100%;
display: flex;
justify-content: space-between;
padding-bottom: 15rpx;
}
.data-left {
color: #999;
font-size: 26rpx;
}
.data-left {
color: #999;
font-size: 26rpx;
}
.data-right {
color: #333;
font-size: 26rpx;
}
.data-right {
color: #333;
font-size: 26rpx;
}
.search-view {
/* display: flex; */
/* justify-content: space-between; */
padding: 30rpx 20rpx 0 20rpx;
border-bottom: 20rpx solid #eee;
/* border-bottom: 1px solid #eee; */
margin: 0;
}
.search-view {
/* display: flex; */
/* justify-content: space-between; */
padding: 30rpx 20rpx 0 20rpx;
border-bottom: 20rpx solid #eee;
/* border-bottom: 1px solid #eee; */
margin: 0;
}
.search-list {
margin-bottom: 25rpx;
background-color: #fff;
}
.search-list {
margin-bottom: 25rpx;
background-color: #fff;
}
.search-content {
margin-top: 25rpx;
}
.search-content {
margin-top: 25rpx;
}
.text_s {
color: #333;
font-size: 26rpx;
}
.text_s {
color: #333;
font-size: 26rpx;
}
.search-icon-s {
width: 22rpx;
height: 22rpx;
}
.search-icon-s {
width: 22rpx;
height: 22rpx;
}
.search-icons {
width: 47rpx;
height: 47rpx;
background: #FB3024;
border-radius: 50%;
margin-left: 20rpx;
display: flex;
justify-content: center;
align-items: center;
margin: 30rpx 20rpx 0 0;
}
.search-icons {
width: 47rpx;
height: 47rpx;
background: #005bac;
border-radius: 50%;
margin-left: 20rpx;
display: flex;
justify-content: center;
align-items: center;
margin: 30rpx 20rpx 0 0;
}
.time1 {
width: 158rpx;
height: 75rpx;
border-bottom: 1rpx solid #eee;
margin: 0 50rpx 30rpx 50rpx;
color: #999;
text-align: center;
font-size: 24rpx;
/* margin-bottom: 30rpx; */
}
.time1 {
width: 158rpx;
height: 75rpx;
border-bottom: 1rpx solid #eee;
margin: 0 50rpx 30rpx 50rpx;
color: #999;
text-align: center;
font-size: 24rpx;
/* margin-bottom: 30rpx; */
}
.time-text {
color: #999;
font-size: 26rpx;
}
.time-text {
color: #999;
font-size: 26rpx;
}
.search-bottom {
height: 100rpx;
line-height: 100rpx;
display: flex;
margin-left: 20rpx;
}
.search-bottom {
height: 100rpx;
line-height: 100rpx;
display: flex;
margin-left: 20rpx;
}
.texts {
color: #333;
font-size: 26rpx;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
/* width:200rpx; */
text-align: right;
}
.texts {
color: #333;
font-size: 26rpx;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
/* width:200rpx; */
text-align: right;
}
.select-text {
display: flex;
margin-right: 20rpx;
font-size: 26rpx;
color: #333;
position: relative;
}
.select-text {
display: flex;
margin-right: 20rpx;
font-size: 26rpx;
color: #333;
position: relative;
}
.selIcon {
width: 20rpx;
height: 20rpx;
margin-top: 10rpx;
margin-left: 5rpx;
}
.selIcon {
width: 20rpx;
height: 20rpx;
margin-top: 10rpx;
margin-left: 5rpx;
}
.text-s {
font-size: 26rpx;
color: #999;
margin-right: 10rpx;
}
.text-s {
font-size: 26rpx;
color: #999;
margin-right: 10rpx;
}
.place {
font-size: 26rpx;
color: #999;
}
.place {
font-size: 26rpx;
color: #999;
}
.border-colors {
border: none;
font-size: 26rpx;
color: #333;
margin-left: 30rpx;
}
.border-colors {
border: none;
font-size: 26rpx;
color: #333;
margin-left: 30rpx;
}
page {
background-color: #f2f2f2;
}
page {
background-color: #f2f2f2;
}
.search-icon {
width: 25rpx;
height: 25rpx;
position: absolute;
left: 30rpx;
top: 12rpx;
.search-icon {
width: 25rpx;
height: 25rpx;
position: absolute;
left: 30rpx;
top: 12rpx;
image {}
}
image {
}
}
.search-bg {}
.search-bg {
}
.top {
/* height: 200rpx; */
background-color: #fff;
padding: 20rpx 0 20rpx 0;
}
.top {
/* height: 200rpx; */
background-color: #fff;
padding: 20rpx 0 20rpx 0;
}
.search-tops {
display: flex;
justify-content: space-between;
height: 65rpx;
line-height: 65rpx;
padding-bottom: 40rpx;
border-bottom: 1px solid #eee;
}
.search-tops {
display: flex;
justify-content: space-between;
height: 65rpx;
line-height: 65rpx;
padding-bottom: 40rpx;
border-bottom: 1px solid #eee;
}
.search-bg {
width: 432rpx;
height: 35rpx;
background: #F5F6F8;
border-radius: 33rpx;
display: flex;
position: relative;
padding: 20rpx 50rpx;
margin-left: 20rpx;
}
</style>
.search-bg {
width: 432rpx;
height: 35rpx;
background: #f5f6f8;
border-radius: 33rpx;
display: flex;
position: relative;
padding: 20rpx 50rpx;
margin-left: 20rpx;
}
</style>

View File

@ -1,20 +1,9 @@
<!--
* @Descripttion:
* @version:
* @Author: 王三华
* @Date: 2023-07-24 17:44:22
-->
<!--
* @Descripttion:
* @version:
* @Author: 王三华
* @Date: 2023-05-15 14:38:28
-->
<template>
<div class="width-auto">
<view class="titleF">
<view class="title">
{{$t('w_0145')}}
{{'月度新增业绩对比'}}
</view>
<picker :range="selMounthList" :value="index" range-key="label" @change="bindPickerChange">
<view class="mClass">
@ -152,13 +141,13 @@ export default {
let option = {
title: {
text: '',
subtext: this.$t('w_0339'),
subtext: '业绩(万)',
},
tooltip: {},
legend: {
top: 'bottom',
bottom: '5%',
data: [this.$t('S_C_18'), this.$t('S_C_19')],
data: ['左区', '右区'],
},
xAxis: {
data: arr1,
@ -175,7 +164,7 @@ export default {
},
},
series: [{
name: this.$t('S_C_18'),
name: '左区',
type: 'bar',
data: arr2,
itemStyle: {
@ -186,7 +175,7 @@ export default {
},
},
{
name: this.$t('S_C_19'),
name: '右区',
type: 'bar',
data: arr3,
itemStyle: {

View File

@ -1,300 +1,307 @@
<template>
<view class="width-auto">
<view class="flexs">
<view class="select-flexs">
<picker :range="selYearList" :value="index" range-key="label" @change="changeYear">
<view style="display: flex; align-items: center;justify-content: space-between;">
<view style="margin-right:40rpx;">{{whatYear}}</view>
<u-icon name="arrow-down" color="#999"></u-icon>
</view>
</picker>
</view>
<view class="select-flexs">
<picker :range="selMounthList" :value="index" range-key="label" @change="bindPickerChange">
<view style="display: flex; align-items: center;justify-content: space-between;">
<view style="margin-right:40rpx;">{{whatMounth}}</view>
<u-icon name="arrow-down" color="#999"></u-icon>
</view>
</picker>
</view>
<view class="select-flexs" style="margin-left: 20rpx;" @click="showType=true">
<view class="width-auto">
<view class="flexs">
<view class="select-flexs">
<picker
:range="selYearList"
:value="index"
range-key="label"
@change="changeYear"
>
<view
style="
display: flex;
align-items: center;
justify-content: space-between;
"
>
<view style="margin-right: 40rpx">{{ whatYear }}</view>
<u-icon name="arrow-down" color="#999"></u-icon>
</view>
</picker>
</view>
<view class="select-flexs">
<picker
:range="selMounthList"
:value="index"
range-key="label"
@change="bindPickerChange"
>
<view
style="
display: flex;
align-items: center;
justify-content: space-between;
"
>
<view style="margin-right: 40rpx">{{ whatMounth }}</view>
<u-icon name="arrow-down" color="#999"></u-icon>
</view>
</picker>
</view>
<!-- <view class="select-flexs" style="margin-left: 20rpx;" @click="showType=true">
<view style="display: flex; align-items: center;justify-content: space-between;">
<view style="margin-right:40rpx;">{{yjName}}</view>
<u-icon name="arrow-down" color="#999"></u-icon>
</view>
<!-- <picker :range="yjTypeList" :value="index2" range-key="label" @confirm="bindType"></picker> -->
<u-picker @cancel='showType=false' :show="showType" ref="uPicker" :columns="yjTypeList"
@confirm="bindType" keyName='label'></u-picker>
</view>
<!-- <view class="title">
</view> -->
<!-- <view class="title">
导出明细
</view> -->
</view>
<view class="listrefor bg2">
</view>
<view class="listrefor bg2">
<view class="flex_item">
<view class="text1">左区业绩</view>
<view class="text2">{{ achieveData.leftAchieve || 0 }}</view>
</view>
<view class="flex_item" style="cursor: pointer" @click="goDetail(1)">
<view class="text1">左区血缘业绩</view>
<view class="text2">{{ achieveData.leftDirectAchieve || 0 }}</view>
</view>
<view class="flex_item">
<view class="text1">左区人数</view>
<view class="text2">{{ achieveData.leftCoun || 0 }}</view>
</view>
</view>
<view class="flex_item">
<view class="text1">{{$t('w_0135')}}</view>
<view class="text2">{{ achieveData.leftAchieve || 0 }}</view>
</view>
<view class="flex_item" style="cursor: pointer;" @click="goDetail(1)">
<view class="text1">{{$t('S_C_18')}}{{$t('w_0136')}}</view>
<view class="text2">{{ achieveData.leftDirectAchieve || 0 }}</view>
</view>
<view class="flex_item">
<view class="text1">{{$t('N_I_88')}}</view>
<view class="text2">{{ achieveData.leftCoun || 0 }}</view>
</view>
</view>
<view class="listrefor bg3">
<view>
<view class="text1">{{$t('w_0136')}}</view>
<view class="text2">{{ achieveData.directAchieve || 0 }}</view>
</view>
</view>
<view class="listrefor bg2">
<view class="flex_item">
<view class="text1">{{$t('w_0137')}}</view>
<view class="text2">{{ achieveData.rightAchieve || 0 }}</view>
</view>
<view class="flex_item" style="cursor: pointer;" @click="goDetail(2)">
<view class="text1">{{$t('S_C_19')}}{{$t('w_0136')}}</view>
<view class="text2">{{ achieveData.rightDirectAchieve || 0 }}</view>
</view>
<view class="flex_item">
<view class="text1">{{$t('N_I_92')}}</view>
<view class="text2">{{ achieveData.rightCount || 0 }}</view>
</view>
</view>
</view>
<view class="listrefor bg3">
<view>
<view class="text1">血缘业绩</view>
<view class="text2">{{ achieveData.directAchieve || 0 }}</view>
</view>
</view>
<view class="listrefor bg2">
<view class="flex_item">
<view class="text1">右区业绩</view>
<view class="text2">{{ achieveData.rightAchieve || 0 }}</view>
</view>
<view class="flex_item" style="cursor: pointer" @click="goDetail(2)">
<view class="text1">右区血缘业绩</view>
<view class="text2">{{ achieveData.rightDirectAchieve || 0 }}</view>
</view>
<view class="flex_item">
<view class="text1">右区人数</view>
<view class="text2">{{ achieveData.rightCount || 0 }}</view>
</view>
</view>
</view>
</template>
<script>
import {
getPlaceNewAddAchieve,
getYjList
} from "@/config/distribute.js";
export default {
data() {
return {
index: 0,
show: false,
achieveData: {},
import { getPlaceNewAddAchieve, getYjList } from '@/config/distribute.js'
export default {
data() {
return {
index: 0,
show: false,
achieveData: {},
whatMounth: '',
yjType: 1,
yjName: "全部",
showType: false,
selMounthList: [],
yjTypeList: [],
yearShow:false,
whatYear:"",
selYearList:[{
value: 0,
label: new Date().getFullYear()-1,
},{
value: 1,
label: new Date().getFullYear(),
}],
mounthList: [{
value: 1,
label: 1 + this.$t("ENU_SETTLE_P_3"),
},
{
value: 2,
label: 2 + this.$t("ENU_SETTLE_P_3"),
},
{
value: 3,
label: 3 + this.$t("ENU_SETTLE_P_3"),
},
{
value: 4,
label: 4 + this.$t("ENU_SETTLE_P_3"),
},
{
value: 5,
label: 5 + this.$t("ENU_SETTLE_P_3"),
},
{
value: 6,
label: 6 + this.$t("ENU_SETTLE_P_3"),
},
{
value: 7,
label: 7 + this.$t("ENU_SETTLE_P_3"),
},
{
value: 8,
label: 8 + this.$t("ENU_SETTLE_P_3"),
},
{
value: 9,
label: 9 + this.$t("ENU_SETTLE_P_3"),
},
{
value: 10,
label: 10 + this.$t("ENU_SETTLE_P_3"),
},
{
value: 11,
label: 11 + this.$t("ENU_SETTLE_P_3"),
},
{
value: 12,
label: 12 + this.$t("ENU_SETTLE_P_3")
},
],
}
},
created() {
this.getMounth()
this.getYjList()
setTimeout(() => {
this.getPlaceNewAddAchieve()
}, 50)
},
methods: {
goDetail(index) {
uni.navigateTo({
url:'/pages/performanceEchart/index?ifDetail='+index
})
},
getYjList() {
getYjList().then(res => {
this.yjTypeList = [res.data]
})
},
changeYear(e){
this.whatYear = this.selYearList[e.detail.value].label
this.getPlaceNewAddAchieve()
},
bindPickerChange(e) {
this.whatMounth = e.detail.value + 1
this.getPlaceNewAddAchieve()
},
bindType(e) {
this.yjType = e.value[0].value
this.yjName = e.value[0].label
this.showType = false
this.getPlaceNewAddAchieve()
},
// /
getMounth() {
this.whatMounth = new Date().getMonth() + 1
let selMounth = []
this.mounthList.forEach((item) => {
// if (item.value <= this.whatMounth) {
// selMounth.push(item)
// }
selMounth.push(item)
})
this.selMounthList = selMounth
this.whatYear = new Date().getFullYear()
},
getPlaceNewAddAchieve() {
getPlaceNewAddAchieve({
monthType: this.whatMounth,
achievementType: this.yjType,
year:this.whatYear
}).then((res) => {
this.achieveData = res.data;
});
}
},
}
whatMounth: '',
yjType: 1,
yjName: '全部',
showType: false,
selMounthList: [],
yjTypeList: [],
yearShow: false,
whatYear: '',
selYearList: [
{
value: 0,
label: new Date().getFullYear() - 1,
},
{
value: 1,
label: new Date().getFullYear(),
},
],
mounthList: [
{
value: 1,
label: 1 + '月',
},
{
value: 2,
label: 2 + '月',
},
{
value: 3,
label: 3 + '月',
},
{
value: 4,
label: 4 + '月',
},
{
value: 5,
label: 5 + '月',
},
{
value: 6,
label: 6 + '月',
},
{
value: 7,
label: 7 + '月',
},
{
value: 8,
label: 8 + '月',
},
{
value: 9,
label: 9 + '月',
},
{
value: 10,
label: 10 + '月',
},
{
value: 11,
label: 11 + '月',
},
{
value: 12,
label: 12 + '月',
},
],
}
},
created() {
this.getMounth()
this.getYjList()
setTimeout(() => {
this.getPlaceNewAddAchieve()
}, 50)
},
methods: {
goDetail(index) {
uni.navigateTo({
url: '/pages/performanceEchart/index?ifDetail=' + index,
})
},
getYjList() {
getYjList().then(res => {
this.yjTypeList = [res.data]
})
},
changeYear(e) {
this.whatYear = this.selYearList[e.detail.value].label
this.getPlaceNewAddAchieve()
},
bindPickerChange(e) {
this.whatMounth = e.detail.value + 1
this.getPlaceNewAddAchieve()
},
bindType(e) {
this.yjType = e.value[0].value
this.yjName = e.value[0].label
this.showType = false
this.getPlaceNewAddAchieve()
},
// /
getMounth() {
this.whatMounth = new Date().getMonth() + 1
let selMounth = []
this.mounthList.forEach(item => {
// if (item.value <= this.whatMounth) {
// selMounth.push(item)
// }
selMounth.push(item)
})
this.selMounthList = selMounth
this.whatYear = new Date().getFullYear()
},
getPlaceNewAddAchieve() {
getPlaceNewAddAchieve({
monthType: this.whatMounth,
achievementType: this.yjType,
year: this.whatYear,
}).then(res => {
this.achieveData = res.data
})
},
},
}
</script>
<style lang="scss" scoped>
::v-deep .uni-picker {
width: 100%;
}
::v-deep .uni-picker {
width: 100%;
}
.select-flexs {
.select-flexs {
border: 1rpx solid #eeeeee;
border-radius: 15rpx;
// width: 232rpx;
padding: 20rpx 19rpx;
display: flex;
align-items: center;
justify-content: space-between;
}
border: 1rpx solid #EEEEEE;
border-radius: 15rpx;
// width: 232rpx;
padding: 20rpx 19rpx;
display: flex;
align-items: center;
justify-content: space-between;
}
.flexs {
display: flex;
// justify-content: space-between;
border-radius: 30rpx 30rpx 0 0;
background-color: #fff;
}
.flexs {
display: flex;
// justify-content: space-between;
border-radius: 30rpx 30rpx 0 0;
background-color: #fff;
}
.title {
padding: 10rpx 0;
margin-top: 10rpx;
}
.title {
padding: 10rpx 0;
margin-top: 10rpx;
}
.width-auto {
background-color: #fff;
padding: 0 22rpx;
width: 690rpx;
margin: 0 auto;
padding-bottom: 20rpx;
}
.width-auto {
background-color: #fff;
padding: 0 22rpx;
width: 690rpx;
margin: 0 auto;
padding-bottom: 20rpx;
}
.listrefor {
color: #ffffff;
border-radius: 10rpx;
padding: 32rpx 21rpx;
margin-top: 25rpx;
display: flex;
justify-content: space-between;
.listrefor {
color: #FFFFFF;
border-radius: 10rpx;
padding: 32rpx 21rpx;
margin-top: 25rpx;
display: flex;
justify-content: space-between;
.flex_item:nth-child(1) {
width: 40%;
}
.flex_item:nth-child(1) {
width: 40%;
}
.flex_item:nth-child(2) {
width: 35%;
}
.flex_item:nth-child(2) {
width: 35%;
}
.flex_item:nth-child(3) {
width: 25%;
}
.flex_item:nth-child(3) {
width: 25%;
}
.text1 {
font-size: 28rpx;
}
.text1 {
font-size: 28rpx;
}
.text2 {
font-size: 30rpx;
font-weight: bold;
margin-top: 30rpx;
}
}
.text2 {
font-size: 30rpx;
font-weight: bold;
margin-top: 30rpx;
}
}
.bg1 {
background: linear-gradient(180deg, #fc7c7c 0%, #f65757 100%);
}
.bg1 {
background: linear-gradient(180deg, #FC7C7C 0%, #F65757 100%);
}
.bg2 {
background: linear-gradient(180deg, #ff9354 0%, #ff7f36 100%);
}
.bg2 {
background: linear-gradient(180deg, #FF9354 0%, #FF7F36 100%);
}
.bg3 {
background: linear-gradient(180deg, #677AF9 0%, #697BF2 100%);
}
</style>
.bg3 {
background: linear-gradient(180deg, #677af9 0%, #697bf2 100%);
}
</style>

View File

@ -1,7 +1,7 @@
<template>
<view class="width-auto" style="position: relative">
<view class="title">
{{$t('ENU_MENU_512')}}
{{'安置图'}}
</view>
<!-- <view class="right-lines">
<scroll-view class="left_scrol_style" scroll-x="false" scroll-y="true">
@ -22,19 +22,19 @@
<view class="mouseOvers" v-if="check1">
<view class="name-s" style="display: flex;align-items: center;">
<view>
{{$t('MN_T_1')}}{{userInfo.memberCode}}
{{'会员编号'}}{{userInfo.memberCode}}
</view>
<u-button size="mini" style="padding: 0;width: 0;"
@click="copy(userInfo.memberCode)">{{ $t("MY_CK_27")}}</u-button>
@click="copy(userInfo.memberCode)">{{ '复制'}}</u-button>
</view>
<view class="name-s">{{$t('CK_KS_14')}}{{userInfo.memberName}}
<view class="name-s">{{'会员姓名'}}{{userInfo.memberName}}
<view></view>
</view>
<view class="name-s">{{$t('PER_DA_9')}}{{userInfo.payTime.substring(0,10)}}
<view class="name-s">{{'创建日期'}}{{userInfo.payTime.substring(0,10)}}
<view></view>
</view>
<view class="name-s" style="margin-bottom: 10px">
{{$t('w_0306')}}{{userInfo.consumeAchieve | numFilter}}
{{'消费业绩'}}{{userInfo.consumeAchieve | numFilter}}
<view></view>
</view>
</view>
@ -52,22 +52,22 @@
<view class="mouseOvers" v-if="check2">
<view class="name-s" style="display: flex;align-items: center;">
<view>
{{$t('MN_T_1')}}{{userInfo1.memberCode}}
{{'会员编号'}}{{userInfo1.memberCode}}
</view>
<u-button size="mini" style="padding: 0;width: 0;"
@click="copy(userInfo1.memberCode)">{{ $t("MY_CK_27")}}</u-button>
@click="copy(userInfo1.memberCode)">{{ '复制'}}</u-button>
</view>
<view class="name-s">{{$t('CK_KS_14')}}{{userInfo1.memberName}}</view>
<view class="name-s">{{$t('PER_DA_9')}}{{userInfo1.payTime.substring(0,10)}}</view>
<view class="name-s">{{'会员姓名'}}{{userInfo1.memberName}}</view>
<view class="name-s">{{'创建日期'}}{{userInfo1.payTime.substring(0,10)}}</view>
<view class="name-s" style="margin-bottom: 10px">
{{$t('w_0306')}}{{userInfo1.consumeAchieve | numFilter}}</view>
{{'消费业绩'}}{{userInfo1.consumeAchieve | numFilter}}</view>
</view>
<view class="border-color">
<image class="theimg" src="../../static/images/avatar.png" mode=""></image>
<!-- <img :src="this.myChart.leftMember.lastImageUrl ||''"> -->
</view>
<view class="code">{{this.myChart.leftMember.lastMemberCode}}</view>
<view class="code">{{$t('N_I_101')}}</view>
<view class="code">{{'最末安置'}}</view>
<view class="code" style="font-size: 28rpx">左区</view>
</view>
</view>
@ -76,23 +76,23 @@
<view class="mouseOvers" v-if="check3" style="margin-left: -260rpx">
<view class="name-s" style="display: flex;align-items: center;">
<view>
{{$t('MN_T_1')}}{{userInfo2.memberCode}}
{{'会员编号'}}{{userInfo2.memberCode}}
</view>
<u-button size="mini" style="padding: 0;width: 0;"
@click="copy(userInfo2.memberCode)">{{ $t("MY_CK_27")}}</u-button>
@click="copy(userInfo2.memberCode)">{{ '复制'}}</u-button>
</view>
<view class="name-s">{{$t('CK_KS_14')}}{{userInfo2.memberName}}</view>
<view class="name-s">{{$t('PER_DA_9')}}{{userInfo2.payTime.substring(0,10)}}</view>
<view class="name-s">{{'会员姓名'}}{{userInfo2.memberName}}</view>
<view class="name-s">{{'创建日期'}}{{userInfo2.payTime.substring(0,10)}}</view>
<view class="name-s" style="margin-bottom: 10px">
{{$t('w_0306')}}{{userInfo2.consumeAchieve | numFilter}}</view>
{{'消费业绩'}}{{userInfo2.consumeAchieve | numFilter}}</view>
</view>
<view class="border-color" v-if="this.myChart.rightMember">
<image class="theimg" src="../../static/images/avatar.png" mode=""></image>
<!-- <img :src="this.myChart.rightMember.lastImageUrl"> -->
</view>
<view class="code">{{this.myChart.rightMember.lastMemberCode}}</view>
<view class="code">{{$t('N_I_101')}}</view>
<view class="code" style="font-size: 28rpx">{{$t('S_C_19')}}</view>
<view class="code">{{'最末安置'}}</view>
<view class="code" style="font-size: 28rpx">{{'右区'}}</view>
</view>
</view>
</view>

View File

@ -1,7 +1,7 @@
<template>
<div class="width-auto">
<view class="title">
{{$t('APP_ADD_20')}}
{{'奖衔业绩分布'}}
<!-- 奖衔业绩分布 -->
</view>
<div class="flex-s">
@ -28,13 +28,13 @@ export default {
{
value: 0,
age: 0,
name: this.$t('S_C_18'),
name: '左区',
itemStyle: { color: "#EE5858" },
},
{
value: 0,
age: 0,
name: this.$t('S_C_19'),
name: '右区',
itemStyle: { color: "#FBB046" },
},
],

View File

@ -1,176 +0,0 @@
<template>
<div class="width-auto">
<view class="title">
{{$t('N_I_115')}}
</view>
<div class="flex-s">
<div id="main22" style="width: 690rpx;height: 600rpx;" :style="myChartStyle"></div>
</div>
</div>
</template>
<script>
import * as echarts from "echarts";
import { realPerformancePic } from "@/config/distribute.js";
export default {
name: "recommendTime",
data(){
return{
texts:'',
pieData: [
{
value: 0,
age: 0,
name: this.$t('S_C_18'),
itemStyle: {color:'#EE5858'},
},
{
value: 0,
age: 0,
name: this.$t('S_C_19'),
itemStyle: {color:'#FBB046'},
},
],
myChartStyle: {
float: "center",
width: "690rpx",
height: "750rpx",
paddingTop: "0",
// margin: "20px",
}, //
}
},
created() {
this.getData()
},
methods:{
getData() {
realPerformancePic().then((res)=>{
this.pieData[1].value = res.data.rightAchievement
this.pieData[0].value = res.data.leftAchievement
this.pieData[1].age = res.data.rightNumber
this.pieData[0].age = res.data.leftNumber
setTimeout(()=>{
this.ageChart(res.data);
},50)
})
},
ageChart(datas) {
let that =this
var myChart = echarts.init(document.getElementById('main22'));
var option = {
legend: {
//
// right: "0%",
left: '33%',
bottom: '0',
color: '#999',
// orient: "vertical",
},
series: [
{
type: "pie",
label: {
show: true,
lineHeight:16,//
normal: {
borderWidth:2,
formatter: function (data) {
return (
data.data.name +
":" +
data.data.age +
that.$t('w_0337') +
"\n" +
"\n" +
that.$t('ENU_TOTAL_V_1') + ':' +
data.data.value +
that.$t('S_C_58')
);
},
color: "#fff",
position:'inside' //'top''right' 'inside'|'left'|'right'|'top'|'bottom'
}
},
radius: "70%", //
data: that.pieData
},
]
}
myChart.setOption(option);
},
}
}
</script>
<style scoped lang="scss">
.width-auto{
width: 100%;
position: relative;
height:950rpx;
background-color: #fff;
width: 690rpx;
border-radius: 20rpx;
margin: 20rpx auto;
}
.title{
padding: 20rpx 30rpx ;
height: 80rpx;
line-height: 80rpx;
border-bottom: 10rpx solid #f3f3f3;
margin-top: 10rpx;
}
::v-deep .el-select .el-input .el-select__caret{
color: #333;
}
.lines{
width: 2px;
height: 470px;
opacity: 1;
background: #979797;
position: absolute;
bottom: 50px;
left: 50%;
margin-left: -110px;
}
.right-lines{
position: absolute;
right: 80px;
top: 140px;
color: #999;
font-size: 12px;
}
.item-s{
padding-bottom: 10px;
display: flex;
line-height: 24px;
}
.bg-color{
width: 40px;
height: 22px;
border-radius: 2px;
margin-left: 5px;
}
.flex-s{
// display: flex;
// justify-content: center;
// align-items: center;
// width: 700px;
}
.styles{
position: absolute;
right: -30px;
z-index: 111;
top: 60px;
/*background: rgba(0,0,0,0.05);*/
/*border-radius: 4px 4px 4px 4px;*/
}
::v-deep .el-select .el-input__inner{
border: none;
background: rgba(0,0,0,0.05);
}
</style>

View File

@ -1,14 +1,9 @@
<!--
* @Descripttion:
* @version:
* @Author: 王三华
* @Date: 2023-05-15 14:38:28
-->
<template>
<div class="width-auto">
<view class="flexs">
<view class="title">
{{$t('N_I_102')}}
{{'真实业绩'}}
</view>
<view class="select-flexs">
<picker :range="selMounthList"
@ -152,13 +147,13 @@ export default {
let option = {
title: {
text: '',
subtext: this.$t('w_0339'),
subtext: '业绩(万)',
left:0,
},
tooltip: {},
legend: {
top: 'bottom',
data: [this.$t('S_C_18'), this.$t('S_C_19')],
data: ['左区', '右区'],
bottom:0,
},
xAxis: {
@ -188,7 +183,7 @@ export default {
},
series: [
{
name: this.$t('S_C_18'),
name: '左区',
type: 'bar',
data: arr2,
itemStyle: {
@ -199,7 +194,7 @@ export default {
},
},
{
name: this.$t('S_C_19'),
name: '右区',
type: 'bar',
data: arr3,
itemStyle: {

View File

@ -1,8 +1,8 @@
<template>
<div class="width-auto">
<div class="title">
<div>{{$t('N_I_121')}}</div>
<div style="color: #999;font-size: 14px;margin: 0px 0 0 14px">{{$t('N_I_122')}}</div>
<div>{{'推荐业绩分布'}}</div>
<div style="color: #999;font-size: 14px;margin: 0px 0 0 14px">{{'本人及伞下前十'}}</div>
</div>
<div class="color-s">
<div id="mounthData4" :style="myChartStyle">

View File

@ -1,8 +1,8 @@
<template>
<div class="width-auto" style="position: relative">
<div class="title" style="display: flex;">
<div>{{$t('ENU_MENU_515')}}</div>
<div style="color:rgb(102, 102, 102);font-size: 14rpx;margin-left: 30rpx;">{{ $t('N_I_116') }}</div>
<div>{{'推荐平均用时'}}</div>
<div style="color:rgb(102, 102, 102);font-size: 14rpx;margin-left: 30rpx;">{{ '会员本次推荐与下次推荐平均间隔的时长' }}</div>
</div>
<div class="right-lines">
<div class="item-s" v-for="item in list">
@ -24,10 +24,10 @@ export default {
return{
myChart:{},
list:[
{"name":this.$t('N_I_117'),"color":"#01C291"},
{"name":this.$t('N_I_118'),"color":"#FE4C4B"},
{"name":this.$t('N_I_119'),"color":"#FE9A02"},
{"name":this.$t('N_I_120'),"color":"#2982FF"},
{"name":'自己',"color":"#01C291"},
{"name":'团队',"color":"#FE4C4B"},
{"name":'明星',"color":"#FE9A02"},
{"name":'公司',"color":"#2982FF"},
],
myChartStyle: {
float: "center",
@ -58,17 +58,17 @@ export default {
list1.push({'value':data.thisTime})
let _data = this.initCharts(list1);
let _maxTime = _data[0].value;
let _unit = this.$t('S_L_9');
let _unit = '秒';
let _unitInfo = 60;
if(_maxTime > 60){
_unit = this.$t('S_L_8');
_unit = '分';
}
if(_maxTime > 60 * 60){
_unit = this.$t('S_L_7');
_unit = '时';
_unitInfo = 60*60;
}
if(_maxTime > 60 * 60 * 24){
_unit = this.$t('S_L_6');
_unit = '天';
_unitInfo = 60*60*24;
}
list1.forEach(function(item){

View File

@ -1,13 +1,8 @@
<!--
* @Descripttion:
* @version:
* @Author: 王三华
* @Date: 2023-07-21 15:20:07
-->
<template>
<div class="width-auto">
<view class="title">
{{$t('N_I_111')}}
{{'推荐小区分布'}}
</view>
<div class="flex-s">
<div
@ -31,13 +26,13 @@ import * as api from '@/config/activity.js'
{
value: 0,
age: 0,
name: this.$t('w_0152'),
name: '大区',
itemStyle: { color: "#2982ff" },
},
{
value: 0,
age: 0,
name: this.$t('w_0153'),
name: '小区',
itemStyle: { color: "#01c291" },
},
],

View File

@ -1,25 +1,7 @@
<!--
* @Descripttion:
* @version:
* @Author: 王三华
* @Date: 2023-07-21 15:00:04
-->
<!--
* @Descripttion:
* @version:
* @Author: 王三华
* @Date: 2023-05-15 16:28:35
-->
<!--
* @Descripttion:
* @version:
* @Author: 王三华
* @Date: 2023-05-15 14:38:28
-->
<template>
<div class="width-auto">
<view class="title">
{{$t('N_I_109')}}
{{'复购新增业绩'}}
</view>
<div class="flex-s">
<div
@ -70,14 +52,14 @@ export default {
let option = {
title: {
text: '',
subtext: this.$t('w_0339'),
subtext: '业绩(万)',
},
tooltip: {
trigger: 'axis',
},
legend: {
top: 'bottom',
data: [this.$t('S_C_18'), this.$t('S_C_19')],
data: ['左区', '右区'],
itemWidth: 20, //
itemHeight: 10, //
},
@ -106,7 +88,7 @@ export default {
},
series: [
{
name: this.$t('S_C_18'),
name: '左区',
type: 'line',
data: arr2,
symbol: 'none',
@ -122,7 +104,7 @@ export default {
},
},
{
name: this.$t('S_C_19'),
name: '右区',
type: 'line',
data: arr3,
symbol: 'none',

View File

@ -1,13 +1,7 @@
<!--
* @Descripttion:
* @version:
* @Author: 王三华
* @Date: 2023-07-21 15:20:22
-->
<template>
<div class="width-auto">
<view class="title">
{{$t('N_I_114')}}
{{'复购业绩分布'}}
</view>
<div class="flex-s">
<div
@ -32,13 +26,13 @@ export default {
{
value: 0,
age: 0,
name: this.$t('S_C_18'),
name: '左区',
itemStyle: { color: '#01c291' },
},
{
value: 0,
age: 0,
name: this.$t('S_C_19'),
name: '右区',
itemStyle: { color: '#2982ff' },
},
],

View File

@ -2,7 +2,7 @@
<view class="pop-service d-c d-c-c" :style="{ left: `${x}px`, top: `${y}px` }" @click="gotoService"
@touchstart="handleTouchStart" @touchmove="handleTouchMove" @touchend="handleTouchEnd">
<image class="pop-service-image" src="/static/images/service.gif" mode=""></image>
<view class="pop-service-text tc">{{ $t('w_0023') }}</view>
<view class="pop-service-text tc">{{ '在线客服' }}</view>
</view>
</template>
<script>

View File

@ -1,15 +1,4 @@
<!--
* @Descripttion:
* @version:
* @Author: 王三华
* @Date: 2023-07-25 10:26:06
-->
<!--
* @Descripttion:
* @version:
* @Author: kBank
* @Date: 2022-08-08 10:42:29
-->
<template>
<view>
<u-popup
@ -47,10 +36,10 @@
mode="center"
>
<view class="goodsDiag">
<view class="dis_t">{{ $t("w_0283") }}</view>
<view class="dis_t">{{ '种植' }}</view>
<view class="dis_a">
<view class="disFlex">
<view class="dis_l">{{ $t("MY_TH_2") }}:</view>
<view class="dis_l">{{ '数量' }}:</view>
<u-number-box
v-model="treeObj.quantity"
@change="treePrice"
@ -58,11 +47,11 @@
></u-number-box>
</view>
<view class="disFlex">
<view class="dis_l">{{ $t("w_0287") }}:</view>
<view class="dis_l">{{ '公益金' }}:</view>
<view class="dis_r">{{ treeObj.amount | numberToCurrency }}</view>
</view>
</view>
<view class="btns" @click="payGoods">{{ $t("w_0035") }}</view>
<view class="btns" @click="payGoods">{{ '确定' }}</view>
</view>
</u-popup>
</view>
@ -310,7 +299,7 @@ export default {
}
.btns {
margin: 0 auto;
background: #c8161d;
background: #005BAC;
color: #fff;
width: 300rpx;
height: 60rpx;

View File

@ -10,8 +10,8 @@
<img src="@../../static/images/lovesmart.png" alt="" />
</view>
<view class='starttitle'>
<view class="thestarttext">{{$t('w_0193')}}</view>
<p>{{$t('w_0194')}}{{ number_of_draws }}</p>
<view class="thestarttext">{{'开始'}}</view>
<p>{{'可抽奖次数'}}{{ number_of_draws }}</p>
</view>
</view>
@ -40,7 +40,7 @@
</div>
<div class="prize" style="position: relative;z-index: 11;display: block;align-items: none;">
<div class="width-flex-s">
<div class="top_texts" style="margin-top:110rpx;background-image: none;">{{$t('w_0195')}}</div>
<div class="top_texts" style="margin-top:110rpx;background-image: none;">{{'恭喜你获得'}}</div>
<div class="top_texts overflow1">
{{ productData.giftName || "" }}
</div>
@ -52,16 +52,16 @@
class="row-me row-center swiperItem">
<div class="item-s" v-for="(item, index) in productData.acGiftConfigList"
:key="index">
<div class="product">{{$t('ENU_N_B_T_3')}}{{item.productName}} x{{item.quantity}}</div>
<div class="price">{{$t('w_0196')}}{{ item.retailPrice | numFilter }}{{$t('w_0197')}}</div>
<div class="product">{{'产品'}}{{item.productName}} x{{item.quantity}}</div>
<div class="price">{{'价值'}}{{ item.retailPrice | numFilter }}{{'元'}}</div>
</div>
</swiper-item>
</swiper>
<div v-else>
<div class="item-s" style="align-items: center"
v-for="(item, index) in productData.acGiftConfigList" :key="index">
<div class="product">{{$t('ENU_N_B_T_3')}}{{item.productName}} x{{item.quantity}}</div>
<div class="price">{{$t('w_0196')}}{{ item.retailPrice | numFilter }}{{$t('w_0197')}}</div>
<div class="product">{{'产品'}}{{item.productName}} x{{item.quantity}}</div>
<div class="price">{{'价值'}}{{ item.retailPrice | numFilter }}{{'元'}}</div>
</div>
</div>
</div>
@ -78,16 +78,16 @@
<!-- 充值抽奖次数 -->
<u-popup mode="center" :show="rechargeShow" class="pay_password" closeable @close="rechargeShow=false">
<view class="pay_item">
<view class="pay_pt1">{{$t('w_0198')}}</view>
<view class="pay_pt1">{{'充值抽奖次数'}}</view>
<view style="font-size: 26rpx;margin: 20rpx 0;">
<view>{{$t('w_0199')}}{{totalSurplusNum}}</view>
<view>{{$t('w_0194')}}0</view>
<view>{{'抽奖次数'}}{{totalSurplusNum}}</view>
<view>{{'可抽奖次数'}}0</view>
</view>
<u-input type="number" :placeholder="$t('w_0200')" v-model="keyValue" clearable>
<u-input type="number" :placeholder="'请输入充值次数'" v-model="keyValue" clearable>
</u-input>
<view class="czbtnbox">
<u-button class="btn" shape="circle" color="#D61820" @click="closeBtn">{{$t('MY_WAL_4')}}</u-button>
<u-button class="btn" shape="circle" color="#D61820" @click="closeBtn">{{'充值'}}</u-button>
</view>
</view>
</u-popup>
@ -246,8 +246,8 @@
} else {
uni.showToast({
title: this.$t('w_0034'),
content: this.$t('w_0201'),
title: '提示',
content: '请输入正确的充值次数',
// success: (res) => {
// },
@ -300,8 +300,8 @@
// type: "warning",
// });
uni.showToast({
title: this.$t('w_0034'),
content: this.$t('w_0202'),
title: '提示',
content: '正在抽奖中,请勿重复点击',
// success: (res) => {
// },
@ -407,7 +407,7 @@
.price {
margin-right: 15rpx;
color: #c8161d;
color: #005BAC;
font-size: 12rpx;
//width: 120px;
overflow: hidden;
@ -422,7 +422,7 @@
// display: flex;
text-align: center;
font-size: 40rpx;
color: #C8161D;
color: #005BAC;
// margin-top: -130rpx;
// margin-left: -50rpx;
}

961
components/goods-list.vue Normal file
View File

@ -0,0 +1,961 @@
<template>
<view class="goods-list-content">
<view class="index_btm">
<view class="index_r_2">
<!-- <u-scroll-list :indicator="false" class="tabList">
<view class="tab">
<view
v-for="(item, index) in twoList"
:key="index"
@click="((twoId = item.pkId), getAllGoods1(item.pkId))"
:class="[twoId == item.pkId ? 'actTab' : 'tab_i']"
>
<view>{{ item.classifyName }}</view>
</view>
</view>
</u-scroll-list> -->
<view class="search">
<u--input
placeholder="请输入商品名称"
placeholderStyle="font-size:14px;"
prefixIcon="search"
shape="circle"
v-model="waresName"
border="none"
@confirm="getAllGoods1()"
prefixIconStyle="font-size: 22px;color: #909399"
></u--input>
</view>
<view class="goodList">
<view
v-for="item in goodList"
:key="item.waresCode"
class="goodList_i"
@tap="goDetails(item)"
>
<view style="display: flex; flex: 1">
<view
class="fly"
v-show="
item.preSaleStatus == 3 ||
item.isSale == 1 ||
(item.specialArea === 14 && !Number(item.inventory))
"
></view>
<view class="image-container">
<img :src="item.cover || item.cover1" class="cover" alt="" />
<!-- 三角形角标 -->
<view class="triangle-badge" v-if="item.warnMessage">
<view
class="triangle-badge-text"
:class="{
'text-2': item.warnMessage.length === 2,
'text-3': item.warnMessage.length === 3,
'text-4': item.warnMessage.length === 4,
}"
>
{{ item.warnMessage }}
</view>
</view>
</view>
<view class="goodList_ir">
<view>
<view>
<span
class="qzbq"
v-if="item.prefixLabelTarget != undefined"
>{{ item.prefixLabelTarget.label }}</span
>
<span style="font-weight: 500">{{ item.waresName }}</span>
</view>
</view>
<view>
<view
class="inventory-progress-container"
v-if="
item.useRatio &&
item.inventory !== undefined &&
item.specialArea == 14
"
>
<view class="inventory-progress-bar">
<view
class="inventory-progress-fill"
:style="{
width: getInventoryPercentage(item.inventory) + '%',
}"
:class="getProgressClass(item.inventory)"
>
<!-- 添加流动光效 -->
<view
class="progress-shine"
v-if="getInventoryPercentage(item.inventory) <= 30"
></view>
</view>
</view>
<view
class="inventory-percentage"
:class="getPercentageClass(item.inventory)"
>
剩余{{ getInventoryPercentage(item.inventory) }}%
</view>
</view>
<view class="goodList_ib">
<view>
<view
class="pv"
v-if="
specialArea != 18 &&
specialArea != 13 &&
specialArea != 31 &&
specialArea != 10
"
>
业绩:{{ item.waresAchieve | numberToCurrency }}
</view>
<view class="pv" v-if="specialArea == 10">
积分可抵扣:{{ item.deductMoney | numberToCurrency }}
</view>
<view
class="pv"
v-if="specialArea == 31 && userInfo.isMakerSpace == 0"
>
业绩:{{ item.waresAchieve | numberToCurrency }}
</view>
<view class="pv" v-if="specialArea == 13">
BV:{{ item.assAchieve | numberToCurrency }}
</view>
<view
v-if="specialArea == 31 && userInfo.isMakerSpace == 1"
>
{{ item.vipPrice | numberToCurrency }}
</view>
<view
v-if="
(specialArea == 31 && userInfo.isMakerSpace == 0) ||
specialArea != 31
"
>
{{ item.waresPrice | numberToCurrency }}
</view>
</view>
<template v-if="item.specialArea !== 14">
<img
@click.stop="addCar(item)"
v-show="
item.preSaleStatus != 3 &&
item.isSale != 1 &&
specialArea != 31
"
src="@/static/images/cart.png"
alt=""
/>
</template>
<template v-else>
<img
@click.stop="addCar(item)"
v-show="
item.preSaleStatus != 3 &&
item.isSale != 1 &&
Number(item.inventory)
"
src="@/static/images/cart.png"
alt=""
/>
</template>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
<selSpaceGoods ref="selSpaceGoods" @getCar="getCatLength"></selSpaceGoods>
<cartBall
ref="cart"
:carLength="shopCarLength"
:specialArea="specialArea"
></cartBall>
</view>
</template>
<script>
import cartBall from '@/components/cartBall.vue'
import { mapGetters, mapActions } from 'vuex'
import * as api from '@/config/goods'
import selSpaceGoods from '@/components/selSpaceGoods.vue'
export default {
components: {
cartBall,
selSpaceGoods,
},
props: {
specialAreaProp: {
type: Number,
},
},
computed: {},
filters: {
seles(value) {
if (value > 999) {
return 999 + '+'
} else {
return value
}
},
},
data() {
return {
newShareMember: false,
specialArea: 41,
oneList: [],
oneId: '',
twoList: [],
twoId: '',
goodList: [],
titLabel: '',
diff: 0,
shopCarLength: false,
userInfo: {},
pkCountry: 1,
pkCountryLabel: '',
pkCountryImg: '',
countryList: [],
isCountry: false,
waresName: '',
}
},
mounted() {
this.newShareMember = uni.getStorageSync('User')?.loginType !== 0
console.log(this.newShareMember, '...this.newShareMember')
this.setSpecial({
value: this.specialArea,
})
this.$nextTick(() => {
this.$refs.cart.getCar()
})
},
onHide() {
this.$refs.cart.close()
this.setSmallCarLength(0)
},
beforeDestroy() {
console.log('beforeDestroy........?')
this.setSmallCarLength(0)
},
methods: {
...mapActions(['setSmallCarLength', 'setShopCarLength']),
changeCountry() {
this.isCountry = true
},
sureCountry(e) {
const { value } = e
this.pkCountry = value[0].id
this.pkCountryLabel = value[0].label
this.pkCountryImg = value[0].img
this.isCountry = false
uni.setStorageSync('pkCountry', this.pkCountry + '')
//
this.getClassIfy()
this.$refs.cart.getCar()
},
goShare() {
uni.navigateTo({
url: '/pages/specialArea/share?specialArea=7',
})
},
setSpecial(item) {
this.specialArea = item.value
this.getClassIfy()
},
addCar(item) {
let carList = {
pkCountry: this.pkCountry,
specialArea: item.specialArea,
number: 1,
waresCode: item.waresCode,
productGroup: item.productGroup,
}
if (
item.isMakerGift == 2 &&
(item.specialArea == 1 || item.specialArea == 3)
) {
this.$refs.selSpaceGoods.getData(carList)
} else {
api.addShopping(carList).then(res => {
if (res.code == 200) {
uni.showToast({
title: '购物车添加成功',
icon: 'success',
mask: true,
duration: 500,
})
setTimeout(() => {
this.$store
.dispatch('getCarLength', this.specialArea)
.then(res => {
this.shopCarLength = res.data.smallCount
})
}, 200)
}
})
}
},
getCatLength() {
this.$store.dispatch('getCarLength', this.specialArea).then(res => {
this.shopCarLength = res.data.smallCount
})
},
getClassIfy() {
api
.classifyList({
pkCountry: this.pkCountry,
specialArea: this.specialArea,
hierarchy: 0,
})
.then(res => {
// res.data.unshift({
// classifyName: '',
// pkId: '',
// })
this.oneList = res.data
this.oneId = this.oneList[0] ? this.oneList[0].pkId : ''
this.getClassIfyTwo(this.oneList[0].pkId)
this.getAllGoods(this.oneList[0].pkId)
})
},
//
getClassIfyTwo(pkId) {
api
.classifyList({
specialArea: this.specialArea,
pkParent: pkId,
hierarchy: 1,
pkCountry: this.pkCountry,
})
.then(res => {
res.data.unshift({
classifyName: '全部',
pkId: pkId,
})
this.twoList = res.data
this.twoList = this.twoList.filter(item => 'classifyName' in item)
this.twoId = pkId
})
},
getAllGoods(id) {
api
.getAllGoods({
pkCountry: this.pkCountry,
specialArea: Number(this.specialArea),
pkAreaClassify: id ? id : '',
})
.then(res => {
this.goodList = res.data
console.log(this.goodList, '...this.goodList0000123')
this.goodList.forEach(item => {
if (item.waresName.length > 11) {
item.waresName = item.waresName.substring(0, 11) + '...'
}
})
})
},
getAllGoods1(id) {
api
.getAllGoods({
pkCountry: this.pkCountry,
specialArea: this.specialArea,
waresName: this.waresName,
pkAreaClassify: id ? id : this.oneId,
})
.then(res => {
this.goodList = res.data
this.goodList.forEach(item => {
if (item.waresName.length > 11) {
item.waresName = item.waresName.substring(0, 11) + '...'
}
})
})
},
goDetails(item) {
if (item.specialArea === 14 && !Number(item.inventory)) {
return
}
if (item.preSaleStatus != 3 && item.isSale != 1) {
uni.navigateTo({
url:
'/pages/specialArea/details?waresCode=' +
item.waresCode +
'&specialArea=' +
item.specialArea,
})
}
},
//
getInventoryPercentage(inventory) {
if (typeof inventory === 'string') {
//
const numStr = inventory.replace('%', '').trim()
const num = parseFloat(numStr)
return isNaN(num) ? 0 : Math.min(100, Math.max(0, num))
} else if (typeof inventory === 'number') {
// 0-100
return Math.min(100, Math.max(0, inventory))
}
return 0
},
//
getProgressClass(inventory) {
const percentage = this.getInventoryPercentage(inventory)
if (percentage >= 80) {
return 'progress-high'
} else if (percentage >= 60) {
return 'progress-medium-high'
} else if (percentage >= 40) {
return 'progress-medium'
} else if (percentage >= 20) {
return 'progress-low'
} else {
return 'progress-critical'
}
},
//
getPercentageClass(inventory) {
const percentage = this.getInventoryPercentage(inventory)
if (percentage <= 20) {
return 'percentage-critical'
} else if (percentage <= 30) {
return 'percentage-urgent'
} else {
return 'percentage-normal'
}
},
},
}
</script>
<style lang="scss" scoped>
.index_header {
background: #fff;
font-size: 18px;
font-family:
PingFang SC-Semibold,
PingFang SC;
font-weight: 600;
color: #333333;
text-align: center;
padding: 10px 0;
}
.goods-list-content {
// background: #f9f9f9;
height: auto;
display: flex;
flex-direction: column;
}
.index_btm {
flex: 1; // display: flex;
.index_l {
width: 198rpx;
padding: 10rpx 0;
font-size: 11px;
font-family:
PingFang SC-Regular,
PingFang SC;
font-weight: 400;
color: #000000;
overflow-y: auto;
display: flex;
flex-direction: column;
position: absolute;
height: 86vh;
background: #f2f2f2;
}
.index_r {
// flex: 1;
background: #fff;
margin-left: 198rpx; // padding: 20rpx;
// display: flex;
}
.index_r_2 {
// flex: 1;
background: #fff;
padding-top: 20rpx;
}
}
.classIfy {
padding: 20rpx 20rpx;
margin: 20rpx 0;
font-size: 26rpx;
font-family: Microsoft YaHei;
font-weight: 400;
color: #666666;
}
.actOne {
// border-left: 6rpx solid #005BAC;
color: #fff;
background: #005bac;
}
.tab {
display: flex;
align-items: center;
padding: 0 24rpx;
margin-top: 20rpx;
}
.tab_i {
// width: 120rpx;
text-align: center;
font-size: 14px;
font-weight: 600;
color: #999999;
margin-right: 28rpx;
white-space: nowrap;
display: flex;
flex-direction: column;
align-items: center;
background-color: #f6f6f6;
color: #666;
border-radius: 200rpx;
padding: 0 20rpx;
display: flex;
justify-content: center;
align-items: center;
line-height: 1;
height: 58rpx;
box-sizing: border-box;
}
.actTab {
// width: 120rpx;
text-align: center;
font-size: 14px;
font-family:
PingFang SC-Semibold,
PingFang SC;
font-weight: 600;
// color: #005BAC;
background-color: #005bac;
color: #fff;
margin-right: 28rpx;
white-space: nowrap;
display: flex;
flex-direction: column;
align-items: center;
border-radius: 200rpx;
padding: 0 20rpx;
display: flex;
justify-content: center;
align-items: center;
line-height: 1;
height: 58rpx;
box-sizing: border-box;
}
.heng {
width: 24px;
height: 2px;
background: #005bac;
border-radius: 1px 1px 1px 1px;
margin-top: 4rpx;
}
.heng1 {
width: 24px;
height: 2px;
background: f9f9f9;
border-radius: 1px 1px 1px 1px;
margin-top: 4rpx;
}
.heng2 {
width: 24px;
height: 2px;
background: f9f9f9;
border-radius: 1px 1px 1px 1px;
margin-top: 4rpx;
}
::v-deep .u-scroll-list {
padding-bottom: 10rpx;
}
.zhan {
height: 200px;
}
.goodList {
padding: 0 20rpx;
.goodList_i {
// display: flex;
border-bottom: 1px solid #eee;
padding: 20rpx 0 10rpx;
position: relative;
.goodList_ir {
flex: 1;
display: flex;
flex-direction: column;
justify-content: space-between;
font-size: 30rpx;
font-family: Microsoft YaHei;
font-weight: 400;
color: #333333;
margin-left: 24rpx;
.goodList_ib {
display: flex;
align-items: center;
justify-content: space-between;
font-size: 32rpx;
font-family: Source Han Sans CN;
font-weight: 400;
color: #f82c1a;
img {
width: 60rpx;
height: 60rpx;
}
}
}
.fly {
position: absolute;
width: 100%;
height: 100%;
top: 0;
background: #eee;
opacity: 0.5;
}
}
.cover {
width: 200rpx;
height: 200rpx;
background: #ffffff;
border: 1px solid #eeeeee;
border-radius: 10rpx;
}
}
.pv {
font-size: 26rpx;
font-family: Source Han Sans CN;
font-weight: 400;
color: #999999;
}
.shareImg {
position: fixed;
margin: 14rpx 24rpx;
z-index: 9999;
right: 20rpx;
top: 5rpx;
}
.shareImg1 {
position: fixed;
margin: 14rpx 24rpx;
z-index: 1;
right: 10rpx;
top: 10rpx;
display: flex;
align-items: center;
img {
width: 40rpx;
height: 30rpx;
margin-right: 20rpx;
}
}
.qzbq {
background: #d61820;
border-radius: 2px 2px 2px 2px;
font-size: 10px;
// font-family: PingFang SC-Semibold, PingFang SC;
// font-weight: 600;
color: #ffffff;
padding: 0px 5px;
margin-right: 5px;
}
.search {
margin: 10rpx 20rpx;
padding: 10rpx;
background: #eeeeee;
border-radius: 20px;
font-size: 14px;
}
.image-container {
position: relative;
}
.triangle-badge {
position: absolute;
top: 0;
left: 0;
width: 0;
height: 0;
border-top: 100rpx solid #005bac;
border-right: 100rpx solid transparent;
border-radius: 10rpx 0 0 0;
z-index: 10;
}
.triangle-badge-text {
position: absolute;
color: #ffffff;
font-weight: 600;
line-height: 1;
transform: rotate(-45deg);
transform-origin: center;
white-space: nowrap;
text-shadow: 0 1rpx 2rpx rgba(0, 0, 0, 0.2);
}
/* 2个字样式 */
.triangle-badge-text.text-2 {
top: -76rpx;
left: 10rpx;
font-size: 24rpx;
}
/* 3个字样式 */
.triangle-badge-text.text-3 {
top: -70rpx;
left: -2rpx;
font-size: 24rpx;
}
/* 4个字样式 */
.triangle-badge-text.text-4 {
top: -72rpx;
left: -4rpx;
font-size: 20rpx;
}
/* 库存进度条样式 - 升级版 */
.inventory-progress-container {
// margin-bottom: 10rpx;
display: flex;
align-items: center;
width: 100%;
.inventory-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-right: 10rpx;
// margin-bottom: 12rpx;
.inventory-label {
display: flex;
align-items: center;
font-size: 24rpx;
.fire-icon,
.warning-icon {
font-size: 28rpx;
margin-right: 8rpx;
animation: iconBounce 1.5s ease-in-out infinite;
}
.inventory-status {
color: #333;
}
}
}
.inventory-percentage {
font-size: 24rpx;
font-weight: 700;
font-family:
DIN Alternate,
Arial,
sans-serif;
&.percentage-critical {
color: #ff3742;
animation: percentageBlink 1s ease-in-out infinite;
text-shadow: 0 0 10rpx rgba(255, 55, 66, 0.3);
}
&.percentage-urgent {
color: #ff5252;
animation: percentageGlow 2s ease-in-out infinite;
}
&.percentage-normal {
color: #005bac;
}
}
.inventory-progress-bar {
width: 0;
flex: 1;
height: 18rpx;
margin-right: 10rpx;
background: rgba(0, 0, 0, 0.08);
border-radius: 12rpx;
overflow: hidden;
position: relative;
box-shadow: inset 0 2rpx 4rpx rgba(0, 0, 0, 0.1);
.inventory-progress-fill {
height: 100%;
border-radius: 8rpx;
transition: width 0.6s cubic-bezier(0.4, 0, 0.2, 1);
position: relative;
overflow: hidden;
/* 进度条渐变色彩 */
&.progress-critical {
background: linear-gradient(
90deg,
#ff1744 0%,
#d50000 50%,
#ff1744 100%
);
box-shadow: 0 0 20rpx rgba(255, 23, 68, 0.4);
animation: criticalPulse 1.5s ease-in-out infinite;
}
&.progress-low {
background: linear-gradient(
90deg,
#ff5722 0%,
#e64a19 50%,
#ff5722 100%
);
box-shadow: 0 0 15rpx rgba(255, 87, 34, 0.3);
}
&.progress-medium {
background: linear-gradient(
90deg,
#ff9800 0%,
#f57c00 50%,
#ff9800 100%
);
box-shadow: 0 0 10rpx rgba(255, 152, 0, 0.2);
}
&.progress-medium-high {
background: linear-gradient(
90deg,
#2196f3 0%,
#1976d2 50%,
#2196f3 100%
);
box-shadow: 0 0 8rpx rgba(33, 150, 243, 0.2);
}
&.progress-high {
background: linear-gradient(
90deg,
#4caf50 0%,
#388e3c 25%,
#005bac 75%,
#003d82 100%
);
box-shadow: 0 0 8rpx rgba(0, 91, 172, 0.2);
}
/* 流动光效 */
.progress-shine {
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(
90deg,
transparent 0%,
rgba(255, 255, 255, 0.8) 50%,
transparent 100%
);
animation: shineFlow 2s ease-in-out infinite;
}
/* 高光效果 */
&::after {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 60%;
background: linear-gradient(
to bottom,
rgba(255, 255, 255, 0.4) 0%,
rgba(255, 255, 255, 0.1) 50%,
transparent 100%
);
border-radius: 8rpx 8rpx 0 0;
}
}
}
}
/* 动画定义 */
@keyframes iconBounce {
0%,
100% {
transform: scale(1);
}
50% {
transform: scale(1.2);
}
}
@keyframes percentageBlink {
0%,
100% {
opacity: 1;
}
50% {
opacity: 0.7;
}
}
@keyframes percentageGlow {
0%,
100% {
text-shadow: 0 0 5rpx rgba(255, 82, 82, 0.3);
}
50% {
text-shadow: 0 0 15rpx rgba(255, 82, 82, 0.6);
}
}
@keyframes criticalPulse {
0%,
100% {
box-shadow: 0 0 20rpx rgba(255, 23, 68, 0.4);
}
50% {
box-shadow: 0 0 30rpx rgba(255, 23, 68, 0.7);
}
}
@keyframes shineFlow {
0% {
left: -100%;
}
100% {
left: 100%;
}
}
</style>

View File

@ -1,29 +1,18 @@
<!--
* @Descripttion:
* @version:
* @Author: 王三华
* @Date: 2023-06-12 17:17:03
-->
<!--
* @Descripttion:
* @version:
* @Author: kBank
* @Date: 2023-03-24 10:42:40
-->
<template>
<u-popup :show="sucShow" closeable :round="10" mode="center" @close="sucShow= false">
<view class="pop_a">
<view class="tit">
<u-icon name="checkmark-circle-fill" color="#029B00"></u-icon>
<view>{{$t('w_0158')}}</view>
<view>{{'注册成功'}}</view>
</view>
<!-- <view class="digBody">
<view class="red">{{$t('w_0159')}}
<view class="red">{{'恭喜您注册成功'}}
<view class="copy"
@click="onCopy">{{$t('MY_CK_27')}}</view>
@click="onCopy">{{'复制'}}</view>
</view>
<view>{{$t('CK_KS_14')}}: {{ allData.memberName }}</view>
<view>{{$t('MN_T_1')}}: {{ allData.memberCode }}</view>
<view>{{'会员姓名'}}: {{ allData.memberName }}</view>
<view>{{'会员编号'}}: {{ allData.memberCode }}</view>
<view>会员电话: {{ allData.phone }}</view>
<view>登录密码: {{ allData.loginPassword }}</view>
<view>支付密码: {{ allData.payPassword }}</view>
@ -33,32 +22,32 @@
<span slot="footer"
class="dialog-footer">
<view class="btn"
@click="handleClose">{{$t('w_0035')}}</view>
@click="handleClose">{{'确定'}}</view>
<view class="hui"
@click="handleClose">取消</view>
</span> -->
<!-- <view class="tit1">{{$t('w_0159')}}</view> -->
<view class="getCode" @tap="onCopy">{{$t('MY_CK_27')}}</view>
<!-- <view class="tit1">{{'恭喜您注册成功'}}</view> -->
<view class="getCode" @tap="onCopy">{{'复制'}}</view>
<view class="form">
<u--form labelPosition="left" labelWidth="80px" :model="allData" ref="uForm">
<u-form-item :label="$t('CK_KS_14')+':'" borderBottom>
<u-form-item :label="'会员姓名'+':'" borderBottom>
<u--input v-model="allData.memberName" border="none"></u--input>
</u-form-item>
<u-form-item :label="$t('MN_T_1')+':'" borderBottom>
<u-form-item :label="'会员编号'+':'" borderBottom>
<u--input v-model="allData.memberCode" border="none"></u--input>
</u-form-item>
<u-form-item :label="$t('w_0160')+':'" borderBottom>
<u-form-item :label="'会员电话'+':'" borderBottom>
<u--input v-model="allData.phone" border="none"></u--input>
</u-form-item>
<u-form-item :label="$t('w_0041')+':'" borderBottom>
<u-form-item :label="'登录密码'+':'" borderBottom>
<u--input v-model="allData.loginPassword" border="none">
</u--input>
</u-form-item>
<u-form-item :label="$t('N_I_217')+':'" borderBottom>
<u-form-item :label="'支付密码'+':'" borderBottom>
<u--input v-model="allData.payPassword" border="none">
</u--input>
</u-form-item>
<u-form-item :label="$t('w_0161')+':'" borderBottom>
<u-form-item :label="'登录网址'+':'" borderBottom>
<u--input v-model="allData.urlAddress" border="none"></u--input>
</u-form-item>
<!-- <u-form-item :label="'公众号搜索'+':'"
@ -79,8 +68,8 @@
</u--form>
<view class="disflx">
<u-button type="success" class="uBtn" shape="circle"
color="linear-gradient(to right, #fb3024, #fb3024 )"
@tap="handleClose">{{$t('w_0035')}}</u-button>
color="linear-gradient(to right, #005BAC, #005BAC )"
@tap="handleClose">{{'确定'}}</u-button>
</view>
</view>
<img class="yh" v-show="bia" src="@/static/images/yh.gif" alt="">
@ -115,22 +104,22 @@
payPw() {},
onCopy() {
let text =
this.$t('CK_KS_14') + ':' +
'会员姓名' + ':' +
this.allData.memberName +
'\n' +
this.$t('MN_T_1') + ':' +
'会员编号' + ':' +
this.allData.memberCode +
'\n' +
this.$t('w_0160') + ':' +
'会员电话' + ':' +
this.allData.phone +
'\n' +
this.$t('w_0041') + ':' +
'登录密码' + ':' +
this.allData.loginPassword +
'\n' +
this.$t('N_I_217') + ':' +
'支付密码' + ':' +
this.allData.payPassword +
'\n' +
this.$t('w_0161') + ':' +
'登录网址' + ':' +
this.allData.urlAddress
// +
// '\n' +
@ -146,7 +135,7 @@
// this.allData.android
this.$copyText(text).then((res) => {
uni.showToast({
title: this.$t('MY_CK_29'),
title: '复制成功',
icon: 'none',
})
})
@ -213,7 +202,7 @@
font-size: 30rpx;
font-family: Source Han Sans CN;
font-weight: bold;
color: #fb3024;
color: #005BAC;
text-align: center;
}

View File

@ -1,354 +1,371 @@
<template>
<view class="content">
<view class="seach">
<view class="seach_i">
<u--input prefixIcon="search" v-model="queryParams.memberInfo"
prefixIconStyle="font-size: 22px;color: #909399;height:32px" border="none"
:placeholder="$t('w_0351')" suffixIconStyle="color: #909399"></u--input>
</view>
<view class="neibox" @click="listShow=true">
<view>{{thegrade?thegrade:$t('PER_DA_5')}}</view>
<u-icon name="arrow-down-fill" color="#000000" size="14"></u-icon>
</view>
</view>
<!-- 日期区间 -->
<view class="timeSlide">
<view class="timeA">{{$t('w_0352')}}</view>
<view class="timeB" @click="openDate(0)">
{{ queryParams.startCreationTime?queryParams.startCreationTime:$t('CK_KS_3') }}
</view>
<view class="timeA">{{$t('w_0139')}}</view>
<view class="timeB" @click="openDate(1)">
{{ queryParams.endCreationTime?queryParams.endCreationTime:$t('CK_KS_9') }}
</view>
<view class="seatch_r" @click="clickTap()">
<u-icon name="search" size="22" color="#fff"></u-icon>
</view>
</view>
<view class="content">
<view class="seach">
<view class="seach_i">
<u--input
prefixIcon="search"
v-model="queryParams.memberInfo"
prefixIconStyle="font-size: 22px;color: #909399;height:32px"
border="none"
:placeholder="'请输入会员编号或姓名查询'"
suffixIconStyle="color: #909399"
></u--input>
</view>
<view class="neibox" @click="listShow = true">
<view>{{ thegrade ? thegrade : '注册等级' }}</view>
<u-icon name="arrow-down-fill" color="#000000" size="14"></u-icon>
</view>
</view>
<!-- 日期区间 -->
<view class="timeSlide">
<view class="timeA">{{ '日期区间' }}</view>
<view class="timeB" @click="openDate(0)">
{{
queryParams.startCreationTime
? queryParams.startCreationTime
: '开始时间'
}}
</view>
<view class="timeA">{{ '至' }}</view>
<view class="timeB" @click="openDate(1)">
{{
queryParams.endCreationTime ? queryParams.endCreationTime : '结束时间'
}}
</view>
<view class="seatch_r" @click="clickTap()">
<u-icon name="search" size="22" color="#fff"></u-icon>
</view>
</view>
<!-- 轮次 -->
<view class="thecontent" v-for='(item,index) in roundObj' >
<!-- <view class="thecontent" v-for='(item,index) in roundObj' :key="index" >
<view class="line_box">
<view class='line1'>{{$t('w_0260')}}</view>
<view class='line1'>{{'轮数'}}</view>
<view class='line2' v-if="item.round!='暂无'">{{item.round}}</view>
<view class='line2' v-else>{{item.round}}</view>
</view>
<view class="line_box">
<view class='line1'>{{$t('N_I_156')}}</view>
<view class='line1'>{{'次数'}}</view>
<view class='line2' v-if="item.second!='暂无'">{{item.second}}</view>
<view class='line2' v-else>{{item.second}}</view>
</view>
<view class="line_box">
<view class='line1'>{{$t('MN_F_T_453') +'(PV)'}}</view>
<view class='line1'>{{'业绩'}}</view>
<view class='line2' v-if="item.calAchieve!='暂无'">{{item.calAchieve|toThousandthAndKeepDecimal}}</view>
<view class='line2' v-else>{{item.calAchieve}}</view>
</view>
</view> -->
<view class="thecontent" v-for="(item, index) in dataList" :key="index">
<view class="line_box">
<view class="line1">{{ '会员编号' }}</view>
<view class="line2">{{ item.memberCode }}</view>
</view>
<view class="line_box">
<view class="line1">{{ '会员姓名' }}</view>
<view class="line2">{{ item.memberName }}</view>
</view>
<view class="line_box">
<view class="line1">{{ '注册金额' }}({{ isLocaled() }})</view>
<view class="line2">{{
item.orderAmount | toThousandthAndKeepDecimal
}}</view>
</view>
<view class="line_box">
<view class="line1">{{ '注册业绩' }}</view>
<view class="line2">{{
item.orderAchieve | toThousandthAndKeepDecimal
}}</view>
</view>
<view class="line_box">
<view class="line1">{{ '注册等级' }}</view>
<view class="line2">{{ item.pkRegisterGradeStr }}</view>
</view>
<view class="line_box">
<view class="line1">{{ '订单类型' }}</view>
<view class="line2">{{ item.orderTypeStr }}</view>
</view>
<view class="line_box">
<view class="line1">{{ '轮数' }}</view>
<view class="line2">{{ item.round }}</view>
</view>
<view class="line_box">
<view class="line1">{{ '次数' }}</view>
<view class="line2">{{ item.second }}</view>
</view>
<view class="line_box">
<view class="line1"> {{ '注册时间' }}</view>
<view class="line2">{{ item.creationTime }}</view>
</view>
</view>
<view class="thecontent" v-for='(item,index) in dataList' :key="index">
<view class="line_box">
<view class='line1'>{{$t('MN_T_1')}}</view>
<view class='line2'>{{item.memberCode}}</view>
</view>
<view class="line_box">
<view class='line1'>{{$t('CK_KS_14')}}</view>
<view class='line2'>{{item.memberName}}</view>
</view>
<view class="line_box">
<view class='line1'>{{$t('N_I_169')}}({{ isLocaled() }})</view>
<view class='line2'>{{item.orderAmount |toThousandthAndKeepDecimal}}</view>
</view>
<view class="line_box">
<view class='line1'>{{$t('PER_DA_10')}}(PV)</view>
<view class='line2'>{{item.orderAchieve|toThousandthAndKeepDecimal}}</view>
</view>
<view class="line_box">
<view class='line1'>{{$t('PER_DA_5')}}</view>
<view class='line2'>{{item.pkRegisterGradeStr}}</view>
</view>
<view class="line_box">
<view class='line1'>{{$t('MY_ORD_2')}}</view>
<view class='line2'>{{item.orderTypeStr}}</view>
</view>
<view class="line_box">
<view class='line1'>{{$t('w_0260')}}</view>
<view class='line2'>{{item.round}}</view>
</view>
<view class="line_box">
<view class='line1'>{{$t('N_I_156')}}</view>
<view class='line2'>{{item.second}}</view>
</view>
<view class="line_box">
<view class='line1'>
{{$t('S_L_5')}}</view>
<view class='line2'>{{item.creationTime}}</view>
</view>
</view>
<u-datetime-picker :closeOnClickOverlay="true" @close="dataShow = false" @cancel="dataShow = false"
@confirm="getDate" :show="dataShow" v-model="value1" mode="date"></u-datetime-picker>
<u-picker @cancel='listShow=false' :show="listShow" ref="uPicker" :columns="gradeList" @confirm="confirm"
keyName='gradeName'></u-picker>
</view>
<u-datetime-picker
:closeOnClickOverlay="true"
@close="dataShow = false"
@cancel="dataShow = false"
@confirm="getDate"
:show="dataShow"
v-model="value1"
mode="date"
></u-datetime-picker>
<u-picker
@cancel="listShow = false"
:show="listShow"
ref="uPicker"
:columns="gradeList"
@confirm="confirm"
keyName="gradeName"
></u-picker>
</view>
</template>
<script>
import * as mar from "@/config/market.js"
import {
nextRound
} from "@/config/bonus.js"
import { isLocaled } from '@/util/numberToCurrency'
import {
formatMsToDate
} from '@/util/index'
export default {
data() {
return {
minDate:Number(new Date()),
navIndex:0,
navList: [
{ name: this.$t('ENU_MENU_581'),path:"0",menuKey:'' },
{ name: this.$t('ENU_MENU_582'),path:"0",menuKey:''},
{ name: this.$t('ENU_MENU_583') ,path:"0",menuKey:'' },
],
queryParams: {
pageNum: 1,
pageSize: 50,
memberInfo: "",
startCreationTime: "",
endCreationTime: "",
pkRegisterGrade: ""
},
dataShow: false,
timeIndex: 0,
listShow: false,
thegrade: "",
value1: '',
gradeList: [],
dataList: [],
roundObj:[]
}
},
onLoad() {
// this.getOthers()
},
created() {
this.getDataList()
this.value1 = Number(new Date())
this.getOthers()
this.getTime()
},
methods: {
isLocaled,
getTime(){
nextRound().then((res) => {
if(res.rows.length == 0){
res.rows=[
import * as mar from '@/config/market.js'
import { nextRound } from '@/config/bonus.js'
import { isLocaled } from '@/util/numberToCurrency'
import { formatMsToDate } from '@/util/index'
export default {
data() {
return {
minDate: Number(new Date()),
navIndex: 0,
navList: [
{ name: '直推列表', path: '0', menuKey: '' },
{ name: '三单循环', path: '0', menuKey: '' },
{ name: '免费注册', path: '0', menuKey: '' },
],
queryParams: {
pageNum: 1,
pageSize: 50,
memberInfo: '',
startCreationTime: '',
endCreationTime: '',
pkRegisterGrade: '',
},
dataShow: false,
timeIndex: 0,
listShow: false,
thegrade: '',
value1: '',
gradeList: [],
dataList: [],
roundObj: [],
}
},
onLoad() {
// this.getOthers()
},
created() {
this.getDataList()
this.value1 = Number(new Date())
this.getOthers()
// this.getTime()
},
methods: {
isLocaled,
getTime() {
nextRound().then(res => {
if (res.rows.length == 0) {
res.rows = [
{
round:'暂无',
second:'暂无',
calAchieve:'暂无',
}
round: '暂无',
second: '暂无',
calAchieve: '暂无',
},
]
}
this.roundObj = res.rows
})
},
getOthers() {
mar.getGradeList().then((res) => {
this.gradeList = [res.data];
});
},
clickTap(){
this.dataList =[]
this.getDataList()
},
clickHref(index){
this.navIndex = index
},
getMenuLists(){
mar.menuList().then((res) => {
console.error(res)
res.data.forEach((item)=>{
if(item.menuKey == 'directList'){
this.navList[0].menuKey = 'directList'
}
if(item.menuKey == 'attractDetailList'){
this.navList[1].menuKey = 'attractDetailList'
}
if(item.menuKey == 'haiList'){
this.navList[2].menuKey = 'haiList'
}
})
})
},
getOthers() {
mar.getGradeList().then((res) => {
this.gradeList = [res.data];
});
},
getDataList(num) {
this.queryParams.pageNum = num || 1
mar.tripleCycleList(this.queryParams).then(res => {
this.dataList = [...this.dataList,...res.rows]
})
},
openDate(index) {
this.timeIndex = index
this.dataShow = true
},
confirm(e) {
this.queryParams.pkRegisterGrade = e.value[0].pkId
this.thegrade = e.value[0].gradeName
this.listShow = false
this.dataList = []
this.getDataList()
},
getDate(e) {
if (this.timeIndex == 1) {
this.queryParams.endCreationTime = formatMsToDate(e.value)
} else {
this.queryParams.startCreationTime = formatMsToDate(e.value)
}
this.dataShow = false
},
}
}
getOthers() {
mar.getGradeList().then(res => {
this.gradeList = [res.data]
})
},
clickTap() {
this.dataList = []
this.getDataList()
},
clickHref(index) {
this.navIndex = index
},
getMenuLists() {
mar.menuList().then(res => {
console.error(res)
res.data.forEach(item => {
if (item.menuKey == 'directList') {
this.navList[0].menuKey = 'directList'
}
if (item.menuKey == 'attractDetailList') {
this.navList[1].menuKey = 'attractDetailList'
}
if (item.menuKey == 'haiList') {
this.navList[2].menuKey = 'haiList'
}
})
})
},
getOthers() {
mar.getGradeList().then(res => {
this.gradeList = [res.data]
})
},
getDataList(num) {
this.queryParams.pageNum = num || 1
mar.tripleCycleList(this.queryParams).then(res => {
this.dataList = [...this.dataList, ...res.rows]
})
},
openDate(index) {
this.timeIndex = index
this.dataShow = true
},
confirm(e) {
this.queryParams.pkRegisterGrade = e.value[0].pkId
this.thegrade = e.value[0].gradeName
this.listShow = false
this.dataList = []
this.getDataList()
},
getDate(e) {
if (this.timeIndex == 1) {
this.queryParams.endCreationTime = formatMsToDate(e.value)
} else {
this.queryParams.startCreationTime = formatMsToDate(e.value)
}
this.dataShow = false
},
},
}
</script>
<style lang="scss" scoped>
/*左侧分类视图*/
.left_scrol_style{
white-space: nowrap;
width: 100%;
}
.styles {
border: none !important;
color: #fff !important;
background: #d61820;
}
.top-lists{
width: fit-content;
display: flex;
padding: 30rpx 30rpx 0 0;
background-color: #fff;
height: 80rpx;
line-height: 80rpx;
.nav-view{
width: 200rpx;
cursor: pointer;
padding: 0 26rpx;
height: 44rpx;
border-radius: 10rpx;
border: 1rpx solid #999999;
font-size: 14rpx;
text-align: center;
line-height: 44rpx;
margin-left: 20rpx;
color: #999;
}
}
.content {
background: #F2F2F2;
/*左侧分类视图*/
.left_scrol_style {
white-space: nowrap;
width: 100%;
}
.styles {
border: none !important;
color: #fff !important;
background: #d61820;
}
.top-lists {
width: fit-content;
display: flex;
padding: 30rpx 30rpx 0 0;
background-color: #fff;
height: 80rpx;
line-height: 80rpx;
.nav-view {
width: 200rpx;
cursor: pointer;
padding: 0 26rpx;
height: 44rpx;
border-radius: 10rpx;
border: 1rpx solid #999999;
font-size: 14rpx;
text-align: center;
line-height: 44rpx;
margin-left: 20rpx;
color: #999;
}
}
.content {
background: #f2f2f2;
.seach {
background: #fff;
overflow: hidden;
padding: 20rpx 23rpx;
display: flex;
justify-content: space-between;
align-items: center;
position: relative;
border-bottom: 2rpx solid #eee;
.seach {
background: #fff;
overflow: hidden;
padding: 20rpx 23rpx;
display: flex;
justify-content: space-between;
align-items: center;
position: relative;
border-bottom: 2rpx solid #eee;
.seach_i {
padding: 0 20rpx;
border-radius: 34rpx;
background: #fff;
flex: 1;
background: #f5f6f8;
// margin-right: 40rpx;
}
.seach_i {
padding: 0 20rpx;
border-radius: 34rpx;
background: #fff;
flex: 1;
background: #f5f6f8;
// margin-right: 40rpx;
}
.neibox {
display: flex;
align-items: center;
font-size: 26rpx;
font-family: PingFang SC;
font-weight: 400;
color: #999999;
margin-left: 20rpx;
}
.neibox {
display: flex;
align-items: center;
font-size: 26rpx;
font-family: PingFang SC;
font-weight: 400;
color: #999999;
margin-left: 20rpx;
}
}
.timeSlide {
display: flex;
align-items: center;
padding: 38rpx 26rpx;
justify-content: space-between;
background-color: #ffffff;
}
.timeA {
font-size: 26rpx;
font-family: Source Han Sans CN;
font-weight: 400;
color: #333;
margin-right: 46rpx;
}
.timeSlide {
display: flex;
align-items: center;
padding: 38rpx 26rpx;
justify-content: space-between;
background-color: #FFFFFF;
.timeB {
font-size: 24rpx;
font-family: Arial;
font-weight: 400;
color: #999999;
text-align: center;
}
.timeA {
font-size: 26rpx;
font-family: Source Han Sans CN;
font-weight: 400;
color: #333;
margin-right: 46rpx;
}
.seatch_r {
background: #005bac;
border-radius: 50%;
padding: 8rpx;
margin-left: 24rpx;
}
}
.timeB {
font-size: 24rpx;
font-family: Arial;
font-weight: 400;
color: #999999;
text-align: center;
}
.thecontent {
background-color: #ffffff;
margin-top: 25rpx;
margin-bottom: 21rpx;
padding: 10rpx 23rpx 30rpx 23rpx;
.seatch_r {
background: #fb3024;
border-radius: 50%;
padding: 8rpx;
margin-left: 24rpx;
}
}
.line_box {
display: flex;
align-items: center;
justify-content: space-between;
margin-top: 25rpx;
.thecontent {
background-color: #FFFFFF;
margin-top: 25rpx;
margin-bottom: 21rpx;
padding: 10rpx 23rpx 30rpx 23rpx;
.line1 {
font-size: 26rpx;
font-family: Source Han Sans CN;
font-weight: 400;
color: #999999;
}
.line_box {
display: flex;
align-items: center;
justify-content: space-between;
margin-top: 25rpx;
.line2 {
font-size: 26rpx;
font-family: Source Han Sans CN;
font-weight: 400;
color: #333333;
}
.line1 {
font-size: 26rpx;
font-family: Source Han Sans CN;
font-weight: 400;
color: #999999;
}
.line2 {
font-size: 26rpx;
font-family: Source Han Sans CN;
font-weight: 400;
color: #333333;
}
.line3 {
font-size: 26rpx;
font-family: Source Han Sans CN;
font-weight: 400;
color: rgba(251, 48, 36, 1);
}
}
}
}
</style>
.line3 {
font-size: 26rpx;
font-family: Source Han Sans CN;
font-weight: 400;
color: rgba(251, 48, 36, 1);
}
}
}
}
</style>

View File

@ -4,23 +4,23 @@
<view class="seach_i">
<u--input prefixIcon="search" v-model="queryParams.memberInfo"
prefixIconStyle="font-size: 22px;color: #909399;height:32px" border="none"
:placeholder="$t('w_0351')" suffixIconStyle="color: #909399"></u--input>
:placeholder="'请输入会员编号或姓名查询'" suffixIconStyle="color: #909399"></u--input>
</view>
<!-- <view class="neibox" @click="listShow=true">
<view>{{thegrade?thegrade:$t('PER_DA_5')}}</view>
<view>{{thegrade?thegrade:'注册等级'}}</view>
<u-icon name="arrow-down-fill" color="#000000" size="14"></u-icon>
</view> -->
</view>
<!-- 日期区间 -->
<view class="timeSlide">
<view class="timeA">{{$t('w_0352')}}</view>
<view class="timeA">{{'日期区间'}}</view>
<view class="timeB" @click="openDate(0)">
{{ queryParams.startCreateTime?queryParams.startCreateTime:$t('CK_KS_3') }}
{{ queryParams.startCreateTime?queryParams.startCreateTime:'开始时间' }}
</view>
<view class="timeA">{{$t('w_0139')}}</view>
<view class="timeA">{{'至'}}</view>
<view class="timeB" @click="openDate(1)">
{{ queryParams.endCreateTime?queryParams.endCreateTime:$t('CK_KS_9') }}
{{ queryParams.endCreateTime?queryParams.endCreateTime:'结束时间' }}
</view>
<view class="seatch_r" @click="clickTap()">
<u-icon name="search" size="22" color="#fff"></u-icon>
@ -28,21 +28,21 @@
</view>
<view class="thecontent" v-for='(item,index) in dataList' :key="index">
<view class="line_box">
<view class='line1'>{{$t('MN_T_1')}}</view>
<view class='line1'>{{'会员编号'}}</view>
<view class='line2'>{{item.memberCode}}</view>
</view>
<view class="line_box">
<view class='line1'>{{$t('CK_KS_14')}}</view>
<view class='line1'>{{'会员姓名'}}</view>
<view class='line2'>{{item.memberName}}</view>
</view>
<view class="line_box">
<view class='line1'>{{$t('CK_KS_15')}}</view>
<view class='line1'>{{'结算等级'}}</view>
<view class='line2'>{{item.pkSettleGradeStr}}</view>
</view>
<view class="line_box">
<view class='line1'>
{{$t('S_L_5')}}</view>
{{'注册时间'}}</view>
<view class='line2'>{{item.creationTime}}</view>
</view>
@ -64,9 +64,9 @@
return {
navIndex:0,
navList: [
{ name: this.$t('ENU_MENU_581'),path:"0",menuKey:'' },
{ name: this.$t('ENU_MENU_582'),path:"0",menuKey:''},
{ name: this.$t('ENU_MENU_583') ,path:"0",menuKey:'' },
{ name: '直推列表',path:"0",menuKey:'' },
{ name: '三单循环',path:"0",menuKey:''},
{ name: '免费注册' ,path:"0",menuKey:'' },
],
queryParams: {
pageNum: 1,
@ -240,7 +240,7 @@
}
.seatch_r {
background: #fb3024;
background: #005BAC;
border-radius: 50%;
padding: 8rpx;
margin-left: 24rpx;

View File

@ -1,286 +0,0 @@
<template>
<view class="content">
<view class="seach">
<view class="seach_i">
<u--input prefixIcon="search" v-model="queryParams.memberInfo"
prefixIconStyle="font-size: 22px;color: #909399;height:32px" border="none"
:placeholder="$t('w_0351')" suffixIconStyle="color: #909399"></u--input>
</view>
<!-- <view class="neibox" @click="listShow=true">
<view>{{thegrade?thegrade:$t('PER_DA_5')}}</view>
<u-icon name="arrow-down-fill" color="#000000" size="14"></u-icon>
</view> -->
</view>
<!-- 日期区间 -->
<view class="timeSlide">
<view class="timeA">{{$t('w_0352')}}</view>
<view class="timeB" @click="openDate(0)">
{{ queryParams.startCreationTime?queryParams.startCreationTime:$t('CK_KS_3') }}
</view>
<view class="timeA">{{$t('w_0139')}}</view>
<view class="timeB" @click="openDate(1)">
{{ queryParams.endCreationTime?queryParams.endCreationTime:$t('CK_KS_9') }}
</view>
<view class="seatch_r" @click="clickTap()">
<u-icon name="search" size="22" color="#fff"></u-icon>
</view>
</view>
<view class="thecontent" v-for='(item,index) in dataList' :key="index">
<view class="line_box">
<view class='line1'>{{$t('MN_T_1')}}</view>
<view class='line2'>{{item.memberCode}}</view>
</view>
<view class="line_box">
<view class='line1'>{{$t('CK_KS_14')}}</view>
<view class='line2'>{{item.memberName}}</view>
</view>
<view class="line_box">
<view class='line1'>{{$t('w_0052')}}</view>
<view class='line2'>{{item.phone}}</view>
</view>
<view class="line_box">
<view class='line1'>
{{$t('S_L_5')}}</view>
<view class='line2'>{{item.creationTime}}</view>
</view>
</view>
<u-datetime-picker :closeOnClickOverlay="true" @close="dataShow = false" @cancel="dataShow = false"
@confirm="getDate" :show="dataShow" v-model="value1" mode="date"></u-datetime-picker>
<u-picker @cancel='listShow=false' :show="listShow" ref="uPicker" :columns="gradeList" @confirm="confirm"
keyName='gradeName'></u-picker>
</view>
</template>
<script>
import * as mar from "@/config/market.js"
import {
formatMsToDate
} from '@/util/index'
export default {
data() {
return {
navIndex:0,
navList: [
{ name: this.$t('ENU_MENU_581'),path:"0",menuKey:'' },
{ name: this.$t('ENU_MENU_582'),path:"0",menuKey:''},
{ name: this.$t('ENU_MENU_583') ,path:"0",menuKey:'' },
],
queryParams: {
pageNum: 1,
pageSize: 50,
memberInfo: "",
startCreationTime: "",
endCreationTime: "",
pkRegisterGrade: ""
},
dataShow: false,
timeIndex: 0,
listShow: false,
thegrade: "",
value1: '',
gradeList: [],
dataList: []
}
},
created() {
this.getDataList()
this.value1 = Number(new Date())
},
onLoad() {
// this.getOthers()
},
methods: {
clickTap(){
this.dataList =[]
this.getDataList()
},
clickHref(index){
this.navIndex = index
},
getMenuLists(){
mar.menuList().then((res) => {
console.error(res)
res.data.forEach((item)=>{
if(item.menuKey == 'directList'){
this.navList[0].menuKey = 'directList'
}
if(item.menuKey == 'attractDetailList'){
this.navList[1].menuKey = 'attractDetailList'
}
if(item.menuKey == 'haiList'){
this.navList[2].menuKey = 'haiList'
}
})
})
},
getOthers() {
mar.getGradeList().then((res) => {
this.gradeList = [res.data];
});
},
getDataList(num) {
this.queryParams.pageNum = num || 1
mar.seaFlourList(this.queryParams).then(res => {
this.dataList = [...this.dataList,...res.rows]
})
},
openDate(index) {
this.timeIndex = index
this.dataShow = true
},
confirm(e) {
this.queryParams.pkRegisterGrade = e.value[0].pkId
this.thegrade = e.value[0].gradeName
this.listShow = false
},
getDate(e) {
if (this.timeIndex == 1) {
this.queryParams.endCreationTime = formatMsToDate(e.value)
} else {
this.queryParams.startCreationTime = formatMsToDate(e.value)
}
this.dataShow = false
},
}
}
</script>
<style lang="scss" scoped>
/*左侧分类视图*/
.left_scrol_style{
white-space: nowrap;
width: 100%;
}
.styles {
border: none !important;
color: #fff !important;
background: #d61820;
}
.top-lists{
width: fit-content;
display: flex;
padding: 30rpx 30rpx 0 0;
background-color: #fff;
height: 80rpx;
line-height: 80rpx;
.nav-view{
width: 200rpx;
cursor: pointer;
padding: 0 26rpx;
height: 44rpx;
border-radius: 10rpx;
border: 1rpx solid #999999;
font-size: 14rpx;
text-align: center;
line-height: 44rpx;
margin-left: 20rpx;
color: #999;
}
}
.content {
background: #F2F2F2;
.seach {
background: #fff;
overflow: hidden;
padding: 20rpx 23rpx;
display: flex;
justify-content: space-between;
align-items: center;
position: relative;
border-bottom: 2rpx solid #eee;
.seach_i {
padding: 0 20rpx;
border-radius: 34rpx;
background: #fff;
flex: 1;
background: #f5f6f8;
// margin-right: 40rpx;
}
.neibox {
display: flex;
align-items: center;
font-size: 26rpx;
font-family: PingFang SC;
font-weight: 400;
color: #999999;
margin-left: 20rpx;
}
}
.timeSlide {
display: flex;
align-items: center;
padding: 38rpx 26rpx;
justify-content: space-between;
background-color: #FFFFFF;
.timeA {
font-size: 26rpx;
font-family: Source Han Sans CN;
font-weight: 400;
color: #333;
margin-right: 46rpx;
}
.timeB {
font-size: 24rpx;
font-family: Arial;
font-weight: 400;
color: #999999;
text-align: center;
}
.seatch_r {
background: #fb3024;
border-radius: 50%;
padding: 8rpx;
margin-left: 24rpx;
}
}
.thecontent {
background-color: #FFFFFF;
margin-top: 25rpx;
margin-bottom: 21rpx;
padding: 10rpx 23rpx 30rpx 23rpx;
.line_box {
display: flex;
align-items: center;
justify-content: space-between;
margin-top: 25rpx;
.line1 {
font-size: 26rpx;
font-family: Source Han Sans CN;
font-weight: 400;
color: #999999;
}
.line2 {
font-size: 26rpx;
font-family: Source Han Sans CN;
font-weight: 400;
color: #333333;
}
.line3 {
font-size: 26rpx;
font-family: Source Han Sans CN;
font-weight: 400;
color: rgba(251, 48, 36, 1);
}
}
}
}
</style>

View File

@ -1,15 +1,4 @@
<!--
* @Descripttion:
* @version:
* @Author: 王三华
* @Date: 2024-06-25 11:28:56
-->
<!--
* @Descripttion:
* @version:
* @Author: 王三华
* @Date: 2023-06-25 20:05:35
-->
<template>
<u-popup
:show="agreeMent"
@ -5064,9 +5053,9 @@
type="success"
class="uBtn"
shape="circle"
color="linear-gradient(to right, #fb3024, #fb3024 )"
color="linear-gradient(to right, #005BAC, #005BAC )"
@tap="agreeMent = false"
>{{ $t("w_0035") }}</u-button
>{{ '确定' }}</u-button
>
</view>
</view>

View File

@ -1,15 +1,4 @@
<!--
* @Descripttion:
* @version:
* @Author: 王三华
* @Date: 2023-06-15 10:41:52
-->
<!--
* @Descripttion:
* @version:
* @Author: kBank
* @Date: 2023-04-27 15:54:20
-->
<template>
<u-popup :show="centerDialogVisible"
:round="10"
@ -32,13 +21,13 @@
disabled
class="uBtn"
shape="circle"
color="linear-gradient(to right, #fb3024, #fb3024 )">{{$t('w_0210')}}({{ readTime }})s</u-button>
color="linear-gradient(to right, #005BAC, #005BAC )">{{'我已阅读以上协议'}}({{ readTime }})s</u-button>
<u-button type="success"
v-else
class="uBtn"
shape="circle"
color="linear-gradient(to right, #fb3024, #fb3024 )"
@tap="toAgree">{{$t('w_0210')}}</u-button>
color="linear-gradient(to right, #005BAC, #005BAC )"
@tap="toAgree">{{'我已阅读以上协议'}}</u-button>
</view>
</view>
@ -82,7 +71,7 @@ export default {
waresCodeList: arr,
})
.then((res) => {
this.agreementList = res.data
this.agreementList = res.data || []
this.readTime = res.data.alertTime
if (this.readTime > 0) {
this.centerDialogVisible = true

View File

@ -1,15 +1,4 @@
<!--
* @Descripttion:
* @version:
* @Author: 王三华
* @Date: 2023-08-16 19:05:40
-->
<!--
* @Descripttion:
* @version:
* @Author: kBank
* @Date: 2022-08-08 10:42:29
-->
<template>
<u-popup :show="newVip"
class="notice"
@ -98,7 +87,7 @@
</swiper>
<div class="btns"
@click="changeGift">{{ $t('w_0211') }}</div>
@click="changeGift">{{ '立即领取' }}</div>
</view>
</div>
</u-popup>

View File

@ -5,26 +5,27 @@
* @Date: 2022-08-08 10:42:29
-->
<template>
<u-popup :show="noticeFlag" class="notice" width="70%" @close="closeTap"
mode="center">
<u-popup
:show="noticeFlag"
class="notice"
width="70%"
@close="closeTap"
mode="center"
>
<div class="title">
{{ content.title }}
</div>
<div class="close-icons" @click="closeTap">
<u-icon name="close"></u-icon>
</div>
<div class="close-icons" @click="closeTap">
<u-icon name="close"></u-icon>
</div>
<div class="img-auto" v-html="content.content"></div>
<!-- <div class="surebtn1">-->
<!-- <div class="btn hh" @click="closeTap">取消</div>-->
<!-- <div class="btn " @click="closeTap">{{ $t('MY_WAL_23') }}</div>-->
<!-- </div>-->
</u-popup>
</template>
<script>
import * as api from '@/config/login.js'
export default {
name: "Title",
name: 'Title',
props: {
userInfo: {
type: Object,
@ -36,63 +37,66 @@ export default {
data() {
return {
noticeFlag: false,
content: "",
};
content: '',
}
},
mounted() {
// this.getUserTc();
// this.getUserTc()
},
methods: {
closeTap(){
this.noticeFlag = false
// this.$emit("getTree");
},
closeTap() {
this.noticeFlag = false
this.$emit('close')
},
getUserTc(data) {
api.indexPopScreen({
grade: this.userInfo.pkGradeId,
awards: this.userInfo.pkAwardsId,
}).then((res) => {
if (res.code == "200") {
let list = JSON.parse(localStorage.getItem("menuList"));
let arr = res.data[0].publishLocation.split(",");
arr.forEach((items) => {
if (items == this.publishLocationIndex) {
this.noticeFlag = true;
this.content = res.data[0];
}
});
}
});
api
.indexPopScreen({
grade: this.userInfo.pkGradeId,
awards: this.userInfo.pkAwardsId,
})
.then(res => {
if (res.code == '200') {
let list = JSON.parse(localStorage.getItem('menuList'))
let arr = res.data[0]?.publishLocation.split(',') || []
arr.forEach(items => {
if (items == this.publishLocationIndex) {
this.noticeFlag = true
this.content = res.data[0]
} else {
this.$emit('close')
}
})
}
})
},
},
};
}
</script>
<style lang="scss" scoped>
.close-icons{
position: absolute;
right: 30rpx;
top: 30rpx;
}
::v-deep .u-popup__content{
height: 1120rpx;
width: 690rpx;
.close-icons {
position: absolute;
right: 30rpx;
top: 30rpx;
}
.notice{
height: 700rpx;
::v-deep .u-popup__content {
height: 1120rpx;
width: 690rpx;
}
// .notice{
// height: 700rpx;
// }
::v-deep .el-dialog__headerbtn i {
font-size: 24px;
//visibility: hidden;
color: #333;
}
::v-deep .el-dialog{
margin-top:113px !important;
height:815px;
::v-deep .el-dialog {
margin-top: 113px !important;
height: 815px;
margin-bottom: 0;
}
::v-deep .el-dialog__body{
::v-deep .el-dialog__body {
padding-bottom: 20px;
}
.surebtn1 {
@ -108,7 +112,9 @@ export default {
border-radius: 6px 6px 6px 6px;
text-align: center;
font-size: 22px;
font-family: PingFang SC-Medium, PingFang SC;
font-family:
PingFang SC-Medium,
PingFang SC;
font-weight: 500;
color: #ffffff;
line-height: 66px;
@ -134,9 +140,9 @@ export default {
padding-top: 10px;
}
.title {
font-size: 40rpx;
text-align: center;
margin: 20rpx auto;
font-size: 40rpx;
text-align: center;
margin: 20rpx auto;
color: #333;
font-weight: bold;
}
@ -152,4 +158,4 @@ export default {
height: auto;
}
}
</style>
</style>

View File

@ -1,35 +1,32 @@
<!--
* @Descripttion:
* @version:
* @Descripttion:
* @version:
* @Author: kBank
* @Date: 2022-12-13 15:02:12
-->
<template>
<view>
<!-- 海报 -->
<view class="popup"
v-show="popShow">
<view class="all"
id="qrCodeDiv"
ref="qrCodeDiv">
<canvas :style="{ width: canvasW + 'px', height: canvasH + 'px' }"
canvas-id="myCanvas"
id="myCanvas"></canvas>
<view class="popup" v-show="popShow">
<view class="all" id="qrCodeDiv" ref="qrCodeDiv">
<canvas
:style="{ width: canvasW + 'px', height: canvasH + 'px' }"
canvas-id="myCanvas"
id="myCanvas"
></canvas>
</view>
<view class="btn"
@click="savePosterPath()">保存到手机</view>
<view class="btn" @click="savePosterPath()">保存到手机</view>
</view>
<!-- 模态框 -->
<view class="mask"
v-show="popShow"
@tap="popShow = false"></view>
<view class="mask" v-show="popShow" @tap="popShow = false"></view>
<!-- 底部弹框 -->
<u-action-sheet :actions="list"
:closeOnClickOverlay="true"
@close="closeIsShow"
@select="selectClick"
:show="isShow"></u-action-sheet>
<u-action-sheet
:actions="list"
:closeOnClickOverlay="true"
@close="closeIsShow"
@select="selectClick"
:show="isShow"
></u-action-sheet>
</view>
</template>
@ -68,11 +65,11 @@ export default {
},
toShare(item) {
let pkId = item.pkId
this.goodImg = item.cover1
this.goodImg = item.cover || item.cover1
qrCode({
codeType: 1,
waresId: pkId,
}).then((res) => {
}).then(res => {
this.postImg = res.data
this.toCanvas()
// this.popShow = true
@ -90,7 +87,7 @@ export default {
ctx.drawImage(imgBg, 0, 0, this.canvasW, this.canvasH) //
ctx.drawImage(imggoodList, 95, 175, 130, 130)
ctx.drawImage(imgPost, 239, 392, 65, 65)
ctx.draw(true, (ret) => {})
ctx.draw(true, ret => {})
}, 100)
},
//
@ -98,7 +95,7 @@ export default {
return new Promise((reslove, reject) => {
uni.getImageInfo({
src: img,
success: (res) => {
success: res => {
reslove(res.path)
},
})
@ -122,7 +119,7 @@ export default {
uni.showModal({
title: '授权提示',
content: '是否允许获取保存相册权限',
success: (res) => {
success: res => {
if (res.confirm) {
//
uni.openSetting({
@ -154,32 +151,35 @@ export default {
saveLocal() {
console.log('d')
// canvas
uni.canvasToTempFilePath({
canvasId: 'myCanvas',
success: function (res) {
console.log('res', res)
// //
uni.saveImageToPhotosAlbum({
filePath: res.tempFilePath,
success: function () {
console.log('save success')
uni.showToast({
title: '已保存在本地相册',
icon: 'none',
})
},
fail: function () {
uni.showToast({
title: '保存失败',
icon: 'none',
})
},
})
uni.canvasToTempFilePath(
{
canvasId: 'myCanvas',
success: function (res) {
console.log('res', res)
// //
uni.saveImageToPhotosAlbum({
filePath: res.tempFilePath,
success: function () {
console.log('save success')
uni.showToast({
title: '已保存在本地相册',
icon: 'none',
})
},
fail: function () {
uni.showToast({
title: '保存失败',
icon: 'none',
})
},
})
},
fail: function (err) {
console.log('err', err)
},
},
fail: function (err) {
console.log('err', err)
},
},this)
this
)
},
},
}
@ -242,4 +242,4 @@ export default {
background: rgba(0, 0, 0, 80%);
overflow: hidden;
}
</style>
</style>

View File

@ -0,0 +1,326 @@
<template>
<view class="raised-tabbar">
<!-- 背景遮罩层创建凸起效果 -->
<view class="tabbar-bg">
<view class="raised-circle"></view>
</view>
<!-- TabBar内容 -->
<view class="tabbar-content">
<!-- 左侧两个选项 -->
<view
v-for="(item, index) in leftItems"
:key="index"
class="tabbar-item"
:class="{ active: current === index }"
@click="tabbarChange(index)"
>
<view class="item-icon">
<image
:src="current === index ? item.activeIcon : item.inactiveIcon"
class="icon-normal"
/>
<view v-if="item.badge && item.badge > 0" class="badge">{{
item.badge
}}</view>
</view>
<text class="item-text" :class="{ active: current === index }">{{
item.text
}}</text>
</view>
<!-- 中间凸起的选项 -->
<view
class="tabbar-item center-item"
:class="{ active: current === 2 }"
@click="tabbarChange(2)"
v-if="!newShareMember"
>
<view class="center-icon-wrapper">
<view class="center-icon">
<image
:src="
current === 2 ? centerItem.activeIcon : centerItem.inactiveIcon
"
class="center-image"
/>
</view>
</view>
<text
class="item-text center-text"
:class="{ active: current === 2 }"
>{{ centerItem.text }}</text
>
</view>
<!-- 右侧两个选项 -->
<view
v-for="(item, index) in rightItems"
:key="index + 3"
class="tabbar-item"
:class="{ active: current === index + 3 }"
@click="tabbarChange(index + 3)"
>
<view class="item-icon">
<image
:src="current === index + 3 ? item.activeIcon : item.inactiveIcon"
class="icon-normal"
/>
<view v-if="item.badge && item.badge > 0" class="badge">{{
item.badge
}}</view>
</view>
<text class="item-text" :class="{ active: current === index + 3 }">{{
item.text
}}</text>
</view>
</view>
</view>
</template>
<script>
import { mapGetters } from 'vuex'
export default {
name: 'RaisedTabbar',
props: {
current: {
type: Number,
default: 0,
},
},
mounted() {
this.newShareMember = uni.getStorageSync('User')?.loginType !== 0
},
data() {
return {
newShareMember: false,
//
list: [
{
text: '首页',
path: 'pages/index/index',
},
{
text: '会员专区',
path: 'pages/specialArea/index',
},
{
text: '个人推广',
path: 'pages/mine/share/index',
},
{
text: '购物车',
path: 'pages/shoppingCar/index',
},
{
text: '我的',
path: 'pages/mine/index',
},
],
}
},
computed: {
...mapGetters(['shopCarLength']),
//
leftItems() {
return [
{
text: '首页',
activeIcon: require('@/static/images/one1.png'),
inactiveIcon: require('@/static/images/one2.png'),
},
{
text: '会员专区',
activeIcon: require('@/static/images/five1.jpg'),
inactiveIcon: require('@/static/images/five2.jpg'),
},
]
},
//
centerItem() {
return {
text: '个人推广',
activeIcon: require('@/static/images/code.svg'),
inactiveIcon: require('@/static/images/code.svg'),
}
},
//
rightItems() {
return [
{
text: '购物车',
activeIcon: require('@/static/images/three1.png'),
inactiveIcon: require('@/static/images/three2.png'),
badge: this.shopCarLength,
},
{
text: '我的',
activeIcon: require('@/static/images/fore1.png'),
inactiveIcon: require('@/static/images/fore2.png'),
},
]
},
},
methods: {
tabbarChange(index) {
this.$emit('change', index)
uni.switchTab({
url: '/' + this.list[index].path,
})
},
},
}
</script>
<style lang="scss" scoped>
.raised-tabbar {
position: fixed;
bottom: 0;
left: 0;
right: 0;
z-index: 1000;
.tabbar-bg {
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 60px;
background: #ffffff;
//
&::after {
content: '';
position: absolute;
bottom: -40px;
left: 0;
right: 0;
height: env(safe-area-inset-bottom);
background: #ffffff;
}
}
.tabbar-content {
position: relative;
display: flex;
align-items: flex-end;
height: 60px;
padding-bottom: 5px;
background: transparent;
.tabbar-item {
flex: 1;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding-bottom: 5px;
position: relative;
.item-icon {
position: relative;
margin-bottom: 2px;
.icon-normal {
width: 20px;
height: 20px;
}
.badge {
position: absolute;
top: -5px;
right: -8px;
background: #ff4757;
color: white;
border-radius: 50%;
width: 16px;
height: 16px;
font-size: 10px;
text-align: center;
line-height: 16px;
display: flex;
align-items: center;
justify-content: center;
}
}
.item-text {
font-size: 10px;
color: #666666;
line-height: 1.2;
&.active {
color: #333333;
}
}
//
&.center-item {
position: relative;
.center-icon-wrapper {
position: absolute;
top: -58rpx;
background: #fff;
border-radius: 50%;
font-size: 0;
padding: 4rpx;
z-index: 10;
.center-icon {
width: 92rpx;
height: 92rpx;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
// box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2);
position: relative;
//
// animation: breathe 3s ease-in-out infinite;
.center-image {
width: 92rpx;
height: 92rpx;
// position: absolute;
// top: -10rpx;
}
//
// &.active {
// background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
// }
}
}
.center-text {
margin-top: 25px;
font-size: 9px;
}
&.active {
.center-icon-wrapper .center-icon {
// background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
transform: scale(1.1);
transition: all 0.3s ease;
}
}
}
}
}
}
//
@keyframes breathe {
0%,
100% {
transform: scale(1);
// box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2);
}
50% {
transform: scale(1.05);
// box-shadow: 0 6px 20px rgba(0, 0, 0, 0.25);
}
}
</style>

View File

@ -0,0 +1,407 @@
<template>
<div v-if="popupVisible" class="region-select-overlay">
<div class="region-select-popup">
<div class="popup-header">
<h3 class="popup-title">
{{ reselected ? '修改' : '选择' }}收益区域({{ typeEnumMap[area] }})
</h3>
</div>
<div class="popup-content">
<picker-view
v-if="popupVisible"
class="picker-view"
:value="pickerValue"
@change="handlePickerChange"
>
<picker-view-column>
<div v-for="p in provinceList" :key="p.id" class="picker-item">
{{ p.name }}
</div>
</picker-view-column>
<picker-view-column
v-if="
cityList &&
cityList.length &&
['city', 'county'].includes(this.area)
"
>
<div v-for="c in cityList" :key="c.id" class="picker-item">
{{ c.name }}
</div>
</picker-view-column>
<picker-view-column
v-if="countyList && countyList.length && this.area == 'county'"
>
<div v-for="d in countyList" :key="d.id" class="picker-item">
{{ d.name }}
</div>
</picker-view-column>
</picker-view>
</div>
<div class="popup-footer">
<button
v-if="showCancelButton"
class="popup-btn popup-cancel"
@click="handleClose"
>
取消
</button>
<button class="popup-btn popup-confirm" @click="handleConfirm">
确认
</button>
</div>
</div>
</div>
</template>
<script>
import { getRegionSelect, setRegion, getRegionAreaTree } from '@/config/mine.js'
export default {
name: 'RegionSelect',
props: {
autoTrigger: {
type: Boolean,
default: true,
},
showCancelButton: {
type: Boolean,
default: false,
},
reselected: {
type: Boolean,
default: false,
},
},
data() {
return {
popupVisible: false,
areaTree: [],
pickerValue: [0, 0, 0],
// indicatorStyle: `height: 50px;`,
selectedList: [],
regionList: [],
provinceList: [],
cityList: [],
countyList: [],
area: '',
typeMap: {
province: 1,
city: 2,
county: 3,
},
typeEnumMap: {
province: '省',
city: '市',
county: '区',
},
}
},
async created() {
if (!this.autoTrigger) {
return
}
this.init()
},
methods: {
init() {
uni.showLoading({
title: '加载中...',
})
this.getRegionSelect()
.then(selectedList => {
this.selectedList = selectedList
const area = selectedList.shift()
this.open(area)
})
.catch(() => {
this.$emit('success')
uni.hideLoading()
})
},
async getRegionSelect() {
return new Promise(async (resolve, reject) => {
try {
const res = await getRegionSelect()
if (res?.code === 200) {
const needSelected = Object.keys(res?.data || {})
.filter(key => key !== 'data')
.filter(key => res.data[key])
.filter(key => !res.data?.data?.[`${key}Data`])
.reverse()
if (
needSelected?.length &&
Object.keys(res.data?.data || {}).length < needSelected?.length
) {
resolve(needSelected)
} else {
reject(false)
}
}
} catch (error) {
reject(false)
}
})
},
async open(area) {
this.area = area
uni.showLoading({
title: '加载中...',
})
return new Promise(async (resolve, reject) => {
this.popupVisible = true
await this.loadAreaTree(area)
resolve()
uni.hideLoading()
})
},
async loadAreaTree(selectedArea) {
try {
const res = await getRegionAreaTree({
type: this.typeMap[selectedArea],
})
if (res.code === 200 && res.data) {
this.provinceList = res.data.filter(item => item.parent === 0)
this.cityList = res.data.filter(item =>
this.provinceList.find(province => province.pkId === item.parent)
)
this.countyList = res.data.filter(item =>
this.cityList.find(city => city.pkId === item.parent)
)
this.getProvinceFilterList()
this.getCityFilterList()
this.generateRegionTree()
return true
}
return false
} catch (error) {
console.error('Failed to load area tree:', error)
}
},
generateRegionTree() {
this.countyList.forEach(item => {
const city = this.cityList.find(city => city.pkId === item.parent)
if (city) {
if (!city.children) {
city.children = [item]
} else {
city.children.push(item)
}
}
})
this.cityList.forEach(item => {
const province = this.provinceList.find(
province => province.pkId === item.parent
)
if (province) {
if (!province.children) {
console.log(item)
province.children = [item]
} else {
province.children.push(item)
}
}
})
this.provinceList = this.provinceList.filter(item => item.children)
this.cityList = this.cityList.filter(item => item.children)
this.cityList = this.provinceList[this.pickerValue[0]].children
this.countyList = this.cityList[this.pickerValue[1]].children
},
getProvinceFilterList() {
if (!this.cityList.length) {
this.provinceList = []
}
this.provinceList = this.provinceList.filter(
item => !!this.cityList.find(city => city.parent === item.pkId)
)
},
getCityFilterList() {
if (!this.countyList.length) {
this.cityList = []
}
this.cityList = this.cityList.filter(
item => !!this.countyList.find(county => county.parent === item.pkId)
)
},
handlePickerChange(e) {
const [pIndex, cIndex] = e.detail.value
const oldPIndex = this.pickerValue[0]
const oldCIndex = this.pickerValue[1]
if (oldPIndex !== pIndex) {
this.cityList = this.provinceList[pIndex].children
this.countyList = this.cityList[0].children
this.$set(this.pickerValue, 1, 0)
this.$set(this.pickerValue, 2, 0)
} else if (oldCIndex !== cIndex) {
this.countyList = this.cityList[cIndex].children
this.$set(this.pickerValue, 2, 0)
}
this.pickerValue = e.detail.value
},
handleClose() {
this.popupVisible = false
this.$emit('cancel')
},
async handleConfirm() {
const [pIndex, cIndex, dIndex] = this.pickerValue
const province = this.provinceList[pIndex]
const city = this.cityList[cIndex]
const county = this.countyList[dIndex]
try {
const params = {
type: this.typeMap[this.area],
province: province.pkId,
city: 0,
county: 0,
}
if (this.area == 'city') {
params.city = city.pkId
} else if (this.area == 'county') {
params.city = city.pkId
params.county = county.pkId
}
const res = await setRegion(params)
if (res.code === 200) {
this.handleClose()
if (this.selectedList.length) {
this.area = this.selectedList.shift()
this.pickerValue = [0, 0, 0]
this.open(this.area)
} else {
this.$emit('success')
}
} else {
throw new Error(res.message || 'Failed to set region')
}
} catch (error) {
this.$emit('success')
console.error('Failed to set region:', error)
}
},
},
}
</script>
<style scoped>
.region-select-overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.5);
display: flex;
align-items: center;
justify-content: center;
z-index: 1000;
transition: opacity 0.3s ease;
}
.region-select-popup {
width: 90%;
max-width: 680rpx;
background-color: white;
border-radius: 24rpx;
/* animation: scale-up 0.3s ease-out; */
max-height: 80vh;
display: flex;
flex-direction: column;
overflow: hidden;
box-shadow: 0 4rpx 24rpx rgba(0, 0, 0, 0.1);
}
.popup-header {
display: flex;
justify-content: center;
align-items: center;
padding: 30rpx;
border-bottom: 1rpx solid #f5f5f5;
flex-shrink: 0;
}
.popup-title {
font-size: 32rpx;
font-weight: 600;
color: #1c1c1e;
margin: 0;
}
.popup-btn {
border: none;
background: none;
cursor: pointer;
}
.popup-content {
overflow: hidden;
flex-grow: 1;
}
.picker-view {
width: 100%;
height: 600rpx;
/* margin-top: 20rpx; */
}
.picker-item {
display: flex;
align-items: center;
justify-content: center;
font-size: 24rpx;
line-height: 100rpx;
color: #666;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.popup-footer {
display: flex;
flex-shrink: 0;
padding: 24rpx;
gap: 24rpx;
background-color: #f7f7f7;
border-top: 1rpx solid #efefef;
}
.popup-footer .popup-btn {
flex: 1;
text-align: center;
padding: 14rpx 0;
font-size: 28rpx;
border-radius: 40rpx;
font-weight: 500;
transition:
transform 0.1s ease,
box-shadow 0.2s ease;
}
.popup-footer .popup-btn:active {
transform: scale(0.97);
}
.popup-footer .popup-cancel {
background-color: #eee;
color: #555;
}
.popup-footer .popup-confirm {
background: linear-gradient(135deg, #007aff, #0056b3);
color: white;
box-shadow: 0 4rpx 12rpx rgba(0, 122, 255, 0.25);
}
/* @keyframes scale-up {
from {
transform: scale(0.8);
opacity: 0;
}
to {
transform: scale(1);
opacity: 1;
}
} */
</style>

View File

@ -1,15 +1,4 @@
<!--
* @Descripttion:
* @version:
* @Author: 王三华
* @Date: 2023-08-10 10:47:07
-->
<!--
* @Descripttion:
* @version:
* @Author: 王三华
* @Date: 2023-08-09 10:30:33
-->
<template>
<div>
<u-popup class="notice"
@ -304,7 +293,7 @@ export default {
goods.addShopping(this.carList).then((res) => {
if (res.code == 200) {
uni.showToast({
title: this.$t('w_0036'),
title: '购物车添加成功',
icon: 'success',
mask: true,
})
@ -333,15 +322,15 @@ export default {
//
.delBtn {
background: #c8161d;
background: #005BAC;
color: #fff;
border-color: #c8161d;
border-color: #005BAC;
}
.delBtn:hover {
background: #c8161d;
background: #005BAC;
color: #fff;
border-color: #c8161d;
border-color: #005BAC;
}
.view-class {

View File

@ -1,9 +1,3 @@
<!--
* @Descripttion:
* @version:
* @Author: 王三华
* @Date: 2023-05-30 20:18:30
-->
<template>
<view>

View File

@ -0,0 +1,317 @@
<template>
<view class="default-share-page">
<!-- 背景图片替代CSS background -->
<img
class="share-bg-image"
src="/static/images/share-bg.jpg"
crossorigin="anonymous"
@load="onBackgroundImageLoad"
@error="onBackgroundImageError"
/>
<view class="qr-code-outer">
<image
class="qr-code"
:src="qrCodeImage"
mode="aspectFit"
v-if="qrCodeImage"
></image>
<view v-else class="qr-code-placeholder">
<view class="loader"></view>
</view>
</view>
<view class="member-code-outer">
<text
class="member-code-text"
style="
font-size: 20rpx;
color: #fff;
font-weight: bold;
margin-top: 20rpx;
"
>{{ desensitization(userInfo.memberCode) }}</text
>
</view>
</view>
</template>
<script>
import html2canvas from 'html2canvas'
import { snapdom } from '@zumer/snapdom'
export default {
name: 'DefaultSharePage',
props: {
qrCodeImage: {
type: String,
default: '',
},
userInfo: {
type: Object,
default: () => ({}),
},
isWechat: {
type: Boolean,
default: false,
},
isLoaded: {
type: Boolean,
default: false,
},
},
data() {
return {
backgroundImageLoaded: false,
shareButtonShow: true,
}
},
methods: {
desensitization(str) {
if (!str) return ''
if (str.length <= 8) return str.slice(0, 4) + '****'
const len = str.length - 6
const placeholder = '*'.repeat(len)
return str.slice(0, 4) + placeholder + str.slice(-2)
},
//
onBackgroundImageLoad() {
this.backgroundImageLoaded = true
console.log('默认场景背景图片加载成功')
},
//
onBackgroundImageError(e) {
console.error('默认场景背景图片加载失败:', e)
},
async sharePage() {
if (!this.qrCodeImage) {
uni.showToast({
title: '二维码尚未生成',
icon: 'none',
})
return
}
uni.showLoading({ title: '加载中...' })
try {
this.shareButtonShow = false
await this.$nextTick()
await this.capturePageWithHtml2Canvas()
} catch (error) {
uni.hideLoading()
uni.showToast({ title: '图片生成失败,请稍后重试', icon: 'none' })
console.error('sharePage error:', error)
} finally {
//
this.shareButtonShow = true
}
},
// 使html2canvas
async capturePageWithHtml2Canvas() {
console.log('开始使用html2canvas截取页面')
return new Promise((resolve, reject) => {
//
const waitForImages = () => {
if (!this.backgroundImageLoaded || !this.qrCodeImage) {
setTimeout(waitForImages, 100)
return
}
//
setTimeout(() => {
const element = this.$el
if (!element) {
reject(new Error('找不到组件容器'))
return
}
const scale = 3
html2canvas(element, {
useCORS: true,
// allowTaint: true,
backgroundColor: null,
scale,
// canvas,
width: element.offsetWidth,
height: element.offsetHeight,
})
.then(canvas => {
const context = canvas.getContext('2d')
// context.scale(2, 2)
context.mozImageSmoothingEnabled = false
context.webkitImageSmoothingEnabled = false
context.msImageSmoothingEnabled = false
context.imageSmoothingEnabled = false
const dataUrl = canvas.toDataURL('image/jpeg', 1)
this.$emit('share-generated', dataUrl)
resolve()
})
.catch(err => {
console.error('html2canvas截取失败:', err)
reject(err)
})
}, 1000)
}
//
waitForImages()
})
},
},
}
</script>
<style lang="scss" scoped>
.default-share-page {
position: relative;
width: 600rpx;
height: 1296rpx;
// height: 100%;
display: flex;
flex-direction: column;
align-items: center;
}
/* 背景图片样式 */
.share-bg-image {
position: absolute;
top: 0;
left: 0;
width: 600rpx;
height: 1296rpx;
// height: 100%;
z-index: 1;
}
.share-wrapper {
position: absolute;
z-index: 2;
bottom: 22%;
display: flex;
flex-direction: column;
align-items: center;
}
.portal-frame {
padding: 32rpx;
width: 520rpx;
border-radius: 40rpx;
display: flex;
box-sizing: border-box;
flex-direction: column;
align-items: center;
margin: 0 auto;
opacity: 0;
transform: translateY(20rpx);
transition: all 0.3s ease;
}
.portal-frame.is-loaded {
opacity: 1;
transform: translateY(0);
}
/* 二维码样式区域 - 用户自定义样式位置 */
.qr-code-outer {
width: 140rpx;
height: 140rpx;
background: rgba(255, 255, 255, 0.98);
border-radius: 20rpx;
box-shadow: 0px 8rpx 20rpx rgba(50, 50, 90, 0.06);
border: 1px solid #f0f0f0;
display: flex;
align-items: center;
justify-content: center;
padding: 12rpx;
box-sizing: border-box;
position: absolute;
// bottom: 460rpx;
left: 374rpx;
top: 708rpx;
// right: 130rpx;
z-index: 10;
}
.qr-code,
.qr-code-placeholder {
width: 100%;
height: 100%;
}
.qr-code {
border-radius: 16rpx;
}
.qr-code-placeholder {
display: flex;
align-items: center;
justify-content: center;
}
.loader {
width: 100rpx;
height: 100rpx;
border: 8rpx solid rgba(0, 0, 0, 0.1);
border-left-color: #0072ff;
border-radius: 50%;
animation: spin 1s linear infinite;
}
@keyframes spin {
to {
transform: rotate(360deg);
}
}
/* 会员编号样式区域 - 用户自定义样式位置 */
.member-code-text {
/* 用户可以在这里自定义会员编号的样式 */
}
.member-code-outer {
position: absolute;
top: 1086rpx;
left: 246rpx;
// width: 300rpx;
text-align: center;
// background: rgb(217, 24, 25);
border-radius: 20rpx;
z-index: 10;
}
/* 下载按钮样式 */
.share-button {
margin-top: 28rpx;
width: 280rpx;
height: 72rpx;
line-height: 72rpx;
color: #fff;
border-radius: 36rpx;
font-size: 26rpx;
font-weight: 500;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
box-shadow: 0 5rpx 12rpx 0 rgba(102, 126, 234, 0.2);
border: none;
padding: 0;
text-align: center;
transition: all 0.3s ease;
letter-spacing: 1rpx;
}
button.share-button {
padding: 0;
line-height: 72rpx;
border: none;
}
.share-button:active {
transform: translateY(1rpx);
box-shadow: 0 4rpx 10rpx rgba(102, 126, 234, 0.4);
background: linear-gradient(135deg, #5a67d8 0%, #6b46c1 100%);
}
</style>

178
components/share/README.md Normal file
View File

@ -0,0 +1,178 @@
# 分享组件说明
## SpecialSharePage 组件
特殊场景分享页面组件通过接口获取base64格式的背景图片。
### 主要特性
- 📱 **响应式**:适配各种屏幕尺寸
- 🎨 **可定制**:支持样式自定义
- 🔄 **重试机制**:支持接口调用失败时的重试
- 🌐 **接口获取**:自动通过接口获取背景图片
- 🖼️ **Base64支持**接口返回base64格式的背景图片
### 使用方法
```vue
<template>
<SpecialSharePage
:qrCodeImage="base64QrCodeImage"
:userInfo="userInfo"
:isLoaded="true"
@share-generated="handleShareGenerated"
@background-image-error="handleError"
@background-image-retry="handleRetry"
/>
</template>
<script>
import SpecialSharePage from '@/components/share/SpecialSharePage.vue'
export default {
components: {
SpecialSharePage,
},
data() {
return {
base64QrCodeImage:
'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEAAQAAAADK...',
userInfo: {
memberCode: '12345678',
},
}
},
methods: {
handleShareGenerated(dataUrl) {
console.log('生成的分享图片:', dataUrl)
// 处理生成的图片
},
handleError(error) {
console.error('背景图片错误:', error)
},
handleRetry(retryCount) {
console.log('背景图片重试:', retryCount)
},
},
}
</script>
```
### Props
| 参数 | 类型 | 默认值 | 说明 |
| ----------------------- | ------- | ------ | ------------------------ |
| `qrCodeImage` | String | '' | 二维码图片base64格式 |
| `userInfo` | Object | {} | 用户信息对象 |
| `isWechat` | Boolean | false | 是否为微信环境 |
| `isLoaded` | Boolean | false | 是否加载完成 |
| `skipImageVerification` | Boolean | false | 跳过图片验证(调试用) |
### Events
| 事件名 | 参数 | 说明 |
| ------------------------ | ---------- | ---------------- |
| `share-generated` | dataUrl | 分享图片生成成功 |
| `background-image-error` | error | 背景图片加载错误 |
| `background-image-retry` | retryCount | 背景图片重试 |
### 方法
| 方法名 | 说明 |
| ------------------------------- | ------------------------------------ |
| `generateShareImage()` | 生成分享图片 |
| `retryGetBackgroundImage()` | 手动重试获取背景图 |
| `getStatusInfo()` | 获取当前状态信息(调试用) |
| `handleShareGenerated(dataUrl)` | 处理图片生成成功后的逻辑(内部方法) |
### 接口配置
组件使用 `getSharedImg` 接口获取背景图片:
```javascript
// 在 config/login.js 中配置接口
export const getSharedImg = () => {
return http.get('/api/share/background')
}
```
接口应返回以下格式:
```javascript
{
code: 200,
data: 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD...',
message: 'success'
}
```
### 调试
```javascript
// 生成分享图片
this.$refs.specialSharePage.generateShareImage()
// 手动重试获取背景图
this.$refs.specialSharePage.retryGetBackgroundImage()
// 获取当前状态信息
const status = this.$refs.specialSharePage.getStatusInfo()
console.log('组件状态:', status)
/*
输出示例:
{
specialBackgroundImage: '123456 bytes',
qrCodeImage: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEU...',
backgroundImageLoaded: true,
isLoadingBackground: false,
imageLoadRetryCount: 0,
isReady: true
}
*/
```
### 工作流程
1. **组件挂载**:自动调用 `getSharedImg` 接口获取背景图
2. **显示加载**:显示"正在获取背景图片..."状态
3. **接口响应**处理接口返回的base64背景图数据
4. **准备就绪**:背景图和二维码都准备好后可以生成分享图片
5. **生成图片**使用html2canvas截取页面生成分享图片
6. **处理结果**
- 关闭loading状态
- 显示成功提示("图片生成成功,请长按保存"
- 调用内部 `handleShareGenerated` 方法处理
- 通过 `share-generated` 事件通知父组件
### 图片生成流程
```
用户点击生成按钮
检查前置条件(二维码、背景图)
显示 "生成图片中..." loading
使用 html2canvas 截取页面
生成成功 → 关闭loading → 显示成功提示 → 发送事件
生成失败 → 关闭loading → 显示错误提示
```
### 错误处理
- **接口调用失败**自动重试最多3次
- **重试机制**:通过 `background-image-retry` 事件通知重试状态
- **最终失败**:通过 `background-image-error` 事件通知错误
### 注意事项
1. 确保 `getSharedImg` 接口返回完整的base64格式图片
2. 组件会在mounted生命周期自动调用接口
3. 支持手动重试机制,适用于网络不稳定的情况
4. 生成的图片为JPEG格式质量为100%
5. 组件支持长按保存分享图片
6. 接口失败时会显示相应的错误状态
7. **图片生成成功后会自动显示提示信息**,无需在父组件中重复处理
8. **组件内部和外部都会收到图片生成事件**,可根据需要在父组件中添加额外逻辑

View File

@ -0,0 +1,501 @@
<template>
<view ref="specialSharePage" class="special-share-page">
<!-- 特殊场景背景图片 -->
<image
class="share-bg-image"
:src="specialBackgroundImage"
mode="scaleToFill"
crossorigin="anonymous"
@load="onBackgroundImageLoad"
@error="onBackgroundImageError"
v-if="specialBackgroundImage"
></image>
<!-- 加载状态 -->
<view
class="loading-container"
v-if="!specialBackgroundImage || isLoadingBackground"
>
<view class="loader"></view>
<text class="loading-text">{{
isLoadingBackground ? '正在获取背景图片...' : '正在加载分享背景...'
}}</text>
</view>
<view
class="share-wrapper"
v-if="specialBackgroundImage && !isLoadingBackground"
>
<view class="portal-frame" :class="{ 'is-loaded': isLoaded }">
<view class="qr-code-outer special-qr-style">
<image
class="qr-code"
:src="qrCodeImage"
mode="aspectFit"
v-if="qrCodeImage"
></image>
<view v-else class="qr-code-placeholder">
<view class="loader"></view>
</view>
</view>
<text
class="member-code-text special-member-code-style"
style="
font-size: 30rpx;
color: #005bac;
font-weight: bold;
margin-top: 20rpx;
"
>{{ desensitization(userInfo.memberCode) }}</text
>
</view>
</view>
</view>
</template>
<script>
import { snapdom } from '@zumer/snapdom'
import html2canvas from 'html2canvas'
import { getSharedImg } from '@/config/login'
export default {
name: 'SpecialSharePage',
props: {
qrCodeImage: {
type: String,
default: '',
},
userInfo: {
type: Object,
default: () => ({}),
},
isWechat: {
type: Boolean,
default: false,
},
isLoaded: {
type: Boolean,
default: false,
},
// specialBackgroundImage prop
//
skipImageVerification: {
type: Boolean,
default: false,
},
},
data() {
return {
backgroundImageLoaded: false,
imageLoadRetryCount: 0,
maxRetryCount: 3,
specialBackgroundImage: '', //
isLoadingBackground: false, //
}
},
created() {
this.getBackgroundImage()
},
methods: {
desensitization(str) {
if (!str) return ''
if (str.length <= 8) return str.slice(0, 4) + '****'
const len = str.length - 6
const placeholder = '*'.repeat(len)
return str.slice(0, 4) + placeholder + str.slice(-2)
},
//
onBackgroundImageLoad() {
this.backgroundImageLoaded = true
console.log('特殊场景背景图片加载成功')
},
//
onBackgroundImageError(e) {
console.error('特殊场景背景图片加载失败:', e)
this.backgroundImageLoaded = false
this.imageLoadRetryCount++
//
if (this.imageLoadRetryCount < this.maxRetryCount) {
console.log(
`图片加载失败,重试中 (${this.imageLoadRetryCount}/${this.maxRetryCount})`
)
this.$emit('background-image-retry', this.imageLoadRetryCount)
} else {
this.$emit('background-image-error', e)
}
},
//
async getBackgroundImage() {
if (this.skipImageVerification) {
this.specialBackgroundImage = '' //
this.backgroundImageLoaded = true
return
}
if (this.specialBackgroundImage) {
// 使
this.backgroundImageLoaded = true
return
}
this.isLoadingBackground = true
try {
const result = await getSharedImg()
if (result && result.code === 200 && result.data) {
this.specialBackgroundImage =
'data:image/png;base64,' + result.data.base64
this.backgroundImageLoaded = true
} else {
this.backgroundImageLoaded = false
this.imageLoadRetryCount++
}
} catch (error) {
this.backgroundImageLoaded = false
this.imageLoadRetryCount++
if (this.imageLoadRetryCount < this.maxRetryCount) {
this.$emit('background-image-retry', this.imageLoadRetryCount)
} else {
this.$emit('background-image-error', error)
}
} finally {
this.isLoadingBackground = false
}
return this.specialBackgroundImage
},
async generateShareImage() {
// await this.getBackgroundImage()
try {
this.$nextTick(() => {
const info = uni.getSystemInfoSync()
console.log(info.platform, '.....info')
if (info.platform === 'ios') {
console.log('iOS detected, using html2canvas for capturing.')
this.capturePageWithHtml2Canvas()
} else {
console.log('Non-iOS detected, using snapdom for capturing.')
this.capturePageWithSnapDom()
}
})
} catch (error) {
uni.hideLoading()
uni.showToast({ title: '图片生成失败,请稍后重试', icon: 'none' })
}
},
// 使html2canvas (For iOS)
async capturePageWithHtml2Canvas() {
return new Promise(async (resolve, reject) => {
//
const waitForImages = async () => {
//
if (this.isLoadingBackground) {
console.log('等待背景图片接口调用完成...')
setTimeout(waitForImages, 100)
return
}
//
if (!this.backgroundImageLoaded) {
console.log('等待背景图片加载完成...')
setTimeout(waitForImages, 100)
return
}
//
if (!this.qrCodeImage) {
console.log('等待二维码生成...')
setTimeout(waitForImages, 100)
return
}
//
if (!this.specialBackgroundImage) {
console.log('等待特殊背景图片参数...')
setTimeout(waitForImages, 100)
return
}
console.log('所有图片准备就绪开始使用html2canvas截图...')
//
setTimeout(() => {
const element = this.$el
if (!element) {
uni.hideLoading()
reject(new Error('找不到组件容器'))
return
}
html2canvas(element, {
useCORS: true,
allowTaint: true,
backgroundColor: null,
scale: 2, //
dpi: 300,
width: element.offsetWidth,
height: element.offsetHeight,
})
.then(canvas => {
const dataUrl = canvas.toDataURL('image/jpeg', 1.0)
uni.hideLoading()
// this.handleShareGenerated(dataUrl)
this.$emit('share-generated', dataUrl)
resolve()
})
.catch(err => {
uni.hideLoading()
console.error('html2canvas截取失败:', err)
uni.showToast({
title: '图片生成失败,请稍后重试',
icon: 'none',
})
reject(err)
})
}, 1000)
}
//
waitForImages()
})
},
// 使snapDOM
async capturePageWithSnapDom() {
return new Promise(async (resolve, reject) => {
//
const waitForImages = async () => {
//
if (this.isLoadingBackground) {
console.log('等待背景图片接口调用完成...')
setTimeout(waitForImages, 100)
return
}
//
if (!this.backgroundImageLoaded) {
console.log('等待背景图片加载完成...')
setTimeout(waitForImages, 100)
return
}
//
if (!this.qrCodeImage) {
console.log('等待二维码生成...')
setTimeout(waitForImages, 100)
return
}
//
if (!this.specialBackgroundImage) {
console.log('等待特殊背景图片参数...')
setTimeout(waitForImages, 100)
return
}
console.log('所有图片准备就绪,开始截图...')
//
setTimeout(async () => {
const element = this.$el
if (!element) {
reject(new Error('找不到组件容器'))
return
}
try {
//
const rect = element.getBoundingClientRect()
const offsetWidth = element.offsetWidth
const offsetHeight = element.offsetHeight
const scrollWidth = element.scrollWidth
const scrollHeight = element.scrollHeight
const clientWidth = element.clientWidth
const clientHeight = element.clientHeight
//
const elementWidth = Math.max(
offsetWidth,
scrollWidth,
clientWidth,
rect.width
)
const elementHeight = Math.max(
offsetHeight,
scrollHeight,
clientHeight,
rect.height
)
setTimeout(async () => {
try {
const result = await snapdom(element, {
width: elementWidth,
height: elementHeight,
quality: 1,
compress: false,
// useProxy: true,
})
const canvas = await result.toCanvas()
const dataUrl = canvas.toDataURL('image/jpeg')
uni.hideLoading()
// this.handleShareGenerated(dataUrl)
this.$emit('share-generated', dataUrl)
resolve()
} catch (err) {
uni.hideLoading()
console.error('snapDOM截取失败:', err)
uni.showToast({
title: '图片生成失败,请稍后重试',
icon: 'none',
})
reject(err)
}
}, 500)
} catch (err) {
uni.hideLoading()
console.error('snapDOM初始化失败:', err)
uni.showToast({
title: '图片生成失败,请稍后重试',
icon: 'none',
})
reject(err)
}
}, 1000)
}
//
waitForImages()
})
},
},
}
</script>
<style lang="scss" scoped>
.special-share-page {
position: relative;
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
align-items: center;
}
/* 背景图片样式 */
.share-bg-image {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 1;
}
/* 加载状态 */
.loading-container {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
display: flex;
flex-direction: column;
align-items: center;
z-index: 2;
}
.loading-text {
margin-top: 20rpx;
font-size: 28rpx;
color: #666;
}
.share-wrapper {
position: absolute;
z-index: 2;
bottom: 22%;
display: flex;
flex-direction: column;
align-items: center;
}
.portal-frame {
padding: 32rpx;
width: 520rpx;
border-radius: 40rpx;
display: flex;
box-sizing: border-box;
flex-direction: column;
align-items: center;
margin: 0 auto;
opacity: 0;
transform: translateY(20rpx);
transition: all 0.3s ease;
}
.portal-frame.is-loaded {
opacity: 1;
transform: translateY(0);
}
/* 特殊场景二维码样式区域 - 用户自定义样式位置 */
.qr-code-outer {
width: 400rpx;
height: 400rpx;
border-radius: 20rpx;
display: flex;
align-items: center;
justify-content: center;
padding: 12rpx;
box-sizing: border-box;
}
.qr-code,
.qr-code-placeholder {
width: 100%;
height: 100%;
}
.qr-code {
border-radius: 16rpx;
}
.qr-code-placeholder {
display: flex;
align-items: center;
justify-content: center;
}
.loader {
width: 100rpx;
height: 100rpx;
border: 8rpx solid rgba(0, 0, 0, 0.1);
border-left-color: #0072ff;
border-radius: 50%;
animation: spin 1s linear infinite;
}
@keyframes spin {
to {
transform: rotate(360deg);
}
}
/* 特殊场景会员编号样式区域 - 用户自定义样式位置 */
.member-code-text {
/* 用户可以在这里自定义会员编号的样式 */
}
/* 特殊场景下的会员编号样式 */
.special-member-code-style {
/* 用户可以在这里自定义特殊场景下的会员编号样式 */
/* 例如:不同的位置、颜色、字体等 */
}
</style>

View File

@ -1,86 +1,46 @@
<!--
* @Descripttion:
* @version:
* @Author: 王三华
* @Date: 2023-06-12 17:17:03
-->
<!--
* @Descripttion:
* @version:
* @Author: kBank
* @Date: 2023-03-24 10:42:40
-->
<template>
<u-popup :show="sucShow" closeable :round="10" mode="center" @close="sucShow= false">
<view class="pop_a">
<view class="tit">
<u-icon name="checkmark-circle-fill" color="#029B00"></u-icon>
<view>{{$t('w_0158')}}</view>
<view>{{'注册成功'}}</view>
</view>
<!-- <view class="digBody">
<view class="red">{{$t('w_0159')}}
<view class="copy"
@click="onCopy">{{$t('MY_CK_27')}}</view>
</view>
<view>{{$t('CK_KS_14')}}: {{ allData.memberName }}</view>
<view>{{$t('MN_T_1')}}: {{ allData.memberCode }}</view>
<view>会员电话: {{ allData.phone }}</view>
<view>登录密码: {{ allData.loginPassword }}</view>
<view>支付密码: {{ allData.payPassword }}</view>
<view>邮箱: {{ allData.email }}</view>
<view>登录网址: {{ allData.urlAddress }}</view>
</view>
<span slot="footer"
class="dialog-footer">
<view class="btn"
@click="handleClose">{{$t('w_0035')}}</view>
<view class="hui"
@click="handleClose">取消</view>
</span> -->
<!-- <view class="tit1">{{$t('w_0159')}}</view> -->
<view class="getCode" @tap="onCopy">{{$t('MY_CK_27')}}</view>
<view class="getCode" @tap="onCopy">{{'复制'}}</view>
<view class="form">
<u--form labelPosition="left" labelWidth="80px" :model="allData" ref="uForm">
<u-form-item :label="$t('CK_KS_14')+':'" borderBottom>
<u-form-item :label="'会员姓名'+':'" borderBottom>
<u--input v-model="allData.memberName" border="none"></u--input>
</u-form-item>
<u-form-item :label="$t('MN_T_1')+':'" borderBottom>
<u-form-item :label="'会员编号'+':'" borderBottom>
<u--input v-model="allData.memberCode" border="none"></u--input>
</u-form-item>
<u-form-item :label="$t('w_0160')+':'" borderBottom>
<u-form-item :label="'会员电话'+':'" borderBottom>
<u--input v-model="allData.phone" border="none"></u--input>
</u-form-item>
<u-form-item :label="$t('w_0041')+':'" borderBottom>
<u-form-item :label="'登录密码'+':'" borderBottom>
<u--input v-model="allData.loginPassword" border="none">
</u--input>
</u-form-item>
<u-form-item :label="$t('N_I_217')+':'" borderBottom>
<u-form-item :label="'支付密码'+':'" borderBottom>
<u--input v-model="allData.payPassword" border="none">
</u--input>
</u-form-item>
<u-form-item :label="$t('w_0161')+':'" borderBottom>
<u-form-item :label="'登录网址'+':'" borderBottom>
<u--input v-model="allData.urlAddress" border="none"></u--input>
</u-form-item>
<!-- <u-form-item :label="'公众号搜索'+':'"
borderBottom>
<u--input v-model="allData.gzh"
border="none"></u--input>
</u-form-item>
<u-form-item :label="'APP(苹果)'+':'"
borderBottom>
<u--input v-model="allData.ios"
border="none"></u--input>
</u-form-item>
<u-form-item :label="'APP(安卓)'+':'"
borderBottom>
<u--input v-model="allData.android"
border="none"></u--input>
</u-form-item> -->
</u--form>
<view class="disflx">
<u-button type="success" class="uBtn" shape="circle"
color="linear-gradient(to right, #fb3024, #fb3024 )"
@tap="handleClose">{{$t('w_0035')}}</u-button>
<u-button
type="success"
class="uBtn"
shape="circle"
color="linear-gradient(to right, #005BAC, #005BAC )"
@tap="handleClose"
>
确定
</u-button>
</view>
</view>
<img class="yh" v-show="bia" src="@/static/images/yh.gif" alt="">
@ -118,38 +78,38 @@
payPw() {},
onCopy() {
let text =
this.$t('CK_KS_14') + ':' +
'会员姓名' + ':' +
this.allData.memberName +
'\n' +
this.$t('MN_T_1') + ':' +
'会员编号' + ':' +
this.allData.memberCode +
'\n' +
this.$t('w_0160') + ':' +
'会员电话' + ':' +
this.allData.phone +
'\n' +
this.$t('w_0041') + ':' +
'登录密码' + ':' +
this.allData.loginPassword +
'\n' +
this.$t('N_I_217') + ':' +
'支付密码' + ':' +
this.allData.payPassword +
'\n' +
this.$t('w_0161') + ':' +
'登录网址' + ':' +
this.allData.urlAddress
// +
// '\n' +
// this.$t('APP_ADD_7')+':' +
// ''+':' +
// this.allData.gzh+
// '\n' +
// 'APP'+`(${this.$t('APP_ADD_8')})` +
// 'APP'+`(${''})` +
// ':' +
// this.allData.ios+
// '\n' +
// 'APP'+`(${this.$t('APP_ADD_9')})` +
// 'APP'+`(${''})` +
// ':' +
// this.allData.android
this.$copyText(text).then((res) => {
uni.showToast({
title: this.$t('MY_CK_29'),
title: '复制成功',
icon: 'none',
})
})
@ -216,7 +176,7 @@
font-size: 30rpx;
font-family: Source Han Sans CN;
font-weight: bold;
color: #fb3024;
color: #005BAC;
text-align: center;
}

195
components/tabbar-test.vue Normal file
View File

@ -0,0 +1,195 @@
<template>
<view class="test-page">
<view class="test-content">
<view class="test-title">TabBar图标测试</view>
<!-- 显示当前状态 -->
<view class="status-info">
<text>当前选中: {{ currentTab }}</text>
<text>主题皮肤: {{ systemSkin }}</text>
<text>购物车数量: {{ shopCarLength || 0 }}</text>
</view>
<!-- 图标测试区域 -->
<view class="icon-test">
<view class="icon-section">
<text class="section-title">首页图标测试</text>
<view class="icon-row">
<image src="@/static/images/one1.png" class="test-icon" />
<image src="@/static/images/one2.png" class="test-icon" />
<image src="@/static/images/one11.jpg" class="test-icon" />
</view>
</view>
<view class="icon-section">
<text class="section-title">会员专区图标测试</text>
<view class="icon-row">
<image src="@/static/images/special1.png" class="test-icon" />
<image src="@/static/images/special2.png" class="test-icon" />
</view>
</view>
<view class="icon-section">
<text class="section-title">个人推广图标测试</text>
<view class="icon-row">
<image src="@/static/images/share-act.svg" class="test-icon" />
<image src="@/static/images/share.svg" class="test-icon" />
</view>
</view>
<view class="icon-section">
<text class="section-title">购物车图标测试</text>
<view class="icon-row">
<image src="@/static/images/three1.png" class="test-icon" />
<image src="@/static/images/three2.png" class="test-icon" />
<image src="@/static/images/three11.jpg" class="test-icon" />
</view>
</view>
<view class="icon-section">
<text class="section-title">我的图标测试</text>
<view class="icon-row">
<image src="@/static/images/my_icon1.png" class="test-icon" />
<image src="@/static/images/my_icon2.png" class="test-icon" />
</view>
</view>
</view>
<!-- 主题切换按钮 -->
<view class="theme-switcher">
<button @click="switchTheme" class="theme-btn">
切换主题 (当前: {{ systemSkin === 2 ? '绿色' : '默认' }})
</button>
</view>
</view>
<!-- 使用修复后的TabBar -->
<RaisedTabbar :current="currentTab" @change="handleTabChange" />
</view>
</template>
<script>
import RaisedTabbar from './raised-tabbar.vue'
import { mapGetters } from 'vuex'
export default {
name: 'TabbarTest',
components: {
RaisedTabbar,
},
data() {
return {
currentTab: 0,
}
},
computed: {
...mapGetters(['shopCarLength', 'user']),
systemSkin() {
return this.user?.skin || 0
},
},
methods: {
handleTabChange(index) {
this.currentTab = index
console.log('Tab切换到:', index)
},
switchTheme() {
// Vuex
if (this.user) {
this.$store.commit('updateUserSkin', this.systemSkin === 2 ? 0 : 2)
}
},
},
}
</script>
<style lang="scss" scoped>
.test-page {
min-height: 100vh;
background: #f8f9fa;
padding-bottom: 100px;
}
.test-content {
padding: 40rpx;
}
.test-title {
font-size: 36rpx;
font-weight: bold;
text-align: center;
color: #333;
margin-bottom: 40rpx;
}
.status-info {
background: white;
border-radius: 16rpx;
padding: 30rpx;
margin-bottom: 40rpx;
box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.08);
text {
display: block;
font-size: 28rpx;
color: #666;
margin-bottom: 10rpx;
&:last-child {
margin-bottom: 0;
}
}
}
.icon-test {
background: white;
border-radius: 16rpx;
padding: 30rpx;
margin-bottom: 40rpx;
box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.08);
}
.icon-section {
margin-bottom: 40rpx;
&:last-child {
margin-bottom: 0;
}
}
.section-title {
font-size: 28rpx;
font-weight: bold;
color: #333;
margin-bottom: 20rpx;
display: block;
}
.icon-row {
display: flex;
align-items: center;
gap: 20rpx;
}
.test-icon {
width: 60rpx;
height: 60rpx;
border: 2rpx solid #eee;
border-radius: 8rpx;
background: #f9f9f9;
}
.theme-switcher {
text-align: center;
}
.theme-btn {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
border: none;
border-radius: 50rpx;
padding: 20rpx 40rpx;
font-size: 28rpx;
font-weight: bold;
}
</style>

View File

@ -1,275 +0,0 @@
<template>
<view class="main">
<!-- 推荐达人 -->
<u-popup :show="drShow" :round="10" mode="center" @close="closeShow" closeable>
<view class="uni-margin-wrap">
<swiper class="swiper" circular :indicator-dots="indicatorDots" :autoplay="autoplay"
:interval="interval" :duration="duration">
<swiper-item>
<view class="swiper-item">
<view class="title-con">{{ $t("S_L_12") }}</view>
<view class="screen">
<view class="screen-view" @click="screenTaps(index, item)"
v-for="(item, index) in screenList"
:style="remIndex == item.id ? 'font-weight:bold' : ''">
{{ item.name }}
</view>
</view>
<view class="tjClass" v-for="(item, index) in tjList">
<view class="styleColors">NO.0{{ item.rank }}</view>
<img class="avatar" v-if="item.headPath" :src="item.headPath" />
<image class="avatar" v-else src="@/static/images/avatar.png" />
<view class="user-name">{{ item.memberName }}</view>
</view>
</view>
</swiper-item>
<swiper-item>
<view class="swiper-item">
<view class="title-con">{{ $t("S_L_13") }}</view>
<view class="screen">
<view class="screen-view" @click="screenTaps1(index, item)"
v-for="(item, index) in screenList1"
:style="remIndex1 == item.id ? 'font-weight:600' : ''">
{{ item.name }}
</view>
</view>
<view class="tjClass" v-for="(item, index) in ksList">
<view class="styleColors">NO.0{{ item.rank }}</view>
<img class="avatar" v-if="item.headPath" :src="item.headPath" />
<image class="avatar" v-else src="@/static/images/avatar.png" />
<view class="user-name">{{ item.memberName }}</view>
</view>
</view>
</swiper-item>
</swiper>
</view>
</u-popup>
</view>
</template>
<script>
import * as my from '@/config/mine.js'
// import Swiper from "swiper";
export default {
name: "talentList",
props: {
drShow: {
type: Boolean,
default: false
}
},
data() {
return {
screenList: [{
name: this.$t("S_L_18"),
id: 6
},
{
name: this.$t("S_L_19"),
id: 5
},
{
name: this.$t("S_L_20"),
id: 4
},
],
screenList1: [{
name: this.$t("S_L_18"),
id: 9
},
{
name: this.$t("S_L_19"),
id: 8
},
{
name: this.$t("S_L_20"),
id: 7
},
],
remIndex: 6, //
remIndex1: 9, //
tjList: [],
ksList: [],
indicatorDots: true,
autoplay: false,
interval: 2000,
duration: 500
};
},
mounted() {
this.getUserTj();
this.getUserKs()
},
methods: {
closeShow(){
this.$emit('closeShow')
},
screenTaps(index, item) {
this.remIndex = item.id;
this.getUserTj();
},
screenTaps1(index, item) {
this.remIndex1 = item.id;
this.getUserKs();
},
getUserTj() {
my.recommend({
wallType: this.remIndex
}).then((res) => {
this.tjList = res.rows;
});
},
getUserKs() {
my.repurchase({
wallType: this.remIndex1
}).then((res) => {
this.ksList = res.rows;
});
},
}
}
</script>
<style lang="scss" scoped>
.uni-margin-wrap {
width: 690rpx;
height:800rpx;
.swiper {
height: 800rpx;
.swiper-item {
display: block;
text-align: center;
.title-con {
font-size: 36rpx;
font-family: Source Han Sans CN;
font-weight: bold;
color: #282828;
margin: 60rpx 0;
}
.screen {
display: flex;
align-items: center;
justify-content: center;
.screen-view {
margin: 0 50rpx;
cursor: pointer;
font-size: 30rpx;
font-family: Source Han Sans CN;
color: #282828;
}
}
.tjClass {
display: flex;
align-items: center;
margin-top: 30rpx;
justify-content: center;
.styleColors {
font-size: 26rpx;
font-family: Source Han Sans CN;
font-weight: bold;
color: #FB3024;
}
.avatar {
width: 124rpx;
height: 124rpx;
border-radius: 50%;
margin-top: 10rpx;
margin: 0 30rpx;
}
.user-name {
font-size: 32rpx;
font-family: Source Han Sans CN;
font-weight: 400;
color: #282828;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
}
}
}
.swiper-container {
.swiper-slide {
width: 650rpx;
padding-bottom: 40rpx;
background: #ffffff;
text-align: center;
.title-con {
font-size: 36rpx;
font-family: Source Han Sans CN;
font-weight: bold;
color: #282828;
margin: 60rpx 0;
}
.screen {
display: flex;
align-items: center;
justify-content: center;
.screen-view {
margin: 0 50rpx;
cursor: pointer;
font-size: 30rpx;
font-family: Source Han Sans CN;
color: #282828;
}
}
.tjClass {
display: flex;
align-items: center;
margin-top: 30rpx;
justify-content: center;
.styleColors {
font-size: 26rpx;
font-family: Source Han Sans CN;
font-weight: bold;
color: #FB3024;
}
.avatar {
width: 124rpx;
height: 124rpx;
border-radius: 50%;
margin-top: 10rpx;
margin: 0 30rpx;
}
.user-name {
font-size: 32rpx;
font-family: Source Han Sans CN;
font-weight: 400;
color: #282828;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
}
}
</style>

View File

@ -1,15 +1,4 @@
<!--
* @Descripttion:
* @version:
* @Author: 王三华
* @Date: 2024-06-25 11:38:37
-->
<!--
* @Descripttion:
* @version:
* @Author: 王三华
* @Date: 2023-06-25 20:05:35
-->
<template>
<u-popup :show="agreeMent"
:closeable="true"
@ -364,8 +353,8 @@ font-size:6.0000pt;"><font face="宋体">日</font></span></b><span style="mso-s
<u-button type="success"
class="uBtn"
shape="circle"
color="linear-gradient(to right, #fb3024, #fb3024 )"
@tap="agreeMent=false">{{$t('w_0035')}}</u-button>
color="linear-gradient(to right, #005BAC, #005BAC )"
@tap="agreeMent=false">{{'确定'}}</u-button>
</view>
</view>

View File

@ -60,7 +60,7 @@
.act {
color: #FFFFFF;
background: #C8161D;
background: #005BAC;
}

View File

@ -1,25 +1,20 @@
<!--
* @Descripttion:
* @version:
* @Author: 王三华
* @Date: 2023-07-28 16:30:26
-->
<template>
<view>
<view v-for="(item,index) in data" :key="item.id">
<view class="thetree">
<view @click="toggleNode(index)" class="arrow"
v-if="!expanded && item.children && item.children.length > 0">
<u-icon size="56rpx" color="#ee252a" name="plus-circle"></u-icon>
<u-icon size="56rpx" color="#005BAC" name="plus-circle"></u-icon>
</view>
<view @click="toggleNode(index)" class="arrow"
v-if="expanded && item.children && item.children.length > 0">
<u-icon size="56rpx" color="#ee252a" name="minus-circle"></u-icon>
<u-icon size="56rpx" color="#005BAC" name="minus-circle"></u-icon>
</view>
<view class="fzbtn">
<u-button @click="copyText(item.splice)" class='thebtn' size="small" :text="$t('MY_CK_27')"></u-button>
<u-button @click="copyText(item.splice)" class='thebtn' size="small" :text="'复制'"></u-button>
</view>
<view class="maintree">{{ item.splice }}</view>
@ -54,7 +49,7 @@
copyText(text){
this.$copyText(text).then((res) => {
uni.showToast({
title: this.$t('MY_CK_29'),
title: '复制成功',
icon: 'none',
})
})

View File

@ -1,9 +1,4 @@
<!--
* @Descripttion:
* @version:
* @Author: 王三华
* @Date: 2023-07-28 16:30:26
-->
<template>
<view>
<!-- 身份证 -->
@ -72,7 +67,7 @@
this.fileList.push({
...item,
status: 'uploading',
message: this.$t('PER_DA_47')
message: '上传中'
})
})
for (let i = 0; i < lists.length; i++) {

View File

@ -0,0 +1,165 @@
<template>
<u-modal
:show="show"
:showConfirmButton="true"
:showCancelButton="false"
confirmText="我知道了"
@confirm="handleConfirm"
:closeOnClickOverlay="false"
width="640rpx"
:customStyle="{ 'border-radius': '16rpx' }"
>
<view class="withdrawal-guide-content">
<view class="guide-title">提现绑定操作指南</view>
<view class="guide-text">
<text>尊敬的经销商伙伴们</text>
<text
>为保障大家能够顺利快捷地进行提现操作同时积极响应并符合十一后国家法律法规的最新要求现需各位经销商伙伴完成提现绑定操作以下是详细的操作步骤请大家按照顺序依次进行</text
>
</view>
<view class="guide-steps">
<view class="step-item">
<text class="step-number">1.</text>
<text class="step-text"
>扫码进入签约页面使用微信扫描指定二维码进入相关操作界面后点击去签约</text
>
</view>
<view class="step-item">
<text class="step-number">2.</text>
<text class="step-text"
>在线签约在跳转的页面中找到并点击在线签约选项同意隐私政策仔细阅读隐私政策申明确认无误后点击同意并继续</text
>
</view>
<view class="step-item">
<text class="step-number">3.</text>
<text class="step-text"
>绑定手机号码输入绑卡人的手机号码获取验证码将收到的验证码准确输入后点击下一步</text
>
</view>
<view class="step-item">
<text class="step-number">4.</text>
<text class="step-text"
>上传身份证照片可选择现场拍摄身份证正反面照片或从手机相册中选取已保存的身份证正反面照片进行上传上传完成后点击下一步</text
>
</view>
<view class="step-item">
<text class="step-number">5.</text>
<text class="step-text"
>输入银行卡号准确输入银行卡号系统将提示签约成功随后自动跳转到协议页面</text
>
</view>
<view class="step-item">
<text class="step-number">6.</text>
<text class="step-text"
>完成手写签名在协议页面的最下方进行手写签名操作签名完成后即完成整个签约流程</text
>
</view>
</view>
<view class="guide-footer">
<text
>请大家务必尽快办理提现绑定操作以免影响后续的提现业务若在操作过程中遇到任何疑问或困难可随时与我们联系我们将竭诚为大家提供帮助感谢大家的理解与配合</text
>
</view>
<view class="qr-code-section">
<image
class="qr-code-image"
src="@/static/images/qr-code.png"
mode="aspectFit"
/>
</view>
</view>
</u-modal>
</template>
<script>
export default {
name: 'WithdrawalGuide',
props: {
show: {
type: Boolean,
default: false,
},
},
methods: {
handleConfirm() {
this.$emit('confirm')
},
},
}
</script>
<style lang="scss" scoped>
.withdrawal-guide-content {
padding: 0rpx 20rpx 20rpx;
height: 80vh;
overflow-y: auto;
.guide-title {
font-size: 32rpx;
font-weight: bold;
color: #333333;
text-align: center;
margin-bottom: 32rpx;
}
.guide-text {
font-size: 26rpx;
color: #666666;
line-height: 40rpx;
margin-bottom: 24rpx;
text {
display: block;
margin-bottom: 16rpx;
&:last-child {
margin-bottom: 0;
}
}
}
.guide-steps {
margin-bottom: 24rpx;
.step-item {
display: flex;
align-items: flex-start;
margin-bottom: 16rpx;
.step-number {
color: #005bac;
font-size: 26rpx;
font-weight: bold;
width: 32rpx;
flex-shrink: 0;
}
.step-text {
font-size: 26rpx;
color: #666666;
line-height: 40rpx;
flex: 1;
}
}
}
.guide-footer {
font-size: 26rpx;
color: #666666;
line-height: 40rpx;
margin-bottom: 32rpx;
text-align: center;
}
.qr-code-section {
display: flex;
justify-content: center;
align-items: center;
.qr-code-image {
width: 200rpx;
height: 200rpx;
border-radius: 8rpx;
}
}
}
</style>

View File

@ -1,9 +1,4 @@
/*
* @Descripttion:
* @version:
* @Author: 王三华
* @Date: 2023-07-01 11:08:55
*/
const http = uni.$u.http
//活动列表

View File

@ -1,9 +1,4 @@
/*
* @Descripttion:
* @version:
* @Author: 王三华
* @Date: 2023-06-12 11:40:34
*/
const http = uni.$u.http
//认证详情

View File

@ -1,9 +1,4 @@
/*
* @Descripttion:
* @version:
* @Author: 王三华
* @Date: 2023-05-18 09:23:47
*/
import Cookies from 'js-cookie'
const TokenKey = 'Admin-Token'
@ -13,7 +8,7 @@ export function getToken() {
return Cookies.get(TokenKey)
}
export function setToken(token, expires) {
return Cookies.set(TokenKey, token, { expires: expires })
return Cookies.set(TokenKey, token)
}
export function removeToken() {
return Cookies.remove(TokenKey)

View File

@ -1,202 +1,236 @@
const http = uni.$u.http
// 钱包余额
export const getWalletBalance = (params) => http.get('/member/api/wallet/balance', {
params
})
export const getWalletBalance = params =>
http.get('/member/api/wallet/balance', {
params,
})
//提现账户
export const getPkBdAccountList = (params) => http.get('/system/api/account/pkBdAccountList', {
params
})
//提现账户
export const getPkBdAccountList = params =>
http.get('/system/api/account/pkBdAccountList', {
params,
})
//提现选择银行卡
export const getDefaultBank = (params) => http.get('/member/api/bank/default-bank', {
params
})
//校验是否绑定银行卡
export const checkIsbindBank = (params) => http.get('/member/api/bank/is-bind', {
params
})
export const getDefaultBank = params =>
http.get('/member/api/bank/default-bank', {
params,
})
//提现页面展示
export const getWidthdrawShow = (params) => http.get('/member/api/withdraw/show/add', {
params
})
export const getWidthdrawShow = params =>
http.get('/member/api/withdraw/show/add', {
params,
})
//确认提现
export const addWithdraw = (params) => http.post('/member/api/withdraw/add', params)
export const addWithdraw = params =>
http.post('/member/api/withdraw/add', params)
//提现明细列表
export const getWithdrawList = (params) => http.get('/member/api/withdraw/list-detail', {
params
})
export const getWithdrawList = params =>
http.get('/member/api/withdraw/list-detail', {
params,
})
//提现撤销
export const cancelWithdraw = (params) => http.get('/member/api/withdraw/cancel', {
params
})
export const cancelWithdraw = params =>
http.get('/member/api/withdraw/cancel', {
params,
})
//获取转账转出账户
export const getTransferAccount = (params) => http.get('/member/api/transfer/transfer-account', {
params
})
export const getTransferAccount = params =>
http.get('/member/api/transfer/transfer-account', {
params,
})
//根据用户编号查询用户姓名
export const getTransferChineseName = (params) => http.get('/member/api/transfer/chinese-name', {
params
})
export const getTransferChineseName = params =>
http.get('/member/api/transfer/chinese-name', {
params,
})
//查询选择账户可转账余额
export const getTransferMember = (params) => http.get('/member/api/transfer/member-balance', {
params
})
export const getTransferMember = params =>
http.get('/member/api/transfer/member-balance', {
params,
})
//确认转账
export const addTransfer = (params) => http.post('/member/api/transfer/add', params)
export const addTransfer = params =>
http.post('/member/api/transfer/add', params)
//钱包银行卡列表
export const getBankList = (params) => http.get('/member/api/bank/list', {
params
})
export const getBankList = params =>
http.get('/member/api/bank/list', {
params,
})
//解除绑定
export const removeBankBind = (params) => http.get('/member/api/bank/unbind-bank', {
params
})
export const removeBankBind = params =>
http.get('/member/api/bank/unbind-bank', {
params,
})
//获取银行验证码
export const getVerification = (params) => http.get('/member/api/sms/verification', {
params
})
export const getVerification = params =>
http.get('/member/api/sms/verification', {
params,
})
//绑定银行卡校验
export const verifyBankCard = (params) => http.post('/member/api/bank/verify-bank-card', params)
export const verifyBankCard = params =>
http.post('/member/api/bank/verify-bank-card', params)
//是否配置白名单 白名单不进行银行卡四要素校验
export const checkIfWhite = (params) => http.get('/member/api/bank/is-white-list', {
params
})
export const checkIfWhite = params =>
http.get('/member/api/bank/is-white-list', {
params,
})
//银行卡选择下拉选
export const getBankCardChoiceList = (params) => http.get('/system/api/bank/list', {
params
})
export const getBankCardChoiceList = params =>
http.get('/system/api/bank/list', {
params,
})
//钱包绑卡
export const bindWalletBankAdd = (params) => http.post('/member/api/bank/add', params)
export const bindWalletBankAdd = params =>
http.post('/member/api/bank/add', params)
// 交易明细
export const getTransactionDetails = (params) => http.post('/member/api/wallet/transaction-details?pageNum=' + params
.pageNum + "&pageSize=" + params.pageSize, params)
export const getTransactionDetails = params =>
http.post(
'/member/api/wallet/transaction-details?pageNum=' +
params.pageNum +
'&pageSize=' +
params.pageSize,
params
)
//交易类型下拉选
export const getTradeTypeList = (params) => http.get('/member/api/wallet/trade-type', {
params
})
export const getTradeTypeList = params =>
http.get('/member/api/wallet/trade-type', {
params,
})
//币种-账户类型下拉选
export const getEnumsAccountList = (params) => http.get('/system/api/account/pkBdAccountList', {
params
})
export const getEnumsAccountList = params =>
http.get('/system/api/account/pkBdAccountList', {
params,
})
//意见反馈类型
export const getFeedbackType = (params) => http.get('/system/pub/enums/feedback-type', {
params
})
export const getFeedbackType = params =>
http.get('/system/pub/enums/feedback-type', {
params,
})
//提交意见反馈列表
export const saveFeedBack = (params) => http.post('/system/api/feedback/save', params)
export const saveFeedBack = params =>
http.post('/system/api/feedback/save', params)
// 公告、站内信、意见反馈数
export const getNoticeCount = (params) => http.get('/system/api/notice/index-count', {
params
})
export const getNoticeCount = params =>
http.get('/system/api/notice/index-count', {
params,
})
// 公告站内信列表 公告1站内信2
export const getNoticeList = (params) => http.get('/system/api/notice/index-list', {
params
})
export const getNoticeList = params =>
http.get('/system/api/notice/index-list', {
params,
})
//意见列表
export const getFeedbackList = (params) => http.get('/system/api/feedback/index-list', {
params
})
export const getFeedbackList = params =>
http.get('/system/api/feedback/index-list', {
params,
})
//获取公告、站内信详情
export const getNoticeDetail = (params) => http.get('/system/api/notice/index-detail', {
params
})
export const getNoticeDetail = params =>
http.get('/system/api/notice/index-detail', {
params,
})
//二级密码校验
export const checkPwd = (params) => http.get('/member/api/recharge/check-pwd', {
params
})
export const checkPwd = params =>
http.get('/member/api/recharge/check-pwd', {
params,
})
//是否进行实名认证
export const getIfAuth = (params) => http.get('/member/api/authentication/is-auth', {
params
})
export const getIfAuth = params =>
http.get('/member/api/authentication/is-auth', {
params,
})
//证件类型
export const getCardType = (params) => http.get('/system/pub/enums/id-type', {
params
})
export const getCardType = params =>
http.get('/system/pub/enums/id-type', {
params,
})
//实名认证
export const addAuthentication = (params) => http.post('/member/api/authentication/add', params)
export const addAuthentication = params =>
http.post('/member/api/authentication/add', params)
//上传图片
export const getUploadUrl = (params) => http.post('/system/upload', params)
export const getUploadUrl = params => http.post('/system/upload', params)
//成长之路-等级
export const getGrowUpGrade = (params) => http.get('/member/api/member-footmark/grow-up-footmark-grade', {
params
})
export const getGrowUpGrade = params =>
http.get('/member/api/member-footmark/grow-up-footmark-grade', {
params,
})
//成长之路-奖衔
export const getGrowUpAwards = (params) => http.get('/member/api/member-footmark/grow-up-footmark-awards', {
params
})
export const getGrowUpAwards = params =>
http.get('/member/api/member-footmark/grow-up-footmark-awards', {
params,
})
//是否上传营业执照
export const getIsExist = (params) => http.get('/member/api/business/license/is-exist', {
params
})
export const getIsExist = params =>
http.get('/member/api/business/license/is-exist', {
params,
})
//上传营业执照
export const addLicense = (params) => http.post('/member/api/business/license/add', params)
export const addLicense = params =>
http.post('/member/api/business/license/add', params)
//营业执照详情
export const getLicenseDetail = (params) => http.get('/member/api/business/license/detail', {
params
})
export const getLicenseDetail = params =>
http.get('/member/api/business/license/detail', {
params,
})
//修改营业执照
export const updateLicense = (params) => http.post('/member/api/business/license/update', params)
export const updateLicense = params =>
http.post('/member/api/business/license/update', params)
//ocr
export const ocrIdCard = (params) => http.post('/member/api/authentication/invoke-idCard', params)
export const ocrIdCard = params =>
http.post('/member/api/authentication/invoke-idCard', params)
//ocrBack
export const ocrIdCardBack = (params) => http.post('/member/api/authentication/invoke-idCard-back', params)
export const ocrIdCardBack = params =>
http.post('/member/api/authentication/invoke-idCard-back', params)
//实名认证详情
export const authenticationDetails = (params) => http.get('/member/api/authentication/detail', {
params
})
export const authenticationDetails = params =>
http.get('/member/api/authentication/detail', {
params,
})
//实名认证详情续约用
export const agreementName = (params) => http.get('/member/api/authentication/agreement-real-name', {
params
})
export const agreementName = params =>
http.get('/member/api/authentication/agreement-real-name', {
params,
})
//设置默认银行卡
export const updateDefault = (params) => http.get('/member/api/bank/update-default', {
params
})
export const updateDefault = params =>
http.get('/member/api/bank/update-default', {
params,
})

View File

@ -1,9 +1,4 @@
/*
* @Descripttion:
* @version:
* @Author: 王三华
* @Date: 2023-05-18 14:45:00
*/
const http = uni.$u.http

View File

@ -1,55 +1,57 @@
/*
* @Descripttion:
* @version:
* @Author: 王三华
* @Date: 2023-09-11 08:48:58
*/
const http = uni.$u.http
//安置图
export const getPlaceMent = (params) => http.get('/member/api/achieve/query-place-tree', {params})
export const getPlaceMent = params =>
http.get('/member/api/achieve/query-place-tree', { params })
//安置图详情
export const getTreeDetail = (data) => http.post('/member/api/achieve/query-place-tree-detail', data)
export const getTreeDetail = data =>
http.post('/member/api/achieve/query-place-tree-detail', data)
//安置图上方等级
export const getAvatarInfo = (params) => http.get('/member/api/member-structure/get-avatar-info', {params})
export const getAvatarInfo = params =>
http.get('/member/api/member-structure/get-avatar-info', { params })
//安置图
export const getDayType = (params) => http.get('/system/pub/enums/get-day-type', {params})
export const getDayType = params =>
http.get('/system/pub/enums/get-day-type', { params })
//获取安置业绩分布
export const azAchievement = (params) => http.get('/report/api/achieve/az-achievement', {params})
export const azAchievement = params =>
http.get('/report/api/achieve/az-achievement', { params })
//获取安置业绩分布
export const getPerformance = (params) => http.get('/member/api/achieve/query-real-performance', {params})
//获取真实业绩分布
export const realPerformancePic = (params) => http.get('/member/api/achieve/query-real-performance-pic', {params})
export const getPerformance = params =>
http.get('/member/api/achieve/query-real-performance', { params })
//获取推荐列表
export const parentList = (params) => http.get('/member/api/member/parent-list', {params})
export const parentList = params =>
http.get('/member/api/member/parent-list', { params })
//获取平均时长
export const getMemberRecommend = (params) => http.get('/member/api/census/get-member-recommend-time', {params})
export const getMemberRecommend = params =>
http.get('/member/api/census/get-member-recommend-time', { params })
//获取直推业绩左侧
export const parentAchieveLeft = (data) => http.post('/member/api/achieve/parent-achieve-left', data)
export const parentAchieveLeft = data =>
http.post('/member/api/achieve/parent-achieve-left', data)
//获取直推业绩右侧
export const parentAchieveRight = (data) => http.post('/member/api/achieve/parent-achieve-right',data)
export const parentAchieveRight = data =>
http.post('/member/api/achieve/parent-achieve-right', data)
//获取等级
export const systemGrandeRange = (params) => http.get('/system/manage/grade/gradeRanglist', {params})
export const systemGrandeRange = params =>
http.get('/system/manage/grade/gradeRanglist', { params })
//新增业绩统计
export const getPlaceNewAddAchieve = (params) => http.get('/member/api/achieve/place-new-add-achieve-stat', {params})
export const getPlaceNewAddAchieve = params =>
http.get('/member/api/achieve/place-new-add-achieve-stat', { params })
//获取业绩类型
export const getYjList = (params) => http.get('/system/pub/enums/achievement-type-member', {params})
export const getYjList = params =>
http.get('/system/pub/enums/achievement-type-member', { params })
//月度业绩左右区业绩详情
export const getAchieveDetails = (params) => http.get('/member/api/achieve/place-new-add-achieve-details', {params})
export const getAchieveDetails = params =>
http.get('/member/api/achieve/place-new-add-achieve-details', { params })

View File

@ -1,87 +1,119 @@
/*
* @Descripttion:
* @version:
* @Descripttion:
* @version:
* @Author: kBank
* @Date: 2022-11-23 11:10:29
*/
/*
* @Descripttion:
* @version:
* @Author: kBank
* @Date: 2022-11-23 11:10:29
*/
* @Descripttion:
* @version:
* @Author: kBank
* @Date: 2022-11-23 11:10:29
*/
const http = uni.$u.http
//商品列表
export const getAllGoods = (params) => http.post('/sale/api/wares/query-spe-wares', params)
export const getAllGoods = params =>
http.post('/sale/api/wares/query-spe-wares', params)
//商品详情
export const waresDetail = (params) => http.post('/sale/api/wares/query-spe-wares-detail', params)
export const waresDetail = params =>
http.post('/sale/api/wares/query-spe-wares-detail', params)
//嗨粉海粉短信
export const verification = (params) => http.get('/member/api/sms/fans-verification', { params })
export const verification = params =>
http.get('/member/api/sms/fans-verification', { params })
//嗨粉选择省市区
export const getAllAreaList = (params) => http.get('system/api/area/provinceList', { params })
export const getAllAreaList = params =>
http.get('system/api/area/provinceList', { params })
//嗨粉选择国家
export const getCountry = (params) => http.get('system/api/country/list', { params })
export const getCountry = params =>
http.get('system/api/country/list', { params })
//海粉注册
export const regShareMember = (params) => http.post('/member/api/member/reg-share-member', params)
export const regShareMember = params =>
http.post('/member/api/member/reg-share-member', params)
//hi粉注册
export const hiRegister = (params) => http.post('/member/api/fans/register', params)
export const hiRegister = params =>
http.post('/member/api/fans/register', params)
//幂等性
export const generate = (params) => http.get('/system/api/idempotent/generate', { params })
export const generate = params =>
http.get('/system/api/idempotent/generate', { params })
//发货
export const deliveryList = (params) => http.get('/system/pub/enums/delivery-list', { params })
export const deliveryList = params =>
http.get('/system/pub/enums/delivery-list', { params })
//海粉渠道
export const jxhhSource = (params) => http.get('/sale/api/t-source/list/' + params)
export const jxhhSource = params =>
http.get('/sale/api/t-source/list/' + params)
//海粉分类
export const optionList = (params) => http.post('/sale/api/twares-category-category/option-list', params )
export const optionList = params =>
http.post('/sale/api/twares-category-category/option-list', params)
//海粉商品
export const sharingWares = (params) => http.get('/sale/api/wares/sharing-zone-wares', { params })
export const sharingWares = params =>
http.get('/sale/api/wares/sharing-zone-wares', { params })
//分享邮费查询
export const queryAdressPostage = (params) => http.post('/sale/api/order/self-order-postage', params)
export const queryAdressPostage = params =>
http.post('/sale/api/order/self-order-postage', params)
//嗨粉分享确认订单
export const confirmFunShareOrder = (params) => http.post('/sale/api/order/confirm-self-fun-order', params)
export const confirmFunShareOrder = params =>
http.post('/sale/api/order/confirm-self-fun-order', params)
//海粉商品详情
export const sharingWaresDetail = (params) => http.get('/sale/api/wares/query-spe-sharing-wares-detail', { params })
export const sharingWaresDetail = params =>
http.get('/sale/api/wares/query-spe-sharing-wares-detail', { params })
//海粉订单确认
export const confirmShareOrder = (params) => http.post('/sale/api/order/confirm-share-order', params)
export const confirmShareOrder = params =>
http.post('/sale/api/order/confirm-share-order', params)
//获取购物车
export const getShopping = (params) => http.get('/sale/api/shopping/getShopping', { params })
export const getShopping = params =>
http.get('/sale/api/shopping/getShopping', { params })
//分类列表
export const classifyList = (params) => http.get('/sale/api/area-classify/list', { params })
export const classifyList = params =>
http.get('/sale/api/area-classify/list', { params })
//加减购物车
export const plusReduceShopping = (params) => http.post('/sale/api/shopping/plusReduceShopping', params)
export const plusReduceShopping = params =>
http.post('/sale/api/shopping/plusReduceShopping', params)
//多删购物车
export const batchDelShopping = (params) => http.post('/sale/api/shopping/batchDelShopping', params)
export const batchDelShopping = params =>
http.post('/sale/api/shopping/batchDelShopping', params)
//添加购物车
export const addShopping = (params) => http.post('/sale/api/shopping/addShopping', params)
export const addShopping = params =>
http.post('/sale/api/shopping/addShopping', params)
//菜单权限
export const menuList = (params) => http.get('/system/api/menu/list', { params })
export const menuList = params => http.get('/system/api/menu/list', { params })
//海粉分享
export const shareCode = (params) => http.get('/member/api/share/share-code-h5', { params })
export const shareCode = params =>
http.get('/member/api/share/share-code-h5', { params })
//嗨粉分享
export const fansCode = (params) => http.get('/member/api/share/fans-code-h5', { params })
export const fansCode = params =>
http.get('/member/api/share/fans-code-h5', { params })
//获取购物车数量
export const getShoppingCount = (params) => http.get('/sale/api/shopping/getShoppingCount', { params })
export const getShoppingCount = params =>
http.get('/sale/api/shopping/getShoppingCount', { params })
//获取购物车数小
export const getSmallCount = (params) => http.get('/sale/api/shopping/getAreaShoppingCount', { params })
export const getSmallCount = params =>
http.get('/sale/api/shopping/getAreaShoppingCount', { params })
//获取分享前缀
export const prefix = (params) => http.get('/member/api/member/query-country-prefix/' + params, )
export const prefix = params =>
http.get('/member/api/member/query-country-prefix/' + params)
//校验分享编号
export const validateMember = (params) => http.get('/member/api/member/validate-share-member/' + params, )
export const validateMember = params =>
http.get('/member/api/member/validate-share-member/' + params)
//获取国家
export const currencyList = (params) => http.get('/system/api/country/list' , {params} )
export const currencyList = params =>
http.get('/system/api/country/list', { params })
//0元注册时
export const checkShare = (params) => http.get('/member/api/share/check-share-code' , {params} )
export const checkShare = params =>
http.get('/member/api/share/check-share-code', { params })
//海粉订单详情
export const waresinfo = (params) => http.post('/sale/api/wares/query-confirm-waresinfo', params)
//购物车注册下单校验
export const validShop = (params) => http.post('/sale/api/order/valid-enough-shop', params)
export const waresinfo = params =>
http.post('/sale/api/wares/query-confirm-waresinfo', params)
//hi粉确认订单
export const fansConfirm = (params) => http.post('/sale/api/order/fans-confirm-order', params)
export const fansConfirm = params =>
http.post('/sale/api/order/fans-confirm-order', params)
//购物车注册下单校验弹框
export const energyShop = (params) => http.post('/sale/api/wares/query-energy-silo', params)
export const energyShop = params =>
http.post('/sale/api/wares/query-energy-silo', params)
//hi粉确认订单
export const energyShopSilo = (params) => http.post('/sale/api/order/valid-silo', params)
export const energyShopSilo = params =>
http.post('/sale/api/order/valid-silo', params)

View File

@ -1,24 +1,30 @@
/*
* @Descripttion:
* @version:
* @Author: 王三华
* @Date: 2023-06-12 11:40:34
*/
const http = uni.$u.http
//首页
export const userIndex = (params) => http.get('/sale/api/wares/get-app-index', { params })
export const userIndex = params =>
http.get('/sale/api/wares/get-app-index', { params })
//修改头像
export const updateHead = (data) => http.post('/member/api/member/update-head', data)
export const updateHead = data =>
http.post('/member/api/member/update-head', data)
//提货记录列表
export const pickList = (params) => http.get('/activity/api/pick/list', { params })
export const pickList = params =>
http.get('/activity/api/pick/list', { params })
//提货专区列表
export const pickLogList = (params) => http.get('/activity/api/pick/pick-log', { params })
export const pickLogList = params =>
http.get('/activity/api/pick/pick-log', { params })
//植树活动
export const queryTreeActivity = (params) => http.get('/activity/api/sa-tree-order/queryTreeActivity', { params })
export const queryTreeActivity = params =>
http.get('/activity/api/sa-tree-order/queryTreeActivity', { params })
//创客空间列表
export const marketList = (params) => http.get('/member/api/maker-space/list', { params })
export const marketList = params =>
http.get('/member/api/maker-space/list', { params })
export const getTopPeople = params =>
http.post('/member/api/member-statistics/topPeople', params)
export const getTopAmount = params =>
http.post('/member/api/member-statistics/topAmount', params)

View File

@ -1,134 +1,134 @@
/*
* @Descripttion:
* @version:
* @Author: 王三华
* @Date: 2023-05-18 14:45:00
*/
const http = uni.$u.http
// 验证码
export const captchaImage = (params) => http.get('/code', { params })
export const captchaImage = params => http.get('/code', { params })
// 登录
export const login = (params) => http.post('/member/auth/api/login', params)
export const login = params => http.post('/member/auth/api/login', params)
//用户信息
export const getInfo = (params) => http.get('/member/api/member/get-info', { params })
export const getInfo = params =>
http.get('/member/api/member/get-info', { params })
//获取个人资料
export const getData = (params) => http.get('/member/api/member/get-data', { params })
export const getData = params =>
http.get('/member/api/member/get-data', { params })
//获取会员卡信息
export const getCard = (params) => http.get('/member/api/member/get-card', { params })
export const getCard = params =>
http.get('/member/api/member/get-card', { params })
//获取验证码
export const verification = (params) => http.get('/member/api/sms/verification', { params })
export const verification = params =>
http.get('/member/api/sms/self-verification', { params })
//忘记密码获取验证码
export const forgetVerification = (params) => http.get('/member/api/sms/forget-verification', { params })
export const forgetVerification = params =>
http.get('/member/api/sms/forget-verification', { params })
//保存地址
export const saveAddress = (data) => http.post('/member/api/member-address/save', data)
//更新邮箱
export const updateEmail = (data) => http.put('/member/api/member/update-email', data)
export const saveAddress = data =>
http.post('/member/api/member-address/save', data)
//更新密码
export const updatePassword = (data) => http.put('/member/api/member/update-password', data)
export const updatePassword = data =>
http.put('/member/api/member/update-password', data)
//忘记密码更新
export const forgetPassword = (data) => http.put('/member/api/member/forget-password', data)
export const forgetPassword = data =>
http.put('/member/api/member/forget-password', data)
//获取地址详情
export const getAddress = (params) => http.get('/member/api/member-address/detail/' + params)
export const getAddress = params =>
http.get('/member/api/member-address/detail/' + params)
//获取菜单权限
export const menuList = (data) => http.get('/system/api/menu/list', data)
export const menuList = data => http.get('/system/api/menu/list', data)
//更新个人资料
export const updateData = (data) => http.put('/member/api/member/update-data', data)
export const updateData = data =>
http.put('/member/api/member/update-data', data)
//奖金来源
export const queryBonusDetail = (data, data1) => http.post('/bonus/api/bonus/query-bonus-detail/' + data1, data)
export const queryBonusDetail = (data, data1) =>
http.post('/bonus/api/bonus/query-bonus-detail/' + data1, data)
//首购收益
export const queryBonusFirst = (data, data1) => http.post('/bonus/api/bonus/query-bonus-first/' + data1, data)
export const queryBonusFirst = (data, data1) =>
http.post('/bonus/api/bonus/query-bonus-first/' + data1, data)
//复购收益
export const queryBonusRepurchase = (data, data1) => http.post('/bonus/api/bonus/query-bonus-repurchase/' + data1, data)
//嗨粉收益
export const queryBonusHiFun = (data, data1) => http.post('/bonus/api/bonus/query-bonus-hi-fun' + data1, data)
//云代收益
export const queryBonusCloud = (data, data1) => http.post('/bonus/api/bonus/query-bonus-cloud/' + data1, data)
export const queryBonusRepurchase = (data, data1) =>
http.post('/bonus/api/bonus/query-bonus-repurchase/' + data1, data)
//复购券收益
export const queryBonusCoupon = (data, data1) => http.post('/bonus/api/bonus/query-bonus-coupon/' + data1, data)
export const queryBonusCoupon = (data, data1) =>
http.post('/bonus/api/bonus/query-bonus-coupon/' + data1, data)
//创客空间收益
export const queryBonusMaker = (data, data1) => http.post('/bonus/api/bonus/query-bonus-maker/' + data1, data)
//海粉收益
export const queryBonusHaiFun = (data, data1) => http.post('/bonus/api/bonus/query-bonus-hai-fun/' + data1, data)
export const queryBonusMaker = (data, data1) =>
http.post('/bonus/api/bonus/query-bonus-maker/' + data1, data)
//获取奖金收益类型
export const getBonusType = (params) => http.get('/system/api/bd-bonus-items/list', { params })
export const getBonusType = params =>
http.get('/system/api/bd-bonus-items/list', { params })
//获取语言下拉
export const getLanguages = (params) => http.get('/system/pub/enums/get-languages', { params })
//上传图片
export const updateFile = (params) => http.post('/system/upload', params)
export const updateFile = params => http.post('/system/upload', params)
// 退出方法
export const logout = () => http.delete('/member/auth/api/logout')
//订单数量
export const orderNum = (params) => http.get('/sale/api/my-order/num', { params })
export const orderNum = params => http.get('/sale/api/my-order/num', { params })
//获取用户是否显示弹窗
export const indexPopScreen = (params) => http.get('/system/api/notice/index-pop-screen', { params })
export const indexPopScreen = params =>
http.get('/system/api/notice/index-pop-screen', { params })
//菜单权限
export const getMenuList = (params) => http.get('/system/api/menu/list', { params })
export const getMenuList = params =>
http.get('/system/api/menu/list', { params })
//海粉默认登录H5扫码使用
export const autoLogin = (params) => http.post('/member/auth/api/auto-login', params)
//海粉商品
export const queryWares = (params) => http.post('/sale/api/wares/query-spe-wares-copy', params)
export const autoLogin = params =>
http.post('/member/auth/api/auto-login', params)
//分享列表商品
export const queryWares = params =>
http.get('/sale/api/wares/list-wares-share', { params })
//保存礼品地址
export const saveGiftAddress = (params) => http.post('/member/api/member-gift/update-gift', params)
export const saveGiftAddress = params =>
http.post('/member/api/member-gift/update-gift', params)
//获取会员真实奖衔
export const getUserAwards = (params) => http.get('/member/api/member/index-member-awards', { params })
export const getUserAwards = params =>
http.get('/member/api/member/index-member-awards', { params })
//获取安置人编号
export const fansConvertCode = (params) => http.get('/member/api/member/fans-convert-code/'+params )
export const fansConvertCode = params =>
http.get('/member/api/member/fans-convert-code/' + params)
//获取荣誉奖衔
export const getIndexAwards = (params) => http.get('/member/api/member/index-awards', { params })
export const getIndexAwards = params =>
http.get('/member/api/member/index-awards', { params })
//当前用户短信验证码
export const selfVerification = (params) => http.get('/member/api/sms/self-verification', { params })
export const selfVerification = params =>
http.get('/member/api/sms/self-verification', { params })
// 重置支付密码获取验证码
export const resetPayPasswordVerification = params =>
http.get('/member/api/sms/reset-verification', { params })
//更新支付密码
export const forgetPayPassword = (data) => http.put('/member/api/member/forget-pay-password', data)
export const forgetPayPassword = data =>
http.put('/member/api/member/forget-pay-password', data)
// 站内信弹窗
export const getIndexPopmail = (params) => http.get('/system/api/notice/index-pop-mail', { params })
export const getIndexPopmail = params =>
http.get('/system/api/notice/index-pop-mail', { params })
//站内信弹窗已读
export const getNoticeDetail = (params) => http.get('/system/api/notice/index-detail', { params })
//直推排行弹窗
export const getMemberDirectpush = (params) => http.get('/member/api/member/get-member-direct-push', { params })
export const getNoticeDetail = params =>
http.get('/system/api/notice/index-detail', { params })
//校验服务有效期
export const agreement_expire = (params) => http.get('/member/api/member/agreement_expire', { params })
//会员奖衔信息
export const memberAwards = (params) => http.get('/member/api/member/member-awards-info', { params })
//创客空间收益
export const markBonus = (params) => http.post('/bonus/api/bonus/query-mark-bonus-detail', params)
//基本信息弹框
export const index_repurchase = (params) => http.get('/member/api/member/index_repurchase', { params })
export const agreement_expire = params =>
http.get('/member/api/member/agreement_expire', { params })

View File

@ -9,62 +9,61 @@
const http = uni.$u.http
//考核明细接口
export const getAssessList = (params) => http.get('/member/api/assess/assessList', {
params
})
export const getAssessList = params =>
http.get('/member/api/assess/assessList', {
params,
})
//考核分红积分
export const getAssAchieve = (params) => http.get('/member/api/assess/assAchieve', {
params
})
export const getAssAchieve = params =>
http.get('/member/api/assess/assAchieve', {
params,
})
//考核状态复购考核
export const getAssessStatusList = (params) => http.get('/system/pub/enums/member-assess-status', {
params
})
export const getAssessStatusList = params =>
http.get('/system/pub/enums/member-assess-status', {
params,
})
//注册等级下拉选
export const getGradeList = (params) => http.get('/system/api/grade/list', {
params
})
export const getGradeList = params =>
http.get('/system/api/grade/list', {
params,
})
//注册列表
export const getRegList = (params) => http.get('/member/api/market-news/reg-list', {
params
})
export const getRegList = params =>
http.get('/member/api/market-news/reg-list', {
params,
})
//招商列表
export const tripleCycleList = (params) => http.get('/member/api/market-news/triple_cycle_list', {
params
})
//海粉列表
export const seaFlourList = (params) => http.get('/member/api/market-news/sea_flour_list', {
params
})
export const tripleCycleList = params =>
http.get('/member/api/market-news/triple_cycle_list', {
params,
})
//菜单列表
export const menuList = (params) => http.get('/system/api/menu/list', {
params
})
export const menuList = params =>
http.get('/system/api/menu/list', {
params,
})
//直推列表
export const parentList = (params) => http.get('/member/api/member/parent-list', {
params
})
export const parentList = params =>
http.get('/member/api/member/parent-list', {
params,
})
// 抗衰能量仓列表
export const getSiloList = (params) => http.post('/member/api/silo/list', params)
export const getSiloList = params => http.post('/member/api/silo/list', params)
//查询能量仓明细
export const getSiloDetail = (params) => http.post('/member/api/silo/detail', params)
export const getSiloDetail = params =>
http.post('/member/api/silo/detail', params)
// 沙棘公益列表
export const treeList = (params) => http.get('/activity/api/tree-rule-pick/member-info-list', {
params
})
export const treeList = params =>
http.get('/activity/api/tree-rule-pick/member-info-list', {
params,
})

View File

@ -1,28 +1,49 @@
/*
* @Descripttion:
* @version:
* @Author: 王三华
* @Date: 2023-09-26 10:35:29
*/
const http = uni.$u.http
//我的市场
export const getMyMarket = (params) => http.get('/sale/api/order/index-myMarket', { params })
export const getMyMarket = params =>
http.get('/sale/api/order/index-myMarket', { params })
// 我的市场点亮
export const getMyMarketColor = (params) => http.get('/system/manage/area/get-light-area', { params })
export const getMyMarketColor = params =>
http.get('/system/manage/area/get-light-area', { params })
// 礼品地址列表
export const getMemberGift = (params) => http.get('/member/api/member-gift/member-gift-list', { params })
export const getMemberGift = params =>
http.get('/member/api/member-gift/member-gift-list', { params })
//全部荣誉墙
export const getMemberHonorWallAll = (params) => http.get('/member/api/member/member-honor-wall-all', { params })
// 获取抗衰达人
export const repurchase =(params)=>http.post('/member/api/achieve/repurchase',params)
// 获取推荐达人
export const recommend =(params)=>http.post('/member/api/achieve/recommend',params)
export const getMemberHonorWallAll = params =>
http.get('/member/api/member/member-honor-wall-all', { params })
//年度奖衔
export const yearAwards = (params) => http.get('/member/api/member/year-awards-list', { params })
export const yearAwards = params =>
http.get('/member/api/member/year-awards-list', { params })
// 结余查询
export const getMemberBalance = () =>
http.get('/member/api/member-structure/az-framework')
// 退款明细列表
export const getRefundList = params =>
http.get('/sale/api/my-order/refund-list', { params })
// 退款列表接口(别名)
export const refundList = params =>
http.get('/sale/api/my-order/refund-list', { params })
// 获取是否能区域选择的资格
export const getRegionSelect = () => {
return http.get('/member/api/member/get-region')
}
// 设置区域
export const setRegion = data =>
http.post('/member/api/member/set-region', data)
// 获取可选择区域
export const getRegionAreaTree = params =>
http.get('/member/api/member/get-region-list', { params })
// 获取已有区域
export const getSelectedRegion = () =>
http.get('/member/api/member/get-all-region')

View File

@ -1,39 +1,46 @@
/*
* @Descripttion:
* @version:
* @Author: 王三华
* @Date: 2023-06-12 11:40:34
*/
const http = uni.$u.http
//支付配置
export const payConfig = (params) => http.get('/pay/config', { params })
export const payConfig = params => http.get('/pay/config', { params })
//查询订单明细
export const orderInfo = (params) => http.post('/sale/api/order/query-order', params)
export const orderInfo = params =>
http.post('/sale/api/order/query-order', params)
//订单状态
export const orderStatus = (params) => http.get('/system/pub/enums/order-status-api', { params })
export const orderStatus = params =>
http.get('/system/pub/enums/order-status-api', { params })
//计算邮费
export const pickPostAge = (params) => http.get('/activity/api/pick/postage', { params })
export const pickPostAge = params =>
http.get('/activity/api/pick/postage', { params })
//订单列表
export const orderList = (params) => http.get('/sale/api/my-order/list', { params })
export const orderList = params =>
http.get('/sale/api/my-order/list', { params })
//订单详情
export const orderDetails = (orderCode) => http.get('/sale/api/my-order/detail/' + orderCode)
export const orderDetails = orderCode =>
http.get('/sale/api/my-order/detail/' + orderCode)
//订单取消
export const cancelOrder = (orderCode) => http.delete('/sale/api/my-order/cancel/' + orderCode)
export const cancelOrder = orderCode =>
http.delete('/sale/api/my-order/cancel/' + orderCode)
//物流状态
export const expressList = (id) => http.get('/sale/api/my-order/express/' + id,)
export const expressList = id => http.get('/sale/api/my-order/express/' + id)
//校验订单状态
export const payCheck = (id) => http.get('/sale/api/my-order/pay-check/' + id,)
export const payCheck = id => http.get('/sale/api/my-order/pay-check/' + id)
//订单类型
export const orderType = (params) => http.get('/sale/api/my-order/order-type', { params })
export const orderType = params =>
http.get('/sale/api/my-order/order-type', { params })
//提货卡详情
export const pickDetails = (params) => http.get('/activity/api/pick/detail', { params })
export const pickDetails = params =>
http.get('/activity/api/pick/detail', { params })
//自助撤单列表
export const selfRevokeList = (params) => http.get('/sale/api/my-order/selfRevokeList', { params })
export const selfRevokeList = params =>
http.get('/sale/api/my-order/selfRevokeList', { params })
//自助撤单参数校验
export const selfRevokeListCheck = (params) => http.post('/sale/api/my-order/check-self-revoke-order', params)
export const selfRevokeListCheck = params =>
http.post('/sale/api/my-order/check-self-revoke-order', params)
//自助撤单
export const selfRevokeOrder = (params) => http.post('/sale/api/my-order/self-revoke-order', params)
export const selfRevokeOrder = params =>
http.post('/sale/api/my-order/self-revoke-order', params)
export const canOrder = data =>
http.post('/sale/api/order/check-before-confirm', data)

View File

@ -1,70 +1,83 @@
/*
* @Descripttion:
* @version:
* @Author: 王三华
* @Date: 2023-05-31 19:18:11
*/
const http = uni.$u.http
//支付配置
export const payConfig = (params) => http.get('/pay/config', { params })
export const payConfig = params => http.get('/pay/config', { params })
//京东银行列表
export const jdBankList = (params) => http.get('/pay/jd-fast/list', { params })
export const jdBankList = params => http.get('/pay/jd-fast/list', { params })
//汇付银行列表
export const hfBankList = (params) => http.get('/pay/ada-fast/list', { params })
export const hfBankList = params => http.get('/pay/ada-fast/list', { params })
//通联银行列表
export const tlBankList = (params) => http.get('/pay/all-in-fast/list', { params })
export const tlBankList = params =>
http.get('/pay/all-in-fast/list', { params })
//查询订单明细
export const orderInfo = (params) => http.post('/sale/api/order/query-order', params)
export const orderInfo = params =>
http.post('/sale/api/order/query-order', params)
//查询订单消费明细
export const spendDetails = (params) => http.post('/sale/api/order/query-spend-details', params)
export const spendDetails = params =>
http.post('/sale/api/order/query-spend-details', params)
//京东绑卡短信
export const bindJd = (params) => http.post('/pay/jd-fast/bind', params)
export const bindJd = params => http.post('/pay/jd-fast/bind', params)
//通联绑卡短信
export const bindTl = (params) => http.post('/pay/all-in-fast/bind', params)
export const bindTl = params => http.post('/pay/all-in-fast/bind', params)
//汇付绑卡短信
export const bindHf = (params) => http.post('/pay/ada-fast/bind', params)
export const bindHf = params => http.post('/pay/ada-fast/bind', params)
//京东绑卡
export const bindJdConfirm = (params) => http.post('/pay/jd-fast/bind-confirm', params)
export const bindJdConfirm = params =>
http.post('/pay/jd-fast/bind-confirm', params)
//通联绑卡
export const bindTlConfirm = (params) => http.post('/pay/all-in-fast/bind-confirm', params)
export const bindTlConfirm = params =>
http.post('/pay/all-in-fast/bind-confirm', params)
//汇付绑卡
export const bindHfConfirm = (params) => http.post('/pay/ada-fast/bind-confirm', params)
//银行卡支付获取验证码
export const unifiedorder = (params) => http.post('/pay/unifiedorder', params)
export const bindHfConfirm = params =>
http.post('/pay/ada-fast/bind-confirm', params)
export const unifiedorder = params => http.post('/pay/unifiedorder', params)
//汇付银行卡确认
export const payConfirmHf = (params) => http.post('/pay/ada-fast/pay-confirm', params)
export const payConfirmHf = params =>
http.post('/pay/ada-fast/pay-confirm', params)
//京东银行卡确认
export const payConfirmJd = (params) => http.post('/pay/jd-fast/pay-confirm', params)
export const payConfirmJd = params =>
http.post('/pay/jd-fast/pay-confirm', params)
//通联银行卡确认
export const payConfirmTl = (params) => http.post('/pay/all-in-fast/pay-confirm', params)
export const payConfirmTl = params =>
http.post('/pay/all-in-fast/pay-confirm', params)
//支付状态
export const payStatus = (params) => http.get('/pay/status', { params })
export const payStatus = params => http.get('/pay/status', { params })
//幂等性
export const generate = (params) => http.get('/system/api/idempotent/generate', { params })
export const generate = params =>
http.get('/system/api/idempotent/generate', { params })
//支付注册订单
export const payRegOrder = (params) => http.post('/sale/api/order/pay-reg-order', params)
export const payRegOrder = params =>
http.post('/sale/api/order/pay-reg-order', params)
//支付其他订单
export const payOthOrder = (params) => http.post('/sale/api/order/pay-oth-order', params)
export const payOthOrder = params =>
http.post('/sale/api/order/pay-oth-order', params)
//宝付确认支付h5
export const baoFuPay = (params) => http.post('/pay/baofu-code/order', params)
export const baoFuPay = params => http.post('/pay/baofu-code/order', params)
//汇付确认支付h5
export const huiFuPay = (params) => http.post('/pay/ada-code/order', params)
export const huiFuPay = params => http.post('/pay/ada-code/order', params)
//在线预充值
export const preCharge = (params) => http.get('/member/api/recharge/preCharge', { params })
export const preCharge = params =>
http.get('/member/api/recharge/preCharge', { params })
//海粉注册信息
export const fansOrder = (params) => http.get('/member/api/member/fans-order/'+params)
export const fansOrder = params =>
http.get('/member/api/member/fans-order/' + params)
//抽奖下单
export const payDrawGift = (params) => http.post('/activity/api/draw/pay-draw-num', params)
export const payDrawGift = params =>
http.post('/activity/api/draw/pay-draw-num', params)
//提货下单
export const payPickOrder = (params) => http.post('/activity/api/pick/order', params)
export const payPickOrder = params =>
http.post('/activity/api/pick/order', params)
//植树查看账户
export const deductionAccount = (params) => http.post('activity/api/sa-tree-order/deductionAccount', params)
export const deductionAccount = params =>
http.post('activity/api/sa-tree-order/deductionAccount', params)
//植树活动
export const shoppingTree = (params) => http.post('activity/api/sa-tree-order/shoppingTree', params)
export const shoppingTree = params =>
http.post('activity/api/sa-tree-order/shoppingTree', params)
//解绑银行卡
export const unBind = (params) => http.post('/pay/ada-fast/un-bind', params)
export const unBind = params => http.post('/pay/ada-fast/un-bind', params)
//查询注册信息
export const registerInfo = (params) => http.get('/member/api/member/register-order/' + params,)
export const registerInfo = params =>
http.get('/member/api/member/register-order/' + params)

View File

@ -1,83 +1,103 @@
/*
* @Descripttion:
* @version:
* @Author: 王三华
* @Date: 2023-06-08 14:52:59
*/
const http = uni.$u.http
//幂等性
export const generate = (params) => http.get('/system/api/idempotent/generate', { params })
export const generate = params =>
http.get('/system/api/idempotent/generate', { params })
//商品列表
export const getAllGoods = (params) => http.post('/sale/api/wares/query-spe-wares', params)
export const getAllGoods = params =>
http.post('/sale/api/wares/query-spe-wares', params)
//商品详情
export const waresDetail = (params) => http.post('/sale/api/wares/query-spe-wares-detail', params)
export const waresDetail = params =>
http.post('/sale/api/wares/query-spe-wares-detail', params)
//获取国家
export const countryList = (params) => http.get('/system/api/country/list', { params })
export const countryList = params =>
http.get('/system/api/country/list', { params })
//发货
export const deliveryList = (params) => http.get('/system/pub/enums/delivery-list', { params })
export const deliveryList = params =>
http.get('/system/pub/enums/delivery-list', { params })
//运输
export const transportList = (params) => http.get('/system/pub/enums/transport-type', { params })
export const transportList = params =>
http.get('/system/pub/enums/transport-type', { params })
//行列表输
export const bankList = (params) => http.get('/system/api/bank/list', { params })
export const bankList = params => http.get('/system/api/bank/list', { params })
//购物车商品详情
export const shoppingWaresDetail = (params) => http.post('/sale/api/shopping/get-shopping-wares-detail', params)
export const shoppingWaresDetail = params =>
http.post('/sale/api/shopping/get-shopping-wares-detail', params)
//一键注册
export const quickReg = (params) => http.post('/sale/api/order/quick-reg', params)
export const quickReg = params => http.post('/sale/api/order/quick-reg', params)
//获取会员等级
export const memLevel = (params) => http.post('/sale/api/order/valid-mem-level', params)
export const memLevel = params =>
http.post('/sale/api/order/valid-mem-level', params)
//注册页面显示权限
export const registerList = (params) => http.get('/system/api/register-page/list', { params })
export const registerList = params =>
http.get('/system/api/register-page/list', { params })
//获取地址列表
export const addressList = (params) => http.get('/member/api/member-address/list', { params })
export const addressList = params =>
http.get('/member/api/member-address/list', { params })
//查询邮费
export const queryPostage = (params) => http.post('/sale/api/order/query-order-postage', params)
export const queryPostage = params =>
http.post('/sale/api/order/query-order-postage', params)
//确认注册订单-生成待支付订单
export const confirmRegOrder = (params) => http.post('/sale/api/order/confirm-reg-order', params)
export const confirmRegOrder = params =>
http.post('/sale/api/order/confirm-reg-order', params)
//根据推荐人编号获取安置信息
export const validPcode = (params) => http.post('/sale/api/order/valid-p-code', params)
export const validPcode = params =>
http.post('/sale/api/order/valid-p-code', params)
//注册订单验证安置人编号
export const validPPcode = (params) => http.post('/sale/api/order/valid-p-p-code', params)
export const validPPcode = params =>
http.post('/sale/api/order/valid-p-p-code', params)
//注册订单验证手机号
export const validPhone = (params) => http.post('/sale/api/order/valid-phone', params)
export const validPhone = params =>
http.post('/sale/api/order/valid-phone', params)
//获取name
export const upgRel = (params) => http.post('/sale/api/order/validate-upg-rel', params)
export const upgRel = params =>
http.post('/sale/api/order/validate-upg-rel', params)
//升级复购单确认
export const confirmOthOrder = (params) => http.post('/sale/api/order/confirm-oth-order', params)
//新人礼包确认
export const confirmGiftOrder = (params) => http.post('/sale/api/order/confirm-gift-order', params)
export const confirmOthOrder = params =>
http.post('/sale/api/order/confirm-oth-order', params)
//嗨粉确认订单
export const confirmFunOrder = (params) => http.post('/sale/api/order/confirm-fun-order', params)
export const confirmFunOrder = params =>
http.post('/sale/api/order/confirm-fun-order', params)
//协议
export const waresAgreement = (params) => http.post('/sale/api/wares/get-wares-agreement', params)
export const waresAgreement = params =>
http.post('/sale/api/wares/get-wares-agreement', params)
//海粉订单详情
export const waresinfo = (params) => http.post('/sale/api/wares/query-confirm-waresinfo', params)
export const waresinfo = params =>
http.post('/sale/api/wares/query-confirm-waresinfo', params)
//海粉订单确认
export const confirmShareOrder = (params) => http.post('/sale/api/order/confirm-share-order', params)
export const confirmShareOrder = params =>
http.post('/sale/api/order/confirm-share-order', params)
//删除地址
export const delAddress = (data) => http.delete('/member/api/member-address/' + data)
//仓库店铺
export const storehouseList = (params) => http.get('/system/api/storehouse/list', { params })
//会员店铺
export const storeList = (params) => http.get('/member/api/store/list', { params })
export const delAddress = data =>
http.delete('/member/api/member-address/' + data)
//省市区
export const areaList = (params) => http.get('system/api/area/get-level-list', { params })
export const areaList = params =>
http.get('system/api/area/get-level-list', { params })
//创客空间选择
export const list_maker = (data) => http.post('/member/api/maker-space/list-maker?pageNum=' + data.pageNum + '&pageSize=' + data.pageSize, data )
export const list_maker = data =>
http.post(
'/member/api/maker-space/list-maker?pageNum=' +
data.pageNum +
'&pageSize=' +
data.pageSize,
data
)
// 礼包获取邮费
export const queryAdressPostage = (params) => http.post('/sale/api/order/self-order-postage', params)
export const queryAdressPostage = params =>
http.post('/sale/api/order/self-order-postage', params)
// 特殊会员完善信息
export const saveSpecial = (params) => http.post('/member/api/member-special/save-special', params)
export const saveSpecial = params =>
http.post('/member/api/member-special/save-special', params)
// 下载
export const specialExport = (params) => http.post('/member/api/member-special/special-export', params,{header: { 'Content-Type': 'application/x-www-form-urlencoded' },
responseType: 'blob',})
export const specialExport = params =>
http.post('/member/api/member-special/special-export', params, {
header: { 'Content-Type': 'application/x-www-form-urlencoded' },
responseType: 'blob',
})
//特殊信息列表
export const specialList = (params) => http.get('/member/api/member-special/special-list', { params })
export const specialList = params =>
http.get('/member/api/member-special/special-list', { params })
// 自营合作支付校验
export const checkPay = (params) => http.post('/sale/api/order/check-pay-type', params)
// 创客空间接口
export const queryCard = (params) => http.post('/sale/api/wares/query-cabin-card', params)
//复购特殊商品列表
export const makerList = (params) => http.get('/sale/api/order/list-maker-ware', { params })
// 判断选中商品是否可以下单
export const canOrder = data => http.post('/sale/api/order/can-order', data)

View File

@ -1,71 +1,105 @@
/*
* @Descripttion:
* @version:
* @Descripttion:
* @version:
* @Author: kBank
* @Date: 2022-05-24 14:43:45
*/
import { getToken, removeToken } from '@/config/auth.js'
module.exports = (vm) => {
// 初始化请求配置
uni.$u.http.setConfig((config) => {
config.baseURL = 'https://p1.hzs413.com/inter-api';
// config.baseURL = 'http://192.168.31.137:8080';
// config.baseURL = 'https://cn.hzs413.com/inter-api/';
config.timeout = 80000;
module.exports = vm => {
// 检查uni.$u.http是否可用
if (!uni || !uni.$u || !uni.$u.http) {
console.warn('uni.$u.http is not available, request configuration skipped')
return
}
// 初始化请求配置
uni.$u.http.setConfig(config => {
// 192.168.0.100:8080
//#ifdef DEV_SERVER
console.log('DEV_SERVER')
config.baseURL = 'https://t-app.beida666.com/prod-api'
//#endif
//#ifdef QA_SERVER
console.log('QA_SERVER')
config.baseURL = '/prod-api'
//#endif
config.timeout = 30000
return config
})
// 请求拦截
uni.$u.http.interceptors.request.use((config) => {
config.data = config.data || {}
config.header['Source'] = 3
let token = getToken();
let mToken = uni.getStorageSync('mToken');
let lang = uni.getStorageSync('lang');
if (lang) {
config.header['Accept-Language'] = lang
} else {
config.header['Accept-Language'] = 'zh-CN'
uni.$u.http.interceptors.request.use(
config => {
config.data = config.data || {}
config.header['Source'] = 3
let token = getToken()
let mToken = uni.getStorageSync('mToken')
let lang = uni.getStorageSync('lang')
if (lang) {
config.header['Accept-Language'] = lang
} else {
config.header['Accept-Language'] = 'zh-CN'
}
if (token) {
config.header['Authorization'] = token
}
config.header['token'] = mToken || ''
return config
},
config => {
return Promise.reject(config)
}
if (token) {
config.header['Authorization'] = token;
}
config.header['token'] = mToken || '';
return config
}, config => {
return Promise.reject(config)
})
)
// 响应拦截
uni.$u.http.interceptors.response.use((response) => {
const data = response.data
// uni.$u.toast(data.msg)
// if (data.code == 200) {
// return data;
// } else {
// token过期,清除token重新获取
if (data.code == 400 || data.code == 401 || data.code == 402) {
// uni.showToast({
// title: '登录超时',
// icon: 'none',
// duration: 1500,
// })
removeToken();
// 跳转到登录
setTimeout(() => {
uni.reLaunch({
url: '/pages/login/index'
})
}, 1500)
} else if (data.code == 500) {
uni.$u.toast(data.msg)
return data;
} else {
uni.$u.http.interceptors.response.use(
response => {
const data = response.data
// uni.$u.toast(data.msg)
return data;
// if (data.code == 200) {
// return data;
// } else {
// token过期,清除token重新获取
if (data.code == 400 || data.code == 401 || data.code == 402) {
// uni.showToast({
// title: '登录超时',
// icon: 'none',
// duration: 1500,
// })
removeToken()
// 跳转到登录
setTimeout(() => {
uni.reLaunch({
url: '/pages/login/index',
})
}, 1500)
} else if (data.code == 500) {
if (['/member/api/member/get-info'].includes(response?.config?.url)) {
uni.showToast({
title: '登录失败',
icon: 'none',
duration: 800,
})
setTimeout(() => {
uni.reLaunch({
url: '/pages/login/index',
})
}, 800)
removeToken()
return data
}
uni.$u.toast(data.msg)
return data
} else {
// uni.$u.toast(data.msg)
return data
}
},
response => {
uni.$u.toast('服务器错误,请稍后重试')
}
}, (response) => {
uni.$u.toast('服务器错误,请稍后重试')
})
}
)
}

21
config/share.js Normal file
View File

@ -0,0 +1,21 @@
const http = uni.$u.http
export const getShareCode = params =>
http.get('/member/api/share/get-shared-img', { params })
// 根据短码获取memberCode
export const getMemberCode = code =>
http.get(`/member/api/share/find-share-code/${code}`)
// 获取手机验证码
export const getPhoneCode = params =>
http.get('/member/api/share/share-sms-code', { params })
// 注册
export const getRegister = data =>
http.post('/member/api/share/share-register', data)
// 自动登录
export const autoLogin = data =>
// http.post('/retail-member/api/retail-auth/auto-login', data)
http.post('/member/auth/api/share-login', data)

4
config/special-area.js Normal file
View File

@ -0,0 +1,4 @@
const http = uni.$u.http
//会员专区商品列表
export const getAreaGoods = (params) => http.get('/sale/api/wares/list-wares', params)

31
config/ticket.js Normal file
View File

@ -0,0 +1,31 @@
/*
* @Descripttion: 门票活动相关API
* @version: 1.0.0
* @Author: Assistant
* @Date: 2025-01-22
*/
const http = uni.$u.http
// 查询门票活动列表
export const getTicketActivityList = params =>
http.get('/sale/api/ticket/query-ac', { params })
// 查询我的门票
export const getMyTicketList = params =>
http.get('/sale/api/ticket/query', { params })
// 购买门票(暂时定义,等待后端提供具体接口)
export const buyTicket = data => http.post('/sale/api/ticket/pay-ticket', data)
// 获取门票详情
export const getTicketDetail = params =>
http.get('/sale/api/ticket/detail', { params })
// 撤销门票
export const cancelTicket = data =>
http.post('/sale/api/ticket/cancel-pay-ticket', data)
// 更新门票
export const updateTicket = data =>
http.post('/sale/api/ticket/update-ticket', data)

3309
i8n.js Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,36 +1,25 @@
<!--
* @Descripttion:
* @version:
* @Author: 王三华
* @Date: 2023-07-28 16:30:26
-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<head>
<meta charset="UTF-8"/>
<script>
var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') ||
CSS.supports('top: constant(a)'))
document.write(
'<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
(coverSupport ? ', viewport-fit=cover' : '') + '" />')
var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') ||
CSS.supports('top: constant(a)'))
document.write(
'<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
(coverSupport ? ', viewport-fit=cover' : '') + '" />')
</script>
<title></title>
<!--preload-links-->
<!--app-context-->
<link rel="stylesheet" href="<%= BASE_URL %>static/index.css" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0" />
<script src="https://hzs-in.oss-cn-beijing.aliyuncs.com/test-new/language/zh-CN.js"></script>
<script src="https://hzs-in.oss-cn-beijing.aliyuncs.com/test-new/language/en-US.js"></script>
<script src="https://hzs-in.oss-cn-beijing.aliyuncs.com/test-new/language/zh-TC.js"></script>
<!-- <script src="https://hzs-in.oss-cn-beijing.aliyuncs.com/test-new/language/fr-FR.js"></script>
<script src="https://hzs-in.oss-cn-beijing.aliyuncs.com/test-new/language/ru-RU.js"></script> -->
</head>
<body>
<div id="app"><!--app-html--></div>
<script type="module" src="/main.js"></script>
<script type="module" src="static/cdn/echarts.min.js"></script>
<script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
</body>
<link rel="stylesheet" href="<%= BASE_URL %>static/index.css"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0"/>
<script src="https://bd-qd.oss-cn-beijing.aliyuncs.com/test_01/language/zh-CN.js"></script>
</head>
<body>
<div id="app"><!--app-html--></div>
<script type="module" src="/main.js"></script>
<script type="module" src="static/cdn/echarts.min.js"></script>
<script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
</body>
</html>

49
main.js
View File

@ -1,15 +1,3 @@
/*
* @Descripttion:
* @version:
* @Author: 王三华
* @Date: 2022-11-21 15:11:22
*/
/*
* @Descripttion:
* @version:
* @Author: kBank
* @Date: 2022-11-21 15:11:22
*/
import App from './App'
// #ifndef VUE3
@ -17,41 +5,48 @@ import Vue from 'vue'
import uview from '@/uni_modules/uview-ui'
import store from '@/store/index.js'
import Vue2OrgTree from 'vue-tree-color'
import * as echarts from 'echarts';
Vue.prototype.$echarts = echarts;
import * as echarts from 'echarts'
import { formatCurrency } from '@/util/index'
Vue.prototype.$echarts = echarts
Vue.use(Vue2OrgTree)
import axios from 'axios';
import { saveAs } from 'file-saver';
import axios from 'axios'
import { saveAs } from 'file-saver'
window.wx = {}
import floating from '@/components/floating/floating.vue';
/*底部数据*/
Vue.component('floating', floating)
Vue.prototype.$store = store
Vue.use(uview)
Vue.config.productionTip = false
App.mpType = 'app'
const app = new Vue({
...App
...App,
})
Vue.config.ignoredElements = [...Vue.config.ignoredElements, 'wx-open-launch-weapp']
Vue.config.ignoredElements = [
...Vue.config.ignoredElements,
'wx-open-launch-weapp',
]
// 复制
import VueClipboard from 'vue-clipboard2'
Vue.use(VueClipboard)
// #endif
import { numberToCurrencyNo,toThousandthAndKeepDecimal, isLocal,isLocaled } from '@/util/numberToCurrency'
import {
numberToCurrencyNo,
toThousandthAndKeepDecimal,
isLocal,
isLocaled,
} from '@/util/numberToCurrency'
Vue.prototype.isLocaled = isLocaled
// 配置全局过滤器,实现数字千分位格式
Vue.filter('numberToCurrency', numberToCurrencyNo)
Vue.filter('numberToCurrency', formatCurrency)
Vue.filter('toThousandthAndKeepDecimal', toThousandthAndKeepDecimal)
// 配置全局过滤器,实现数字千分位格式
Vue.filter('isLocal', isLocal)
import i18n from '@/util/i18n/index'
Vue.prototype._i18n = i18n
Vue.prototype._i18n = i18n
// #ifdef VUE3
import { createSSRApp } from 'vue'
@ -60,9 +55,9 @@ export function createApp() {
app.use(i18n)
return {
app,
store
store,
}
}
// #endif
require('@/config/request.js')(app)
app.$mount()
app.$mount()

View File

@ -1,6 +1,6 @@
{
"name" : "qyj_console",
"appid" : "",
"appid" : "__UNI__31B4587",
"description" : "",
"versionName" : "1.0.0",
"versionCode" : "100",
@ -17,7 +17,13 @@
"delay" : 0
},
/* */
"modules" : {},
"modules" : {
"Bluetooth" : {},
"Barcode" : {},
"Camera" : {},
"Fingerprint" : {},
"FaceID" : {}
},
/* */
"distribute" : {
/* android */
@ -38,12 +44,17 @@
"<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
"<uses-feature android:name=\"android.hardware.camera\"/>",
"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
]
],
"abiFilters" : [ "armeabi-v7a", "arm64-v8a", "x86" ]
},
/* ios */
"ios" : {},
"ios" : {
"dSYMs" : false
},
/* SDK */
"sdkConfigs" : {}
"sdkConfigs" : {
"push" : {}
}
}
},
/* */
@ -72,9 +83,29 @@
},
"vueVersion" : "2",
"h5" : {
"template" : "index.html",
"template" : "index.html",
"router" : {
"mode" : "hash"
},
"devServer" : {
"https" : false,
"port" : 8000,
"disableHostCheck" : true,
"proxy" : {
"/prod-api" : {
"target" : "http://192.168.0.104:8080",
"changeOrigin" : true,
"pathRewrite" : {
"^/prod-api" : ""
}
}
}
},
"optimization" : {
"treeShaking" : {
"enable" : true
}
}
}
},
"fallbackLocale" : "zh-Hans"
}

6978
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,33 +1,65 @@
{
"name": "hzs_cloud_h5",
"name": "bd_cloud_h5",
"version": "1.0.0",
"description": "<!-- * @Descripttion: * @version: * @Author: 王三<E78E8B> * @Date: 2022-11-21 15:11:22 -->",
"description": "h5",
"main": "main.js",
"dependencies": {
"@zumer/snapdom": "^1.9.6",
"axios": "^1.5.0",
"echarts": "^4.9.0",
"file-saver": "^2.0.5",
"glob": "^11.0.1",
"html2canvas": "^1.4.1",
"js-cookie": "^3.0.5",
"qrcodejs2": "0.0.2",
"swiper": "^3.4.2",
"vconsole": "^3.15.1",
"vue-clipboard2": "^0.3.3",
"vue-i18n": "^9.2.2",
"vue-tree-color": "^2.3.2",
"weixin-js-sdk": "^1.6.0"
},
"devDependencies": {
"@vue/eslint-config-prettier": "^8.0.0",
"eslint": "^8.57.1",
"eslint-config-prettier": "^9.1.0",
"eslint-plugin-vue": "^9.33.0",
"less": "^3.13.1",
"less-loader": "^4.1.0"
"less-loader": "^4.1.0",
"prettier": "^3.5.3"
},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "http://182.92.11.203:9999/web/hzs_cloud_h5.git"
"test": "echo \"Error: no test specified\" && exit 1",
"format": "prettier --write .",
"check-format": "prettier --check .",
"lint": "eslint --ext .js,.vue .",
"lint:fix": "eslint --ext .js,.vue . --fix",
"format:check": "prettier --check \"**/*.{js,vue,json,md}\"",
"format:write": "prettier --write \"**/*.{js,vue,json,md}\""
},
"keywords": [],
"author": "",
"license": "ISC"
"license": "ISC",
"uni-app": {
"scripts": {
"dev-env": {
"title": "开发环境",
"env": {
"UNI_PLATFORM": "h5"
},
"define": {
"DEV_SERVER": true
}
},
"prod-env": {
"title": "测试环境",
"env": {
"UNI_PLATFORM": "h5"
},
"define": {
"QA_SERVER": true
}
}
}
}
}

View File

@ -5,7 +5,6 @@
"style": {
"navigationBarTitleText": "首页",
"navigationBarBackgroundColor": "#fff",
// "enablePullDownRefresh": true,
"navigationBarHidden": true,
"navigationStyle": "custom"
}
@ -80,13 +79,6 @@
"navigationBarBackgroundColor": "#fff"
}
},
{
"path": "pages/forgetEmail/index",
"style": {
"navigationBarTitleText": "邮箱设置",
"navigationBarBackgroundColor": "#fff"
}
},
{
"path": "pages/forgetPayPassword/index",
"style": {
@ -326,6 +318,12 @@
"navigationBarTitleText": "注册专区"
}
},
{
"path": "pages/regiest/shareRegister",
"style": {
"navigationBarTitleText": "会员专区"
}
},
{
"path": "pages/shareArea/haiShare",
"style": {
@ -371,6 +369,13 @@
"navigationBarTitleText": "绑定银行卡"
}
},
{
"path": "pages/pay/success",
"style": {
"navigationBarTitleText": "支付成功",
"navigationBarBackgroundColor": "#fff"
}
},
{
"path": "pages/mine/order/index",
"style": {
@ -386,12 +391,6 @@
"navigationBarTitleText": "注册专区"
}
},
{
"path": "pages/other/newGiftPay",
"style": {
"navigationBarTitleText": "新人礼包"
}
},
{
"path": "pages/other/haiConfirm",
"style": {
@ -449,6 +448,14 @@
"enablePullDownRefresh": false
}
},
{
"path": "pages/refund/detail",
"style": {
"navigationBarTitleText": "退款列表",
"navigationBarBackgroundColor": "#fff",
"enablePullDownRefresh": true
}
},
{
"path": "pages/mine/balance/transfer",
"style": {
@ -491,6 +498,13 @@
"navigationBarBackgroundColor": "#fff"
}
},
{
"path": "pages/mine/region/index",
"style": {
"navigationBarTitleText": "收益区域",
"navigationBarBackgroundColor": "#fff"
}
},
{
"path": "pages/mine/balance/transDetail",
"style": {
@ -820,6 +834,13 @@
"enablePullDownRefresh": false
}
},
{
"path": "pages/mine/share/index",
"style": {
"navigationBarHidden": true,
"navigationStyle": "custom"
}
},
{
"path": "pages/mine/honorHall/honorHall",
"style": {
@ -840,6 +861,32 @@
"navigationBarTitleText": "新增业绩",
"enablePullDownRefresh": false
}
},
{
"path": "pages/ticket/index",
"style": {
"navigationBarTitleText": "门票活动",
"enablePullDownRefresh": true
}
},
{
"path": "pages/ticket/buy",
"style": {
"navigationBarTitleText": "自助购票"
}
},
{
"path": "pages/ticket/detail",
"style": {
"navigationBarTitleText": "我的门票"
}
},
{
"path": "pages/test-ticket",
"style": {
"navigationBarTitleText": "门票模块测试",
"navigationBarBackgroundColor": "#fff"
}
}
],
"tabBar": {
@ -854,7 +901,7 @@
"pagePath": "pages/shoppingCar/index"
},
{
"pagePath": "pages/email/index"
"pagePath": "pages/mine/share/index"
},
{
"pagePath": "pages/mine/index"
@ -867,4 +914,4 @@
"navigationBarBackgroundColor": "#F8F8F8",
"backgroundColor": "#F8F8F8"
}
}
}

View File

@ -1,16 +1,10 @@
<!--
* @Descripttion:
* @version:
* @Author: 王三华
* @Date: 2023-05-18 14:42:53
-->
<template>
<view class="main">
<view class="contents">
<u-form :model="addressForm" labelWidth="auto" ref="uForm">
<view class="view-class">
<u-form-item
:label="$t('MY_ORD_10')"
label="收货人"
label-width="100px"
prop="recName"
>
@ -25,7 +19,7 @@
</view>
<view class="view-class">
<u-form-item
:label="$t('w_0052')"
label="联系方式"
label-width="100px"
prop="recPhone"
>
@ -49,7 +43,7 @@
</u-form-item>
</view>
<view class="view-class" @click="getDiqu">
<u-form-item :label="$t('w_0068')" label-width="100px" prop="address">
<u-form-item label="收货地址" label-width="100px" prop="address">
<view
v-if="address"
style="font-size: 28rpx; color: #333; margin-left: 20rpx"
@ -71,7 +65,7 @@
</view>
<view class="view-class">
<u-form-item
:label="$t('S_C_27')"
label="详细地址"
class="label-style"
label-width="100px"
prop="recAddress"
@ -81,7 +75,7 @@
placeholder-class="place-class"
class="border-color"
maxlength="200"
:placeholder="$t('w_0070')"
placeholder="请输入详细地址"
/>
</u-form-item>
</view>
@ -104,9 +98,17 @@
:defaultCode="defaultCode"
@addressData="addressData"
></v-address>
<u-button type="success" shape="circle" class="btn" @click="submit">{{
$t("w_0035")
}}</u-button>
<u-button
:disabled="!addressForm.recName || !addressForm.recPhone || !addressForm.recAddress"
type="success"
shape="circle"
class="btn"
@click="submit"
color="#005BAC"
:loading="loading"
>
确定
</u-button>
<view style="height: 20rpx"></view>
</view>
</template>
@ -135,6 +137,7 @@ export default {
isDefault: 0,
pkId: "",
},
loading: false,
rules: {
recName: [
{
@ -168,13 +171,13 @@ export default {
message: "请输入手机号",
trigger: ["blur"],
},
// {
// validator: (rule, value, callback) => {
// return this.$u.test.mobile(value);
// },
// message: "",
// trigger: ["blur"],
// },
{
validator: (rule, value, callback) => {
return this.$u.test.mobile(value);
},
message: "手机号格式不正确",
trigger: ["blur"],
},
],
},
};
@ -201,19 +204,26 @@ export default {
},
submit() {
this.$refs.uForm.validate().then((res) => {
this.loading = true
api.saveAddress(this.addressForm).then((res) => {
if (res.code == "200") {
uni.showToast({
const toast = uni.showToast({
title: res.msg,
icon: "none",
success() {
complete() {
setTimeout(() => {
uni.navigateBack(1);
}, 2000);
this.loading = false
uni.navigateBack(1)
toast.hideToast()
}, 500);
},
});
} else {
this.loading = false
}
});
}).catch(() => {
this.loading = false
})
});
},
getDiqu() {
@ -269,7 +279,7 @@ export default {
</script>
<style lang="scss" scoped>
/deep/ .u-form-item__body__right__message {
:v-deep .u-form-item__body__right__message {
margin-left: 215rpx !important;
padding-bottom: 20rpx;
}
@ -309,7 +319,7 @@ export default {
.label-style {
display: block !important;
}
/deep/ .label-style .u-form-item__body__left {
:v-deep .label-style .u-form-item__body__left {
display: block !important;
margin-top: 20rpx;
}
@ -331,8 +341,6 @@ page {
background-color: #fff;
}
.btn {
background-color: #fb3024;
border: none;
height: 92rpx;
line-height: 92rpx;
font-size: 30rpx;

View File

@ -1,9 +1,3 @@
<!--
* @Descripttion:
* @version:
* @Author: 王三华
* @Date: 2023-05-18 14:42:53
-->
<template>
<view class="main">
<view class="color-s">
@ -24,7 +18,7 @@
{{item.recAddress}}
</view>
<view class="address-e">
{{item.recName}} {{item.recPhone}} <span class="color-style" v-if="item.isDefault==1">{{$t('w_0263')}}</span>
{{item.recName}} {{item.recPhone}} <span class="color-style" v-if="item.isDefault==1">{{'默认'}}</span>
</view>
</view>
<view class="address-right" @click="update(item.pkId)">
@ -70,7 +64,7 @@ export default {
},
del(id){
uni.showModal({
title: this.$t('w_0034'),
title: '提示',
content: '是否删除该地址',
success: (res) => {
if (res.confirm) {
@ -110,7 +104,7 @@ export default {
.color-style{
width: 65rpx;
height: 36rpx;
background: #DE3932;
background: #005BAC;
border-radius: 2rpx;
opacity: 1;
display: inline-block;
@ -173,7 +167,7 @@ export default {
position: absolute;
width: 100%;
height: 244rpx;
background: linear-gradient(180deg, #F33030 0%, rgba(255,182,182,0) 100%);
background: linear-gradient(180deg, #005BAC 0%, rgba(255,182,182,0) 100%);
border-radius: 0px 0px 0px 0px;
top: 0;
}
@ -205,7 +199,7 @@ export default {
margin-bottom: 170rpx;
}
.btn{
background-color: #FB3024;
background-color: #005BAC;
border: none;
height: 92rpx;
line-height: 92rpx;

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