Commit 2e266044 by xuzhenghua

pull

parent 40ecb861
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
{
"mrstatic/js/0.fca6c57e.chunk.js": "/mrstatic/js/0.fca6c57e.chunk.js",
"mrstatic/js/0.fca6c57e.chunk.js.map": "/mrstatic/js/0.fca6c57e.chunk.js.map",
"mrstatic/js/1.79bef975.chunk.js": "/mrstatic/js/1.79bef975.chunk.js",
"mrstatic/js/1.79bef975.chunk.js.map": "/mrstatic/js/1.79bef975.chunk.js.map",
"mrstatic/css/2.35b4f89e.chunk.css": "/mrstatic/css/2.35b4f89e.chunk.css",
"mrstatic/js/2.3e9eae54.chunk.js": "/mrstatic/js/2.3e9eae54.chunk.js",
"mrstatic/js/2.3e9eae54.chunk.js.map": "/mrstatic/js/2.3e9eae54.chunk.js.map",
"mrstatic/css/3.bf839917.chunk.css": "/mrstatic/css/3.bf839917.chunk.css",
"mrstatic/js/3.887af415.chunk.js": "/mrstatic/js/3.887af415.chunk.js",
"mrstatic/js/3.887af415.chunk.js.map": "/mrstatic/js/3.887af415.chunk.js.map",
"mrstatic/css/4.161e1f66.chunk.css": "/mrstatic/css/4.161e1f66.chunk.css",
"mrstatic/js/4.8986e0eb.chunk.js": "/mrstatic/js/4.8986e0eb.chunk.js",
"mrstatic/js/4.8986e0eb.chunk.js.map": "/mrstatic/js/4.8986e0eb.chunk.js.map",
"mrstatic/js/5.0fa85971.chunk.js": "/mrstatic/js/5.0fa85971.chunk.js",
"mrstatic/js/5.0fa85971.chunk.js.map": "/mrstatic/js/5.0fa85971.chunk.js.map",
"Activity.css": "/mrstatic/css/Activity.6260646a.chunk.css",
"Activity.js": "/mrstatic/js/Activity.bbb32ff9.chunk.js",
"Activity.js.map": "/mrstatic/js/Activity.bbb32ff9.chunk.js.map",
"BargainMiddlePage.css": "/mrstatic/css/BargainMiddlePage.eb686c74.chunk.css",
"BargainMiddlePage.js": "/mrstatic/js/BargainMiddlePage.66b7f13c.chunk.js",
"BargainMiddlePage.js.map": "/mrstatic/js/BargainMiddlePage.66b7f13c.chunk.js.map",
"Classify.css": "/mrstatic/css/Classify.fb4bedde.chunk.css",
"Classify.js": "/mrstatic/js/Classify.9ede63f4.chunk.js",
"Classify.js.map": "/mrstatic/js/Classify.9ede63f4.chunk.js.map",
"Country.css": "/mrstatic/css/Country.2d34330b.chunk.css",
"Country.js": "/mrstatic/js/Country.35064829.chunk.js",
"Country.js.map": "/mrstatic/js/Country.35064829.chunk.js.map",
"CourseList.css": "/mrstatic/css/CourseList.afc8902e.chunk.css",
"CourseList.js": "/mrstatic/js/CourseList.23f60fb6.chunk.js",
"CourseList.js.map": "/mrstatic/js/CourseList.23f60fb6.chunk.js.map",
"DrawDocument.css": "/mrstatic/css/DrawDocument.aeb3f822.chunk.css",
"DrawDocument.js": "/mrstatic/js/DrawDocument.d7cca39c.chunk.js",
"DrawDocument.js.map": "/mrstatic/js/DrawDocument.d7cca39c.chunk.js.map",
"Examination.css": "/mrstatic/css/Examination.7bb0622b.chunk.css",
"Examination.js": "/mrstatic/js/Examination.ab78ae34.chunk.js",
"Examination.js.map": "/mrstatic/js/Examination.ab78ae34.chunk.js.map",
"Invite.css": "/mrstatic/css/Invite.6260646a.chunk.css",
"Invite.js": "/mrstatic/js/Invite.810acbcc.chunk.js",
"Invite.js.map": "/mrstatic/js/Invite.810acbcc.chunk.js.map",
"MyEdit.js": "/mrstatic/js/MyEdit.85e7fd93.chunk.js",
"MyEdit.js.map": "/mrstatic/js/MyEdit.85e7fd93.chunk.js.map",
"Order.css": "/mrstatic/css/Order.8c058a7a.chunk.css",
"Order.js": "/mrstatic/js/Order.4f912514.chunk.js",
"Order.js.map": "/mrstatic/js/Order.4f912514.chunk.js.map",
"Orderinfo.js": "/mrstatic/js/Orderinfo.bbe4abd7.chunk.js",
"Orderinfo.js.map": "/mrstatic/js/Orderinfo.bbe4abd7.chunk.js.map",
"PayOrder.css": "/mrstatic/css/PayOrder.7eb7d317.chunk.css",
"PayOrder.js": "/mrstatic/js/PayOrder.57e0a057.chunk.js",
"PayOrder.js.map": "/mrstatic/js/PayOrder.57e0a057.chunk.js.map",
"Preferential.css": "/mrstatic/css/Preferential.12a8297c.chunk.css",
"Preferential.js": "/mrstatic/js/Preferential.e194c179.chunk.js",
"Preferential.js.map": "/mrstatic/js/Preferential.e194c179.chunk.js.map",
"SearchResult.css": "/mrstatic/css/SearchResult.cdf852c1.chunk.css",
"SearchResult.js": "/mrstatic/js/SearchResult.40c95eac.chunk.js",
"SearchResult.js.map": "/mrstatic/js/SearchResult.40c95eac.chunk.js.map",
"ShareCourse.css": "/mrstatic/css/ShareCourse.8046fb41.chunk.css",
"ShareCourse.js": "/mrstatic/js/ShareCourse.68b4ce5d.chunk.js",
"ShareCourse.js.map": "/mrstatic/js/ShareCourse.68b4ce5d.chunk.js.map",
"ShopCart.css": "/mrstatic/css/ShopCart.92ab48a3.chunk.css",
"ShopCart.js": "/mrstatic/js/ShopCart.04fdb268.chunk.js",
"ShopCart.js.map": "/mrstatic/js/ShopCart.04fdb268.chunk.js.map",
"aist-share.css": "/mrstatic/css/aist-share.40873df0.chunk.css",
"aist-share.js": "/mrstatic/js/aist-share.fd432927.chunk.js",
"aist-share.js.map": "/mrstatic/js/aist-share.fd432927.chunk.js.map",
"blessing-getPrize.css": "/mrstatic/css/blessing-getPrize.5a935f68.chunk.css",
"blessing-getPrize.js": "/mrstatic/js/blessing-getPrize.7bf56432.chunk.js",
"blessing-getPrize.js.map": "/mrstatic/js/blessing-getPrize.7bf56432.chunk.js.map",
"blessing-preheat.css": "/mrstatic/css/blessing-preheat.4e9bf434.chunk.css",
"blessing-preheat.js": "/mrstatic/js/blessing-preheat.45a8fb0d.chunk.js",
"blessing-preheat.js.map": "/mrstatic/js/blessing-preheat.45a8fb0d.chunk.js.map",
"blessing-rank.css": "/mrstatic/css/blessing-rank.91e559d5.chunk.css",
"blessing-rank.js": "/mrstatic/js/blessing-rank.011deb41.chunk.js",
"blessing-rank.js.map": "/mrstatic/js/blessing-rank.011deb41.chunk.js.map",
"coupons.css": "/mrstatic/css/coupons.466858c7.chunk.css",
"coupons.js": "/mrstatic/js/coupons.f4692aac.chunk.js",
"coupons.js.map": "/mrstatic/js/coupons.f4692aac.chunk.js.map",
"deposit-order.css": "/mrstatic/css/deposit-order.5ea077aa.chunk.css",
"deposit-order.js": "/mrstatic/js/deposit-order.975377d0.chunk.js",
"deposit-order.js.map": "/mrstatic/js/deposit-order.975377d0.chunk.js.map",
"deposit-pay-order.css": "/mrstatic/css/deposit-pay-order.09ce6fd5.chunk.css",
"deposit-pay-order.js": "/mrstatic/js/deposit-pay-order.f9902f98.chunk.js",
"deposit-pay-order.js.map": "/mrstatic/js/deposit-pay-order.f9902f98.chunk.js.map",
"detail.css": "/mrstatic/css/detail.54d9956e.chunk.css",
"detail.js": "/mrstatic/js/detail.25021b2f.chunk.js",
"detail.js.map": "/mrstatic/js/detail.25021b2f.chunk.js.map",
"main.css": "/mrstatic/css/main.532b6b06.chunk.css",
"main.js": "/mrstatic/js/main.b1467882.chunk.js",
"main.js.map": "/mrstatic/js/main.b1467882.chunk.js.map",
"myorders.css": "/mrstatic/css/myorders.179a42fc.chunk.css",
"myorders.js": "/mrstatic/js/myorders.7f319191.chunk.js",
"myorders.js.map": "/mrstatic/js/myorders.7f319191.chunk.js.map",
"newyear-2019-landing.css": "/mrstatic/css/newyear-2019-landing.bcab538c.chunk.css",
"newyear-2019-landing.js": "/mrstatic/js/newyear-2019-landing.ac08bac6.chunk.js",
"newyear-2019-landing.js.map": "/mrstatic/js/newyear-2019-landing.ac08bac6.chunk.js.map",
"newyear-yearIndex.css": "/mrstatic/css/newyear-yearIndex.a8268a94.chunk.css",
"newyear-yearIndex.js": "/mrstatic/js/newyear-yearIndex.c4784501.chunk.js",
"newyear-yearIndex.js.map": "/mrstatic/js/newyear-yearIndex.c4784501.chunk.js.map",
"prize-winner-list.css": "/mrstatic/css/prize-winner-list.3eee90af.chunk.css",
"prize-winner-list.js": "/mrstatic/js/prize-winner-list.7f6db414.chunk.js",
"prize-winner-list.js.map": "/mrstatic/js/prize-winner-list.7f6db414.chunk.js.map",
"purchased.css": "/mrstatic/css/purchased.bb758677.chunk.css",
"purchased.js": "/mrstatic/js/purchased.e9d34e7e.chunk.js",
"purchased.js.map": "/mrstatic/js/purchased.e9d34e7e.chunk.js.map",
"python-class.css": "/mrstatic/css/python-class.49baf51f.chunk.css",
"python-class.js": "/mrstatic/js/python-class.4b294dde.chunk.js",
"python-class.js.map": "/mrstatic/js/python-class.4b294dde.chunk.js.map",
"runtime~main.js": "/mrstatic/js/runtime~main.9e6ab12e.js",
"runtime~main.js.map": "/mrstatic/js/runtime~main.9e6ab12e.js.map",
"search.css": "/mrstatic/css/search.5716d9b3.chunk.css",
"search.js": "/mrstatic/js/search.ca3c9036.chunk.js",
"search.js.map": "/mrstatic/js/search.ca3c9036.chunk.js.map",
"shareposter.css": "/mrstatic/css/shareposter.76774ba4.chunk.css",
"shareposter.js": "/mrstatic/js/shareposter.0da28346.chunk.js",
"shareposter.js.map": "/mrstatic/js/shareposter.0da28346.chunk.js.map",
"study.css": "/mrstatic/css/study.bf6b9b43.chunk.css",
"study.js": "/mrstatic/js/study.5eccc49d.chunk.js",
"study.js.map": "/mrstatic/js/study.5eccc49d.chunk.js.map",
"system-notices.css": "/mrstatic/css/system-notices.080e0d27.chunk.css",
"system-notices.js": "/mrstatic/js/system-notices.c190f20d.chunk.js",
"system-notices.js.map": "/mrstatic/js/system-notices.c190f20d.chunk.js.map",
"togroup.css": "/mrstatic/css/togroup.f08bc5f3.chunk.css",
"togroup.js": "/mrstatic/js/togroup.fa94cde5.chunk.js",
"togroup.js.map": "/mrstatic/js/togroup.fa94cde5.chunk.js.map",
"video.css": "/mrstatic/css/video.1c1131c9.chunk.css",
"video.js": "/mrstatic/js/video.23aa9835.chunk.js",
"video.js.map": "/mrstatic/js/video.23aa9835.chunk.js.map",
"mrstatic/css/44.b198ad93.chunk.css": "/mrstatic/css/44.b198ad93.chunk.css",
"mrstatic/js/44.642b6246.chunk.js": "/mrstatic/js/44.642b6246.chunk.js",
"mrstatic/js/44.642b6246.chunk.js.map": "/mrstatic/js/44.642b6246.chunk.js.map",
"mrstatic/css/45.a156a0a0.chunk.css": "/mrstatic/css/45.a156a0a0.chunk.css",
"mrstatic/js/45.b9ad70e1.chunk.js": "/mrstatic/js/45.b9ad70e1.chunk.js",
"mrstatic/js/45.b9ad70e1.chunk.js.map": "/mrstatic/js/45.b9ad70e1.chunk.js.map",
"mrstatic/css/46.bff100af.chunk.css": "/mrstatic/css/46.bff100af.chunk.css",
"mrstatic/js/46.296ab055.chunk.js": "/mrstatic/js/46.296ab055.chunk.js",
"mrstatic/js/46.296ab055.chunk.js.map": "/mrstatic/js/46.296ab055.chunk.js.map",
"mrstatic/css/47.820320a6.chunk.css": "/mrstatic/css/47.820320a6.chunk.css",
"mrstatic/js/47.33a8c3bc.chunk.js": "/mrstatic/js/47.33a8c3bc.chunk.js",
"mrstatic/js/47.33a8c3bc.chunk.js.map": "/mrstatic/js/47.33a8c3bc.chunk.js.map",
"mrstatic/css/48.35e22f8c.chunk.css": "/mrstatic/css/48.35e22f8c.chunk.css",
"mrstatic/js/48.8cced5a9.chunk.js": "/mrstatic/js/48.8cced5a9.chunk.js",
"mrstatic/js/48.8cced5a9.chunk.js.map": "/mrstatic/js/48.8cced5a9.chunk.js.map",
"mrstatic/css/49.1146f09d.chunk.css": "/mrstatic/css/49.1146f09d.chunk.css",
"mrstatic/js/49.46e3ca0f.chunk.js": "/mrstatic/js/49.46e3ca0f.chunk.js",
"mrstatic/js/49.46e3ca0f.chunk.js.map": "/mrstatic/js/49.46e3ca0f.chunk.js.map",
"mrstatic/css/50.befec011.chunk.css": "/mrstatic/css/50.befec011.chunk.css",
"mrstatic/js/50.599b175e.chunk.js": "/mrstatic/js/50.599b175e.chunk.js",
"mrstatic/js/50.599b175e.chunk.js.map": "/mrstatic/js/50.599b175e.chunk.js.map",
"mrstatic/css/51.b02d1de6.chunk.css": "/mrstatic/css/51.b02d1de6.chunk.css",
"mrstatic/js/51.20e1591a.chunk.js": "/mrstatic/js/51.20e1591a.chunk.js",
"mrstatic/js/51.20e1591a.chunk.js.map": "/mrstatic/js/51.20e1591a.chunk.js.map",
"mrstatic/js/0.a1f55c4b.chunk.js": "/mrstatic/js/0.a1f55c4b.chunk.js",
"mrstatic/js/0.a1f55c4b.chunk.js.map": "/mrstatic/js/0.a1f55c4b.chunk.js.map",
"mrstatic/css/1.b4627248.chunk.css": "/mrstatic/css/1.b4627248.chunk.css",
"mrstatic/js/1.e07f5dff.chunk.js": "/mrstatic/js/1.e07f5dff.chunk.js",
"mrstatic/js/1.e07f5dff.chunk.js.map": "/mrstatic/js/1.e07f5dff.chunk.js.map",
"mrstatic/css/2.1133c967.chunk.css": "/mrstatic/css/2.1133c967.chunk.css",
"mrstatic/js/2.0fac390d.chunk.js": "/mrstatic/js/2.0fac390d.chunk.js",
"mrstatic/js/2.0fac390d.chunk.js.map": "/mrstatic/js/2.0fac390d.chunk.js.map",
"mrstatic/css/3.ac8fad1f.chunk.css": "/mrstatic/css/3.ac8fad1f.chunk.css",
"mrstatic/js/3.8c1cc18f.chunk.js": "/mrstatic/js/3.8c1cc18f.chunk.js",
"mrstatic/js/3.8c1cc18f.chunk.js.map": "/mrstatic/js/3.8c1cc18f.chunk.js.map",
"Activity.css": "/mrstatic/css/Activity.08739942.chunk.css",
"Activity.js": "/mrstatic/js/Activity.e2fb033f.chunk.js",
"Activity.js.map": "/mrstatic/js/Activity.e2fb033f.chunk.js.map",
"BargainMiddlePage.css": "/mrstatic/css/BargainMiddlePage.2a913483.chunk.css",
"BargainMiddlePage.js": "/mrstatic/js/BargainMiddlePage.55155992.chunk.js",
"BargainMiddlePage.js.map": "/mrstatic/js/BargainMiddlePage.55155992.chunk.js.map",
"Classify.css": "/mrstatic/css/Classify.127d35ae.chunk.css",
"Classify.js": "/mrstatic/js/Classify.8163d312.chunk.js",
"Classify.js.map": "/mrstatic/js/Classify.8163d312.chunk.js.map",
"Country.css": "/mrstatic/css/Country.400393b7.chunk.css",
"Country.js": "/mrstatic/js/Country.141c61f5.chunk.js",
"Country.js.map": "/mrstatic/js/Country.141c61f5.chunk.js.map",
"CourseList.css": "/mrstatic/css/CourseList.fed92c83.chunk.css",
"CourseList.js": "/mrstatic/js/CourseList.f21dd678.chunk.js",
"CourseList.js.map": "/mrstatic/js/CourseList.f21dd678.chunk.js.map",
"DrawDocument.css": "/mrstatic/css/DrawDocument.1bd3da48.chunk.css",
"DrawDocument.js": "/mrstatic/js/DrawDocument.e531d30d.chunk.js",
"DrawDocument.js.map": "/mrstatic/js/DrawDocument.e531d30d.chunk.js.map",
"Examination.css": "/mrstatic/css/Examination.17af9370.chunk.css",
"Examination.js": "/mrstatic/js/Examination.5cac77c0.chunk.js",
"Examination.js.map": "/mrstatic/js/Examination.5cac77c0.chunk.js.map",
"Invite.css": "/mrstatic/css/Invite.08739942.chunk.css",
"Invite.js": "/mrstatic/js/Invite.28851ee3.chunk.js",
"Invite.js.map": "/mrstatic/js/Invite.28851ee3.chunk.js.map",
"MyEdit.js": "/mrstatic/js/MyEdit.37e552a7.chunk.js",
"MyEdit.js.map": "/mrstatic/js/MyEdit.37e552a7.chunk.js.map",
"Order.css": "/mrstatic/css/Order.83a999aa.chunk.css",
"Order.js": "/mrstatic/js/Order.a1d6e215.chunk.js",
"Order.js.map": "/mrstatic/js/Order.a1d6e215.chunk.js.map",
"Orderinfo.js": "/mrstatic/js/Orderinfo.78f26106.chunk.js",
"Orderinfo.js.map": "/mrstatic/js/Orderinfo.78f26106.chunk.js.map",
"PayOrder.css": "/mrstatic/css/PayOrder.68a25070.chunk.css",
"PayOrder.js": "/mrstatic/js/PayOrder.e70e405c.chunk.js",
"PayOrder.js.map": "/mrstatic/js/PayOrder.e70e405c.chunk.js.map",
"Preferential.css": "/mrstatic/css/Preferential.ccebc534.chunk.css",
"Preferential.js": "/mrstatic/js/Preferential.36f584f7.chunk.js",
"Preferential.js.map": "/mrstatic/js/Preferential.36f584f7.chunk.js.map",
"SearchResult.css": "/mrstatic/css/SearchResult.6d7d1b77.chunk.css",
"SearchResult.js": "/mrstatic/js/SearchResult.1d558834.chunk.js",
"SearchResult.js.map": "/mrstatic/js/SearchResult.1d558834.chunk.js.map",
"ShareCourse.css": "/mrstatic/css/ShareCourse.6e885738.chunk.css",
"ShareCourse.js": "/mrstatic/js/ShareCourse.c519a5df.chunk.js",
"ShareCourse.js.map": "/mrstatic/js/ShareCourse.c519a5df.chunk.js.map",
"ShopCart.css": "/mrstatic/css/ShopCart.887eb690.chunk.css",
"ShopCart.js": "/mrstatic/js/ShopCart.58cf523e.chunk.js",
"ShopCart.js.map": "/mrstatic/js/ShopCart.58cf523e.chunk.js.map",
"aist-share.css": "/mrstatic/css/aist-share.affb05d7.chunk.css",
"aist-share.js": "/mrstatic/js/aist-share.7664e04e.chunk.js",
"aist-share.js.map": "/mrstatic/js/aist-share.7664e04e.chunk.js.map",
"blessing-getPrize.css": "/mrstatic/css/blessing-getPrize.32a9cccc.chunk.css",
"blessing-getPrize.js": "/mrstatic/js/blessing-getPrize.3af378d7.chunk.js",
"blessing-getPrize.js.map": "/mrstatic/js/blessing-getPrize.3af378d7.chunk.js.map",
"blessing-preheat.css": "/mrstatic/css/blessing-preheat.0800b4f0.chunk.css",
"blessing-preheat.js": "/mrstatic/js/blessing-preheat.2724652b.chunk.js",
"blessing-preheat.js.map": "/mrstatic/js/blessing-preheat.2724652b.chunk.js.map",
"blessing-rank.css": "/mrstatic/css/blessing-rank.39fb77c8.chunk.css",
"blessing-rank.js": "/mrstatic/js/blessing-rank.60ea5af3.chunk.js",
"blessing-rank.js.map": "/mrstatic/js/blessing-rank.60ea5af3.chunk.js.map",
"coupons.css": "/mrstatic/css/coupons.0ce3fd3d.chunk.css",
"coupons.js": "/mrstatic/js/coupons.2b77f2be.chunk.js",
"coupons.js.map": "/mrstatic/js/coupons.2b77f2be.chunk.js.map",
"deposit-order.css": "/mrstatic/css/deposit-order.2e5f43c4.chunk.css",
"deposit-order.js": "/mrstatic/js/deposit-order.94eca8ab.chunk.js",
"deposit-order.js.map": "/mrstatic/js/deposit-order.94eca8ab.chunk.js.map",
"deposit-pay-order.css": "/mrstatic/css/deposit-pay-order.e8363b32.chunk.css",
"deposit-pay-order.js": "/mrstatic/js/deposit-pay-order.5709d01a.chunk.js",
"deposit-pay-order.js.map": "/mrstatic/js/deposit-pay-order.5709d01a.chunk.js.map",
"detail.css": "/mrstatic/css/detail.633b10a8.chunk.css",
"detail.js": "/mrstatic/js/detail.7bed0938.chunk.js",
"detail.js.map": "/mrstatic/js/detail.7bed0938.chunk.js.map",
"main.css": "/mrstatic/css/main.fe158352.chunk.css",
"main.js": "/mrstatic/js/main.f04c6995.chunk.js",
"main.js.map": "/mrstatic/js/main.f04c6995.chunk.js.map",
"myorders.css": "/mrstatic/css/myorders.841d0cfb.chunk.css",
"myorders.js": "/mrstatic/js/myorders.d820f269.chunk.js",
"myorders.js.map": "/mrstatic/js/myorders.d820f269.chunk.js.map",
"newyear-2019-landing.css": "/mrstatic/css/newyear-2019-landing.dc74ab02.chunk.css",
"newyear-2019-landing.js": "/mrstatic/js/newyear-2019-landing.98ec9529.chunk.js",
"newyear-2019-landing.js.map": "/mrstatic/js/newyear-2019-landing.98ec9529.chunk.js.map",
"newyear-yearIndex.css": "/mrstatic/css/newyear-yearIndex.9039f86b.chunk.css",
"newyear-yearIndex.js": "/mrstatic/js/newyear-yearIndex.76419495.chunk.js",
"newyear-yearIndex.js.map": "/mrstatic/js/newyear-yearIndex.76419495.chunk.js.map",
"prize-winner-list.css": "/mrstatic/css/prize-winner-list.ce85cb83.chunk.css",
"prize-winner-list.js": "/mrstatic/js/prize-winner-list.b2af75ba.chunk.js",
"prize-winner-list.js.map": "/mrstatic/js/prize-winner-list.b2af75ba.chunk.js.map",
"purchased.css": "/mrstatic/css/purchased.7558403e.chunk.css",
"purchased.js": "/mrstatic/js/purchased.89577d91.chunk.js",
"purchased.js.map": "/mrstatic/js/purchased.89577d91.chunk.js.map",
"python-class.css": "/mrstatic/css/python-class.11408886.chunk.css",
"python-class.js": "/mrstatic/js/python-class.16892808.chunk.js",
"python-class.js.map": "/mrstatic/js/python-class.16892808.chunk.js.map",
"runtime~main.js": "/mrstatic/js/runtime~main.bfb0a037.js",
"runtime~main.js.map": "/mrstatic/js/runtime~main.bfb0a037.js.map",
"search.css": "/mrstatic/css/search.efa1dd44.chunk.css",
"search.js": "/mrstatic/js/search.32e22912.chunk.js",
"search.js.map": "/mrstatic/js/search.32e22912.chunk.js.map",
"shareposter.css": "/mrstatic/css/shareposter.cde549fc.chunk.css",
"shareposter.js": "/mrstatic/js/shareposter.9564bc99.chunk.js",
"shareposter.js.map": "/mrstatic/js/shareposter.9564bc99.chunk.js.map",
"study.css": "/mrstatic/css/study.62b8863b.chunk.css",
"study.js": "/mrstatic/js/study.c43ef6d6.chunk.js",
"study.js.map": "/mrstatic/js/study.c43ef6d6.chunk.js.map",
"system-notices.css": "/mrstatic/css/system-notices.4fbf61d8.chunk.css",
"system-notices.js": "/mrstatic/js/system-notices.d28438a2.chunk.js",
"system-notices.js.map": "/mrstatic/js/system-notices.d28438a2.chunk.js.map",
"togroup.css": "/mrstatic/css/togroup.ffd8be6c.chunk.css",
"togroup.js": "/mrstatic/js/togroup.f1aeeaa3.chunk.js",
"togroup.js.map": "/mrstatic/js/togroup.f1aeeaa3.chunk.js.map",
"video.css": "/mrstatic/css/video.b3755c1b.chunk.css",
"video.js": "/mrstatic/js/video.2777335b.chunk.js",
"video.js.map": "/mrstatic/js/video.2777335b.chunk.js.map",
"mrstatic/css/42.2c1f7d7c.chunk.css": "/mrstatic/css/42.2c1f7d7c.chunk.css",
"mrstatic/js/42.b488dab0.chunk.js": "/mrstatic/js/42.b488dab0.chunk.js",
"mrstatic/js/42.b488dab0.chunk.js.map": "/mrstatic/js/42.b488dab0.chunk.js.map",
"mrstatic/js/43.f063ef63.chunk.js": "/mrstatic/js/43.f063ef63.chunk.js",
"mrstatic/js/43.f063ef63.chunk.js.map": "/mrstatic/js/43.f063ef63.chunk.js.map",
"mrstatic/css/44.976b2058.chunk.css": "/mrstatic/css/44.976b2058.chunk.css",
"mrstatic/js/44.346f8d8b.chunk.js": "/mrstatic/js/44.346f8d8b.chunk.js",
"mrstatic/js/44.346f8d8b.chunk.js.map": "/mrstatic/js/44.346f8d8b.chunk.js.map",
"mrstatic/css/45.51412fcd.chunk.css": "/mrstatic/css/45.51412fcd.chunk.css",
"mrstatic/js/45.83264ccd.chunk.js": "/mrstatic/js/45.83264ccd.chunk.js",
"mrstatic/js/45.83264ccd.chunk.js.map": "/mrstatic/js/45.83264ccd.chunk.js.map",
"mrstatic/js/46.e2b5c822.chunk.js": "/mrstatic/js/46.e2b5c822.chunk.js",
"mrstatic/js/46.e2b5c822.chunk.js.map": "/mrstatic/js/46.e2b5c822.chunk.js.map",
"mrstatic/css/47.e292ab6b.chunk.css": "/mrstatic/css/47.e292ab6b.chunk.css",
"mrstatic/js/47.39c28519.chunk.js": "/mrstatic/js/47.39c28519.chunk.js",
"mrstatic/js/47.39c28519.chunk.js.map": "/mrstatic/js/47.39c28519.chunk.js.map",
"mrstatic/css/48.37fb0c23.chunk.css": "/mrstatic/css/48.37fb0c23.chunk.css",
"mrstatic/js/48.eb589f62.chunk.js": "/mrstatic/js/48.eb589f62.chunk.js",
"mrstatic/js/48.eb589f62.chunk.js.map": "/mrstatic/js/48.eb589f62.chunk.js.map",
"mrstatic/css/49.56b04545.chunk.css": "/mrstatic/css/49.56b04545.chunk.css",
"mrstatic/js/49.40cd7435.chunk.js": "/mrstatic/js/49.40cd7435.chunk.js",
"mrstatic/js/49.40cd7435.chunk.js.map": "/mrstatic/js/49.40cd7435.chunk.js.map",
"mrstatic/css/50.ce17075b.chunk.css": "/mrstatic/css/50.ce17075b.chunk.css",
"mrstatic/js/50.81199908.chunk.js": "/mrstatic/js/50.81199908.chunk.js",
"mrstatic/js/50.81199908.chunk.js.map": "/mrstatic/js/50.81199908.chunk.js.map",
"mrstatic/css/51.bacf914e.chunk.css": "/mrstatic/css/51.bacf914e.chunk.css",
"mrstatic/js/51.f38b57e4.chunk.js": "/mrstatic/js/51.f38b57e4.chunk.js",
"mrstatic/js/51.f38b57e4.chunk.js.map": "/mrstatic/js/51.f38b57e4.chunk.js.map",
"index.html": "/index.html",
"mrstatic/css/2.35b4f89e.chunk.css.map": "/mrstatic/css/2.35b4f89e.chunk.css.map",
"mrstatic/css/3.bf839917.chunk.css.map": "/mrstatic/css/3.bf839917.chunk.css.map",
"mrstatic/css/4.161e1f66.chunk.css.map": "/mrstatic/css/4.161e1f66.chunk.css.map",
"mrstatic/css/44.b198ad93.chunk.css.map": "/mrstatic/css/44.b198ad93.chunk.css.map",
"mrstatic/css/45.a156a0a0.chunk.css.map": "/mrstatic/css/45.a156a0a0.chunk.css.map",
"mrstatic/css/46.bff100af.chunk.css.map": "/mrstatic/css/46.bff100af.chunk.css.map",
"mrstatic/css/47.820320a6.chunk.css.map": "/mrstatic/css/47.820320a6.chunk.css.map",
"mrstatic/css/48.35e22f8c.chunk.css.map": "/mrstatic/css/48.35e22f8c.chunk.css.map",
"mrstatic/css/49.1146f09d.chunk.css.map": "/mrstatic/css/49.1146f09d.chunk.css.map",
"mrstatic/css/50.befec011.chunk.css.map": "/mrstatic/css/50.befec011.chunk.css.map",
"mrstatic/css/51.b02d1de6.chunk.css.map": "/mrstatic/css/51.b02d1de6.chunk.css.map",
"mrstatic/css/Activity.6260646a.chunk.css.map": "/mrstatic/css/Activity.6260646a.chunk.css.map",
"mrstatic/css/BargainMiddlePage.eb686c74.chunk.css.map": "/mrstatic/css/BargainMiddlePage.eb686c74.chunk.css.map",
"mrstatic/css/Classify.fb4bedde.chunk.css.map": "/mrstatic/css/Classify.fb4bedde.chunk.css.map",
"mrstatic/css/Country.2d34330b.chunk.css.map": "/mrstatic/css/Country.2d34330b.chunk.css.map",
"mrstatic/css/CourseList.afc8902e.chunk.css.map": "/mrstatic/css/CourseList.afc8902e.chunk.css.map",
"mrstatic/css/DrawDocument.aeb3f822.chunk.css.map": "/mrstatic/css/DrawDocument.aeb3f822.chunk.css.map",
"mrstatic/css/Examination.7bb0622b.chunk.css.map": "/mrstatic/css/Examination.7bb0622b.chunk.css.map",
"mrstatic/css/Invite.6260646a.chunk.css.map": "/mrstatic/css/Invite.6260646a.chunk.css.map",
"mrstatic/css/Order.8c058a7a.chunk.css.map": "/mrstatic/css/Order.8c058a7a.chunk.css.map",
"mrstatic/css/PayOrder.7eb7d317.chunk.css.map": "/mrstatic/css/PayOrder.7eb7d317.chunk.css.map",
"mrstatic/css/Preferential.12a8297c.chunk.css.map": "/mrstatic/css/Preferential.12a8297c.chunk.css.map",
"mrstatic/css/SearchResult.cdf852c1.chunk.css.map": "/mrstatic/css/SearchResult.cdf852c1.chunk.css.map",
"mrstatic/css/ShareCourse.8046fb41.chunk.css.map": "/mrstatic/css/ShareCourse.8046fb41.chunk.css.map",
"mrstatic/css/ShopCart.92ab48a3.chunk.css.map": "/mrstatic/css/ShopCart.92ab48a3.chunk.css.map",
"mrstatic/css/aist-share.40873df0.chunk.css.map": "/mrstatic/css/aist-share.40873df0.chunk.css.map",
"mrstatic/css/blessing-getPrize.5a935f68.chunk.css.map": "/mrstatic/css/blessing-getPrize.5a935f68.chunk.css.map",
"mrstatic/css/blessing-preheat.4e9bf434.chunk.css.map": "/mrstatic/css/blessing-preheat.4e9bf434.chunk.css.map",
"mrstatic/css/blessing-rank.91e559d5.chunk.css.map": "/mrstatic/css/blessing-rank.91e559d5.chunk.css.map",
"mrstatic/css/coupons.466858c7.chunk.css.map": "/mrstatic/css/coupons.466858c7.chunk.css.map",
"mrstatic/css/deposit-order.5ea077aa.chunk.css.map": "/mrstatic/css/deposit-order.5ea077aa.chunk.css.map",
"mrstatic/css/deposit-pay-order.09ce6fd5.chunk.css.map": "/mrstatic/css/deposit-pay-order.09ce6fd5.chunk.css.map",
"mrstatic/css/detail.54d9956e.chunk.css.map": "/mrstatic/css/detail.54d9956e.chunk.css.map",
"mrstatic/css/main.532b6b06.chunk.css.map": "/mrstatic/css/main.532b6b06.chunk.css.map",
"mrstatic/css/myorders.179a42fc.chunk.css.map": "/mrstatic/css/myorders.179a42fc.chunk.css.map",
"mrstatic/css/newyear-2019-landing.bcab538c.chunk.css.map": "/mrstatic/css/newyear-2019-landing.bcab538c.chunk.css.map",
"mrstatic/css/newyear-yearIndex.a8268a94.chunk.css.map": "/mrstatic/css/newyear-yearIndex.a8268a94.chunk.css.map",
"mrstatic/css/prize-winner-list.3eee90af.chunk.css.map": "/mrstatic/css/prize-winner-list.3eee90af.chunk.css.map",
"mrstatic/css/purchased.bb758677.chunk.css.map": "/mrstatic/css/purchased.bb758677.chunk.css.map",
"mrstatic/css/python-class.49baf51f.chunk.css.map": "/mrstatic/css/python-class.49baf51f.chunk.css.map",
"mrstatic/css/search.5716d9b3.chunk.css.map": "/mrstatic/css/search.5716d9b3.chunk.css.map",
"mrstatic/css/shareposter.76774ba4.chunk.css.map": "/mrstatic/css/shareposter.76774ba4.chunk.css.map",
"mrstatic/css/study.bf6b9b43.chunk.css.map": "/mrstatic/css/study.bf6b9b43.chunk.css.map",
"mrstatic/css/system-notices.080e0d27.chunk.css.map": "/mrstatic/css/system-notices.080e0d27.chunk.css.map",
"mrstatic/css/togroup.f08bc5f3.chunk.css.map": "/mrstatic/css/togroup.f08bc5f3.chunk.css.map",
"mrstatic/css/video.1c1131c9.chunk.css.map": "/mrstatic/css/video.1c1131c9.chunk.css.map",
"mrstatic/css/1.b4627248.chunk.css.map": "/mrstatic/css/1.b4627248.chunk.css.map",
"mrstatic/css/2.1133c967.chunk.css.map": "/mrstatic/css/2.1133c967.chunk.css.map",
"mrstatic/css/3.ac8fad1f.chunk.css.map": "/mrstatic/css/3.ac8fad1f.chunk.css.map",
"mrstatic/css/42.2c1f7d7c.chunk.css.map": "/mrstatic/css/42.2c1f7d7c.chunk.css.map",
"mrstatic/css/44.976b2058.chunk.css.map": "/mrstatic/css/44.976b2058.chunk.css.map",
"mrstatic/css/45.51412fcd.chunk.css.map": "/mrstatic/css/45.51412fcd.chunk.css.map",
"mrstatic/css/47.e292ab6b.chunk.css.map": "/mrstatic/css/47.e292ab6b.chunk.css.map",
"mrstatic/css/48.37fb0c23.chunk.css.map": "/mrstatic/css/48.37fb0c23.chunk.css.map",
"mrstatic/css/49.56b04545.chunk.css.map": "/mrstatic/css/49.56b04545.chunk.css.map",
"mrstatic/css/50.ce17075b.chunk.css.map": "/mrstatic/css/50.ce17075b.chunk.css.map",
"mrstatic/css/51.bacf914e.chunk.css.map": "/mrstatic/css/51.bacf914e.chunk.css.map",
"mrstatic/css/Activity.08739942.chunk.css.map": "/mrstatic/css/Activity.08739942.chunk.css.map",
"mrstatic/css/BargainMiddlePage.2a913483.chunk.css.map": "/mrstatic/css/BargainMiddlePage.2a913483.chunk.css.map",
"mrstatic/css/Classify.127d35ae.chunk.css.map": "/mrstatic/css/Classify.127d35ae.chunk.css.map",
"mrstatic/css/Country.400393b7.chunk.css.map": "/mrstatic/css/Country.400393b7.chunk.css.map",
"mrstatic/css/CourseList.fed92c83.chunk.css.map": "/mrstatic/css/CourseList.fed92c83.chunk.css.map",
"mrstatic/css/DrawDocument.1bd3da48.chunk.css.map": "/mrstatic/css/DrawDocument.1bd3da48.chunk.css.map",
"mrstatic/css/Examination.17af9370.chunk.css.map": "/mrstatic/css/Examination.17af9370.chunk.css.map",
"mrstatic/css/Invite.08739942.chunk.css.map": "/mrstatic/css/Invite.08739942.chunk.css.map",
"mrstatic/css/Order.83a999aa.chunk.css.map": "/mrstatic/css/Order.83a999aa.chunk.css.map",
"mrstatic/css/PayOrder.68a25070.chunk.css.map": "/mrstatic/css/PayOrder.68a25070.chunk.css.map",
"mrstatic/css/Preferential.ccebc534.chunk.css.map": "/mrstatic/css/Preferential.ccebc534.chunk.css.map",
"mrstatic/css/SearchResult.6d7d1b77.chunk.css.map": "/mrstatic/css/SearchResult.6d7d1b77.chunk.css.map",
"mrstatic/css/ShareCourse.6e885738.chunk.css.map": "/mrstatic/css/ShareCourse.6e885738.chunk.css.map",
"mrstatic/css/ShopCart.887eb690.chunk.css.map": "/mrstatic/css/ShopCart.887eb690.chunk.css.map",
"mrstatic/css/aist-share.affb05d7.chunk.css.map": "/mrstatic/css/aist-share.affb05d7.chunk.css.map",
"mrstatic/css/blessing-getPrize.32a9cccc.chunk.css.map": "/mrstatic/css/blessing-getPrize.32a9cccc.chunk.css.map",
"mrstatic/css/blessing-preheat.0800b4f0.chunk.css.map": "/mrstatic/css/blessing-preheat.0800b4f0.chunk.css.map",
"mrstatic/css/blessing-rank.39fb77c8.chunk.css.map": "/mrstatic/css/blessing-rank.39fb77c8.chunk.css.map",
"mrstatic/css/coupons.0ce3fd3d.chunk.css.map": "/mrstatic/css/coupons.0ce3fd3d.chunk.css.map",
"mrstatic/css/deposit-order.2e5f43c4.chunk.css.map": "/mrstatic/css/deposit-order.2e5f43c4.chunk.css.map",
"mrstatic/css/deposit-pay-order.e8363b32.chunk.css.map": "/mrstatic/css/deposit-pay-order.e8363b32.chunk.css.map",
"mrstatic/css/detail.633b10a8.chunk.css.map": "/mrstatic/css/detail.633b10a8.chunk.css.map",
"mrstatic/css/main.fe158352.chunk.css.map": "/mrstatic/css/main.fe158352.chunk.css.map",
"mrstatic/css/myorders.841d0cfb.chunk.css.map": "/mrstatic/css/myorders.841d0cfb.chunk.css.map",
"mrstatic/css/newyear-2019-landing.dc74ab02.chunk.css.map": "/mrstatic/css/newyear-2019-landing.dc74ab02.chunk.css.map",
"mrstatic/css/newyear-yearIndex.9039f86b.chunk.css.map": "/mrstatic/css/newyear-yearIndex.9039f86b.chunk.css.map",
"mrstatic/css/prize-winner-list.ce85cb83.chunk.css.map": "/mrstatic/css/prize-winner-list.ce85cb83.chunk.css.map",
"mrstatic/css/purchased.7558403e.chunk.css.map": "/mrstatic/css/purchased.7558403e.chunk.css.map",
"mrstatic/css/python-class.11408886.chunk.css.map": "/mrstatic/css/python-class.11408886.chunk.css.map",
"mrstatic/css/search.efa1dd44.chunk.css.map": "/mrstatic/css/search.efa1dd44.chunk.css.map",
"mrstatic/css/shareposter.cde549fc.chunk.css.map": "/mrstatic/css/shareposter.cde549fc.chunk.css.map",
"mrstatic/css/study.62b8863b.chunk.css.map": "/mrstatic/css/study.62b8863b.chunk.css.map",
"mrstatic/css/system-notices.4fbf61d8.chunk.css.map": "/mrstatic/css/system-notices.4fbf61d8.chunk.css.map",
"mrstatic/css/togroup.ffd8be6c.chunk.css.map": "/mrstatic/css/togroup.ffd8be6c.chunk.css.map",
"mrstatic/css/video.b3755c1b.chunk.css.map": "/mrstatic/css/video.b3755c1b.chunk.css.map",
"mrstatic/media/index.scss": "/mrstatic/media/redb_sp_bj@2x.6902434f.png",
"mrstatic/media/iconfont.css": "/mrstatic/media/iconfont.e0655d4d.woff",
"mrstatic/media/kanjia_cg_icon.png": "/mrstatic/media/kanjia_cg_icon.81a489ac.png",
"mrstatic/media/video.scss": "/mrstatic/media/progress-share-bg.80011994.png",
"precache-manifest.7887bacd6881aea50b0ccfb98fa3636b.js": "/precache-manifest.7887bacd6881aea50b0ccfb98fa3636b.js",
"precache-manifest.c0707ea554b2417aacd2017757be985f.js": "/precache-manifest.c0707ea554b2417aacd2017757be985f.js",
"service-worker.js": "/service-worker.js"
}
\ No newline at end of file
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="shortcut icon" href="/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no,user-scalable=no"/><meta name="theme-color" content="#000000"/><link rel="manifest" href="/manifest.json"/><title>七月在线 - 国内领先的人工智能教育平台</title><link href="/mrstatic/css/44.b198ad93.chunk.css" rel="stylesheet"><link href="/mrstatic/css/main.532b6b06.chunk.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div><script src="/api.js"></script><script>!function(d){function e(e){for(var r,t,a=e[0],n=e[1],o=e[2],c=0,i=[];c<a.length;c++)t=a[c],l[t]&&i.push(l[t][0]),l[t]=0;for(r in n)Object.prototype.hasOwnProperty.call(n,r)&&(d[r]=n[r]);for(p&&p(e);i.length;)i.shift()();return s.push.apply(s,o||[]),f()}function f(){for(var e,r=0;r<s.length;r++){for(var t=s[r],a=!0,n=1;n<t.length;n++){var o=t[n];0!==l[o]&&(a=!1)}a&&(s.splice(r--,1),e=b(b.s=t[0]))}return e}var t={},u={37:0},l={37:0},s=[];function b(e){if(t[e])return t[e].exports;var r=t[e]={i:e,l:!1,exports:{}};return d[e].call(r.exports,r,r.exports,b),r.l=!0,r.exports}b.e=function(s){var e=[];u[s]?e.push(u[s]):0!==u[s]&&{2:1,3:1,4:1,6:1,7:1,8:1,9:1,10:1,11:1,12:1,13:1,15:1,17:1,18:1,19:1,20:1,21:1,22:1,23:1,24:1,25:1,26:1,27:1,28:1,29:1,31:1,32:1,33:1,34:1,35:1,36:1,38:1,39:1,40:1,41:1,42:1,43:1,45:1,46:1,47:1,48:1,49:1,50:1,51:1}[s]&&e.push(u[s]=new Promise(function(e,a){for(var r="mrstatic/css/"+({6:"Activity",7:"BargainMiddlePage",8:"Classify",9:"Country",10:"CourseList",11:"DrawDocument",12:"Examination",13:"Invite",14:"MyEdit",15:"Order",16:"Orderinfo",17:"PayOrder",18:"Preferential",19:"SearchResult",20:"ShareCourse",21:"ShopCart",22:"aist-share",23:"blessing-getPrize",24:"blessing-preheat",25:"blessing-rank",26:"coupons",27:"deposit-order",28:"deposit-pay-order",29:"detail",31:"myorders",32:"newyear-2019-landing",33:"newyear-yearIndex",34:"prize-winner-list",35:"purchased",36:"python-class",38:"search",39:"shareposter",40:"study",41:"system-notices",42:"togroup",43:"video"}[s]||s)+"."+{0:"31d6cfe0",1:"31d6cfe0",2:"35b4f89e",3:"bf839917",4:"161e1f66",5:"31d6cfe0",6:"6260646a",7:"eb686c74",8:"fb4bedde",9:"2d34330b",10:"afc8902e",11:"aeb3f822",12:"7bb0622b",13:"6260646a",14:"31d6cfe0",15:"8c058a7a",16:"31d6cfe0",17:"7eb7d317",18:"12a8297c",19:"cdf852c1",20:"8046fb41",21:"92ab48a3",22:"40873df0",23:"5a935f68",24:"4e9bf434",25:"91e559d5",26:"466858c7",27:"5ea077aa",28:"09ce6fd5",29:"54d9956e",31:"179a42fc",32:"bcab538c",33:"a8268a94",34:"3eee90af",35:"bb758677",36:"49baf51f",38:"5716d9b3",39:"76774ba4",40:"bf6b9b43",41:"080e0d27",42:"f08bc5f3",43:"1c1131c9",45:"a156a0a0",46:"bff100af",47:"820320a6",48:"35e22f8c",49:"1146f09d",50:"befec011",51:"b02d1de6"}[s]+".chunk.css",n=b.p+r,t=document.getElementsByTagName("link"),o=0;o<t.length;o++){var c=(d=t[o]).getAttribute("data-href")||d.getAttribute("href");if("stylesheet"===d.rel&&(c===r||c===n))return e()}var i=document.getElementsByTagName("style");for(o=0;o<i.length;o++){var d;if((c=(d=i[o]).getAttribute("data-href"))===r||c===n)return e()}var f=document.createElement("link");f.rel="stylesheet",f.type="text/css",f.onload=e,f.onerror=function(e){var r=e&&e.target&&e.target.src||n,t=new Error("Loading CSS chunk "+s+" failed.\n("+r+")");t.request=r,delete u[s],f.parentNode.removeChild(f),a(t)},f.href=n,document.getElementsByTagName("head")[0].appendChild(f)}).then(function(){u[s]=0}));var t=l[s];if(0!==t)if(t)e.push(t[2]);else{var r=new Promise(function(e,r){t=l[s]=[e,r]});e.push(t[2]=r);var a,o=document.createElement("script");o.charset="utf-8",o.timeout=120,b.nc&&o.setAttribute("nonce",b.nc),o.src=b.p+"mrstatic/js/"+({6:"Activity",7:"BargainMiddlePage",8:"Classify",9:"Country",10:"CourseList",11:"DrawDocument",12:"Examination",13:"Invite",14:"MyEdit",15:"Order",16:"Orderinfo",17:"PayOrder",18:"Preferential",19:"SearchResult",20:"ShareCourse",21:"ShopCart",22:"aist-share",23:"blessing-getPrize",24:"blessing-preheat",25:"blessing-rank",26:"coupons",27:"deposit-order",28:"deposit-pay-order",29:"detail",31:"myorders",32:"newyear-2019-landing",33:"newyear-yearIndex",34:"prize-winner-list",35:"purchased",36:"python-class",38:"search",39:"shareposter",40:"study",41:"system-notices",42:"togroup",43:"video"}[s]||s)+"."+{0:"fca6c57e",1:"79bef975",2:"3e9eae54",3:"887af415",4:"8986e0eb",5:"0fa85971",6:"bbb32ff9",7:"66b7f13c",8:"9ede63f4",9:"35064829",10:"23f60fb6",11:"d7cca39c",12:"ab78ae34",13:"810acbcc",14:"85e7fd93",15:"4f912514",16:"bbe4abd7",17:"57e0a057",18:"e194c179",19:"40c95eac",20:"68b4ce5d",21:"04fdb268",22:"fd432927",23:"7bf56432",24:"45a8fb0d",25:"011deb41",26:"f4692aac",27:"975377d0",28:"f9902f98",29:"25021b2f",31:"7f319191",32:"ac08bac6",33:"c4784501",34:"7f6db414",35:"e9d34e7e",36:"4b294dde",38:"ca3c9036",39:"0da28346",40:"5eccc49d",41:"c190f20d",42:"fa94cde5",43:"23aa9835",45:"b9ad70e1",46:"296ab055",47:"33a8c3bc",48:"8cced5a9",49:"46e3ca0f",50:"599b175e",51:"20e1591a"}[s]+".chunk.js",a=function(e){o.onerror=o.onload=null,clearTimeout(c);var r=l[s];if(0!==r){if(r){var t=e&&("load"===e.type?"missing":e.type),a=e&&e.target&&e.target.src,n=new Error("Loading chunk "+s+" failed.\n("+t+": "+a+")");n.type=t,n.request=a,r[1](n)}l[s]=void 0}};var c=setTimeout(function(){a({type:"timeout",target:o})},12e4);o.onerror=o.onload=a,document.head.appendChild(o)}return Promise.all(e)},b.m=d,b.c=t,b.d=function(e,r,t){b.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},b.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},b.t=function(r,e){if(1&e&&(r=b(r)),8&e)return r;if(4&e&&"object"==typeof r&&r&&r.__esModule)return r;var t=Object.create(null);if(b.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:r}),2&e&&"string"!=typeof r)for(var a in r)b.d(t,a,function(e){return r[e]}.bind(null,a));return t},b.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return b.d(r,"a",r),r},b.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},b.p="/",b.oe=function(e){throw console.error(e),e};var r=window.webpackJsonp=window.webpackJsonp||[],a=r.push.bind(r);r.push=e,r=r.slice();for(var n=0;n<r.length;n++)e(r[n]);var p=a;f()}([])</script><script src="/mrstatic/js/44.642b6246.chunk.js"></script><script src="/mrstatic/js/main.b1467882.chunk.js"></script></body></html>
\ No newline at end of file
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="shortcut icon" href="/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no,user-scalable=no"/><meta name="theme-color" content="#000000"/><link rel="manifest" href="/manifest.json"/><title>七月在线 - 国内领先的人工智能教育平台</title><link href="/mrstatic/css/42.2c1f7d7c.chunk.css" rel="stylesheet"><link href="/mrstatic/css/main.fe158352.chunk.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div><script src="/api.js"></script><script>!function(d){function e(e){for(var r,t,n=e[0],a=e[1],o=e[2],c=0,i=[];c<n.length;c++)t=n[c],l[t]&&i.push(l[t][0]),l[t]=0;for(r in a)Object.prototype.hasOwnProperty.call(a,r)&&(d[r]=a[r]);for(p&&p(e);i.length;)i.shift()();return f.push.apply(f,o||[]),s()}function s(){for(var e,r=0;r<f.length;r++){for(var t=f[r],n=!0,a=1;a<t.length;a++){var o=t[a];0!==l[o]&&(n=!1)}n&&(f.splice(r--,1),e=b(b.s=t[0]))}return e}var t={},u={35:0},l={35:0},f=[];function b(e){if(t[e])return t[e].exports;var r=t[e]={i:e,l:!1,exports:{}};return d[e].call(r.exports,r,r.exports,b),r.l=!0,r.exports}b.e=function(f){var e=[];u[f]?e.push(u[f]):0!==u[f]&&{1:1,2:1,3:1,4:1,5:1,6:1,7:1,8:1,9:1,10:1,11:1,13:1,15:1,16:1,17:1,18:1,19:1,20:1,21:1,22:1,23:1,24:1,25:1,26:1,27:1,29:1,30:1,31:1,32:1,33:1,34:1,36:1,37:1,38:1,39:1,40:1,41:1,44:1,45:1,47:1,48:1,49:1,50:1,51:1}[f]&&e.push(u[f]=new Promise(function(e,n){for(var r="mrstatic/css/"+({4:"Activity",5:"BargainMiddlePage",6:"Classify",7:"Country",8:"CourseList",9:"DrawDocument",10:"Examination",11:"Invite",12:"MyEdit",13:"Order",14:"Orderinfo",15:"PayOrder",16:"Preferential",17:"SearchResult",18:"ShareCourse",19:"ShopCart",20:"aist-share",21:"blessing-getPrize",22:"blessing-preheat",23:"blessing-rank",24:"coupons",25:"deposit-order",26:"deposit-pay-order",27:"detail",29:"myorders",30:"newyear-2019-landing",31:"newyear-yearIndex",32:"prize-winner-list",33:"purchased",34:"python-class",36:"search",37:"shareposter",38:"study",39:"system-notices",40:"togroup",41:"video"}[f]||f)+"."+{0:"31d6cfe0",1:"b4627248",2:"1133c967",3:"ac8fad1f",4:"08739942",5:"2a913483",6:"127d35ae",7:"400393b7",8:"fed92c83",9:"1bd3da48",10:"17af9370",11:"08739942",12:"31d6cfe0",13:"83a999aa",14:"31d6cfe0",15:"68a25070",16:"ccebc534",17:"6d7d1b77",18:"6e885738",19:"887eb690",20:"affb05d7",21:"32a9cccc",22:"0800b4f0",23:"39fb77c8",24:"0ce3fd3d",25:"2e5f43c4",26:"e8363b32",27:"633b10a8",29:"841d0cfb",30:"dc74ab02",31:"9039f86b",32:"ce85cb83",33:"7558403e",34:"11408886",36:"efa1dd44",37:"cde549fc",38:"62b8863b",39:"4fbf61d8",40:"ffd8be6c",41:"b3755c1b",43:"31d6cfe0",44:"976b2058",45:"51412fcd",46:"31d6cfe0",47:"e292ab6b",48:"37fb0c23",49:"56b04545",50:"ce17075b",51:"bacf914e"}[f]+".chunk.css",a=b.p+r,t=document.getElementsByTagName("link"),o=0;o<t.length;o++){var c=(d=t[o]).getAttribute("data-href")||d.getAttribute("href");if("stylesheet"===d.rel&&(c===r||c===a))return e()}var i=document.getElementsByTagName("style");for(o=0;o<i.length;o++){var d;if((c=(d=i[o]).getAttribute("data-href"))===r||c===a)return e()}var s=document.createElement("link");s.rel="stylesheet",s.type="text/css",s.onload=e,s.onerror=function(e){var r=e&&e.target&&e.target.src||a,t=new Error("Loading CSS chunk "+f+" failed.\n("+r+")");t.request=r,delete u[f],s.parentNode.removeChild(s),n(t)},s.href=a,document.getElementsByTagName("head")[0].appendChild(s)}).then(function(){u[f]=0}));var t=l[f];if(0!==t)if(t)e.push(t[2]);else{var r=new Promise(function(e,r){t=l[f]=[e,r]});e.push(t[2]=r);var n,o=document.createElement("script");o.charset="utf-8",o.timeout=120,b.nc&&o.setAttribute("nonce",b.nc),o.src=b.p+"mrstatic/js/"+({4:"Activity",5:"BargainMiddlePage",6:"Classify",7:"Country",8:"CourseList",9:"DrawDocument",10:"Examination",11:"Invite",12:"MyEdit",13:"Order",14:"Orderinfo",15:"PayOrder",16:"Preferential",17:"SearchResult",18:"ShareCourse",19:"ShopCart",20:"aist-share",21:"blessing-getPrize",22:"blessing-preheat",23:"blessing-rank",24:"coupons",25:"deposit-order",26:"deposit-pay-order",27:"detail",29:"myorders",30:"newyear-2019-landing",31:"newyear-yearIndex",32:"prize-winner-list",33:"purchased",34:"python-class",36:"search",37:"shareposter",38:"study",39:"system-notices",40:"togroup",41:"video"}[f]||f)+"."+{0:"a1f55c4b",1:"e07f5dff",2:"0fac390d",3:"8c1cc18f",4:"e2fb033f",5:"55155992",6:"8163d312",7:"141c61f5",8:"f21dd678",9:"e531d30d",10:"5cac77c0",11:"28851ee3",12:"37e552a7",13:"a1d6e215",14:"78f26106",15:"e70e405c",16:"36f584f7",17:"1d558834",18:"c519a5df",19:"58cf523e",20:"7664e04e",21:"3af378d7",22:"2724652b",23:"60ea5af3",24:"2b77f2be",25:"94eca8ab",26:"5709d01a",27:"7bed0938",29:"d820f269",30:"98ec9529",31:"76419495",32:"b2af75ba",33:"89577d91",34:"16892808",36:"32e22912",37:"9564bc99",38:"c43ef6d6",39:"d28438a2",40:"f1aeeaa3",41:"2777335b",43:"f063ef63",44:"346f8d8b",45:"83264ccd",46:"e2b5c822",47:"39c28519",48:"eb589f62",49:"40cd7435",50:"81199908",51:"f38b57e4"}[f]+".chunk.js",n=function(e){o.onerror=o.onload=null,clearTimeout(c);var r=l[f];if(0!==r){if(r){var t=e&&("load"===e.type?"missing":e.type),n=e&&e.target&&e.target.src,a=new Error("Loading chunk "+f+" failed.\n("+t+": "+n+")");a.type=t,a.request=n,r[1](a)}l[f]=void 0}};var c=setTimeout(function(){n({type:"timeout",target:o})},12e4);o.onerror=o.onload=n,document.head.appendChild(o)}return Promise.all(e)},b.m=d,b.c=t,b.d=function(e,r,t){b.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},b.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},b.t=function(r,e){if(1&e&&(r=b(r)),8&e)return r;if(4&e&&"object"==typeof r&&r&&r.__esModule)return r;var t=Object.create(null);if(b.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:r}),2&e&&"string"!=typeof r)for(var n in r)b.d(t,n,function(e){return r[e]}.bind(null,n));return t},b.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return b.d(r,"a",r),r},b.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},b.p="/",b.oe=function(e){throw console.error(e),e};var r=window.webpackJsonp=window.webpackJsonp||[],n=r.push.bind(r);r.push=e,r=r.slice();for(var a=0;a<r.length;a++)e(r[a]);var p=n;s()}([])</script><script src="/mrstatic/js/42.b488dab0.chunk.js"></script><script src="/mrstatic/js/main.f04c6995.chunk.js"></script></body></html>
\ No newline at end of file
File mode changed from 100644 to 100755
self.__precacheManifest = [
{
"revision": "5ac28956aad68d9ce6c5",
"url": "/mrstatic/js/0.a1f55c4b.chunk.js"
},
{
"revision": "a7dabd9f48ea4f9983a5",
"url": "/mrstatic/css/1.b4627248.chunk.css"
},
{
"revision": "a7dabd9f48ea4f9983a5",
"url": "/mrstatic/js/1.e07f5dff.chunk.js"
},
{
"revision": "93a9469320ab8f1207aa",
"url": "/mrstatic/css/2.1133c967.chunk.css"
},
{
"revision": "93a9469320ab8f1207aa",
"url": "/mrstatic/js/2.0fac390d.chunk.js"
},
{
"revision": "7a8f83ca507a8f34a934",
"url": "/mrstatic/css/3.ac8fad1f.chunk.css"
},
{
"revision": "7a8f83ca507a8f34a934",
"url": "/mrstatic/js/3.8c1cc18f.chunk.js"
},
{
"revision": "fa6bd952b4f166c490b1",
"url": "/mrstatic/css/Activity.08739942.chunk.css"
},
{
"revision": "fa6bd952b4f166c490b1",
"url": "/mrstatic/js/Activity.e2fb033f.chunk.js"
},
{
"revision": "0f8edd11262d493695f0",
"url": "/mrstatic/css/BargainMiddlePage.2a913483.chunk.css"
},
{
"revision": "0f8edd11262d493695f0",
"url": "/mrstatic/js/BargainMiddlePage.55155992.chunk.js"
},
{
"revision": "f0b41bfba5101e234ba5",
"url": "/mrstatic/css/Classify.127d35ae.chunk.css"
},
{
"revision": "f0b41bfba5101e234ba5",
"url": "/mrstatic/js/Classify.8163d312.chunk.js"
},
{
"revision": "9a95b89de623fb43b205",
"url": "/mrstatic/css/Country.400393b7.chunk.css"
},
{
"revision": "9a95b89de623fb43b205",
"url": "/mrstatic/js/Country.141c61f5.chunk.js"
},
{
"revision": "f81f9dea5b5d6fca8cb1",
"url": "/mrstatic/css/CourseList.fed92c83.chunk.css"
},
{
"revision": "f81f9dea5b5d6fca8cb1",
"url": "/mrstatic/js/CourseList.f21dd678.chunk.js"
},
{
"revision": "d7b02ed1549b7822c769",
"url": "/mrstatic/css/DrawDocument.1bd3da48.chunk.css"
},
{
"revision": "d7b02ed1549b7822c769",
"url": "/mrstatic/js/DrawDocument.e531d30d.chunk.js"
},
{
"revision": "8117ba1fc40d1c944ee7",
"url": "/mrstatic/css/Examination.17af9370.chunk.css"
},
{
"revision": "8117ba1fc40d1c944ee7",
"url": "/mrstatic/js/Examination.5cac77c0.chunk.js"
},
{
"revision": "29bc29fe4c4da13d5b7b",
"url": "/mrstatic/css/Invite.08739942.chunk.css"
},
{
"revision": "29bc29fe4c4da13d5b7b",
"url": "/mrstatic/js/Invite.28851ee3.chunk.js"
},
{
"revision": "8bfd5748ce95d22e2490",
"url": "/mrstatic/js/MyEdit.37e552a7.chunk.js"
},
{
"revision": "533892d6afd8fda94a21",
"url": "/mrstatic/css/Order.83a999aa.chunk.css"
},
{
"revision": "533892d6afd8fda94a21",
"url": "/mrstatic/js/Order.a1d6e215.chunk.js"
},
{
"revision": "0d0069bbc19691398139",
"url": "/mrstatic/js/Orderinfo.78f26106.chunk.js"
},
{
"revision": "58c4e88a747fa5c9ce47",
"url": "/mrstatic/css/PayOrder.68a25070.chunk.css"
},
{
"revision": "58c4e88a747fa5c9ce47",
"url": "/mrstatic/js/PayOrder.e70e405c.chunk.js"
},
{
"revision": "b9f48f7a7dff0d8f6a1c",
"url": "/mrstatic/css/Preferential.ccebc534.chunk.css"
},
{
"revision": "b9f48f7a7dff0d8f6a1c",
"url": "/mrstatic/js/Preferential.36f584f7.chunk.js"
},
{
"revision": "b36c48ae7563ad514f28",
"url": "/mrstatic/css/SearchResult.6d7d1b77.chunk.css"
},
{
"revision": "b36c48ae7563ad514f28",
"url": "/mrstatic/js/SearchResult.1d558834.chunk.js"
},
{
"revision": "045bf9af2cb46756dd8a",
"url": "/mrstatic/css/ShareCourse.6e885738.chunk.css"
},
{
"revision": "045bf9af2cb46756dd8a",
"url": "/mrstatic/js/ShareCourse.c519a5df.chunk.js"
},
{
"revision": "b7356fe5a728f77f3a16",
"url": "/mrstatic/css/ShopCart.887eb690.chunk.css"
},
{
"revision": "b7356fe5a728f77f3a16",
"url": "/mrstatic/js/ShopCart.58cf523e.chunk.js"
},
{
"revision": "66a76537510f513b02f0",
"url": "/mrstatic/css/aist-share.affb05d7.chunk.css"
},
{
"revision": "66a76537510f513b02f0",
"url": "/mrstatic/js/aist-share.7664e04e.chunk.js"
},
{
"revision": "8554a8aaed439f36ae38",
"url": "/mrstatic/css/blessing-getPrize.32a9cccc.chunk.css"
},
{
"revision": "8554a8aaed439f36ae38",
"url": "/mrstatic/js/blessing-getPrize.3af378d7.chunk.js"
},
{
"revision": "98ab59688026aa76db18",
"url": "/mrstatic/css/blessing-preheat.0800b4f0.chunk.css"
},
{
"revision": "98ab59688026aa76db18",
"url": "/mrstatic/js/blessing-preheat.2724652b.chunk.js"
},
{
"revision": "3f0456d6dc555a8561c2",
"url": "/mrstatic/css/blessing-rank.39fb77c8.chunk.css"
},
{
"revision": "3f0456d6dc555a8561c2",
"url": "/mrstatic/js/blessing-rank.60ea5af3.chunk.js"
},
{
"revision": "c98cfd57ea7bacefcb4c",
"url": "/mrstatic/css/coupons.0ce3fd3d.chunk.css"
},
{
"revision": "c98cfd57ea7bacefcb4c",
"url": "/mrstatic/js/coupons.2b77f2be.chunk.js"
},
{
"revision": "59261fca4ec511742b08",
"url": "/mrstatic/css/deposit-order.2e5f43c4.chunk.css"
},
{
"revision": "59261fca4ec511742b08",
"url": "/mrstatic/js/deposit-order.94eca8ab.chunk.js"
},
{
"revision": "7b1fb50d25f74c4244a0",
"url": "/mrstatic/css/deposit-pay-order.e8363b32.chunk.css"
},
{
"revision": "7b1fb50d25f74c4244a0",
"url": "/mrstatic/js/deposit-pay-order.5709d01a.chunk.js"
},
{
"revision": "0d5e7f43e31720a17eb4",
"url": "/mrstatic/css/detail.633b10a8.chunk.css"
},
{
"revision": "0d5e7f43e31720a17eb4",
"url": "/mrstatic/js/detail.7bed0938.chunk.js"
},
{
"revision": "15b41b6e87196f5030c7",
"url": "/mrstatic/css/main.fe158352.chunk.css"
},
{
"revision": "15b41b6e87196f5030c7",
"url": "/mrstatic/js/main.f04c6995.chunk.js"
},
{
"revision": "ca6db278d1e25fb9a210",
"url": "/mrstatic/css/myorders.841d0cfb.chunk.css"
},
{
"revision": "ca6db278d1e25fb9a210",
"url": "/mrstatic/js/myorders.d820f269.chunk.js"
},
{
"revision": "6c2a621b1fce2b7a784f",
"url": "/mrstatic/css/newyear-2019-landing.dc74ab02.chunk.css"
},
{
"revision": "6c2a621b1fce2b7a784f",
"url": "/mrstatic/js/newyear-2019-landing.98ec9529.chunk.js"
},
{
"revision": "f8690eb28fd31e31587d",
"url": "/mrstatic/css/newyear-yearIndex.9039f86b.chunk.css"
},
{
"revision": "f8690eb28fd31e31587d",
"url": "/mrstatic/js/newyear-yearIndex.76419495.chunk.js"
},
{
"revision": "36ea4932e27325e68146",
"url": "/mrstatic/css/prize-winner-list.ce85cb83.chunk.css"
},
{
"revision": "36ea4932e27325e68146",
"url": "/mrstatic/js/prize-winner-list.b2af75ba.chunk.js"
},
{
"revision": "3ddccb84c3d0303cc98a",
"url": "/mrstatic/css/purchased.7558403e.chunk.css"
},
{
"revision": "3ddccb84c3d0303cc98a",
"url": "/mrstatic/js/purchased.89577d91.chunk.js"
},
{
"revision": "3abb844564ceeacf79ac",
"url": "/mrstatic/css/python-class.11408886.chunk.css"
},
{
"revision": "3abb844564ceeacf79ac",
"url": "/mrstatic/js/python-class.16892808.chunk.js"
},
{
"revision": "8e405de8d64576217afc",
"url": "/mrstatic/js/runtime~main.bfb0a037.js"
},
{
"revision": "178f8550ee9491682d31",
"url": "/mrstatic/css/search.efa1dd44.chunk.css"
},
{
"revision": "178f8550ee9491682d31",
"url": "/mrstatic/js/search.32e22912.chunk.js"
},
{
"revision": "e5343d037fdc9b0f8759",
"url": "/mrstatic/css/shareposter.cde549fc.chunk.css"
},
{
"revision": "e5343d037fdc9b0f8759",
"url": "/mrstatic/js/shareposter.9564bc99.chunk.js"
},
{
"revision": "857c7068192e22f75908",
"url": "/mrstatic/css/study.62b8863b.chunk.css"
},
{
"revision": "857c7068192e22f75908",
"url": "/mrstatic/js/study.c43ef6d6.chunk.js"
},
{
"revision": "2889695eb4f8364b8173",
"url": "/mrstatic/css/system-notices.4fbf61d8.chunk.css"
},
{
"revision": "2889695eb4f8364b8173",
"url": "/mrstatic/js/system-notices.d28438a2.chunk.js"
},
{
"revision": "10e85f3320556ad46caf",
"url": "/mrstatic/css/togroup.ffd8be6c.chunk.css"
},
{
"revision": "10e85f3320556ad46caf",
"url": "/mrstatic/js/togroup.f1aeeaa3.chunk.js"
},
{
"revision": "39fe947b9fea24fcfc79",
"url": "/mrstatic/css/video.b3755c1b.chunk.css"
},
{
"revision": "39fe947b9fea24fcfc79",
"url": "/mrstatic/js/video.2777335b.chunk.js"
},
{
"revision": "815cd98a45167b6bf76f",
"url": "/mrstatic/css/42.2c1f7d7c.chunk.css"
},
{
"revision": "815cd98a45167b6bf76f",
"url": "/mrstatic/js/42.b488dab0.chunk.js"
},
{
"revision": "7687f01b3425e629376e",
"url": "/mrstatic/js/43.f063ef63.chunk.js"
},
{
"revision": "d831f54cc130d9f1b981",
"url": "/mrstatic/css/44.976b2058.chunk.css"
},
{
"revision": "d831f54cc130d9f1b981",
"url": "/mrstatic/js/44.346f8d8b.chunk.js"
},
{
"revision": "be45234975e9546c0582",
"url": "/mrstatic/css/45.51412fcd.chunk.css"
},
{
"revision": "be45234975e9546c0582",
"url": "/mrstatic/js/45.83264ccd.chunk.js"
},
{
"revision": "5a171b0049e7856cb4a0",
"url": "/mrstatic/js/46.e2b5c822.chunk.js"
},
{
"revision": "df8c387de62c86da4510",
"url": "/mrstatic/css/47.e292ab6b.chunk.css"
},
{
"revision": "df8c387de62c86da4510",
"url": "/mrstatic/js/47.39c28519.chunk.js"
},
{
"revision": "be00ca1d98c5b8a66e73",
"url": "/mrstatic/css/48.37fb0c23.chunk.css"
},
{
"revision": "be00ca1d98c5b8a66e73",
"url": "/mrstatic/js/48.eb589f62.chunk.js"
},
{
"revision": "752c1e15e8cef4e76561",
"url": "/mrstatic/css/49.56b04545.chunk.css"
},
{
"revision": "752c1e15e8cef4e76561",
"url": "/mrstatic/js/49.40cd7435.chunk.js"
},
{
"revision": "58dab3db2f7213e0302e",
"url": "/mrstatic/css/50.ce17075b.chunk.css"
},
{
"revision": "58dab3db2f7213e0302e",
"url": "/mrstatic/js/50.81199908.chunk.js"
},
{
"revision": "a95041fd0a712d32e4bd",
"url": "/mrstatic/css/51.bacf914e.chunk.css"
},
{
"revision": "a95041fd0a712d32e4bd",
"url": "/mrstatic/js/51.f38b57e4.chunk.js"
},
{
"revision": "7aa984cefad739ea18edb76c541aa1fd",
"url": "/mrstatic/media/iconfont.7aa984ce.eot"
},
{
"revision": "e0655d4da66dce391e6b5227b400e037",
"url": "/mrstatic/media/iconfont.e0655d4d.woff"
},
{
"revision": "b9b072e1116fd1830cc8f425dc163a6b",
"url": "/mrstatic/media/iconfont.b9b072e1.svg"
},
{
"revision": "258b4b114d3d9be3018cd113b2470a13",
"url": "/mrstatic/media/iconfont.258b4b11.ttf"
},
{
"revision": "81a489ac63f2f2df5ab412e0782bd54c",
"url": "/mrstatic/media/kanjia_cg_icon.81a489ac.png"
},
{
"revision": "d76ebce726bdf3459fa14e96d84c5b9a",
"url": "/mrstatic/media/formal-banner.d76ebce7.png"
},
{
"revision": "9ab091267ae7c83bd30d0f5ad018a8c9",
"url": "/mrstatic/media/dalibao_bj.9ab09126.png"
},
{
"revision": "80011994e30adf599e5f47fcc81bc06d",
"url": "/mrstatic/media/progress-share-bg.80011994.png"
},
{
"revision": "c79abf5cb7ae8a82009cf68fe44d1078",
"url": "/mrstatic/media/redb_money_bj@2x.c79abf5c.png"
},
{
"revision": "8edaf2ff2566ed17e2dd22cf4f8ad7ae",
"url": "/mrstatic/media/redb_chai_bj@2x.8edaf2ff.png"
},
{
"revision": "79139f6aad350256e151f9f73c226348",
"url": "/mrstatic/media/hb_bj.79139f6a.png"
},
{
"revision": "6902434f8f18a23319d57d0ac8aaea8c",
"url": "/mrstatic/media/redb_sp_bj@2x.6902434f.png"
},
{
"revision": "07c6493878c73fac30272c3a7784d7e9",
"url": "/index.html"
}
];
\ No newline at end of file
......@@ -14,7 +14,7 @@
importScripts("https://storage.googleapis.com/workbox-cdn/releases/3.6.3/workbox-sw.js");
importScripts(
"/precache-manifest.7887bacd6881aea50b0ccfb98fa3636b.js"
"/precache-manifest.c0707ea554b2417aacd2017757be985f.js"
);
workbox.clientsClaim();
......@@ -30,5 +30,5 @@ workbox.precaching.precacheAndRoute(self.__precacheManifest, {});
workbox.routing.registerNavigationRoute("/index.html", {
blacklist: [/^\/_/,/\/[^\/]+\.[^\/]+$/],
blacklist: [/^\/_/,/\/[^/]+\.[^/]+$/],
});
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
......@@ -157,6 +157,12 @@ class App extends Component {
if (code && !oid) {
//针对2019双旦活动特殊处理,活动结束后删掉
//treasure_code=3538333139312c31&origin=2&aa=bb&code=0211aiYB1VVOL60rmWWB1367YB11aiY7&state=STATE
if(getParam('treasure_code') == '3538333139312c31' && code == '0211aiYB1VVOL60rmWWB1367YB11aiY7'){
return
}
http.get(`${API['home']}/m/wx_loginInfo/code/${code}?redirect=${encodeURIComponent(window.location.href)}`)
.then(res => {
let data = res.data
......
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import classnames from 'classnames';
import './index.scss';
const Root = document.querySelector('body');
const events = ['touchmove', 'mousewheel'];
class Mask extends Component {
constructor(props) {
super(props);
if(!this.el) {
this.el = document.createElement('div');
}
}
componentDidMount() {
events.forEach(item => {
this.el.addEventListener(item, this.preventEvent, {
passive: false
})
})
Root.appendChild(this.el);
}
componentWillUnmount() {
Root.removeChild(this.el);
}
preventEvent = e => {
e.preventDefault();
}
render() {
const { visible, handleToHide, className } = this.props;
if(visible) {
return ReactDOM.createPortal(
(
<div className="mask">
<div className={classnames("mask-content", className)}>
{this.props.children}
</div>
<div className="mask-footer">
<i className="mask-button__close" onClick={handleToHide}></i>
</div>
</div>
),
this.el
);
}else {
return null;
}
}
}
export default Mask;
\ No newline at end of file
.mask {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
color:#fff;
background-color: rgba(0, 0, 0, .5);
z-index: 999;
}
.mask-content {
min-width: 200px;
min-height: 100px;
padding: 10px 0;
border-radius: 5px;
box-sizing: border-box;
background-color: #fff;
}
.mask-footer {
margin-top: 33px;
}
.mask-button__close {
display: inline-block;
width: 33px;
height: 33px;
background-size: cover;
background-image: url('https://julyedu-cdn.oss-cn-beijing.aliyuncs.com/newyear20/H5/close-btn.png');
}
\ No newline at end of file
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
.box-container {
position: relative;
background: #327443;
background: #327443 url("https://julyedu-cdn.oss-cn-beijing.aliyuncs.com/newyear20/PC/sd_nr_bj2.png") repeat-y;
background-size: 100% auto;
padding: 14px 0;
.image-box {
height: 100%;
background: url("https://julyedu-cdn.oss-cn-beijing.aliyuncs.com/newyear20/PC/sd_nr_bj2.png") repeat-y;
background-size: 100% auto;
}
@mixin common-deco($bg) {
......
File mode changed from 100644 to 100755
......@@ -49,11 +49,13 @@
width: 100%;
height: 22px;
}
.container_content {
background: url("https://julyedu-cdn.oss-cn-beijing.aliyuncs.com/newyear20/H5/m_middle_bj.png");
background-size: contain;
width: 100%;
min-height: 25px;
padding: 5px 20px;
margin: -1px 0;
padding: 6px 15px;
}
}
File mode changed from 100644 to 100755
......@@ -83,9 +83,10 @@ class Prizes extends Component {
const {
showSystemNotices
} = this.props
const {notices} = this.state
return (
<>
{showSystemNotices && <SystemBulletScreen bullets={this.state.notices}/>}
{(showSystemNotices && notices && notices.length) ? <SystemBulletScreen bullets={notices}/> : null}
<div className={'prizes-box'} ref={el => this.prizeBox = el}>
<a href="javascript:;" className='rule-btn' onClick={this.showRules}>活动规则 > </a>
<div className={`bg`} ref={el => this.bg = el}/>
......@@ -95,12 +96,19 @@ class Prizes extends Component {
this.state.prizes.map((item, index) => {
return (
<li key={index}>
<img src={item.img_name} alt=""/>
{
item.img_name
? <i className="prize-list__image" style={{
backgroundImage: `url(${item.img_name})`
}}/>
: <i className="prize-list__image"/>
}
{/* <img src={item.img_name} alt=""/> */}
{
item.is_captain != 0 && <span className='captain top-tag'>队长专属</span>
}
{
item.mode === 2 && <span className='stage top-tag'>{item.stage_no}必中</span>
item.mode === 2 && <span className='stage top-tag'>{item.stage_no}必中</span>
}
{
item.grant_max
......
......@@ -45,7 +45,7 @@
display: block;
width: 100%;
background: url($bg) no-repeat;
background-size: contain;
background-size: 100% auto;
}
&::before {
......@@ -56,12 +56,14 @@
&::after {
@include common-deco('https://julyedu-cdn.oss-cn-beijing.aliyuncs.com/newyear20/H5/landing-box-footer.png');
height: 85px;
margin-top: -1px;
}
.bg {
@extend .trans-height;
width: 100%;
height: 115px;
margin-top: -1px;
overflow: hidden;
z-index: 10;
background: url("https://julyedu-cdn.oss-cn-beijing.aliyuncs.com/newyear20/H5/landing-box-bg.png") repeat-y;
......@@ -100,12 +102,26 @@
margin-right: 10.5px;
margin-bottom: 6.5px;
.prize-list__image {
display: block;
width: 100%;
height: 100%;
background-position: center;
background-size: cover;
}
img {
width: 90px;
object-fit: contain;
}
}
& li:last-child {
display: flex;
align-items: center;
justify-content: center;
}
.top-tag {
position: absolute;
top: 0;
......@@ -133,7 +149,7 @@
background: rgba(0, 0, 0, .8);
font-size: 12px;
color: #fff;
padding: 4px;
padding: 0 4px;
border-radius: 6px 0 0 0;
}
......@@ -156,6 +172,7 @@
flex: 0 1 45px;
height: 2px;
background: #fff;
border-radius: 1px;
.progress {
position: absolute;
......@@ -174,7 +191,33 @@
.common_container {
.container_content {
.prizes-box {
margin: 0 -20px;
margin: 0 -15px;
}
}
}
.landing-treasure-rules {
width: 320px;
&.popup-container {
top: 50%;
transform: translate(-50%, -50%);
.title {
font-size: 18px;
color: #111111;
}
}
.content {
padding: 0 19px 15px;
margin-top: 22px;
color: #666666;
font-size: 14px;
li {
margin-bottom: 5px;
}
}
}
......@@ -22,7 +22,6 @@ class SystemBulletScreen extends Component {
this.swiper && this.swiper.destroy()
}
initializeSwiper = () => {
const _this = this
this.swiper = new Swiper('.sys-bullet-screen-swiper-container', {
......@@ -61,19 +60,21 @@ class SystemBulletScreen extends Component {
content.style.transform = `translate3d(${-(contentWidth - wrapperWidth) - 10}px,0,0)`
}, 1000)
} else {
const {bullets} = this.props
const len = bullets.length * 3
setTimeout(() => {
swiper.slideNext()
if (++this.count === len) {
this.sysNotice.style.height = `0px`
}
(swiper && !swiper.destroyed) && swiper.slideNext()
}, 3000)
}
}
transitionEnd = () => {
const {
bullets = []
} = this.props
const {bullets} = this.props
const len = bullets.length * 3
if (++this.count === len) {
setTimeout(() => {
this.sysNotice.style.height = `0px`
......@@ -87,7 +88,7 @@ class SystemBulletScreen extends Component {
removeSystemNotices = e => {
e.persist()
if(e.target === this.sysNotice){
if (e.target === this.sysNotice) {
this.setState({
showNotices: false
})
......@@ -96,27 +97,24 @@ class SystemBulletScreen extends Component {
render() {
const {
bullets = [
'第一条消息,第一条消息,第一条消息,第一条消息,第一条消息,第一条消息,',
'第二条消息,第二条消息,第二条消息,第二条消息,第二条消息,第二条消息,',
'第三条消息,第三条消息,第三条消息,第三条消息,第三条消息,第三条消息,',
]
bullets
} = this.props
return (
this.state.showNotices &&
<div id="system-bullet-screen" onTransitionEnd={this.removeSystemNotices} ref={el => this.sysNotice = el}>
<img className='avatar'
src='https://julyedu-cdn.oss-cn-beijing.aliyuncs.com/newyear20/system-avatar.png' alt=""/>
src='https://julyedu-cdn.oss-cn-beijing.aliyuncs.com/newyear20/system-notice-icon.png' alt=""/>
<div className='sys-bullet-screen-swiper-container'>
<ul className="swiper-wrapper">
{
bullets && bullets.length && bullets.map((item, index) => {
return (
<li className="swiper-slide" key={index}>
<span>{item}</span>
</li>
)
})
(bullets && bullets.length) ? bullets.map((item, index) => {
return (
<li className="swiper-slide" key={index}>
<span>{item}</span>
</li>
)
})
: null
}
</ul>
</div>
......
@import "../user-bullet-screen/bullet-screen";
#system-bullet-screen {
@extend .bullet-screen;
overflow: hidden;
margin-top: 11px;
margin-bottom: 16px;
......@@ -25,9 +26,9 @@
span {
display: inline-block;
white-space: nowrap;
overflow: visible;
line-height: 30px;
}
}
@extend .bullet-screen;
}
......@@ -16,7 +16,7 @@ class UserBulletScreen extends Component {
this.getBulletScreenData(true)
}
componentWillUpdate() {
componentWillUnmount() {
this.swiper && this.swiper.destroy()
}
......
......@@ -7,7 +7,6 @@ import Prizes from "@components/activity/newyear-2019/common/prizes"
import BulletScreen from "@components/activity/newyear-2019/common/user-bullet-screen"
import './landing.scss'
import { browser, getParam, http, wxShare, SendMessageToApp } from "@/utils"
import { Link } from "react-router-dom"
import QRCode from "qrcode"
import YearCourse from '../preheat/YearCourse'
......@@ -18,7 +17,11 @@ class Landing extends Component {
closeIcon = 'https://julyedu-cdn.oss-cn-beijing.aliyuncs.com/newyear20/H5/close-btn.png'
createTeamSuccessPopup = null
joinSuccessPopup = null
shareTipPopup = null
swiper = null
shareTitle = ''
shareDesc = ''
state = {
teamData: {
......@@ -35,6 +38,13 @@ class Landing extends Component {
componentDidMount() {
this.fetchPageData()
window.showFollowAlert = this.remind.bind(this, 'create')
document.title = '七月在线年终大回馈,幸运宝箱随你开,100%有奖!'
const landing = document.querySelector('#landing')
const boxContainer = document.querySelector('.box-container')
if(boxContainer.offsetHeight < window.innerHeight){
landing.style.minHeight = `${window.innerHeight}px`
boxContainer.style.minHeight = `${window.innerHeight}px`
}
}
componentDidUpdate(prevProps) {
......@@ -43,8 +53,13 @@ class Landing extends Component {
}
}
componentWillUnmount() {
this.shareTipPopup && this.shareTipPopup.remove()
}
fetchPageData = ({origin = this.state.origin, treasure_code = this.state.treasure_code} = {}) => {
const {location} = this.props
http.post(`${API.home}/sys/treasure/team`, {
treasure_code,
origin
......@@ -59,6 +74,18 @@ class Landing extends Component {
activityEnd: data.status == 5
})
this.setupWxShareConfig(data.member)
if (browser.isWeixin) {
wxShare({
title: this.shareTitle,
desc: this.shareDesc,
link: `${window.location.origin}${location.pathname}?treasure_code=${getParam('treasure_code')}&origin=2`,
imgUrl: 'https://julyedu-cdn.oss-cn-beijing.aliyuncs.com/newyear20/H5/wx-share-icon.png'
})
// history.replace(`${match.url}?treasure_code=${getParam('treasure_code')}&origin=2`)
}
let searchParams = new URLSearchParams(window.location.search)
if (searchParams.get('origin') === '1' && !browser.isWeixin) {
searchParams.set('origin', '2')
......@@ -75,8 +102,15 @@ class Landing extends Component {
})
}
setupWxShareConfig = member => {
const len = member.length
let count = 5 - len <= 0 ? 4 : 5 - len
this.shareTitle = `还差${count}人即可开宝箱,100%有奖!`
this.shareDesc = '加入我的队伍,机械键盘,纸质书籍等超多奖品等你拿!--七月在线'
}
showSharePromptWithParam = () => {
if (sessionStorage.getItem('showShareTip')) {
if (sessionStorage.getItem('showShareTip') && !sessionStorage.getItem('closedRemind')) {
this.showShareTip()
}
}
......@@ -116,8 +150,17 @@ class Landing extends Component {
})
}
joinSuccess = ({id, status, my_team: {team_num, lack_member, is_team, treasure_code}}) => {
handleToMyTreasure = id => {
const {history} = this.props
this.joinSuccessPopup && this.joinSuccessPopup.remove()
if (getParam('version')) {
window.location.assign(`https://m.julyedu.com/year/yearTreasure?id=${id}&version=${getParam('version')}`)
} else {
window.location.assign(`https://m.julyedu.com/year/yearTreasure?id=${id}`)
}
}
joinSuccess = ({id, status, my_team: {team_num, lack_member, is_team, treasure_code}}) => {
this.joinSuccessPopup = Popup({
title: <div className={'join-success'}>
<img src="https://julyedu-cdn.oss-cn-beijing.aliyuncs.com/newyear20/H5/check-icon.png" alt=""/>
......@@ -137,12 +180,9 @@ class Landing extends Component {
{
status === 2
? <img style={{width: '150px', marginTop: '23px'}}
src="https://julyedu-cdn.oss-cn-beijing.aliyuncs.com/newyear20/PC/treasure-box.png"
src="https://julyedu-cdn.oss-cn-beijing.aliyuncs.com/newyear20/treasure-split.gif"
alt=""
onClick={() => {
this.joinSuccessPopup && this.joinSuccessPopup.remove()
history.push(`/year/yearTreasure?id=${id}`)
}}
onClick={this.handleToMyTreasure.bind(this, id)}
/>
: is_team
? <button type='button'
......@@ -163,14 +203,14 @@ class Landing extends Component {
inviteMembers = treasure_code => {
const {history, match, user, location} = this.props
if (browser.isWeixin) {
wxShare({
title: `@${user.data.username} 邀您一起组队拿豪礼!`,
desc: `加入我的队伍,机械键盘,纸质书籍等超多奖品等你拿!`,
link: `${window.location.origin}/${location.pathname}?treasure_code=${treasure_code}&origin=2`,
//todo 分享图片更换
imgUrl: 'https://julyedu-cdn.oss-cn-beijing.aliyuncs.com/newIndex/community/tou5_bj.png'
})
if (getParam('version')) {
let data = {
title: this.shareTitle,
desc: this.shareDesc,
link: `${window.location.origin}${location.pathname}?treasure_code=${treasure_code}&origin=2`,
imgUrl: 'https://julyedu-cdn.oss-cn-beijing.aliyuncs.com/newyear20/H5/wx-share-icon.png'
}
SendMessageToApp("toShare", data)
}
sessionStorage.setItem('showShareTip', '1')
history.replace(`${match.url}?treasure_code=${treasure_code}&origin=${1}`)
......@@ -230,56 +270,66 @@ class Landing extends Component {
})
}
// 安卓手机保存二维码
saveImage = url => {
let version = getParam('version')
version = typeof version === 'string' ? version.replace('.', '').replace('.', '').slice(0, 3) : ''
if (version && parseInt(version) < 451) {
Toast.info('当前不支持此功能,升级到最新版本app可以点击保存二维码!', 3, null, false)
} else {
SendMessageToApp('generateQRCode', url)
}
}
remind = (type = 'create', treasure_code, origin = 1) => {
const {user} = this.props
http.get(`${API["base-api"]}/wx/user_temporary_qrcode/${user.data.uid}`)
.then(res => {
const {data} = res.data
return data.url
})
QRCode.toDataURL('http://m.julyedu.com')
.then(url => {
Popup({
title: '提醒服务',
className: 'landing-remind',
closeIcon: this.closeIcon,
content: <div>
<div className="des">{type === 'create' ? '有好友加入队伍后第一时间通知我~' : '获得宝箱时第一时间通知我~'}</div>
<img src={url} alt=""/>
<div className="des">长按识别/扫码 关注【七月在线】服务号即可预约</div>
</div>,
close: () => {
// history.replace(`${match.path}?treasure_code=${treasure_code}&origin=1`)
this.fetchPageData({
treasure_code,
origin
})
}
}).then(text => {
QRCode.toDataURL(text)
.then(url => {
Popup({
title: '提醒服务',
className: 'landing-remind',
closeIcon: this.closeIcon,
content: <div>
<div className="des">{type === 'create' ? '有好友加入队伍后第一时间通知我~' : '获得宝箱时第一时间通知我~'}</div>
<img src={url} alt=""/>
{browser.isAndroidApp ? <div>
<button className={'android-qr-code-btn'} onClick={this.saveImage.bind(this, text)}>保存二维码</button>
</div> : null}
<div className="des">长按识别/扫码 关注【七月在线】服务号即可预约</div>
</div>,
close: () => {
// history.replace(`${match.path}?treasure_code=${treasure_code}&origin=1`)
sessionStorage.setItem('closedRemind', '1')
this.fetchPageData({
treasure_code,
origin
})
}
})
})
})
})
}
showShareTip = () => {
const {user} = this.props
if (browser.isAndroidApp) {
} else if (browser.isIOSApp) {
const {user, location} = this.props
if (browser.isAndroidApp || browser.isIOSApp) {
SendMessageToApp('toShare', {
title: `@${user.data.username} 邀您一起组队拿豪礼!`,
desc: `加入我的队伍,机械键盘,纸质书籍等超多奖品等你拿!`,
link: `${window.location.origin}/${location.pathname}?treasure_code=${getParam('treasure_code')}&origin=2`,
//todo 分享图片更换
imgUrl: 'https://julyedu-cdn.oss-cn-beijing.aliyuncs.com/newIndex/community/tou5_bj.png'
title: this.shareTitle,
desc: this.shareDesc,
link: `${window.location.origin}${location.pathname}?treasure_code=${getParam('treasure_code')}&origin=2`,
imgUrl: 'https://julyedu-cdn.oss-cn-beijing.aliyuncs.com/newyear20/H5/wx-share-icon.png'
})
} else {
const {history, match} = this.props
if (browser.isWeixin && getParam('origin') == 1) {
history.replace(`${match.url}?treasure_code=${getParam('treasure_code')}&origin=2`)
}
Popup({
this.shareTipPopup = Popup({
title: <div>还差<span>{this.state.teamData.lack_member}</span>名队友即可获得宝箱 快分享给好友吧~</div>,
className: `landing-share-tip ${browser.isWeixin ? 'wechat' : ''}`,
closable: false,
......@@ -322,14 +372,26 @@ class Landing extends Component {
}
requiredLogin = () => {
const {history, user} = this.props
const {history, user, location} = this.props
if (user.hasError) {
history.push('/passport')
if (browser.isWeixin) {
window.location.assign(`https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx23dac6775ac82877&redirect_uri=${encodeURIComponent(`${window.location.origin}${location.pathname}?treasure_code=${getParam('treasure_code')}&origin=${getParam('origin')}&aa=bb`)}&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect`)
} else {
history.push('/passport')
}
return true
}
}
toSquare = () => {
const {history} = this.props
if (!getParam('version')) {
window.location.assign('https://m.julyedu.com/year/yearindex')
} else {
window.location.assign('https://m.julyedu.com/year/yearindex?version=' + getParam('version'))
}
}
render() {
const {
......@@ -340,7 +402,8 @@ class Landing extends Component {
lack_member,
team_num,
prize_info,
my_team
my_team,
standby_plan
},
activityEnd,
isCaptain
......@@ -352,14 +415,23 @@ class Landing extends Component {
* 3-已加入当前队伍
* 4-已加入别的队伍
* */
return (
<div id={'landing'}>
<div id="to-square">
<Link to='/year/yearindex'>前往活动会场,享更多福利! >></Link>
</div>
{
!(standby_plan && browser.isWeixin) &&
<div id="to-square">
<a href='javascript:' onClick={this.toSquare}>前往活动会场,享更多福利! >></a>
</div>
}
<BoxContainer>
<i className="snow-deco"/>
<i className={`snow-deco ${standby_plan && browser.isWeixin ? 'standby' : ''}`}/>
{
standby_plan && browser.isWeixin &&
<>
<WhiteSpace className={'standby-space'}/>
<div className={'standby-tip'}>点击右上角,选择“在浏览器打开”</div>
</>
}
<img className='main-avatar'
src={head_img} alt=""/>
{
......@@ -417,9 +489,12 @@ class Landing extends Component {
<div className="group-des">
还差 {lack_member} 名队员即可获得当前宝箱哦~
</div>
<button type='button' className={'invite-btn'} onClick={this.showShareTip}>
邀请好友加入队伍
</button>
{
!(standby_plan && browser.isWeixin) &&
<button type='button' className={'invite-btn'} onClick={this.showShareTip}>
邀请好友加入队伍
</button>
}
</>
}
{
......@@ -434,14 +509,14 @@ class Landing extends Component {
}
</div>
{
my_team['is_team'] ?
!(standby_plan && browser.isWeixin) && (my_team['is_team'] ?
<button type='button' className={'invite-btn'}
onClick={this.inviteMembers.bind(this, my_team['treasure_code'])}>
继续组队
</button>
: <button type='button' className={'invite-btn'} onClick={this.createMyTeam}>
创建我的队伍
</button>
</button>)
}
</>
}
......@@ -457,25 +532,25 @@ class Landing extends Component {
}
</div>
{
my_team['is_team'] ?
!(standby_plan && browser.isWeixin) && (my_team['is_team'] ?
<button type='button' className={'invite-btn'}
onClick={this.inviteMembers.bind(this, my_team['treasure_code'])}>
继续组队
</button>
: <button type='button' className={'invite-btn'} onClick={this.createMyTeam}>
创建我的队伍
</button>
</button>)
}
</>
}
{
status === 2 && !activityEnd && < button type='button' className={'invite-btn'} onClick={this.joinTeam}>
!(standby_plan && browser.isWeixin) && status === 2 && !activityEnd && < button type='button' className={'invite-btn'} onClick={this.joinTeam}>
同意加入队伍
</button>
}
{
prize_info && prize_info.length !== 0 && !activityEnd && !isCaptain && <div className="certainly-prompt">
{prize_info[0].stage_no}必中 {prize_info[0].name}
{prize_info[0].stage_no}个宝箱必中 {prize_info[0].name}
</div>
}
{
......
.sup {
position: absolute;
right: -10px;
top: -13px;
top: 0;
transform: translateY(-50%);
width: 30px;
height: 16px;
background: rgba(255, 227, 0, 1);
......@@ -16,6 +17,7 @@
#landing {
background: #BC2A18;
text-align: center;
min-height: 100%;
#to-square {
position: fixed;
......@@ -42,6 +44,10 @@
height: 68px;
background: url("https://julyedu-cdn.oss-cn-beijing.aliyuncs.com/newyear20/H5/snow-deco.png") no-repeat;
background-size: contain;
&.standby {
top: 0;
}
}
.main-avatar {
......@@ -49,7 +55,7 @@
height: 49px;
border-radius: 50%;
margin-bottom: 5px;
margin-top: 37.5px;
margin-top: 55px;
object-fit: cover;
}
......@@ -68,6 +74,35 @@
}
}
.standby-space {
height: 25px;
}
.standby-tip {
position: relative;
width: 270px;
height: 32px;
background: #FFDE00;
border-radius: 5px;
margin: 0 auto -40px;
line-height: 32px;
text-align: center;
color: #202426;
font-size: 15px;
&::after {
content: '';
display: block;
position: absolute;
top: -120%;
right: -6%;
width: 50px;
height: 38px;
background: url("https://julyedu-cdn.oss-cn-beijing.aliyuncs.com/newyear20/H5/standby-share-tip-icon.png");
background-size: contain;
}
}
.group {
ul.member {
......@@ -108,6 +143,7 @@
width: 36px;
height: 36px;
border-radius: 50%;
border: 1px solid #fff;
}
}
......@@ -159,7 +195,7 @@
}
.certainly-prompt {
margin-top: -43px;
margin-top: 27px;
padding-bottom: 16px;
font-size: 14px;
color: #FFE300;
......@@ -338,7 +374,7 @@
}
img {
margin: 18px 0 16px;
margin: 15px 0 16px;
width: 137px;
height: 137px;
}
......@@ -349,7 +385,15 @@
}
button {
width: 270px;
height: 44px;
background: rgba(255, 227, 25, 1);
border: 1px solid rgba(9, 9, 9, 1);
border-radius: 5px;
font-size: 16px;
font-weight: normal;
color: rgba(9, 9, 9, 1);
margin-bottom: 15px;
}
}
......@@ -392,6 +436,6 @@
}
}
.year19-index{
.year19-index {
display: none;
}
import React, { Component } from 'react';
import { connect } from 'react-redux';
import { HeaderBar } from '@common';
import AddressPopup from '@common/addressPopup/index';
import BindPhone from '@common/bindPhone/index';
import ConfirmPhone from '@common/confirmPhone/index';
import CreateSuccess from './../common/createSuccess/index';
import TreasureTeam from './team';
import PrizeStatus from './prize';
import SplitSuccess from './../common/splitSuccess/index';
import { http, getParam } from '@/utils';
import Mask from './mask';
import './index.scss';
import { split } from 'react-ace';
import React, { Component } from 'react'
import { connect } from 'react-redux'
import { HeaderBar } from '@common'
import AddressPopup from '@common/addressPopup/index'
import BindPhone from '@common/bindPhone/index'
import ConfirmPhone from '@common/confirmPhone/index'
import CreateSuccess from './../common/createSuccess/index'
import TreasureTeam from './team'
import PrizeStatus from './prize'
import SplitSuccess from './../common/splitSuccess/index'
import { http, getParam, SendMessageToApp, browser } from '@/utils'
import Mask from './mask'
import './index.scss'
@connect(({country, user}) => ({
country,
userInfo: user.data
}))
class MyTreasure extends Component {
popupInstance = null;
popupInstance = null
constructor(props) {
super(props);
super(props)
this.state = {
isEnd: false,
isEmpty: false,
......@@ -37,61 +36,67 @@ class MyTreasure extends Component {
isCreate: false,
createInfo: {},
prizeName: '', // 当前商品的名字
};
treasureTime: '', // 宝箱活动结束时间
}
}
componentDidMount() {
const { isEnd } = this.state;
if (isEnd) {
this.startCountDown();
this.fetchMyTreasure()
this.fetchActivityStatus()
document.title = '七月在线年终大回馈,幸运宝箱随你开,100%有奖!人气好课免费学,精品课程1分抢!';
}
componentWillReceiveProps(nextProp) {
const {history} = this.props
const {userInfo} = nextProp
if (!userInfo.uid) {
history.push('/passport')
}
this.fetchMyTreasure();
this.fetchActivityStatus();
}
// 页面加载时,初始化当前需要绑定手机号的奖品名字
initPrizeName = (params) => {
const key = this.fetchCurrentTeamId(params);
const data = params.filter(item => item.id == key);
if(data.length > 0) {
const key = this.fetchCurrentTeamId(params)
const data = params.filter(item => item.id == key)
if (data.length > 0) {
this.setState({
prizeName: data[0]['prize_name']
});
})
}
}
// 页面加载时,是否需要拆宝箱
judgeIsHaveId = (data) => {
const id = getParam('id');
if(id) {
const newData = data.filter(item => item.id == id);
if(newData.length > 0) {
const id = getParam('id')
if (id) {
const newData = data.filter(item => item.id == id)
if (newData.length > 0) {
const params = {
team_num: newData[0]['team_num'],
owner_uid: newData[0]['captain_uid']
};
this.toSplitTreasure(params);
}
this.toSplitTreasure(params)
}
}
}
// 获取当前需要绑定手机的队伍id,当拆到需要绑定手机号/地址的宝箱时,如果不进行绑定则无法拆下一个
fetchCurrentTeamId = (data = []) => {
const arr = data.filter(item => item.is_open && (item.bind_phone || item.bind_address));
if(arr.length > 0) {
return arr[0]['id'];
}else {
return '';
const arr = data.filter(item => item.is_open && (item.bind_phone || item.bind_address))
if (arr.length > 0) {
return arr[0]['id']
} else {
return ''
}
}
// 页面加载时,是否是从选择区号页面过来的
// TODO,当同时展示拆宝箱成功弹窗和绑定手机号弹窗时,选择区号返回时未展示拆宝箱成功弹窗(和产品确认,后续优化)
isShowBindPhone = (data) => {
const { country } = this.props;
if(country.from) {
const id = this.fetchCurrentTeamId(data);
this.handleToBindPhone(id);
const {country} = this.props
if (country.from) {
const id = this.fetchCurrentTeamId(data)
this.handleToBindPhone(id)
}
}
......@@ -99,19 +104,19 @@ class MyTreasure extends Component {
handleToBindPhone = (id) => {
this.setState({
isPhone: true,
});
})
}
// 绑定手机号--确认
handleToConfirmPhone = (params, bindInfo) => {
this.handleToHideWindow('isPhone');
this.handleToHideWindow('isPhone')
this.setState({
confirmInfo: {
params,
bindInfo,
},
isConfirm: true,
});
})
}
// 绑定手机号--成功
......@@ -119,64 +124,63 @@ class MyTreasure extends Component {
this.setState({
isPhone: false,
isConfirm: false,
});
const{ teams, splitInfo } = this.state;
const teamId = this.fetchCurrentTeamId(teams);
})
const {teams, splitInfo} = this.state
const teamId = this.fetchCurrentTeamId(teams)
const data = teams.map(item => {
if(item.id == teamId) {
if(item.bind_address) {
this.handleToBindAddress();
if (item.id == teamId) {
if (item.bind_address) {
this.handleToBindAddress()
}
return Object.assign({}, item, {
bind_phone: false,
});
})
}
return item;
return item
})
this.setState({
teams: data,
splitInfo: Object.assign({}, splitInfo, {
bind_phone: false
})
});
})
}
// 拆宝箱--拆
toSplitTreasure = (params) => {
http.post(`${API.home}/sys/split_treasure`, params).then(res => {
const { code, data } = res.data;
if(code === 200) {
const {code, data} = res.data
if (code === 200) {
// 拆宝箱弹窗--成功
this.showSuccessSplit(data);
this.showSuccessSplit(data)
// 更新队伍状态
this.successSplitTreasure(data);
if(data.bind_phone) {
this.successSplitTreasure(data)
if (data.bind_phone) {
setTimeout(() => {
this.handleToBindPhone(data.id);
}, 500);
}else if(data.bind_address) {
this.handleToBindPhone(data.id)
}, 500)
} else if (data.bind_address) {
setTimeout(() => {
this.handleToBindAddress(data.id);
}, 500);
this.handleToBindAddress(data.id)
}, 500)
}
}else if(code === 12000) {
} else if (code === 12000) {
// 绑定手机号
this.handleToBindPhone();
}else if(code === 12001) {
this.handleToBindPhone()
} else if (code === 12001) {
// 绑定地址
this.handleToBindAddress();
this.handleToBindAddress()
}
});
})
}
// 拆宝箱--成功,更新数据
successSplitTreasure = (params) => {
const { userInfo } = this.props;
const { teams } = this.state;
const {userInfo} = this.props
const {teams} = this.state
const data = teams.map(item => {
if(item.id == params.id) {
if (item.id == params.id) {
return Object.assign({}, item, {
bind_phone: params.bind_phone,
bind_address: params.bind_address,
......@@ -184,25 +188,25 @@ class MyTreasure extends Component {
prize_type: params.prize_type,
prize_data: params.prize_data,
member: item.member.map(val => {
if(val.uid == userInfo.uid) {
if (val.uid == userInfo.uid) {
return Object.assign({}, val, {
is_open: true,
prize_name: params.prize_name
});
})
}
return val;
return val
})
});
}else {
return item;
})
} else {
return item
}
});
this.initNoSplitInfo(data);
})
this.initNoSplitInfo(data)
this.setState({
teams: data,
splitInfo: params,
prizeName: params.prize_name
});
})
}
// 拆宝箱--成功,展示弹窗
......@@ -210,68 +214,77 @@ class MyTreasure extends Component {
this.setState({
isSplit: true,
splitInfo: data
});
})
}
// 绑定地址--展示
handleToBindAddress = (id) => {
if (id) {
const {teams} = this.state
const data = teams.filter(item => item.id == id)
if (data.length > 0) {
this.setState({
prizeName: data[0]['prize_name']
})
}
}
this.setState({
isAddress: true
});
})
}
// 绑定地址--成功
successBindAddress = () => {
this.setState({
isAddress: false,
});
const{ teams, splitInfo } = this.state;
const teamId = this.fetchCurrentTeamId(teams);
})
const {teams, splitInfo} = this.state
const teamId = this.fetchCurrentTeamId(teams)
const data = teams.map(item => {
if(item.id == teamId) {
if (item.id == teamId) {
return Object.assign({}, item, {
bind_address: false,
});
})
}
return item;
return item
})
this.setState({
teams: data,
splitInfo: Object.assign({}, splitInfo, {
bind_address: false
})
});
})
}
// 获取我的宝箱信息
fetchMyTreasure = () => {
http.get(`${API.home}/sys/treasure/my`).then(res => {
const { code, data } = res.data;
const {code, data} = res.data
if (code === 200) {
this.setState({
rule: data.rule
});
})
if (Array.isArray(data.team) && data.team.length > 0) {
this.initNoSplitInfo(data.team);
this.judgeIsHaveId(data.team);
this.isShowBindPhone(data.team);
this.initPrizeName(data.team);
this.initNoSplitInfo(data.team)
this.judgeIsHaveId(data.team)
this.isShowBindPhone(data.team)
this.initPrizeName(data.team)
this.setState({
isEmpty: false,
teams: data.team,
});
})
} else {
this.setState({
isEmpty: true,
});
})
}
}
});
})
}
// 统计未拆的宝箱信息
initNoSplitInfo = (data = []) => {
if(data.length > 0) {
if (data.length > 0) {
this.setState({
ids: data.filter(item => !item.is_open && item.status === 2).map(val => {
return {
......@@ -279,118 +292,145 @@ class MyTreasure extends Component {
owner_uid: val.captain_uid
}
})
});
})
}
}
// 获取宝箱活动状态
fetchActivityStatus = () => {
http.get(`${API.home}/activity/stage`).then(res => {
const { code, data } = res.data;
const {code, data} = res.data
if (code === 200) {
// treasure_stage,宝箱阶段,0-不在活动时间,1-活动时间内
if (data.treasure_stage === 0) {
this.startCountDown()
}
this.setState({
isEnd: data.treasure_stage === 0
});
isEnd: data.treasure_stage === 0,
treasureTime: data.treasure_stop_date
})
}
});
})
}
// 活动结束--倒计时
startCountDown = () => {
const { history } = this.props;
let { seconds } = this.state;
const {history} = this.props
let {seconds} = this.state
if (this.timer) {
clearInterval(this.timer);
clearInterval(this.timer)
}
this.setState({
seconds: seconds--
});
})
this.timer = setInterval(() => {
this.setState({
seconds: seconds--
});
})
if (seconds === 0) {
this.setState({
seconds: 0
});
clearInterval(this.timer);
history.push('/year/yearIndex');
})
clearInterval(this.timer)
if (getParam('version')) {
history.push(`/year/yearIndex?version=${getParam('version')}`)
} else {
history.push('/year/yearIndex')
}
}
}, 1000);
}, 1000)
}
// 邀请好友
handleToInvite = (treasure_code) => {
const { history } = this.props;
history.push(`/activity/newyear-2019/landing?treasure_code=${treasure_code}&origin=1`);
const {history} = this.props
if (getParam('version')) {
window.location.assign(`https://h5.julyedu.com/activity/newyear-2019/landing?treasure_code=${treasure_code}&origin=1&version=${getParam('version')}`)
} else {
window.location.assign(`https://h5.julyedu.com/activity/newyear-2019/landing?treasure_code=${treasure_code}&origin=1`)
}
}
// 组队开宝箱
toOrganizeTeam = () => {
const { history, userInfo: { uid = '' } } = this.props;
if(uid === '') {
const {history, userInfo: {uid = ''}} = this.props
if (uid === '') {
history.push('/passport')
}else {
} else {
http.get(`${API.home}/sys/treasure/createMyTeam`).then(res => {
const { code, data } = res.data;
if(code === 200) {
const teams = [];
teams[0] = data;
const {code, data} = res.data
if (code === 200) {
const teams = []
teams[0] = data
this.setState({
isEmpty: false,
teams,
isCreate: true,
createInfo: data
});
})
}
});
})
}
}
// 奖品,代金券碎片--合成
toComposeCoupon = () => {
const { history } = this.props;
history.push('/coupons/my-patch');
const {history} = this.props
if (getParam('version')) {
SendMessageToApp("toCoupon")
} else {
history.push('/coupons/my-patch')
}
}
// 奖品,指定课程代金券--使用
toUseCoupon = (id) => {
const { history } = this.props;
history.push(`/detail?id=${id}`);
const {history} = this.props
if (getParam('version')) {
SendMessageToApp("toCourse", id)
} else {
history.push(`/detail?id=${id}`)
}
}
// 第三:奖品,通用课程代金券--使用
toCourseList = () => {
const { history } = this.props;
history.push('/classify');
const {history} = this.props
if (getParam('version')) {
SendMessageToApp('toQualityCourse')
} else {
history.push('/classify')
}
}
// 第三:奖品,现金红包--提现
toFecthMoney = () => {
const { history } = this.props;
history.push('/scholarship');
const {history} = this.props
if (getParam('version')) {
SendMessageToApp('toAccount')
} else {
history.push('/scholarship')
}
}
// 弹窗--隐藏
handleToHideWindow = (key) => {
const param = {};
param[key] = false;
this.setState(param);
const param = {}
param[key] = false
this.setState(param)
}
render() {
const { history, userInfo, country } = this.props;
const {
isEnd,
isEmpty,
seconds,
teams,
ids,
const {history, userInfo, country} = this.props
const {
isEnd,
isEmpty,
seconds,
teams,
ids,
isPhone,
isAddress,
isConfirm,
isConfirm,
isSplit,
splitInfo = {},
confirmInfo: {
......@@ -401,26 +441,29 @@ class MyTreasure extends Component {
createInfo,
prizeName,
rule,
} = this.state;
treasureTime,
} = this.state
return (
<div data-skip="treasure">
<HeaderBar title="我的宝箱" arrow={true} />
{
isEnd &&
<p className="activity-end__desc">
活动已结束<br />
{seconds}s后将自动返回首页
</p>
}
{
(!isEnd && isEmpty) &&
<>
<i className="team-empty__icon"></i>
<p className="team-empty__desc">您当前还没有宝箱哦~</p>
<p className="team-empty__desc">快去组队邀请好友一起开宝箱吧!</p>
<button className="team-empty__button" onClick={this.toOrganizeTeam}>组队开宝箱</button>
</>
}
{(!browser.isAndroidApp && !browser.isIOSApp) && <HeaderBar title="我的宝箱" arrow={true}/>}
<div className="team-empty">
{
isEnd &&
<p className="activity-end__desc">
活动已结束<br/>
{seconds}s后将自动返回首页
</p>
}
{
(!isEnd && isEmpty) &&
<>
<i className="team-empty__icon"></i>
<p className="team-empty__desc">您当前还没有宝箱哦~</p>
<p className="team-empty__desc">快去组队邀请好友一起开宝箱吧!</p>
<button className="team-empty__button" onClick={this.toOrganizeTeam}>组队开宝箱</button>
</>
}
</div>
{
(!isEnd && !isEmpty && userInfo.uid) &&
<div className="treasure-content">
......@@ -437,14 +480,14 @@ class MyTreasure extends Component {
owner_uid: item.captain_uid
})}
>
<PrizeStatus
<PrizeStatus
data={{
bind_phone: item.bind_phone,
bind_address: item.bind_address,
prize_type: item.prize_type,
}}
handleToBindPhone={this.handleToBindPhone}
handleToBindAddress={this.handleToBindAddress}
handleToBindAddress={() => this.handleToBindAddress(item.id)}
toComposeCoupon={this.toComposeCoupon}
toUseCoupon={() => this.toUseCoupon(item.prize_data)}
toCourseList={this.toCourseList}
......@@ -456,7 +499,7 @@ class MyTreasure extends Component {
{/* 拆宝箱--弹窗,成功 */}
<Mask visible={isSplit} handleToHide={() => this.handleToHideWindow('isSplit')}>
<SplitSuccess
<SplitSuccess
ids={ids}
data={splitInfo}
handleToInvite={() => this.handleToInvite(splitInfo.treasure_code)}
......@@ -464,7 +507,7 @@ class MyTreasure extends Component {
handleToBindAddress={this.handleToBindAddress}
successSplitTreasure={this.successSplitTreasure}
>
<PrizeStatus
<PrizeStatus
data={splitInfo}
handleToBindPhone={this.handleToBindPhone}
handleToBindAddress={this.handleToBindAddress}
......@@ -477,7 +520,7 @@ class MyTreasure extends Component {
</Mask>
{/*绑定手机号--弹窗 */}
<Mask visible={isPhone} handleToHide={() => this.handleToHideWindow('isPhone')}>
<Mask visible={isPhone} className="popup-bind-phone" handleToHide={() => this.handleToHideWindow('isPhone')}>
<BindPhone
history={history}
country={country}
......@@ -486,8 +529,8 @@ class MyTreasure extends Component {
successBindPhone={this.successBindPhone}
desc={
<>
<p className="phone-treasure__desc">恭喜您获得 奖品名称({prizeName}</p>
<p className="phone-treasure__notice">为了您的账户安全,请于20191231前绑定手机号,过期将失效</p>
<p className="phone-treasure__desc">恭喜您获得 {prizeName}</p>
<p className="phone-treasure__notice">为了您的账户安全,请于{treasureTime}前绑定手机号,过期将失效</p>
</>
}
/>
......@@ -495,16 +538,16 @@ class MyTreasure extends Component {
{/* 绑定手机号--弹窗,确认 */}
<Mask visible={isConfirm} handleToHide={() => this.handleToHideWindow('isConfirm')}>
<ConfirmPhone
data={params}
bindInfo={bindInfo}
<ConfirmPhone
data={params}
bindInfo={bindInfo}
handleToCancle={() => this.handleToHideWindow('isConfirm')}
successBindPhone={this.successBindPhone}
/>
</Mask>
{/* 绑定地址--弹窗 */}
<Mask visible={isAddress} handleToHide={() => this.handleToHideWindow('isAddress')}>
<Mask visible={isAddress} className="popup-bind-address" handleToHide={() => this.handleToHideWindow('isAddress')}>
<AddressPopup
skip="year"
tip={
......@@ -519,25 +562,30 @@ class MyTreasure extends Component {
{/* 组队成功 */}
<Mask visible={isCreate} handleToHide={() => this.handleToHideWindow('isCreate')}>
<CreateSuccess
data={createInfo}
<CreateSuccess
data={createInfo}
handleToInvite={() => {
this.handleToInvite(createInfo.treasure_code);
this.handleToHideWindow('isCreate');
this.handleToInvite(createInfo.treasure_code)
this.handleToHideWindow('isCreate')
}}
/>
</Mask>
</div>
}
<div className="activity-rule__header">
<i className="activity-rule__decorate"></i>
<h2 className="activity-rule__title">活动规则</h2>
<i className="activity-rule__decorate"></i>
</div>
<div className="activity-rule__body" dangerouslySetInnerHTML={{__html: rule}}></div>
{
rule &&
<>
<div className="activity-rule__header">
<i className="activity-rule__decorate"></i>
<h2 className="activity-rule__title">活动规则</h2>
<i className="activity-rule__decorate"></i>
</div>
<div className="activity-rule__body" dangerouslySetInnerHTML={{__html: rule}}></div>
</>
}
</div>
)
}
}
export default MyTreasure;
\ No newline at end of file
export default MyTreasure
[data-skip="treasure"] {
min-height: 100vh;
background-color: #0E7442;
min-height: 100vh;
background-color: #0E7442;
&+ .year19-index {
display: none;
}
.treasure-content {
padding: 16px 0 10px;
......@@ -11,18 +15,21 @@
}
.activity-end__desc {
margin: 118px 0 0;
font-size: 30px;
color: #fff;
text-align: center;
line-height: 42px;
}
.team-empty {
padding-top: 118px;
}
.team-empty__icon {
display: block;
width: 56px;
height: 49px;
margin: 118px auto 18px;
margin: 0 auto 18px;
background-size: cover;
background-image: url('https://julyedu-cdn.oss-cn-beijing.aliyuncs.com/newyear20/PC/icon-empty.png');
}
......@@ -82,6 +89,17 @@
}
}
.mask-content {
&.popup-bind-phone {
height: 350px;
}
&.popup-bind-address {
height: 316px;
}
}
// 所有弹窗
.popup-container {
......
import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import classnames from 'classnames';
import './mask.scss';
const Root = document.querySelector('body');
......@@ -22,12 +23,12 @@ class Mask extends Component {
}
render() {
const { visible, handleToHide } = this.props;
const { visible, handleToHide, className } = this.props;
if(visible) {
return ReactDOM.createPortal(
(
<div className="mask">
<div className="mask-content">
<div className={classnames("mask-content", className)}>
{this.props.children}
</div>
<div className="mask-footer">
......
File mode changed from 100644 to 100755
......@@ -86,7 +86,8 @@ export default (props) => {
{/* 第三:奖品,任意线上课程兑换券 */}
{
(!bind_phone && !bind_address && prize_type === 5) &&
<a className="team-result">文案待定</a>
<a className="team-result">关注公众号“七月在线实验室” 回复“领课”
</a>
}
</>
)
......
File mode changed from 100644 to 100755
......@@ -138,8 +138,8 @@ class TreasureTeam extends Component {
<>
{
is_captain
? <Link className="team-button" to={`/activity/newyear-2019/landing?treasure_code=${treasure_code}&origin=1`}>继续邀请队友</Link>
: <Link className="team-button" to={`/activity/newyear-2019/landing?treasure_code=${treasure_code}&origin=2`}>帮好友完成组队</Link>
? <a className="team-button" href={`https://h5.julyedu.com/activity/newyear-2019/landing?treasure_code=${treasure_code}&origin=1`}>继续邀请队友</a>
: <a className="team-button" href={`https://h5.julyedu.com/activity/newyear-2019/landing?treasure_code=${treasure_code}&origin=2`}>帮好友完成组队</a>
}
</>
}
......@@ -176,4 +176,4 @@ class TreasureTeam extends Component {
}
}
export default TreasureTeam;
\ No newline at end of file
export default TreasureTeam;
......@@ -155,7 +155,7 @@
height: 46px;
margin: 0 20px;
background-size: cover;
background-image: url('https://julyedu-cdn.oss-cn-beijing.aliyuncs.com/newyear20/PC/treasure-box.png');
background-image: url('https://julyedu-cdn.oss-cn-beijing.aliyuncs.com/newyear20/treasure-split.gif');
}
.team-icon {
......
......@@ -18,12 +18,20 @@ class LiveRoom extends Component {
list: [],
showMark: false,
subUrl: '',
QRCodeUrl: '',
}
}
componentDidMount() {
this.getLiveInfo();
}
shouldComponentUpdate(nextProps, nextState, nextContext) {
if (this.props.isAppUpdate !== nextProps.isAppUpdate) {
this.getLiveInfo();
return false
}
return true
}
getLiveInfo = () => {
http.get(`${API.home}/activity/get_live_info`).then(res => {
const { code, data, msg } = res.data;
......@@ -50,6 +58,7 @@ class LiveRoom extends Component {
this.setState({
showMark: true,
subUrl: url,
QRCodeUrl: data.url,
})
})
} else {
......@@ -157,11 +166,18 @@ class LiveRoom extends Component {
<span onClick={ ()=>this.subscribe(item.live_id)} className="order__btn">立即预约</span>
)
}
{
item.is_end == 1 && item.transcribe_url=='' && (
<span className="order__btn live__end">已结束</span>
)
}
{
item.on_live == 0 && item.is_end == 0 && item.is_subscribe == 1 && (
<span onClick={this.tip} className="order__btn subscribed">已预约</span>
)
}
}
{
item.on_live == 1 && item.is_end == 0 && (
<span onClick={()=>this.toLivingRoom(item.room_url)} className="order__btn living">正在直播</span>
......
......@@ -91,6 +91,10 @@
.subscribed {
background: rgba(254, 228, 29, 1);
}
.live__end{
background: #999;
color: #fff;
}
.living {
background: rgba(0, 153, 255, 1);
color: #fff;
......
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -6,7 +6,7 @@
flex-wrap: wrap;
.course-container {
width: 158px;
width: 168px;
margin: 15px 0 0 0;
text-align: center;
position: relative;
......@@ -27,6 +27,20 @@
text-align: center;
}
.bargain-price {
position: absolute;
left: 4px;
top: 10px;
margin: 0;
height: 18px;
padding: 0 8px;
border-radius: 0 9px 9px 0;
font-size: 12px;
color: #fff;
line-height: 18px;
background-color: #F01D0E;
}
.coupon-course__footer {
.course-title {
padding-left: 10px;
......@@ -137,31 +151,61 @@
transform: skewX(-20deg);
z-index: -1;
}
.tag[data-color="green"]:before {
background-color: #357345;
}
}
.price {
text-align: left;
padding-left: 5px;
margin-top: 3px;
color: #FF0002;
padding-left: 4px;
font-size: 12px;
color: #FF0002;
text-align: left;
&.price-group {
font-size: 0;
height: 30px;
}
.price-label {
font-size: 12px;
}
.new-price {
font-size: 18px;
font-size: 16px;
}
.old-price {
margin-left: 2px;
font-size: 12px;
color: #666;
margin-left: 8px;
}
}
.status {
text-align: left;
padding-left: 5px;
position: absolute;
left: 0;
bottom: 10px;
right: 0;
padding: 0 5px;
text-align: left;
&[data-layout="row"] {
display: flex;
.to-group {
&:nth-child(1) {
margin-right: 2px;
}
&:nth-child(2) {
margin-left: 2px;
}
}
}
.status-btn {
display: inline-block;
......@@ -178,6 +222,30 @@
background-color: #FF8080;
}
.to-group {
display: block;
width: 100%;
height: 22px;
border-radius: 11px;
box-sizing: border-box;
font-size: 14px;
color: #fff;
text-align: center;
line-height: 22px;
background: linear-gradient(-90deg,rgba(235,22,18,1) 0%,rgba(255,0,2,1) 100%);
&[data-status="study"] {
background: #0099FF;
}
&[data-status="done"] {
border: 1px solid #090F08;
font-size: 12px;
color: #090F08;
background: #FEE41D;
}
}
.add-wish, .add-wish-success {
width: 88px;
margin-left: 5px;
......@@ -214,6 +282,41 @@
.groupcourse .course-container {
height: 195px;
}
.groupcourse[data-stage="2"] .course-container {
height: 215px;
}
.progree-and-sale {
display: flex;
align-items: center;
justify-content: center;
padding-left: 5px;
}
.progress {
width: 90px;
height: 8px;
border-radius: 4px;
background-color: #E6E6E6;
}
.progress_bar {
display: block;
width: 10%;
height: 100%;
border-radius: 4px 0 0 4px;
background-color: #FF0002;
}
.sale-sum {
flex: 1;
margin: 0;
font-size: 12px;
color: #333;
text-align: center;
line-height: 1;
}
.ai-course__subtitle {
width: 73px;
......@@ -273,8 +376,8 @@
background-repeat: no-repeat;
background-size: cover;
position: fixed;
top: 50%;
right: 0;
bottom: 20%;
margin-top: -57px;
z-index: 22;
.nav-right__link {
......
......@@ -24,7 +24,7 @@ export default class index extends Component {
removable: 0, // 未拆宝箱的数量
currentOpenId: 0, // 当前要拆的宝箱的队伍的ID
treasure_stage: 0, // 宝箱的活动阶段
active_stage: 0, // 整个活动的阶段
activity_stage: 0, // 整个活动的阶段
userInfoList: [],
userInfo: {},
isAppUpdate: false,
......@@ -39,6 +39,7 @@ export default class index extends Component {
_this.loginInfo(result)
}
_this.getStage()
document.title = '七月在线年终大回馈,幸运宝箱随你开,100%有奖!人气好课免费学,精品课程1分抢!';
}
// 获取app登录数据
......@@ -132,6 +133,7 @@ export default class index extends Component {
if (code === 200) {
// treasure_stage,宝箱阶段,0-不在活动时间,1-活动时间内
this.setState({
activity_stage: data.activity_stage,
treasure_stage: data.treasure_stage
})
} else {
......@@ -141,7 +143,11 @@ export default class index extends Component {
}
render() {
const {banner, removable, treasure_stage, currentOpenId} = this.state
const {
banner,
activity_stage,
treasure_stage,
} = this.state
return (
<div className={'year-index'}>
<div className="banner-treasure">
......@@ -152,34 +158,17 @@ export default class index extends Component {
</div>
<div className="banner-treasure__decorate"></div>
</div>
{/*浮框*/}
<div className='nav-right'>
<span onClick={this.toBoxList} className='nav-right__link'>
未开宝箱
{
removable > 0 &&
<i className="nav-right__number">{removable}</i>
}
</span>
<a onClick={() => this.toYearWish()} className='nav-right__link'>
心愿单
{
this.state.txt1 > 0 &&
<i className="nav-right__number">{this.state.txt1}</i>
}
</a>
</div>
{/* 大咖直播 */}
<LiveRoom/>
<LiveRoom isAppUpdate={this.state.isAppUpdate}/>
{/* 组队开宝箱 */}
{
treasure_stage === 1 && <TreasureBox getRemovable={this.getRemovable}/>
treasure_stage === 1 &&
<TreasureBox isAppUpdate={this.state.isAppUpdate} getRemovable={this.getRemovable}/>
}
{/*课程*/}
<YearCourse currentOpenId={currentOpenId} removable={removable} isAppUpdate={this.state.isAppUpdate} />
{/* 课程 */}
<YearCourse stage={activity_stage} isAppUpdate={this.state.isAppUpdate} />
{/*好友加入队伍提醒;获得宝箱提醒;开售提醒弹窗,需要自取,注意修改文案*/}
{
......
File mode changed from 100644 to 100755
......@@ -8,7 +8,7 @@ class TreasureNav extends Component {
super(props);
this.state = {
isFixed: false,
curIndex: 1,
curIndex: 0,
formatNavs: [],
navs: [
{
......
......@@ -27,7 +27,7 @@
line-height: 26px;
&.active {
border-right: 1px solid #090F08;
border: 1px solid #090F08;
border-radius: 3px;
color: #090F08;
background-color: #FEE41D;
......
import React, { Component } from 'react';
import { withRouter } from 'react-router-dom';
import CommonContainer from './../common/commonContainer/index';
import TreasureRank from './rank';
import TeamInfo from './team'
......@@ -12,14 +13,19 @@ class TreasureBox extends Component {
render() {
return (
<CommonContainer id="year-treasure" title={'组队开宝箱'}>
<div style={{textAlign: 'center', fontSize: '12px', color: '#FFDC1E', marginTop: '10px'}}>邀请好友组队一起开宝箱,满5人后将随机获得以下奖品~</div>
<div style={{
textAlign: 'center',
fontSize: '12px',
color: '#FFDC1E',
marginTop: '10px'
}}>邀请好友组队一起开宝箱,满5人后将随机获得以下奖品~</div>
<Prizes showSystemNotices={true}/>
<UserBulletScreen/>
<TeamInfo getRemovable={this.props.getRemovable} />
<TreasureRank />
<TeamInfo isAppUpdate={this.props.isAppUpdate} getRemovable={this.props.getRemovable} />
<TreasureRank history={this.props.history} />
</CommonContainer>
)
}
}
export default TreasureBox;
export default withRouter(TreasureBox);
File mode changed from 100644 to 100755
import React, { Component } from 'react';
import { http } from '@/utils';
import { http, getParam, SendMessageToApp } from '@/utils';
import './rank.scss'
class TreasureRank extends Component {
......@@ -21,18 +21,20 @@ class TreasureRank extends Component {
http.get(`${API.home}/sys/treasure/ranking`).then(res => {
const { code, data } = res.data;
if(code === 200) {
if(data.length > 5) {
this.setState({
rank: data.filter((item, index) => index < 5),
rankList: data,
isMore: true,
});
}else {
this.setState({
rank: data,
rankList: data,
isMore: false,
});
if(JSON.stringify(data) !== '{}') {
if(data.length > 5) {
this.setState({
rank: data.filter((item, index) => index < 5),
rankList: data,
isMore: true,
});
}else {
this.setState({
rank: data,
rankList: data,
isMore: false,
});
}
}
}
});
......@@ -53,55 +55,71 @@ class TreasureRank extends Component {
}
}
handleToVip = (id) => {
const { history } = this.props;
if(id) {
if(getParam('version')) {
SendMessageToApp('toCourse', id);
}else {
history.push(`/detail?id=${id}`);
}
}
}
render() {
const { rank, isMore } = this.state;
return (
<div data-skip="rank">
<div className="rank-title">
<i className="rank-title__decorate"></i>
<h2 className="rank-title__txt">宝箱达人榜</h2>
<i className="rank-title__decorate"></i>
</div>
<p className="rank-desc">宝箱数量前50名可额外获得一份奖品,数量相同的用时短者排名在前</p>
<dl className="rank-header">
<dd className="rank-column">排名</dd>
<dd className="rank-column">用户</dd>
<dd className="rank-column">宝箱数量</dd>
<dd className="rank-column">奖品</dd>
</dl>
<div className="rank-body">
{
rank.map((item, index) => (
<dl className="rank-item" key={index}>
<dd className="rank-column">
{
index <= 2
? <span className="rank-column__number" data-num={index}></span>
: <span>{index+1}</span>
}
</dd>
<dd className="rank-column">
<span className="rank-column__name">{item.user_name}</span>
</dd>
<dd className="rank-column">
<span>{item.num}</span>
</dd>
<dd className="rank-column">
{
item.url
? <a className="rank-column__txt" href={item.url}>{item.prize_name}</a>
: <span className="rank-column__txt">{item.prize_name}</span>
}
</dd>
</dl>
))
}
<div className="rank-more" onClick={this.switchMoreRank}>
<span className="rank-more__txt">{isMore? '展开' : '收起'}</span>
<i className="rank-more__icon" data-more={isMore}></i>
<>
{
rank.length !== 0 &&
<div data-skip="rank">
<div className="rank-title">
<i className="rank-title__decorate"></i>
<h2 className="rank-title__txt">宝箱达人榜</h2>
<i className="rank-title__decorate"></i>
</div>
<p className="rank-desc">宝箱数量前50名可额外获得一份奖品,数量相同的用时短者排名在前</p>
<dl className="rank-header">
<dd className="rank-column">排名</dd>
<dd className="rank-column">用户</dd>
<dd className="rank-column">宝箱数量</dd>
<dd className="rank-column">奖品</dd>
</dl>
<div className="rank-body">
{
rank.map((item, index) => (
<dl className="rank-item" key={index}>
<dd className="rank-column">
{
index <= 2
? <span className="rank-column__number" data-num={index}></span>
: <span>{index+1}</span>
}
</dd>
<dd className="rank-column">
<span className="rank-column__name">{item.user_name}</span>
</dd>
<dd className="rank-column">
<span>{item.num}</span>
</dd>
<dd className="rank-column">
{
item.url
? <a className="rank-column__txt" onClick={() => this.handleToVip(item.url)}>{item.prize_name}</a>
: <span className="rank-column__txt">{item.prize_name}</span>
}
</dd>
</dl>
))
}
<div className="rank-more" onClick={this.switchMoreRank}>
<span className="rank-more__txt">{isMore? '展开' : '收起'}</span>
<i className="rank-more__icon" data-more={isMore}></i>
</div>
</div>
</div>
</div>
</div>
}
</>
)
}
}
......
File mode changed from 100644 to 100755
......@@ -5,6 +5,7 @@ import { Toast } from 'antd-mobile';
import {withRouter} from 'react-router-dom';
import {compose} from "redux"
import { connect } from "react-redux";
import jsCookie from 'js-cookie'
class TeamInfo extends Component {
constructor(props) {
......@@ -36,7 +37,7 @@ class TeamInfo extends Component {
prize_info,
is_my_team,
info,
member: this.fillTeam(member),
member: this.fillTeam(member, is_my_team),
removable_data,
my_team
})
......@@ -64,9 +65,13 @@ class TeamInfo extends Component {
search = `?id=${current.id}`;
}
}
this.props.history.push(`/year/yearTreasure${search}`);
if (!getParam('version')) {
this.props.history.push(`/year/yearTreasure${search}`);
} else {
this.props.history.push(`/year/yearTreasure${search}?version=${getParam('version')}`);
}
}
}
// 去登录
......@@ -78,22 +83,42 @@ class TeamInfo extends Component {
}
}
shouldComponentUpdate(nextProps, nextState, nextContext) {
if (this.props.isAppUpdate !== nextProps.isAppUpdate) {
this.getTeamInfo();
return false
}
return true
}
// 邀请好友组队
createTeam = () => {
if(this.props.user.hasError) {
this.toLogin();
} else {
sessionStorage.setItem('showShareTip', '1')
const {is_my_team, my_team: {treasure_code}} = this.state;
if(is_my_team) { // 有自己的队伍
// 直接跳转
this.props.history.push('/activity/newyear-2019/landing?origin=1&treasure_code=' + treasure_code);
if (!getParam('version')) {
// this.props.history.push('/activity/newyear-2019/landing?origin=1&treasure_code=' + treasure_code);
window.location.assign('https://h5.julyedu.com/activity/newyear-2019/landing?origin=1&treasure_code=' + treasure_code);
} else {
window.location.assign('https://h5.julyedu.com/activity/newyear-2019/landing?origin=1&treasure_code=' + treasure_code + '&version='+ getParam('version'));
}
}else{ // 没自己的队伍
// 请求创建队伍的接口
http.get(`${API.home}/sys/treasure/createMyTeam`).then(res => {
const { code, data, msg } = res.data;
if (code === 200) {
const { treasure_code } = data;
this.props.history.push('/activity/newyear-2019/landing?origin=1&treasure_code=' + treasure_code);
if (!getParam('version')) {
window.location.assign('https://h5.julyedu.com/activity/newyear-2019/landing?origin=1&treasure_code=' + treasure_code);
} else {
window.location.assign('https://h5.julyedu.com/activity/newyear-2019/landing?origin=1&treasure_code=' + treasure_code + '&version='+ getParam('version'));
}
} else {
Toast.info(msg);
}
......@@ -103,15 +128,41 @@ class TeamInfo extends Component {
}
// 队伍成员信息必须满五个 不满的需要填充
fillTeam = (list) => {
fillTeam = (list, is_my_team) => {
let len = list.length;
for(let i=0;i<5-len;i++) {
list.push({
head_img: '',
user_name: '',
nobody: true,
})
// 没有创建队伍 并且没有加入他人队伍
if(this.props.user.hasError) {
for(let i=0;i<5-len;i++) {
list.push({
head_img: '',
user_name: '',
nobody: true,
})
}
} else {
if(len === 0 && !is_my_team) {
list.push({
head_img: jsCookie.get('avatar_file'),
user_name: jsCookie.get('user_name'),
})
for(let i=0;i<4;i++) {
list.push({
head_img: '',
user_name: '',
nobody: true,
})
}
}else{
for(let i=0;i<5-len;i++) {
list.push({
head_img: '',
user_name: '',
nobody: true,
})
}
}
}
return list;
}
......@@ -181,7 +232,7 @@ class TeamInfo extends Component {
}
</div>
{
stage_no > 0 && name && <p className='stage_prize'>{`第${stage_no}必中${name}`}</p>
stage_no > 0 && name && <p className='stage_prize'>{`第${stage_no}个宝箱必中${name}`}</p>
}
</div>
)
......
File mode changed from 100644 to 100755
......@@ -4,7 +4,11 @@ import {http, SendMessageToApp, getParam} from '@/utils'
import CommonContainer from './../common/commonContainer/index'
import CourseItem from '../../../blessingPreheat/courseItem/index'
import {withRouter} from "react-router-dom"
import { connect } from 'react-redux';
@connect(({user}) => ({
user
}))
class YarnWish extends Component {
state = {
list: [],
......@@ -14,6 +18,7 @@ class YarnWish extends Component {
componentDidMount() {
this.fetchCourse()
this.getStage()
document.title = `七月在线年终大回馈,人气好课免费学,精品课程1分抢!`
}
componentWillUpdate() {
......@@ -25,7 +30,6 @@ class YarnWish extends Component {
}
}
fetchCourse = () => {
http.get(`${API.home}/activity/wish_course`).then(res => {
const {code, data} = res.data
......@@ -38,6 +42,7 @@ class YarnWish extends Component {
}
})
}
getStage = () => {
http.get(`${API.home}/activity/stage`).then(res => {
const {code, data} = res.data
......@@ -59,106 +64,374 @@ class YarnWish extends Component {
}
}
render() {
const {list, activityStage} = this.state
toInviteFriends = (oid, params = {}) => {
const { history } = this.props
if (getParam('version')) {
let data = {
title: `【仅剩${params.number}个名额】我${params.price}元拼了《${params.course_title}》`,
desc: params.course_title,
link: `${API.m}/togroup?id=${oid}`,
imgUrl: params.image_name,
}
SendMessageToApp("toShare", data)
} else {
history.push(`/togroup?id=${oid}`);
}
}
toContinueBargain = (id, price, code, image) => {
const { history } = this.props;
if(getParam('version')) {
let data = {
title: '我发现一门好课,快来帮我砍价吧!',
desc: `我已经砍了${price}元,看看你能砍多少`,
link: `${API.m}/bargain-middle-page?id=${id}&bargaincode=${code}&is_originator=1`,
imgUrl: image,
}
SendMessageToApp("toShare", data)
}else {
history.push(`/bargain-middle-page?id=${id}&bargaincode=${code}&is_originator=1`);
}
}
toCart = (id) => {
const { history } = this.props;
http.post(`${API.home}/m/cart/add`, {
course_id: id
}).then((res) => {
const { code, msg } = res.data;
// code 15001 已加入购物车
if (code === 200 || code === 15001) {
if(getParam('version')) {
SendMessageToApp('toShoppingCart')
}else {
history.push('/shopcart');
}
} else if (code === 4030 || code === 4040) {
this.toLogin();
} else {
Toast.info(msg, 2);
}
})
}
// 砍完价去支付
bargainToOrder = (id) => {
console.log(this.props);
const { history, user } = this.props;
if(user.hasError) {
this.toLogin();
}else{
if(getParam('version')) {
SendMessageToApp('toPay', id)
}else {
http.get(`${API['base-api']}/m/cart/addtopreorder/[${id}]`).then((res) => {
const { errno, msg } = res.data;
if (errno === 0) {
history.push(`/order?id=[${id}]`, {bargain: 1});
} else {
Toast.info(msg, 2);
}
})
}
}
}
render() {
const { list, activityStage } = this.state
console.log(activityStage);
return (
<div className='year-wish'>
<div className="banner"><img
src="https://julyedu-cdn.oss-cn-beijing.aliyuncs.com/newyear20/H5/xy_banner_bj.png" alt=""/></div>
<div className="banner">
<img src="https://julyedu-cdn.oss-cn-beijing.aliyuncs.com/newyear20/H5/xy_banner_bj.png" alt=""/>
</div>
{
list.length > 0 ? <CommonContainer>
<div className='groupcourse course-box'>
{
list && list.length > 0 && list.map(item => (
<CourseItem image={item.image_name} key={item.course_id} id={item.course_id}
toCourse={this.toCourse}>
{
item.type == 4 && item.is_buy != 1 &&
<div className="group-num">限量300</div>
}
<div className="coupon-course__footer">
{
item.is_buy == 1 &&
<>
<p className={'course-title text-overflow-1'}>{item.course_title}</p>
<a onClick={() => this.toCourse(item.course_id)}
className="btn to-study">开始学习</a>
</>
}
{
item.is_buy == 0 &&
<>
<div className="type">
list.length > 0
? <>
{
activityStage === 2 &&
<>
<CommonContainer>
<div className='groupcourse course-box'>
{
list.map(item => (
<CourseItem
image={item.image_name}
key={item.course_id}
id={item.course_id}
time={item.type === 2 || item.type === 7? item.end_time : ''}
toCourse={this.toCourse}
>
{/*
* 拼团,正常:未开团1 已开2;一分:未开团5 已开7
* type 1 立即参团 2 已参团 3 我要砍价 4 已参加砍价 可以继续砍价 5 马上抢 6 开始学习 7 已参加一分钱拼团 8 砍价待支付
*/}
<div className="coupon-course__footer">
{
(item.type === 4 || item.type === 8) &&
<div className="bargain-price">已砍{item.already_bargain}</div>
}
{
item.type === 0 &&
<>
<div className="type">
<span className="tag" data-color="green">活动价</span>
</div>
<div className="price price-group">
<span className="price-label">¥</span>
<span className="new-price">{item.original_price}</span>
<span className="old-price">
<s>¥{item.original_price}</s>
</span>
</div>
</>
}
{
(item.type === 1 || item.type === 2) &&
<>
<div className="type">
<span className="tag" data-color="green">拼团价</span>
</div>
<div className="price price-group">
<span className="price-label">¥</span>
<span className="new-price">{item.pdd_price}</span>
<span className="old-price">
<s>¥{item.original_price}</s>
</span>
</div>
</>
}
{
(item.type === 5 || item.type === 7) &&
<>
<div className="type">
<span className="tag" data-color="green">拼团价</span>
</div>
<div className="price price-group">
<span className="price-label">¥</span>
<span className="new-price">0.01</span>
<span className="old-price">
<s>¥{item.original_price}</s>
</span>
</div>
</>
}
{
(item.type === 3 || item.type === 4 || item.type === 8) &&
<>
<div className="type">
<span className="tag" data-color="green">好友帮帮砍</span>
</div>
<div className="price price-group">
<span className="price-label">到手最低:¥</span>
<span className="new-price">{item.low_prize}</span>
<span className="old-price">
<s>¥{item.original_price}</s>
</span>
</div>
</>
}
{
item.type === 6 &&
<p className={'course-title text-overflow-1'}>
{item.course_title}
</p>
}
<div className="status" data-layout={item.type === 4? 'row' : ''}>
{
item.type == 0 &&
<>
<span className="tag">活动价</span>
<span className="time">12.23开始</span>
</>
item.type === 0 &&
<a
onClick={() => this.toCart(item.course_id)}
className="status-btn to-group"
>立即购买</a>
}
{
(item.type == 1 || item.type == 4) &&
<>
<span className="tag">拼团价</span>
<span className="time">12.23开团</span>
</>
item.type === 1 &&
<a
onClick={() => this.toCourse(item.course_id)}
className="status-btn to-group"
>立即参与拼团</a>
}
{
(item.type === 2 || item.type === 7) &&
<a
onClick={() => this.toInviteFriends(item.order_id, {
number: item.number,
course_title: item.course_title,
image_name: item.image_name,
price: item.type === 2? item.pdd_price : 0.01
})}
className="status-btn to-group"
data-status="done"
>已参团,邀请好友参团</a>
}
{
item.type === 3 &&
<a
onClick={() => this.toCourse(item.course_id)}
className="status-btn to-group"
>我要砍价</a>
}
{
item.type == 2 &&
item.type === 4 &&
<>
<span className="tag">好友帮帮砍</span>
<span className="time">12.23开砍</span>
<a
onClick={() => this.toContinueBargain(item.course_id, item.already_bargain, item.bargain_code, item.image_name)}
className="status-btn to-group"
>继续砍价</a>
<a
onClick={() => this.bargainToOrder(item.course_id)}
className="status-btn to-group"
>支付{item.actual_payment}</a>
</>
}
</div>
<div className="price">
{item.type == 2 ? '到手最低:¥' : '¥'}
<span
className="new-price">{item.type == 4 ? '0.01' : item.price2}</span>
<span className="old-price"> 现价:<s>¥{item.price1}</s></span>
</div>
<div className="status">
<a onClick={() => this.toCourse(item.course_id)}
className="status-btn to-buy">直接购买</a>
{
item.is_join == 1 &&
<a className="status-btn add-wish"><img
src="https://julyedu-cdn.oss-cn-beijing.aliyuncs.com/newyear20/PC/add-success.png"
alt=""/>已加心愿单</a>
item.type === 8 &&
<a
onClick={() => this.bargainToOrder(item.course_id)}
className="status-btn to-group"
>支付{item.actual_payment}</a>
}
{
item.is_join == 0 &&
item.type === 5 &&
<a
onClick={() => this.addWishList(item.course_id)}
className="status-btn add-wish-success">
<img
src="https://julyedu-cdn.oss-cn-beijing.aliyuncs.com/newyear20/H5/like_icon.png"
alt=""/>加入心愿单
</a>
onClick={() => this.toCourse(item.course_id)}
className="status-btn to-group"
>马上抢>></a>
}
{
item.type === 6 &&
<a
onClick={() => this.toCourse(item.course_id)}
className="btn to-group"
data-status="study"
>开始学习</a>
}
</div>
</>
}
</div>
</CourseItem>
))
}
</div>
</CommonContainer>
: <div className="notData">
</div>
</CourseItem>
))
}
</div>
</CommonContainer>
</>
}
{
activityStage !== 2 &&
<>
<CommonContainer>
<div className='groupcourse course-box'>
{
list.map(item => (
<CourseItem
image={item.image_name}
key={item.course_id}
id={item.course_id}
toCourse={this.toCourse}
>
{
item.type == 4 && item.is_buy != 1 &&
<div className="group-num">限量300</div>
}
<div className="coupon-course__footer">
{
item.is_buy == 1 &&
<>
<p className={'course-title text-overflow-1'}>{item.course_title}</p>
<a
onClick={() => this.toCourse(item.course_id)}
className="btn to-study"
>开始学习</a>
</>
}
{
item.is_buy == 0 &&
<>
<div className="type">
{
item.type == 0 &&
<>
<span className="tag">活动价</span>
<span className="time">12.23开始</span>
</>
}
{
(item.type == 1 || item.type == 4) &&
<>
<span className="tag">拼团价</span>
<span className="time">12.23开团</span>
</>
}
{
item.type == 2 &&
<>
<span className="tag">好友帮帮砍</span>
<span className="time">12.23开砍</span>
</>
}
</div>
<div className="price">
{item.type == 2 ? '到手最低:¥' : '¥'}
<span
className="new-price">{item.type == 4 ? '0.01' : item.price2}</span>
<span className="old-price">{item.type == 2 ? '' : '现价:'}<s>¥{item.price1}</s></span>
</div>
<div className="status">
<a
onClick={() => this.toCourse(item.course_id)}
className="status-btn to-buy"
>直接购买</a>
{
item.is_join == 1 &&
<a className="status-btn add-wish">
<img
src="https://julyedu-cdn.oss-cn-beijing.aliyuncs.com/newyear20/PC/add-success.png"
alt=""
/>
已加心愿单
</a>
}
{
item.is_join == 0 &&
<a
onClick={() => this.addWishList(item.course_id)}
className="status-btn add-wish-success"
>
<img
src="https://julyedu-cdn.oss-cn-beijing.aliyuncs.com/newyear20/H5/like_icon.png"
alt=""
/>
加入心愿单
</a>
}
</div>
</>
}
</div>
</CourseItem>
))
}
</div>
</CommonContainer>
</>
}
</>
: (
<div className="notData">
<img src="https://julyedu-cdn.oss-cn-beijing.aliyuncs.com/newyear20/PC/icon-empty.png" alt=""/>
{
activityStage == 1 ? <p>你的心愿单目前空空如也,<br/>快去挑选更多优惠课程吧~</p>
: <p>你的心愿单没有课程哦,<br/>感兴趣的课程可在双旦主会场直接购买!</p>
activityStage == 1
? <p>你的心愿单目前空空如也,<br/>快去挑选更多优惠课程吧~</p>
: <p>你的心愿单没有课程哦,<br/>感兴趣的课程可在双旦主会场直接购买!</p>
}
</div>
)
}
</div>
)
......
......@@ -18,7 +18,7 @@ html, body, #root {
flex-wrap: wrap;
.course-container {
width: 158px;
width: 168px;
margin: 15px 0 0 0;
text-align: center;
position: relative;
......@@ -39,6 +39,20 @@ html, body, #root {
text-align: center;
}
.bargain-price {
position: absolute;
left: 4px;
top: 10px;
margin: 0;
height: 18px;
padding: 0 8px;
border-radius: 0 9px 9px 0;
font-size: 12px;
color: #fff;
line-height: 18px;
background-color: #F01D0E;
}
.coupon-course__footer {
.course-title {
padding-left: 10px;
......@@ -148,31 +162,61 @@ html, body, #root {
transform: skewX(-20deg);
z-index: -1;
}
.tag[data-color="green"]:before {
background-color: #357345;
}
}
.price {
text-align: left;
padding-left: 5px;
margin-top: 3px;
padding-left: 4px;
font-size: 12;
color: #FF0002;
font-size: 12px;
text-align: left;
&.price-group {
font-size: 0;
height: 30px;
}
.price-label {
font-size: 12px;
}
.new-price {
font-size: 18px;
font-size: 16px;
}
.old-price {
margin-left: 2px;
font-size: 12px;
color: #666;
margin-left: 8px;
}
}
.status {
text-align: left;
padding-left: 5px;
position: absolute;
left: 0;
bottom: 10px;
right: 0;
padding: 0 5px;
text-align: left;
&[data-layout="row"] {
display: flex;
.to-group {
&:nth-child(1) {
margin-right: 2px;
}
&:nth-child(2) {
margin-left: 2px;
}
}
}
.status-btn {
display: inline-block;
......@@ -189,6 +233,30 @@ html, body, #root {
background-color: #FF8080;
}
.to-group {
display: block;
width: 100%;
height: 22px;
border-radius: 11px;
box-sizing: border-box;
font-size: 14px;
color: #fff;
text-align: center;
line-height: 22px;
background: linear-gradient(-90deg,rgba(235,22,18,1) 0%,rgba(255,0,2,1) 100%);
&[data-status="study"] {
background: #0099FF;
}
&[data-status="done"] {
border: 1px solid #090F08;
font-size: 12px;
color: #090F08;
background: #FEE41D;
}
}
}
}
......
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
......@@ -153,11 +153,15 @@ class BargainMiddlePage extends Component {
// 直接支付
toCart = () => {
http.get(`${API['base-api']}/m/cart/addtopreorder/[${getParam('id')}]`).then((res) => {
if (res.data.errno === 0) {
const { history } = this.props;
http.get(`${API['base-api']}/m/cart/addtopreorder/[${getParam('id')}]`).then((res) =>{
const { errno, msg } = res.data;
if (errno === 0) {
this.props.history.push(`/order?id=[${getParam('id')}]`, {bargain: 1});
}else if(errno === 4030 || errno === 4040) {
history.push('/passport');
} else {
Toast.info(res.data.msg, 2);
Toast.info(msg, 2);
}
})
// let data = {
......@@ -204,19 +208,23 @@ class BargainMiddlePage extends Component {
// 领取砍价神器
toArtifact = () => {
const { history } = this.props;
const { course: { course_id = '' } } = this.state;
let data = {
courseId: getParam('id')? getParam('id') : course_id
}
http.post(`${API.home}/m/bargain/receiveLimit`, data).then((res) => {
if (res.data.code === 200) {
const { code, msg } = res.data;
if (code === 200) {
this.setState({
isShowOverlay: true,
status: 5,
});
this.getBargainInfo();
}else if(code === 4030 || code === 4040) {
history.push('/passport');
} else {
Toast.info(res.data.msg, 2)
Toast.info(msg, 2)
}
})
}
......@@ -322,6 +330,8 @@ class BargainMiddlePage extends Component {
// 邀请好友砍价
shareFriendBargain = () => {
const { history } = this.props;
history.push(`/bargain-middle-page?id=${getParam('id')}&bargaincode=${getParam('bargaincode')}&is_originator=1`)
this.setState({
isShowOverlay: true,
status: 7,
......@@ -634,7 +644,7 @@ function CourseDes(props) {
<span className={'discount-price'}>{course.course_price}</span>
{/* is_originator 是否发起人 0-否 1-是 */}
{
(is_originator == 1 && bargain_status != 3) &&
(is_originator == 1 && bargain_status !=3) &&
<button className={'purchase-btn'} onClick={toCart}>
¥{course.pay_price}去支付
</button>
......
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
......@@ -2,11 +2,54 @@ import React, { Component } from 'react';
import './index.scss';
class CourseItem extends Component {
constructor(props) {
super(props);
this.state = {
countdown: ''
}
}
componentDidMount() {
const { time } = this.props;
this.startCountDown(time);
}
componentWillReceiveProps(nextProps) {
const { time: newTime } = nextProps
const { time: oldTime } = this.props;
if(oldTime != newTime) {
this.startCountDown(newTime);
}
}
startCountDown = (time) => {
if(time) {
let date = time * 1000,
hours = 0,
minutes = 0,
seconds = 0;
setInterval(() => {
date -= 1000
hours = `${parseInt(date / (60 * 60 * 1000))}`.padStart(2, 0);
minutes = `${parseInt((date - hours * 3600000) / 60000)}`.padStart(2, 0);
seconds = `${parseInt((date - hours * 3600000 - minutes * 60000) / 1000)}`.padStart(2, 0);
this.setState({
countdown: `${hours}${minutes}${seconds}秒后结束`
});
}, 1000);
}
}
render() {
const { image,toCourse,id} = this.props;
const { image, toCourse, id} = this.props;
const { countdown } = this.state;
return (
<div className="course-container">
<div className="course__cover">
{
countdown &&
<p className="course__time">{countdown}</p>
}
<img src={image} alt="cover" onClick={() => toCourse(id)}/>
</div>
{this.props.children}
......
......@@ -7,6 +7,7 @@
}
.course__cover {
position: relative;
height: 108px;
padding: 4px 4px 0;
overflow: hidden;
......@@ -17,4 +18,18 @@
width: 100%;
height: 100%;
}
}
.course__time {
position: absolute;
left: 4px;
top: 10px;
margin: 0;
height: 18px;
padding: 0 8px;
border-radius: 0 9px 9px 0;
font-size: 12px;
color: #fff;
line-height: 18px;
background-color: #F01D0E;
}
\ No newline at end of file
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
......@@ -68,7 +68,8 @@ class Coupon extends PureComponent {
id,
format_expire_time,
start_amount,
limit_amount
limit_amount,
limit_course
} = this.props
let top, bottom
......@@ -84,7 +85,7 @@ class Coupon extends PureComponent {
)
bottom = (
<>
<span className={'limit'}>可用于大于代金券金额的课程</span>
<span className={'limit'}>{limit_course == 0 ? '可用于大于代金券金额的课程': `仅适用于《${course_title}》`}</span>
{
showUseButton && ctype == this.VOUCHER &&
<button
......
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
......@@ -372,12 +372,7 @@
}
.artifact-box, .use-artifact-box {
padding: 20px 0;
background-color: $bg_fff;
border-radius: 3px;
text-align: center;
margin: 200px auto 20px auto;
position: relative;
.top-img {
position: absolute;
......
File mode changed from 100644 to 100755
import React, { Component, useState } from 'react'
import './bargain.scss'
import { Flex, Toast } from "antd-mobile"
import Overlay from '../overlay'
import BargainInfo from './bargainInfo'
import {differenceInSeconds, differenceInMinutes, differenceInHours, differenceInDays} from "date-fns"
import { api, getParam, http } from "@/utils"
import { getParam, http } from "@/utils"
import Ranking from "@/components/bargainMiddlePage/ranking"
import { compose } from "redux"
import { withRouter } from 'react-router-dom'
import {connect} from "react-redux";
import { Object } from 'core-js'
import { connect } from "react-redux";
import Mask from '@/common/Mask/index';
import BargainBindPhone from './../bindPhone/index';
import BargainConfirmBind from './../bindPhone/confirm';
class Bargain extends Component {
constructor(props) {
super(props)
this.state = {
isShowOverlay: false,
kanjiaIcon: require('./image/kanjia_icon.png'),
info: '',
outList: [],
list: [],
limitPeople: '',
status: '',
bargainCode: '',
time: '',
barInfo: {},
country: '86',
price: 0, // 每次砍价砍掉的价格
sum: 0 // 累计砍掉的价格
sum: 0, // 累计砍掉的价格,
bindInfo: {}, // 冲突信息
formInfo: {}
}
}
......@@ -39,18 +37,17 @@ class Bargain extends Component {
// 选择区号后进入
judgePopupTypeFromCountry = () => {
const { country, delCountryNum } = this.props;
if(country.from && country.from === 'bargain') {
this.setState({
country: country.num,
isShowOverlay: true,
status: 3,
});
// 清除
delCountryNum();
const { country, delCountryNum } = this.props;
if(country.from && country.from === 'bargain') {
this.setState({
country: country.num,
status: 3,
});
// 清除
delCountryNum();
}
}
}
// 获取助理好友
getBargainRankList = (params = {}) => {
......@@ -66,7 +63,6 @@ class Bargain extends Component {
})
}
//获取砍价信息
getBargainInfo = (isFetch = true) => {
let data = {
......@@ -77,9 +73,6 @@ class Bargain extends Component {
if (code === 200) {
this.setState({
barInfo: data,
// info: res.data.data,
// limitPeople: res.data.data.limit_people,
// bargainCode: res.data.data.bargain_code
});
if(isFetch) {
// 砍价状态 0-砍价中,1砍价结束,待支付,2砍价过期(没有砍价记录没有砍价信息),3已购买
......@@ -116,7 +109,6 @@ class Bargain extends Component {
http.post(`${API.home}/m/bargain/receiveLimit`, data).then((res) => {
if (res.data.code === 200) {
this.setState({
isShowOverlay: true,
status: 1
});
this.getBargainInfo(false);
......@@ -144,11 +136,13 @@ class Bargain extends Component {
}
})
}
// 继续砍价
continueBargain = () => {
const { history } = this.props;
const { barInfo = {} } = this.state;
const code = barInfo.bargain_code;
this.props.history.push(`/bargain-middle-page?id=${getParam('id')}&bargaincode=${code}&is_originator=1`)
history.push(`/bargain-middle-page?id=${getParam('id')}&bargaincode=${code}&is_originator=1`)
}
// 我要砍价
......@@ -177,13 +171,11 @@ class Bargain extends Component {
// user_status 用户状态 1-关注公众号,2-绑定手机号 3-再砍一刀 (是发起人没有这个字段)
if(data.user_status === 2) {
this.setState({
isShowOverlay: true,
status: 3,
});
}else {
if(type === 2) {
this.setState({
isShowOverlay: true,
status: 2,
price: data.amount,
sum: data.bargain_price
......@@ -197,40 +189,41 @@ class Bargain extends Component {
history.push(`/bargain-middle-page?id=${getParam('id')}&bargaincode=${data.bargain_code}&is_originator=1`)
}
}
// if (type === 2) {
// this.setState({
// isShowOverlay: true,
// status: 2,
// })
// } else {
// // user_status 用户状态 1-关注公众号,2-绑定手机号 3-再砍一刀 (是发起人没有这个字段)
// if (data.user_status === 2) {
// this.setState({
// isShowOverlay: true,
// status: 3,
// })
// } else {
// history.push(`/bargain-middle-page?id=${getParam('id')}&bargaincode=${data.bargain_code}&is_originator=1`)
// }
// }
} else {
Toast.info(res.data.msg, 2)
}
})
}
// 关闭弹窗
close = () => {
handleToHide = () => {
this.setState({
isShowOverlay: false,
status: '',
})
status: ''
});
}
// 绑定手机号--确认
confirmBindPhone = (params, bindInfo) => {
this.setState({
status: 4,
formInfo: params,
bindInfo
});
}
render() {
const { list, outList, barInfo, country, price, sum } = this.state;
const {user} = this.props
const {
list,
outList,
barInfo,
country,
price,
sum,
status,
formInfo,
bindInfo
} = this.state;
const { user } = this.props
const uid = user && user.data && user.data.uid
return (
<div className={'bargain-func'}>
......@@ -238,7 +231,10 @@ class Bargain extends Component {
{/*bargain_status 砍价状态 0-砍价中,1砍价结束,待支付,2砍价过期(没有砍价记录没有砍价信息),3已购买*/}
{
(barInfo.bargain_status === 2 || (getParam('id') === '139' && barInfo.bargain_status === 3) || !uid) &&
<BargainIntro limitPeople={barInfo.limit_people} iWantBargain={this.iWantBargain}/>
<BargainIntro
limitPeople={barInfo.limit_people}
iWantBargain={this.iWantBargain}
/>
}
{
(barInfo.bargain_status === 0 || barInfo.bargain_status === 1) && uid &&
......@@ -252,43 +248,39 @@ class Bargain extends Component {
/>
}
{/* 绑定手机号 */}
<Mask visible={status === 3} handleToHide={this.handleToHide}>
<BargainBindPhone
country={country}
handleToBargain={this.iWantBargain}
confirmBindPhone={this.confirmBindPhone}
/>
</Mask>
{/* 绑定手机号--确认 */}
<Mask visible={status === 4} handleToHide={this.handleToHide}>
<BargainConfirmBind
data={formInfo}
bindInfo={bindInfo}
handleToBargain={this.iWantBargain}
/>
</Mask>
{/* 领取砍价神器 */}
<Mask visible={status === 1} handleToHide={this.handleToHide}>
<Artifact useArtifact={this.useArtifact} />
</Mask>
{/* 使用砍价神器 */}
<Mask visible={status === 2} handleToHide={this.handleToHide}>
<UseArtifact
price={price}
sum={sum}
toCart={this.toCart}
/>
</Mask>
{
this.state.isShowOverlay &&
<Overlay>
{/*绑定手机号*/}
{
this.state.status === 3 &&
<BargainInfo country={country} iWantBargain={this.iWantBargain} toClose={this.close} />
}
{/*领取砍价神器*/}
{
this.state.status === 1 &&
<Artifact useArtifact={this.useArtifact}/>
}
{/*使用砍价神器*/}
{
this.state.status === 2 &&
<UseArtifact
price={price}
sum={sum}
toCart={this.toCart}
/>
}
{
this.state.status !== 0 &&
<i onClick={this.close} className={'iconfont iconiconfront-2 bargain-close'}></i>
}
</Overlay>
}
{/*更多好友砍价*/}
{/* 更多好友砍价 */}
<Ranking
list={list}
icon={this.state.kanjiaIcon}
......@@ -296,17 +288,21 @@ class Bargain extends Component {
isShowMore={this.state.isShowMore}
boxHide={this.boxHide}
/>
</div>
)
}
}
// 是砍价课程时,展示砍价按钮
function BargainIntro(props) {
return (
<div className="intro-outer">
<div className="intro-inner">
<Flex direction={'column'} justify={'center'} className={'intro-wrapper'}>
<Flex
direction={'column'}
justify={'center'}
className={'intro-wrapper'}
>
<p>
邀请
<span className={'indicator'}>{props.limitPeople}</span>
......@@ -428,10 +424,7 @@ function BargainStatus(props) {
)
}
{/*领取砍价神器*/
}
// 领取砍价神器
function Artifact(props) {
return (
<div className='artifact-box'>
......@@ -446,26 +439,28 @@ function Artifact(props) {
)
}
// 使用砍价神器
function UseArtifact(props) {
const { sum, price } = props;
return (
<div className='use-artifact-box'>
<img className='top-img' src={require('./image/kanjia_cg_icon.png')} alt=""/>
<img
className='top-img'
src={require('./image/kanjia_cg_icon.png')}
alt=""
/>
<p className='top-tip'>厉害了,又砍掉了{price}元!</p>
<p className='middle-tip'>
你已经砍了
<span className={'indicator'}>{sum}</span>
没见过你这么能砍的人...
</p>
<p className='btm-tip'>
不能再砍了哦~
</p>
<p className='btm-tip'>不能再砍了哦~</p>
<button className='tubuy' onClick={props.toCart}>去支付</button>
</div>
)
}
export default compose(
connect(
state => ({
......
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
import React, { Component } from 'react';
import { Toast } from 'antd-mobile';
import { http } from '@/utils';
import './confirm.scss';
class BargainConfirmBind extends Component {
farmatKey = (key) => {
let data = null;
switch (key) {
case 1:
data = {
key: 'email',
type: 'email'
};
break;
case 2:
data = {
key: 'wechat_nickname',
type: 'wechat'
};
break;
case 3:
data = {
key: 'qq_nickname',
type: 'qq'
};
break;
case 4:
data = {
key: 'sina_nickname',
type: 'sina'
};
break;
default:
data = null;
break;
}
return data;
}
confirmBindPhone = () => {
const { data, handleToBargain } = this.props;
// is_valid 是否验证 1:验证(默认),0不验证
http.post(
`${API['passport-api']}/m/personal/bindPhone`,
{
...data,
type: 1,
is_valid: 0
}
).then(res => {
const { errno, msg } = res.data;
if(errno === 200) {
handleToBargain();
}else {
Toast.info(msg);
}
});
}
render() {
const { bindInfo, handleToHide } = this.props;
return (
<div className="bargain-bind-confirm">
<h4 className="bargain-bind-confirm__title">绑定确认</h4>
<p className="bargain-bind-confirm__desc">该手机号已绑定到以下账号,继续绑定将解除以下绑定状态</p>
<ul className="bargain-bind-confirm__list">
{
bindInfo && [1,2,3,4].map(item => {
const data = this.farmatKey(item);
if(bindInfo[data.key]) {
return (
<li className="bargain-bind-confirm__account" key={item}>
<i className="bargain-bind-confirm__icon" data-plat={data.type}></i>
<p className="bargain-bind-confirm__name">{bindInfo[data.key]}</p>
</li>
);
}
return null;
})
}
</ul>
<div className="bargain-bind-confirm__footer">
<button
className="bargain-bind-confirm__button"
data-type="cancle"
onClick={handleToHide}
>取消</button>
<button
className="bargain-bind-confirm__button"
data-type="confirm"
onClick={this.confirmBindPhone}
>继续绑定</button>
</div>
</div>
)
}
}
export default BargainConfirmBind;
\ No newline at end of file
.bargain-bind-confirm {
width: 290px;
padding-top: 10px;
padding-bottom: 8px;
}
.bargain-bind-confirm__title {
margin: 0 0 12px;
font-size: 15px;
color: #333;
text-align: center;
line-height: 1;
}
.bargain-bind-confirm__desc {
margin: 0;
padding: 0 20px;
font-size: 12px;
color: #666;
}
.bargain-bind-confirm__list {
padding: 0 0 10px;
}
.bargain-bind-confirm__account {
display: flex;
align-items: center;
height: 30px;
margin: 0 52px;
padding: 0 4px;
text-align: left;
&:nth-child(n+2) {
border-top: 1px solid #E5E5E5;
}
}
.bargain-bind-confirm__icon {
display: inline-block;
width: 22px;
height: 22px;
background-size: 100% auto;
background-repeat: no-repeat;
background-position: center;
&[data-plat="email"] {
background-image: url('https://julyedu-cdn.oss-cn-beijing.aliyuncs.com/newyear20/H5/icon-mail.png');
}
&[data-plat="sina"] {
background-image: url('https://julyedu-cdn.oss-cn-beijing.aliyuncs.com/newyear20/H5/icon-sina.png');
}
&[data-plat="qq"] {
background-image: url('https://julyedu-cdn.oss-cn-beijing.aliyuncs.com/newyear20/H5/icon-qq.png');
}
&[data-plat="wechat"] {
background-image: url('https://julyedu-cdn.oss-cn-beijing.aliyuncs.com/newyear20/H5/icon-wechat.png');
}
}
.bargain-bind-confirm__name {
margin: 0;
padding-left: 7px;
font-size: 12px;
color: #999;
}
.bargain-bind-confirm__footer {
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 28px;
}
.bargain-bind-confirm__button {
width: 105px;
height: 30px;
box-sizing: border-box;
border-radius: 15px;
font-size: 14px;
cursor: pointer;
outline: none;
&[data-type="cancle"] {
border: 1px solid #0099FF;
color: #0099FF;
background-color: transparent;
}
&[data-type="confirm"] {
border-style: none;
color: #fff;
background-color: #0099FF;
}
}
\ No newline at end of file
import React, { Component } from 'react';
import classnames from 'classnames';
import { Link } from 'react-router-dom';
import { Formik, Form, Field } from 'formik';
import { Toast } from 'antd-mobile';
import { http, getParam } from '@/utils';
import './index.scss';
class BargainBindPhone extends Component {
constructor(props) {
super(props);
this.state = {
mobile: '',
code: '',
num: '86',
seconds: 60,
isTimer: false, // 是否开始倒计时
};
}
// 获取短信验证码
handleToSendCode = ({ mobile }) => {
const { country: { num = 86 } } = this.props;
let { isTimer, seconds } = this.state;
if(!isTimer) {
if(!/^\d+$/.test(mobile)){
Toast.info('请输入正确的手机号');
return;
}
// 获取验证码
http.post(
`${API['passport-api']}/m/personal/bindPhoneSendCode`,
{
area_code: `00${num}`,
phone_num: mobile
}
).then(res => {
const { errno, msg } = res.data;
if(errno === 200) {
Toast.info('验证码发送成功', 2, null, false);
// 倒计时
this.timer = window.setInterval(() => {
if (seconds <= 0) {
window.clearInterval(this.timer);
this.setState({
isTimer: false,
seconds: 60
});
}else {
this.setState({
isTimer: true,
seconds: --seconds
});
}
}, 1000);
}else {
Toast.info(msg);
}
});
}
}
// 绑定手机号
handleToBindPhone = ({code, mobile}) => {
const { country: { num = 86}, handleToBargain, confirmBindPhone } = this.props;
if (!mobile) {
Toast.info('请填手机号码');
return;
}
if (!code) {
Toast.info('请填写验证码');
return;
}
const params = {
area_code: `00${num}`,
phone_num: mobile,
code: code,
};
// is_valid 是否验证 1:验证(默认),0不验证
http.post(
`${API['passport-api']}/m/personal/bindPhone`,
{
...params,
type: 1,
is_valid: 1
}
).then(res => {
const { errno, data, msg } = res.data;
if(errno === 200) {
if(data.tip_info) {
confirmBindPhone(params, data.tip_info);
}else {
handleToBargain();
}
}else {
Toast.info(msg);
}
});
}
render() {
const { country: { num = '86' } } = this.props;
const { isTimer, seconds } = this.state;
return (
<Formik
initialValues={{
mobile: '',
code: ''
}}
validate={({mobile, code}) => {
const errors = {};
if(!/^\d+$/.test(mobile)) {
errors.mobile = '请填写正确格式的手机号';
}
if (!/[0-9]{6}/.test(code)) {
errors.code = '请输入验证码';
}
return errors;
}}
onSubmit={(values, { setStatus, setSubmitting }) => {
this.handleToBindPhone(values);
}}
render={({values: {mobile, code}, errors}) => (
<Form className="bargain-bind-phone">
<h2 className="bargain-bind-phone__title">绑定手机,先砍一刀</h2>
<div className="bargain-bind-phone__item">
<Link
className="bargain-bind-phone__button--num"
to={`/country?id=${getParam('id')}&from=bargain`}
>
+{num}
<i className="iconfont iconiconfront-69"></i>
</Link>
<Field
name="mobile"
render={({field}) => (
<input
{...field}
className="bargain-bind-phone__ipt"
type="tel"
placeholder='手机号'
maxLength={11}
/>
)}
/>
</div>
<div className="bargain-bind-phone__item">
<Field
name="code"
render={({field}) => (
<input
{...field}
type="tel"
placeholder='验证码'
maxLength={6}
/>
)}
/>
{errors.mobile}
<button
type="button"
className={classnames(
'bargain-bind-phone__button--send',
{
'active': mobile && errors.mobile === undefined
}
)}
disabled={!(mobile && errors.mobile === undefined)}
onClick={() => this.handleToSendCode({mobile})}
>
{isTimer? `重新发送${seconds}s` : '发送验证码'}
</button>
</div>
<button
type="submit"
className="bargain-bind-phone__button--bargain"
disabled={!(mobile && code && JSON.stringify(errors) === '{}')}
>先砍一刀</button>
</Form>
)}
/>
)
}
}
export default BargainBindPhone;
\ No newline at end of file
.bargain-bind-phone {
padding: 10px 20px;
}
.bargain-bind-phone__title {
margin: 0 0 12px;
font-size: 15px;
color: #333;
font-weight: normal;
text-align: center;
line-height: 1;
}
.bargain-bind-phone__item {
display: flex;
align-items: center;
width: 100%;
height: 30px;
margin-top: 15px;
border: 1px solid #ddd;
box-sizing: border-box;
input {
width: 100%;
padding-left: 10px;
border-style: none;
outline: 0;
-webkit-appearance: none;
&::-webkit-input-placeholder {
color: $color_999;
}
&.bargain-bind-phone__ipt {
border-left: 1px solid #ddd;
}
}
}
.bargain-bind-phone__button--num {
display: inline-flex;
align-items: center;
padding: 0 5px;
color: $color_999;
}
.bargain-bind-phone__button--send {
width: 136px;
border-style: none;
font-size: 13px;
color: $active;
text-align: right;
background-color: transparent;
cursor: pointer;
outline: none;
&:disabled {
color: $color_999;
}
}
.bargain-bind-phone__button--bargain {
display: block;
width: 100%;
height: 30px;
margin-top: 20px;
border-style: none;
font-size: 15px;
color: #FF4000;
line-height: 30px;
text-align: center;
background-color: #FADD29;
outline: none;
-webkit-appearance: none;
&:disabled {
color: $white;
background-color: $bg_999;
}
}
\ No newline at end of file
......@@ -6,7 +6,9 @@ import { getCourses } from "@/components/detail/actions"
import { connect } from "react-redux"
import './index.scss'
import Overlay from '../overlay'
import BindPhone from './../bindPhone/index';
import BargainConfirmBind from './../bindPhone/confirm';
import Mask from '@/common/Mask/index';
class BtnStatus extends Component {
constructor(props) {
......@@ -17,9 +19,12 @@ class BtnStatus extends Component {
group_status: 3,
in_cart: false,
countdown: 0,
barInfo: {}
barInfo: {},
bindPhone: false,
bindConfrm: false,
bindInfo: {}, // 冲突信息
formInfo: {},
}
}
componentDidMount() {
......@@ -77,6 +82,7 @@ class BtnStatus extends Component {
// }
// })
// };
// 返现课程的立即购买
signUpNow = () => {
if(this.props.user.hasError) {
......@@ -93,6 +99,7 @@ class BtnStatus extends Component {
})
}
};
// 普通课程的立即报名 要模拟结算过程
simpleCourse = () => {
if(this.props.user.hasError) {
......@@ -108,11 +115,13 @@ class BtnStatus extends Component {
})
}
};
// 格式化开课时间
formatDate = (date) => {
let ary = date.split('-');
return `${ary[1]}${ary[2]}日开课`;
};
// 直接购买
tobuy = () => {
const {user} = this.props;
......@@ -134,6 +143,7 @@ class BtnStatus extends Component {
}
}
};
// 一键开团
keyToGroup = () => {
if(this.props.user.hasError) {
......@@ -143,6 +153,7 @@ class BtnStatus extends Component {
}
this.props.history.push(`/order?id=${getParam('id')}`, {group: 1})
};
// 砍完价去支付
bargainToOrder = () => {
if(this.props.user.hasError) {
......@@ -184,6 +195,7 @@ class BtnStatus extends Component {
}
})
}
close = () => {
this.setState({
isShowOverlay: false,
......@@ -206,7 +218,14 @@ class BtnStatus extends Component {
http.post(`${API.home}/m/bargain/toBargain`, data).then((res) => {
const {data, code, msg} = res.data;
if (code === 200) {
history.push(`/bargain-middle-page?id=${course_id}&bargaincode=${data.bargain_code}&is_originator=1`)
// user_status 用户状态 1-关注公众号,2-绑定手机号 3-再砍一刀 (是发起人没有这个字段)
if(data.user_status === 2) {
this.setState({
bindPhone: true
})
}else {
history.push(`/bargain-middle-page?id=${course_id}&bargaincode=${data.bargain_code}&is_originator=1`)
}
} else {
Toast.info(msg, 2)
}
......@@ -224,7 +243,6 @@ class BtnStatus extends Component {
}
}
//获取砍价信息
getBargainInfo = () => {
const {user} = this.props
......@@ -278,13 +296,58 @@ class BtnStatus extends Component {
}
}
// 隐藏弹窗
handleToHide = (key) => {
console.log(key);
this.setState({
[key]: false
});
}
// 绑定手机号 -- 确认
confirmBindPhone = (params, bindInfo) => {
this.setState({
bindPhone: false,
bindConfrm: true,
formInfo: params,
bindInfo
});
}
render() {
// data 课程信息;barInfo 砍价信息
const { user = {}, toCart } = this.props;
const { countdown ,barInfo, courseInfo: info = {}} = this.state;
const { user = {}, toCart, country } = this.props;
const {
countdown,
barInfo,
courseInfo: info = {},
bindPhone,
bindConfrm,
bindInfo,
formInfo,
} = this.state;
const uid = user.data && user.data.uid;
return (
<div>
{/* 绑定手机号 */}
<Mask visible={bindPhone} handleToHide={() => this.handleToHide('bindPhone')}>
<BindPhone
country={country}
handleToBargain={this.toKanjia}
confirmBindPhone={this.confirmBindPhone}
/>
</Mask>
{/* 绑定手机号--确认 */}
<Mask visible={bindConfrm} handleToHide={() => this.handleToHide('bindConfrm')}>
<BargainConfirmBind
data={formInfo}
bindInfo={bindInfo}
handleToHide={() => this.handleToHide('bindConfrm')}
handleToBargain={this.toKanjia}
/>
</Mask>
{/*正常购买*/}
{
info.is_baoming === 0 && info.group_status !== 3 &&
......@@ -320,8 +383,6 @@ class BtnStatus extends Component {
</div>
}
{/*已购买*/}
{
info.is_baoming === 1 &&
......
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
......@@ -451,7 +451,6 @@ class Detail extends Component {
this.fetchCourseInfo();
} else {
history.replace('/shopcart');
ß
}
} else if (res.data.code === 15001) {
history.replace('/shopcart');
......@@ -490,7 +489,6 @@ class Detail extends Component {
singleType: 1
})
this.props.history.push(`/detail?id=${getParam('id')}`);
}
render() {
......@@ -740,6 +738,7 @@ class Detail extends Component {
{
course_info &&
<BtnStatus
country={this.props.country}
countdown={countdown}
data={course_info}
user={this.props.user}
......
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment