gdy96 4 năm trước cách đây
mục cha
commit
5b02434e98
43 tập tin đã thay đổi với 2569 bổ sung614 xóa
  1. 38 114
      package-lock.json
  2. 7 4
      package.json
  3. 24 18
      sign/debug/certificate.pem
  4. 26 26
      sign/debug/private.pem
  5. 2 1
      src/api/config.js
  6. 55 13
      src/api/fly.js
  7. 40 0
      src/api/index.js
  8. 43 22
      src/api/utils.js
  9. 20 1
      src/app.ux
  10. BIN
      src/assets/imgs/black_back.png
  11. BIN
      src/assets/imgs/delete.png
  12. BIN
      src/assets/imgs/moo.png
  13. BIN
      src/assets/imgs/question.png
  14. BIN
      src/assets/imgs/rukou.png
  15. BIN
      src/assets/imgs/sun.png
  16. BIN
      src/assets/imgs/task.png
  17. BIN
      src/assets/imgs/task_gift.png
  18. BIN
      src/assets/imgs/white_back.png
  19. 5 2
      src/assets/less/detail.less
  20. 3 1
      src/assets/less/my.less
  21. 3 0
      src/assets/less/phone.less
  22. 120 4
      src/assets/less/reader.less
  23. 115 0
      src/assets/less/serach.less
  24. 234 0
      src/assets/less/task.less
  25. 42 14
      src/components/short/index.ux
  26. 7 7
      src/helper/index.js
  27. 130 17
      src/helper/interface.js
  28. 45 5
      src/manifest.json
  29. 1 1
      src/views/About/index.ux
  30. 146 0
      src/views/Agreement/index.ux
  31. 36 0
      src/views/Continue/index.ux
  32. 10 4
      src/views/Detail/index.ux
  33. 2 3
      src/views/Home/index.ux
  34. 51 7
      src/views/Index/index.ux
  35. 0 1
      src/views/Leaderboard/index.ux
  36. 84 11
      src/views/My/index.ux
  37. 287 221
      src/views/Pay/index.ux
  38. 115 88
      src/views/Phone/index.ux
  39. 275 0
      src/views/Privacy/index.ux
  40. 200 29
      src/views/Reader/index.ux
  41. 170 0
      src/views/Search/index.ux
  42. 233 0
      src/views/Task/index.ux
  43. BIN
      zhuishuyun_quickapp_front.rar

+ 38 - 114
package-lock.json

@@ -1284,7 +1284,6 @@
       "version": "6.10.2",
       "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz",
       "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==",
