├── .gitignore ├── .idea ├── .gitignore ├── mallplus-milktea.iml ├── misc.xml ├── modules.xml └── vcs.xml ├── App.vue ├── LICENSE ├── api ├── addresses.js ├── attendance-list.js ├── attendance.js ├── custom-points.js ├── customer-coupons.js ├── goods.js ├── index.js ├── level-benefits.js ├── member.js ├── orders.js ├── packages.js ├── points-flow.js ├── points-mall.js ├── rechargeCards.js ├── store.js └── today-attendance.js ├── common ├── api.js ├── uqrcode.js └── util.js ├── components ├── jyf-parser │ ├── jyf-parser.vue │ └── libs │ │ ├── CssHandler.js │ │ ├── MpHtmlParser.js │ │ ├── config.js │ │ ├── handler.sjs │ │ ├── handler.wxs │ │ └── trees.vue ├── list-cell │ └── list-cell.vue ├── loading.vue ├── modal │ └── modal.vue ├── navbar-back-button.vue ├── popup-layer │ └── popup-layer.vue ├── uni-icons │ ├── icons.js │ └── uni-icons.vue └── uni-steps │ └── uni-steps.vue ├── main.js ├── manifest.json ├── pages.json ├── pages ├── address │ ├── add.vue │ └── address.vue ├── attendance │ ├── attendance.vue │ └── uni-calendar │ │ ├── calendar.js │ │ ├── uni-calendar-item.vue │ │ ├── uni-calendar.vue │ │ └── util.js ├── balance │ └── balance.vue ├── coupons │ └── coupons.vue ├── index │ └── index.vue ├── integrals │ ├── detail.vue │ ├── flow.vue │ └── integrals.vue ├── login │ └── login.vue ├── menu │ ├── menu.scss │ ├── menu.vue │ └── menu1.vue ├── mine │ ├── member-code.vue │ ├── mine.vue │ └── userinfo.vue ├── orders │ ├── detail.vue │ └── orders.vue ├── packages │ ├── detail.vue │ └── index.vue ├── pay │ └── pay.vue ├── remark │ └── remark.vue ├── review │ ├── rate-form-item │ │ └── index.vue │ └── review.vue └── take-foods │ └── take-foods.vue ├── readme.md ├── static ├── iconfont │ └── iconfont.scss ├── images │ ├── attendance │ │ ├── 9c8e57f5287b4362.png │ │ ├── bg.png │ │ ├── cup.png │ │ └── gift.png │ ├── back.png │ ├── balance.png │ ├── close.png │ ├── customer-level │ │ ├── 1.png │ │ ├── 10.png │ │ ├── 11.png │ │ ├── 2.png │ │ ├── 3.png │ │ ├── 4.png │ │ ├── 5.png │ │ ├── 8.png │ │ └── 9.png │ ├── edit.png │ ├── empty.png │ ├── index │ │ ├── arrow-right.png │ │ ├── csc.png │ │ ├── hyjb.png │ │ ├── hyjb_bg.png │ │ ├── mcsb.png │ │ ├── mcsb_bg.png │ │ ├── qrcode.png │ │ ├── wm.png │ │ ├── yzclh.png │ │ └── zq.png │ ├── integrals │ │ ├── arrow-left.png │ │ ├── banner.png │ │ ├── bg.png │ │ ├── goal.png │ │ ├── integral.png │ │ └── ticket.png │ ├── loading.gif │ ├── loading2.gif │ ├── logo.png │ ├── menu │ │ ├── cart.png │ │ ├── close.png │ │ ├── common-use.png │ │ └── share-good.png │ ├── mine │ │ ├── arrow-right.png │ │ ├── banner.png │ │ ├── default.png │ │ ├── gdfw.png │ │ ├── hym.png │ │ ├── jfdh.png │ │ ├── jfqd.png │ │ ├── level.png │ │ ├── lxkf.png │ │ ├── nxbz.png │ │ ├── nxlw.png │ │ ├── nxsc.png │ │ ├── rhyl.png │ │ ├── shdz.png │ │ ├── sjtq.png │ │ ├── srtq.png │ │ ├── stxy.png │ │ ├── wddd.png │ │ ├── wdzl.png │ │ └── wechat.png │ ├── navigator-1.png │ ├── navigator.png │ ├── order │ │ ├── 0edf1df4a0a61f3361.png │ │ ├── 3b28b05baffebf512f.png │ │ ├── bottom.png │ │ ├── delivered.png │ │ ├── delivered_selected.png │ │ ├── delivery.png │ │ ├── delivery_selected.png │ │ ├── ec82f8f760b8e2fa.png │ │ ├── location.png │ │ ├── mobile.png │ │ ├── navigation.png │ │ ├── ordered.png │ │ ├── ordered_selected.png │ │ ├── production.png │ │ ├── production_selected.png │ │ └── right.png │ ├── pay │ │ ├── 163e5de32d731e3c.png │ │ ├── b7d73adba18305af.png │ │ └── close.png │ ├── services │ │ ├── bzzx.png │ │ ├── cjwt.png │ │ ├── djsm.png │ │ ├── gynx.png │ │ ├── hyxy.png │ │ ├── wdzl.png │ │ └── ystk.png │ ├── success.png │ └── tabBar │ │ ├── drink.png │ │ ├── drink_selected.png │ │ ├── index.png │ │ ├── index_selected.png │ │ ├── mine.png │ │ ├── mine_selected.png │ │ ├── take.png │ │ └── take_selected.png ├── logo.png └── style │ └── app.scss ├── store └── index.js └── uni.scss /.gitignore: -------------------------------------------------------------------------------- 1 | # Maven # 2 | target/ 3 | 4 | # IDEA # 5 | .idea/ 6 | *.iml 7 | *.zip 8 | # Eclipse # 9 | .settings/ 10 | .classpath 11 | .project 12 | 13 | 14 | /vue 15 | /unpackage 16 | */vue -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | -------------------------------------------------------------------------------- /.idea/mallplus-milktea.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /App.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 19 | -------------------------------------------------------------------------------- /api/addresses.js: -------------------------------------------------------------------------------- 1 | export default [ 2 | { 3 | "id": 1, 4 | "accept_name": "隔壁老王", 5 | "mobile": "18666600000", 6 | "province_name": "广东省", 7 | "area": 440306, 8 | "city": 440300, 9 | "sex": 0, 10 | "district": { 11 | "districts": "广东省深圳市南山区", 12 | "area": "宝安区", 13 | "city": "深圳市", 14 | "province": "广东省" 15 | }, 16 | "street": "有一间公寓八栋", 17 | "inner": false, 18 | "lat": "", 19 | "door_number": "AB1234", 20 | "is_default": 0, 21 | "province": 440000, 22 | "area_name": "南山区", 23 | "city_name": "深圳市", 24 | "poiname": "" 25 | } 26 | ] -------------------------------------------------------------------------------- /api/attendance-list.js: -------------------------------------------------------------------------------- 1 | export default [{ 2 | "attendance_id": 1, 3 | "updated_at": "2020-04-25 02:46:36", 4 | "id": 1, 5 | "created_at": "2020-04-25 02:46:36", 6 | "attendance_coupon": 0, 7 | "nickname": "tinypuppet", 8 | "num": 0, 9 | "reward_days": 1, 10 | "user_id": "1", 11 | "date": "2020-04-25", 12 | "attendance_point": 1, 13 | "store_id": 1 14 | }, 15 | { 16 | "attendance_id": 1, 17 | "updated_at": "2020-05-02 03:30:42", 18 | "id": 2, 19 | "created_at": "2020-05-02 03:30:42", 20 | "attendance_coupon": 0, 21 | "nickname": "tinypuppet", 22 | "num": 0, 23 | "reward_days": 1, 24 | "user_id": "1", 25 | "date": "2020-05-02", 26 | "attendance_point": 1, 27 | "store_id": 1 28 | }, 29 | { 30 | "attendance_id": 1, 31 | "updated_at": "2020-05-03 19:37:12", 32 | "id": 3, 33 | "created_at": "2020-05-03 19:37:12", 34 | "attendance_coupon": 0, 35 | "nickname": "tinypuppet", 36 | "num": 0, 37 | "reward_days": 1, 38 | "user_id": "1", 39 | "date": "2020-05-03", 40 | "attendance_point": 1, 41 | "store_id": 1 42 | }, 43 | { 44 | "attendance_id": 1, 45 | "updated_at": "2020-05-06 10:38:42", 46 | "id": 4, 47 | "created_at": "2020-05-06 10:38:42", 48 | "attendance_coupon": 0, 49 | "nickname": "tinypuppet", 50 | "num": 0, 51 | "reward_days": 1, 52 | "user_id": "1", 53 | "date": "2020-05-06", 54 | "attendance_point": 1, 55 | "store_id": 1 56 | } 57 | ] 58 | -------------------------------------------------------------------------------- /api/attendance.js: -------------------------------------------------------------------------------- 1 | export default [{ 2 | "points": 1, 3 | "day_name": 1, 4 | "is_day": 1 5 | }, 6 | { 7 | "points": 2, 8 | "day_name": 2, 9 | "is_day": 0 10 | }, 11 | { 12 | "points": 3, 13 | "day_name": 3, 14 | "is_day": 0 15 | }, 16 | { 17 | "points": 4, 18 | "day_name": 4, 19 | "is_day": 0 20 | }, 21 | { 22 | "points": 1, 23 | "day_name": 5, 24 | "is_day": 1 25 | }, 26 | { 27 | "points": 1, 28 | "day_name": 6, 29 | "is_day": 0 30 | }, 31 | { 32 | "points": 10, 33 | "day_name": 7, 34 | "is_day": 0 35 | } 36 | ] 37 | -------------------------------------------------------------------------------- /api/custom-points.js: -------------------------------------------------------------------------------- 1 | export default { 2 | "soonExpiredPoints": 0, 3 | "totalPoints": 487, 4 | "expiredTime": null, 5 | "foreverPoints": 0 6 | } 7 | -------------------------------------------------------------------------------- /api/customer-coupons.js: -------------------------------------------------------------------------------- 1 | export default [ 2 | { 3 | "couponExplain": "

1. 在有效期内,凭此券在奈雪内地任意门店(机场店、奈雪梦工厂除外)及“奈雪点单”小程序免费兑换任意饮品或软欧包一份,菜单上标有红色雪花产品除外

2. 此券不可兑换现金,不设找零,优惠券抵扣金额不予积分

3. 此券每单仅限使用一张,不得与其他优惠券同时使用

4. 此券不适用于第三方外送服务

5. 券面图片仅供参考,产品以实物为准

", 4 | "discountUnit": 1, 5 | "imageUrl": "https://images.qmai.cn/s23107/2019/10/09/ea5b8ed493c0cc310d.jpg", 6 | "id": "1", 7 | "discountAmount": null, 8 | "beginAt": "2020-05-10 00:00:00", 9 | "useTimeScope": "[{\"begin\":\"00:00:00\",\"end\":\"23:59:59\"}]", 10 | "endAt": "2020-06-08 23:59:59", 11 | "createdAt": "2020-05-10 02:06:00", 12 | "title": "生日免费券", 13 | "couponId": "1", 14 | "deletedAt": null, 15 | "sellerName": "奈雪の茶", 16 | "updatedAt": "2020-05-10 02:06:00", 17 | "couponType": 1 18 | }, 19 | { 20 | "couponExplain": "1. 适用商品:免费兑换生日特调鸡尾酒一杯\n2. 适用门店:仅限内地奈雪酒屋任意门店堂食使用\n3. 适用场景:线下门店出示会员码使用\n4. 本券仅限消费酒类产品,依法不支持未成年人使用\n5. 此券每单仅限使用一张,不可兑换现金,不设找零,优惠券抵扣金额不予积分\n6. 此券不适用于第三方外送服务\n7. 券面图片仅供参考,产品以实物为准", 21 | "discountUnit": null, 22 | "imageUrl": "https://images.qmai.cn/s34747/2019/12/04/5d97da76e82bfe26d3.png", 23 | "id": "2", 24 | "discountAmount": null, 25 | "beginAt": "2020-05-10 00:00:00", 26 | "useTimeScope": "[{\"begin\":\"00:00:00\",\"end\":\"23:59:59\"}]", 27 | "endAt": "2020-06-08 23:59:59", 28 | "createdAt": "2020-05-10 02:06:00", 29 | "title": "生日特调券", 30 | "couponId": "2", 31 | "deletedAt": null, 32 | "sellerName": "奈雪酒屋", 33 | "updatedAt": "2020-05-10 02:06:00", 34 | "couponType": 2 35 | }, 36 | { 37 | "couponExplain": "1. 使用条件:在有效期内,免费兑换鸡尾酒一杯,每周五、周六与法定节假日19点后不支持使用\n2. 适用商品:鸡尾酒/红葡萄酒/白葡萄酒,具体以门店营业信息为准\n3. 适用门店:仅限内地奈雪酒屋任意门店堂食使用\n4. 适用场景:线下门店出示会员码使用\n5. 本券仅限消费酒类产品,依法不支持未成年人使用\n6. 此券每单仅限使用一张,不可兑换现金,不设找零,优惠券抵扣金额不予积分\n7. 此券不适用于第三方外送服务8. 券面图片仅供参考,产品以实物为准", 38 | "discountUnit": null, 39 | "imageUrl": "https://images.qmai.cn/s34747/2019/12/04/5d97da76e82bfe26d3.png", 40 | "id": "3", 41 | "discountAmount": null, 42 | "beginAt": "2020-05-08 00:00:00", 43 | "useTimeScope": "[{\"begin\":\"00:00:00\",\"end\":\"23:59:59\"}]", 44 | "endAt": "2020-06-06 23:59:59", 45 | "createdAt": "2020-05-08 19:25:41", 46 | "title": "酒屋特调券", 47 | "couponId": "3", 48 | "deletedAt": null, 49 | "sellerName": "奈雪酒屋", 50 | "updatedAt": "2020-05-08 19:25:41", 51 | "couponType": 2 52 | }, 53 | { 54 | "couponExplain": "

1. 在有效期内,凭此券可在奈雪内地任意门店(机场店、奈雪梦工厂除外)及“奈雪点单”小程序购买任意茶饮一杯,可免费获得软欧包一个(价格不高于茶饮),菜单上标有红色雪花产品除外

2. 此券不可兑换现金,不设找零,优惠券抵扣金额不予积分

3. 此券每单仅限使用一张,不得与其他优惠券同时使用

4. 此券不适用于第三方外送服务

5. 券面图片仅供参考,产品以实物为准

", 55 | "discountUnit": 2, 56 | "imageUrl": "https://images.qmai.cn/s23107/2019/10/10/8a8be6ddf7a4140944.jpg", 57 | "id": "4", 58 | "discountAmount": 0, 59 | "beginAt": "2020-05-08 00:00:00", 60 | "useTimeScope": "[{\"begin\":\"00:00:00\",\"end\":\"23:59:59\"}]", 61 | "endAt": "2020-06-06 23:59:59", 62 | "createdAt": "2020-05-08 19:25:41", 63 | "title": "升级好友券", 64 | "couponId": "4", 65 | "deletedAt": null, 66 | "sellerName": "奈雪の茶", 67 | "updatedAt": "2020-05-08 19:25:41", 68 | "couponType": 1 69 | }, 70 | { 71 | "couponExplain": "

1. 在有效期内,凭此券可在奈雪内地任意门店(机场店、奈雪梦工厂除外)及“奈雪点单”小程序享受购买任意茶饮满两杯赠一杯(赠送产品价格不高于购买产品),菜单上标有红色雪花产品除外

2. 此券不可兑换现金,不设找零,优惠券抵扣金额不予积分

3. 此券每单仅限使用一张,不得与其他优惠券同时使用

4. 此券不适用于第三方外送服务

5. 券面图片仅供参考,产品以实物为准

", 72 | "discountUnit": 2, 73 | "imageUrl": "https://images.qmai.cn/s23107/2019/10/09/ea5b8ed493c0cc310d.jpg", 74 | "id": "5", 75 | "discountAmount": 0, 76 | "beginAt": "2020-05-08 00:00:00", 77 | "useTimeScope": "[{\"begin\":\"00:00:00\",\"end\":\"23:59:59\"}]", 78 | "endAt": "2020-06-06 23:59:59", 79 | "createdAt": "2020-05-08 19:25:41", 80 | "title": "茶饮满二赠一券", 81 | "couponId": "5", 82 | "deletedAt": null, 83 | "sellerName": "奈雪の茶", 84 | "updatedAt": "2020-05-08 19:25:41", 85 | "couponType": 1 86 | }, 87 | { 88 | "couponExplain": "

1. 在有效期内,凭此券可在“奈雪点单”小程序外卖(机场店、奈雪梦工厂除外)购买任意茶饮或软欧包减免5元优惠

2. 此券不可兑换现金,不设找零,优惠券抵扣金额不予积分

3. 此券每单仅限使用一张,不得与其他优惠券同时使用

4. 此券不适用于第三方外送服务

5. 券面图片仅供参考,产品以实物为准

