Compare commits

..

30 Commits

Author SHA1 Message Date
CPunisher 1897fc4473 feat: update title 2023-06-22 14:31:00 +08:00
CPunisher 3436431cfd revert: workflow 2023-06-22 01:56:54 +08:00
CPunisher 3e8ffb6963 chore: update GA 2023-06-22 01:51:54 +08:00
CPunisher d9581ddebf chore: update GA 2023-06-22 01:46:44 +08:00
倪豪 0b6cc8db7b
Update InputText.js 2023-06-20 19:13:35 +08:00
CPunisher 0341268305 feat: discord announcement 2023-06-20 18:44:40 +08:00
CPunisher f544d74c55 Merge branch 'master' of github.com:ciaochaos/qrbtf 2022-09-07 16:58:22 +08:00
CPunisher 3906c357f4 chore: change title and icp 2022-09-07 16:58:09 +08:00
CPunisher 7ee4b870c7
Merge pull request #31 from ciaochaos/dependabot/npm_and_yarn/url-parse-1.5.3
Bump url-parse from 1.4.7 to 1.5.3
2021-10-05 18:01:17 +08:00
dependabot[bot] c6a7dd0fb3
Bump url-parse from 1.4.7 to 1.5.3
Bumps [url-parse](https://github.com/unshiftio/url-parse) from 1.4.7 to 1.5.3.
- [Release notes](https://github.com/unshiftio/url-parse/releases)
- [Commits](https://github.com/unshiftio/url-parse/compare/1.4.7...1.5.3)

---
updated-dependencies:
- dependency-name: url-parse
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-10-05 10:00:54 +00:00
CPunisher e18f8733ce
Merge pull request #32 from ciaochaos/dependabot/npm_and_yarn/ws-5.2.3
Bump ws from 5.2.2 to 5.2.3
2021-10-05 17:59:57 +08:00
CPunisher f9dec20964
Merge pull request #33 from ciaochaos/dependabot/npm_and_yarn/color-string-1.6.0
Bump color-string from 1.5.3 to 1.6.0
2021-10-05 17:59:50 +08:00
dependabot[bot] af5f7c3d00
Bump color-string from 1.5.3 to 1.6.0
Bumps [color-string](https://github.com/Qix-/color-string) from 1.5.3 to 1.6.0.
- [Release notes](https://github.com/Qix-/color-string/releases)
- [Changelog](https://github.com/Qix-/color-string/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Qix-/color-string/commits/1.6.0)

---
updated-dependencies:
- dependency-name: color-string
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-10-05 09:59:32 +00:00
dependabot[bot] 6e85dfb234
Bump ws from 5.2.2 to 5.2.3
Bumps [ws](https://github.com/websockets/ws) from 5.2.2 to 5.2.3.
- [Release notes](https://github.com/websockets/ws/releases)
- [Commits](https://github.com/websockets/ws/compare/5.2.2...5.2.3)

---
updated-dependencies:
- dependency-name: ws
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-10-05 09:59:29 +00:00
CPunisher e1dec58b41
Merge pull request #19 from ciaochaos/dependabot/npm_and_yarn/elliptic-6.5.4
Bump elliptic from 6.5.3 to 6.5.4
2021-10-05 17:59:27 +08:00
CPunisher 87889f0a8c
Merge pull request #21 from ciaochaos/dependabot/npm_and_yarn/ssri-6.0.2
Bump ssri from 6.0.1 to 6.0.2
2021-10-05 17:59:19 +08:00
CPunisher 8e45d9ea19
Merge pull request #22 from ciaochaos/dependabot/npm_and_yarn/url-parse-1.5.1
Bump url-parse from 1.4.7 to 1.5.1
2021-10-05 17:59:12 +08:00
CPunisher 439ea70edf
Merge pull request #23 from ciaochaos/dependabot/npm_and_yarn/hosted-git-info-2.8.9
Bump hosted-git-info from 2.8.8 to 2.8.9
2021-10-05 17:59:03 +08:00
CPunisher e50f20bb71
Merge pull request #24 from ciaochaos/dependabot/npm_and_yarn/dns-packet-1.3.4
Bump dns-packet from 1.3.1 to 1.3.4
2021-10-05 17:58:56 +08:00
CPunisher 5b14a5967d
Merge pull request #25 from ciaochaos/dependabot/npm_and_yarn/merge-deep-3.0.3
Bump merge-deep from 3.0.2 to 3.0.3
2021-10-05 17:58:47 +08:00
CPunisher 34faf88333
Merge pull request #27 from ciaochaos/dependabot/npm_and_yarn/path-parse-1.0.7
Bump path-parse from 1.0.6 to 1.0.7
2021-10-05 17:58:36 +08:00
CPunisher 7ae7803c13
Merge pull request #29 from ciaochaos/dependabot/npm_and_yarn/tmpl-1.0.5
Bump tmpl from 1.0.4 to 1.0.5
2021-10-05 17:58:16 +08:00
dependabot[bot] d8c96ea7f3
Bump tmpl from 1.0.4 to 1.0.5
Bumps [tmpl](https://github.com/daaku/nodejs-tmpl) from 1.0.4 to 1.0.5.
- [Release notes](https://github.com/daaku/nodejs-tmpl/releases)
- [Commits](https://github.com/daaku/nodejs-tmpl/commits/v1.0.5)

---
updated-dependencies:
- dependency-name: tmpl
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-09-21 22:06:40 +00:00
dependabot[bot] fd117a87b7
Bump path-parse from 1.0.6 to 1.0.7
Bumps [path-parse](https://github.com/jbgutierrez/path-parse) from 1.0.6 to 1.0.7.
- [Release notes](https://github.com/jbgutierrez/path-parse/releases)
- [Commits](https://github.com/jbgutierrez/path-parse/commits/v1.0.7)

---
updated-dependencies:
- dependency-name: path-parse
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-08-12 11:56:06 +00:00
dependabot[bot] fdf0c72a01
Bump merge-deep from 3.0.2 to 3.0.3
Bumps [merge-deep](https://github.com/jonschlinkert/merge-deep) from 3.0.2 to 3.0.3.
- [Release notes](https://github.com/jonschlinkert/merge-deep/releases)
- [Commits](https://github.com/jonschlinkert/merge-deep/compare/3.0.2...3.0.3)

---
updated-dependencies:
- dependency-name: merge-deep
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-06-08 10:30:57 +00:00
dependabot[bot] a974888de4
Bump dns-packet from 1.3.1 to 1.3.4
Bumps [dns-packet](https://github.com/mafintosh/dns-packet) from 1.3.1 to 1.3.4.
- [Release notes](https://github.com/mafintosh/dns-packet/releases)
- [Changelog](https://github.com/mafintosh/dns-packet/blob/master/CHANGELOG.md)
- [Commits](https://github.com/mafintosh/dns-packet/compare/v1.3.1...v1.3.4)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-28 18:22:35 +00:00
dependabot[bot] af2c831215
Bump hosted-git-info from 2.8.8 to 2.8.9
Bumps [hosted-git-info](https://github.com/npm/hosted-git-info) from 2.8.8 to 2.8.9.
- [Release notes](https://github.com/npm/hosted-git-info/releases)
- [Changelog](https://github.com/npm/hosted-git-info/blob/v2.8.9/CHANGELOG.md)
- [Commits](https://github.com/npm/hosted-git-info/compare/v2.8.8...v2.8.9)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-11 18:30:50 +00:00
dependabot[bot] 568e72c198
Bump url-parse from 1.4.7 to 1.5.1
Bumps [url-parse](https://github.com/unshiftio/url-parse) from 1.4.7 to 1.5.1.
- [Release notes](https://github.com/unshiftio/url-parse/releases)
- [Commits](https://github.com/unshiftio/url-parse/compare/1.4.7...1.5.1)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-09 19:59:28 +00:00
dependabot[bot] 53dff69d9a
Bump ssri from 6.0.1 to 6.0.2
Bumps [ssri](https://github.com/npm/ssri) from 6.0.1 to 6.0.2.
- [Release notes](https://github.com/npm/ssri/releases)
- [Changelog](https://github.com/npm/ssri/blob/v6.0.2/CHANGELOG.md)
- [Commits](https://github.com/npm/ssri/compare/v6.0.1...v6.0.2)

Signed-off-by: dependabot[bot] <support@github.com>
2021-04-19 22:21:26 +00:00
dependabot[bot] cdb606b153
Bump elliptic from 6.5.3 to 6.5.4
Bumps [elliptic](https://github.com/indutny/elliptic) from 6.5.3 to 6.5.4.
- [Release notes](https://github.com/indutny/elliptic/releases)
- [Commits](https://github.com/indutny/elliptic/compare/v6.5.3...v6.5.4)

Signed-off-by: dependabot[bot] <support@github.com>
2021-03-10 19:17:46 +00:00
34 changed files with 234 additions and 657 deletions

View File

@ -34,4 +34,4 @@ jobs:
secret_id: ${{ secrets.SECRET_ID }}
secret_key: ${{ secrets.SECRET_KEY }}
bucket: ${{ secrets.BUCKET }}
region: ap-shanghai
region: ap-shanghai

View File

@ -1,15 +0,0 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="HtmlUnknownAttribute" enabled="true" level="WARNING" enabled_by_default="true">
<option name="myValues">
<value>
<list size="1">
<item index="0" class="java.lang.String" itemvalue="p-id" />
</list>
</value>
</option>
<option name="myCustomValuesEnabled" value="true" />
</inspection_tool>
</profile>
</component>

View File

@ -1 +0,0 @@
[0113/225246.323:ERROR:directory_reader_win.cc(43)] FindFirstFile: 系统找不到指定的路径。 (0x3)

116
package-lock.json generated
View File

@ -3598,9 +3598,9 @@
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
},
"color-string": {
"version": "1.5.3",
"resolved": "https://registry.npm.taobao.org/color-string/download/color-string-1.5.3.tgz",
"integrity": "sha1-ybvF8BtYtUkvPWhXRZy2WQziBMw=",
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/color-string/-/color-string-1.6.0.tgz",
"integrity": "sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA==",
"requires": {
"color-name": "^1.0.0",
"simple-swizzle": "^0.2.2"
@ -4445,9 +4445,9 @@
"integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0="
},
"dns-packet": {
"version": "1.3.1",
"resolved": "https://registry.npm.taobao.org/dns-packet/download/dns-packet-1.3.1.tgz",
"integrity": "sha1-EqpCaYEHW+UAuRDu3NC0fdfe2lo=",
"version": "1.3.4",
"resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz",
"integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==",
"requires": {
"ip": "^1.1.0",
"safe-buffer": "^5.0.1"
@ -4625,17 +4625,24 @@
"integrity": "sha1-1zAd6eQN+DpA/h9RtEY8/hcNEVM="
},
"elliptic": {
"version": "6.5.3",
"resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz",
"integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==",
"version": "6.5.4",
"resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz",
"integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==",
"requires": {
"bn.js": "^4.4.0",
"brorand": "^1.0.1",
"bn.js": "^4.11.9",
"brorand": "^1.1.0",
"hash.js": "^1.0.0",
"hmac-drbg": "^1.0.0",
"inherits": "^2.0.1",
"minimalistic-assert": "^1.0.0",
"minimalistic-crypto-utils": "^1.0.0"
"hmac-drbg": "^1.0.1",
"inherits": "^2.0.4",
"minimalistic-assert": "^1.0.1",
"minimalistic-crypto-utils": "^1.0.1"
},
"dependencies": {
"bn.js": {
"version": "4.12.0",
"resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
"integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="
}
}
},
"emoji-regex": {
@ -6222,9 +6229,9 @@
}
},
"hosted-git-info": {
"version": "2.8.8",
"resolved": "https://registry.npm.taobao.org/hosted-git-info/download/hosted-git-info-2.8.8.tgz",
"integrity": "sha1-dTm9S8Hg4KiVgVouAmJCCxKFhIg="
"version": "2.8.9",
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
"integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw=="
},
"hpack.js": {
"version": "2.1.6",
@ -7163,9 +7170,9 @@
}
},
"ws": {
"version": "6.2.1",
"resolved": "https://registry.npm.taobao.org/ws/download/ws-6.2.1.tgz",
"integrity": "sha1-RC/fCkftZPWbal2P8TD0dI7VJPs=",
"version": "6.2.2",
"resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz",
"integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==",
"requires": {
"async-limiter": "~1.0.0"
}
@ -8534,9 +8541,9 @@
}
},
"merge-deep": {
"version": "3.0.2",
"resolved": "https://registry.npm.taobao.org/merge-deep/download/merge-deep-3.0.2.tgz",
"integrity": "sha1-85+hAKTxvTT/KffSv0UI+7jYOtI=",
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.3.tgz",
"integrity": "sha512-qtmzAS6t6grwEkNrunqTBdn0qKwFgNWvlxUbAV8es9M7Ot1EbyApytCnvE0jALPa46ZpKDUo527kKiaWplmlFA==",
"requires": {
"arr-union": "^3.1.0",
"clone-deep": "^0.2.4",
@ -9501,9 +9508,9 @@
"integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A="
},
"path-parse": {
"version": "1.0.6",
"resolved": "https://registry.npm.taobao.org/path-parse/download/path-parse-1.0.6.tgz",
"integrity": "sha1-1i27VnlAXXLEc37FhgDp3c8G0kw="
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
},
"path-to-regexp": {
"version": "0.1.7",
@ -11931,9 +11938,12 @@
}
},
"serialize-javascript": {
"version": "2.1.2",
"resolved": "https://registry.npm.taobao.org/serialize-javascript/download/serialize-javascript-2.1.2.tgz?cache=0&sync_timestamp=1581860621656&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fserialize-javascript%2Fdownload%2Fserialize-javascript-2.1.2.tgz",
"integrity": "sha1-7OxTsOAxe9yV73arcHS3OEeF+mE="
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz",
"integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==",
"requires": {
"randombytes": "^2.1.0"
}
},
"serve-index": {
"version": "1.9.1",
@ -12424,8 +12434,8 @@
},
"ssri": {
"version": "7.1.0",
"resolved": "https://registry.npm.taobao.org/ssri/download/ssri-7.1.0.tgz",
"integrity": "sha1-ksJBv23oI2W1x/tL126XVSLhKU0=",
"resolved": "https://registry.npmjs.org/ssri/-/ssri-7.1.0.tgz",
"integrity": "sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g==",
"requires": {
"figgy-pudding": "^3.5.1",
"minipass": "^3.1.1"
@ -12978,6 +12988,11 @@
"find-up": "^4.0.0"
}
},
"serialize-javascript": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz",
"integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ=="
},
"supports-color": {
"version": "7.1.0",
"resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-7.1.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-7.1.0.tgz",
@ -13079,9 +13094,9 @@
}
},
"tmpl": {
"version": "1.0.4",
"resolved": "https://registry.npm.taobao.org/tmpl/download/tmpl-1.0.4.tgz",
"integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE="
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
"integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw=="
},
"to-arraybuffer": {
"version": "1.0.1",
@ -13368,9 +13383,9 @@
}
},
"url-parse": {
"version": "1.4.7",
"resolved": "https://registry.npm.taobao.org/url-parse/download/url-parse-1.4.7.tgz",
"integrity": "sha1-qKg1NejACjFuQDpdtKwbm4U64ng=",
"version": "1.5.3",
"resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.3.tgz",
"integrity": "sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ==",
"requires": {
"querystringify": "^2.1.1",
"requires-port": "^1.0.0"
@ -14171,9 +14186,9 @@
}
},
"ssri": {
"version": "6.0.1",
"resolved": "https://registry.npm.taobao.org/ssri/download/ssri-6.0.1.tgz",
"integrity": "sha1-KjxBso3UW2K2Nnbst0ABJlrp7dg=",
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz",
"integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==",
"requires": {
"figgy-pudding": "^3.5.1"
}
@ -14192,6 +14207,13 @@
"terser": "^4.1.2",
"webpack-sources": "^1.4.0",
"worker-farm": "^1.7.0"
},
"dependencies": {
"serialize-javascript": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz",
"integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ=="
}
}
}
}
@ -14988,9 +15010,9 @@
}
},
"ws": {
"version": "6.2.1",
"resolved": "https://registry.npm.taobao.org/ws/download/ws-6.2.1.tgz",
"integrity": "sha1-RC/fCkftZPWbal2P8TD0dI7VJPs=",
"version": "6.2.2",
"resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz",
"integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==",
"requires": {
"async-limiter": "~1.0.0"
}
@ -15360,9 +15382,9 @@
}
},
"ws": {
"version": "5.2.2",
"resolved": "https://registry.npm.taobao.org/ws/download/ws-5.2.2.tgz",
"integrity": "sha1-3/7xSGa46NyRM1glFNG++vlumA8=",
"version": "5.2.3",
"resolved": "https://registry.npmjs.org/ws/-/ws-5.2.3.tgz",
"integrity": "sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA==",
"requires": {
"async-limiter": "~1.0.0"
}

View File

@ -7,7 +7,6 @@
"@testing-library/react": "^9.3.2",
"@testing-library/user-event": "^7.1.2",
"jsqr": "^1.3.1",
"jszip": "^3.7.1",
"medium-zoom": "^1.0.5",
"prop-types": "^15.7.2",
"react": "^16.13.1",
@ -17,7 +16,6 @@
"react-github-btn": "^1.2.0",
"react-indiana-drag-scroll": "^1.6.1",
"react-lazy-load": "^3.0.13",
"react-modal": "^3.12.1",
"react-redux": "^7.2.0",
"react-scripts": "3.4.1",
"redux": "^4.0.5",

View File

@ -2,15 +2,15 @@
<html lang="zh">
<head>
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-165845289-1"></script>
<script data-ad-client="ca-pub-3611009408282658" async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-XKEWNQ1T0E"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-165845289-1');
gtag('config', 'G-3NKS6ZG27V');
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-165845289-1');
gtag('config', 'G-XKEWNQ1T0E');
</script>
<script>
(function(){
@ -53,7 +53,7 @@
work correctly both with client-side routing and a non-root public URL.
Learn how to configure a non-root public URL by running `npm run build`.
-->
<title>QRBTF 参数化二维码生成器</title>
<title>QRBTF Classic</title>
</head>
<body>
<noscript>You need to enable JavaScript to run this app.</noscript>

View File

@ -1,25 +1,16 @@
import {actionTypes} from "../constant/ActionTypes";
import {handleStyle} from "../utils/gaHelper";
export const genQRInfo = text => {
if (Array.isArray(text)) {
return {
type: actionTypes.GENERATE_QR_INFO,
text: text[0],
textArray: text
}
}
return {
type: actionTypes.GENERATE_QR_INFO,
text
}
}
export const genQRInfo = text => ({
type: actionTypes.GENERATE_QR_INFO,
text
})
export const changeStyle = (rendererIndex, value) => {
export const changeStyle = (rendererIndex, rendererType, value) => {
handleStyle(value);
return {
type: actionTypes.CHANGE_STYLE,
rendererIndex, value
rendererIndex, rendererType, value
}
}

View File

@ -318,7 +318,7 @@ td {
.Qr-input-upload {
display: flex;
max-width: calc(100vw - 46px);
width: 22em;
width: 20em;
}
.Qr-input-upload-div {
@ -349,8 +349,17 @@ td {
transition-duration: 0.3s;
}
.Qr-new-discord {
font-size: 12px;
position: absolute;
left: 0;
bottom: -54px;
font-weight: bold;
text-decoration: underline;
}
@media (min-width: 500px) {
.Qr-input-hint {
.Qr-input-hint, .Qr-new-discord {
margin-top: 14px;
font-size: 14px;
}
@ -360,7 +369,7 @@ td {
height: calc(2em + 6px);
font-size: calc(10px + 2vmin);
border: var(--border-color) solid 2px;
margin: 0 10px;
margin-left: 10px;
flex: 1;
}
@ -372,7 +381,6 @@ td {
.Qr-upload {
color: var(--upload-color);
fill: var(--upload-color);
font-size: calc(10px + 2vmin);
border: var(--border-color) solid 2px;
width: calc(2em + 6px)!important;
@ -410,7 +418,6 @@ td {
.Qr-upload:hover {
border-color: var(--border-color-focus);
color: var(--border-color-focus);
fill: var(--border-color-focus);
}
.Qr-upload:active {
@ -419,7 +426,6 @@ td {
-moz-transition-duration: 0s;
border-color: #3BBC9F;
color: #3BBC9F;
fill: #3BBC9F;
}
.Qr-upload-svg {

View File

@ -24,7 +24,7 @@ ReactGA.addTrackers(
}
},
{
trackingId: 'G-3NKS6ZG27V',
trackingId: 'G-XKEWNQ1T0E',
gaOptions: { name: 'trackerG' }
}
],

View File

@ -2,7 +2,6 @@ import React, {useState} from 'react';
import './App.css';
import PropTypes from 'prop-types';
import {isWeiXin} from "../../utils/navigatorUtils";
import PresetModalViewer from "../../containers/preset/PresetModalViewer";
const CountComponent = ({ value }) => {
if (isNaN(value)) return null;
@ -35,31 +34,24 @@ const ImgBox = ({ imgData }) => {
return null
}
const PartDownload = ({ value, batchMode, downloadCount, onSvgDownload, onImgDownload, savePreset }) => {
const PartDownload = ({ value, downloadCount, onSvgDownload, onImgDownload }) => {
const [imgData, setImgData] = useState('');
const [visible, setVisible] = useState(false);
return (
<div className="Qr-titled">
<div className="Qr-Centered title-margin">
<div className="Qr-s-title">Downloads</div>
<p className="Qr-s-subtitle">
<span>下载二维码</span>
<span>({batchMode ? "批量模式" : "单文件模式"})</span>
<span> {value}</span>
<span>下载二维码 {value}</span>
<CountComponent value={downloadCount} />
</p>
</div>
<div className="Qr-Centered">
<PresetModalViewer visible={visible} onClose={() => setVisible(false)} />
<div className="btn-row">
<div className="div-btn img-dl-btn">
<button className="dl-btn" onClick={() => {onImgDownload("jpg").then(res => setImgData(res));}}>JPG</button>
<button className="dl-btn" onClick={() => {onImgDownload("png").then(res => setImgData(res));}}>PNG</button>
<button className="dl-btn" onClick={onSvgDownload}>SVG</button>
<button className="dl-btn" onClick={() => setVisible(true)}>管理预设</button>
<button className="dl-btn" onClick={savePreset}>保存预设</button>
</div>
</div>
<div id="wx-message">

View File

@ -90,7 +90,7 @@ const PartFooter = () => (
<div className="Gray">
Copyright © {currentYear} QRBTF. 保留所有权利<br/>
<LinkTrace href="http://www.beian.miit.gov.cn/"
<LinkTrace href="https://beian.miit.gov.cn/"
rel="noopener noreferrer" target="_blank">
ICP 19005869

View File

@ -51,7 +51,6 @@ const PartMore = () => {
</ScrollContainer>
<div className="Qr-Centered">
<h2>最新消息</h2>
<p><b>2021.10.5</b><br/>新增批量生成二维码</p>
<p><b>2020.9.1</b><br/>新增 C3 样式图标插入 PNG 下载</p>
<p><b>2020.6.29</b><br/>新的反馈渠道我们开始征集好玩的二维码设计啦可以是推送尾图海报等等快来上传吧<LinkTrace
href='https://qrbtf-com.mikecrm.com/J2wjEEq' rel="noopener noreferrer"

View File

@ -1,4 +1,5 @@
import React from 'react';
import PropTypes from 'prop-types'
import '../Qrcode.css';
const FrameworkParam = ({ paramName, children, ...other }) => (

View File

@ -9,7 +9,7 @@ const IconParams = ({ icon, onBlur, onKeyPress }) => {
const { enabled, src, scale } = icon;
const components = [];
if (getExactValue(enabled, 0) === 1) {
if (getExactValue(enabled, 0) == 1) {
components.push(
<FrameworkParam paramName={"图标源"}>
<ParamIconSrcViewer icon={icon} onChange={onBlur}/>
@ -17,7 +17,7 @@ const IconParams = ({ icon, onBlur, onKeyPress }) => {
);
}
if (getExactValue(enabled, 0) !== 0) {
if (getExactValue(enabled, 0) != 0) {
components.push(
<FrameworkParam paramName={"图标缩放"}>
<input
@ -38,7 +38,7 @@ const ParamIcon = ({icon, onBlur, onKeyPress}) => (
<FrameworkParam paramName={"图标"}>
<select
className="Qr-select"
value={icon.enabled}
defaultValue={icon.enabled}
onChange={(e) => onBlur({...icon, enabled: e.target.value})}>
<option value={0}></option>
<option value={1}>自定义</option>

View File

@ -1,29 +0,0 @@
.ReactModal__Overlay {
opacity: 0;
transition: opacity 100ms ease-in-out;
}
.ReactModal__Overlay--after-open{
opacity: 1;
}
.ReactModal__Overlay--before-close{
opacity: 0;
}
.Qr-preset-container {
width: 100%;
height: 100%;
display: flex;
}
.Qr-preset-side {
width: 70%;
height: 100%;
padding-top: 10px;
}
.Qr-preset-detail {
width: 40%;
height: 100%;
}

View File

@ -1,26 +0,0 @@
import React from "react";
import PropTypes from 'prop-types';
const PresetCard = ({ preset }) => (
<div className="Qr-Centered">
<div className="Qr-item-image">
<div className="Qr-item-image-inner">
<img id="dl-image-inner-jpg" src={preset.preview}/>
</div>
</div>
<div className="Qr-item-detail">
{preset.name}
</div>
</div>
);
PresetCard.propTypes = {
preset: PropTypes.shape({
name: PropTypes.string.isRequired,
styleName: PropTypes.string.isRequired,
preview: PropTypes.string.isRequired,
params: PropTypes.array.isRequired,
})
}
export default PresetCard;

View File

@ -1,49 +0,0 @@
import React from "react";
import PropTypes from 'prop-types';
const ParamLabel = ({ params, label }) => (
params.map((param, index) => {
if (param.value.length > 30) return null;
return (
<table key={label + '_' + index} className="Qr-table">
<tbody>
<tr>
<td>{param.name}</td>
<td>{param.value}</td>
</tr>
</tbody>
</table>
)
})
)
const PresetDetail = ({ preset }) => (
<div className="Qr-Centered">
<div id="dl-image">
<div id="dl-image-inner">
<img id="dl-image-inner-jpg" src={preset.preview}/>
</div>
</div>
<div>
<table className="Qr-table">
<tbody><tr>
<td>样式名</td>
<td>{preset.styleName}</td>
</tr></tbody>
</table>
<ParamLabel params={preset.params} label="preset_param"/>
</div>
</div>
);
PresetDetail.propTypes = {
preset: PropTypes.shape({
name: PropTypes.string.isRequired,
styleName: PropTypes.string.isRequired,
preview: PropTypes.string.isRequired,
globalParams: PropTypes.array.isRequired,
params: PropTypes.array.isRequired,
})
}
export default PresetDetail;

View File

@ -1,80 +0,0 @@
import React, {useState} from "react";
import Modal from "react-modal";
import './Preset.css';
import PropTypes from 'prop-types'
import PresetCard from "./PresetCard";
import PresetDetail from "./PresetDetail";
import ScrollContainer from "react-indiana-drag-scroll";
import {getPresets, removePreset} from "../../utils/storageUtils";
function calClassName(selected) {
if (selected === true) return 'Qr-item Qr-item-selected';
return 'Qr-item';
}
const customStyles = {
content: {
inset: '40px 60px 40px 60px',
}
}
const PresetModal = ({ visible, onClose, loadPreset }) => {
const storedPresets = getPresets();
const [selected, setSelected] = useState(0);
const [presets, setPresets] = useState(storedPresets);
if (presets.length !== storedPresets.length) setPresets(storedPresets);
return (
<Modal
appElement={document.getElementById("root")}
closeTimeoutMS={100}
isOpen={visible}
onRequestClose={onClose}
style={customStyles}>
<div className="Qr-preset-container">
<ScrollContainer
className="Qr-div-table Qr-preset-side"
vertical={true}
horizontal={false}
hideScrollbars={false}>
{
presets.map((preset, index) => (
<div
key={'preset_' + index}
className={calClassName(selected === index)}
onClick={() => setSelected(index)}>
<PresetCard preset={preset}/>
</div>
))
}
</ScrollContainer>
<div className="Qr-preset-detail">
{presets[selected] ? <PresetDetail preset={presets[selected]}/> : null}
<div>
<button className="dl-btn" onClick={() => {
if (presets[selected]) {
loadPreset(presets[selected]);
onClose();
}
}}>加载预设</button>
<button className="dl-btn" onClick={() => {
if (presets[selected]) {
removePreset(selected);
setPresets(getPresets())
}
}}>删除预设</button>
<button className="dl-btn" onClick={onClose}>取消</button>
</div>
</div>
</div>
</Modal>
);
};
PresetModal.propTypes = {
visible: PropTypes.bool,
onClose: PropTypes.func.isRequired,
presetArray: PropTypes.array.isRequired,
loadPreset: PropTypes.func.isRequired,
}
export default PresetModal;

View File

@ -34,13 +34,13 @@ function listPoints({ qrcode, params, icon }) {
if (qrcode.isDark(x, y) === false) continue;
else if (typeTable[x][y] === QRPointType.POS_OTHER || typeTable[x][y] === QRPointType.POS_CENTER) {
pointList.push(<rect width={size2} height={size2} key={id++} fill={upColor} x={x + (1 - size2)/2} y={y + (1 - size2)/2} transform={matrixString}/>);
pointList.push(<rect width={height2} height={size2} key={id++} fill={leftColor} x={0} y={0} transform={`${matrixString} translate(${x + (1 - size2)/2 + size2}, ${y + (1 - size2)/2}) skewY(45)`}/>);
pointList.push(<rect width={size2} height={height2} key={id++} fill={rightColor} x={0} y={0} transform={`${matrixString} translate(${x + (1 - size2)/2}, ${y + size2 + (1 - size2)/2}) skewX(45)`}/>);
pointList.push(<rect width={height2} height={size2} key={id++} fill={leftColor} x={0} y={0} transform={matrixString+'translate('+String(x + (1 - size2)/2 + size2)+','+String(y + (1 - size2)/2)+') '+'skewY(45) '}/>);
pointList.push(<rect width={size2} height={height2} key={id++} fill={rightColor} x={0} y={0} transform={matrixString+'translate('+String(x + (1 - size2)/2)+','+String(y + size2 + (1 - size2)/2)+') '+'skewX(45) '}/>);
}
else {
pointList.push(<rect width={size} height={size} key={id++} fill={upColor} x={x + (1 - size)/2} y={y + (1 - size)/2} transform={matrixString}/>);
pointList.push(<rect width={height} height={size} key={id++} fill={leftColor} x={0} y={0} transform={`${matrixString} translate(${x + (1 - size)/2 + size}, ${y + (1 - size)/2}) skewY(45)`}/>);
pointList.push(<rect width={size} height={height} key={id++} fill={rightColor} x={0} y={0} transform={`${matrixString} translate(${x + (1 - size)/2}, ${y + size + (1 - size)/2}) skewX(45)`}/>);
pointList.push(<rect width={height} height={size} key={id++} fill={leftColor} x={0} y={0} transform={matrixString+'translate('+String(x + (1 - size)/2 + size)+','+String(y + (1 - size)/2)+') '+'skewY(45) '}/>);
pointList.push(<rect width={size} height={height} key={id++} fill={rightColor} x={0} y={0} transform={matrixString+'translate('+String(x + (1 - size)/2)+','+String(y + size + (1 - size)/2)+') '+'skewX(45) '}/>);
}
}
}
@ -100,14 +100,13 @@ let defaultDrawIcon = function ({ qrcode, params, title, icon }) {
const randomIdClips = getIdNum();
pointList.push(
<g transform={matrixString}>
<path d={sq25} stroke="#FFF" strokeWidth={100/iconSize * 1} fill="#FFF" transform={`translate(${iconXY}, ${iconXY}) scale(${iconSize / 100}, ${iconSize / 100})`} />
<path d={sq25} stroke="#FFF" strokeWidth={100/iconSize * 1} fill="#FFF" transform={'translate('+String(iconXY)+','+String(iconXY)+') ' + 'scale(' + String(iconSize/100) + ',' + String(iconSize/100) + ')'} />
</g>
);
pointList.push(
<g key={id++} transform={matrixString}>
<defs>
<path id={"defs-path" + randomIdDefs} d={sq25} fill="#FFF" transform={`translate(${iconXY}, ${iconXY}) scale(${iconSize / 100}, ${iconSize / 100})`} />
</defs>
<path id={"defs-path" + randomIdDefs} d={sq25} fill="#FFF" transform={'translate('+String(iconXY)+','+String(iconXY)+') ' + 'scale(' + String(iconSize/100) + ',' + String(iconSize/100) + ')'} /> </defs>
<clipPath id={"clip-path" + randomIdClips}>
<use xlinkHref={"#defs-path" + randomIdDefs} overflow="visible"/>
</clipPath>
@ -185,19 +184,18 @@ let builtinDrawIcon = function ({ qrcode, params, title, icon }) {
const randomIdClips = getIdNum();
pointList.push(
<g transform={matrixString}>
<path d={sq25} stroke="#FFF" strokeWidth={100/iconSize * 1} fill="#FFF" transform={`translate(${iconXY}, ${iconXY}) scale(${iconSize / 100}, ${iconSize / 100})`} />
<path d={sq25} stroke="#FFF" strokeWidth={100/iconSize * 1} fill="#FFF" transform={'translate('+String(iconXY)+','+String(iconXY)+') ' + 'scale(' + String(iconSize/100) + ',' + String(iconSize/100) + ')'} />
</g>
);
pointList.push(
<g key={id++} transform={matrixString}>
<defs>
<path id={"defs-path" + randomIdDefs} d={sq25} fill="#FFF" transform={`translate(${iconXY}, ${iconXY}) scale(${iconSize / 100}, ${iconSize / 100})`} />
</defs>
<path id={"defs-path" + randomIdDefs} d={sq25} fill="#FFF" transform={'translate('+String(iconXY)+','+String(iconXY)+') ' + 'scale(' + String(iconSize/100) + ',' + String(iconSize/100) + ')'} /> </defs>
<clipPath id={"clip-path" + randomIdClips}>
<use xlinkHref={"#defs-path" + randomIdDefs} overflow="visible"/>
</clipPath>
<g clipPath={"url(#clip-path" + randomIdClips + ")"}>
<g transform={`translate(${iconXY}, ${iconXY}) scale(${iconSize / 100}, ${iconSize / 100})`} >
<g transform={'translate('+String(iconXY)+','+String(iconXY)+') ' + 'scale(' + String(iconSize/100) + ',' + String(iconSize/100) + ')'} >
{builtinIcon()}
</g>
</g>

View File

@ -1,7 +1,7 @@
import React from "react";
import {ParamTypes} from "../../constant/ParamTypes";
import {getTypeTable, QRPointType} from "../../utils/qrcodeHandler";
import {createRenderer} from "../style/Renderer";
import {createRenderer, defaultDrawIcon} from "../style/Renderer";
import {getExactValue, rand} from "../../utils/util";
import LinkTrace from "../link/LinkTrace";
@ -14,7 +14,7 @@ function listPoints({ qrcode, params, icon }) {
const {src, scale} = icon;
const iconSize = Number(nCount * (scale > .33 ? .33 : scale));
// const iconXY = (nCount - iconSize) / 2;
const iconXY = (nCount - iconSize) / 2;
function nearIcon(x, y) {
return Math.pow((nCount - 1) / 2 - x, 2) + Math.pow((nCount - 1) / 2 - y, 2) < Math.pow(iconSize / 2, 2);
@ -67,7 +67,7 @@ function listPoints({ qrcode, params, icon }) {
}
} else if (posType === 3) {
pointList.push(<circle key={id++} fill={posColor} cx={x + 0.5} cy={y + 0.5} r={1.5} />)
pointList.push(<path key={id++} d={sq25} stroke={posColor} strokeWidth={100/6 * (1 - (1 - size) * 0.75)} fill="none" transform={`translate(${x - 2.5}, ${y - 2.5}) scale(0.06, 0.06)`} />)
pointList.push(<path key={id++} d={sq25} stroke={posColor} strokeWidth={100/6 * (1 - (1 - size) * 0.75)} fill="none" transform={'translate('+String(x - 2.5)+','+String(y - 2.5)+') ' + 'scale(' + String(6/100) + ',' + String(6/100) + ')'} />)
}
}
else if (typeTable[x][y] === QRPointType.POS_OTHER) {

View File

@ -51,7 +51,7 @@ function listPoints({ qrcode, params, icon }) {
}
} else if (posType === 3) {
pointList.push(<circle key={id++} fill={posColor} cx={x + 0.5} cy={y + 0.5} r={1.5} />)
pointList.push(<path key={id++} d={sq25} stroke={posColor} strokeWidth={100/6 * (1 - (1 - 0.8) * 0.75)} fill="none" transform={`translate(${x - 2.5}, ${y - 2.5}) scale(0.06, 0.06)`} />)
pointList.push(<path key={id++} d={sq25} stroke={posColor} strokeWidth={100/6 * (1 - (1 - 0.8) * 0.75)} fill="none" transform={'translate('+String(x - 2.5)+','+String(y - 2.5)+') ' + 'scale(' + String(6/100) + ',' + String(6/100) + ')'} />)
}
}
else if (qrcode.isDark(x, y) && typeTable[x][y] === QRPointType.POS_OTHER) {
@ -76,7 +76,7 @@ function listPoints({ qrcode, params, icon }) {
if (funcType === 1) {
let sizeF = 0
let colorF = otherColor
// let fillF = colorF
let fillF = colorF
let opacityF = Number(qrcode.isDark(x, y));
if (dist > 5/20 && dist < 8/20) {
sizeF = 5/10

View File

@ -58,7 +58,7 @@ function listPoints({ qrcode, params, icon }) {
}
} else if (posType === 3) {
pointList.push(<circle key={id++} fill={posColor} cx={x + 0.5} cy={y + 0.5} r={1.5} />)
pointList.push(<path key={id++} d={sq25} stroke={posColor} strokeWidth={100/6 * (1 - (1 - size) * 0.75)} fill="none" transform={`translate(${x - 2.5}, ${y - 2.5}) scale(0.06, 0.06)`}/>)
pointList.push(<path key={id++} d={sq25} stroke={posColor} strokeWidth={100/6 * (1 - (1 - size) * 0.75)} fill="none" transform={'translate('+String(x - 2.5)+','+String(y - 2.5)+') ' + 'scale(' + String(6/100) + ',' + String(6/100) + ')'} />)
}
}
else if (typeTable[x][y] === QRPointType.POS_OTHER) {

View File

@ -7,6 +7,7 @@ import {getExactValue, getIdNum} from "../../utils/util";
function listPoints({ qrcode, params, icon }) {
if (!qrcode) return []
console.log(icon)
const nCount = qrcode.getModuleCount();
const typeTable = getTypeTable(qrcode);
const pointList = new Array(nCount);
@ -174,13 +175,11 @@ let defaultDrawIcon = function ({ qrcode, params, title, icon }) {
if (icon && iconEnabled) {
const randomIdDefs = getIdNum();
const randomIdClips = getIdNum();
pointList.push(<path d={sq25} stroke="#FFF" strokeWidth={100/iconSize * 3} fill="#FFF" transform={`translate(${iconXY},${iconXY}) scale(${iconSize / 100}, ${iconSize / 100})`} />);
pointList.push(<path d={sq25} stroke="#FFF" strokeWidth={100/iconSize * 3} fill="#FFF" transform={'translate('+String(iconXY)+','+String(iconXY)+') ' + 'scale(' + String(iconSize/100) + ',' + String(iconSize/100) + ')'} />);
pointList.push(
<g key={id++}>
<defs>
<path id={"defs-path" + randomIdDefs} d={sq25} fill="#FFF" transform={`translate(${iconXY},${iconXY}) scale(${iconSize / 100}, ${iconSize / 100})`} />
</defs>
<path id={"defs-path" + randomIdDefs} d={sq25} fill="#FFF" transform={'translate('+String(iconXY)+','+String(iconXY)+') ' + 'scale(' + String(iconSize/100) + ',' + String(iconSize/100) + ')'} /> </defs>
<clipPath id={"clip-path" + randomIdClips}>
<use xlinkHref={"#defs-path" + randomIdDefs} overflow="visible"/>
</clipPath>
@ -256,16 +255,16 @@ let builtinDrawIcon = function ({ qrcode, params, title, icon }) {
if (icon && iconMode) {
const randomIdDefs = getIdNum();
const randomIdClips = getIdNum();
pointList.push(<path d={sq25} stroke="#FFF" strokeWidth={100/iconSize * 3} fill="#FFF" transform={`translate(${iconXY}, ${iconXY}) scale(${iconSize / 100}, ${iconSize / 100})`} />);
pointList.push(<path d={sq25} stroke="#FFF" strokeWidth={100/iconSize * 3} fill="#FFF" transform={'translate('+String(iconXY)+','+String(iconXY)+') ' + 'scale(' + String(iconSize/100) + ',' + String(iconSize/100) + ')'} />);
pointList.push(
<g key={id++}>
<defs>
<path id={"defs-path" + randomIdDefs} d={sq25} fill="#FFF" transform={`translate(${iconXY},${iconXY}) scale(${iconSize / 100}, ${iconSize / 100})`} /></defs>
<path id={"defs-path" + randomIdDefs} d={sq25} fill="#FFF" transform={'translate('+String(iconXY)+','+String(iconXY)+') ' + 'scale(' + String(iconSize/100) + ',' + String(iconSize/100) + ')'} /> </defs>
<clipPath id={"clip-path" + randomIdClips}>
<use xlinkHref={"#defs-path" + randomIdDefs} overflow="visible"/>
</clipPath>
<g clipPath={"url(#clip-path" + randomIdClips + ")"}>
<g transform={`translate(${iconXY},${iconXY}) scale(${iconSize / 100}, ${iconSize / 100})`} >
<g transform={'translate('+String(iconXY)+','+String(iconXY)+') ' + 'scale(' + String(iconSize/100) + ',' + String(iconSize/100) + ')'} >
{builtinIcon()}
</g>
</g>

View File

@ -35,13 +35,11 @@ let defaultDrawIcon = function ({ qrcode, params, title, icon }) {
if (icon && iconEnabled) {
const randomIdDefs = getIdNum();
const randomIdClips = getIdNum();
pointList.push(<path key={id++} d={sq25} stroke="#FFF" strokeWidth={100/iconSize * 1} fill="#FFF" transform={`translate(${iconXY}, ${iconXY}) scale(${iconSize / 100}, ${iconSize / 100})`} />);
pointList.push(<path d={sq25} stroke="#FFF" strokeWidth={100/iconSize * 1} fill="#FFF" transform={'translate('+String(iconXY)+','+String(iconXY)+') ' + 'scale(' + String(iconSize/100) + ',' + String(iconSize/100) + ')'} />);
pointList.push(
<g key={id++}>
<defs>
<path id={"defs-path" + randomIdDefs} d={sq25} fill="#FFF" transform={`translate(${iconXY}, ${iconXY}) scale(${iconSize / 100}, ${iconSize / 100})`} />
</defs>
<path id={"defs-path" + randomIdDefs} d={sq25} fill="#FFF" transform={'translate('+String(iconXY)+','+String(iconXY)+') ' + 'scale(' + String(iconSize/100) + ',' + String(iconSize/100) + ')'} /> </defs>
<clipPath id={"clip-path" + randomIdClips}>
<use xlinkHref={"#defs-path" + randomIdDefs} overflow="visible"/>
</clipPath>
@ -117,17 +115,16 @@ let builtinDrawIcon = function ({ qrcode, params, title, icon }) {
if (icon && iconMode) {
const randomIdDefs = getIdNum();
const randomIdClips = getIdNum();
pointList.push(<path key={id++} d={sq25} stroke="#FFF" strokeWidth={100/iconSize * 1} fill="#FFF" transform={`translate(${iconXY}, ${iconXY}) scale(${iconSize / 100}, ${iconSize / 100})`} />);
pointList.push(<path d={sq25} stroke="#FFF" strokeWidth={100/iconSize * 1} fill="#FFF" transform={'translate('+String(iconXY)+','+String(iconXY)+') ' + 'scale(' + String(iconSize/100) + ',' + String(iconSize/100) + ')'} />);
pointList.push(
<g key={id++}>
<defs>
<path id={"defs-path" + randomIdDefs} d={sq25} fill="#FFF" transform={`translate(${iconXY}, ${iconXY}) scale(${iconSize / 100}, ${iconSize / 100})`} />
</defs>
<path id={"defs-path" + randomIdDefs} d={sq25} fill="#FFF" transform={'translate('+String(iconXY)+','+String(iconXY)+') ' + 'scale(' + String(iconSize/100) + ',' + String(iconSize/100) + ')'} /> </defs>
<clipPath id={"clip-path" + randomIdClips}>
<use xlinkHref={"#defs-path" + randomIdDefs} overflow="visible"/>
</clipPath>
<g clipPath={"url(#clip-path" + randomIdClips + ")"}>
<g transform={`translate(${iconXY}, ${iconXY}) scale(${iconSize / 100}, ${iconSize / 100})`} >
<g transform={'translate('+String(iconXY)+','+String(iconXY)+') ' + 'scale(' + String(iconSize/100) + ',' + String(iconSize/100) + ')'} >
{builtinIcon()}
</g>
</g>

View File

@ -1,15 +0,0 @@
import * as React from "react"
function FileImport(props) {
return (
<svg width={30} d="1633445633242" className="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg">
<defs>
<style type="text/css"/>
</defs>
<path
d="M182 841h-46C61.442 841 1 780.558 1 706V136C1 61.442 61.442 1 136 1h570c74.558 0 135 60.442 135 135v48h46c74.558 0 135 60.442 135 135v570c0 74.558-60.442 135-135 135H317c-74.558 0-135-60.442-135-135v-48z m569-657v-48c0-24.853-20.147-45-45-45H136c-24.853 0-45 20.147-45 45v570c0 24.853 20.147 45 45 45h46V319c0-74.558 60.442-135 135-135h434z m-434 90c-24.853 0-45 20.147-45 45v570c0 24.853 20.147 45 45 45h570c24.853 0 45-20.147 45-45V319c0-24.853-20.147-45-45-45H317z m239.71 278.5V402.79c0-24.854 20.148-45 45-45 24.854 0 45 20.146 45 45V552.5h149.712c24.852 0 45 20.147 45 45s-20.148 45-45 45H646.71v149.71c0 24.854-20.147 45-45 45s-45-20.146-45-45V642.5H407c-24.853 0-45-20.147-45-45s20.147-45 45-45h149.71z"/>
</svg>
);
}
export default FileImport;

View File

@ -4,7 +4,6 @@ import React, {useRef} from "react";
import {isPicture} from "../../utils/imageUtils";
import {decodeData} from "../../utils/qrcodeHandler";
import { handleUpload, handleInputUrl } from "../../utils/gaHelper";
import FileImport from "../../components/svg/FileImport";
const InputText = ({dispatch}) => {
const textRef = useRef();
@ -42,6 +41,7 @@ const InputText = ({dispatch}) => {
decodeData(file).then((res) => {
if (res) {
textRef.current.value = res.data;
console.log(res.data)
dispatch(genQRInfo(res.data))
}
}).catch(console.err);
@ -65,40 +65,13 @@ const InputText = ({dispatch}) => {
}
}}
/>
<label htmlFor="text_import" className="Qr-upload">
<FileImport />
</label>
<input
type="file"
id="text_import"
hidden={true}
accept={".txt"}
onClick={(e) => e.target.value = null}
onChange={(e) => {
if (e.target.files.length > 0) {
const file = e.target.files[0];
if (file.type === "text/plain") {
const fileReader = new FileReader();
fileReader.onload = function(event) {
const lines = event.target.result
.split(/[\r\n]+/g)
.map(line => line.trim())
.filter(line => line.length > 0);
console.log(lines)
if (lines.length > 0) {
textRef.current.value = lines[0];
dispatch(genQRInfo(lines))
}
}
fileReader.readAsText(file, "UTF-8");
}
}
}}
/>
</div>
<div className="Qr-input-hint">
上传普通二维码输入网址或上传 txt 文本批量生成
上传普通二维码或输入网址
</div>
<a className="Qr-new-discord" href="https://discord.gg/V9CNuqYfte" target='_blank'>
New! Click to join our DiscordAI QR code coming soon!
</a>
</div>
</React.Fragment>);
}

View File

@ -1,15 +1,9 @@
import {connect} from 'react-redux';
import PartDownload from "../../components/app/PartDownload";
import {saveImg, saveSvg, startTask} from "../../utils/downloader";
import {saveImg, saveSvg} from "../../utils/downloader";
import {getDownloadCount, increaseDownloadData, recordDownloadDetail} from "../../api/TcbHandler";
import {fillEmptyWith, getParamDetailedValue, outerHtml} from "../../utils/util";
import {getParamDetailedValue, outerHtml} from "../../utils/util";
import {handleDownloadImg, handleDownloadSvg} from "../../utils/gaHelper";
import {appendPreset} from "../../utils/storageUtils";
import {svgToBase64} from "../../utils/imageUtils";
import React from "react";
import ReactDOMServer from "react-dom/server";
import JSZip from "jszip";
import {encodeData} from "../../utils/qrcodeHandler";
function saveDB(state, type, updateDownloadData) {
return new Promise(resolve => {
@ -46,86 +40,20 @@ function saveDB(state, type, updateDownloadData) {
const mapStateToProps = (state, ownProps) => ({
value: state.value,
downloadCount: state.downloadData[state.value],
batchMode: state.textUrlArray.length > 0,
onSvgDownload: async () => {
let data;
if (state.textUrlArray.length === 0) {
data = saveSvg(state.value, outerHtml(state.selectedIndex));
const filename = "QRcode_" + state.value + ".svg";
startTask(URL.createObjectURL(data), filename);
} else {
const zip = new JSZip();
for (let i = 0; i < state.textUrlArray.length; i++) {
const qrcode = encodeData({ text: state.textUrlArray[i], correctLevel: state.correctLevel });
const el = React.createElement(state.rendererType, {
qrcode: qrcode,
params: fillEmptyWith(state.paramValue[state.selectedIndex].slice(), 0),
title: state.title,
icon: state.icon,
setParamInfo: () => {}
});
data = saveSvg(state.value, ReactDOMServer.renderToString(el));
console.log(data)
const filename = "QRcode_" + state.value + "_" + i + ".svg";
zip.file(filename, data);
}
const href = URL.createObjectURL(await zip.generateAsync({ type: "blob" }));
startTask(href, "QRcode_" + state.value + ".zip");
}
await saveDB(state, 'svg', ownProps.updateDownloadData);
onSvgDownload: () => {
saveSvg(state.value, outerHtml(state.selectedIndex));
saveDB(state, 'svg', ownProps.updateDownloadData);
handleDownloadSvg(state.value);
return data;
},
onImgDownload: async (type) => {
let data;
if (state.textUrlArray.length === 0) {
data = await saveImg(state.value, outerHtml(state.selectedIndex), 1500, 1500, type);
const filename = "QRcode_" + state.value + "." + type;
startTask(data, filename);
} else {
const zip = new JSZip();
for (let i = 0; i < state.textUrlArray.length; i++) {
const qrcode = encodeData({ text: state.textUrlArray[i], correctLevel: state.correctLevel });
const el = React.createElement(state.rendererType, {
qrcode: qrcode,
params: fillEmptyWith(state.paramValue[state.selectedIndex].slice(), 0),
title: state.title,
icon: state.icon,
setParamInfo: () => {}
onImgDownload: (type) => {
return new Promise(resolve => {
saveImg(state.value, outerHtml(state.selectedIndex), 1500, 1500, type).then((res) => {
saveDB(state, type, ownProps.updateDownloadData).then(() => {
handleDownloadImg(state.value, type);
resolve(res)
});
data = await saveImg(state.value, ReactDOMServer.renderToString(el), 1500, 1500, type);
const startIdx = data.indexOf("base64,") + "base64,".length;
const filename = "QRcode_" + state.value + "_" + i + "." + type;
zip.file(filename, data.substring(startIdx), {base64: true});
}
const href = URL.createObjectURL(await zip.generateAsync({ type: "blob" }));
startTask(href, "QRcode_" + state.value + ".zip");
}
await saveDB(state, type, ownProps.updateDownloadData)
handleDownloadImg(state.value, type);
return data;
},
savePreset: () => {
let preset = {
name: '测试预设',
selectedIndex: state.selectedIndex,
preview: svgToBase64(outerHtml(state.selectedIndex), 1500, 1500),
styleName: state.value,
params: state.paramInfo[state.selectedIndex].map((paramInfo, index) => {
return {
name: paramInfo.key,
value: state.paramValue[state.selectedIndex][index],
}
}),
globalParams: new Array(3),
};
preset.globalParams[0] = {name: '容错率', value: state.correctLevel};
preset.globalParams[1] = {name: '图标', value: state.icon};
preset.globalParams[2] = {name: '文字', value: state.title};
appendPreset(preset);
alert('saved');
});
});
}
})

View File

@ -1,21 +0,0 @@
import { connect } from 'react-redux';
import PresetModal from "../../components/preset/PresetModal";
import {getPresets} from "../../utils/storageUtils";
import {changeCorrectLevel, changeIcon, changeParam, changeStyle, changeTitle} from "../../actions";
const mapStateToProps = (state, ownProps) => ({
visible: ownProps.visible,
});
const mapDispatchToProps = (dispatch, ownProps) => ({
onClose: ownProps.onClose,
loadPreset: (preset) => {
dispatch(changeStyle(preset.selectedIndex, preset.styleName));
dispatch(changeCorrectLevel(preset.globalParams[0].value));
dispatch(changeIcon(preset.globalParams[1].value));
dispatch(changeTitle(preset.globalParams[2].value));
preset.params.forEach((param, index) => dispatch(changeParam(preset.selectedIndex, index, param.value)));
}
});
export default connect(mapStateToProps, mapDispatchToProps)(PresetModal);

View File

@ -52,7 +52,7 @@ const mapStateToProps = state => ({
const mapDispatchToProps = dispatch => ({
onSelected: rendererIndex => {
dispatch(changeStyle(rendererIndex, styles[rendererIndex].value))
dispatch(changeStyle(rendererIndex, styles[rendererIndex].renderer, styles[rendererIndex].value))
}
})

View File

@ -10,7 +10,6 @@ const initialState = {
rendererType: RendererRect,
correctLevel: 0,
textUrl: QRBTF_URL,
textUrlArray: [],
history: [],
downloadData: [],
qrcode: encodeData({text: QRBTF_URL, correctLevel: 0}),
@ -27,8 +26,7 @@ export default function appReducer(state = initialState, action) {
if (!text || text.length === 0) text = QRBTF_URL;
return Object.assign({}, state, {
textUrl: text,
qrcode: encodeData({text: text, correctLevel: state.correctLevel}),
textUrlArray: action.textArray || []
qrcode: encodeData({text: text, correctLevel: state.correctLevel})
});
}
case actionTypes.CHANGE_STYLE: {

View File

@ -3,25 +3,23 @@ const svgHead = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n " +
const MIME = { "jpg": "image/jpeg", "png": "image/png" };
export function startTask(data, filename) {
let a = document.createElement('a');
a.setAttribute('href', data)
a.setAttribute('target', 'download')
a.setAttribute('download', filename);
a.setAttribute('hidden', true);
a.click();
}
export function saveSvg(value, content) {
let htmlContent = [svgHead + content]
let bl = new Blob(htmlContent, {type: "image/svg+xml"})
return bl;
let a = document.createElement("a")
let filename = "QRcode_" + value + ".svg"
a.href = URL.createObjectURL(bl)
a.download = filename
a.hidden = true
a.click()
}
export function saveImg(value, content, width, height, type) {
if (!MIME[type]) throw "Error image type";
// Finish creating downloadable data
let filename = "QRcode_" + value + "." + type;
const wrap = document.createElement('div');
wrap.innerHTML = content;
@ -53,8 +51,12 @@ export function saveImg(value, content, width, height, type) {
// Will result in a download popup for chrome and the
// image opening in a new tab for others.
let a = document.createElement('a');
let data = canvas.toDataURL(MIME[type], 0.8);
// startTask(data, filename);
a.setAttribute('href', data)
a.setAttribute('target', 'download')
a.setAttribute('download', filename);
a.click();
resolve(data)
};

View File

@ -8,20 +8,6 @@ export function isPicture(file) {
return fileTypes.includes(file.type);
}
export function svgToBase64(content, width, height) {
const wrap = document.createElement('div');
wrap.innerHTML = content;
const $svg = wrap.firstChild
const $clone = $svg.cloneNode(true);
$clone.setAttribute('width', width);
$clone.setAttribute('height', height);
const svgData = new XMLSerializer().serializeToString($clone);
return 'data:image/svg+xml;base64,' + btoa(svgData);
}
export function toBase64(file, aspectRatio) {
let canvas = document.createElement('canvas');
let ctx = canvas.getContext('2d');
@ -39,6 +25,7 @@ export function toBase64(file, aspectRatio) {
height = img.height;
width = height * aspectRatio;
}
console.log(width + ' ' + height)
canvas.setAttribute('width', width);
canvas.setAttribute('height', height);

View File

@ -1,24 +0,0 @@
const STORAGE_KEYS = {
PRESETS: 'presets'
};
export function getPresets() {
let presetArray = [];
const presetsValue = localStorage.getItem(STORAGE_KEYS.PRESETS);
if (presetsValue) {
presetArray = JSON.parse(presetsValue);
}
return presetArray;
}
export function appendPreset(preset) {
const presets = getPresets();
presets.push(preset);
localStorage.setItem(STORAGE_KEYS.PRESETS, JSON.stringify(presets));
}
export function removePreset(index) {
const presets = getPresets();
presets.splice(index, 1);
localStorage.setItem(STORAGE_KEYS.PRESETS, JSON.stringify(presets));
}

192
yarn.lock
View File

@ -2005,7 +2005,7 @@ arr-flatten@^1.1.0:
arr-union@^3.1.0:
version "3.1.0"
resolved "https://registry.npm.taobao.org/arr-union/download/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=
array-equal@^1.0.0:
@ -2125,8 +2125,8 @@ async-each@^1.0.1:
async-limiter@~1.0.0:
version "1.0.1"
resolved "https://registry.npm.taobao.org/async-limiter/download/async-limiter-1.0.1.tgz?cache=0&sync_timestamp=1574272018408&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fasync-limiter%2Fdownload%2Fasync-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd"
integrity sha1-3TeelPDbgxCwgpH51kwyCXZmF/0=
resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd"
integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==
async@^2.6.2:
version "2.6.3"
@ -2392,10 +2392,10 @@ bluebird@^3.5.5:
resolved "https://registry.npm.taobao.org/bluebird/download/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
integrity sha1-nyKcFb4nJFT/qXOs4NvueaGww28=
bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.4.0:
version "4.11.9"
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828"
integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==
bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9:
version "4.12.0"
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88"
integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==
bn.js@^5.1.1:
version "5.1.1"
@ -2466,7 +2466,7 @@ braces@~3.0.2:
dependencies:
fill-range "^7.0.1"
brorand@^1.0.1:
brorand@^1.0.1, brorand@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=
@ -2916,7 +2916,7 @@ cliui@^5.0.0:
clone-deep@^0.2.4:
version "0.2.4"
resolved "https://registry.npm.taobao.org/clone-deep/download/clone-deep-0.2.4.tgz#4e73dd09e9fb971cc38670c5dced9c1896481cc6"
resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-0.2.4.tgz#4e73dd09e9fb971cc38670c5dced9c1896481cc6"
integrity sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY=
dependencies:
for-own "^0.1.3"
@ -2993,9 +2993,9 @@ color-name@^1.0.0, color-name@~1.1.4:
integrity sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=
color-string@^1.5.2:
version "1.5.3"
resolved "https://registry.npm.taobao.org/color-string/download/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc"
integrity sha1-ybvF8BtYtUkvPWhXRZy2WQziBMw=
version "1.6.0"
resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.6.0.tgz#c3915f61fe267672cb7e1e064c9d692219f6c312"
integrity sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA==
dependencies:
color-name "^1.0.0"
simple-swizzle "^0.2.2"
@ -3719,9 +3719,9 @@ dns-equal@^1.0.0:
integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0=
dns-packet@^1.3.1:
version "1.3.1"
resolved "https://registry.npm.taobao.org/dns-packet/download/dns-packet-1.3.1.tgz#12aa426981075be500b910eedcd0b47dd7deda5a"
integrity sha1-EqpCaYEHW+UAuRDu3NC0fdfe2lo=
version "1.3.4"
resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.4.tgz#e3455065824a2507ba886c55a89963bb107dec6f"
integrity sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==
dependencies:
ip "^1.1.0"
safe-buffer "^5.0.1"
@ -3884,17 +3884,17 @@ electron-to-chromium@^1.3.378, electron-to-chromium@^1.3.413:
integrity sha1-YvluBSn0CiFKl0EbV/J8TwgPCqI=
elliptic@^6.0.0, elliptic@^6.5.2:
version "6.5.3"
resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.3.tgz#cb59eb2efdaf73a0bd78ccd7015a62ad6e0f93d6"
integrity sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==
version "6.5.4"
resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb"
integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==
dependencies:
bn.js "^4.4.0"
brorand "^1.0.1"
bn.js "^4.11.9"
brorand "^1.1.0"
hash.js "^1.0.0"
hmac-drbg "^1.0.0"
inherits "^2.0.1"
minimalistic-assert "^1.0.0"
minimalistic-crypto-utils "^1.0.0"
hmac-drbg "^1.0.1"
inherits "^2.0.4"
minimalistic-assert "^1.0.1"
minimalistic-crypto-utils "^1.0.1"
emoji-regex@^7.0.1, emoji-regex@^7.0.2:
version "7.0.3"
@ -4311,11 +4311,6 @@ execa@^1.0.0:
signal-exit "^3.0.0"
strip-eof "^1.0.0"
exenv@^1.2.0:
version "1.2.2"
resolved "https://registry.npm.taobao.org/exenv/download/exenv-1.2.2.tgz#2ae78e85d9894158670b03d47bec1f03bd91bb9d"
integrity sha1-KueOhdmJQVhnCwPUe+wfA72Ru50=
exit@^0.1.2:
version "0.1.2"
resolved "https://registry.npm.taobao.org/exit/download/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c"
@ -4492,8 +4487,8 @@ fb-watchman@^2.0.0:
figgy-pudding@^3.5.1:
version "3.5.2"
resolved "https://registry.npm.taobao.org/figgy-pudding/download/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e"
integrity sha1-tO7oFIq7Adzx0aw0Nn1Z4S+mHW4=
resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e"
integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==
figures@^3.0.0:
version "3.2.0"
@ -4662,17 +4657,17 @@ follow-redirects@^1.0.0:
for-in@^0.1.3:
version "0.1.8"
resolved "https://registry.npm.taobao.org/for-in/download/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1"
resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1"
integrity sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=
for-in@^1.0.1, for-in@^1.0.2:
version "1.0.2"
resolved "https://registry.npm.taobao.org/for-in/download/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=
for-own@^0.1.3:
version "0.1.5"
resolved "https://registry.npm.taobao.org/for-own/download/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce"
resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce"
integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=
dependencies:
for-in "^1.0.1"
@ -5063,7 +5058,7 @@ hex-color-regex@^1.1.0:
resolved "https://registry.npm.taobao.org/hex-color-regex/download/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e"
integrity sha1-TAb8y0YC/iYCs8k9+C1+fb8aio4=
hmac-drbg@^1.0.0:
hmac-drbg@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=
@ -5080,9 +5075,9 @@ hoist-non-react-statics@^3.3.0:
react-is "^16.7.0"
hosted-git-info@^2.1.4:
version "2.8.8"
resolved "https://registry.npm.taobao.org/hosted-git-info/download/hosted-git-info-2.8.8.tgz?cache=0&sync_timestamp=1583017392137&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhosted-git-info%2Fdownload%2Fhosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488"
integrity sha1-dTm9S8Hg4KiVgVouAmJCCxKFhIg=
version "2.8.9"
resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9"
integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==
hpack.js@^2.1.6:
version "2.1.6"
@ -5279,11 +5274,6 @@ ignore@^4.0.6:
resolved "https://registry.npm.taobao.org/ignore/download/ignore-4.0.6.tgz?cache=0&sync_timestamp=1565775199290&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fignore%2Fdownload%2Fignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
integrity sha1-dQ49tYYgh7RzfrrIIH/9HvJ7Jfw=
immediate@~3.0.5:
version "3.0.6"
resolved "https://registry.nlark.com/immediate/download/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b"
integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=
immer@1.10.0:
version "1.10.0"
resolved "https://registry.npm.taobao.org/immer/download/immer-1.10.0.tgz#bad67605ba9c810275d91e1c2a47d4582e98286d"
@ -5493,8 +5483,8 @@ is-arrayish@^0.2.1:
is-arrayish@^0.3.1:
version "0.3.2"
resolved "https://registry.npm.taobao.org/is-arrayish/download/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03"
integrity sha1-RXSirlb3qyBolvtDHq7tBm/fjwM=
resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03"
integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==
is-binary-path@^1.0.0:
version "1.0.1"
@ -5512,8 +5502,8 @@ is-binary-path@~2.1.0:
is-buffer@^1.0.2, is-buffer@^1.1.5:
version "1.1.6"
resolved "https://registry.npm.taobao.org/is-buffer/download/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
integrity sha1-76ouqdqg16suoTqXsritUf776L4=
resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
is-callable@^1.1.4, is-callable@^1.1.5:
version "1.1.5"
@ -5779,7 +5769,7 @@ isobject@^2.0.0:
isobject@^3.0.0, isobject@^3.0.1:
version "3.0.1"
resolved "https://registry.npm.taobao.org/isobject/download/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8=
isstream@~0.1.2:
@ -6402,16 +6392,6 @@ jsx-ast-utils@^2.2.1, jsx-ast-utils@^2.2.3:
array-includes "^3.0.3"
object.assign "^4.1.0"
jszip@^3.7.1:
version "3.7.1"
resolved "https://registry.nlark.com/jszip/download/jszip-3.7.1.tgz#bd63401221c15625a1228c556ca8a68da6fda3d9"
integrity sha1-vWNAEiHBViWhIoxVbKimjab9o9k=
dependencies:
lie "~3.3.0"
pako "~1.0.2"
readable-stream "~2.3.6"
set-immediate-shim "~1.0.1"
killable@^1.0.1:
version "1.0.1"
resolved "https://registry.npm.taobao.org/killable/download/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892"
@ -6419,14 +6399,14 @@ killable@^1.0.1:
kind-of@^2.0.1:
version "2.0.1"
resolved "https://registry.npm.taobao.org/kind-of/download/kind-of-2.0.1.tgz#018ec7a4ce7e3a86cb9141be519d24c8faa981b5"
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-2.0.1.tgz#018ec7a4ce7e3a86cb9141be519d24c8faa981b5"
integrity sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=
dependencies:
is-buffer "^1.0.2"
kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
version "3.2.2"
resolved "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=
dependencies:
is-buffer "^1.1.5"
@ -6463,12 +6443,12 @@ last-call-webpack-plugin@^3.0.0:
lazy-cache@^0.2.3:
version "0.2.7"
resolved "https://registry.npm.taobao.org/lazy-cache/download/lazy-cache-0.2.7.tgz#7feddf2dcb6edb77d11ef1d117ab5ffdf0ab1b65"
resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-0.2.7.tgz#7feddf2dcb6edb77d11ef1d117ab5ffdf0ab1b65"
integrity sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=
lazy-cache@^1.0.3:
version "1.0.4"
resolved "https://registry.npm.taobao.org/lazy-cache/download/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e"
resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e"
integrity sha1-odePw6UEdMuAhF07O24dpJpEbo4=
lcid@^2.0.0:
@ -6503,13 +6483,6 @@ levn@^0.3.0, levn@~0.3.0:
prelude-ls "~1.1.2"
type-check "~0.3.2"
lie@~3.3.0:
version "3.3.0"
resolved "https://registry.nlark.com/lie/download/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a"
integrity sha1-3Pgt7lRfRgdNryAMfBxaCOD0D2o=
dependencies:
immediate "~3.0.5"
lines-and-columns@^1.1.6:
version "1.1.6"
resolved "https://registry.npm.taobao.org/lines-and-columns/download/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00"
@ -6791,9 +6764,9 @@ memory-fs@^0.5.0:
readable-stream "^2.0.1"
merge-deep@^3.0.2:
version "3.0.2"
resolved "https://registry.npm.taobao.org/merge-deep/download/merge-deep-3.0.2.tgz#f39fa100a4f1bd34ff29f7d2bf4508fbb8d83ad2"
integrity sha1-85+hAKTxvTT/KffSv0UI+7jYOtI=
version "3.0.3"
resolved "https://registry.yarnpkg.com/merge-deep/-/merge-deep-3.0.3.tgz#1a2b2ae926da8b2ae93a0ac15d90cd1922766003"
integrity sha512-qtmzAS6t6grwEkNrunqTBdn0qKwFgNWvlxUbAV8es9M7Ot1EbyApytCnvE0jALPa46ZpKDUo527kKiaWplmlFA==
dependencies:
arr-union "^3.1.0"
clone-deep "^0.2.4"
@ -6898,7 +6871,7 @@ minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==
minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
minimalistic-crypto-utils@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=
@ -6969,7 +6942,7 @@ mixin-deep@^1.2.0:
mixin-object@^2.0.1:
version "2.0.1"
resolved "https://registry.npm.taobao.org/mixin-object/download/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e"
resolved "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e"
integrity sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=
dependencies:
for-in "^0.1.3"
@ -7505,7 +7478,7 @@ p-try@^2.0.0:
resolved "https://registry.npm.taobao.org/p-try/download/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
integrity sha1-yyhoVA4xPWHeWPr741zpAE1VQOY=
pako@~1.0.2, pako@~1.0.5:
pako@~1.0.5:
version "1.0.11"
resolved "https://registry.npm.taobao.org/pako/download/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf"
integrity sha1-bJWZ00DVTf05RjgCUqNXBaa5kr8=
@ -7647,9 +7620,9 @@ path-key@^3.1.0:
integrity sha1-WB9q3mWMu6ZaDTOA3ndTKVBU83U=
path-parse@^1.0.6:
version "1.0.6"
resolved "https://registry.npm.taobao.org/path-parse/download/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c"
integrity sha1-1i27VnlAXXLEc37FhgDp3c8G0kw=
version "1.0.7"
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
path-to-regexp@0.1.7:
version "0.1.7"
@ -8655,9 +8628,9 @@ querystring@0.2.0:
integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=
querystringify@^2.1.1:
version "2.1.1"
resolved "https://registry.npm.taobao.org/querystringify/download/querystringify-2.1.1.tgz#60e5a5fd64a7f8bfa4d2ab2ed6fdf4c85bad154e"
integrity sha1-YOWl/WSn+L+k0qsu1v30yFutFU4=
version "2.2.0"
resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6"
integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==
raf@^3.4.1:
version "3.4.1"
@ -8801,21 +8774,6 @@ react-lazy-load@^3.0.13:
lodash.throttle "^4.0.0"
prop-types "^15.5.8"
react-lifecycles-compat@^3.0.0:
version "3.0.4"
resolved "https://registry.npm.taobao.org/react-lifecycles-compat/download/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362"
integrity sha1-TxonOv38jzSIqMUWv9p4+HI1I2I=
react-modal@^3.12.1:
version "3.12.1"
resolved "https://registry.npm.taobao.org/react-modal/download/react-modal-3.12.1.tgz?cache=0&sync_timestamp=1606096428365&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freact-modal%2Fdownload%2Freact-modal-3.12.1.tgz#38c33f70d81c33d02ff1ed115530443a3dc2afd3"
integrity sha1-OMM/cNgcM9Av8e0RVTBEOj3Cr9M=
dependencies:
exenv "^1.2.0"
prop-types "^15.5.10"
react-lifecycles-compat "^3.0.0"
warning "^4.0.3"
react-redux@^7.2.0:
version "7.2.0"
resolved "https://registry.npm.taobao.org/react-redux/download/react-redux-7.2.0.tgz#f970f62192b3981642fec46fd0db18a074fe879d"
@ -9197,7 +9155,7 @@ require-main-filename@^2.0.0:
requires-port@^1.0.0:
version "1.0.0"
resolved "https://registry.npm.taobao.org/requires-port/download/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=
resolve-cwd@^2.0.0:
@ -9525,11 +9483,6 @@ set-blocking@^2.0.0:
resolved "https://registry.npm.taobao.org/set-blocking/download/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
set-immediate-shim@~1.0.1:
version "1.0.1"
resolved "https://registry.nlark.com/set-immediate-shim/download/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61"
integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=
set-value@^2.0.0, set-value@^2.0.1:
version "2.0.1"
resolved "https://registry.npm.taobao.org/set-value/download/set-value-2.0.1.tgz?cache=0&sync_timestamp=1585775409029&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fset-value%2Fdownload%2Fset-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b"
@ -9565,7 +9518,7 @@ sha.js@^2.4.0, sha.js@^2.4.8:
shallow-clone@^0.1.2:
version "0.1.2"
resolved "https://registry.npm.taobao.org/shallow-clone/download/shallow-clone-0.1.2.tgz#5909e874ba77106d73ac414cfec1ffca87d97060"
resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-0.1.2.tgz#5909e874ba77106d73ac414cfec1ffca87d97060"
integrity sha1-WQnodLp3EG1zrEFM/sH/yofZcGA=
dependencies:
is-extendable "^0.1.1"
@ -9629,7 +9582,7 @@ signal-exit@^3.0.0, signal-exit@^3.0.2:
simple-swizzle@^0.2.2:
version "0.2.2"
resolved "https://registry.npm.taobao.org/simple-swizzle/download/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a"
resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a"
integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=
dependencies:
is-arrayish "^0.3.1"
@ -9836,9 +9789,9 @@ sshpk@^1.7.0:
tweetnacl "~0.14.0"
ssri@^6.0.1:
version "6.0.1"
resolved "https://registry.npm.taobao.org/ssri/download/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8"
integrity sha1-KjxBso3UW2K2Nnbst0ABJlrp7dg=
version "6.0.2"
resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.2.tgz#157939134f20464e7301ddba3e90ffa8f7728ac5"
integrity sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==
dependencies:
figgy-pudding "^3.5.1"
@ -10300,9 +10253,9 @@ tmp@^0.0.33:
os-tmpdir "~1.0.2"
tmpl@1.0.x:
version "1.0.4"
resolved "https://registry.npm.taobao.org/tmpl/download/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1"
integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=
version "1.0.5"
resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc"
integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==
to-arraybuffer@^1.0.0:
version "1.0.1"
@ -10552,9 +10505,9 @@ url-loader@2.3.0:
schema-utils "^2.5.0"
url-parse@^1.4.3:
version "1.4.7"
resolved "https://registry.npm.taobao.org/url-parse/download/url-parse-1.4.7.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Furl-parse%2Fdownload%2Furl-parse-1.4.7.tgz#a8a83535e8c00a316e403a5db4ac1b9b853ae278"
integrity sha1-qKg1NejACjFuQDpdtKwbm4U64ng=
version "1.5.3"
resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.3.tgz#71c1303d38fb6639ade183c2992c8cc0686df862"
integrity sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ==
dependencies:
querystringify "^2.1.1"
requires-port "^1.0.0"
@ -10689,13 +10642,6 @@ walker@^1.0.7, walker@~1.0.5:
dependencies:
makeerror "1.0.x"
warning@^4.0.3:
version "4.0.3"
resolved "https://registry.npm.taobao.org/warning/download/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3"
integrity sha1-Fungd+uKhtavfWSqHgX9hbRnjKM=
dependencies:
loose-envify "^1.0.0"
watchpack-chokidar2@^2.0.0:
version "2.0.0"
resolved "https://registry.npm.taobao.org/watchpack-chokidar2/download/watchpack-chokidar2-2.0.0.tgz#9948a1866cbbd6cb824dea13a7ed691f6c8ddff0"
@ -11092,9 +11038,9 @@ write@1.0.3:
mkdirp "^0.5.1"
ws@^5.2.0:
version "5.2.2"
resolved "https://registry.npm.taobao.org/ws/download/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f"
integrity sha1-3/7xSGa46NyRM1glFNG++vlumA8=
version "5.2.3"
resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.3.tgz#05541053414921bc29c63bee14b8b0dd50b07b3d"
integrity sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA==
dependencies:
async-limiter "~1.0.0"