-      "dev": true,
       "requires": {
         "fast-deep-equal": "^2.0.1",
         "fast-json-stable-stringify": "^2.0.0",
@@ -1408,8 +1407,6 @@
       "version": "0.2.4",
       "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
       "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
-      "dev": true,
-      "optional": true,
       "requires": {
         "safer-buffer": "~2.1.0"
       }
@@ -1455,9 +1452,7 @@
     "assert-plus": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
-      "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
-      "dev": true,
-      "optional": true
+      "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
     },
     "assign-symbols": {
       "version": "1.0.0",
@@ -1495,9 +1490,7 @@
     "asynckit": {
       "version": "0.4.0",
       "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
-      "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
-      "dev": true,
-      "optional": true
+      "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
     },
     "atob": {
       "version": "2.1.2",
@@ -1508,16 +1501,12 @@
     "aws-sign2": {
       "version": "0.7.0",
       "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
-      "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
-      "dev": true,
-      "optional": true
+      "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
     },
     "aws4": {
       "version": "1.8.0",
       "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
-      "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==",
-      "dev": true,
-      "optional": true
+      "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ=="
     },
     "babel-eslint": {
       "version": "10.0.3",
@@ -1643,8 +1632,6 @@
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
       "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
-      "dev": true,
-      "optional": true,
       "requires": {
         "tweetnacl": "^0.14.3"
       }
@@ -1927,9 +1914,7 @@
     "caseless": {
       "version": "0.12.0",
       "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
-      "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
-      "dev": true,
-      "optional": true
+      "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
     },
     "chalk": {
       "version": "2.4.2",
@@ -2177,8 +2162,6 @@
       "version": "1.0.8",
       "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
       "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
-      "dev": true,
-      "optional": true,
       "requires": {
         "delayed-stream": "~1.0.0"
       }
@@ -2389,8 +2372,7 @@
     "core-util-is": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
-      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
-      "dev": true
+      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
     },
     "create-ecdh": {
       "version": "4.0.3",
@@ -2528,8 +2510,6 @@
       "version": "1.14.1",
       "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
       "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
-      "dev": true,
-      "optional": true,
       "requires": {
         "assert-plus": "^1.0.0"
       }
@@ -2620,9 +2600,7 @@
     "delayed-stream": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
-      "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
-      "dev": true,
-      "optional": true
+      "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
     },
     "delegates": {
       "version": "1.0.0",
@@ -2775,8 +2753,6 @@
       "version": "0.1.2",
       "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
       "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
-      "dev": true,
-      "optional": true,
       "requires": {
         "jsbn": "~0.1.0",
         "safer-buffer": "^2.1.0"
@@ -3208,9 +3184,7 @@
     "extend": {
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
-      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
-      "dev": true,
-      "optional": true
+      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
     },
     "extend-shallow": {
       "version": "3.0.2",
@@ -3312,21 +3286,17 @@
     "extsprintf": {
       "version": "1.3.0",
       "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
-      "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
-      "dev": true,
-      "optional": true
+      "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
     },
     "fast-deep-equal": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
-      "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
-      "dev": true
+      "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk="
     },
     "fast-json-stable-stringify": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
-      "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
-      "dev": true
+      "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I="
     },
     "fast-levenshtein": {
       "version": "2.0.6",
@@ -3460,6 +3430,14 @@
         }
       }
     },
+    "flyio": {
+      "version": "0.6.14",
+      "resolved": "https://registry.npmjs.org/flyio/-/flyio-0.6.14.tgz",
+      "integrity": "sha512-RE2OXE1ZZmcXOKb0jCtGyquHDxpAqHg17CZ8lmQKRfl3x1kP+NBpaQDx4WgN7DNpLJjFnspTzTEQpwRGg6/xaA==",
+      "requires": {
+        "request": "^2.85.0"
+      }
+    },
     "for-in": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
@@ -3469,16 +3447,12 @@
     "forever-agent": {
       "version": "0.6.1",
       "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
-      "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
-      "dev": true,
-      "optional": true
+      "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
     },
     "form-data": {
       "version": "2.3.3",
       "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
       "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
-      "dev": true,
-      "optional": true,
       "requires": {
         "asynckit": "^0.4.0",
         "combined-stream": "^1.0.6",
@@ -4179,8 +4153,6 @@
       "version": "0.1.7",
       "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
       "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
-      "dev": true,
-      "optional": true,
       "requires": {
         "assert-plus": "^1.0.0"
       }
@@ -4265,16 +4237,12 @@
     "har-schema": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
-      "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
-      "dev": true,
-      "optional": true
+      "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
     },
     "har-validator": {
       "version": "5.1.3",
       "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
       "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
-      "dev": true,
-      "optional": true,
       "requires": {
         "ajv": "^6.5.5",
         "har-schema": "^2.0.0"
@@ -4431,8 +4399,6 @@
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
       "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
-      "dev": true,
-      "optional": true,
       "requires": {
         "assert-plus": "^1.0.0",
         "jsprim": "^1.2.2",
@@ -4754,9 +4720,7 @@
     "is-typedarray": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
-      "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
-      "dev": true,
-      "optional": true
+      "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
     },
     "is-windows": {
       "version": "1.0.2",
@@ -4791,9 +4755,7 @@
     "isstream": {
       "version": "0.1.2",
       "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
-      "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
-      "dev": true,
-      "optional": true
+      "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
     },
     "js-levenshtein": {
       "version": "1.1.6",
@@ -4820,9 +4782,7 @@
     "jsbn": {
       "version": "0.1.1",
       "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
-      "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
-      "dev": true,
-      "optional": true
+      "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
     },
     "jsesc": {
       "version": "2.5.2",
@@ -4839,15 +4799,12 @@
     "json-schema": {
       "version": "0.2.3",
       "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
-      "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
-      "dev": true,
-      "optional": true
+      "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
     },
     "json-schema-traverse": {
       "version": "0.4.1",
       "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
-      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
-      "dev": true
+      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
     },
     "json-stable-stringify-without-jsonify": {
       "version": "1.0.1",
@@ -4858,9 +4815,7 @@
     "json-stringify-safe": {
       "version": "5.0.1",
       "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
-      "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
-      "dev": true,
-      "optional": true
+      "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
     },
     "json5": {
       "version": "2.1.1",
@@ -4892,8 +4847,6 @@
       "version": "1.4.1",
       "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
       "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
-      "dev": true,
-      "optional": true,
       "requires": {
         "assert-plus": "1.0.0",
         "extsprintf": "1.3.0",
@@ -5436,14 +5389,12 @@
     "mime-db": {
       "version": "1.40.0",
       "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz",
-      "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==",
-      "dev": true
+      "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA=="
     },
     "mime-types": {
       "version": "2.1.24",
       "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz",
       "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==",
-      "dev": true,
       "requires": {
         "mime-db": "1.40.0"
       }
@@ -5730,9 +5681,7 @@
     "oauth-sign": {
       "version": "0.9.0",
       "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
-      "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
-      "dev": true,
-      "optional": true
+      "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
     },
     "object-assign": {
       "version": "4.1.1",
@@ -6091,9 +6040,7 @@
     "performance-now": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
-      "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
-      "dev": true,
-      "optional": true
+      "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
     },
     "picomatch": {
       "version": "2.0.7",
@@ -6305,9 +6252,7 @@
     "psl": {
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/psl/-/psl-1.4.0.tgz",
-      "integrity": "sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw==",
-      "dev": true,
-      "optional": true
+      "integrity": "sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw=="
     },
     "public-encrypt": {
       "version": "4.0.3",
@@ -6359,8 +6304,7 @@
     "punycode": {
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
-      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
-      "dev": true
+      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
     },
     "qr-image": {
       "version": "3.2.0",
@@ -6377,8 +6321,7 @@
     "qs": {
       "version": "6.5.2",
       "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
-      "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
-      "dev": true
+      "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
     },
     "querystring": {
       "version": "0.2.0",
@@ -6591,8 +6534,6 @@
       "version": "2.88.0",
       "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
       "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
-      "dev": true,
-      "optional": true,
       "requires": {
         "aws-sign2": "~0.7.0",
         "aws4": "^1.8.0",
@@ -6744,8 +6685,7 @@
     "safe-buffer": {
       "version": "5.2.0",
       "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
-      "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==",
-      "dev": true
+      "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg=="
     },
     "safe-regex": {
       "version": "1.1.0",
@@ -6759,8 +6699,7 @@
     "safer-buffer": {
       "version": "2.1.2",
       "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
-      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
-      "dev": true
+      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
     },
     "schema-utils": {
       "version": "1.0.0",
@@ -7178,8 +7117,6 @@
       "version": "1.16.1",
       "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
       "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
-      "dev": true,
-      "optional": true,
       "requires": {
         "asn1": "~0.2.3",
         "assert-plus": "^1.0.0",
@@ -7630,8 +7567,6 @@
       "version": "2.4.3",
       "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
       "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
-      "dev": true,
-      "optional": true,
       "requires": {
         "psl": "^1.1.24",
         "punycode": "^1.4.1"
@@ -7640,9 +7575,7 @@
         "punycode": {
           "version": "1.4.1",
           "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
-          "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
-          "dev": true,
-          "optional": true
+          "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
         }
       }
     },
@@ -7668,8 +7601,6 @@
       "version": "0.6.0",
       "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
       "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
-      "dev": true,
-      "optional": true,
       "requires": {
         "safe-buffer": "^5.0.1"
       }
@@ -7677,9 +7608,7 @@
     "tweetnacl": {
       "version": "0.14.5",
       "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
-      "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
-      "dev": true,
-      "optional": true
+      "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
     },
     "type-check": {
       "version": "0.3.2",
@@ -7832,7 +7761,6 @@
       "version": "4.2.2",
       "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
       "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
-      "dev": true,
       "requires": {
         "punycode": "^2.1.0"
       }
@@ -7922,9 +7850,7 @@
     "uuid": {
       "version": "3.3.3",
       "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz",
-      "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==",
-      "dev": true,
-      "optional": true
+      "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ=="
     },
     "vary": {
       "version": "1.1.2",
@@ -7936,8 +7862,6 @@
       "version": "1.10.0",
       "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
       "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
-      "dev": true,
-      "optional": true,
       "requires": {
         "assert-plus": "^1.0.0",
         "core-util-is": "1.0.2",

+ 7 - 4
package.json

@@ -2,7 +2,7 @@
   "name": "zsy_quick_app",
   "version": "1.0.0",
   "subversion": {
-    "toolkit": "0.6.6"
+    "toolkit": "0.7.1"
   },
   "description": "",
   "scripts": {
@@ -16,11 +16,14 @@
     "babel-eslint": "^10.0.1",
     "eslint": "^5.12.1",
     "eslint-plugin-hybrid": "0.0.5",
-    "hap-toolkit": "^0.6.6",
     "less": "^3.10.3",
-    "less-loader": "^5.0.0"
+    "less-loader": "^5.0.0",
+    "hap-toolkit": "^0.7.1"
   },
   "dependencies": {
     "flyio": "^0.6.14"
-  }
+  },
+  "browserslist": [
+    "chrome 65"
+  ]
 }

+ 24 - 18
sign/debug/certificate.pem

@@ -1,20 +1,26 @@
 -----BEGIN CERTIFICATE-----
-MIIDMTCCAhmgAwIBAgIJAMKpjyszxkDpMA0GCSqGSIb3DQEBCwUAMC4xCzAJBgNV
-BAYTAkNOMQwwCgYDVQQKDANSUEsxETAPBgNVBAMMCFJQS0RlYnVnMCAXDTE3MDQx
-OTAyMzE0OVoYDzIxMTYwMzI2MDIzMTQ5WjAuMQswCQYDVQQGEwJDTjEMMAoGA1UE
-CgwDUlBLMREwDwYDVQQDDAhSUEtEZWJ1ZzCCASIwDQYJKoZIhvcNAQEBBQADggEP
-ADCCAQoCggEBAK3kPd9jzvTctTIA3XNZVv9cHHDbAc6nTBfdZp9mtPOTkXFpvyCb
-kL0QjOog0+1pv8D7dFeP4ptWXU5CT3ImvaPR+16dAtMRcsxEr5q4zieJzx3O6huL
-UBa1k+xrzjXpRzkcOysmc8fTxt0tAwbDgJ2AA5TlXLTcVyb7GmJ+hl5CjnhoG5NN
-LrkqI7S29c1U3uokj8Q7hzaj0TURu/uB5ZIMCLZY9KFDugqaEcvmUyJiD0fuV6sA
-O/4kpiZUOnhV8/xWpRbMI4WFQsfgLOCV+X9uzUa29D677y//46t/EDSuQTHyBZbl
-AcNMENkpMWZsH7J/+F19+U0/Hd5bJgneVRkCAwEAAaNQME4wHQYDVR0OBBYEFKDN
-SZtt47ttOBDQzIchFYyxsg3mMB8GA1UdIwQYMBaAFKDNSZtt47ttOBDQzIchFYyx
-sg3mMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBABaZctNrn4gLmNf/
-eNJ3x5CJIPjPwm6j9nwKhtadJ6BF+TIzSkJuHSgxULjW436F37otv94NPzT5PCBF
-WxgXoqgLqnWwvsaqC4LUEjsZviWW4CB824YDUquEUVGFLE/U5KTZ7Kh1ceyUk4N8
-+mtkXkanWoBBk0OF24lNrAsNLB63yTLr9HxEe75+kmvxf1qVJUGtaOEWIhiFMiAB
-5D4w/j2EFWktumjuy5TTwU0zhl52bc8V9SNixM1IaqzNrVPrdjv8viUX548pU3WT
-xZ5ylDsxhMC1q4BXQVeIY8C0cMEX+WHOmOCvWrkxCkP91pKsSPkuVrWlzrkn8Ojo
-swP6sBw=
+MIIEZDCCA0ygAwIBAgIJAKq35kk+VtkvMA0GCSqGSIb3DQEBCwUAMIHGMQswCQYD
+VQQGEwJaSDERMA8GA1UECAwIWmhlSmlhbmcxEjAQBgNVBAcMCUhhbmcgWmhvdTFF
+MEMGA1UECgw8w6bCncKtw6XCt8Kew6bCjsKMw6fCu8K0w6fCp8KRw6bCisKAw6bC
+nMKJw6nCmcKQw6XChcKsw6XCj8K4MRMwEQYDVQQLDApPcGVyYXRpb25zMRMwEQYD
+VQQDDAp6aGl1c2h1eXVuMR8wHQYJKoZIhvcNAQkBFhA1MDMzMjUwMTdAcXEuY29t
+MB4XDTE5MTExODA3NDQ1MFoXDTI5MTExNTA3NDQ1MFowgcYxCzAJBgNVBAYTAlpI
+MREwDwYDVQQIDAhaaGVKaWFuZzESMBAGA1UEBwwJSGFuZyBaaG91MUUwQwYDVQQK
+DDzDpsKdwq3DpcK3wp7DpsKOwozDp8K7wrTDp8KnwpHDpsKKwoDDpsKcwonDqcKZ
+wpDDpcKFwqzDpcKPwrgxEzARBgNVBAsMCk9wZXJhdGlvbnMxEzARBgNVBAMMCnpo
+aXVzaHV5dW4xHzAdBgkqhkiG9w0BCQEWEDUwMzMyNTAxN0BxcS5jb20wggEiMA0G
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDL+dN976p+GynIx9dfll/x2iZ08h+n
+ipy+VOd6BUQ9Uhzytjw5O1F8maFkzaqIkf5g1Yo3J56YH2ATabvmachpi3muOA7N
+RBRHNr1kP5fPWj9/WSgCgWzk5oNLQCcaU3Yd6b2nJalT4MDviMiJ+UhZ80hblAQH
+cqGSbVDJKVOf6oQdg01076xWWyFLTRmb2LuatpsDJti0qJwQJbQjIWCazux+pvg1
+BRfFzoH2UD0DYNJyH+3axQsN38T/bT24vMnrnkXIr2d8fV0+6Qy7staXAfy4UFTt
+huQy/j+91Va65BftUUZEg+8C6aMUkbYgD14vvzmkiKSbrT6gV8hY+EJ9AgMBAAGj
+UzBRMB0GA1UdDgQWBBQMafP+ydNlml1NJuha0kK2dTdzAjAfBgNVHSMEGDAWgBQM
+afP+ydNlml1NJuha0kK2dTdzAjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB
+CwUAA4IBAQCgCcHjxiXiZK8DDs91vyrfqZRxNjvMUNgk3LlnePJCLKYXxrgOsehV
+PxB/AvPcGP7RQory3jSZFqSUOE+HLihUvr1U/7v6/LkagBpg06BYtUgM9Ohb2yT5
+sUcTMeMFRA+7AIAAwU49MNJ6CZdphl54Fg7ANMuZfHHPtcXAlESdlaytRU5bFEqC
+HgXMzQmH5hT08ygcSpOOgJim4lwDXuJq2zYsOrPiLwJRT7gY0N3i+ZqA5UnSm0uL
+Mx5qvp+J5Jb6StwWp7hk+c/vnO9ZupLy1Y1Qnk0cA2KbGTztrzkhm1RVL4K3cWH0
+gxjlfojXWYGbhK6lOdh30X9myPpA3CYG
 -----END CERTIFICATE-----

+ 26 - 26
sign/debug/private.pem

@@ -1,28 +1,28 @@
 -----BEGIN PRIVATE KEY-----
-MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCt5D3fY8703LUy
-AN1zWVb/XBxw2wHOp0wX3WafZrTzk5Fxab8gm5C9EIzqINPtab/A+3RXj+KbVl1O
-Qk9yJr2j0ftenQLTEXLMRK+auM4nic8dzuobi1AWtZPsa8416Uc5HDsrJnPH08bd
-LQMGw4CdgAOU5Vy03Fcm+xpifoZeQo54aBuTTS65KiO0tvXNVN7qJI/EO4c2o9E1
-Ebv7geWSDAi2WPShQ7oKmhHL5lMiYg9H7lerADv+JKYmVDp4VfP8VqUWzCOFhULH
-4Czglfl/bs1GtvQ+u+8v/+OrfxA0rkEx8gWW5QHDTBDZKTFmbB+yf/hdfflNPx3e
-WyYJ3lUZAgMBAAECggEBAJTnCBBdUB+fSs1prjeS/gsmnfgJoY+K9H7PCIxgj3yw
-FXAvZAmRDKzJGlF2EOOQlTG0YNiGDj6EAtv7rjoKcINyULSg8IU6wLmn61MrAuUa
-fa+Bujgh4E/B5swhOHAztNhzkzsM70Hi17wXSislh+HWd7qteOgqcbqgdOR4gaj+
-HUqtcxG3H3hCL3dWugnjLZMtestLKGHSSZvbQNjYM3kKy2LvO8NpxmDE4a+TXygK
-qhaZjmS/dc/nJBJzOfkzby58RvGbzlJflfW/Uu3/gizj13GFQKWonq1xh630RAhv
-xX5ySok2aAx/+/SiJSpNXvM09grQuoORSr7D1tm+5rECgYEA3vf0hRfua0XAOu6f
-pyzNvLRRJ/pEew7XpNPCyS2TuMTd1yvXjGVxQfP46N6x1IM3SRU0zE+LSk80EF7l
-u1Or7GyCEhabYNe/7P2F8ENP73Do0HwvcI1jGrgr6r9oK0J27Xei+f6Q0bgJOPI2
-qaLj+V37cOjkNSM1mhTjtDwK8k0CgYEAx6cMrkjHl1+lDIIOc3qAEL3jb3xQveYk
-WrMF/B+j048k6boU4VvFJAIyQxOxMNxLjw3/9+zXCFJT4WaZK3TMXlg614ASGx3H
-tKjJM9O07ywwMq1gbutFS4nHCg3L3Os6esL0SPwMdATR3Yh22n5OGI9o+/aURulL
-GPEXef1Z2/0CgYEAgmwp5LxV4vu+8Pnp+4DSq4ISQr861XyeGTUhKEp3sUm+tgFY
-KTChakHKpHS3Mqa6bQ5xft08je/8dWL9IHFWDIqAHxKIOsKY6oh1k0/cbyPtmx45
-Ja4efV+jmMHzrfJH3KnxdCg7D+GFy4CrBtlYXuJhlO81pft9fC6h7yh8ArUCgYBq
-gvkl5Zftbs4rnRq+iqTVyagTKvwcQzIz3PwdZHfO/rfPpUFMdNv4eN99n3zRN0Vs
-HSjoiEazntA3GLgwUdBRqLpDi4SdSMbo337vkksdqbJQ5uPiaMuAIBG6kF+pDSkW
-ovkWErlGD+gySoI10FozihaVDRhPuFgjB0PiBcIxtQKBgGNSzX+Bx5+ux1Qny0Sn
-SUcBtepLnO8M8wafoGNyehbMnLzfuMbaDiJOdozGlBNHZTtPB3r4AYb8WnltdKW0
-7i3fk26YZGiMVeUJvewA6/LOBEaqMdwoNwnoptvbR6ehHeE/PPtRtge2cD3bPIM7
-U9VlWgfgj9Dxfwhslqb9hmyp
+MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDL+dN976p+GynI
+x9dfll/x2iZ08h+nipy+VOd6BUQ9Uhzytjw5O1F8maFkzaqIkf5g1Yo3J56YH2AT
+abvmachpi3muOA7NRBRHNr1kP5fPWj9/WSgCgWzk5oNLQCcaU3Yd6b2nJalT4MDv
+iMiJ+UhZ80hblAQHcqGSbVDJKVOf6oQdg01076xWWyFLTRmb2LuatpsDJti0qJwQ
+JbQjIWCazux+pvg1BRfFzoH2UD0DYNJyH+3axQsN38T/bT24vMnrnkXIr2d8fV0+
+6Qy7staXAfy4UFTthuQy/j+91Va65BftUUZEg+8C6aMUkbYgD14vvzmkiKSbrT6g
+V8hY+EJ9AgMBAAECggEAcZOuW9Vzzbw6S/5awnLtAbJC76NSVOwt0x1btunv0WVD
+kTI/3m5VNVgmMgcDCgCg8DJ3P7bj7DisOqMJaYdFfN+Y5ZV5SHq7/9tPId73HRJX
+gQWX7a07gUmJmgEixNnsT0OzwrqJypa/V6GGaK1RyCRbCgMlKzB9HxeXgCtu0P+5
+GI5iByZZ9A6w/zKriqMxeTXa1qP9/J2/U1iX2nb8mRqLQzlRFOHomGVvzmhFY+o3
+GoKhCj84ll9SnlGw8cGvpqRUoFHXxFUerANgOcEPMXD/n+ESEOjEJTfM/rEFY318
+TIf4S3wpXAW276AzQqlcoPX64hia7xXCJ0NVjk4OUQKBgQD5NJ/vPrbBeyAxqiht
+HijLN5odPZOdCjDvU3/2KyGpWfNkbOosHYy5fTpw/3AJJCqvEEXRCEqZXXKDYgIY
+wTWx1icuE2jHQBYe9/QrjXnH8tRVHHsQBoaG0feCshT/owIMkFwRfjz6m97jFCub
+nIj6A67TWE1FrQQF4IBOh16AtwKBgQDRiYM9vArVZqHpjhebMj2BdZuw85NBuQhx
+CymbJtc6/7S/rHYjO8nDQjjsQwEs97YhjZ1rf7mIhQRitx7EhnrSUnEXu0qqhODk
++rNbCpOTPWPG3MoPJtkn/kCOea4SbLDpQUKCHUNNBIbJZH+QCn5mHr6v7d3WIyh/
+V/McMik6awKBgDoGwubWV3+dx9VIpbkiuKT5AW2llOWQJezUKIuNZ30jcMUFh1FW
+YBogyqbdE51NSpMQ2vDdWWF0nOFyxMI22uXZ062q307l4UC8w6IQgzbHmCFpTE5i
+9pgV8+f+x1zu+98pDgcUueYwvSlq3OyS+mIc0WxstzFuI+2qZLXkV2DpAoGAY1nS
+UpkwgdKx/q2S39FIfHOpKJO1RLpZGFB0n84gyyanKyK4uSgGGIDzwIJcsleZkfs1
+otziuapoU+4DtqcU4ViZqujxFD0A7VE5bXdsVaoL/yR84gZHfMD/Fw72zGGg2FhL
+EqqRWJlG14LBQSjYmc8GFyCvyHLPJuIqsTnPdpUCgYEAuFJH245XEYL/2F2LeFLi
+Z6qcCO3LLY3WxKf/G/TRJeeApKsWdriMVQSb4LLhfVpm7Hdt8BPzcqG4noebhmFn
+jtuQ3FbYv4Qlq5eTsH5qVC7IjQlsMo8+vpEu9ax0/NeAsNaU2l2I9NW3NykaPUw6
+s+1IFcMugoWxthAqvZnziIM=
 -----END PRIVATE KEY-----

+ 2 - 1
src/api/config.js

@@ -6,7 +6,8 @@
  * @Description: api配置文件
  */
 const apiConfig = {
-  baseURL: "https://quickapp.leyuee.com/api"
+  baseURL: "https://quickapp.leyuee.com/api",
+ // baseURL: "https://quickapptest.leyuee.com/api",
 };
 
 export default apiConfig;

+ 55 - 13
src/api/fly.js

@@ -9,10 +9,26 @@ import fetch from "@system.fetch";
 import Fly from "flyio/dist/npm/hap";
 import apiConfig from "./config";
 import prompt from '@system.prompt';
-import { getToken, clearToken } from "./utils";
-
+import storage from "@system.storage";
+import { getToken, clearToken, getSendOrderId } from "./utils";
+import it from "../helper/interface.js";
 var fly = new Fly(fetch);
 var qs = require('qs');
+var appInfo = it.getAppInfo();
+var provider = it.getProvider();
+var appDev, sendOrderId;
+var packages = 'com.beidao.kuaiying.zsy';
+var requestTime = 0;
+
+
+it.getAppDev((res) => {
+  appDev = res;
+})
+
+getSendOrderId((id) => {
+  sendOrderId = id;
+})
+
 fly.config.baseURL = apiConfig.baseURL;
 fly.config.headers["Content-Type"] =
   "application/x-www-form-urlencoded;charset=utf-8";
@@ -20,33 +36,59 @@ fly.config.headers["Content-Type"] =
 const filterNoToken = ["/login", "/refreshToken"];
 
 fly.interceptors.request.use(async config => {
-  // 过滤一些不需要登录的路由d
+  // 过滤一些不需要登录的路由
   if (filterNoToken.indexOf(config.url) === -1) {
+    let regId = (await storage.get({ key: "regId" })).data;
+    let push_id = (await storage.get({ key: "push_id" })).data;
     let token = await getToken();
-    if (config.headers) config.headers.Authorization = token;
-    else config.headers = { Authorization: token };
+    if (config.headers) {
+      config.headers.Authorization = token;
+      config.headers["X-Version"] = appInfo.versionName;
+      config.headers["X-Brand"] = qs.stringify(appDev);
+      config.headers["X-Package"] = packages;
+      config.headers["X-regId"] = regId;
+      config.headers["X-CodeVersion"] = '1.0.0';
+      config.headers["X-pushId"] = push_id;
+      config.headers["X-Provider"] = provider;
+      if (sendOrderId) config.headers["send-order-id"] = sendOrderId;
+    }
+    else {
+      if (sendOrderId) {
+        config.headers = { Authorization: token, 'X-Version': appInfo.versionName, 'X-Brand': qs.stringify(appDev), "X-Package": packages, 'send-order-id': sendOrderId };
+      } else {
+        config.headers = { Authorization: token, 'X-Version': appInfo.versionName, 'X-Brand': qs.stringify(appDev), "X-Package": packages };
+      }
+    }
     if (config.method === "POST") {
-      config.body = qs.stringify(config.body);
+      if (qs.stringify(config.body)) {
+        config.body = qs.stringify(config.body) + '&package=' + packages;
+      } else {
+        config.body = 'package=' + packages
+      }
+    } else {
+      config.body ? config.body.package = packages : config.body = { package: packages }
     }
     return config;
-  } else return config;
+  } else {
+    return config;
+  }
 });
 
 fly.interceptors.response.use(
   async res => {
     if (!res.data.code) {
-      return res.data.data;
-    } else if (res.data.code === 10023) {
+      return Promise.resolve(res.data.data);
+    } else if (res.data.code === 10023 || res.data.code === 10001) {
       // token失效
       await clearToken();
       console.log("begin refresh token");
       let refresh_token = await getToken();
       console.log("refresh token:", refresh_token);
       return fly(res.config);
-      // return getToken().then(token => {
-      // });
-    }
-    else {
+
+    } else if (res.data.code === 10028) {
+      return false;
+    } else {
       prompt.showToast({
         message: res.data.msg
       })

+ 40 - 0
src/api/index.js

@@ -157,4 +157,44 @@ export const readOverRecommend = params => {
 //催更
 export const urgeUpdate = params => {
   return fly.post(`/user/urgeUpdate`, params);
+};
+
+//更新派单ID
+export const setSendOrderId = id => {
+  return fly.get("/user/setSendOrder", { id: id });
+};
+
+//用户加桌
+export const userAddDsktop = statu => {
+  return fly.get("/user/addDesktop", { status: statu });
+};
+
+//用户任务列表
+export const userTaskList = () => {
+  return fly.get("/user/task");
+};
+
+//完成任务
+export const getTaskAward = (id) => {
+  return fly.get(`/user/task/get/${id}`);
+};
+
+//获取签到信息
+export const getSignInfo = () => {
+  return fly.get('/sign/info');
+};
+
+//非VIP用户签到
+export const noVipSign = () => {
+  return fly.get('/sign/new');
+};
+
+//任务页面书籍位置
+export const taskBook = () => {
+  return fly.get('/books/recommen');
+}
+
+//获取全局变量
+export const userOptions = () => {
+  return fly.get("/options");
 };

+ 43 - 22
src/api/utils.js

@@ -10,16 +10,14 @@ import prompt from "@system.prompt";
 
 // 获取token
 let token = null;
+let requestLoginTime = 0;
+
 export const getToken = async () => {
   if (getToken.promise) return getToken.promise;
-
   if (!token) token = (await storage.get({ key: "token" })).data;
-
   // token格式化
   if (token && typeof token === "string") token = JSON.parse(token);
-
   console.log("checkToken", checkToken(token));
-
   if (!token) getToken.promise = login();
   else if (checkToken(token)) return Promise.resolve(token.token);
   else {
@@ -37,29 +35,45 @@ export const getToken = async () => {
   return getToken.promise;
 };
 
+
 // 登录
 export const login = async () => {
-  console.log("begin login");
+  requestLoginTime++;
+  if(requestLoginTime!=1){
+    let loginResponed =  await loginPromise();
+  }
   const signKey = "a!A&AFRWT65Nb3NlklezUiqHyQAA@Z8M";
-  let device_no = (await device.getUserId()).data.userId;
+  const packages = 'com.beidao.kuaiying.zsy';
   let device_info = (await device.getInfo()).data;
+  let androidid = (await device.getUserId()).data;
   let send_order_id = (await storage.get({ key: "send_order_id" })).data;
   let timestamp = parseInt(new Date().valueOf() / 1000);
   let queryString = "";
-  if (send_order_id) queryString = `device_info=${JSON.stringify(device_info)}&device_no=${device_no}&send_order_id=${send_order_id}&timestamp=${timestamp}&key=${signKey}`;
-  else queryString = `device_info=${JSON.stringify(device_info)}&device_no=${device_no}&timestamp=${timestamp}&key=${signKey}`;
+  if (send_order_id) queryString = `androidid=${androidid.userId}&device_info=${JSON.stringify(device_info)}&device_no=${androidid.userId}&package=${packages}&send_order_id=${send_order_id}&timestamp=${timestamp}&key=${signKey}`;
+  else queryString = `androidid=${androidid.userId}&device_info=${JSON.stringify(device_info)}&device_no=${androidid.userId}&package=${packages}&timestamp=${timestamp}&key=${signKey}`;
   let data = qs.stringify({
+    androidid: androidid.userId,
     device_info: JSON.stringify(device_info),
-    device_no: device_no,
+    device_no: androidid.userId,
+    package: packages,
     send_order_id: send_order_id,
     timestamp: timestamp,
-    sign: hex_md5(queryString)
+    sign: hex_md5(queryString),
   });
   let ret = await fly.post("/login", data);
-  console.log("login over");
-  return ret;
+  requestLoginTime = 0;
+  return ret; 
 };
 
+const loginPromise = () =>{
+  return new Promise((resolve,reject)=>{
+    setTimeout(()=>{
+      resolve(true)
+    },800)
+  })
+}
+
+
 // 检测数据结果
 export const checkResult = r => {
   if (!r.data.code) {
@@ -75,10 +89,10 @@ const refreshToken = () => {
     .get("/refreshToken", {
       token: token.token
     }, {
-        headers: {
-          Authorization: token.token
-        }
-      })
+      headers: {
+        Authorization: token.token
+      }
+    })
     .then(r => {
       return r;
     })
@@ -175,12 +189,7 @@ export const downImg = photoPath => {
     fail: () => { }
   });
 };
-//校验手机号
-export const validatePhone = phone => {
-  const VALIDATE_REG = /^(0|86|17951)?(13[0-9]|15[012356789]|166|17[0-9]|18[0-9]|14[57]|19[89])[0-9]{8}$/;
-  const isMobile = VALIDATE_REG.test(phone);
-  return isMobile;
-};
+
 //存储期限storge
 export const setStore = (key, value) => {
   if (!key) return;
@@ -207,3 +216,15 @@ function isExceedDay(theDate, expDay) {
     (expDay - 1) * 24 * 3600 * 1000;
   return theDate < targetTime;
 }
+
+export const getSendOrderId = (fn) => {
+  storage.get({
+    key: 'send_order_id',
+    success: data => {
+      fn && fn(data);
+    },
+    fail: (data, code) => {
+      console.log(`handling fail, code = ${code}`)
+    }
+  })
+}

+ 20 - 1
src/app.ux

@@ -11,9 +11,13 @@
  */
 import "./helper/regenerator.js";
 import it from "./helper/interface.js";
+import storage from "@system.storage";
 
 export default {
   async onCreate() {
+    this.dataCache = {
+    }
+
     // 一进入程序就判断是否添加过主屏幕
     it.shortcut.systemPromptEnabled = false;
     await it.shortcut.hasInstalled({
@@ -23,6 +27,17 @@ export default {
         else this.$def.data.backClickCount = 1;
       }
     })
+
+     it.getPushRedId(regId=>{
+       storage.set({ key: "regId", value: regId });
+    })
+
+  },
+  getAppData(key) {
+    return this.dataCache[key]
+  },
+  setAppData(key, val) {
+    this.dataCache[key] = val
   },
   showMenu: it.showMenu,
   getDeviceInfo: it.getDeviceInfo,
@@ -30,7 +45,11 @@ export default {
   data: {
     backClickCount: 0,
     cutomerQrcode: "",
-    weChat: "wxlxf1099"
+    weChat: "wxlxf1099",
+    appVersion: '',
+    dataCache: {
+      backfrom: ''
+    }
   }
 };
 </script>

BIN
src/assets/imgs/black_back.png


BIN
src/assets/imgs/delete.png


BIN
src/assets/imgs/moo.png


BIN
src/assets/imgs/question.png


BIN
src/assets/imgs/rukou.png


BIN
src/assets/imgs/sun.png


BIN
src/assets/imgs/task.png


BIN
src/assets/imgs/task_gift.png


BIN
src/assets/imgs/white_back.png


+ 5 - 2
src/assets/less/detail.less

@@ -65,9 +65,12 @@
 
   .book-intro {
     margin-top: 24px;
-    justify-content: flex-end;
+    justify-content: flex-start;
     // flex-direction: column;
-
+    .intro-div{
+      width: 100%;
+      justify-content: flex-end;
+    }
     text {
       font-size: 26px;
       color: #666;

+ 3 - 1
src/assets/less/my.less

@@ -46,7 +46,9 @@
 
       .item-name {
         flex: 1;
-
+        .orange{
+          color: #CD8119;
+        }
         image {
           width: 40px;
           margin-right: 40px;

+ 3 - 0
src/assets/less/phone.less

@@ -19,11 +19,14 @@
       font-size: 28px;
       border:0;
       width: 300px;
+      height:90px;
     }
     .send-msg{
       font-size:24px;
       color:#EF5952;
       margin-right:20px;
+      height:90px;
+      line-height:90px;
     }
     .disabled{
       color:#ccc;

+ 120 - 4
src/assets/less/reader.less

@@ -5,7 +5,7 @@
 
   .reader-title {
     margin: 0 24px;
-    padding: 40px 0;
+    padding: 30px 0;
     // border-bottom: 2px solid #ccc;
     justify-content: space-between;
     align-items: center;
@@ -13,8 +13,8 @@
     .title {
       font-weight: bolder;
       color: #1a1a1a;
-      font-size: 38px;
-      padding: 150px 0;
+      font-size: 46px;
+      padding: 60px 0 30px;
     }
 
     .add-shelf {
@@ -30,7 +30,64 @@
   .reader-content {
     margin: 0 24px;
     flex-direction: column;
-
+      .readContent{
+        width:100%;
+        flex-direction: column;
+      }
+     .bottom-setting{ 
+       height:332px;
+       position: fixed;
+       bottom: 0; 
+       width: 100%;
+       padding:40px 30px;
+       flex-direction: column;
+       justify-content:flex-start;
+       left:0;
+       .item-page{
+         padding-top:40px;
+         justify-content: space-between;
+       }
+       .item-color{
+         justify-content: space-between;
+         margin-top:30px;
+        .colori{
+          border-radius: 100%;
+          width: 70px;
+          height: 70px;
+          border-width: 2px;
+        }
+        .color-icon{
+          border-radius: 100%;
+          width: 70px;
+          height: 70px;
+          background-size: 100%;
+          background-repeat: no-repeat;
+        }
+        .night{
+          background-image:url('../../assets/imgs/sun.png') ;
+          border-radius: 100%;
+          border-width: 2px;
+          border-color: #EE6159;
+        }
+        .sun{
+          background-image:url('../../assets/imgs/moo.png') ;
+        }
+       }
+       .item-content{
+         height:60px;
+         slider{
+           flex:1;
+         }
+       }
+       .label-min{
+         padding-right:40px;
+         font-size:30px;
+       }
+       .label-max{
+        padding-left:40px;
+        font-size:48px;
+      }
+     }
     .chapter-text {
       font-size: 19px;
       color: #1a1a1a;
@@ -72,3 +129,62 @@
     border-radius: 5px;
   }
 }
+.setting-top{
+  position: fixed;
+  top:0;
+  left:0;
+  width:100%;
+  height:120px;
+  line-height: 120px;
+  color:#999;
+  font-size:30px;
+  padding: 0 30px;
+  justify-content: space-between;
+  align-items: center;
+  .back-icon{
+    width:30px;
+    height:30px;
+  }
+}
+.mustToask{
+  position: fixed;
+	top: 0;
+	bottom: 0;
+	left: 0;
+	right: 0;
+	background-color: rgba(0, 0, 0, 0.56);
+	flex-direction: column;
+	align-items: center;
+	justify-content: center;
+  z-index: 2;
+  .mustBox{
+    background-color: #fff;
+    width:600px;
+    height:400px;
+    flex-direction: column;
+    border-radius: 15px;
+    text-align: center;
+    justify-content: center;
+    align-items: center;
+    .title-must{
+      text-align: center;
+      font-size:40px;
+      padding-top: 50px;
+      font-weight: bold;
+    }
+    .content{
+      text-align: center;
+      margin:60px 0;
+      color:#666;
+    }
+    .button-must{
+      text-align: center;
+      color:#fff;
+      margin:0 auto;
+      width:250px;
+      height:80px;
+      background-color:#fd555d;
+      border-radius: 20px;
+    }
+  }
+}

+ 115 - 0
src/assets/less/serach.less

@@ -0,0 +1,115 @@
+.serch-wrap {
+	flex-direction: column;
+	.isempty{
+		text-align: center;
+		font-size:30px;
+		height:30px;
+		line-height: 30px;
+	}
+  .history-list {
+    flex-wrap: wrap;
+    .history-item {
+      height: 50px;
+      line-height: 50px;
+      padding: 0 22px;
+      color: #666;
+      font-size: 24px;
+      margin: 30px 20px 0 0;
+      background-color: #f3f3f3;
+      border-radius: 2px;
+    }
+  }
+  .search-content {
+    margin-top: 30px;
+    flex-direction: column;
+    padding: 0 30px;
+    .top-wrap {
+      justify-content: space-between;
+      text {
+        font-weight: bold;
+        color: #343434;
+        font-size: 32px;
+    	}
+			image{
+				width:40px;
+			}
+    }
+  }
+}
+.list-content{
+	margin-top: 40px;
+	.reslut-title{
+		color:#9a9a9a;
+		font-size: 26px;
+		padding: 0 0 40px 30px;
+	}
+}
+.search-top {
+  padding: 0 30px;
+  flex-direction: column;
+  width: 100%;
+  .serach-input {
+    height: 80px;
+    line-height: 80px;
+    font-size: 40px;
+    color: #333;
+    font-weight: bold;
+    border-bottom: 2px solid #e5e5e5;
+	}
+}
+
+.books-item__wrap {
+	background-color: #fff;
+	padding: 0px 24px;
+	margin-bottom: 30px;
+	flex-direction: column;
+
+	.book-info {
+		flex: 1;
+		flex-direction: column;
+		justify-content: flex-start;
+		align-items: flex-start;
+		padding-left: 40px;
+
+		.name {
+			color: #333;
+			font-size: 32px;
+			lines: 1;
+			text-overflow: ellipsis;
+		}
+		
+		.status,
+		.words {
+			color: #999;
+			font-size: 26px;
+		}
+
+		.update {
+			align-items: center;
+
+			text {
+				font-size: 26px;
+				color: #ff6060;
+			}
+
+			.lastest {
+				color: #666;
+			}
+
+			image {
+				width: 30px;
+				height: 30px;
+				margin-left: 10px;
+			}
+		}
+
+		.intro {
+			font-size: 24px;
+			color: #666;
+			margin-top: 36px;
+			lines: 3;
+			text-overflow: ellipsis;
+			line-height: 36px;
+		}
+	}
+}

+ 234 - 0
src/assets/less/task.less

@@ -0,0 +1,234 @@
+.task-page{
+    flex-direction: column;
+    background-color: #F7F7F7;
+    .task-banner{
+			width:100%;
+			height:300px;
+			.swipe-item{
+				height:300px;
+				width:100%;
+			}
+    }
+    .sign-section{
+			width: 690px;
+			height: 466px;
+			border-radius:12px;
+			background-color: #fff;
+			box-shadow:0px 0px 9px 0px rgba(0,0,0,0.05);
+			margin: -30px auto;
+			padding: 38px 18px;
+			justify-content: flex-start;
+			align-items: flex-start;
+			flex-direction: column;
+			line-height: 150%;
+			.sign-title{
+				align-items: center;
+				text{
+					font-size: 28px;
+					font-weight: 800;
+				}
+				image{
+					width:22px;
+					height:22px;
+					margin-left:5px;
+				}
+			}
+			.sign-desc{
+				font-size:24px;
+				color:#999;
+				margin-top:10px;
+			}
+    }
+}
+.sign{
+	&-line {
+    margin:50px auto 20px;
+		height: 140px;
+		width: 100%;
+    &__item {
+      flex: 1;
+      flex-direction: column;
+      align-items: center;
+      justify-content: space-around;
+    }
+    &__day {
+      color: #999;
+      font-size: 22px;
+    }
+    image {
+      width: 40px;
+      height: 40px;
+    }
+    &__fee {
+      font-size: 22px;
+		}
+	}
+	&-button{
+		width:424px;
+		height:72px;
+		line-height: 72px;
+		background-color:#EF5952;
+		border-radius: 36px;
+		font-size:34px;
+		margin: 15px auto 0;
+		color:#fff;
+		text-align: center;
+	}
+	&-button-disabled{
+		width:424px;
+		height:72px;
+		line-height: 72px;
+		background-color:#FCDEDC;
+		border-radius: 36px;
+		font-size:34px;
+		margin: 15px auto 0;
+		color:#EF5952;
+		text-align: center;
+	}
+}
+
+.task{
+	&-section{
+		flex-direction: column;
+		padding:34px 30px;
+		width:690px;
+		box-shadow:0px 0px 18px 0px rgba(0,0,0,0.06);
+		border-radius: 12px;
+		margin: 50px auto 0;
+		background-color: #fff;
+		.banner{
+			width:630px;
+			height:120px;
+			margin-top:20px;
+		}
+		&__tab{
+			justify-content: space-around;
+			text{
+				font-size:32px;
+				padding: 10px 0;
+				border-bottom: 4px solid transparent;
+			}
+			.on{
+				color: #EF5952;
+				border-bottom:4px solid #EF5952;
+				font-weight: bold;
+			}
+		}
+		&__list{
+			flex-direction: column;
+			.list-item{
+				margin:24px 0;
+				height:76px;
+				align-items: center;
+				.icon{
+					width:54px;
+					height:54px;
+				}
+				.content{
+					flex-direction: column;
+					flex:1;
+					margin-left:10px;
+					.content-desc{
+						color: #999;
+						margin-top:5px;
+						font-size:22px;
+					}
+				}
+				.task-award{
+					align-items: flex-end;
+					padding-left:20px;
+					image{
+						width:26px;
+						height:26px;
+					}
+					text{
+						color: #999;
+						font-size:22px;
+					}
+				}
+				.button-status{
+					width:108px;
+					height:40px;
+					border-radius:20px;
+					text-align: center;
+					font-size: 22px;
+				}
+				.wait{
+					border:1px solid #EF5952;
+					background-color: #fff;
+					color:#EF5952;
+				}
+				.disabled{
+					background-color:#eee;
+					color:#999
+				}
+				.get{
+					background-color: #EF5952;
+					color:#fff;
+				}
+			}
+		}
+	}
+}
+.mask{
+	position: fixed;
+	top: 0;
+	bottom: 0;
+	left: 0;
+	right: 0;
+	background-color: rgba(0, 0, 0, 0.56);
+	flex-direction: column;
+	align-items: center;
+	justify-content: center;
+	z-index: 2;
+	.rule{
+		width:600px;
+		height:384px;
+		padding: 34px 30px;
+		border-radius: 12px;
+		background-color:#fff;
+		margin:-100px auto 0;
+		align-items: flex-start;
+		justify-content: flex-start;
+		flex-direction: column;
+		.rule-title{
+			width: 100%;
+			text-align: center;
+			font-size: 32px;
+			color: #333;
+			margin-bottom: 40px;
+		}
+		.detail{
+			color:#999;
+			margin-top:30px;
+			font-size: 26px;
+		}
+	}
+	.close-icon{
+		width: 60px;
+		height: 60px;
+		margin-top:40px;
+	}
+}
+.sign{
+	&-banner {
+    background-image: url(../../assets/imgs/sign_bg.jpg);
+    background-size: cover;
+    background-repeat: no-repeat;
+    justify-content: center;
+    width: 600px;
+    height: 322px;
+    border-radius: 30px;
+    &__text {
+      font-size: 34px;
+      color: #fff;
+      font-weight: bold;
+      margin-top: 200px;
+      .orange {
+        color: #ffc017;
+        font-size: 46px;
+        padding: 0 6px;
+      }
+    }
+  }
+}

+ 42 - 14
src/components/short/index.ux

@@ -1,14 +1,15 @@
 <template>
 	<div class="short-wrap">
 		<div class="short-content" @click="createShortcut">
-			<text class="short-text">保存到手机方便下次阅读>></text>
+			<text class="short-left" >点击保存到桌面,方便继续阅读</text>
+			<text class="short-right">免费领100书币</text>
 		</div>
 	</div>
 </template>
 <script>
 import shortcut from '@system.shortcut';
 import prompt from '@system.prompt';
-
+import {userAddDsktop} from '../../api/index.js';
 export default {
 	data: {
 
@@ -24,8 +25,16 @@ export default {
 					shortcut.install({
 						message: "添加【追书云】到桌面,方便下次阅读",
 						success: () => {
-							prompt.showToast("添加成功!");
 							this.$emit("addshort", { installed: true });
+							 if (this.$app.$def.data.backClickCount === 0) {
+								this.$app.$def.data.backClickCount++;
+								return true;
+							 }
+							userAddDsktop(1).then(res=>{
+							//TODO 加桌后统计上报
+							}).catch(r=>{
+							//TODO 失败后统计上报
+							});	
 						},
 						fail: (code) => {
 							console.log(code);
@@ -44,23 +53,42 @@ export default {
 .short {
   &-wrap {
     position: fixed;
-    bottom: 140px;
+    bottom: 200px;
     height: 80px;
-    justify-content: center;
-    width: 100%;
+		justify-content: center;
+		width: 100%;
+		opacity:0.95;
   }
   &-content {
-    background-color: #ef5952;
-    border-radius: 40px;
-    width: 600px;
+    width: 650px;
     align-items: center;
-    justify-content: center;
+		justify-content: center;
+		opacity: 0.95;
+		border-radius: 40px;
+		height:80px;
   }
-  &-text {
+  &-left {
     color: #fff;
-    font-size: 30px;
+    font-size: 28px;
     font-weight: bold;
-    text-align: center;
-  }
+		text-align: center;
+		background-color:#FF453C;
+		width:444px;
+		height:80px;
+		border-top-left-radius: 40px;
+		border-bottom-left-radius: 40px;
+		opacity:0.95;
+	}
+	&-right{
+		text-align: center;
+		font-weight: bold;
+		 font-size: 28px;
+		background-color:#FFB540;
+		width:206px;
+		height:80px;
+		border-top-right-radius: 40px;
+		border-bottom-right-radius: 40px;
+		opacity:0.95;
+	}
 }
 </style>

+ 7 - 7
src/helper/index.js

@@ -17,7 +17,6 @@ export const pageLoad = (meta, fn, params) => {
     }
   })
 }
-
 // 支付配置
 export const configWxPay = async (params) => {
   let payType = wxpay.getType();
@@ -81,16 +80,17 @@ let useWxAppPay = (params) => {
   return new Promise(async (resolve, reject) => {
     let config = await getConfigOfWxAppPay(params);
     let extra = {
-      app_id: config.appId,
-      partner_id: "",
-      package_value: "",
-      nonce_str: config.nonce_str,
-      time_stamp: "",
+      app_id: config.appid,
+      partner_id: config.partnerid,
+      package_value: config.package,
+      nonce_str: config.noncestr,
+      time_stamp: config.timestamp + "",
       order_sign: config.sign
     }
     console.log(extra);
+    console.log("prepayid ", config.prepayid);
     wxpay.pay({
-      prepayid: config.prepay_id,
+      prepayid: config.prepayid,
       extra: extra,
       success: (data) => {
         console.log("success", data);

+ 130 - 17
src/helper/interface.js

@@ -3,30 +3,66 @@ import device from "@system.device";
 import prompt from "@system.prompt";
 import shortcut from "@system.shortcut";
 import router from "@system.router";
+import push from '@service.push';
 
 const SHORT_CUT_FORBIDDEN_INFO = "User forbidden";
 
 // 获取设备信息
 const getDeviceInfo = () => {
   device.getDeviceId({
-    success: (ret) => {
-      console.log(ret)
+    success: ret => {
+      console.log(ret);
     }
-  })
-}
+  });
+};
+
+//获取订阅推送
+const getPushRedId = fn => {
+  push.subscribe({
+    success: ret => {
+      fn && fn(ret.regId);
+    }
+  });
+};
+
+//获取应用信息
+const getAppInfo = () => {
+  const appInfo = app.getInfo();
+  return appInfo;
+};
+
+//获取provider
+const getProvider = () => {
+  const provider = push.getProvider();
+  return provider;
+};
+
+//获取设备明细
+const getAppDev = fn => {
+  device.getInfo({
+    success: ret => {
+      fn && fn(ret);
+    }
+  });
+};
+//校验手机号
+const validatePhone = phone => {
+  const VALIDATE_REG = /^(0|86|17951)?(13[0-9]|15[012356789]|166|17[0-9]|18[0-9]|14[57]|19[89])[0-9]{8}$/;
+  const isMobile = VALIDATE_REG.test(phone);
+  return isMobile;
+};
 //获取是否创建图标
-const getShortCut = (fn) => {
+const getShortCut = fn => {
   shortcut.hasInstalled({
-    success: (ret) => {
+    success: ret => {
       fn(ret);
     }
-  })
-
-}
+  });
+};
 // 判断用户是否创建图标
-const hasCreateShortCut = (isPayPage = false,fn) => {
+const hasCreateShortCut = (isPayPage = false, fn) => {
   shortcut.hasInstalled({
-    success: (ret) => {
+    success: ret => {
       if (!ret) {
         shortcut.install({
           message: "添加【追书云】到桌面,方便下次阅读",
@@ -34,15 +70,84 @@ const hasCreateShortCut = (isPayPage = false,fn) => {
             prompt.showToast("添加成功!");
             fn && fn(true);
           },
-          fail: (code) => {
+          fail: code => {
+            fn && fn(false);
             if (code === SHORT_CUT_FORBIDDEN_INFO && !isPayPage) app.exit();
           }
-        })
+        });
+      } else {
+        fn && fn(false);
+      }
+    }
+  });
+};
+
+//弱加桌
+const loseLevelShortCut = (fn) =>{
+  shortcut.hasInstalled({
+    success: ret => {
+      if (!ret) {
+        shortcut.install({
+          message: "添加【追书云】到桌面,方便下次阅读",
+          complete: () => {
+            fn && fn(true);
+          },
+        });
+      } else {
+        fn && fn(false);
+      }
+    }
+  });
+}
+
+//强制加桌
+const mustCreateShort = (fn) => {
+  shortcut.hasInstalled({
+    success: ret => {
+      if (!ret) {
+        shortcut.install({
+          message: "添加【追书云】到桌面,方便下次阅读",
+          success: () => {
+            prompt.showToast("添加成功!");
+            fn && fn(true);
+          },
+          fail: code => {
+            fn && fn(false,code);
+            prompt.showToast("取消操作");
+          }
+        });
+      } else {
+        fn && fn(false);
       }
     }
-  })
+  });
+
 }
 
+//用于返回时提醒加桌
+const backCreateShortCut = (fn) => {
+  shortcut.hasInstalled({
+    success: ret => {
+      if (!ret) {
+        shortcut.install({
+          message: "添加【追书云】到桌面,方便下次阅读",
+          success: () => {
+            prompt.showToast("添加成功!");
+            fn && fn('back')
+          },
+          fail: code => {
+            console.log('我失败了我失败了')
+            fn && fn('back')
+          }
+        });
+      } else {
+        fn && fn('back')
+      }
+    }
+  });
+};
+
+
 // 右上角菜单点击
 const showMenu = () => {
   const appInfo = app.getInfo();
@@ -74,12 +179,20 @@ const showMenu = () => {
       }
     }
   });
-}
+};
 
 export default {
   shortcut,
   getDeviceInfo,
   hasCreateShortCut,
+  backCreateShortCut,
   showMenu,
-  getShortCut
-}
+  getShortCut,
+  getAppInfo,
+  getAppDev,
+  validatePhone,
+  getPushRedId,
+  getProvider,
+  mustCreateShort,
+  loseLevelShortCut
+};

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 45 - 5
src/manifest.json


+ 1 - 1
src/views/About/index.ux

@@ -32,7 +32,7 @@
     <input class="btn" type="button" onclick="createShortcut" value="创建快捷方式" />
 
     <!-- 版权信息 -->
-    <text id="footer">{{copyright}}</text>
+    <text id="footer"><a href="/views/Agreement">用户协议</a> |<a href="/views/Privacy"> 隐私政策</a></text>
   </div>
 </template>
 

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 146 - 0
src/views/Agreement/index.ux


+ 36 - 0
src/views/Continue/index.ux

@@ -0,0 +1,36 @@
+<template>
+	<div class="phone-wrap">
+
+	</div>
+</template>
+<script>
+
+import router from '@system.router';
+import storage from '@system.storage';
+
+export default {
+	private: {
+
+
+	},
+	onInit() {
+		this.getLastCharpt();
+	},
+
+	async getLastCharpt() {
+		let params = (await storage.get({ key: "lastCapter" })).data;
+		if(params){
+			router.replace({
+				uri: "/views/Reader",
+				params: JSON.parse(params)
+			})
+		 }else{
+			 router.replace({
+				uri: "/views/Index",
+			})
+		 }
+		
+	}
+
+}
+</script>

+ 10 - 4
src/views/Detail/index.ux

@@ -20,7 +20,7 @@
       </x-book>
       <stack class="book-intro">
         <text class="short-info__text">{{substrInfoText()}}</text>
-        <text class="toggle" @click="toggleTextStatus">{{showLongText ? '收起' : '展开'}}</text>
+        <div class="intro-div"><text class="toggle" @click="toggleTextStatus">{{showLongText ? '收起' : '展开'}}</text></div>
       </stack>
     </div>
     <text class="lastest-chapter" @click="toRead(book.last_cid,book.is_need_charge)">最新章节:{{book.last_chapter}}</text>
@@ -60,11 +60,14 @@
 import { getBooksInfo, getShortCatalog, getSimilarBooks, postUserShelfBooks } from "../../api";
 import router from '@system.router';
 import prompt from '@system.prompt';
-
+import storage from "@system.storage";
 export default {
   protected: {
     bid: ""
   },
+  public: {
+		push_id: ''
+	},
   private: {
     showLongText: false,
     book: {},
@@ -103,7 +106,7 @@ export default {
       uri: "/views/Reader",
       params: {
         bid: this.book.book_id,
-        chapter_id: chapter_id
+        chapter_id: chapter_id, 
       }
     })
   },
@@ -128,9 +131,12 @@ export default {
     console.log("book bid", this.bid);
     this.getBooksInfo(this.bid);
   },
-  onInit() {
+  async onInit() {
     // console.log("book bid", this.bid);
     // this.getBooksInfo(this.bid);
+    if(this.push_id){
+       await storage.set({ key: "push_id", value: this.push_id });
+    }
   },
 }
 </script>

+ 2 - 3
src/views/Home/index.ux

@@ -92,7 +92,7 @@ export default {
       ],
       banner: [],
       list: [],
-      current: 0
+      current: 1
     }
   },
   async onInit() {
@@ -114,13 +114,12 @@ export default {
       }
     })
   },
-  async getCityListByTabChange(index) {
+  async getCityListByTabChange(index=1) {
     await storage.set({ key: "sex", value: index || 0 });
     let sex = index ? "female" : "male";
     let ret = await getHomeList(sex);
     this.banner = ret.slice(0, 1)[0];
     this.list = ret.slice(1);
-    console.log(this.banner);
   }
 }
 </script>

+ 51 - 7
src/views/Index/index.ux

@@ -27,7 +27,8 @@
         </div>
       </div>
     </div>
-    <image src="../../assets/imgs/sign_show.png" class="sign-icon" @click="changeSignPop"> </image>
+    <image src="../../assets/imgs/sign_show.png" class="sign-icon" @click="changeSignPop" if="{{user.is_vip}}" > </image>
+    <image src="../../assets/imgs/rukou.png" class="sign-icon" @click="goTask" if="{{!user.is_vip}}" > </image>
     <sign-page if="{{showSignPop}}"></sign-page>
     <short-page if="{{showShortPop}}" @addshort="shortEnd"></short-page>
     <div class="stack-popup" @click="closeWrap" if="showPopup">
@@ -46,12 +47,20 @@
 <script>
 import clipboard from '@system.clipboard';
 import prompt from '@system.prompt';
+import device from "@system.device";
+import storage from "@system.storage";
 import it from "../../helper/interface.js";
-import { getCustomQrcode } from '../../api/index.js';
+import { getCustomQrcode, userAddDsktop,getUserInfo} from '../../api/index.js';
 import { downImg, getStore } from '../../api/utils.js';
+import router from "@system.router";
 export default {
+  public:{
+    curPage : 0,
+    push_id: ''
+  },
   protected: {
-    current: 0
+    current: 0,
+    user:{}
   },
   private: {
     tabbar: [
@@ -89,22 +98,43 @@ export default {
     showSignPop: false,
     showShortPop: false,
     cutomerQrcode: '',
-    cutomerName: ''
+    cutomerName: '',
+    brand:''
   },
-  onInit() {
+  async onInit() {
     this.$on('dispathEvt', this.changeSignPop);
     this.$watch('current', 'watchCurrent');
+    if(this.push_id){
+       await storage.set({ key: "push_id", value: this.push_id });
+    }
     //今日已签到过不在弹框签到
     this.getCoustom();
+    this.getUser();
+    if(this.curPage && this.curPage > 0 ){
+      this.current = this.curPage
+    }
+    
+
   },
-  onShow() {
+  async onShow() {
+    const data = this.$app.getAppData('backfrom');
+    let device_info = (await device.getInfo()).data;
+    this.brand = device_info.brand ;
+    if(data=='phone'){
+      this.current = 1;
+      this.$app.setAppData('backfrom','');
+    }
+    
     it.getShortCut((value) => {
       this.showShortPop = !value;
     })
+   
   },
   shortEnd(value) {
     if (value.detail.msg) {
       prompt.showToast({ message: "用户禁止创建" });
+    }else if(value.detail.installed){
+      prompt.showToast({ message: "添加桌面成功!请前往任务中心领取奖励" });
     }
     this.showShortPop = !value.detail.installed;
   },
@@ -112,9 +142,18 @@ export default {
     console.log("watching", i);
     this.current = i;
   },
+  async getUser(){
+    let user = await getUserInfo();
+    this.user = user;
+  },
+  goTask(){
+    router.push({
+      uri: '/views/Task'
+    })
+  },
   onBackPress() {
     // 退出逻辑
-    if (this.$app.$def.data.backClickCount === 0) {
+    if (this.$app.$def.data.backClickCount === 0  && this.brand!=='vivo') {
       this.$app.$def.data.backClickCount++;
       this.$app.$def.createShortcut();
       return true;
@@ -131,6 +170,11 @@ export default {
     this.showShortPop = false;
   },
   async getCoustom() {
+    userAddDsktop(this.$app.$def.data.backClickCount).then(res=>{
+      //TODO 加桌后统计上报
+    }).catch(r=>{
+       //TODO 失败后统计上报
+    });
     let res = await getCustomQrcode();
     this.cutomerQrcode = res.url;
     this.cutomerName = res.name;

+ 0 - 1
src/views/Leaderboard/index.ux

@@ -82,7 +82,6 @@ export default {
     },
     onInit() {
         for (var i = 0; i < 5; i++) {
-            console.log(1)
             this.list.push(this.list[0])
         }
     },

+ 84 - 11
src/views/My/index.ux

@@ -2,13 +2,22 @@
   <div class="user-wrap">
     <div class="user-info__wrap">
       <image src="{{user.head_img}}"></image>
-      <div class="uesr-info__message"><text>ID:{{user.id}}</text><text class="vip-card" if={{user.is_vip}}>免费阅读卡还剩{{user.vip_days}}</text></div>
+      <div class="uesr-info__message"><text>ID:{{user.id}}<span if="haslogin && loginPhone">(Tel:{{loginPhone}})</span></text><text class="vip-card" if={{user.is_vip}}>免费阅读卡还剩{{user.vip_days}}</text></div>
     </div>
-    <div class="operator-item__wrap">
+    <div class="operator-item__wrap" >
+      <div class="operator-item" @click="pageChange('Task')" if={{!user.is_vip}}>
+        <div class="item-name">
+          <image src="../../assets/imgs/task.png"></image>
+          <text class="orange" >做任务,得奖励</text>
+        </div>
+        <div class="info-text">
+          <image class="arrow" src="../../assets/imgs/arrow-right.png"></image>
+        </div>
+      </div>
       <div class="operator-item">
         <div class="item-name">
           <image src="../../assets/imgs/declining.png"></image>
-          <text>您还剩<span class="red">{{user.balance}}</span>书币</text>
+          <text><span>您还剩</span><span class="red">{{user.balance}}</span><span>书币</span></text>
         </div>
         <text class="operator-button" @click="pageChange('Pay')">
           充值
@@ -53,10 +62,11 @@
       <div class="operator-item" @click="pageChange('Phone')">
         <div class="item-name">
           <image src="../../assets/imgs/binding.png"></image>
-          <text>绑定手机</text>
+          <text if="{{!(haslogin && loginPhone)}}"> 登录绑定</text>
+          <text else >退出登录</text>
         </div>
         <div class="info-text">
-          <text if="{{!user.phone}}">绑定即送100书币</text>
+          <text if="{{!(haslogin && loginPhone)}}"></text>
           <text else>已绑定手机号</text>
           <image class="arrow" src="../../assets/imgs/arrow-right.png"></image>
         </div>
@@ -69,6 +79,7 @@
 import router from "@system.router";
 import { getUserInfo } from "../../api/index";
 import prompt from '@system.prompt';
+import storage from '@system.storage';
 export default {
   props: {
     tabindex: {
@@ -78,15 +89,23 @@ export default {
   },
   data() {
     return {
-      user: {}
+      user: {},
+      haslogin: undefined,
+      loginPhone: undefined,
     }
   },
-  onInit() {
+  async onInit() {
     this.$watch('tabindex', 'watchPropsChange');
   },
   async getUser() {
     let user = await getUserInfo();
+    var reg = /^(\d{3})\d*(\d{4})$/;
+    user.dtel = user.phone.replace(reg,'$1****$2')
     this.user = user;
+    let haslogin = (await storage.get({ key: "hasLogin" })).data;
+    let loginPhone= (await storage.get({ key: "loginPhone" })).data; 
+    this.haslogin = haslogin;
+    this.loginPhone = loginPhone.replace(reg,'$1****$2');
   },
   watchPropsChange(v) {
     if (v === 3) this.getUser();
@@ -95,10 +114,8 @@ export default {
     this.$emit('customer');
   },
   pageChange(page) {
-    if (page == 'Phone' && this.user.phone) {
-      prompt.showToast({
-        message: '您已绑定过手机号'
-      })
+    if (page == 'Phone' && this.haslogin) {
+      this.loginOut();
       return false;
     }
     router.push({
@@ -109,6 +126,62 @@ export default {
     router.push({
       uri: url
     })
+  },
+   loginOut() {
+    let self = this;
+    prompt.showDialog({
+      title: '提示',
+      message: '确认是否要退出登录?',
+      buttons: [
+        {
+          text: '确定',
+          color: '#666'
+        },
+        {
+          text: '取消',
+          color: '#9900FF'
+        }
+      ],
+      success: function (data) {
+        if(data.index==1){
+          prompt.showToast({
+            message: '取消操作'
+          })
+        }else{
+          prompt.showToast({
+          message: '退出成功'
+          })
+          console.log(data)
+          storage.delete({
+            key: 'hasLogin',
+            success: function(data) {
+              self.getUser();
+              console.log('handling success')
+            },
+            fail: function(data, code) {
+              console.log(`handling fail, code = ${code}`)
+            }
+          })
+          storage.delete({
+            key: 'loginPhone',
+            success: function(data) {
+              console.log('handling success')
+            },
+            fail: function(data, code) {
+              console.log(`handling fail, code = ${code}`)
+            }
+          })
+        }
+      },
+      cancel: function () {
+        prompt.showToast({
+          message: '取消操作'
+        })
+      },
+      fail: function (data, code) {
+        console.log(`handling fail, code = ${code}`)
+      }
+    })
   }
 }
 </script>

+ 287 - 221
src/views/Pay/index.ux

@@ -1,234 +1,300 @@
 <template>
-  <div class="pay-wrap">
-    <tabs class="wrap-relative">
-      <tab-content>
-        <div class="wrap-relative">
-          <div class="top-user__wrap">
-            <div class="user-balance">
-              <text>您的余额:</text>
-              <text class="balance">{{balance}}</text>
-              <text>书币</text>
-            </div>
-            <div class="chapter-cost" if="fee">
-              <text>当前章节需要消耗</text>
-              <text class="cost">{{fee}}</text>
-              <text>书币</text>
-            </div>
-          </div>
-          <div class="charge-wrap">
-            <div class="title">
-              <text class="border"></text>
-              <text>支付方式</text>
-            </div>
-            <div class="pay-type">
-              <block for="item in payType">
-                <div class="pay-type__item {{curPayType === item.value ? 'pay-type__item--cur' : ''}}" @click="changePayType(item)">
-                  <image src="{{item.icon}}"></image>
-                  <text>{{item.name}}</text>
-                </div>
-              </block>
-            </div>
-            <div class="recharge-list">
-              <block for="charge in rechargeList">
-                <stack class="stack-wrap" @click="changeCharge($idx)">
-                  <div class="recharge-item {{curSelect === $idx ? 'recharge-item__select' : ''}}">
-                    <text class="price {{curSelect === $idx ? 'price__select' : ''}}">{{charge.price}}</text>
-                    <text class="send {{curSelect === $idx ? 'send__select' : ''}}">{{charge.text}}</text>
-                    <div class="discount {{curSelect === $idx ? 'discount__select' : ''}}" if="charge.save_text">
-                      <block if="!charge.is_year_order">
-                        <text>省</text>
-                      </block>
-                      <block else>
-                        <image src="../../assets/imgs/year_pay.png"></image>
-                      </block>
-                      <text class="discount-num {{curSelect === $idx ? 'discount-num__select' : ''}}">{{charge.save_text}}</text>
-                    </div>
-                  </div>
-                  <image if="charge.today_special" class="recharge-recommend" src="../../assets/imgs/jinri.png"></image>
-                </stack>
-              </block>
-            </div>
-          </div>
-          <div class="notice-wrap">
-            <text class="title">提示:</text>
-            <text class="notice-item">1.书币属虚拟商品,一经购买不得退换</text>
-            <text class="notice-item">2.充值后书币到账可能有延迟,1小时内未到账请到个人中心联系客服</text>
-            <text class="notice-item">3.工作时间:周一 周四 周五 9:00-21:00,周二 周三 周六 周日 9:00-18:00</text>
-          </div>
-        </div>
-      </tab-content>
-    </tabs>
-    <div class="wrap-fixed">
-      <image src="../../assets/imgs/shadow.png" class="shadow"></image>
-      <div class="total-wrap">
-        <div class="total-cost">
-          <text>合计:{{total}}</text>
-          <text class="notice">选择充值金额(1元=100书币)</text>
-        </div>
-        <text class="go-to-pay" @click="toPay">立即充值</text>
-      </div>
-    </div>
-    <div class="loading-wrap" if="showLoading">
-      <div class="loading-content">
-        <progress type="circular"></progress>
-        <text class="loading-text">{{loadingText}}</text>
-      </div>
-    </div>
-  </div>
+	<div class="pay-wrap">
+		<tabs class="wrap-relative">
+			<tab-content>
+				<div class="wrap-relative">
+					<div class="top-user__wrap">
+						<div class="user-balance">
+							<text>您的余额:</text>
+							<text class="balance">{{balance}}</text>
+							<text>书币</text>
+						</div>
+						<div class="chapter-cost" if="fee">
+							<text>当前需要消耗</text>
+							<text class="cost">{{fee}}</text>
+							<text>书币</text>
+						</div>
+					</div>
+					<div class="charge-wrap">
+						<div class="title">
+							<text class="border"></text>
+							<text>支付方式</text>
+						</div>
+						<div class="pay-type">
+							<block for="item in payType">
+								<div class="pay-type__item {{curPayType === item.value ? 'pay-type__item--cur' : ''}}" @click="changePayType(item)">
+									<image src="{{item.icon}}"></image>
+									<text>{{item.name}}</text>
+								</div>
+							</block>
+						</div>
+						<div class="recharge-list">
+							<block for="charge in rechargeList">
+								<stack class="stack-wrap" @click="changeCharge($idx)">
+									<div class="recharge-item {{curSelect === $idx ? 'recharge-item__select' : ''}}">
+										<text class="price {{curSelect === $idx ? 'price__select' : ''}}">{{charge.price}}</text>
+										<text class="send {{curSelect === $idx ? 'send__select' : ''}}">{{charge.text}}</text>
+										<div class="discount {{curSelect === $idx ? 'discount__select' : ''}}" if="charge.save_text">
+											<block if="!charge.is_year_order">
+												<text>省</text>
+											</block>
+											<block else>
+												<image src="../../assets/imgs/year_pay.png"></image>
+											</block>
+											<text class="discount-num {{curSelect === $idx ? 'discount-num__select' : ''}}">{{charge.save_text}}</text>
+										</div>
+									</div>
+									<image if="charge.today_special" class="recharge-recommend" src="../../assets/imgs/jinri.png"></image>
+								</stack>
+							</block>
+						</div>
+					</div>
+					<div class="notice-wrap">
+						<text class="title">提示:</text>
+						<text class="notice-item">1.书币属虚拟商品,一经购买不得退换</text>
+						<text class="notice-item">2.充值后书币到账可能有延迟,1小时内未到账请到个人中心联系客服</text>
+						<text class="notice-item">3.工作时间:周一 周四 周五 9:00-21:00,周二 周三 周六 周日 9:00-18:00</text>
+					</div>
+				</div>
+			</tab-content>
+		</tabs>
+		<div class="wrap-fixed">
+			<image src="../../assets/imgs/shadow.png" class="shadow"></image>
+			<div class="total-wrap">
+				<div class="total-cost">
+					<text>合计:{{total}}</text>
+					<text class="notice">选择充值金额(1元=100书币)</text>
+				</div>
+				<text class="go-to-pay" @click="toPay">立即充值</text>
+			</div>
+		</div>
+		<div class="loading-wrap" if="showLoading">
+			<div class="loading-content">
+				<progress type="circular"></progress>
+				<text class="loading-text">{{loadingText}}</text>
+			</div>
+		</div>
+	</div>
 </template>
 
 <script>
 import router from '@system.router';
 import prompt from '@system.prompt';
+import storage from "@system.storage";
 import { getChargeList, getUserInfo, checkWxOrder } from "../../api";
 import { configWxPay, configAliPay } from "../../helper";
 
 export default {
-  protected: {
-    bid: "",
-    code: "",
-    fee: ""
-  },
-  private: {
-    curPayType: 1,
-    curSelect: 0,
-    balance: 0,
-    send_order_id: 0,
-    total: "0元",
-    loadingText: "订单查询中...",
-    isInPay: false,
-    showLoading: false,
-    payType: [
-      {
-        name: "支付宝",
-        icon: "http://newycsd.oss-cn-hangzhou.aliyuncs.com/images/base/logo/zhifubao.jpg",
-        value: 1
-      },
-      {
-        name: "微信",
-        icon: "http://newycsd.oss-cn-hangzhou.aliyuncs.com/images/base/logo/weixin.jpg",
-        value: 2
-      }
-    ],
-    rechargeList: []
-  },
-  changePayType(type) {
-    this.curPayType = type.value;
-  },
-  changeCharge(key) {
-    this.curSelect = key;
-    this.total = this.rechargeList[key].price;
-  },
-  async getUserInfo() {
-    let userinfo = await getUserInfo();
-    this.balance = userinfo.balance;
-    this.send_order_id = userinfo.send_order_id;
-  },
-  async initChargeList() {
-    this.rechargeList = await getChargeList();
-    this.rechargeList.forEach((p, k) => {
-      if (p.today_special) {
-        this.curSelect = k;
-        this.total = this.rechargeList[k].price;
-      }
-    })
-  },
-  async toPay() {
-    let cur_pay_type = this.curPayType;
-    let product_id = this.rechargeList[this.curSelect].product_id;
-    let ret = null;
-    if (cur_pay_type === 1) {
-      ret = await configAliPay({ product_id: product_id, bid: this.bid, send_order_id: this.send_order_id });
-    }
-    else {
-      ret = await configWxPay({ product_id: product_id, bid: this.bid, send_order_id: this.send_order_id });
-    }
-    // 成功支付后的回调操作
-    if (ret.code === "9000") this.showWaitingWrap(ret);
-    else this.showToastByCode(ret.code);
-  },
-  checkOrder(order_info) {
-    this.showLoading = true;
-    let { data, order } = order_info;
-    let times = 10;
-    this.loadingText = `订单查询中...${times}s`;
-    this.timer = setInterval(async () => {
-      if (times === 0) clearInterval(this.timer), this.showToastByCode("6004");
-      else {
-        times--;
-        this.loadingText = `订单查询中...${times}s`;
-        let fb = await checkWxOrder(order);
-        if (fb && typeof fb === "object") clearInterval(this.timer), this.showToastByCode("9000");
-      }
-    }, 1000);
-  },
-  showWaitingWrap(order) {
-    prompt.showDialog({
-      title: "支付结果",
-      message: "请确认支付结果",
-      buttons: [
-        {
-          text: "完成",
-          color: "#EF5952"
-        },
-        {
-          text: "支付遇到问题",
-          color: "#999"
-        }
-      ],
-      success: (data) => {
-        if (data.index === 0) this.checkOrder(order);
-        else this.showToastByCode("6004");
-      },
-      cancel: () => {
-        console.log("cancel");
-      }
-    });
-  },
-  showToastByCode(code) {
-    this.showLoading = false;
-    let msg = "支付成功!";
-    switch (code) {
-      case "9000": (msg = "支付成功!", router.back()); break;
-      case "8000": msg = "订单已提交,请等待结果"; break;
-      case "4000": msg = "订单支付失败!"; break;
-      case "5000": msg = "订单重复!"; break;
-      case "6001": msg = "您已取消支付"; break;
-      case "6002": msg = "网络错误!"; break;
-      case "6004": msg = "请联系客服查询订单"; break;
-      default: msg = "请联系客服" + code;
-    }
-    prompt.showToast({ message: msg });
-  },
-  onInit() {
-    this.initChargeList();
-    this.getUserInfo();
-  },
-  onHide() {
-    this.$app.$def.createShortcut(true);
-  },
-  async onBackPress() {
-    // 查询订单的过程如果用户返回
-    if (this.showLoading) {
-      let ret = await prompt.showDialog({
-        title: "警告",
-        message: "订单正在查询中,是否确认退出?",
-        buttons: [
-          {
-            text: "退出",
-            color: "#EF5952"
-          },
-          {
-            text: "取消",
-            color: "#999"
-          }
-        ]
-      });
-      if (ret.data.index === 1) return true;
-      else router.back();
-    }
-    else router.back();
-  }
+	public: {
+		push_id: "",
+	},
+	protected: {
+		bid: "",
+		code: "",
+		fee: ""
+	},
+	private: {
+		curPayType: 2,
+		curSelect: 0,
+		balance: 0,
+		send_order_id: 0,
+		total: "0元",
+		loadingText: "订单查询中...",
+		isInPay: false,
+		showLoading: false,
+		checked: false,
+		phone: '',
+		isVip: '',
+		last: null,
+		payType: [
+			{
+				name: "支付宝",
+				icon: "http://newycsd.oss-cn-hangzhou.aliyuncs.com/images/base/logo/zhifubao.jpg",
+				value: 1
+			},
+			{
+				name: "微信",
+				icon: "http://newycsd.oss-cn-hangzhou.aliyuncs.com/images/base/logo/weixin.jpg",
+				value: 2
+			}
+		],
+		rechargeList: []
+	},
+	//函数节流
+	throttle(fun, delay) {
+		let last = this.last;
+		const now = + new Date();
+		if (now - last > delay) {
+			fun();
+			this.last = now;
+		} else {
+			console.log('间隔太短了')
+		}
+	},
+	changePayType(type) {
+		this.curPayType = type.value;
+	},
+	changeCharge(key) {
+		this.curSelect = key;
+		this.total = this.rechargeList[key].price;
+	},
+	async getUserInfo() {
+		let userinfo = await getUserInfo();
+		this.balance = userinfo.balance;
+		this.send_order_id = userinfo.send_order_id;
+		this.checked = userinfo.is_check;
+		this.phone = userinfo.phone;
+		this.isVip = userinfo.is_vip;
+		if (userinfo.pay_mode_default == 'weixin') {
+			this.curPayType = 2;
+		} else {
+			this.curPayType = 1;
+		}
+	},
+	async initChargeList() {
+		this.rechargeList = await getChargeList();
+		this.rechargeList.forEach((p, k) => {
+			if (p.today_special) {
+				this.curSelect = k;
+				this.total = this.rechargeList[k].price;
+			}
+		})
+	},
+	async onInit() {
+		if (this.push_id) {
+			await storage.set({ key: "push_id", value: this.push_id });
+		}
+		this.initChargeList();
+	},
+	toPay() {
+		if (this.checked && !this.phone) {
+			prompt.showDialog({
+				title: '友情提示',
+				message: '您还未绑定手机号,请绑定手机号后在进行相关操作',
+				buttons: [
+					{
+						text: '前往绑定',
+						color: '#33dd44'
+					}
+				],
+				success: function (data) {
+					router.push({
+						uri: '/views/Phone'
+					})
+				},
+				cancel: function () {
+					console.log('取消绑定')
+				},
+			})
+		} else {
+			this.throttle(() => { this.payFunc() }, 1000)
+		}
+	},
+	async payFunc() {
+		let cur_pay_type = this.curPayType;
+		let product_id = this.rechargeList[this.curSelect].product_id;
+		let ret = null;
+		if (cur_pay_type === 1) {
+			ret = await configAliPay({ product_id: product_id, bid: this.bid, send_order_id: this.send_order_id });
+		}
+		else {
+			ret = await configWxPay({ product_id: product_id, bid: this.bid, send_order_id: this.send_order_id });
+		}
+		// 成功支付后的回调操作
+		if (ret.code === "9000") this.showWaitingWrap(ret);
+		else this.showToastByCode(ret.code);
+	},
+	checkOrder(order_info) {
+		this.showLoading = true;
+		let { data, order } = order_info;
+		let times = 10;
+		this.loadingText = `订单查询中...${times}s`;
+		this.timer = setInterval(async () => {
+			if (times === 0) clearInterval(this.timer), this.showToastByCode("6004");
+			else {
+				times--;
+				this.loadingText = `订单查询中...${times}s`;
+				let fb = await checkWxOrder(order);
+				if (fb && typeof fb === "object") clearInterval(this.timer), this.showToastByCode("9000");
+			}
+		}, 1000);
+	},
+	showWaitingWrap(order) {
+		prompt.showDialog({
+			title: "支付结果",
+			message: "请确认支付结果",
+			buttons: [
+				{
+					text: "已支付",
+					color: "#EF5952"
+				},
+				{
+					text: "重新选择金额",
+					color: "#999"
+				}
+			],
+			success: (data) => {
+				if (data.index === 0) this.checkOrder(order);
+			},
+			cancel: () => {
+				console.log("cancel");
+			}
+		});
+	},
+	showToastByCode(code) {
+		this.showLoading = false;
+		let msg = "支付成功!";
+		switch (code) {
+			case "9000": (msg = "支付成功!", router.back()); break;
+			case "8000": msg = "订单已提交,请等待结果"; break;
+			case "4000": msg = "订单支付失败!"; break;
+			case "5000": msg = "订单重复!"; break;
+			case "6001": msg = "您已取消支付"; break;
+			case "6002": msg = "网络错误!"; break;
+			case "6004": msg = "请联系客服查询订单"; break;
+			default: msg = "请联系客服" + code;
+		}
+		prompt.showToast({ message: msg });
+	},
+	onShow() {
+		this.getUserInfo();
+	},
+	onHide() {
+		//this.$app.$def.createShortcut(true);
+	},
+	onBackPress() {
+		if (!this.isVip) {
+			prompt.showDialog({
+				title: '温馨提示',
+				message: '每日完成任务,可以免费获取书币~',
+				buttons: [
+					{
+						text: '去做任务',
+						color: '#EF5952'
+					},
+					{
+						text: '我知道了',
+						color: '#999'
+					}
+				],
+				success: function (data) {
+					if (data.index === 1) {
+						router.back();
+					} else {
+						router.push({
+							uri: '/views/Task'
+						})
+					}
+
+				},
+				cancel: function () {
+					console.log('取消前往')
+				},
+			})
+			return true;
+		}
+
+	}
 }
 </script>
 

+ 115 - 88
src/views/Phone/index.ux

@@ -1,89 +1,116 @@
-<template>
-  <div class="phone-wrap">
-    <div class="input-content">
-      <div class="input-item">
-        <input class="input-text" type="tel" placeholder="请输入手机号" value="{{mobile}}" style="placeholder-color: #CCC" onchange="updateMobile"></input>
-      </div>
-      <div class="input-item">
-        <input class="input-text" type="number" maxlength="6" placeholder="请输入验证码" value="{{code}}" style="placeholder-color: #CCC" onchange="updateMessage"></input>
-        <text class="send-msg" if="{{!hasSend}}" @click="sendMsg">获取验证码</text>
-        <text class="send-msg disabled" else>重新获取{{duration}}</text>
-      </div>
-    </div>
-    <input type="button" value="绑定手机号" class="bind-button" @click="bindUser"> </input>
-  </div>
-</template>
-<script>
-import { validatePhone } from '../../api/utils';
-import { sendCode, userBind } from '../../api/index';
-import prompt from '@system.prompt';
-export default {
-  private: {
-    hasSend: false,
-    duration: 120,
-    mobile: null,
-    code: null
-
-  },
-  onInit() {
-
-  },
-  async sendMsg() {
-    let result = validatePhone(this.mobile);
-    if (result) {
-      let res = await sendCode({ phone: this.mobile });
-      this.countDown();
-    } else {
-      prompt.showToast({
-        message: '手机号格式不正确'
-      })
-    }
-  },
-  updateMobile(e) {
-    this.mobile = e.value;
-  },
-  updateMessage(e) {
-    this.code = e.value;
-  },
-  //倒计时
-  countDown() {
-    this.hasSend = true;
-    let time = setInterval(() => {
-      this.duration--;
-      if (this.duration < 1) {
-        clearInterval(time);
-        this.duration = 120;
-        this.hasSend = false;
-      }
-    }, 1000);
-  },
-  //绑定用户
-  async bindUser() {
-    if (!this.mobile || !this.code) {
-      prompt.showToast({
-        message: '请输入手机号和验证码'
-      })
-      return false;
-    }
-    if (!validatePhone(this.mobile)) {
-      prompt.showToast({
-        message: '手机号码格式不正确'
-      })
-      return false;
-    }
-    let params = {
-      phone: this.mobile,
-      code: this.code
-    }
-    let res = await userBind(params);
-    prompt.showToast({
-      message: '绑定成功!'
-    })
-
-  }
-
-}
-</script>
-<style lang="less">
-@import "../../assets/less/phone.less";
+<template>
+  <div class="phone-wrap">
+    <div class="input-content">
+      <div class="input-item">
+        <input class="input-text" type="tel" placeholder="请输入手机号" value="{{mobile}}" style="placeholder-color: #CCC" onchange="updateMobile"></input>
+      </div>
+      <div class="input-item">
+        <input class="input-text" type="number" maxlength="6" placeholder="请输入验证码" value="{{code}}" style="placeholder-color: #CCC" onchange="updateMessage"></input>
+        <text class="send-msg" if="{{!hasSend}}" @click="sendMsg">获取验证码</text>
+        <text class="send-msg disabled" else>重新获取{{duration}}</text>
+      </div>
+    </div>
+    <input type="button" value="登录绑定手机号" class="bind-button" @click="bindUser"> </input>
+  </div>
+</template>
+<script>
+import it from '../../helper/interface.js';
+import { sendCode, userBind} from '../../api/index';
+import router from '@system.router';
+import prompt from '@system.prompt';
+import storage from '@system.storage';
+
+export default {
+  private: {
+    hasSend: false,
+    duration: 120,
+    mobile: null,
+    code: null,
+    isOnBind:false,
+    isOnsend:false,
+
+  },
+  onInit() {
+
+  },
+  async sendMsg() {
+    if(this.isOnsend){
+      return false;
+    }
+    this.isOnsend = true;
+    let result = it.validatePhone(this.mobile);
+    if (result) {
+      let res = await sendCode({ phone: this.mobile }).catch((err)=>{this.isOnsend = false});
+      if(res){
+         this.isOnsend = false;
+         this.countDown();
+      }
+    } else {
+      prompt.showToast({
+        message: '手机号格式不正确'
+      })
+    }
+  },
+  updateMobile(e) {
+    this.mobile = e.value;
+  },
+  updateMessage(e) {
+    this.code = e.value;
+  },
+  //倒计时
+  countDown() {
+    this.hasSend = true;
+    let time = setInterval(() => {
+      this.duration--;
+      if (this.duration < 1) {
+        clearInterval(time);
+        this.duration = 120;
+        this.hasSend = false;
+      }
+    }, 1000);
+  },
+  //绑定用户
+  async bindUser() {
+    if (!this.mobile || !this.code) {
+      prompt.showToast({
+        message: '请输入手机号和验证码'
+      })
+      return false;
+    }
+    if (!it.validatePhone(this.mobile)) {
+      prompt.showToast({
+        message: '手机号码格式不正确'
+      })
+      return false;
+    }
+    if(this.isOnBind){
+      return false;
+    }
+    this.isOnBind = true;
+    let params = {
+      phone: this.mobile,
+      code: this.code,
+      version:'2.0'
+    }
+    
+    let res = await userBind(params).catch((err)=>{this.isOnBind = false;});
+    if(res){
+      this.isOnBind = false;
+      await storage.set({ key: "hasLogin", value: 'hasLogin' });
+      await storage.set({ key: "loginPhone", value: this.mobile });
+
+      this.$app.setAppData('backfrom','phone');
+      prompt.showToast({
+        message: '登录成功!'
+      })
+      setTimeout(()=>{
+        router.back();
+      },1500)
+    }
+  }
+
+}
+</script>
+<style lang="less">
+@import "../../assets/less/phone.less";
 </style>

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 275 - 0
src/views/Privacy/index.ux


+ 200 - 29
src/views/Reader/index.ux

@@ -3,26 +3,57 @@
 <template>
   <div id="reader-content">
     <stack>
-      <div class="reader-wrap" id='list'>
+      <div class="reader-wrap" id='list' style="background-color:{{currentColor.color}}">
         <div class="reader-title">
-          <text class="title">{{bookinfo.chapter_name}}</text>
+          <text class="title" style="color:{{isNight=='night'?'#666':'#333'}}">{{bookinfo.chapter_name}}</text>
           <!-- <text class="add-shelf" @click="addShelf">加入书架</text> -->
         </div>
         <div class="reader-content">
-          <text class="chapter-text" for='content'>{{$item}}</text>
+          <div class="readContent" @click="showMore"><text class="chapter-text" for='content' style="color:{{currentColor.fontColor}};font-size:{{`${readFontSize}px`}}">{{$item}}</text></div>
+          <div class="bottom-setting" style="background-color:{{currentColor.btColor}}" if={{showSetting}} @click="stopPop">
+            <div class="item-content">
+              <text class="label-min" style="color:{{isNight=='night'?'#666':'#333'}}">A</text>
+              <slider class="slider" min="30" max="48" step="2" value="{{readFontSize}}" onchange="changeFontSize" style="blockColor: #fff"></slider>
+              <text class="label-max" style="color:{{isNight=='night'?'#666':'#333'}}">A</text>
+            </div>
+            <div class="item-color">
+              <text class="colori" for="colorList" onclick="changeColor($item,undefined)" style="border-color:{{currentColor.color==$item.color? currentBorder: $item.borderColor}};background-color:{{$item.color}};"></text>
+              <text class="color-icon {{ isNight }}" onclick="changeColor(nightColor,isNight)"></text>
+            </div>
+            <div class="item-page">
+              <text @click="getPrevChapter" style="color:{{isNight=='night'?'#666':'#333'}}">上一章</text>
+              <text @click="toCatalog" style="color:{{isNight=='night'?'#666':'#333'}}">目录</text>
+              <text @click="getNextChapter" style="color:{{isNight=='night'?'#666':'#333'}}">下一章</text>
+            </div>
+            <div>
+            </div>
+            <div class="setting-top" style="background-color:{{currentColor.color}}" if={{showSetting}} @click="backRouter">
+              <image src="{{getImgUrl}}" class="back-icon"></image> <text style="color:{{isNight=='night'?'#666':'#333'}}">{{bookinfo.chapter_name}}</text><text style="text-indent:-999px">1</text>
+            </div>
+          </div>
+          <div class="reader-operator">
+            <text class="operator prev" @click="getPrevChapter">上一章</text>
+            <text class="operator catalog" @click="toCatalog">目录</text>
+            <text class="operator next" @click="getNextChapter">下一章</text>
+          </div>
         </div>
-        <div class="reader-operator">
-          <text class="operator prev" @click="getPrevChapter">上一章</text>
-          <text class="operator catalog" @click="toCatalog">目录</text>
-          <text class="operator next" @click="getNextChapter">下一章</text>
+        <short-page if="{{showShortPop}}" @addshort="shortEnd"></short-page>
+        <!-- <wechat-page></wechat-page> -->
+        <div class='toast' if="{{showtoast}}">
+          <text>正在加载中...</text>
         </div>
-      </div>
-      <short-page if="{{showShortPop}}" @addshort="shortEnd"></short-page>
-      <!-- <wechat-page></wechat-page> -->
-      <div class='toast' if="{{showtoast}}">
-        <text>正在加载中...</text>
-      </div>
     </stack>
+    <div class="mustToask" show="{{showMustTost}}">
+      <div class="mustBox">
+        <text class="title-must">
+          提示
+        </text>
+        <text class="content">
+          添加桌面后方可继续阅读精彩内容
+        </text>
+        <text class="button-must" @click="addDestop">添加到桌面</text>
+      </div>
+    </div>
   </div>
 
 </template>
@@ -32,7 +63,7 @@ import prompt from '@system.prompt';
 import router from "@system.router";
 import storage from '@system.storage';
 import it from "../../helper/interface.js";
-import { getChapters, getIsonshelf, postUserShelfBooks, chapterOrders } from "../../api";
+import { getChapters, getIsonshelf, postUserShelfBooks, chapterOrders, userAddDsktop } from "../../api";
 
 export default {
   // protected: {
@@ -43,27 +74,123 @@ export default {
     bid: '',
     chapter_id: '',
     send_order_id: "",
+    push_id:"",
     canReadecid: "",
     showtoast: false
   },
   private: {
     bookinfo: {},
     content: [],
-    showShortPop: false
+    showShortPop: false,
+    readFontSize: 38,
+    isNight: 'sun',
+    hasShort: false,
+    showSetting: false,
+    force_add_desk_type: 0,
+    showMustTost: false,
+    colorList: [
+      { color: '#E6E6E6', borderColor: '#CCC', btColor: '#F2F2F2', isIcon: false },
+      { color: '#EED9BB', borderColor: '#C6A473', btColor: '#FFFBE8', isIcon: false },
+      { color: '#B3E2CB', borderColor: '#68AA8A', btColor: '#D5F2D8', isIcon: false },
+      { color: '#B3D0E2', borderColor: '#6090AE', btColor: '#E8F6FF', isIcon: false },
+    ],
+    currentBorder: '#EE6159',
+    nightColor: {
+      fontColor: '#666',
+      btColor: '#333',
+      color: '#1a1a1a'
+    },
+    currentColor: {
+      color: '#E6E6E6', btColor: '#F2F2F2', fontColor: '#1a1a1a'
+    }
+  },
+  computed: {
+    getImgUrl() {
+      return this.isNight == 'night' ? '../../assets/imgs/white_back.png' : '../../assets/imgs/black_back.png'
+    }
   },
   async onInit() {
-    await storage.set({ key: "send_order_id", value: this.send_order_id });
-    let s = (await storage.get({ key: "send_order_id" })).data;
+    if (this.send_order_id) {
+      await storage.set({ key: "send_order_id", value: this.send_order_id });
+    }
+    if(this.push_id){
+       await storage.set({ key: "push_id", value: this.push_id });
+    }
+    /* let s = (await storage.get({ key: "send_order_id" })).data;
     console.log("save send_order_id in storage");
     console.log("send_order_id", this.send_order_id);
-    console.log("storage send_order_id", s);
+    console.log("storage send_order_id", s); */
     await this.getChapters(this.bid, this.chapter_id);
-    // await this.addShelf();
+    let setting = (await storage.get({ key: "readSetting" })).data;
+    if (setting) {
+      let sets = JSON.parse(setting)
+      this.currentColor = sets;
+      this.isNight = sets.isNight;
+    }
+    let font = (await storage.get({ key: "readFont" })).data;
+    if (font) {
+      this.readFontSize = font;
+    }
+    userAddDsktop(this.$app.$def.data.backClickCount).then(res => {
+      //TODO 加桌后统计上报
+    }).catch(r => {
+      //TODO 失败后统计上报
+    });
+  },
+  backRouter() {
+    it.backCreateShortCut(res => {
+      if (res == 'back') router.back()
+    });
   },
-  onShow() {
+  async onShow() {
     it.getShortCut((value) => {
+      this.showSetting = false;
       this.showShortPop = !value;
+      this.hasShort = value;
     })
+    let params = {
+      bid: this.bid,
+      chapter_id: this.chapter_id,
+    }
+    await storage.set({ key: "lastCapter", value: JSON.stringify(params) });
+  },
+  stopPop(evt) {
+    evt.stopPropagation();
+    return;
+  },
+  showMore() {
+    this.showSetting = !this.showSetting;
+    if (this.showSetting) {
+      this.showShortPop = false;
+    } else {
+      if (!this.hasShort) this.showShortPop = true;
+    }
+  },
+
+  async changeFontSize(evt) {
+    this.readFontSize = evt.progress;
+    await storage.set({ key: "readFont", value: this.readFontSize });
+  },
+  async changeColor(item, type) {
+    if (type) {
+      if (type == 'sun') {
+        this.isNight = 'night';
+        this.currentColor = this.nightColor;
+        await storage.set({ key: "readSetting", value: JSON.stringify({ ...this.nightColor, isNight: 'night' }) });
+      } else {
+        this.isNight = 'sun';
+        this.currentColor = { color: '#E6E6E6', borderColor: '#CCC', btColor: '#F2F2F2', isIcon: false };
+        await storage.set({ key: "readSetting", value: JSON.stringify({ ...this.currentColor, isNight: 'sun' }) });
+      }
+    } else {
+      this.isNight = 'sun';
+      this.currentColor = {
+        color: item.color,
+        btColor: item.btColor,
+        fontColor: '#1a1a1a'
+      }
+      await storage.set({ key: "readSetting", value: JSON.stringify({ ...this.currentColor, isNight: 'sun' }) });
+    }
   },
   addShelf() {
     console.log("add shelf");
@@ -72,14 +199,22 @@ export default {
     })
   },
   shortEnd(value) {
+    if (value.detail.installed) {
+      this.showMustTost = false;
+      prompt.showToast({ message: "添加桌面成功!请前往任务中心领取奖励" });
+    }
     this.showShortPop = !value.detail.installed;
+    this.hasShort = value.detail.installed;
+
   },
   getChapters(bid, chapter_id) {
     this.showtoast = true
     console.log("router length:", router.getLength());
     getChapters({ bid: bid, chapter_id: chapter_id }).then(r => {
+      this.force_add_desk_type = r.force_add_desk_type;
       this.content = r.chapter_content.trim().split(/\n/)
-      this.bookinfo = r
+      this.bookinfo = r;
+      
       // this.$element('list').scrollTo({ index: 0 })
       this.addShelf();
       this.showtoast = false
@@ -97,7 +232,7 @@ export default {
           console.log('f code')
           console.log(f.data)
           this.showtoast = false
-          if (f.data.code == '10014' || f.data.code == '10015') {
+          if (f.data.code == '10014' || f.data.code == '10015' || f.data.code == '10016') {
             this.getChapters(bid, this.canReadecid)
             router.push({
               uri: "/views/Pay",
@@ -123,7 +258,8 @@ export default {
       }
     })
   },
-  toCatalog() {
+  toCatalog(evt) {
+    evt.stopPropagation();
     router.push({
       uri: "/views/Catalog",
       params: {
@@ -132,7 +268,8 @@ export default {
       }
     })
   },
-  getPrevChapter() {
+  getPrevChapter(evt) {
+    evt.stopPropagation();
     console.log("get prev chapter");
     if (this.bookinfo.prev_cid == 0) {
       return prompt.showToast({ message: '已经是第一章啦' });
@@ -146,8 +283,33 @@ export default {
       }
     })
   },
-  getNextChapter() {
-    console.log("get next chapter");
+  addDestop() {
+    it.mustCreateShort((res,code) => {
+      if (res) {
+        this.goNext();
+      }else{
+        prompt.showToast({ message: '开启加桌权限可以领取新人福利哟~' });
+      }
+    })
+  },
+  getNextChapter(evt) {
+    evt.stopPropagation();
+    let _this = this;
+    if (this.force_add_desk_type == 1) {
+      it.getShortCut(res => {
+        if (!res) { this.showMustTost = true; } else {
+          this.goNext();
+        }
+      })
+    } else if (this.force_add_desk_type == 2) {
+      it.loseLevelShortCut(res => {
+        this.goNext();
+      })
+    } else {
+      this.goNext();
+    }
+  },
+  goNext() {
     if (this.bookinfo.next_cid == 0) {
       router.push({
         uri: "/views/Raderover",
@@ -168,9 +330,18 @@ export default {
     })
   },
   onBackPress() {
-    if (router.getLength() === 1) {
-      router.replace({ uri: "/views/Index" });
-    }
+    it.backCreateShortCut(res => {
+      if (res == 'back') {
+        if (router.getLength() === 1) {
+          router.replace({ uri: "/views/Index" });
+          return true;
+        }else{
+           router.back()
+        }
+      }
+     
+    });
+    return true;
   }
 }
 </script>

+ 170 - 0
src/views/Search/index.ux

@@ -0,0 +1,170 @@
+<import name="x-book" src="../../components/book/book.ux"></import>
+<import name="x-loading" src="../../components/loading/loading.ux"></import>
+<template>
+	<div class="serch-wrap">
+		<div class="search-top">
+			<input type="text" id="search" class="serach-input" value="{{inputValue}}" @change="changeValue" enterkeytype="search" placeholder="请输入书名" @enterkeyclick="searchBook" style="placeholder-color:#D9D9D9"></input>
+		</div>
+		<div class="search-content" if="{{showHistory}}">
+			<div class="top-wrap">
+				<text>搜索历史</text>
+				<image src="../../assets/imgs/delete.png" @click="deleteHistory"></image>
+			</div>
+			<div class="history-list" if="{{historyList.length}}">
+				<text class="history-item" for={{historyList}} @click="serachItem($item)">
+					{{$item}}
+				</text>
+			</div>
+		</div>
+		<div class="search-content" if={{!list.length&&!showHistory}}>
+			<text class="isempty">{{loadingText}}</text>
+		</div>
+		<list class="list-content" @scrollbottom="onReachBottom" if={{list.length&&!showHistory}} id="list">
+			<list-item type="reslut">
+				<text class="reslut-title">为您搜索出以下内容</text>
+			</list-item>
+			<block for="list">
+				<list-item type="books-item" class="books-item__wrap {{$idx === 0 ? 'book-item__wrap--first' : ''}}">
+					<x-book multi="{{true}}" width="{{150}}" book="{{$item}}">
+						<div class="book-info">
+							<text class="name">{{$item.book_name}}</text>
+							<text class="intro">{{$item.book_summary}}</text>
+						</div>
+					</x-book>
+				</list-item>
+			</block>
+		</list>
+	</div>
+</template>
+<script>
+import { getBooksList } from "../../api";
+import { pageLoad } from "../../helper";
+import storage from '@system.storage';
+import prompt from '@system.prompt';
+
+export default {
+	private: {
+		inputValue: null,
+		showHistory: true,
+		meta: {},
+		empty: false,
+		list: [],
+		historyList: [],
+		loadingText: "努力搜索ing...",
+		filter: {
+			key: "",
+			page_size: 100,
+			page: 1,
+			status: 1,
+		},
+	},
+	computed: {
+
+	},
+	async onInit() {
+		let list = (await storage.get({ key: "history" })).data;
+		let sets = JSON.parse(list)
+		if (sets) this.historyList = sets;
+	},
+	searchBook(iptValue) {
+		if (!iptValue.value) {
+			prompt.showToast({ message: "请输入书名" });
+			return false;
+		}
+		this.filter.key = iptValue.value;
+		this.getBooksArray(false);
+		this.$element('search').focus({ focus: false });
+		this.showHistory = false;
+	},
+	serachItem(key) {
+		this.filter.key = key;
+		this.inputValue = key;
+		this.getBooksArray(false);
+		this.showHistory = false;
+	},
+	deleteHistory() {
+		let _self = this;
+		prompt.showDialog({
+			title: '重要提醒',
+			message: '确认要删除历史记录吗~',
+			buttons: [
+				{
+					text: '删除记录',
+					color: '#EF5952'
+				},
+				{
+					text: '我再想想',
+					color: '#999'
+				}
+			],
+			success: function (data) {
+				if (data.index === 0) {
+					storage.delete({
+						key: 'history',
+						success: function (data) {
+							_self.historyList = [];
+							_self.
+							prompt.showToast({ message: "删除成功" });
+						},
+					})
+				}
+
+			},
+			cancel: function () {
+				console.log('取消前往')
+			},
+		})
+	},
+	changeValue(text) {
+		if (!text.value) {
+			this.showHistory = true;
+		}
+	},
+	async getBooksArray(isLoad = true) {
+		this.empty = false;
+		this.loadingText = "加载ing...";
+		this.filter.page = (this.meta.current_page || 0) + 1;
+		if (!isLoad) {
+			this.filter.page = 1;
+			this.meta = {};
+		}
+		let params = this.filter;
+		console.log(params);
+		pageLoad(this.meta, getBooksList, params).then(ret => {
+			let newList = isLoad ? this.list : [];
+			let dataList = ret.list;
+			newList.push(...dataList);
+			this.meta = ret.meta;
+			this.list = newList;
+			if (!this.list.length) this.loadingText = "没有更多内容了", this.empty = true;
+			if (!isLoad) {
+				this.$element('list') && this.$element('list').scrollTo({ index: 0 });
+				if (this.filter.key && !this.historyList.includes(this.filter.key)) {
+					this.historyList.push(this.filter.key);
+					if (this.historyList.length > 10) {
+						this.historyList.shift()
+					}
+					storage.set({
+						key: 'history',
+						value: JSON.stringify(this.historyList),
+						success: function (data) {
+							console.log('handling success')
+						},
+					})
+				}
+			}
+		}).catch(e => {
+			console.log("e", e);
+		})
+	},
+	onReachBottom() {
+		// 请求更多数据
+		this.getBooksArray();
+	},
+}
+</script>
+<style lang="less">
+@import "../../assets/less/serach.less";
+</style>
+
+

+ 233 - 0
src/views/Task/index.ux

@@ -0,0 +1,233 @@
+
+<template>
+	<div class="task-page">
+		<div class="task-banner">
+			<div class="swiper-container">
+				<swiper class="swipe-bar" autoplay="true" indicator="false">
+					<block for="book in bannerList">
+						<div class="swipe-item">
+							<image class="cover" src="{{book.banner_url}}" @click="pageRouter(book)"></image>
+						</div>
+					</block>
+				</swiper>
+			</div>
+		</div>
+		<div class="sign-section">
+			<div class="sign-title" @click="showRules"><text>已连续签到{{signData.signDay}}天</text>
+				<image src="../../assets/imgs/question.png"></image>
+			</div>
+			<text class="sign-desc">连续签到可持续获得高额奖励</text>
+			<div class="sign-line">
+				<div class="sign-line__item" for="{{signList}}">
+					<text class="sign-line__day">{{$item.day}}天</text>
+					<image src="../../assets/imgs/sign_{{$item.iconType}}.jpg"></image>
+					<text class="sign-line__fee">{{$item.fee}}书币</text>
+				</div>
+			</div>
+			<text class="sign-button" @click="signToday" if="{{!signData.is_sign}}">
+				签到
+			</text>
+			<text class="sign-button-disabled" if="{{signData.is_sign}}">
+				已签到
+			</text>
+		</div>
+		<div class="task-section">
+			<div class="task-section__tab">
+				<text class="{{type=='new'?'on':''}}" @click="changeTab('new')">新手任务</text>
+				<text class="{{type=='day'?'on':''}}" @click="changeTab('day')">日常福利</text>
+			</div>
+			<div class="banner">
+				<image src="https://cdn-novel.iycdm.com/quickapp/task/day_task.png" show="{{type=='day'}}"></image>
+				<image src="https://cdn-novel.iycdm.com/quickapp/task/new_task.png" show="{{type=='new'}}"></image>
+			</div>
+			<div class="task-section__list">
+				<div class="list-item" for="{{currentList}}" @click="compeletTask($item.status,$item.type,$item.id,$item.path)">
+					<image src="{{$item.icon}}" class="icon" />
+					</image>
+					<div class="content">
+						<div><text>{{$item.name}}</text>
+							<div class="task-award">
+								<image src="{{$item.icon}}"></image><text>{{$item.value}}<text>
+							</div>
+						</div>
+						<text class="content-desc">{{$item.desc}}</text>
+					</div>
+					<text class="button-status {{ $item.status==0 ? 'wait': ($item.status==1 ? 'get' : 'disabled') }}">
+						{{$item.status==0?'去完成':$item.status==1?'领取':'已领取'}}
+					</text>
+				</div>
+			</div>
+		</div>
+		<div class="mask" show="{{showRule}}">
+			<div class="rule">
+				<text class="rule-title">签到规则</text>
+				<text class="detail">1.每7天为一个签到周期,用户连续签满7天,完成一个签到周期,下次签到重新计算签到周期 </text>
+				<text class="detail">2.用户连续签到获得的奖励更高,若中途漏签,则从第一天开始重新计算签到周期 </text>
+			</div>
+			<image src="../../assets/imgs/pop_close.png" class="close-icon" @click="closeRule"></image>
+		</div>
+		<div class="mask" if="{{SignSuccess}}">
+			<div class="sign-banner">
+				<text class="sign-banner__text"><span>获得</span><span class="orange">{{ currentFee}}</span><span>书币</span></text>
+			</div>
+			<image src="../../assets/imgs/pop_close.png" class="close-icon" @click="closeSign"></image>
+		</div>
+	</div>
+</template>
+<script>
+import { userTaskList, userAddDsktop, getTaskAward, getSignInfo, noVipSign, taskBook } from "../../api/index";
+import router from "@system.router";
+import shortcut from "@system.shortcut";
+import storage from "@system.storage";
+import prompt from '@system.prompt';
+export default {
+	public: {
+		push_id: ''
+	},
+	protected: {
+		signList: [
+		],
+		currentFee: 0,
+		signData: {},
+		showRule: false,
+		SignSuccess: false,
+		dayList: [],
+		newList: [],
+		type: 'new',
+		bannerList: [],
+		isClick: false,
+	},
+	computed: {
+		currentList() {
+			let curList = this.type == 'new' ? this.newList : this.dayList;
+			return curList;
+		},
+	},
+	async onInit() {
+		if (this.push_id) {
+			await storage.set({ key: "push_id", value: this.push_id });
+		}
+		this.getBook();
+		this.getSignList();
+	},
+	onShow() {
+		this.getTaskList();
+	},
+	async getBook() {
+		let bookList = await taskBook();
+		this.bannerList = bookList;
+	},
+	async getSignList() {
+		let signList = [];
+		let signData = await getSignInfo();
+		signData.reward_list.map((item, idx) => {
+			signList.push({ day: idx + 1, iconType: idx < signData.sign_day ? 'checked' : 'coin', fee: item })
+		})
+		signData.signDay = signData.sign_day;
+		this.currentFee = signData.reward_list[Number(signData.sign_day)];
+		this.signList = signList;
+		this.signData = signData;
+	},
+	async getTaskList() {
+		//每次展示刷新当前任务
+		let list = await userTaskList().catch((err) => { console.log(err) });
+		let dayList = list.date_tasks;
+		let newList = list.new_user_tasks;
+		//TODO数组处理
+		this.dayList = dayList;
+		this.newList = newList;
+	},
+	changeTab(type) {
+		this.type = type;
+	},
+	closeRule() {
+		this.showRule = false;
+	},
+	showRules() {
+		this.showRule = true;
+	},
+	signToday() {
+		noVipSign().then(res => {
+			this.signList[this.signData.sign_day].iconType = 'checked'
+			this.SignSuccess = true;
+			this.signData.signDay++;
+			this.signData.sign_day++;
+			this.signData.is_sign = true;
+			prompt.showToast("恭喜您签到成功!");
+		})
+	},
+	pageRouter(page) {
+		router.push({
+			uri: page.redirect_url,
+			params: {
+				bid: page.bid,
+				chapter_id: page.cid
+			}
+		})
+	},
+	closeSign() {
+		this.SignSuccess = false;
+	},
+	async compeletTask(status, type, id, path) {
+		if (this.isClick) return false;
+		this.isClick = true;
+		if (status == 2) {
+			this.isClick = false;
+			return false;
+		} else if (status == 0) {
+			this.isClick = false;
+			this.goTask(type, path)
+		} else {
+			let data = await getTaskAward(id);
+			this.getTaskList();
+			this.isClick = false;
+			prompt.showToast("领取成功!");
+		}
+		this.isClick = false;
+	},
+	goTask(type, path) {
+		let _self = this;
+		if (type == 'add_desk') {
+			shortcut.hasInstalled({
+				success: ret => {
+					if (!ret) {
+						shortcut.install({
+							message: "添加【追书云】到桌面,方便下次阅读",
+							success: () => {
+								prompt.showToast("添加成功!");
+								userAddDsktop(1).then(res => {
+									_self.getTaskList();
+								}).catch(r => {
+									//TODO 失败后统计上报
+								});
+
+							},
+							fail: code => {
+								console.log(code)
+							}
+						});
+					} else {
+						userAddDsktop(1).then(res => {
+							_self.getTaskList();
+						}).catch(r => {
+							//TODO 失败后统计上报
+						});
+					}
+				}
+			});
+
+		} else if (path && path != '') {
+			router.push({
+				uri: path
+			})
+		}
+
+	}
+
+}
+</script>
+<style lang="less">
+@import "../../assets/less/task.less";
+</style>
+
+

BIN
zhuishuyun_quickapp_front.rar