", 89 | "imageUrl": "https://images.qmai.cn/s23107/2019/12/04/fcb80e25ea8b39c1ac.jpg", 90 | "id": "6", 91 | "discountAmount": 5, 92 | "beginAt": "2020-05-08 00:00:00", 93 | "useTimeScope": "[{\"begin\":\"00:00:00\",\"end\":\"23:59:59\"}]", 94 | "endAt": "2020-06-06 23:59:59", 95 | "createdAt": "2020-05-08 19:25:40", 96 | "title": "小程序外卖5元现金券", 97 | "couponId": "6", 98 | "deletedAt": null, 99 | "sellerName": "奈雪の茶", 100 | "updatedAt": "2020-05-08 19:25:40", 101 | "couponType": 1 102 | } 103 | ] 104 | -------------------------------------------------------------------------------- /api/index.js: -------------------------------------------------------------------------------- 1 | import packages from './packages' 2 | import store from './store' 3 | import goods from './goods' 4 | import levelBenefits from './level-benefits' 5 | import member from './member' 6 | import rechargeCards from './rechargeCards' 7 | import addresses from './addresses' 8 | import attendance from './attendance' 9 | import customPoints from './custom-points' 10 | import pointsMall from './points-mall' 11 | import attendanceList from './attendance-list' 12 | import todayAttendance from './today-attendance' 13 | import orders from './orders' 14 | import customerCoupons from './customer-coupons' 15 | 16 | const json = { 17 | packages, 18 | store, 19 | goods, 20 | levelBenefits, 21 | member, 22 | rechargeCards, 23 | addresses, 24 | attendance, 25 | customPoints, 26 | pointsMall, 27 | attendanceList, 28 | todayAttendance, 29 | orders, 30 | customerCoupons 31 | } 32 | 33 | export default (name) => new Promise(resolve => resolve(json[name]), 500) -------------------------------------------------------------------------------- /api/level-benefits.js: -------------------------------------------------------------------------------- 1 | export default [{ 2 | "picture": "https://images.qmai.cn/s33123/2020/01/20/f6bdc61b9356e87d03.jpg", 3 | "cardName": "V1", 4 | "benefitsSummaries": [{ 5 | "benefitsItemSummaries": [{ 6 | "unitType": 0, 7 | "benefitsType": 0, 8 | "num": 2 9 | }], 10 | "benefitsName": "开卡特权", 11 | "benefitsType": 0 12 | }, 13 | { 14 | "benefitsItemSummaries": [{ 15 | "unitType": 0, 16 | "benefitsType": 0, 17 | "num": 1 18 | }], 19 | "benefitsName": "会员日特权", 20 | "benefitsType": 4 21 | } 22 | ], 23 | "level": 1 24 | }, 25 | { 26 | "picture": "https://images.qmai.cn/s33123/2020/01/20/fd13fff0e873b8c06d.jpg", 27 | "cardName": "V2", 28 | "benefitsSummaries": [{ 29 | "benefitsItemSummaries": [{ 30 | "unitType": 0, 31 | "benefitsType": 0, 32 | "num": 2 33 | }], 34 | "benefitsName": "升级特权", 35 | "benefitsType": 1 36 | }, 37 | { 38 | "benefitsItemSummaries": [{ 39 | "unitType": 0, 40 | "benefitsType": 0, 41 | "num": 1 42 | }], 43 | "benefitsName": "生日特权", 44 | "benefitsType": 3 45 | }, 46 | { 47 | "benefitsItemSummaries": [{ 48 | "unitType": 0, 49 | "benefitsType": 0, 50 | "num": 1 51 | }], 52 | "benefitsName": "会员日特权", 53 | "benefitsType": 4 54 | } 55 | ], 56 | "level": 2 57 | }, 58 | { 59 | "picture": "https://images.qmai.cn/s33123/2020/01/20/a292980f9803aa4504.jpg", 60 | "cardName": "V3", 61 | "benefitsSummaries": [{ 62 | "benefitsItemSummaries": [{ 63 | "unitType": 0, 64 | "benefitsType": 0, 65 | "num": 3 66 | }], 67 | "benefitsName": "升级特权", 68 | "benefitsType": 1 69 | }, 70 | { 71 | "benefitsItemSummaries": [{ 72 | "unitType": 0, 73 | "benefitsType": 0, 74 | "num": 1 75 | }], 76 | "benefitsName": "生日特权", 77 | "benefitsType": 3 78 | }, 79 | { 80 | "benefitsItemSummaries": [{ 81 | "unitType": 0, 82 | "benefitsType": 0, 83 | "num": 1 84 | }], 85 | "benefitsName": "会员日特权", 86 | "benefitsType": 4 87 | } 88 | ], 89 | "level": 3 90 | }, 91 | { 92 | "picture": "https://images.qmai.cn/s33123/2020/01/20/6fc9b939b9912c4387.jpg", 93 | "cardName": "V4", 94 | "benefitsSummaries": [{ 95 | "benefitsItemSummaries": [{ 96 | "unitType": 0, 97 | "benefitsType": 0, 98 | "num": 3 99 | }], 100 | "benefitsName": "升级特权", 101 | "benefitsType": 1 102 | }, 103 | { 104 | "benefitsItemSummaries": [{ 105 | "unitType": 0, 106 | "benefitsType": 0, 107 | "num": 1 108 | }], 109 | "benefitsName": "生日特权", 110 | "benefitsType": 3 111 | }, 112 | { 113 | "benefitsItemSummaries": [{ 114 | "unitType": 0, 115 | "benefitsType": 0, 116 | "num": 1 117 | }], 118 | "benefitsName": "会员日特权", 119 | "benefitsType": 4 120 | } 121 | ], 122 | "level": 4 123 | }, 124 | { 125 | "picture": "https://images.qmai.cn/s33123/2020/01/20/460bdca3e1e7f87def.jpg", 126 | "cardName": "V5", 127 | "benefitsSummaries": [{ 128 | "benefitsItemSummaries": [{ 129 | "unitType": 0, 130 | "benefitsType": 0, 131 | "num": 6 132 | }], 133 | "benefitsName": "升级特权", 134 | "benefitsType": 1 135 | }, 136 | { 137 | "benefitsItemSummaries": [{ 138 | "unitType": 0, 139 | "benefitsType": 0, 140 | "num": 1 141 | }], 142 | "benefitsName": "生日特权", 143 | "benefitsType": 3 144 | } 145 | ], 146 | "level": 5 147 | }, 148 | { 149 | "picture": "https://images.qmai.cn/s33123/2020/01/20/508ea53092bcf504f3.jpg", 150 | "cardName": "V6", 151 | "benefitsSummaries": [{ 152 | "benefitsItemSummaries": [{ 153 | "unitType": 0, 154 | "benefitsType": 0, 155 | "num": 6 156 | }], 157 | "benefitsName": "升级特权", 158 | "benefitsType": 1 159 | }, 160 | { 161 | "benefitsItemSummaries": [{ 162 | "unitType": 0, 163 | "benefitsType": 0, 164 | "num": 1 165 | }], 166 | "benefitsName": "生日特权", 167 | "benefitsType": 3 168 | } 169 | ], 170 | "level": 6 171 | } 172 | ] 173 | -------------------------------------------------------------------------------- /api/member.js: -------------------------------------------------------------------------------- 1 | export default { 2 | "storeId": null, 3 | "mobilePhone": "18666600000", 4 | "nickname": "tinypuppet", 5 | "avatar": "/static/images/mine/default.png", 6 | "country": "", 7 | "cardName": "V2", 8 | "memberLevel": 2, 9 | "city": "", 10 | "cardNo": "39390020696322222", 11 | "openingCardDate": "2018-10-20 15:10:10", 12 | "customerId": "343400246943295100", 13 | "district": null, 14 | "unionId": "", 15 | "address": null, 16 | "storeName": null, 17 | "gender": 1, 18 | "province": "", 19 | "memberOrigin": "wechat", 20 | "username": "我是新人", 21 | "memberLevelName": "VIP2", 22 | "birthday": "", 23 | "pointNum": 413, 24 | "couponNum": 6, 25 | "rechargeBalance": null, 26 | "balance": 0, 27 | "giftBalance": 0, 28 | "expenseAmount": null, 29 | "conditionType": 3, 30 | "ruleList": null, 31 | "expiredTime": null, 32 | "currentValue": 410, 33 | "level": 2, 34 | "cardUrl": "https://images.qmai.cn/s33123/2020/01/20/fd13fff0e873b8c06d.jpg", 35 | "needValue": 90, 36 | "cardName": "V2", 37 | "max": false 38 | } 39 | -------------------------------------------------------------------------------- /api/points-flow.js: -------------------------------------------------------------------------------- 1 | export default [ 2 | { 3 | "happenedDate": "2020-05-11", 4 | "sourceType": 5, 5 | "sellerName": "奈雪の茶", 6 | "changeNum": 1, 7 | "changeType": 1, 8 | "reason": "积分签到奖励", 9 | "createdAt": "2020-05-11 00:17:47", 10 | "id": 1 11 | }, 12 | { 13 | "happenedDate": "2020-05-10", 14 | "sourceType": 5, 15 | "sellerName": "奈雪の茶", 16 | "changeNum": 1, 17 | "changeType": 1, 18 | "reason": "积分签到奖励", 19 | "createdAt": "2020-05-10 22:23:36", 20 | "id": 2 21 | }, 22 | { 23 | "happenedDate": "2020-05-09", 24 | "sourceType": 5, 25 | "sellerName": "奈雪の茶", 26 | "changeNum": 1, 27 | "changeType": 1, 28 | "reason": "积分签到奖励", 29 | "createdAt": "2020-05-09 02:14:24", 30 | "id": 3 31 | }, 32 | { 33 | "happenedDate": "2020-05-08", 34 | "sourceType": 1, 35 | "sellerName": "奈雪の茶", 36 | "changeNum": 50, 37 | "changeType": 1, 38 | "reason": "消费增加", 39 | "createdAt": "2020-05-08 19:25:40", 40 | "id": 4 41 | }, 42 | { 43 | "happenedDate": "2020-05-08", 44 | "sourceType": 5, 45 | "sellerName": "奈雪の茶", 46 | "changeNum": 1, 47 | "changeType": 1, 48 | "reason": "积分签到奖励", 49 | "createdAt": "2020-05-08 18:43:14", 50 | "id": 5 51 | }, 52 | { 53 | "happenedDate": "2020-05-07", 54 | "sourceType": 5, 55 | "sellerName": "奈雪の茶", 56 | "changeNum": 1, 57 | "changeType": 1, 58 | "reason": "积分签到奖励", 59 | "createdAt": "2020-05-07 16:25:46", 60 | "id": 6 61 | }, 62 | { 63 | "happenedDate": "2020-05-06", 64 | "sourceType": 5, 65 | "sellerName": "奈雪の茶", 66 | "changeNum": 1, 67 | "changeType": 1, 68 | "reason": "积分签到奖励", 69 | "createdAt": "2020-05-06 10:38:42", 70 | "id": 7 71 | }, 72 | { 73 | "happenedDate": "2020-05-05", 74 | "sourceType": 1, 75 | "sellerName": "奈雪の茶", 76 | "changeNum": 73, 77 | "changeType": 1, 78 | "reason": "消费增加", 79 | "createdAt": "2020-05-05 20:42:47", 80 | "id": 8 81 | }, 82 | { 83 | "happenedDate": "2020-05-03", 84 | "sourceType": 5, 85 | "sellerName": "奈雪の茶", 86 | "changeNum": 1, 87 | "changeType": 1, 88 | "reason": "积分签到奖励", 89 | "createdAt": "2020-05-03 19:37:12", 90 | "id": 9 91 | }, 92 | { 93 | "happenedDate": "2020-05-02", 94 | "sourceType": 5, 95 | "sellerName": "奈雪の茶", 96 | "changeNum": 1, 97 | "changeType": 1, 98 | "reason": "积分签到奖励", 99 | "createdAt": "2020-05-02 03:30:42", 100 | "id": 10 101 | }, 102 | { 103 | "happenedDate": "2020-04-25", 104 | "sourceType": 1, 105 | "sellerName": "奈雪の茶", 106 | "changeNum": 43, 107 | "changeType": 1, 108 | "reason": "消费增加", 109 | "createdAt": "2020-04-25 20:48:26", 110 | "id": 11 111 | }, 112 | { 113 | "happenedDate": "2020-04-25", 114 | "sourceType": 5, 115 | "sellerName": "奈雪の茶", 116 | "changeNum": 1, 117 | "changeType": 1, 118 | "reason": "积分签到奖励", 119 | "createdAt": "2020-04-25 02:46:36", 120 | "id": 12 121 | }, 122 | { 123 | "happenedDate": "2020-04-24", 124 | "sourceType": 1, 125 | "sellerName": "奈雪の茶", 126 | "changeNum": 57, 127 | "changeType": 1, 128 | "reason": "消费增加", 129 | "createdAt": "2020-04-24 20:23:45", 130 | "id": 13 131 | }, 132 | { 133 | "happenedDate": "2020-04-18", 134 | "sourceType": 1, 135 | "sellerName": "奈雪の茶", 136 | "changeNum": 56, 137 | "changeType": 1, 138 | "reason": "消费增加", 139 | "createdAt": "2020-04-18 20:20:08", 140 | "id": 14 141 | }, 142 | { 143 | "happenedDate": "2020-04-10", 144 | "sourceType": 1, 145 | "sellerName": "奈雪の茶", 146 | "changeNum": 33, 147 | "changeType": 1, 148 | "reason": "消费增加", 149 | "createdAt": "2020-04-10 20:40:44", 150 | "id": 15 151 | } 152 | ] -------------------------------------------------------------------------------- /api/rechargeCards.js: -------------------------------------------------------------------------------- 1 | export default [ 2 | { 3 | "updated_at": "2020-05-03 20:31:46", 4 | "id": 1948, 5 | "sales": 314, 6 | "image": "/s1000106/2018/07/09/cfbc38cae535a8ad8a.jpeg", 7 | "value": "100.00", 8 | "deleted_at": null, 9 | "sort": 999, 10 | "status_text": "启用", 11 | "status": 1, 12 | "created_at": "2020-01-03 15:46:36", 13 | "desc": "1. 储值成功后,不可退款,请根据自己的消费情况充值。\n2. 储值余额不可提现,不可转移、转赠。\n3. 储值金额按国家法律、法规开具符合规定的发票,后续凭储值余额消费时,不再开具发票。如需发票请至奈雪点单小程序个人中心联系客服。\n4. 储值不累计会员成长值、积分与宝石,订单消费时以实际订单支付金额累计会员成长值、积分与宝石。\n5. 储值余额可在奈雪的茶内地线下门店、奈雪酒屋全国门店、奈雪点单小程序在线支付使用。", 14 | "store_id": 23107, 15 | "gifts": [], 16 | "type": 0, 17 | "full_image": "https://img-shop.qmimg.cn/s1000106/2018/07/09/cfbc38cae535a8ad8a.jpeg", 18 | "name": "100元", 19 | "sell_price": "100.00" 20 | }, 21 | { 22 | "updated_at": "2020-05-02 21:59:50", 23 | "id": 1972, 24 | "sales": 112, 25 | "image": "/s1000106/2018/07/09/cfbc38cae535a8ad8a.jpeg", 26 | "value": "200.00", 27 | "deleted_at": null, 28 | "sort": 999, 29 | "status_text": "启用", 30 | "status": 1, 31 | "created_at": "2020-01-09 23:37:52", 32 | "desc": "1. 储值成功后,不可退款,请根据自己的消费情况充值。\n2. 储值余额不可提现,不可转移、转赠。\n3. 储值金额按国家法律、法规开具符合规定的发票,后续凭储值余额消费时,不再开具发票。如需发票请至奈雪点单小程序个人中心联系客服。\n4. 储值不累计会员成长值、积分与宝石,订单消费时以实际订单支付金额累计会员成长值、积分与宝石。\n5. 储值余额可在奈雪的茶内地线下门店、奈雪酒屋全国门店、奈雪点单小程序在线支付使用。", 33 | "store_id": 23107, 34 | "gifts": [], 35 | "type": 0, 36 | "full_image": "https://img-shop.qmimg.cn/s1000106/2018/07/09/cfbc38cae535a8ad8a.jpeg", 37 | "name": "200元", 38 | "sell_price": "200.00" 39 | }, 40 | { 41 | "updated_at": "2020-05-01 20:19:41", 42 | "id": 1973, 43 | "sales": 31, 44 | "image": "/s1000106/2018/07/09/cfbc38cae535a8ad8a.jpeg", 45 | "value": "300.00", 46 | "deleted_at": null, 47 | "sort": 999, 48 | "status_text": "启用", 49 | "status": 1, 50 | "created_at": "2020-01-09 23:38:10", 51 | "desc": "1. 储值成功后,不可退款,请根据自己的消费情况充值。\n2. 储值余额不可提现,不可转移、转赠。\n3. 储值金额按国家法律、法规开具符合规定的发票,后续凭储值余额消费时,不再开具发票。如需发票请至奈雪点单小程序个人中心联系客服。\n4. 储值不累计会员成长值、积分与宝石,订单消费时以实际订单支付金额累计会员成长值、积分与宝石。\n5. 储值余额可在奈雪的茶内地线下门店、奈雪酒屋全国门店、奈雪点单小程序在线支付使用。", 52 | "store_id": 23107, 53 | "gifts": [], 54 | "type": 0, 55 | "full_image": "https://img-shop.qmimg.cn/s1000106/2018/07/09/cfbc38cae535a8ad8a.jpeg", 56 | "name": "300元", 57 | "sell_price": "300.00" 58 | }, 59 | { 60 | "updated_at": "2020-05-03 13:12:35", 61 | "id": 1974, 62 | "sales": 14, 63 | "image": "/s1000106/2018/07/09/cfbc38cae535a8ad8a.jpeg", 64 | "value": "400.00", 65 | "deleted_at": null, 66 | "sort": 999, 67 | "status_text": "启用", 68 | "status": 1, 69 | "created_at": "2020-01-09 23:38:30", 70 | "desc": "1. 储值成功后,不可退款,请根据自己的消费情况充值。\n2. 储值余额不可提现,不可转移、转赠。\n3. 储值金额按国家法律、法规开具符合规定的发票,后续凭储值余额消费时,不再开具发票。如需发票请至奈雪点单小程序个人中心联系客服。\n4. 储值不累计会员成长值、积分与宝石,订单消费时以实际订单支付金额累计会员成长值、积分与宝石。\n5. 储值余额可在奈雪的茶内地线下门店、奈雪酒屋全国门店、奈雪点单小程序在线支付使用。", 71 | "store_id": 23107, 72 | "gifts": [], 73 | "type": 0, 74 | "full_image": "https://img-shop.qmimg.cn/s1000106/2018/07/09/cfbc38cae535a8ad8a.jpeg", 75 | "name": "400元", 76 | "sell_price": "400.00" 77 | }, 78 | { 79 | "updated_at": "2020-04-18 07:43:07", 80 | "id": 1975, 81 | "sales": 7, 82 | "image": "/s1000106/2018/07/09/cfbc38cae535a8ad8a.jpeg", 83 | "value": "600.00", 84 | "deleted_at": null, 85 | "sort": 999, 86 | "status_text": "启用", 87 | "status": 1, 88 | "created_at": "2020-01-09 23:38:44", 89 | "desc": "1. 储值成功后,不可退款,请根据自己的消费情况充值。\n2. 储值余额不可提现,不可转移、转赠。\n3. 储值金额按国家法律、法规开具符合规定的发票,后续凭储值余额消费时,不再开具发票。如需发票请至奈雪点单小程序个人中心联系客服。\n4. 储值不累计会员成长值、积分与宝石,订单消费时以实际订单支付金额累计会员成长值、积分与宝石。\n5. 储值余额可在奈雪的茶内地线下门店、奈雪酒屋全国门店、奈雪点单小程序在线支付使用。", 90 | "store_id": 23107, 91 | "gifts": [], 92 | "type": 0, 93 | "full_image": "https://img-shop.qmimg.cn/s1000106/2018/07/09/cfbc38cae535a8ad8a.jpeg", 94 | "name": "600元", 95 | "sell_price": "600.00" 96 | }, 97 | { 98 | "updated_at": "2020-04-29 19:48:32", 99 | "id": 1976, 100 | "sales": 18, 101 | "image": "/s1000106/2018/07/09/cfbc38cae535a8ad8a.jpeg", 102 | "value": "800.00", 103 | "deleted_at": null, 104 | "sort": 999, 105 | "status_text": "启用", 106 | "status": 1, 107 | "created_at": "2020-01-09 23:38:58", 108 | "desc": "1. 储值成功后,不可退款,请根据自己的消费情况充值。\n2. 储值余额不可提现,不可转移、转赠。\n3. 储值金额按国家法律、法规开具符合规定的发票,后续凭储值余额消费时,不再开具发票。如需发票请至奈雪点单小程序个人中心联系客服。\n4. 储值不累计会员成长值、积分与宝石,订单消费时以实际订单支付金额累计会员成长值、积分与宝石。\n5. 储值余额可在奈雪的茶内地线下门店、奈雪酒屋全国门店、奈雪点单小程序在线支付使用。", 109 | "store_id": 23107, 110 | "gifts": [], 111 | "type": 0, 112 | "full_image": "https://img-shop.qmimg.cn/s1000106/2018/07/09/cfbc38cae535a8ad8a.jpeg", 113 | "name": "800元", 114 | "sell_price": "800.00" 115 | } 116 | ] 117 | -------------------------------------------------------------------------------- /api/store.js: -------------------------------------------------------------------------------- 1 | export default { 2 | "longitude": "114.065927", 3 | "latitude": "22.537361", 4 | "area_name": "福田区", 5 | "photo": "[\"s23107\\\/2019\\\/03\\\/25\\\/e4a12f9f81bd3e8f4d.jpg\"]", 6 | "is_show": 1, 7 | "mobile": "0755-82722513", 8 | "takeout_server_status": true, 9 | "is_open": true, 10 | "server_status": true, 11 | "created_at": "1568194697", 12 | "street": "深圳市福田区海田路与福华一路交汇深圳天元5栋1层N136", 13 | "area_id": 440304, 14 | "notice": "", 15 | "city_name": "深圳市", 16 | "id_card": "222222222222222222", 17 | "alipay_store_id": "", 18 | "takeout_server_time": "10:00-23:59", 19 | "id": 1, 20 | "forhere_server_time": "10:00-23:59", 21 | "province_id": 440000, 22 | "forhere_is_open": true, 23 | "is_floor_stall": 0, 24 | "is_eat": 1, 25 | "share_description": "", 26 | "distance": 896, 27 | "distance_text": "896m", 28 | "stalls": [], 29 | "tel": "0755-82722513", 30 | "is_takeout": 1, 31 | "images": [ 32 | "https:\/\/img-shop.qmimg.cn\/s23107\/2019\/03\/25\/e4a12f9f81bd3e8f4d.jpg?imageView2\/0\/w\/200\/h\/200" 33 | ], 34 | "shop_day": "", 35 | "image": "https:\/\/img-shop.qmimg.cn\/s23107\/2019\/03\/25\/e4a12f9f81bd3e8f4d.jpg", 36 | "server_time": "10:00-23:59", 37 | "status": 1, 38 | "multi_mark": "NXHNSZ0055", 39 | "per_price": "1.00", 40 | "balance": "0.00", 41 | "name": "卓悦中心ONE AVENUE店", 42 | "updated_at": "1578227762", 43 | "packing_fee": "2.00", 44 | "delivery_cost": "2.00", 45 | "min_price": "30.00", 46 | "avg_delivery_cost_time": "40" 47 | } 48 | -------------------------------------------------------------------------------- /api/today-attendance.js: -------------------------------------------------------------------------------- 1 | export default { 2 | "is_attendance": 2, 3 | "total_points": 0, 4 | "attendance_points": 1, 5 | "attendance_category": 1, 6 | "attendance_continuity_day": 1, 7 | "list": [{ 8 | "points": 1, 9 | "updated_at": "2020-01-15 05:29:25", 10 | "attendances_id": 312, 11 | "id": 770, 12 | "status": 0, 13 | "receive_type": 0, 14 | "created_at": "2019-10-23 19:17:21", 15 | "coupon_name": "", 16 | "attendance_category": 1, 17 | "coupon_id": "0", 18 | "attendance_day": 1, 19 | "coupon_num": 0, 20 | "deleted_at": null 21 | }] 22 | } 23 | -------------------------------------------------------------------------------- /common/util.js: -------------------------------------------------------------------------------- 1 | function formatTime(time) { 2 | if (typeof time !== 'number' || time < 0) { 3 | return time 4 | } 5 | 6 | var hour = parseInt(time / 3600) 7 | time = time % 3600 8 | var minute = parseInt(time / 60) 9 | time = time % 60 10 | var second = time 11 | 12 | return ([hour, minute, second]).map(function(n) { 13 | n = n.toString() 14 | return n[1] ? n : '0' + n 15 | }).join(':') 16 | } 17 | 18 | function formatDateTime(date, fmt = 'yyyy-MM-dd hh:mm:ss') { 19 | if(!date) { 20 | return '' 21 | } 22 | if (typeof (date) === 'number') { 23 | date = new Date(date) 24 | } 25 | var o = { 26 | "M+": date.getMonth() + 1, //月份 27 | "d+": date.getDate(), //日 28 | "h+": date.getHours(), //小时 29 | "m+": date.getMinutes(), //分 30 | "s+": date.getSeconds(), //秒 31 | "q+": Math.floor((date.getMonth() + 3) / 3), //季度 32 | "S": date.getMilliseconds() //毫秒 33 | } 34 | if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length)) 35 | for (var k in o) 36 | if (new RegExp("(" + k + ")").test(fmt)) 37 | fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length))) 38 | return fmt 39 | } 40 | 41 | function formatLocation(longitude, latitude) { 42 | if (typeof longitude === 'string' && typeof latitude === 'string') { 43 | longitude = parseFloat(longitude) 44 | latitude = parseFloat(latitude) 45 | } 46 | 47 | longitude = longitude.toFixed(2) 48 | latitude = latitude.toFixed(2) 49 | 50 | return { 51 | longitude: longitude.toString().split('.'), 52 | latitude: latitude.toString().split('.') 53 | } 54 | } 55 | 56 | var dateUtils = { 57 | UNITS: { 58 | '年': 31557600000, 59 | '月': 2629800000, 60 | '天': 86400000, 61 | '小时': 3600000, 62 | '分钟': 60000, 63 | '秒': 1000 64 | }, 65 | humanize: function(milliseconds) { 66 | var humanize = ''; 67 | for (var key in this.UNITS) { 68 | if (milliseconds >= this.UNITS[key]) { 69 | humanize = Math.floor(milliseconds / this.UNITS[key]) + key + '前'; 70 | break; 71 | } 72 | } 73 | return humanize || '刚刚'; 74 | }, 75 | format: function(dateStr) { 76 | var date = this.parse(dateStr) 77 | var diff = Date.now() - date.getTime(); 78 | if (diff < this.UNITS['天']) { 79 | return this.humanize(diff); 80 | } 81 | var _format = function(number) { 82 | return (number < 10 ? ('0' + number) : number); 83 | }; 84 | return date.getFullYear() + '/' + _format(date.getMonth() + 1) + '/' + _format(date.getDate()) + '-' + 85 | _format(date.getHours()) + ':' + _format(date.getMinutes()); 86 | }, 87 | parse: function(str) { //将"yyyy-mm-dd HH:MM:ss"格式的字符串,转化为一个Date对象 88 | var a = str.split(/[^0-9]/); 89 | return new Date(a[0], a[1] - 1, a[2], a[3], a[4], a[5]); 90 | } 91 | }; 92 | 93 | module.exports = { 94 | formatTime, 95 | formatDateTime, 96 | formatLocation, 97 | dateUtils 98 | } 99 | -------------------------------------------------------------------------------- /components/jyf-parser/libs/CssHandler.js: -------------------------------------------------------------------------------- 1 | /* 2 | 解析和匹配 Css 的选择器 3 | github:https://github.com/jin-yufeng/Parser 4 | docs:https://jin-yufeng.github.io/Parser 5 | author:JinYufeng 6 | update:2020/03/15 7 | */ 8 | var cfg = require('./config.js'); 9 | class CssHandler { 10 | constructor(tagStyle) { 11 | var styles = Object.assign({}, cfg.userAgentStyles); 12 | for (var item in tagStyle) 13 | styles[item] = (styles[item] ? styles[item] + ';' : '') + tagStyle[item]; 14 | this.styles = styles; 15 | } 16 | getStyle = data => this.styles = new CssParser(data, this.styles).parse(); 17 | match(name, attrs) { 18 | var tmp, matched = (tmp = this.styles[name]) ? tmp + ';' : ''; 19 | if (attrs.class) { 20 | var items = attrs.class.split(' '); 21 | for (var i = 0, item; item = items[i]; i++) 22 | if (tmp = this.styles['.' + item]) 23 | matched += tmp + ';'; 24 | } 25 | if (tmp = this.styles['#' + attrs.id]) 26 | matched += tmp + ';'; 27 | return matched; 28 | } 29 | } 30 | module.exports = CssHandler; 31 | class CssParser { 32 | constructor(data, init) { 33 | this.data = data; 34 | this.floor = 0; 35 | this.i = 0; 36 | this.list = []; 37 | this.res = init; 38 | this.state = this.Space; 39 | } 40 | parse() { 41 | for (var c; c = this.data[this.i]; this.i++) 42 | this.state(c); 43 | return this.res; 44 | } 45 | section = () => this.data.substring(this.start, this.i); 46 | isLetter = c => (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'); 47 | // 状态机 48 | Space(c) { 49 | if (c == '.' || c == '#' || this.isLetter(c)) { 50 | this.start = this.i; 51 | this.state = this.Name; 52 | } else if (c == '/' && this.data[this.i + 1] == '*') 53 | this.Comment(); 54 | else if (!cfg.blankChar[c] && c != ';') 55 | this.state = this.Ignore; 56 | } 57 | Comment() { 58 | this.i = this.data.indexOf('*/', this.i) + 1; 59 | if (!this.i) this.i = this.data.length; 60 | this.state = this.Space; 61 | } 62 | Ignore(c) { 63 | if (c == '{') this.floor++; 64 | else if (c == '}' && !--this.floor) this.state = this.Space; 65 | } 66 | Name(c) { 67 | if (cfg.blankChar[c]) { 68 | this.list.push(this.section()); 69 | this.state = this.NameSpace; 70 | } else if (c == '{') { 71 | this.list.push(this.section()); 72 | this.Content(); 73 | } else if (c == ',') { 74 | this.list.push(this.section()); 75 | this.Comma(); 76 | } else if (!this.isLetter(c) && (c < '0' || c > '9') && c != '-' && c != '_') 77 | this.state = this.Ignore; 78 | } 79 | NameSpace(c) { 80 | if (c == '{') this.Content(); 81 | else if (c == ',') this.Comma(); 82 | else if (!cfg.blankChar[c]) this.state = this.Ignore; 83 | } 84 | Comma() { 85 | while (cfg.blankChar[this.data[++this.i]]); 86 | if (this.data[this.i] == '{') this.Content(); 87 | else { 88 | this.start = this.i--; 89 | this.state = this.Name; 90 | } 91 | } 92 | Content() { 93 | this.start = ++this.i; 94 | if ((this.i = this.data.indexOf('}', this.i)) == -1) this.i = this.data.length; 95 | var content = this.section(); 96 | for (var i = 0, item; item = this.list[i++];) 97 | if (this.res[item]) this.res[item] += ';' + content; 98 | else this.res[item] = content; 99 | this.list = []; 100 | this.state = this.Space; 101 | } 102 | } 103 | -------------------------------------------------------------------------------- /components/jyf-parser/libs/config.js: -------------------------------------------------------------------------------- 1 | /* 配置文件 */ 2 | // #ifdef MP-WEIXIN 3 | const canIUse = wx.canIUse('editor'); // 高基础库标识,用于兼容 4 | // #endif 5 | module.exports = { 6 | // 过滤器函数 7 | filter: null, 8 | // 代码高亮函数 9 | highlight: null, 10 | // 文本处理函数 11 | onText: null, 12 | // 实体编码列表 13 | entities: { 14 | quot: '"', 15 | apos: "'", 16 | semi: ';', 17 | nbsp: '\xA0', 18 | ensp: '\u2002', 19 | emsp: '\u2003', 20 | ndash: '–', 21 | mdash: '—', 22 | middot: '·', 23 | lsquo: '‘', 24 | rsquo: '’', 25 | ldquo: '“', 26 | rdquo: '”', 27 | bull: '•', 28 | hellip: '…' 29 | }, 30 | blankChar: makeMap(' ,\xA0,\t,\r,\n,\f'), 31 | // 块级标签,将被转为 div 32 | blockTags: makeMap('address,article,aside,body,caption,center,cite,footer,header,html,nav,section' + ( 33 | // #ifdef MP-WEIXIN 34 | canIUse ? '' : 35 | // #endif 36 | ',pre')), 37 | // 将被移除的标签 38 | ignoreTags: makeMap( 39 | 'area,base,basefont,canvas,command,frame,input,isindex,keygen,link,map,meta,param,script,source,style,svg,textarea,title,track,use,wbr' 40 | // #ifdef MP-WEIXIN 41 | + (canIUse ? ',rp' : '') 42 | // #endif 43 | // #ifndef APP-PLUS 44 | + ',embed,iframe' 45 | // #endif 46 | ), 47 | // 只能被 rich-text 显示的标签 48 | richOnlyTags: makeMap('a,colgroup,fieldset,legend,picture,table' 49 | // #ifdef MP-WEIXIN 50 | + (canIUse ? ',bdi,bdo,caption,rt,ruby' : '') 51 | // #endif 52 | ), 53 | // 自闭合的标签 54 | selfClosingTags: makeMap( 55 | 'area,base,basefont,br,col,circle,ellipse,embed,frame,hr,img,input,isindex,keygen,line,link,meta,param,path,polygon,rect,source,track,use,wbr' 56 | ), 57 | // 信任的属性 58 | trustAttrs: makeMap( 59 | 'align,alt,app-id,author,autoplay,border,cellpadding,cellspacing,class,color,colspan,controls,data-src,dir,face,height,href,id,ignore,loop,media,muted,name,path,poster,rowspan,size,span,src,start,style,type,unit-id,width,xmlns' 60 | ), 61 | // bool 型的属性 62 | boolAttrs: makeMap('autoplay,controls,ignore,loop,muted'), 63 | // 信任的标签 64 | trustTags: makeMap( 65 | 'a,abbr,ad,audio,b,blockquote,br,code,col,colgroup,dd,del,dl,dt,div,em,fieldset,h1,h2,h3,h4,h5,h6,hr,i,img,ins,label,legend,li,ol,p,q,source,span,strong,sub,sup,table,tbody,td,tfoot,th,thead,tr,title,ul,video' 66 | // #ifdef MP-WEIXIN 67 | + (canIUse ? ',bdi,bdo,caption,pre,rt,ruby' : '') 68 | // #endif 69 | // #ifdef APP-PLUS 70 | + ',embed,iframe' 71 | // #endif 72 | ), 73 | // 默认的标签样式 74 | userAgentStyles: { 75 | address: 'font-style:italic', 76 | big: 'display:inline;font-size:1.2em', 77 | blockquote: 'background-color:#f6f6f6;border-left:3px solid #dbdbdb;color:#6c6c6c;padding:5px 0 5px 10px', 78 | caption: 'display:table-caption;text-align:center', 79 | center: 'text-align:center', 80 | cite: 'font-style:italic', 81 | dd: 'margin-left:40px', 82 | mark: 'background-color:yellow', 83 | pre: 'font-family:monospace;white-space:pre;overflow:scroll', 84 | s: 'text-decoration:line-through', 85 | small: 'display:inline;font-size:0.8em', 86 | u: 'text-decoration:underline' 87 | } 88 | } 89 | 90 | function makeMap(str) { 91 | var map = {}, 92 | list = str.split(','); 93 | for (var i = list.length; i--;) 94 | map[list[i]] = true; 95 | return map; 96 | } 97 | -------------------------------------------------------------------------------- /components/jyf-parser/libs/handler.sjs: -------------------------------------------------------------------------------- 1 | var inlineTags = { 2 | abbr: 1, 3 | b: 1, 4 | big: 1, 5 | code: 1, 6 | del: 1, 7 | em: 1, 8 | i: 1, 9 | ins: 1, 10 | label: 1, 11 | q: 1, 12 | small: 1, 13 | span: 1, 14 | strong: 1 15 | } 16 | export default { 17 | useRichText: function(item) { 18 | return !item.c && !inlineTags[item.name] && (item.attrs.style || '').indexOf('display:inline') == -1; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /components/jyf-parser/libs/handler.wxs: -------------------------------------------------------------------------------- 1 | var inlineTags = { 2 | abbr: 1, 3 | b: 1, 4 | big: 1, 5 | code: 1, 6 | del: 1, 7 | em: 1, 8 | i: 1, 9 | ins: 1, 10 | label: 1, 11 | q: 1, 12 | small: 1, 13 | span: 1, 14 | strong: 1 15 | } 16 | module.exports = { 17 | useRichText: function(item) { 18 | return !item.c && !inlineTags[item.name] && (item.attrs.style || '').indexOf('display:inline') == -1; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /components/list-cell/list-cell.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 78 | 79 | 134 | -------------------------------------------------------------------------------- /components/loading.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 17 | 18 | 34 | -------------------------------------------------------------------------------- /components/modal/modal.vue: -------------------------------------------------------------------------------- 1 | 30 | 31 | 132 | 133 | 399 | -------------------------------------------------------------------------------- /components/navbar-back-button.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 39 | 40 | 42 | -------------------------------------------------------------------------------- /components/popup-layer/popup-layer.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 133 | 134 | 156 | -------------------------------------------------------------------------------- /components/uni-icons/icons.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 'contact': '\ue100', 3 | 'person': '\ue101', 4 | 'personadd': '\ue102', 5 | 'contact-filled': '\ue130', 6 | 'person-filled': '\ue131', 7 | 'personadd-filled': '\ue132', 8 | 'phone': '\ue200', 9 | 'email': '\ue201', 10 | 'chatbubble': '\ue202', 11 | 'chatboxes': '\ue203', 12 | 'phone-filled': '\ue230', 13 | 'email-filled': '\ue231', 14 | 'chatbubble-filled': '\ue232', 15 | 'chatboxes-filled': '\ue233', 16 | 'weibo': '\ue260', 17 | 'weixin': '\ue261', 18 | 'pengyouquan': '\ue262', 19 | 'chat': '\ue263', 20 | 'qq': '\ue264', 21 | 'videocam': '\ue300', 22 | 'camera': '\ue301', 23 | 'mic': '\ue302', 24 | 'location': '\ue303', 25 | 'mic-filled': '\ue332', 26 | 'speech': '\ue332', 27 | 'location-filled': '\ue333', 28 | 'micoff': '\ue360', 29 | 'image': '\ue363', 30 | 'map': '\ue364', 31 | 'compose': '\ue400', 32 | 'trash': '\ue401', 33 | 'upload': '\ue402', 34 | 'download': '\ue403', 35 | 'close': '\ue404', 36 | 'redo': '\ue405', 37 | 'undo': '\ue406', 38 | 'refresh': '\ue407', 39 | 'star': '\ue408', 40 | 'plus': '\ue409', 41 | 'minus': '\ue410', 42 | 'circle': '\ue411', 43 | 'checkbox': '\ue411', 44 | 'close-filled': '\ue434', 45 | 'clear': '\ue434', 46 | 'refresh-filled': '\ue437', 47 | 'star-filled': '\ue438', 48 | 'plus-filled': '\ue439', 49 | 'minus-filled': '\ue440', 50 | 'circle-filled': '\ue441', 51 | 'checkbox-filled': '\ue442', 52 | 'closeempty': '\ue460', 53 | 'refreshempty': '\ue461', 54 | 'reload': '\ue462', 55 | 'starhalf': '\ue463', 56 | 'spinner': '\ue464', 57 | 'spinner-cycle': '\ue465', 58 | 'search': '\ue466', 59 | 'plusempty': '\ue468', 60 | 'forward': '\ue470', 61 | 'back': '\ue471', 62 | 'left-nav': '\ue471', 63 | 'checkmarkempty': '\ue472', 64 | 'home': '\ue500', 65 | 'navigate': '\ue501', 66 | 'gear': '\ue502', 67 | 'paperplane': '\ue503', 68 | 'info': '\ue504', 69 | 'help': '\ue505', 70 | 'locked': '\ue506', 71 | 'more': '\ue507', 72 | 'flag': '\ue508', 73 | 'home-filled': '\ue530', 74 | 'gear-filled': '\ue532', 75 | 'info-filled': '\ue534', 76 | 'help-filled': '\ue535', 77 | 'more-filled': '\ue537', 78 | 'settings': '\ue560', 79 | 'list': '\ue562', 80 | 'bars': '\ue563', 81 | 'loop': '\ue565', 82 | 'paperclip': '\ue567', 83 | 'eye': '\ue568', 84 | 'arrowup': '\ue580', 85 | 'arrowdown': '\ue581', 86 | 'arrowleft': '\ue582', 87 | 'arrowright': '\ue583', 88 | 'arrowthinup': '\ue584', 89 | 'arrowthindown': '\ue585', 90 | 'arrowthinleft': '\ue586', 91 | 'arrowthinright': '\ue587', 92 | 'pulldown': '\ue588', 93 | 'closefill': '\ue589', 94 | 'sound': '\ue590', 95 | 'scan': '\ue612' 96 | } 97 | -------------------------------------------------------------------------------- /components/uni-steps/uni-steps.vue: -------------------------------------------------------------------------------- 1 | 37 | 38 | 82 | 83 | 260 | -------------------------------------------------------------------------------- /main.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import App from './App' 3 | import api from './api' 4 | import util from './common/util' 5 | import store from './store' 6 | 7 | Vue.config.productionTip = false 8 | 9 | App.mpType = 'app' 10 | 11 | Vue.prototype.$store = store 12 | Vue.prototype.$api = api 13 | Vue.prototype.$util = util 14 | 15 | const app = new Vue({ 16 | store, 17 | ...App 18 | }) 19 | app.$mount() 20 | -------------------------------------------------------------------------------- /manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name" : "nxdc-milktea", 3 | "appid" : "", 4 | "description" : "", 5 | "versionName" : "1.0.0", 6 | "versionCode" : "100", 7 | "transformPx" : false, 8 | /* 5+App特有相关 */ 9 | "app-plus" : { 10 | "usingComponents" : true, 11 | "nvueCompiler" : "uni-app", 12 | "compilerVersion" : 3, 13 | "splashscreen" : { 14 | "alwaysShowBeforeRender" : true, 15 | "waiting" : true, 16 | "autoclose" : true, 17 | "delay" : 0 18 | }, 19 | /* 模块配置 */ 20 | "modules" : {}, 21 | /* 应用发布信息 */ 22 | "distribute" : { 23 | /* android打包配置 */ 24 | "android" : { 25 | "permissions" : [ 26 | "", 27 | "", 28 | "", 29 | "", 30 | "", 31 | "", 32 | "", 33 | "", 34 | "", 35 | "", 36 | "", 37 | "", 38 | "", 39 | "", 40 | "", 41 | "", 42 | "", 43 | "", 44 | "", 45 | "", 46 | "", 47 | "" 48 | ] 49 | }, 50 | /* ios打包配置 */ 51 | "ios" : {}, 52 | /* SDK配置 */ 53 | "sdkConfigs" : {} 54 | } 55 | }, 56 | /* 快应用特有相关 */ 57 | "quickapp" : {}, 58 | /* 小程序特有相关 */ 59 | "mp-weixin" : { 60 | "appid" : "", 61 | "setting" : { 62 | "urlCheck" : false, 63 | "es6" : false 64 | }, 65 | "usingComponents" : true 66 | }, 67 | "mp-alipay" : { 68 | "usingComponents" : true 69 | }, 70 | "mp-baidu" : { 71 | "usingComponents" : true 72 | }, 73 | "mp-toutiao" : { 74 | "usingComponents" : true 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /pages.json: -------------------------------------------------------------------------------- 1 | { 2 | "pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages 3 | { 4 | "path": "pages/index/index", 5 | "style": { 6 | "navigationStyle": "custom" 7 | } 8 | }, { 9 | "path": "pages/menu/menu", 10 | "style": { 11 | "navigationBarTitleText": "奈雪の茶", 12 | "navigationBarTextStyle": "black", 13 | "navigationBarBackgroundColor": "#ffffff" 14 | } 15 | }, { 16 | "path": "pages/menu/menu1", 17 | "style": { 18 | "navigationBarTitleText": "奈雪の茶", 19 | "navigationBarTextStyle": "black", 20 | "navigationBarBackgroundColor": "#ffffff" 21 | } 22 | },{ 23 | "path": "pages/take-foods/take-foods", 24 | "style": { 25 | "navigationBarTitleText": "奈雪の茶", 26 | "navigationBarTextStyle": "black", 27 | "navigationBarBackgroundColor": "#ffffff" 28 | } 29 | }, { 30 | "path": "pages/mine/mine", 31 | "style": { 32 | "navigationBarTitleText": "奈雪乐园", 33 | "navigationBarTextStyle": "black", 34 | "navigationBarBackgroundColor": "#ffffff" 35 | } 36 | } 37 | ,{ 38 | "path" : "pages/pay/pay", 39 | "style" : { 40 | "navigationBarTitleText": "奈雪の茶", 41 | "navigationBarTextStyle": "black", 42 | "navigationBarBackgroundColor": "#ffffff" 43 | } 44 | } 45 | ,{ 46 | "path" : "pages/remark/remark", 47 | "style" : { 48 | "navigationBarTitleText": "奈雪の茶", 49 | "navigationBarTextStyle": "black", 50 | "navigationBarBackgroundColor": "#ffffff" 51 | } 52 | } 53 | ,{ 54 | "path" : "pages/packages/index", 55 | "style" : { 56 | "navigationBarTitleText": "券包商品", 57 | "navigationBarTextStyle": "black", 58 | "navigationBarBackgroundColor": "#ffffff", 59 | "enablePullDownRefresh": true 60 | } 61 | } 62 | ,{ 63 | "path" : "pages/packages/detail", 64 | "style" : { 65 | "navigationBarTitleText": "购买劵包", 66 | "navigationBarTextStyle": "black", 67 | "navigationBarBackgroundColor": "#ffffff", 68 | "enablePullDownRefresh": true 69 | } 70 | } 71 | ,{ 72 | "path" : "pages/balance/balance", 73 | "style" : { 74 | "navigationBarTitleText": "会员储值", 75 | "navigationBarTextStyle": "black", 76 | "navigationBarBackgroundColor": "#ffffff" 77 | } 78 | } 79 | ,{ 80 | "path" : "pages/login/login", 81 | "style" : { 82 | "navigationBarTitleText": "登录", 83 | "navigationBarTextStyle": "black", 84 | "navigationBarBackgroundColor": "#ffffff" 85 | } 86 | } 87 | ,{ 88 | "path" : "pages/address/address", 89 | "style" : { 90 | "navigationBarTitleText": "我的地址", 91 | "navigationBarTextStyle": "black", 92 | "navigationBarBackgroundColor": "#ffffff" 93 | } 94 | } 95 | ,{ 96 | "path" : "pages/address/add", 97 | "style" : { 98 | "navigationBarTitleText": "奈雪の茶", 99 | "navigationBarTextStyle": "black", 100 | "navigationBarBackgroundColor": "#ffffff" 101 | } 102 | } 103 | ,{ 104 | "path" : "pages/integrals/integrals", 105 | "style" : { 106 | "navigationStyle":"custom", 107 | "onReachBottomDistance": 50 108 | } 109 | } 110 | ,{ 111 | "path" : "pages/attendance/attendance", 112 | "style" : { 113 | "navigationStyle":"custom" 114 | } 115 | } 116 | ,{ 117 | "path" : "pages/orders/orders", 118 | "style" : { 119 | "navigationBarTitleText": "历史订单", 120 | "navigationBarTextStyle": "black", 121 | "navigationBarBackgroundColor": "#ffffff", 122 | "enablePullDownRefresh": true, 123 | "onReachBottomDistance": 50 124 | } 125 | } 126 | ,{ 127 | "path" : "pages/orders/detail", 128 | "style" : { 129 | "navigationBarTitleText": "订单详情", 130 | "navigationBarTextStyle": "black", 131 | "navigationBarBackgroundColor": "#ffffff" 132 | } 133 | } 134 | ,{ 135 | "path" : "pages/mine/member-code", 136 | "style" : { 137 | "navigationBarTitleText": "会员码", 138 | "navigationBarTextStyle": "black", 139 | "navigationBarBackgroundColor": "#ffffff" 140 | } 141 | } 142 | ,{ 143 | "path" : "pages/coupons/coupons", 144 | "style" : { 145 | "navigationBarTitleText": "我的卡券", 146 | "navigationBarTextStyle": "black", 147 | "navigationBarBackgroundColor": "#ffffff" 148 | } 149 | } 150 | ,{ 151 | "path" : "pages/mine/userinfo", 152 | "style" : { 153 | "navigationBarTitleText": "用户信息", 154 | "navigationBarTextStyle": "black", 155 | "navigationBarBackgroundColor": "#ffffff" 156 | } 157 | }, 158 | { 159 | "path" : "pages/integrals/flow", 160 | "style" : { 161 | "navigationBarTitleText": "积分明细", 162 | "navigationBarTextStyle": "black", 163 | "navigationBarBackgroundColor": "#ffffff" 164 | } 165 | }, 166 | { 167 | "path" : "pages/integrals/detail", 168 | "style" : { 169 | "navigationBarTitleText": "兑换详情", 170 | "navigationBarTextStyle": "black", 171 | "navigationBarBackgroundColor": "#ffffff" 172 | } 173 | } 174 | ,{ 175 | "path" : "pages/review/review", 176 | "style" : { 177 | "navigationBarTitleText": "奈雪の茶", 178 | "navigationBarTextStyle": "black", 179 | "navigationBarBackgroundColor": "#ffffff" 180 | } 181 | } 182 | ], 183 | "globalStyle": { 184 | "navigationBarTextStyle": "black", 185 | "navigationBarTitleText": "uni-app", 186 | "navigationBarBackgroundColor": "#F8F8F8", 187 | "backgroundColor": "#F8F8F8" 188 | }, 189 | "tabBar": { 190 | "color": "#919293", 191 | "selectedColor": "#97AF13", 192 | "backgroundColor": "#fff", 193 | "borderStyle": "black", 194 | "list": [{ 195 | "pagePath": "pages/index/index", 196 | "text": "首页", 197 | "iconPath": "static/images/tabBar/index.png", 198 | "selectedIconPath": "static/images/tabBar/index_selected.png" 199 | }, { 200 | "pagePath": "pages/menu/menu", 201 | "text": "点餐", 202 | "iconPath": "static/images/tabBar/drink.png", 203 | "selectedIconPath": "static/images/tabBar/drink_selected.png" 204 | }, { 205 | "pagePath": "pages/take-foods/take-foods", 206 | "text": "取餐", 207 | "iconPath": "static/images/tabBar/take.png", 208 | "selectedIconPath": "static/images/tabBar/take_selected.png" 209 | }, { 210 | "pagePath": "pages/mine/mine", 211 | "text": "我的", 212 | "iconPath": "static/images/tabBar/mine.png", 213 | "selectedIconPath": "static/images/tabBar/mine_selected.png" 214 | }] 215 | } 216 | } 217 | -------------------------------------------------------------------------------- /pages/address/add.vue: -------------------------------------------------------------------------------- 1 | 45 | 46 | 86 | 87 | 152 | -------------------------------------------------------------------------------- /pages/address/address.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 75 | 76 | 129 | -------------------------------------------------------------------------------- /pages/attendance/attendance.vue: -------------------------------------------------------------------------------- 1 | 46 | 47 | 90 | 91 | 203 | -------------------------------------------------------------------------------- /pages/attendance/uni-calendar/uni-calendar-item.vue: -------------------------------------------------------------------------------- 1 | 40 | 41 | 77 | 78 | 176 | -------------------------------------------------------------------------------- /pages/attendance/uni-calendar/util.js: -------------------------------------------------------------------------------- 1 | import CALENDAR from './calendar.js' 2 | 3 | class Calendar { 4 | constructor({ 5 | date, 6 | selected, 7 | startDate, 8 | endDate, 9 | range 10 | } = {}) { 11 | // 当前日期 12 | this.date = this.getDate(date) // 当前初入日期 13 | // 打点信息 14 | this.selected = selected || []; 15 | // 范围开始 16 | this.startDate = startDate 17 | // 范围结束 18 | this.endDate = endDate 19 | this.range = range 20 | // 多选状态 21 | this.multipleStatus = { 22 | before: '', 23 | after: '', 24 | data: [] 25 | } 26 | // 每周日期 27 | this.weeks = {} 28 | 29 | this._getWeek(this.date.fullDate) 30 | } 31 | 32 | /** 33 | * 获取任意时间 34 | */ 35 | getDate(date, AddDayCount = 0, str = 'day') { 36 | if (!date) { 37 | date = new Date() 38 | } 39 | if (typeof date !== 'object') { 40 | date = date.replace(/-/g, '/') 41 | } 42 | const dd = new Date(date) 43 | switch (str) { 44 | case 'day': 45 | dd.setDate(dd.getDate() + AddDayCount) // 获取AddDayCount天后的日期 46 | break 47 | case 'month': 48 | if (dd.getDate() === 31) { 49 | dd.setDate(dd.getDate() + AddDayCount) 50 | } else { 51 | dd.setMonth(dd.getMonth() + AddDayCount) // 获取AddDayCount天后的日期 52 | } 53 | break 54 | case 'year': 55 | dd.setFullYear(dd.getFullYear() + AddDayCount) // 获取AddDayCount天后的日期 56 | break 57 | } 58 | const y = dd.getFullYear() 59 | const m = dd.getMonth() + 1 < 10 ? '0' + (dd.getMonth() + 1) : dd.getMonth() + 1 // 获取当前月份的日期,不足10补0 60 | const d = dd.getDate() < 10 ? '0' + dd.getDate() : dd.getDate() // 获取当前几号,不足10补0 61 | return { 62 | fullDate: y + '-' + m + '-' + d, 63 | year: y, 64 | month: m, 65 | date: d, 66 | day: dd.getDay() 67 | } 68 | } 69 | 70 | 71 | /** 72 | * 获取上月剩余天数 73 | */ 74 | _getLastMonthDays(firstDay, full) { 75 | let dateArr = [] 76 | for (let i = firstDay; i > 0; i--) { 77 | const beforeDate = new Date(full.year, full.month - 1, -i + 1).getDate() 78 | dateArr.push({ 79 | date: beforeDate, 80 | month: full.month - 1, 81 | lunar: this.getlunar(full.year, full.month - 1, beforeDate), 82 | disable: true 83 | }) 84 | } 85 | return dateArr 86 | } 87 | /** 88 | * 获取本月天数 89 | */ 90 | _currentMonthDys(dateData, full) { 91 | let dateArr = [] 92 | let fullDate = this.date.fullDate 93 | for (let i = 1; i <= dateData; i++) { 94 | let isinfo = false 95 | let nowDate = full.year + '-' + (full.month < 10 ? 96 | full.month : full.month) + '-' + (i < 10 ? 97 | '0' + i : i) 98 | // 是否今天 99 | let isDay = fullDate === nowDate 100 | // 获取打点信息 101 | let info = this.selected && this.selected.find((item) => { 102 | if (this.dateEqual(nowDate, item.date)) { 103 | return item 104 | } 105 | }) 106 | 107 | // 日期禁用 108 | let disableBefore = true 109 | let disableAfter = true 110 | if (this.startDate) { 111 | let dateCompBefore = this.dateCompare(this.startDate, fullDate) 112 | disableBefore = this.dateCompare(dateCompBefore ? this.startDate : fullDate, nowDate) 113 | } 114 | 115 | if (this.endDate) { 116 | let dateCompAfter = this.dateCompare(fullDate, this.endDate) 117 | disableAfter = this.dateCompare(nowDate, dateCompAfter ? this.endDate : fullDate) 118 | } 119 | 120 | let multiples = this.multipleStatus.data 121 | let checked = false 122 | let multiplesStatus = -1 123 | if (this.range) { 124 | if (multiples) { 125 | multiplesStatus = multiples.findIndex((item) => { 126 | return this.dateEqual(item, nowDate) 127 | }) 128 | } 129 | if (multiplesStatus !== -1) { 130 | checked = true 131 | } 132 | } 133 | 134 | let data = { 135 | fullDate: nowDate, 136 | year: full.year, 137 | date: i, 138 | multiple: this.range ? checked : false, 139 | month: full.month, 140 | lunar: this.getlunar(full.year, full.month, i), 141 | disable: !disableBefore || !disableAfter, 142 | isDay 143 | } 144 | if (info) { 145 | data.extraInfo = info 146 | } 147 | 148 | dateArr.push(data) 149 | } 150 | return dateArr 151 | } 152 | /** 153 | * 获取下月天数 154 | */ 155 | _getNextMonthDays(surplus, full) { 156 | let dateArr = [] 157 | for (let i = 1; i < surplus + 1; i++) { 158 | dateArr.push({ 159 | date: i, 160 | month: Number(full.month) + 1, 161 | lunar: this.getlunar(full.year, Number(full.month) + 1, i), 162 | disable: true 163 | }) 164 | } 165 | return dateArr 166 | } 167 | /** 168 | * 设置日期 169 | * @param {Object} date 170 | */ 171 | setDate(date) { 172 | this._getWeek(date) 173 | } 174 | /** 175 | * 获取当前日期详情 176 | * @param {Object} date 177 | */ 178 | getInfo(date) { 179 | if (!date) { 180 | date = new Date() 181 | } 182 | const dateInfo = this.canlender.find(item => item.fullDate === this.getDate(date).fullDate) 183 | return dateInfo 184 | } 185 | 186 | /** 187 | * 比较时间大小 188 | */ 189 | dateCompare(startDate, endDate) { 190 | // 计算截止时间 191 | startDate = new Date(startDate.replace('-', '/').replace('-', '/')) 192 | // 计算详细项的截止时间 193 | endDate = new Date(endDate.replace('-', '/').replace('-', '/')) 194 | if (startDate <= endDate) { 195 | return true 196 | } else { 197 | return false 198 | } 199 | } 200 | 201 | /** 202 | * 比较时间是否相等 203 | */ 204 | dateEqual(before, after) { 205 | // 计算截止时间 206 | before = new Date(before.replace('-', '/').replace('-', '/')) 207 | // 计算详细项的截止时间 208 | after = new Date(after.replace('-', '/').replace('-', '/')) 209 | if (before.getTime() - after.getTime() === 0) { 210 | return true 211 | } else { 212 | return false 213 | } 214 | } 215 | 216 | 217 | /** 218 | * 获取日期范围内所有日期 219 | * @param {Object} begin 220 | * @param {Object} end 221 | */ 222 | geDateAll(begin, end) { 223 | var arr = [] 224 | var ab = begin.split('-') 225 | var ae = end.split('-') 226 | var db = new Date() 227 | db.setFullYear(ab[0], ab[1] - 1, ab[2]) 228 | var de = new Date() 229 | de.setFullYear(ae[0], ae[1] - 1, ae[2]) 230 | var unixDb = db.getTime() - 24 * 60 * 60 * 1000 231 | var unixDe = de.getTime() - 24 * 60 * 60 * 1000 232 | for (var k = unixDb; k <= unixDe;) { 233 | k = k + 24 * 60 * 60 * 1000 234 | arr.push(this.getDate(new Date(parseInt(k))).fullDate) 235 | } 236 | return arr 237 | } 238 | /** 239 | * 计算阴历日期显示 240 | */ 241 | getlunar(year, month, date) { 242 | return CALENDAR.solar2lunar(year, month, date) 243 | } 244 | /** 245 | * 设置打点 246 | */ 247 | setSelectInfo(data, value) { 248 | this.selected = value 249 | this._getWeek(data) 250 | } 251 | 252 | /** 253 | * 获取多选状态 254 | */ 255 | setMultiple(fullDate) { 256 | let { 257 | before, 258 | after 259 | } = this.multipleStatus 260 | if (!this.range) return 261 | if (before && after) { 262 | this.multipleStatus.before = '' 263 | this.multipleStatus.after = '' 264 | this.multipleStatus.data = [] 265 | this._getWeek(fullDate) 266 | } else { 267 | if (!before) { 268 | this.multipleStatus.before = fullDate 269 | } else { 270 | this.multipleStatus.after = fullDate 271 | if (this.dateCompare(this.multipleStatus.before, this.multipleStatus.after)) { 272 | this.multipleStatus.data = this.geDateAll(this.multipleStatus.before, this.multipleStatus.after); 273 | } else { 274 | this.multipleStatus.data = this.geDateAll(this.multipleStatus.after, this.multipleStatus.before); 275 | } 276 | this._getWeek(fullDate) 277 | } 278 | } 279 | } 280 | 281 | /** 282 | * 获取每周数据 283 | * @param {Object} dateData 284 | */ 285 | _getWeek(dateData) { 286 | const { 287 | fullDate, 288 | year, 289 | month, 290 | date, 291 | day 292 | } = this.getDate(dateData) 293 | let firstDay = new Date(year, month - 1, 1).getDay() 294 | let currentDay = new Date(year, month, 0).getDate() 295 | let dates = { 296 | lastMonthDays: this._getLastMonthDays(firstDay, this.getDate(dateData)), // 上个月末尾几天 297 | currentMonthDys: this._currentMonthDys(currentDay, this.getDate(dateData)), // 本月天数 298 | nextMonthDays: [], // 下个月开始几天 299 | weeks: [] 300 | } 301 | let canlender = [] 302 | const surplus = 42 - (dates.lastMonthDays.length + dates.currentMonthDys.length) 303 | dates.nextMonthDays = this._getNextMonthDays(surplus, this.getDate(dateData)) 304 | canlender = canlender.concat(dates.lastMonthDays, dates.currentMonthDys, dates.nextMonthDays) 305 | let weeks = {} 306 | // 拼接数组 上个月开始几天 + 本月天数+ 下个月开始几天 307 | for (let i = 0; i < canlender.length; i++) { 308 | if (i % 7 === 0) { 309 | weeks[parseInt(i / 7)] = new Array(7) 310 | } 311 | weeks[parseInt(i / 7)][i % 7] = canlender[i] 312 | } 313 | this.canlender = canlender 314 | this.weeks = weeks 315 | } 316 | 317 | //静态方法 318 | // static init(date) { 319 | // if (!this.instance) { 320 | // this.instance = new Calendar(date); 321 | // } 322 | // return this.instance; 323 | // } 324 | } 325 | 326 | 327 | export default Calendar 328 | -------------------------------------------------------------------------------- /pages/balance/balance.vue: -------------------------------------------------------------------------------- 1 | 49 | 50 | 74 | 75 | 123 | -------------------------------------------------------------------------------- /pages/coupons/coupons.vue: -------------------------------------------------------------------------------- 1 | 55 | 56 | 129 | 130 | 302 | -------------------------------------------------------------------------------- /pages/integrals/detail.vue: -------------------------------------------------------------------------------- 1 | 76 | 77 | 109 | 110 | 201 | -------------------------------------------------------------------------------- /pages/integrals/flow.vue: -------------------------------------------------------------------------------- 1 | 25 | 26 | 47 | 48 | 73 | -------------------------------------------------------------------------------- /pages/integrals/integrals.vue: -------------------------------------------------------------------------------- 1 | 66 | 67 | 145 | 146 | 229 | -------------------------------------------------------------------------------- /pages/login/login.vue: -------------------------------------------------------------------------------- 1 | 52 | 53 | 106 | 107 | 163 | -------------------------------------------------------------------------------- /pages/mine/member-code.vue: -------------------------------------------------------------------------------- 1 | 56 | 57 | 134 | 135 | 226 | -------------------------------------------------------------------------------- /pages/mine/userinfo.vue: -------------------------------------------------------------------------------- 1 | 57 | 58 | 108 | 109 | 162 | -------------------------------------------------------------------------------- /pages/orders/detail.vue: -------------------------------------------------------------------------------- 1 | 122 | 123 | 149 | 150 | 238 | -------------------------------------------------------------------------------- /pages/orders/orders.vue: -------------------------------------------------------------------------------- 1 | 45 | 46 | 139 | 140 | 143 | -------------------------------------------------------------------------------- /pages/packages/detail.vue: -------------------------------------------------------------------------------- 1 | 68 | 69 | 109 | 110 | 138 | -------------------------------------------------------------------------------- /pages/packages/index.vue: -------------------------------------------------------------------------------- 1 | 24 | 25 | 58 | 59 | 74 | -------------------------------------------------------------------------------- /pages/remark/remark.vue: -------------------------------------------------------------------------------- 1 |