From 7f1410eba2f3dbb926e717a98df75e94f9b35d91 Mon Sep 17 00:00:00 2001 From: ChuShiZ Date: Mon, 23 Sep 2024 21:11:59 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E7=99=BB=E5=BD=95=E5=92=8C=E7=BB=91?= =?UTF-8?q?=E5=AE=9A=E6=89=8B=E6=9C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/login.js | 2 +- pages.json | 7 + pages/login/bindPhoe.vue | 217 +++++++++++++ pages/login/login.vue | 653 ++++++++++++++++++++++++++------------- static/loginbj.png | Bin 0 -> 68777 bytes static/xinlogo.png | Bin 0 -> 25487 bytes 6 files changed, 663 insertions(+), 216 deletions(-) create mode 100644 pages/login/bindPhoe.vue create mode 100644 static/loginbj.png create mode 100644 static/xinlogo.png diff --git a/api/login.js b/api/login.js index cb8b808..f6d0917 100644 --- a/api/login.js +++ b/api/login.js @@ -50,7 +50,7 @@ export function getCodeImg() { // 获取验证码 export function loginApp(data) { return request({ - 'url': '/rescue/loginApp', + 'url': '/rescue/loginQx', headers: { isToken: false }, diff --git a/pages.json b/pages.json index e93f72f..a32f594 100644 --- a/pages.json +++ b/pages.json @@ -144,6 +144,13 @@ { "navigationBarTitleText" : "" } + }, + { + "path" : "pages/login/bindPhoe", + "style" : + { + "navigationBarTitleText" : "" + } } ], "globalStyle": { diff --git a/pages/login/bindPhoe.vue b/pages/login/bindPhoe.vue new file mode 100644 index 0000000..2c73ef6 --- /dev/null +++ b/pages/login/bindPhoe.vue @@ -0,0 +1,217 @@ + + + + + \ No newline at end of file diff --git a/pages/login/login.vue b/pages/login/login.vue index 2ee9904..31dd0d4 100644 --- a/pages/login/login.vue +++ b/pages/login/login.vue @@ -1,226 +1,449 @@ + button { + border: none !important; + background: none !important; + margin: 0px; + display: block; + } + + button:focus { + color: #0078FF; + outline: none; + box-shadow: none; + } + + .content { + box-sizing: border-box; + } + + .top { + box-sizing: border-box; + padding: 0px 27px; + padding-top: 100px; + background-image: url('../../static/loginbj.png'); + // background-color:lightseagreen; + // background-image: url('../../static/loginbj.png'); + background-size: cover; + background-position: center; + width: 100%; + // height: 385px; + } + + .touxiang { + width: 88px; + height: 88px; + border-radius: 10px; + background: #D7D7D7; + margin: 0 auto; + margin-bottom: 40px; + overflow: hidden; + + image { + width: 100%; + height: 100%; + } + } + + .twotap { + width: 100%; + display: flex; + align-items: center; + + view { + font-size: 15px; + font-family: Microsoft YaHei; + font-weight: 400; + color: #666666; + margin-right: 38.5px; + } + } + + .blck { + color: #333333 !important; + font-weight: bold !important; + } + + .inputs { + box-sizing: border-box; + padding: 16px 0px; + display: flex; + align-items: center; + border-bottom: 2px solid #E8E8E8; + margin-top: 20px; + } + + .wjworb { + margin-top: 5px; + width: 100%; + display: flex; + font-size: 12px; + color: #0078FF; + justify-content: flex-end; + align-items: center; + + } + + .dl { + width: 90%; + height: 44px; + background: linear-gradient(-46deg, #0853C4 0%, #4282D8 80%); + border-radius: 5px; + margin: 0 auto; + font-size: 16px; + color: #FFFFFF; + display: flex; + justify-content: center; + align-items: center; + margin-top: 22px; + } + + .hging { + width: 100%; + text-align: center; + font-size: 14px; + font-weight: 400; + color: #636363; + margin-top: 20px; + } + + .wx { + width: 38px; + height: 38px; + overflow: hidden; + box-sizing: border-box; + margin: 0px auto; + margin-top: 20px; + + image { + width: 100%; + height: 100%; + } + } + + .hui { + font-size: 10px; + width: 100%; + text-align: center; + font-weight: 400; + color: #666666; + } + + .dbottom { + width: 100%; + text-align: center; + font-size: 12px; + color: #333333; + margin-top: 40px; + position: fixed; + bottom: 25px; + display: flex; + align-items: center; + justify-content: center; + } + + .quanzi { + width: 14px; + height: 14px; + border: 1px solid #666666; + border-radius: 50%; + margin-right: 10px; + } + + .lanquanzi { + width: 14px; + height: 14px; + border: 1px solid #0078FF; + border-radius: 50%; + margin-right: 10px; + background: #0078FF; + color: white; + } + + .lan { + color: #0078FF; + } + + .jiuzhong { + width: 90%; + margin: 10px auto; + display: flex; + align-items: center; + } + + .dist { + display: flex; + align-items: center; + margin: 0px 10px; + } + + .d-zi { + font-size: 14px; + } + + .d-qian { + width: 14px; + height: 14px; + margin-right: 5px; + overflow: hidden; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + border: 1px solid #666666; + color: white; + } + + .d-qian-lan { + width: 14px; + height: 14px; + margin-right: 5px; + overflow: hidden; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + background: #0078FF; + border: 1px solid #0078FF; + color: white; + } + \ No newline at end of file diff --git a/static/loginbj.png b/static/loginbj.png new file mode 100644 index 0000000000000000000000000000000000000000..6bf821f290b43f80c7af89929ab90ddd2b30ba2a GIT binary patch literal 68777 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

RCThqUTAy0CTUPHwYPBc<_qkJH$7+ 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 WNg9S`KbH6a0000 Date: Mon, 23 Sep 2024 22:34:12 +0800 Subject: [PATCH 2/3] 12 --- components/tabBar/tabBar.vue | 2 +- config.js | 2 +- node_modules/extend/.editorconfig | 20 + node_modules/extend/.eslintrc | 17 + node_modules/extend/.jscs.json | 175 +++ node_modules/extend/.travis.yml | 230 +++ node_modules/extend/CHANGELOG.md | 83 ++ node_modules/extend/LICENSE | 23 + node_modules/extend/README.md | 81 ++ node_modules/extend/component.json | 32 + node_modules/extend/index.js | 117 ++ node_modules/extend/package.json | 75 + node_modules/weapp-qrcode/.editorconfig | 9 + node_modules/weapp-qrcode/.eslintignore | 2 + node_modules/weapp-qrcode/.eslintrc.js | 26 + .../weapp-qrcode/.github/ISSUE_TEMPLATE.md | 37 + node_modules/weapp-qrcode/.travis.yml | 23 + node_modules/weapp-qrcode/CHANGELOG.md | 40 + node_modules/weapp-qrcode/LICENSE | 21 + node_modules/weapp-qrcode/README.md | 96 ++ .../weapp-qrcode/build/rollup.dev.config.js | 39 + .../weapp-qrcode/build/rollup.prod.config.js | 49 + node_modules/weapp-qrcode/dist/README.md | 6 + .../weapp-qrcode/dist/weapp.qrcode.common.js | 5 + .../weapp-qrcode/dist/weapp.qrcode.esm.js | 5 + .../weapp-qrcode/dist/weapp.qrcode.js | 1281 +++++++++++++++++ .../weapp-qrcode/dist/weapp.qrcode.min.js | 5 + node_modules/weapp-qrcode/package.json | 78 + node_modules/weapp-qrcode/src/index.js | 94 ++ node_modules/weapp-qrcode/src/qrcode.js | 1242 ++++++++++++++++ package-lock.json | 19 + package.json | 3 +- pages/orderList/orderList.vue | 114 +- utils/request.js | 2 + 34 files changed, 4023 insertions(+), 30 deletions(-) create mode 100644 node_modules/extend/.editorconfig create mode 100644 node_modules/extend/.eslintrc create mode 100644 node_modules/extend/.jscs.json create mode 100644 node_modules/extend/.travis.yml create mode 100644 node_modules/extend/CHANGELOG.md create mode 100644 node_modules/extend/LICENSE create mode 100644 node_modules/extend/README.md create mode 100644 node_modules/extend/component.json create mode 100644 node_modules/extend/index.js create mode 100644 node_modules/extend/package.json create mode 100644 node_modules/weapp-qrcode/.editorconfig create mode 100644 node_modules/weapp-qrcode/.eslintignore create mode 100644 node_modules/weapp-qrcode/.eslintrc.js create mode 100644 node_modules/weapp-qrcode/.github/ISSUE_TEMPLATE.md create mode 100644 node_modules/weapp-qrcode/.travis.yml create mode 100644 node_modules/weapp-qrcode/CHANGELOG.md create mode 100644 node_modules/weapp-qrcode/LICENSE create mode 100644 node_modules/weapp-qrcode/README.md create mode 100644 node_modules/weapp-qrcode/build/rollup.dev.config.js create mode 100644 node_modules/weapp-qrcode/build/rollup.prod.config.js create mode 100644 node_modules/weapp-qrcode/dist/README.md create mode 100644 node_modules/weapp-qrcode/dist/weapp.qrcode.common.js create mode 100644 node_modules/weapp-qrcode/dist/weapp.qrcode.esm.js create mode 100644 node_modules/weapp-qrcode/dist/weapp.qrcode.js create mode 100644 node_modules/weapp-qrcode/dist/weapp.qrcode.min.js create mode 100644 node_modules/weapp-qrcode/package.json create mode 100644 node_modules/weapp-qrcode/src/index.js create mode 100644 node_modules/weapp-qrcode/src/qrcode.js create mode 100644 package-lock.json diff --git a/components/tabBar/tabBar.vue b/components/tabBar/tabBar.vue index be51fd8..7177120 100644 --- a/components/tabBar/tabBar.vue +++ b/components/tabBar/tabBar.vue @@ -65,7 +65,7 @@ this.identity = uni.getStorageSync('identity'); // #endif this.aindex = this.msg - this.getbottom() + }, methods: { async getbottom() { diff --git a/config.js b/config.js index d202138..99cf852 100644 --- a/config.js +++ b/config.js @@ -1,7 +1,7 @@ // 应用全局配置 module.exports = { //baseUrl: 'https://www.nuoyunr.com/admin-api', - baseUrl: 'http://192.168.1.4:48080/admin-api', + baseUrl: 'http://192.168.1.31:48080/userClient', imagesUrl: 'http://shequ.0315e.com/static/images/pages/', baseImageUrl: 'https://www.nuoyunr.com/minio', //wsUrl: 'wss://www.nuoyunr.com/admin-api', diff --git a/node_modules/extend/.editorconfig b/node_modules/extend/.editorconfig new file mode 100644 index 0000000..bc228f8 --- /dev/null +++ b/node_modules/extend/.editorconfig @@ -0,0 +1,20 @@ +root = true + +[*] +indent_style = tab +indent_size = 4 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true +max_line_length = 150 + +[CHANGELOG.md] +indent_style = space +indent_size = 2 + +[*.json] +max_line_length = off + +[Makefile] +max_line_length = off diff --git a/node_modules/extend/.eslintrc b/node_modules/extend/.eslintrc new file mode 100644 index 0000000..a34cf28 --- /dev/null +++ b/node_modules/extend/.eslintrc @@ -0,0 +1,17 @@ +{ + "root": true, + + "extends": "@ljharb", + + "rules": { + "complexity": [2, 20], + "eqeqeq": [2, "allow-null"], + "func-name-matching": [1], + "max-depth": [1, 4], + "max-statements": [2, 26], + "no-extra-parens": [1], + "no-magic-numbers": [0], + "no-restricted-syntax": [2, "BreakStatement", "ContinueStatement", "DebuggerStatement", "LabeledStatement", "WithStatement"], + "sort-keys": [0], + } +} diff --git a/node_modules/extend/.jscs.json b/node_modules/extend/.jscs.json new file mode 100644 index 0000000..3cce01d --- /dev/null +++ b/node_modules/extend/.jscs.json @@ -0,0 +1,175 @@ +{ + "es3": true, + + "additionalRules": [], + + "requireSemicolons": true, + + "disallowMultipleSpaces": true, + + "disallowIdentifierNames": [], + + "requireCurlyBraces": { + "allExcept": [], + "keywords": ["if", "else", "for", "while", "do", "try", "catch"] + }, + + "requireSpaceAfterKeywords": ["if", "else", "for", "while", "do", "switch", "return", "try", "catch", "function"], + + "disallowSpaceAfterKeywords": [], + + "disallowSpaceBeforeComma": true, + "disallowSpaceAfterComma": false, + "disallowSpaceBeforeSemicolon": true, + + "disallowNodeTypes": [ + "DebuggerStatement", + "LabeledStatement", + "SwitchCase", + "SwitchStatement", + "WithStatement" + ], + + "requireObjectKeysOnNewLine": { "allExcept": ["sameLine"] }, + + "requireSpacesInAnonymousFunctionExpression": { "beforeOpeningRoundBrace": true, "beforeOpeningCurlyBrace": true }, + "requireSpacesInNamedFunctionExpression": { "beforeOpeningCurlyBrace": true }, + "disallowSpacesInNamedFunctionExpression": { "beforeOpeningRoundBrace": true }, + "requireSpacesInFunctionDeclaration": { "beforeOpeningCurlyBrace": true }, + "disallowSpacesInFunctionDeclaration": { "beforeOpeningRoundBrace": true }, + + "requireSpaceBetweenArguments": true, + + "disallowSpacesInsideParentheses": true, + + "disallowSpacesInsideArrayBrackets": true, + + "disallowQuotedKeysInObjects": { "allExcept": ["reserved"] }, + + "disallowSpaceAfterObjectKeys": true, + + "requireCommaBeforeLineBreak": true, + + "disallowSpaceAfterPrefixUnaryOperators": ["++", "--", "+", "-", "~", "!"], + "requireSpaceAfterPrefixUnaryOperators": [], + + "disallowSpaceBeforePostfixUnaryOperators": ["++", "--"], + "requireSpaceBeforePostfixUnaryOperators": [], + + "disallowSpaceBeforeBinaryOperators": [], + "requireSpaceBeforeBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="], + + "requireSpaceAfterBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="], + "disallowSpaceAfterBinaryOperators": [], + + "disallowImplicitTypeConversion": ["binary", "string"], + + "disallowKeywords": ["with", "eval"], + + "requireKeywordsOnNewLine": [], + "disallowKeywordsOnNewLine": ["else"], + + "requireLineFeedAtFileEnd": true, + + "disallowTrailingWhitespace": true, + + "disallowTrailingComma": true, + + "excludeFiles": ["node_modules/**", "vendor/**"], + + "disallowMultipleLineStrings": true, + + "requireDotNotation": { "allExcept": ["keywords"] }, + + "requireParenthesesAroundIIFE": true, + + "validateLineBreaks": "LF", + + "validateQuoteMarks": { + "escape": true, + "mark": "'" + }, + + "disallowOperatorBeforeLineBreak": [], + + "requireSpaceBeforeKeywords": [ + "do", + "for", + "if", + "else", + "switch", + "case", + "try", + "catch", + "finally", + "while", + "with", + "return" + ], + + "validateAlignedFunctionParameters": { + "lineBreakAfterOpeningBraces": true, + "lineBreakBeforeClosingBraces": true + }, + + "requirePaddingNewLinesBeforeExport": true, + + "validateNewlineAfterArrayElements": { + "maximum": 6 + }, + + "requirePaddingNewLinesAfterUseStrict": true, + + "disallowArrowFunctions": true, + + "disallowMultiLineTernary": true, + + "validateOrderInObjectKeys": false, + + "disallowIdenticalDestructuringNames": true, + + "disallowNestedTernaries": { "maxLevel": 1 }, + + "requireSpaceAfterComma": { "allExcept": ["trailing"] }, + "requireAlignedMultilineParams": false, + + "requireSpacesInGenerator": { + "afterStar": true + }, + + "disallowSpacesInGenerator": { + "beforeStar": true + }, + + "disallowVar": false, + + "requireArrayDestructuring": false, + + "requireEnhancedObjectLiterals": false, + + "requireObjectDestructuring": false, + + "requireEarlyReturn": false, + + "requireCapitalizedConstructorsNew": { + "allExcept": ["Function", "String", "Object", "Symbol", "Number", "Date", "RegExp", "Error", "Boolean", "Array"] + }, + + "requireImportAlphabetized": false, + + "requireSpaceBeforeObjectValues": true, + "requireSpaceBeforeDestructuredValues": true, + + "disallowSpacesInsideTemplateStringPlaceholders": true, + + "disallowArrayDestructuringReturn": false, + + "requireNewlineBeforeSingleStatementsInIf": false, + + "disallowUnusedVariables": true, + + "requireSpacesInsideImportedObjectBraces": true, + + "requireUseStrict": true +} + diff --git a/node_modules/extend/.travis.yml b/node_modules/extend/.travis.yml new file mode 100644 index 0000000..5ccdfc4 --- /dev/null +++ b/node_modules/extend/.travis.yml @@ -0,0 +1,230 @@ +language: node_js +os: + - linux +node_js: + - "10.7" + - "9.11" + - "8.11" + - "7.10" + - "6.14" + - "5.12" + - "4.9" + - "iojs-v3.3" + - "iojs-v2.5" + - "iojs-v1.8" + - "0.12" + - "0.10" + - "0.8" +before_install: + - 'case "${TRAVIS_NODE_VERSION}" in 0.*) export NPM_CONFIG_STRICT_SSL=false ;; esac' + - 'nvm install-latest-npm' +install: + - 'if [ "${TRAVIS_NODE_VERSION}" = "0.6" ] || [ "${TRAVIS_NODE_VERSION}" = "0.9" ]; then nvm install --latest-npm 0.8 && npm install && nvm use "${TRAVIS_NODE_VERSION}"; else npm install; fi;' +script: + - 'if [ -n "${PRETEST-}" ]; then npm run pretest ; fi' + - 'if [ -n "${POSTTEST-}" ]; then npm run posttest ; fi' + - 'if [ -n "${COVERAGE-}" ]; then npm run coverage ; fi' + - 'if [ -n "${TEST-}" ]; then npm run tests-only ; fi' +sudo: false +env: + - TEST=true +matrix: + fast_finish: true + include: + - node_js: "lts/*" + env: PRETEST=true + - node_js: "lts/*" + env: POSTTEST=true + - node_js: "4" + env: COVERAGE=true + - node_js: "10.6" + env: TEST=true ALLOW_FAILURE=true + - node_js: "10.5" + env: TEST=true ALLOW_FAILURE=true + - node_js: "10.4" + env: TEST=true ALLOW_FAILURE=true + - node_js: "10.3" + env: TEST=true ALLOW_FAILURE=true + - node_js: "10.2" + env: TEST=true ALLOW_FAILURE=true + - node_js: "10.1" + env: TEST=true ALLOW_FAILURE=true + - node_js: "10.0" + env: TEST=true ALLOW_FAILURE=true + - node_js: "9.10" + env: TEST=true ALLOW_FAILURE=true + - node_js: "9.9" + env: TEST=true ALLOW_FAILURE=true + - node_js: "9.8" + env: TEST=true ALLOW_FAILURE=true + - node_js: "9.7" + env: TEST=true ALLOW_FAILURE=true + - node_js: "9.6" + env: TEST=true ALLOW_FAILURE=true + - node_js: "9.5" + env: TEST=true ALLOW_FAILURE=true + - node_js: "9.4" + env: TEST=true ALLOW_FAILURE=true + - node_js: "9.3" + env: TEST=true ALLOW_FAILURE=true + - node_js: "9.2" + env: TEST=true ALLOW_FAILURE=true + - node_js: "9.1" + env: TEST=true ALLOW_FAILURE=true + - node_js: "9.0" + env: TEST=true ALLOW_FAILURE=true + - node_js: "8.10" + env: TEST=true ALLOW_FAILURE=true + - node_js: "8.9" + env: TEST=true ALLOW_FAILURE=true + - node_js: "8.8" + env: TEST=true ALLOW_FAILURE=true + - node_js: "8.7" + env: TEST=true ALLOW_FAILURE=true + - node_js: "8.6" + env: TEST=true ALLOW_FAILURE=true + - node_js: "8.5" + env: TEST=true ALLOW_FAILURE=true + - node_js: "8.4" + env: TEST=true ALLOW_FAILURE=true + - node_js: "8.3" + env: TEST=true ALLOW_FAILURE=true + - node_js: "8.2" + env: TEST=true ALLOW_FAILURE=true + - node_js: "8.1" + env: TEST=true ALLOW_FAILURE=true + - node_js: "8.0" + env: TEST=true ALLOW_FAILURE=true + - node_js: "7.9" + env: TEST=true ALLOW_FAILURE=true + - node_js: "7.8" + env: TEST=true ALLOW_FAILURE=true + - node_js: "7.7" + env: TEST=true ALLOW_FAILURE=true + - node_js: "7.6" + env: TEST=true ALLOW_FAILURE=true + - node_js: "7.5" + env: TEST=true ALLOW_FAILURE=true + - node_js: "7.4" + env: TEST=true ALLOW_FAILURE=true + - node_js: "7.3" + env: TEST=true ALLOW_FAILURE=true + - node_js: "7.2" + env: TEST=true ALLOW_FAILURE=true + - node_js: "7.1" + env: TEST=true ALLOW_FAILURE=true + - node_js: "7.0" + env: TEST=true ALLOW_FAILURE=true + - node_js: "6.13" + env: TEST=true ALLOW_FAILURE=true + - node_js: "6.12" + env: TEST=true ALLOW_FAILURE=true + - node_js: "6.11" + env: TEST=true ALLOW_FAILURE=true + - node_js: "6.10" + env: TEST=true ALLOW_FAILURE=true + - node_js: "6.9" + env: TEST=true ALLOW_FAILURE=true + - node_js: "6.8" + env: TEST=true ALLOW_FAILURE=true + - node_js: "6.7" + env: TEST=true ALLOW_FAILURE=true + - node_js: "6.6" + env: TEST=true ALLOW_FAILURE=true + - node_js: "6.5" + env: TEST=true ALLOW_FAILURE=true + - node_js: "6.4" + env: TEST=true ALLOW_FAILURE=true + - node_js: "6.3" + env: TEST=true ALLOW_FAILURE=true + - node_js: "6.2" + env: TEST=true ALLOW_FAILURE=true + - node_js: "6.1" + env: TEST=true ALLOW_FAILURE=true + - node_js: "6.0" + env: TEST=true ALLOW_FAILURE=true + - node_js: "5.11" + env: TEST=true ALLOW_FAILURE=true + - node_js: "5.10" + env: TEST=true ALLOW_FAILURE=true + - node_js: "5.9" + env: TEST=true ALLOW_FAILURE=true + - node_js: "5.8" + env: TEST=true ALLOW_FAILURE=true + - node_js: "5.7" + env: TEST=true ALLOW_FAILURE=true + - node_js: "5.6" + env: TEST=true ALLOW_FAILURE=true + - node_js: "5.5" + env: TEST=true ALLOW_FAILURE=true + - node_js: "5.4" + env: TEST=true ALLOW_FAILURE=true + - node_js: "5.3" + env: TEST=true ALLOW_FAILURE=true + - node_js: "5.2" + env: TEST=true ALLOW_FAILURE=true + - node_js: "5.1" + env: TEST=true ALLOW_FAILURE=true + - node_js: "5.0" + env: TEST=true ALLOW_FAILURE=true + - node_js: "4.8" + env: TEST=true ALLOW_FAILURE=true + - node_js: "4.7" + env: TEST=true ALLOW_FAILURE=true + - node_js: "4.6" + env: TEST=true ALLOW_FAILURE=true + - node_js: "4.5" + env: TEST=true ALLOW_FAILURE=true + - node_js: "4.4" + env: TEST=true ALLOW_FAILURE=true + - node_js: "4.3" + env: TEST=true ALLOW_FAILURE=true + - node_js: "4.2" + env: TEST=true ALLOW_FAILURE=true + - node_js: "4.1" + env: TEST=true ALLOW_FAILURE=true + - node_js: "4.0" + env: TEST=true ALLOW_FAILURE=true + - node_js: "iojs-v3.2" + env: TEST=true ALLOW_FAILURE=true + - node_js: "iojs-v3.1" + env: TEST=true ALLOW_FAILURE=true + - node_js: "iojs-v3.0" + env: TEST=true ALLOW_FAILURE=true + - node_js: "iojs-v2.4" + env: TEST=true ALLOW_FAILURE=true + - node_js: "iojs-v2.3" + env: TEST=true ALLOW_FAILURE=true + - node_js: "iojs-v2.2" + env: TEST=true ALLOW_FAILURE=true + - node_js: "iojs-v2.1" + env: TEST=true ALLOW_FAILURE=true + - node_js: "iojs-v2.0" + env: TEST=true ALLOW_FAILURE=true + - node_js: "iojs-v1.7" + env: TEST=true ALLOW_FAILURE=true + - node_js: "iojs-v1.6" + env: TEST=true ALLOW_FAILURE=true + - node_js: "iojs-v1.5" + env: TEST=true ALLOW_FAILURE=true + - node_js: "iojs-v1.4" + env: TEST=true ALLOW_FAILURE=true + - node_js: "iojs-v1.3" + env: TEST=true ALLOW_FAILURE=true + - node_js: "iojs-v1.2" + env: TEST=true ALLOW_FAILURE=true + - node_js: "iojs-v1.1" + env: TEST=true ALLOW_FAILURE=true + - node_js: "iojs-v1.0" + env: TEST=true ALLOW_FAILURE=true + - node_js: "0.11" + env: TEST=true ALLOW_FAILURE=true + - node_js: "0.9" + env: TEST=true ALLOW_FAILURE=true + - node_js: "0.6" + env: TEST=true ALLOW_FAILURE=true + - node_js: "0.4" + env: TEST=true ALLOW_FAILURE=true + allow_failures: + - os: osx + - env: TEST=true ALLOW_FAILURE=true diff --git a/node_modules/extend/CHANGELOG.md b/node_modules/extend/CHANGELOG.md new file mode 100644 index 0000000..2cf7de6 --- /dev/null +++ b/node_modules/extend/CHANGELOG.md @@ -0,0 +1,83 @@ +3.0.2 / 2018-07-19 +================== + * [Fix] Prevent merging `__proto__` property (#48) + * [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `tape` + * [Tests] up to `node` `v10.7`, `v9.11`, `v8.11`, `v7.10`, `v6.14`, `v4.9`; use `nvm install-latest-npm` + +3.0.1 / 2017-04-27 +================== + * [Fix] deep extending should work with a non-object (#46) + * [Dev Deps] update `tape`, `eslint`, `@ljharb/eslint-config` + * [Tests] up to `node` `v7.9`, `v6.10`, `v4.8`; improve matrix + * [Docs] Switch from vb.teelaun.ch to versionbadg.es for the npm version badge SVG. + * [Docs] Add example to readme (#34) + +3.0.0 / 2015-07-01 +================== + * [Possible breaking change] Use global "strict" directive (#32) + * [Tests] `int` is an ES3 reserved word + * [Tests] Test up to `io.js` `v2.3` + * [Tests] Add `npm run eslint` + * [Dev Deps] Update `covert`, `jscs` + +2.0.1 / 2015-04-25 +================== + * Use an inline `isArray` check, for ES3 browsers. (#27) + * Some old browsers fail when an identifier is `toString` + * Test latest `node` and `io.js` versions on `travis-ci`; speed up builds + * Add license info to package.json (#25) + * Update `tape`, `jscs` + * Adding a CHANGELOG + +2.0.0 / 2014-10-01 +================== + * Increase code coverage to 100%; run code coverage as part of tests + * Add `npm run lint`; Run linter as part of tests + * Remove nodeType and setInterval checks in isPlainObject + * Updating `tape`, `jscs`, `covert` + * General style and README cleanup + +1.3.0 / 2014-06-20 +================== + * Add component.json for browser support (#18) + * Use SVG for badges in README (#16) + * Updating `tape`, `covert` + * Updating travis-ci to work with multiple node versions + * Fix `deep === false` bug (returning target as {}) (#14) + * Fixing constructor checks in isPlainObject + * Adding additional test coverage + * Adding `npm run coverage` + * Add LICENSE (#13) + * Adding a warning about `false`, per #11 + * General style and whitespace cleanup + +1.2.1 / 2013-09-14 +================== + * Fixing hasOwnProperty bugs that would only have shown up in specific browsers. Fixes #8 + * Updating `tape` + +1.2.0 / 2013-09-02 +================== + * Updating the README: add badges + * Adding a missing variable reference. + * Using `tape` instead of `buster` for tests; add more tests (#7) + * Adding node 0.10 to Travis CI (#6) + * Enabling "npm test" and cleaning up package.json (#5) + * Add Travis CI. + +1.1.3 / 2012-12-06 +================== + * Added unit tests. + * Ensure extend function is named. (Looks nicer in a stack trace.) + * README cleanup. + +1.1.1 / 2012-11-07 +================== + * README cleanup. + * Added installation instructions. + * Added a missing semicolon + +1.0.0 / 2012-04-08 +================== + * Initial commit + diff --git a/node_modules/extend/LICENSE b/node_modules/extend/LICENSE new file mode 100644 index 0000000..e16d6a5 --- /dev/null +++ b/node_modules/extend/LICENSE @@ -0,0 +1,23 @@ +The MIT License (MIT) + +Copyright (c) 2014 Stefan Thomas + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + diff --git a/node_modules/extend/README.md b/node_modules/extend/README.md new file mode 100644 index 0000000..5b8249a --- /dev/null +++ b/node_modules/extend/README.md @@ -0,0 +1,81 @@ +[![Build Status][travis-svg]][travis-url] +[![dependency status][deps-svg]][deps-url] +[![dev dependency status][dev-deps-svg]][dev-deps-url] + +# extend() for Node.js [![Version Badge][npm-version-png]][npm-url] + +`node-extend` is a port of the classic extend() method from jQuery. It behaves as you expect. It is simple, tried and true. + +Notes: + +* Since Node.js >= 4, + [`Object.assign`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign) + now offers the same functionality natively (but without the "deep copy" option). + See [ECMAScript 2015 (ES6) in Node.js](https://nodejs.org/en/docs/es6). +* Some native implementations of `Object.assign` in both Node.js and many + browsers (since NPM modules are for the browser too) may not be fully + spec-compliant. + Check [`object.assign`](https://www.npmjs.com/package/object.assign) module for + a compliant candidate. + +## Installation + +This package is available on [npm][npm-url] as: `extend` + +``` sh +npm install extend +``` + +## Usage + +**Syntax:** extend **(** [`deep`], `target`, `object1`, [`objectN`] **)** + +*Extend one object with one or more others, returning the modified object.* + +**Example:** + +``` js +var extend = require('extend'); +extend(targetObject, object1, object2); +``` + +Keep in mind that the target object will be modified, and will be returned from extend(). + +If a boolean true is specified as the first argument, extend performs a deep copy, recursively copying any objects it finds. Otherwise, the copy will share structure with the original object(s). +Undefined properties are not copied. However, properties inherited from the object's prototype will be copied over. +Warning: passing `false` as the first argument is not supported. + +### Arguments + +* `deep` *Boolean* (optional) +If set, the merge becomes recursive (i.e. deep copy). +* `target` *Object* +The object to extend. +* `object1` *Object* +The object that will be merged into the first. +* `objectN` *Object* (Optional) +More objects to merge into the first. + +## License + +`node-extend` is licensed under the [MIT License][mit-license-url]. + +## Acknowledgements + +All credit to the jQuery authors for perfecting this amazing utility. + +Ported to Node.js by [Stefan Thomas][github-justmoon] with contributions by [Jonathan Buchanan][github-insin] and [Jordan Harband][github-ljharb]. + +[travis-svg]: https://travis-ci.org/justmoon/node-extend.svg +[travis-url]: https://travis-ci.org/justmoon/node-extend +[npm-url]: https://npmjs.org/package/extend +[mit-license-url]: http://opensource.org/licenses/MIT +[github-justmoon]: https://github.com/justmoon +[github-insin]: https://github.com/insin +[github-ljharb]: https://github.com/ljharb +[npm-version-png]: http://versionbadg.es/justmoon/node-extend.svg +[deps-svg]: https://david-dm.org/justmoon/node-extend.svg +[deps-url]: https://david-dm.org/justmoon/node-extend +[dev-deps-svg]: https://david-dm.org/justmoon/node-extend/dev-status.svg +[dev-deps-url]: https://david-dm.org/justmoon/node-extend#info=devDependencies + diff --git a/node_modules/extend/component.json b/node_modules/extend/component.json new file mode 100644 index 0000000..1500a2f --- /dev/null +++ b/node_modules/extend/component.json @@ -0,0 +1,32 @@ +{ + "name": "extend", + "author": "Stefan Thomas (http://www.justmoon.net)", + "version": "3.0.0", + "description": "Port of jQuery.extend for node.js and the browser.", + "scripts": [ + "index.js" + ], + "contributors": [ + { + "name": "Jordan Harband", + "url": "https://github.com/ljharb" + } + ], + "keywords": [ + "extend", + "clone", + "merge" + ], + "repository" : { + "type": "git", + "url": "https://github.com/justmoon/node-extend.git" + }, + "dependencies": { + }, + "devDependencies": { + "tape" : "~3.0.0", + "covert": "~0.4.0", + "jscs": "~1.6.2" + } +} + diff --git a/node_modules/extend/index.js b/node_modules/extend/index.js new file mode 100644 index 0000000..2aa3faa --- /dev/null +++ b/node_modules/extend/index.js @@ -0,0 +1,117 @@ +'use strict'; + +var hasOwn = Object.prototype.hasOwnProperty; +var toStr = Object.prototype.toString; +var defineProperty = Object.defineProperty; +var gOPD = Object.getOwnPropertyDescriptor; + +var isArray = function isArray(arr) { + if (typeof Array.isArray === 'function') { + return Array.isArray(arr); + } + + return toStr.call(arr) === '[object Array]'; +}; + +var isPlainObject = function isPlainObject(obj) { + if (!obj || toStr.call(obj) !== '[object Object]') { + return false; + } + + var hasOwnConstructor = hasOwn.call(obj, 'constructor'); + var hasIsPrototypeOf = obj.constructor && obj.constructor.prototype && hasOwn.call(obj.constructor.prototype, 'isPrototypeOf'); + // Not own constructor property must be Object + if (obj.constructor && !hasOwnConstructor && !hasIsPrototypeOf) { + return false; + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. + var key; + for (key in obj) { /**/ } + + return typeof key === 'undefined' || hasOwn.call(obj, key); +}; + +// If name is '__proto__', and Object.defineProperty is available, define __proto__ as an own property on target +var setProperty = function setProperty(target, options) { + if (defineProperty && options.name === '__proto__') { + defineProperty(target, options.name, { + enumerable: true, + configurable: true, + value: options.newValue, + writable: true + }); + } else { + target[options.name] = options.newValue; + } +}; + +// Return undefined instead of __proto__ if '__proto__' is not an own property +var getProperty = function getProperty(obj, name) { + if (name === '__proto__') { + if (!hasOwn.call(obj, name)) { + return void 0; + } else if (gOPD) { + // In early versions of node, obj['__proto__'] is buggy when obj has + // __proto__ as an own property. Object.getOwnPropertyDescriptor() works. + return gOPD(obj, name).value; + } + } + + return obj[name]; +}; + +module.exports = function extend() { + var options, name, src, copy, copyIsArray, clone; + var target = arguments[0]; + var i = 1; + var length = arguments.length; + var deep = false; + + // Handle a deep copy situation + if (typeof target === 'boolean') { + deep = target; + target = arguments[1] || {}; + // skip the boolean and the target + i = 2; + } + if (target == null || (typeof target !== 'object' && typeof target !== 'function')) { + target = {}; + } + + for (; i < length; ++i) { + options = arguments[i]; + // Only deal with non-null/undefined values + if (options != null) { + // Extend the base object + for (name in options) { + src = getProperty(target, name); + copy = getProperty(options, name); + + // Prevent never-ending loop + if (target !== copy) { + // Recurse if we're merging plain objects or arrays + if (deep && copy && (isPlainObject(copy) || (copyIsArray = isArray(copy)))) { + if (copyIsArray) { + copyIsArray = false; + clone = src && isArray(src) ? src : []; + } else { + clone = src && isPlainObject(src) ? src : {}; + } + + // Never move original objects, clone them + setProperty(target, { name: name, newValue: extend(deep, clone, copy) }); + + // Don't bring in undefined values + } else if (typeof copy !== 'undefined') { + setProperty(target, { name: name, newValue: copy }); + } + } + } + } + } + + // Return the modified object + return target; +}; diff --git a/node_modules/extend/package.json b/node_modules/extend/package.json new file mode 100644 index 0000000..948ec46 --- /dev/null +++ b/node_modules/extend/package.json @@ -0,0 +1,75 @@ +{ + "_from": "extend@^3.0.2", + "_id": "extend@3.0.2", + "_inBundle": false, + "_integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "_location": "/extend", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "extend@^3.0.2", + "name": "extend", + "escapedName": "extend", + "rawSpec": "^3.0.2", + "saveSpec": null, + "fetchSpec": "^3.0.2" + }, + "_requiredBy": [ + "/weapp-qrcode" + ], + "_resolved": "https://registry.npmmirror.com/extend/-/extend-3.0.2.tgz", + "_shasum": "f8b1136b4071fbd8eb140aff858b1019ec2915fa", + "_spec": "extend@^3.0.2", + "_where": "D:\\lananWork\\lanan-repair\\node_modules\\weapp-qrcode", + "author": { + "name": "Stefan Thomas", + "email": "justmoon@members.fsf.org", + "url": "http://www.justmoon.net" + }, + "bugs": { + "url": "https://github.com/justmoon/node-extend/issues" + }, + "bundleDependencies": false, + "contributors": [ + { + "name": "Jordan Harband", + "url": "https://github.com/ljharb" + } + ], + "dependencies": {}, + "deprecated": false, + "description": "Port of jQuery.extend for node.js and the browser", + "devDependencies": { + "@ljharb/eslint-config": "^12.2.1", + "covert": "^1.1.0", + "eslint": "^4.19.1", + "jscs": "^3.0.7", + "tape": "^4.9.1" + }, + "homepage": "https://github.com/justmoon/node-extend#readme", + "keywords": [ + "extend", + "clone", + "merge" + ], + "license": "MIT", + "main": "index", + "name": "extend", + "repository": { + "type": "git", + "url": "git+https://github.com/justmoon/node-extend.git" + }, + "scripts": { + "coverage": "covert test/index.js", + "coverage-quiet": "covert test/index.js --quiet", + "eslint": "eslint *.js */*.js", + "jscs": "jscs *.js */*.js", + "lint": "npm run jscs && npm run eslint", + "posttest": "npm run coverage-quiet", + "pretest": "npm run lint", + "test": "npm run tests-only", + "tests-only": "node test" + }, + "version": "3.0.2" +} diff --git a/node_modules/weapp-qrcode/.editorconfig b/node_modules/weapp-qrcode/.editorconfig new file mode 100644 index 0000000..9d08a1a --- /dev/null +++ b/node_modules/weapp-qrcode/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true diff --git a/node_modules/weapp-qrcode/.eslintignore b/node_modules/weapp-qrcode/.eslintignore new file mode 100644 index 0000000..e0b9f74 --- /dev/null +++ b/node_modules/weapp-qrcode/.eslintignore @@ -0,0 +1,2 @@ +build/*.js +src/qrcode.js diff --git a/node_modules/weapp-qrcode/.eslintrc.js b/node_modules/weapp-qrcode/.eslintrc.js new file mode 100644 index 0000000..6913aee --- /dev/null +++ b/node_modules/weapp-qrcode/.eslintrc.js @@ -0,0 +1,26 @@ +module.exports = { + root: true, + parser: 'babel-eslint', + parserOptions: { + sourceType: 'module' + }, + env: { + browser: true, + }, + // https://github.com/feross/standard/blob/master/RULES.md#javascript-standard-style + extends: 'standard', + "globals": { + __VERSION__: false, + ENV: false, + wx: false + }, + // add your custom rules here + 'rules': { + // allow paren-less arrow functions + 'arrow-parens': 0, + // allow async-await + 'generator-star-spacing': 0, + // allow debugger during development + 'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0 + } +} diff --git a/node_modules/weapp-qrcode/.github/ISSUE_TEMPLATE.md b/node_modules/weapp-qrcode/.github/ISSUE_TEMPLATE.md new file mode 100644 index 0000000..3df4aac --- /dev/null +++ b/node_modules/weapp-qrcode/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,37 @@ +# Description + +[问题简单描述] + +# Environment + +* Platform: [开发者工具/iOS/Andriod/Web] +* Platform version: [对应工具或者iOS或者Andriod的版本号] +* Wechat version: [微信版本号] +* weapp-qrcode version: [在package.json里] +* other version: [如果在某一设备下出现该问题,请填写设备号] + +# Reproduce + +**问题复现步骤:** + +1. [第一步] +2. [第二步] +3. [其他步骤...] + +**期望的表现:** + +[在这里描述期望的表现] + +**观察到的表现:** + +[在这里描述观察到的表现] + +**屏幕截图和动态 GIF 图** + +![复现步骤的屏幕截图和动态 GIF 图](图片的 url) + +# Relevant Code / Logs + +``` +// TODO(you): code or logs here to reproduce the problem +``` diff --git a/node_modules/weapp-qrcode/.travis.yml b/node_modules/weapp-qrcode/.travis.yml new file mode 100644 index 0000000..8e7f7fa --- /dev/null +++ b/node_modules/weapp-qrcode/.travis.yml @@ -0,0 +1,23 @@ +language: node_js +sudo: required +node_js: + - 10.0.0 +cache: + directories: + - node_modules +before_install: + - export TZ='Asia/Shanghai' +install: + - npm install +script: + - npm run publish + +after_script: + - git init + - git config user.name "${USER_NAME}" + - git config user.email "${USER_EMAIL}" + - git add . + - git commit -m "publish" + - git push -f https://${access_token}@github.com/yingye/weapp-qrcode HEAD:master + +branch: master \ No newline at end of file diff --git a/node_modules/weapp-qrcode/CHANGELOG.md b/node_modules/weapp-qrcode/CHANGELOG.md new file mode 100644 index 0000000..7285d89 --- /dev/null +++ b/node_modules/weapp-qrcode/CHANGELOG.md @@ -0,0 +1,40 @@ +# Change Log + +Change log for weapp-qrcode. [Details at Github](https://github.com/yingye/weapp-qrcode) + +## [1.0.0] - 2018-12-25 + +- 支持传入绘图上下文(CanvasContext). + +## [1.0.0-beta] - 2018-12-13 + +- 支持二维码在 canvas 上绘制的起始位置. +- 支持在二维码上绘制图片及绘制位置. + +## [0.9.0] - 2018-05-31 + +- 支持绘制带中文的二维码. + +## [0.8.0] - 2018-05-15 + +- 绘制二维码后添加回调函数. + +## [0.7.0] - 2018-05-11 + +- 支持在小程序组件中绘制二维码. + +## [0.6.0] - 2018-04-16 + +- Add multi-output. + +## [0.5.0] - 2018-03-11 + +- Add version in weapp.qrcode.js. + +## [0.4.0] - 2018-03-10 + +- Fix options. + +## [0.3.0] - 2018-02-03 + +- Initial release. diff --git a/node_modules/weapp-qrcode/LICENSE b/node_modules/weapp-qrcode/LICENSE new file mode 100644 index 0000000..1ae54aa --- /dev/null +++ b/node_modules/weapp-qrcode/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 yingye + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/weapp-qrcode/README.md b/node_modules/weapp-qrcode/README.md new file mode 100644 index 0000000..4fe7896 --- /dev/null +++ b/node_modules/weapp-qrcode/README.md @@ -0,0 +1,96 @@ +# weapp-qrcode + +[![npm version](https://badge.fury.io/js/weapp-qrcode.svg)](https://badge.fury.io/js/weapp-qrcode) +[![change-log](https://img.shields.io/badge/changelog-md-blue.svg)](https://github.com/yingye/weapp-qrcode/blob/master/CHANGELOG.md) + +weapp.qrcode.js 在 微信小程序 中,快速生成二维码 + +## Usage + +先在 wxml 文件中,创建绘制的 `canvas`,并定义好 `width`, `height`, `canvasId` 。 + +```html + +``` + +直接引入 js 文件,使用 `drawQrcode()` 绘制二维码。!!!在 调用 `drawQrcode()` 方法之前,一定要确保可以获取到 `canvas context` 。 + +在 v0.6.0 版本构建出多个文件,详情移步[Build Files说明](https://github.com/yingye/weapp-qrcode/blob/master/dist/README.md)。 + +```js +// 将 dist 目录下,weapp.qrcode.esm.js 复制到项目目录中 +import drawQrcode from '../../utils/weapp.qrcode.esm.js' + +drawQrcode({ + width: 200, + height: 200, + canvasId: 'myQrcode', + // ctx: wx.createCanvasContext('myQrcode'), + text: 'https://github.com/yingye', + // v1.0.0+版本支持在二维码上绘制图片 + image: { + imageResource: '../../images/icon.png', + dx: 70, + dy: 70, + dWidth: 60, + dHeight: 60 + } +}) +``` + +如果项目使用了 wepy 框架,可直接安装 `weapp-qrcode` npm包。 + +``` +npm install weapp-qrcode --save +``` + +```js +import drawQrcode from 'weapp-qrcode' + +drawQrcode({ + width: 200, + height: 200, + canvasId: 'myQrcode', + text: 'https://github.com/yingye' +}) +``` + +## DEMO + + + +更多 demo 可以参考 [examples目录](https://github.com/yingye/weapp-qrcode/tree/master/examples),示例包含原生语法及WePY、mpvue、Taro框架。 + +## API + +### drawQrcode([options]) + +#### options + +Type: Object + +| 参数 | 说明 | 示例| +| ------ | ------ | ------ | +| width | 必须,二维码宽度,与`canvas`的`width`保持一致 | 200 | +| height | 必须,二维码高度,与`canvas`的`height`保持一致 | 200 | +| canvasId | 非必须,绘制的`canvasId` | `'myQrcode'` | +| ctx | 非必须,绘图上下文,可通过 `wx.createCanvasContext('canvasId')` 获取,v1.0.0+版本支持 | `'wx.createCanvasContext('canvasId')'` | +| text | 必须,二维码内容 | 'https://github.com/yingye' | +| typeNumber | 非必须,二维码的计算模式,默认值-1 | 8 | +| correctLevel | 非必须,二维码纠错级别,默认值为高级,取值:`{ L: 1, M: 0, Q: 3, H: 2 }` | 1 | +| background | 非必须,二维码背景颜色,默认值白色 | `'#ffffff'` | +| foreground | 非必须,二维码前景色,默认值黑色 | `'#000000'` | +| _this | 非必须,若在组件中使用,需要传入,v0.7.0+版本支持 | this | +| callback | 非必须,绘制完成后的回调函数,v0.8.0+版本支持。安卓手机兼容性问题,可通过自行设置计时器来解决,更多可以参考 [issue #18](https://github.com/yingye/weapp-qrcode/issues/18) | `function (e) { console.log('e', e) }` | +| x | 非必须,二维码绘制的 x 轴起始位置,默认值0,v1.0.0+版本支持 | 100 | +| y | 非必须,二维码绘制的 y 轴起始位置,默认值0,v1.0.0+版本支持 | 100 | +| image | 非必须,在 canvas 上绘制图片,**层级高于二维码**,v1.0.0+版本支持,更多可参考[drawImage](https://developers.weixin.qq.com/miniprogram/dev/api/CanvasContext.drawImage.html) | `{ imageResource: '', dx: 0, dy: 0, dWidth: 100, dHeight: 100 }` | + + +**位置信息可以参见下图:** + + + +## TIPS + +weapp.qrcode.js 二维码生成部分借鉴了 jquery-qrcode 源码,可以参考 [jquery-qrcode](https://github.com/jeromeetienne/jquery-qrcode)。 diff --git a/node_modules/weapp-qrcode/build/rollup.dev.config.js b/node_modules/weapp-qrcode/build/rollup.dev.config.js new file mode 100644 index 0000000..a8ef569 --- /dev/null +++ b/node_modules/weapp-qrcode/build/rollup.dev.config.js @@ -0,0 +1,39 @@ +var babel = require('rollup-plugin-babel') +var resolve = require('rollup-plugin-node-resolve') +var commonjs = require('rollup-plugin-commonjs') +var eslint = require('rollup-plugin-eslint') +var license = require('rollup-plugin-license') + +var path = require('path') + +var pkg = require('../package.json') + +module.exports = { + input: path.resolve(__dirname, '../src/index.js'), + output: [ + { + file: path.resolve(__dirname, '../dist/weapp.qrcode.js'), + format: 'umd' + }, + { + file: path.resolve(__dirname, '../examples/wechat-app/utils/weapp.qrcode.js'), + format: 'umd' + } + ], + moduleName: 'drawQrcode', + plugins: [ + eslint(), + resolve({ + jsnext: true, + main: true, + browser: true + }), + commonjs(), + babel({ + exclude: 'node_modules/**' + }), + license({ + banner: 'weapp.qrcode.js v' + pkg.version + ' (' + pkg.homepage + ')' + }) + ] +} \ No newline at end of file diff --git a/node_modules/weapp-qrcode/build/rollup.prod.config.js b/node_modules/weapp-qrcode/build/rollup.prod.config.js new file mode 100644 index 0000000..c00e826 --- /dev/null +++ b/node_modules/weapp-qrcode/build/rollup.prod.config.js @@ -0,0 +1,49 @@ +var babel = require('rollup-plugin-babel') +var babel = require('rollup-plugin-babel') +var resolve = require('rollup-plugin-node-resolve') +var commonjs = require('rollup-plugin-commonjs') +var eslint = require('rollup-plugin-eslint') +var license = require('rollup-plugin-license') +var uglify = require('rollup-plugin-uglify') + +var path = require('path') +var pkg = require('../package.json') + +module.exports = { + input: path.resolve(__dirname, '../src/index.js'), + output: [ + { + file: path.resolve(__dirname, '../dist/weapp.qrcode.min.js'), + format: 'umd' + }, + { + file: path.resolve(__dirname, '../dist/weapp.qrcode.common.js'), + format: 'cjs' + }, + { + file: path.resolve(__dirname, '../dist/weapp.qrcode.esm.js'), + format: 'es' + } + ], + moduleName: 'drawQrcode', + plugins: [ + eslint(), + resolve({ + jsnext: true, + main: true, + browser: true + }), + commonjs(), + babel({ + exclude: 'node_modules/**' + }), + uglify({ + compress: { + // 'drop_console': true + } + }), + license({ + banner: 'weapp.qrcode.js v' + pkg.version + ' (' + pkg.homepage + ')' + }) + ] +} \ No newline at end of file diff --git a/node_modules/weapp-qrcode/dist/README.md b/node_modules/weapp-qrcode/dist/README.md new file mode 100644 index 0000000..5402359 --- /dev/null +++ b/node_modules/weapp-qrcode/dist/README.md @@ -0,0 +1,6 @@ +## Explanation of Build Files + +| | UMD | CommonJS | ES Module | +| --- | --- | --- | --- | +| **Develpment** | weapp.qrcode.js | weapp.qrcode.common.js | weapp.qrcode.esm.js | +| **Production** | weapp.qrcode.min.js | | | diff --git a/node_modules/weapp-qrcode/dist/weapp.qrcode.common.js b/node_modules/weapp-qrcode/dist/weapp.qrcode.common.js new file mode 100644 index 0000000..c3b37c4 --- /dev/null +++ b/node_modules/weapp-qrcode/dist/weapp.qrcode.common.js @@ -0,0 +1,5 @@ +/** + * weapp.qrcode.js v1.0.0 (https://github.com/yingye/weapp-qrcode#readme) + */ + +"use strict";var hasOwn=Object.prototype.hasOwnProperty,toStr=Object.prototype.toString,defineProperty=Object.defineProperty,gOPD=Object.getOwnPropertyDescriptor,isArray=function(t){return"function"==typeof Array.isArray?Array.isArray(t):"[object Array]"===toStr.call(t)},isPlainObject=function(t){if(!t||"[object Object]"!==toStr.call(t))return!1;var e,r=hasOwn.call(t,"constructor"),o=t.constructor&&t.constructor.prototype&&hasOwn.call(t.constructor.prototype,"isPrototypeOf");if(t.constructor&&!r&&!o)return!1;for(e in t);return void 0===e||hasOwn.call(t,e)},setProperty=function(t,e){defineProperty&&"__proto__"===e.name?defineProperty(t,e.name,{enumerable:!0,configurable:!0,value:e.newValue,writable:!0}):t[e.name]=e.newValue},getProperty=function(t,e){if("__proto__"===e){if(!hasOwn.call(t,e))return;if(gOPD)return gOPD(t,e).value}return t[e]},extend=function t(){var e,r,o,n,i,a,s=arguments[0],u=1,l=arguments.length,h=!1;for("boolean"==typeof s&&(h=s,s=arguments[1]||{},u=2),(null==s||"object"!=typeof s&&"function"!=typeof s)&&(s={});u=7&&this.setupTypeNumber(t),null==this.dataCache&&(this.dataCache=QRCode.createData(this.typeNumber,this.errorCorrectLevel,this.dataList)),this.mapData(this.dataCache,e)},setupPositionProbePattern:function(t,e){for(var r=-1;r<=7;r++)if(!(t+r<=-1||this.moduleCount<=t+r))for(var o=-1;o<=7;o++)e+o<=-1||this.moduleCount<=e+o||(this.modules[t+r][e+o]=0<=r&&r<=6&&(0==o||6==o)||0<=o&&o<=6&&(0==r||6==r)||2<=r&&r<=4&&2<=o&&o<=4)},getBestMaskPattern:function(){for(var t=0,e=0,r=0;r<8;r++){this.makeImpl(!0,r);var o=QRUtil.getLostPoint(this);(0==r||t>o)&&(t=o,e=r)}return e},createMovieClip:function(t,e,r){var o=t.createEmptyMovieClip(e,r);this.make();for(var n=0;n>r&1);this.modules[Math.floor(r/3)][r%3+this.moduleCount-8-3]=o}for(r=0;r<18;r++){o=!t&&1==(e>>r&1);this.modules[r%3+this.moduleCount-8-3][Math.floor(r/3)]=o}},setupTypeInfo:function(t,e){for(var r=this.errorCorrectLevel<<3|e,o=QRUtil.getBCHTypeInfo(r),n=0;n<15;n++){var i=!t&&1==(o>>n&1);n<6?this.modules[n][8]=i:n<8?this.modules[n+1][8]=i:this.modules[this.moduleCount-15+n][8]=i}for(n=0;n<15;n++){i=!t&&1==(o>>n&1);n<8?this.modules[8][this.moduleCount-n-1]=i:n<9?this.modules[8][15-n-1+1]=i:this.modules[8][15-n-1]=i}this.modules[this.moduleCount-8][8]=!t},mapData:function(t,e){for(var r=-1,o=this.moduleCount-1,n=7,i=0,a=this.moduleCount-1;a>0;a-=2)for(6==a&&a--;;){for(var s=0;s<2;s++)if(null==this.modules[o][a-s]){var u=!1;i>>n&1)),QRUtil.getMask(e,o,a-s)&&(u=!u),this.modules[o][a-s]=u,-1==--n&&(i++,n=7)}if((o+=r)<0||this.moduleCount<=o){o-=r,r=-r;break}}}},QRCode.PAD0=236,QRCode.PAD1=17,QRCode.createData=function(t,e,r){for(var o=QRRSBlock.getRSBlocks(t,e),n=new QRBitBuffer,i=0;i8*s)throw new Error("code length overflow. ("+n.getLengthInBits()+">"+8*s+")");for(n.getLengthInBits()+4<=8*s&&n.put(0,4);n.getLengthInBits()%8!=0;)n.putBit(!1);for(;!(n.getLengthInBits()>=8*s||(n.put(QRCode.PAD0,8),n.getLengthInBits()>=8*s));)n.put(QRCode.PAD1,8);return QRCode.createBytes(n,o)},QRCode.createBytes=function(t,e){for(var r=0,o=0,n=0,i=new Array(e.length),a=new Array(e.length),s=0;s=0?g.get(c):0}}var d=0;for(h=0;h=0;)e^=QRUtil.G15<=0;)e^=QRUtil.G18<>>=1;return e},getPatternPosition:function(t){return QRUtil.PATTERN_POSITION_TABLE[t-1]},getMask:function(t,e,r){switch(t){case QRMaskPattern.PATTERN000:return(e+r)%2==0;case QRMaskPattern.PATTERN001:return e%2==0;case QRMaskPattern.PATTERN010:return r%3==0;case QRMaskPattern.PATTERN011:return(e+r)%3==0;case QRMaskPattern.PATTERN100:return(Math.floor(e/2)+Math.floor(r/3))%2==0;case QRMaskPattern.PATTERN101:return e*r%2+e*r%3==0;case QRMaskPattern.PATTERN110:return(e*r%2+e*r%3)%2==0;case QRMaskPattern.PATTERN111:return(e*r%3+(e+r)%2)%2==0;default:throw new Error("bad maskPattern:"+t)}},getErrorCorrectPolynomial:function(t){for(var e=new QRPolynomial([1],0),r=0;r5&&(r+=3+i-5)}for(o=0;o=256;)t-=255;return QRMath.EXP_TABLE[t]},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)},i=0;i<8;i++)QRMath.EXP_TABLE[i]=1<=1&&n<=127?e+=t.charAt(r):n>2047?(e+=String.fromCharCode(224|n>>12&15),e+=String.fromCharCode(128|n>>6&63),e+=String.fromCharCode(128|n>>0&63)):(e+=String.fromCharCode(192|n>>6&31),e+=String.fromCharCode(128|n>>0&63));return e}function drawQrcode(t){t=t||{},(t=extend(!0,{width:256,height:256,x:0,y:0,typeNumber:-1,correctLevel:QRErrorCorrectLevel.H,background:"#ffffff",foreground:"#000000",image:{imageResource:"",dx:0,dy:0,dWidth:100,dHeight:100}},t)).canvasId||t.ctx?function(){var e,r=new QRCode(t.typeNumber,t.correctLevel);r.addData(utf16to8(t.text)),r.make(),e=t.ctx?t.ctx:t._this?wx.createCanvasContext&&wx.createCanvasContext(t.canvasId,t._this):wx.createCanvasContext&&wx.createCanvasContext(t.canvasId);for(var o=t.width/r.getModuleCount(),n=t.height/r.getModuleCount(),i=0;i>>7-t%8&1)},put:function(t,e){for(var r=0;r>>e-r-1&1))},getLengthInBits:function(){return this.length},putBit:function(t){var e=Math.floor(this.length/8);this.buffer.length<=e&&this.buffer.push(0),t&&(this.buffer[e]|=128>>>this.length%8),this.length++}},module.exports=drawQrcode; diff --git a/node_modules/weapp-qrcode/dist/weapp.qrcode.esm.js b/node_modules/weapp-qrcode/dist/weapp.qrcode.esm.js new file mode 100644 index 0000000..5613f25 --- /dev/null +++ b/node_modules/weapp-qrcode/dist/weapp.qrcode.esm.js @@ -0,0 +1,5 @@ +/** + * weapp.qrcode.js v1.0.0 (https://github.com/yingye/weapp-qrcode#readme) + */ + +var hasOwn=Object.prototype.hasOwnProperty,toStr=Object.prototype.toString,defineProperty=Object.defineProperty,gOPD=Object.getOwnPropertyDescriptor,isArray=function(t){return"function"==typeof Array.isArray?Array.isArray(t):"[object Array]"===toStr.call(t)},isPlainObject=function(t){if(!t||"[object Object]"!==toStr.call(t))return!1;var e,r=hasOwn.call(t,"constructor"),o=t.constructor&&t.constructor.prototype&&hasOwn.call(t.constructor.prototype,"isPrototypeOf");if(t.constructor&&!r&&!o)return!1;for(e in t);return void 0===e||hasOwn.call(t,e)},setProperty=function(t,e){defineProperty&&"__proto__"===e.name?defineProperty(t,e.name,{enumerable:!0,configurable:!0,value:e.newValue,writable:!0}):t[e.name]=e.newValue},getProperty=function(t,e){if("__proto__"===e){if(!hasOwn.call(t,e))return;if(gOPD)return gOPD(t,e).value}return t[e]},extend=function t(){var e,r,o,n,i,a,s=arguments[0],u=1,l=arguments.length,h=!1;for("boolean"==typeof s&&(h=s,s=arguments[1]||{},u=2),(null==s||"object"!=typeof s&&"function"!=typeof s)&&(s={});u=7&&this.setupTypeNumber(t),null==this.dataCache&&(this.dataCache=QRCode.createData(this.typeNumber,this.errorCorrectLevel,this.dataList)),this.mapData(this.dataCache,e)},setupPositionProbePattern:function(t,e){for(var r=-1;r<=7;r++)if(!(t+r<=-1||this.moduleCount<=t+r))for(var o=-1;o<=7;o++)e+o<=-1||this.moduleCount<=e+o||(this.modules[t+r][e+o]=0<=r&&r<=6&&(0==o||6==o)||0<=o&&o<=6&&(0==r||6==r)||2<=r&&r<=4&&2<=o&&o<=4)},getBestMaskPattern:function(){for(var t=0,e=0,r=0;r<8;r++){this.makeImpl(!0,r);var o=QRUtil.getLostPoint(this);(0==r||t>o)&&(t=o,e=r)}return e},createMovieClip:function(t,e,r){var o=t.createEmptyMovieClip(e,r);this.make();for(var n=0;n>r&1);this.modules[Math.floor(r/3)][r%3+this.moduleCount-8-3]=o}for(r=0;r<18;r++){o=!t&&1==(e>>r&1);this.modules[r%3+this.moduleCount-8-3][Math.floor(r/3)]=o}},setupTypeInfo:function(t,e){for(var r=this.errorCorrectLevel<<3|e,o=QRUtil.getBCHTypeInfo(r),n=0;n<15;n++){var i=!t&&1==(o>>n&1);n<6?this.modules[n][8]=i:n<8?this.modules[n+1][8]=i:this.modules[this.moduleCount-15+n][8]=i}for(n=0;n<15;n++){i=!t&&1==(o>>n&1);n<8?this.modules[8][this.moduleCount-n-1]=i:n<9?this.modules[8][15-n-1+1]=i:this.modules[8][15-n-1]=i}this.modules[this.moduleCount-8][8]=!t},mapData:function(t,e){for(var r=-1,o=this.moduleCount-1,n=7,i=0,a=this.moduleCount-1;a>0;a-=2)for(6==a&&a--;;){for(var s=0;s<2;s++)if(null==this.modules[o][a-s]){var u=!1;i>>n&1)),QRUtil.getMask(e,o,a-s)&&(u=!u),this.modules[o][a-s]=u,-1==--n&&(i++,n=7)}if((o+=r)<0||this.moduleCount<=o){o-=r,r=-r;break}}}},QRCode.PAD0=236,QRCode.PAD1=17,QRCode.createData=function(t,e,r){for(var o=QRRSBlock.getRSBlocks(t,e),n=new QRBitBuffer,i=0;i8*s)throw new Error("code length overflow. ("+n.getLengthInBits()+">"+8*s+")");for(n.getLengthInBits()+4<=8*s&&n.put(0,4);n.getLengthInBits()%8!=0;)n.putBit(!1);for(;!(n.getLengthInBits()>=8*s||(n.put(QRCode.PAD0,8),n.getLengthInBits()>=8*s));)n.put(QRCode.PAD1,8);return QRCode.createBytes(n,o)},QRCode.createBytes=function(t,e){for(var r=0,o=0,n=0,i=new Array(e.length),a=new Array(e.length),s=0;s=0?g.get(c):0}}var d=0;for(h=0;h=0;)e^=QRUtil.G15<=0;)e^=QRUtil.G18<>>=1;return e},getPatternPosition:function(t){return QRUtil.PATTERN_POSITION_TABLE[t-1]},getMask:function(t,e,r){switch(t){case QRMaskPattern.PATTERN000:return(e+r)%2==0;case QRMaskPattern.PATTERN001:return e%2==0;case QRMaskPattern.PATTERN010:return r%3==0;case QRMaskPattern.PATTERN011:return(e+r)%3==0;case QRMaskPattern.PATTERN100:return(Math.floor(e/2)+Math.floor(r/3))%2==0;case QRMaskPattern.PATTERN101:return e*r%2+e*r%3==0;case QRMaskPattern.PATTERN110:return(e*r%2+e*r%3)%2==0;case QRMaskPattern.PATTERN111:return(e*r%3+(e+r)%2)%2==0;default:throw new Error("bad maskPattern:"+t)}},getErrorCorrectPolynomial:function(t){for(var e=new QRPolynomial([1],0),r=0;r5&&(r+=3+i-5)}for(o=0;o=256;)t-=255;return QRMath.EXP_TABLE[t]},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)},i=0;i<8;i++)QRMath.EXP_TABLE[i]=1<=1&&n<=127?e+=t.charAt(r):n>2047?(e+=String.fromCharCode(224|n>>12&15),e+=String.fromCharCode(128|n>>6&63),e+=String.fromCharCode(128|n>>0&63)):(e+=String.fromCharCode(192|n>>6&31),e+=String.fromCharCode(128|n>>0&63));return e}function drawQrcode(t){t=t||{},(t=extend(!0,{width:256,height:256,x:0,y:0,typeNumber:-1,correctLevel:QRErrorCorrectLevel.H,background:"#ffffff",foreground:"#000000",image:{imageResource:"",dx:0,dy:0,dWidth:100,dHeight:100}},t)).canvasId||t.ctx?function(){var e,r=new QRCode(t.typeNumber,t.correctLevel);r.addData(utf16to8(t.text)),r.make(),e=t.ctx?t.ctx:t._this?wx.createCanvasContext&&wx.createCanvasContext(t.canvasId,t._this):wx.createCanvasContext&&wx.createCanvasContext(t.canvasId);for(var o=t.width/r.getModuleCount(),n=t.height/r.getModuleCount(),i=0;i>>7-t%8&1)},put:function(t,e){for(var r=0;r>>e-r-1&1))},getLengthInBits:function(){return this.length},putBit:function(t){var e=Math.floor(this.length/8);this.buffer.length<=e&&this.buffer.push(0),t&&(this.buffer[e]|=128>>>this.length%8),this.length++}};export default drawQrcode; diff --git a/node_modules/weapp-qrcode/dist/weapp.qrcode.js b/node_modules/weapp-qrcode/dist/weapp.qrcode.js new file mode 100644 index 0000000..2967226 --- /dev/null +++ b/node_modules/weapp-qrcode/dist/weapp.qrcode.js @@ -0,0 +1,1281 @@ +/** + * weapp.qrcode.js v1.0.0 (https://github.com/yingye/weapp-qrcode#readme) + */ + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global.drawQrcode = factory()); +}(this, (function () { 'use strict'; + +var hasOwn = Object.prototype.hasOwnProperty; +var toStr = Object.prototype.toString; +var defineProperty = Object.defineProperty; +var gOPD = Object.getOwnPropertyDescriptor; + +var isArray = function isArray(arr) { + if (typeof Array.isArray === 'function') { + return Array.isArray(arr); + } + + return toStr.call(arr) === '[object Array]'; +}; + +var isPlainObject = function isPlainObject(obj) { + if (!obj || toStr.call(obj) !== '[object Object]') { + return false; + } + + var hasOwnConstructor = hasOwn.call(obj, 'constructor'); + var hasIsPrototypeOf = obj.constructor && obj.constructor.prototype && hasOwn.call(obj.constructor.prototype, 'isPrototypeOf'); + // Not own constructor property must be Object + if (obj.constructor && !hasOwnConstructor && !hasIsPrototypeOf) { + return false; + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. + var key; + for (key in obj) { /**/ } + + return typeof key === 'undefined' || hasOwn.call(obj, key); +}; + +// If name is '__proto__', and Object.defineProperty is available, define __proto__ as an own property on target +var setProperty = function setProperty(target, options) { + if (defineProperty && options.name === '__proto__') { + defineProperty(target, options.name, { + enumerable: true, + configurable: true, + value: options.newValue, + writable: true + }); + } else { + target[options.name] = options.newValue; + } +}; + +// Return undefined instead of __proto__ if '__proto__' is not an own property +var getProperty = function getProperty(obj, name) { + if (name === '__proto__') { + if (!hasOwn.call(obj, name)) { + return void 0; + } else if (gOPD) { + // In early versions of node, obj['__proto__'] is buggy when obj has + // __proto__ as an own property. Object.getOwnPropertyDescriptor() works. + return gOPD(obj, name).value; + } + } + + return obj[name]; +}; + +var extend = function extend() { + var options, name, src, copy, copyIsArray, clone; + var target = arguments[0]; + var i = 1; + var length = arguments.length; + var deep = false; + + // Handle a deep copy situation + if (typeof target === 'boolean') { + deep = target; + target = arguments[1] || {}; + // skip the boolean and the target + i = 2; + } + if (target == null || (typeof target !== 'object' && typeof target !== 'function')) { + target = {}; + } + + for (; i < length; ++i) { + options = arguments[i]; + // Only deal with non-null/undefined values + if (options != null) { + // Extend the base object + for (name in options) { + src = getProperty(target, name); + copy = getProperty(options, name); + + // Prevent never-ending loop + if (target !== copy) { + // Recurse if we're merging plain objects or arrays + if (deep && copy && (isPlainObject(copy) || (copyIsArray = isArray(copy)))) { + if (copyIsArray) { + copyIsArray = false; + clone = src && isArray(src) ? src : []; + } else { + clone = src && isPlainObject(src) ? src : {}; + } + + // Never move original objects, clone them + setProperty(target, { name: name, newValue: extend(deep, clone, copy) }); + + // Don't bring in undefined values + } else if (typeof copy !== 'undefined') { + setProperty(target, { name: name, newValue: copy }); + } + } + } + } + } + + // Return the modified object + return target; +}; + +//--------------------------------------------------------------------- +// QRCode for JavaScript +// +// Copyright (c) 2009 Kazuhiko Arase +// +// URL: http://www.d-project.com/ +// +// Licensed under the MIT license: +// http://www.opensource.org/licenses/mit-license.php +// +// The word "QR Code" is registered trademark of +// DENSO WAVE INCORPORATED +// http://www.denso-wave.com/qrcode/faqpatent-e.html +// +//--------------------------------------------------------------------- + +//--------------------------------------------------------------------- +// QR8bitByte +//--------------------------------------------------------------------- + +function QR8bitByte(data) { + this.mode = QRMode.MODE_8BIT_BYTE; + this.data = data; +} + +QR8bitByte.prototype = { + + getLength: function (buffer) { + return this.data.length; + }, + + write: function (buffer) { + for (var i = 0; i < this.data.length; i++) { + // not JIS ... + buffer.put(this.data.charCodeAt(i), 8); + } + } +}; + +//--------------------------------------------------------------------- +// QRCode +//--------------------------------------------------------------------- + +function QRCode(typeNumber, errorCorrectLevel) { + this.typeNumber = typeNumber; + this.errorCorrectLevel = errorCorrectLevel; + this.modules = null; + this.moduleCount = 0; + this.dataCache = null; + this.dataList = new Array(); +} + +QRCode.prototype = { + + addData: function (data) { + var newData = new QR8bitByte(data); + this.dataList.push(newData); + this.dataCache = null; + }, + + isDark: function (row, col) { + if (row < 0 || this.moduleCount <= row || col < 0 || this.moduleCount <= col) { + throw new Error(row + "," + col); + } + return this.modules[row][col]; + }, + + getModuleCount: function () { + return this.moduleCount; + }, + + make: function () { + // Calculate automatically typeNumber if provided is < 1 + if (this.typeNumber < 1) { + var typeNumber = 1; + for (typeNumber = 1; typeNumber < 40; typeNumber++) { + var rsBlocks = QRRSBlock.getRSBlocks(typeNumber, this.errorCorrectLevel); + + var buffer = new QRBitBuffer(); + var totalDataCount = 0; + for (var i = 0; i < rsBlocks.length; i++) { + totalDataCount += rsBlocks[i].dataCount; + } + + for (var i = 0; i < this.dataList.length; i++) { + var data = this.dataList[i]; + buffer.put(data.mode, 4); + buffer.put(data.getLength(), QRUtil.getLengthInBits(data.mode, typeNumber)); + data.write(buffer); + } + if (buffer.getLengthInBits() <= totalDataCount * 8) break; + } + this.typeNumber = typeNumber; + } + this.makeImpl(false, this.getBestMaskPattern()); + }, + + makeImpl: function (test, maskPattern) { + + this.moduleCount = this.typeNumber * 4 + 17; + this.modules = new Array(this.moduleCount); + + for (var row = 0; row < this.moduleCount; row++) { + + this.modules[row] = new Array(this.moduleCount); + + for (var col = 0; col < this.moduleCount; col++) { + this.modules[row][col] = null; //(col + row) % 3; + } + } + + this.setupPositionProbePattern(0, 0); + this.setupPositionProbePattern(this.moduleCount - 7, 0); + this.setupPositionProbePattern(0, this.moduleCount - 7); + this.setupPositionAdjustPattern(); + this.setupTimingPattern(); + this.setupTypeInfo(test, maskPattern); + + if (this.typeNumber >= 7) { + this.setupTypeNumber(test); + } + + if (this.dataCache == null) { + this.dataCache = QRCode.createData(this.typeNumber, this.errorCorrectLevel, this.dataList); + } + + this.mapData(this.dataCache, maskPattern); + }, + + setupPositionProbePattern: function (row, col) { + + for (var r = -1; r <= 7; r++) { + + if (row + r <= -1 || this.moduleCount <= row + r) continue; + + for (var c = -1; c <= 7; c++) { + + if (col + c <= -1 || this.moduleCount <= col + c) continue; + + if (0 <= r && r <= 6 && (c == 0 || c == 6) || 0 <= c && c <= 6 && (r == 0 || r == 6) || 2 <= r && r <= 4 && 2 <= c && c <= 4) { + this.modules[row + r][col + c] = true; + } else { + this.modules[row + r][col + c] = false; + } + } + } + }, + + getBestMaskPattern: function () { + + var minLostPoint = 0; + var pattern = 0; + + for (var i = 0; i < 8; i++) { + + this.makeImpl(true, i); + + var lostPoint = QRUtil.getLostPoint(this); + + if (i == 0 || minLostPoint > lostPoint) { + minLostPoint = lostPoint; + pattern = i; + } + } + + return pattern; + }, + + createMovieClip: function (target_mc, instance_name, depth) { + + var qr_mc = target_mc.createEmptyMovieClip(instance_name, depth); + var cs = 1; + + this.make(); + + for (var row = 0; row < this.modules.length; row++) { + + var y = row * cs; + + for (var col = 0; col < this.modules[row].length; col++) { + + var x = col * cs; + var dark = this.modules[row][col]; + + if (dark) { + qr_mc.beginFill(0, 100); + qr_mc.moveTo(x, y); + qr_mc.lineTo(x + cs, y); + qr_mc.lineTo(x + cs, y + cs); + qr_mc.lineTo(x, y + cs); + qr_mc.endFill(); + } + } + } + + return qr_mc; + }, + + setupTimingPattern: function () { + + for (var r = 8; r < this.moduleCount - 8; r++) { + if (this.modules[r][6] != null) { + continue; + } + this.modules[r][6] = r % 2 == 0; + } + + for (var c = 8; c < this.moduleCount - 8; c++) { + if (this.modules[6][c] != null) { + continue; + } + this.modules[6][c] = c % 2 == 0; + } + }, + + setupPositionAdjustPattern: function () { + + var pos = QRUtil.getPatternPosition(this.typeNumber); + + for (var i = 0; i < pos.length; i++) { + + for (var j = 0; j < pos.length; j++) { + + var row = pos[i]; + var col = pos[j]; + + if (this.modules[row][col] != null) { + continue; + } + + for (var r = -2; r <= 2; r++) { + + for (var c = -2; c <= 2; c++) { + + if (r == -2 || r == 2 || c == -2 || c == 2 || r == 0 && c == 0) { + this.modules[row + r][col + c] = true; + } else { + this.modules[row + r][col + c] = false; + } + } + } + } + } + }, + + setupTypeNumber: function (test) { + + var bits = QRUtil.getBCHTypeNumber(this.typeNumber); + + for (var i = 0; i < 18; i++) { + var mod = !test && (bits >> i & 1) == 1; + this.modules[Math.floor(i / 3)][i % 3 + this.moduleCount - 8 - 3] = mod; + } + + for (var i = 0; i < 18; i++) { + var mod = !test && (bits >> i & 1) == 1; + this.modules[i % 3 + this.moduleCount - 8 - 3][Math.floor(i / 3)] = mod; + } + }, + + setupTypeInfo: function (test, maskPattern) { + + var data = this.errorCorrectLevel << 3 | maskPattern; + var bits = QRUtil.getBCHTypeInfo(data); + + // vertical + for (var i = 0; i < 15; i++) { + + var mod = !test && (bits >> i & 1) == 1; + + if (i < 6) { + this.modules[i][8] = mod; + } else if (i < 8) { + this.modules[i + 1][8] = mod; + } else { + this.modules[this.moduleCount - 15 + i][8] = mod; + } + } + + // horizontal + for (var i = 0; i < 15; i++) { + + var mod = !test && (bits >> i & 1) == 1; + + if (i < 8) { + this.modules[8][this.moduleCount - i - 1] = mod; + } else if (i < 9) { + this.modules[8][15 - i - 1 + 1] = mod; + } else { + this.modules[8][15 - i - 1] = mod; + } + } + + // fixed module + this.modules[this.moduleCount - 8][8] = !test; + }, + + mapData: function (data, maskPattern) { + + var inc = -1; + var row = this.moduleCount - 1; + var bitIndex = 7; + var byteIndex = 0; + + for (var col = this.moduleCount - 1; col > 0; col -= 2) { + + if (col == 6) col--; + + while (true) { + + for (var c = 0; c < 2; c++) { + + if (this.modules[row][col - c] == null) { + + var dark = false; + + if (byteIndex < data.length) { + dark = (data[byteIndex] >>> bitIndex & 1) == 1; + } + + var mask = QRUtil.getMask(maskPattern, row, col - c); + + if (mask) { + dark = !dark; + } + + this.modules[row][col - c] = dark; + bitIndex--; + + if (bitIndex == -1) { + byteIndex++; + bitIndex = 7; + } + } + } + + row += inc; + + if (row < 0 || this.moduleCount <= row) { + row -= inc; + inc = -inc; + break; + } + } + } + } + +}; + +QRCode.PAD0 = 0xEC; +QRCode.PAD1 = 0x11; + +QRCode.createData = function (typeNumber, errorCorrectLevel, dataList) { + + var rsBlocks = QRRSBlock.getRSBlocks(typeNumber, errorCorrectLevel); + + var buffer = new QRBitBuffer(); + + for (var i = 0; i < dataList.length; i++) { + var data = dataList[i]; + buffer.put(data.mode, 4); + buffer.put(data.getLength(), QRUtil.getLengthInBits(data.mode, typeNumber)); + data.write(buffer); + } + + // calc num max data. + var totalDataCount = 0; + for (var i = 0; i < rsBlocks.length; i++) { + totalDataCount += rsBlocks[i].dataCount; + } + + if (buffer.getLengthInBits() > totalDataCount * 8) { + throw new Error("code length overflow. (" + buffer.getLengthInBits() + ">" + totalDataCount * 8 + ")"); + } + + // end code + if (buffer.getLengthInBits() + 4 <= totalDataCount * 8) { + buffer.put(0, 4); + } + + // padding + while (buffer.getLengthInBits() % 8 != 0) { + buffer.putBit(false); + } + + // padding + while (true) { + + if (buffer.getLengthInBits() >= totalDataCount * 8) { + break; + } + buffer.put(QRCode.PAD0, 8); + + if (buffer.getLengthInBits() >= totalDataCount * 8) { + break; + } + buffer.put(QRCode.PAD1, 8); + } + + return QRCode.createBytes(buffer, rsBlocks); +}; + +QRCode.createBytes = function (buffer, rsBlocks) { + + var offset = 0; + + var maxDcCount = 0; + var maxEcCount = 0; + + var dcdata = new Array(rsBlocks.length); + var ecdata = new Array(rsBlocks.length); + + for (var r = 0; r < rsBlocks.length; r++) { + + var dcCount = rsBlocks[r].dataCount; + var ecCount = rsBlocks[r].totalCount - dcCount; + + maxDcCount = Math.max(maxDcCount, dcCount); + maxEcCount = Math.max(maxEcCount, ecCount); + + dcdata[r] = new Array(dcCount); + + for (var i = 0; i < dcdata[r].length; i++) { + dcdata[r][i] = 0xff & buffer.buffer[i + offset]; + } + offset += dcCount; + + var rsPoly = QRUtil.getErrorCorrectPolynomial(ecCount); + var rawPoly = new QRPolynomial(dcdata[r], rsPoly.getLength() - 1); + + var modPoly = rawPoly.mod(rsPoly); + ecdata[r] = new Array(rsPoly.getLength() - 1); + for (var i = 0; i < ecdata[r].length; i++) { + var modIndex = i + modPoly.getLength() - ecdata[r].length; + ecdata[r][i] = modIndex >= 0 ? modPoly.get(modIndex) : 0; + } + } + + var totalCodeCount = 0; + for (var i = 0; i < rsBlocks.length; i++) { + totalCodeCount += rsBlocks[i].totalCount; + } + + var data = new Array(totalCodeCount); + var index = 0; + + for (var i = 0; i < maxDcCount; i++) { + for (var r = 0; r < rsBlocks.length; r++) { + if (i < dcdata[r].length) { + data[index++] = dcdata[r][i]; + } + } + } + + for (var i = 0; i < maxEcCount; i++) { + for (var r = 0; r < rsBlocks.length; r++) { + if (i < ecdata[r].length) { + data[index++] = ecdata[r][i]; + } + } + } + + return data; +}; + +//--------------------------------------------------------------------- +// QRMode +//--------------------------------------------------------------------- + +var QRMode = { + MODE_NUMBER: 1 << 0, + MODE_ALPHA_NUM: 1 << 1, + MODE_8BIT_BYTE: 1 << 2, + MODE_KANJI: 1 << 3 +}; + +//--------------------------------------------------------------------- +// QRErrorCorrectLevel +//--------------------------------------------------------------------- + +var QRErrorCorrectLevel = { + L: 1, + M: 0, + Q: 3, + H: 2 +}; + +//--------------------------------------------------------------------- +// QRMaskPattern +//--------------------------------------------------------------------- + +var QRMaskPattern = { + PATTERN000: 0, + PATTERN001: 1, + PATTERN010: 2, + PATTERN011: 3, + PATTERN100: 4, + PATTERN101: 5, + PATTERN110: 6, + PATTERN111: 7 +}; + +//--------------------------------------------------------------------- +// QRUtil +//--------------------------------------------------------------------- + +var QRUtil = { + + PATTERN_POSITION_TABLE: [[], [6, 18], [6, 22], [6, 26], [6, 30], [6, 34], [6, 22, 38], [6, 24, 42], [6, 26, 46], [6, 28, 50], [6, 30, 54], [6, 32, 58], [6, 34, 62], [6, 26, 46, 66], [6, 26, 48, 70], [6, 26, 50, 74], [6, 30, 54, 78], [6, 30, 56, 82], [6, 30, 58, 86], [6, 34, 62, 90], [6, 28, 50, 72, 94], [6, 26, 50, 74, 98], [6, 30, 54, 78, 102], [6, 28, 54, 80, 106], [6, 32, 58, 84, 110], [6, 30, 58, 86, 114], [6, 34, 62, 90, 118], [6, 26, 50, 74, 98, 122], [6, 30, 54, 78, 102, 126], [6, 26, 52, 78, 104, 130], [6, 30, 56, 82, 108, 134], [6, 34, 60, 86, 112, 138], [6, 30, 58, 86, 114, 142], [6, 34, 62, 90, 118, 146], [6, 30, 54, 78, 102, 126, 150], [6, 24, 50, 76, 102, 128, 154], [6, 28, 54, 80, 106, 132, 158], [6, 32, 58, 84, 110, 136, 162], [6, 26, 54, 82, 110, 138, 166], [6, 30, 58, 86, 114, 142, 170]], + + G15: 1 << 10 | 1 << 8 | 1 << 5 | 1 << 4 | 1 << 2 | 1 << 1 | 1 << 0, + G18: 1 << 12 | 1 << 11 | 1 << 10 | 1 << 9 | 1 << 8 | 1 << 5 | 1 << 2 | 1 << 0, + G15_MASK: 1 << 14 | 1 << 12 | 1 << 10 | 1 << 4 | 1 << 1, + + getBCHTypeInfo: function (data) { + var d = data << 10; + while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15) >= 0) { + d ^= QRUtil.G15 << QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15); + } + return (data << 10 | d) ^ QRUtil.G15_MASK; + }, + + getBCHTypeNumber: function (data) { + var d = data << 12; + while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18) >= 0) { + d ^= QRUtil.G18 << QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18); + } + return data << 12 | d; + }, + + getBCHDigit: function (data) { + + var digit = 0; + + while (data != 0) { + digit++; + data >>>= 1; + } + + return digit; + }, + + getPatternPosition: function (typeNumber) { + return QRUtil.PATTERN_POSITION_TABLE[typeNumber - 1]; + }, + + getMask: function (maskPattern, i, j) { + + switch (maskPattern) { + + case QRMaskPattern.PATTERN000: + return (i + j) % 2 == 0; + case QRMaskPattern.PATTERN001: + return i % 2 == 0; + case QRMaskPattern.PATTERN010: + return j % 3 == 0; + case QRMaskPattern.PATTERN011: + return (i + j) % 3 == 0; + case QRMaskPattern.PATTERN100: + return (Math.floor(i / 2) + Math.floor(j / 3)) % 2 == 0; + case QRMaskPattern.PATTERN101: + return i * j % 2 + i * j % 3 == 0; + case QRMaskPattern.PATTERN110: + return (i * j % 2 + i * j % 3) % 2 == 0; + case QRMaskPattern.PATTERN111: + return (i * j % 3 + (i + j) % 2) % 2 == 0; + + default: + throw new Error("bad maskPattern:" + maskPattern); + } + }, + + getErrorCorrectPolynomial: function (errorCorrectLength) { + + var a = new QRPolynomial([1], 0); + + for (var i = 0; i < errorCorrectLength; i++) { + a = a.multiply(new QRPolynomial([1, QRMath.gexp(i)], 0)); + } + + return a; + }, + + getLengthInBits: function (mode, type) { + + if (1 <= type && type < 10) { + + // 1 - 9 + + switch (mode) { + case QRMode.MODE_NUMBER: + return 10; + case QRMode.MODE_ALPHA_NUM: + return 9; + case QRMode.MODE_8BIT_BYTE: + return 8; + case QRMode.MODE_KANJI: + return 8; + default: + throw new Error("mode:" + mode); + } + } else if (type < 27) { + + // 10 - 26 + + switch (mode) { + case QRMode.MODE_NUMBER: + return 12; + case QRMode.MODE_ALPHA_NUM: + return 11; + case QRMode.MODE_8BIT_BYTE: + return 16; + case QRMode.MODE_KANJI: + return 10; + default: + throw new Error("mode:" + mode); + } + } else if (type < 41) { + + // 27 - 40 + + switch (mode) { + case QRMode.MODE_NUMBER: + return 14; + case QRMode.MODE_ALPHA_NUM: + return 13; + case QRMode.MODE_8BIT_BYTE: + return 16; + case QRMode.MODE_KANJI: + return 12; + default: + throw new Error("mode:" + mode); + } + } else { + throw new Error("type:" + type); + } + }, + + getLostPoint: function (qrCode) { + + var moduleCount = qrCode.getModuleCount(); + + var lostPoint = 0; + + // LEVEL1 + + for (var row = 0; row < moduleCount; row++) { + + for (var col = 0; col < moduleCount; col++) { + + var sameCount = 0; + var dark = qrCode.isDark(row, col); + + for (var r = -1; r <= 1; r++) { + + if (row + r < 0 || moduleCount <= row + r) { + continue; + } + + for (var c = -1; c <= 1; c++) { + + if (col + c < 0 || moduleCount <= col + c) { + continue; + } + + if (r == 0 && c == 0) { + continue; + } + + if (dark == qrCode.isDark(row + r, col + c)) { + sameCount++; + } + } + } + + if (sameCount > 5) { + lostPoint += 3 + sameCount - 5; + } + } + } + + // LEVEL2 + + for (var row = 0; row < moduleCount - 1; row++) { + for (var col = 0; col < moduleCount - 1; col++) { + var count = 0; + if (qrCode.isDark(row, col)) count++; + if (qrCode.isDark(row + 1, col)) count++; + if (qrCode.isDark(row, col + 1)) count++; + if (qrCode.isDark(row + 1, col + 1)) count++; + if (count == 0 || count == 4) { + lostPoint += 3; + } + } + } + + // LEVEL3 + + for (var row = 0; row < moduleCount; row++) { + for (var col = 0; col < moduleCount - 6; col++) { + if (qrCode.isDark(row, col) && !qrCode.isDark(row, col + 1) && qrCode.isDark(row, col + 2) && qrCode.isDark(row, col + 3) && qrCode.isDark(row, col + 4) && !qrCode.isDark(row, col + 5) && qrCode.isDark(row, col + 6)) { + lostPoint += 40; + } + } + } + + for (var col = 0; col < moduleCount; col++) { + for (var row = 0; row < moduleCount - 6; row++) { + if (qrCode.isDark(row, col) && !qrCode.isDark(row + 1, col) && qrCode.isDark(row + 2, col) && qrCode.isDark(row + 3, col) && qrCode.isDark(row + 4, col) && !qrCode.isDark(row + 5, col) && qrCode.isDark(row + 6, col)) { + lostPoint += 40; + } + } + } + + // LEVEL4 + + var darkCount = 0; + + for (var col = 0; col < moduleCount; col++) { + for (var row = 0; row < moduleCount; row++) { + if (qrCode.isDark(row, col)) { + darkCount++; + } + } + } + + var ratio = Math.abs(100 * darkCount / moduleCount / moduleCount - 50) / 5; + lostPoint += ratio * 10; + + return lostPoint; + } + +}; + +//--------------------------------------------------------------------- +// QRMath +//--------------------------------------------------------------------- + +var QRMath = { + + glog: function (n) { + + if (n < 1) { + throw new Error("glog(" + n + ")"); + } + + return QRMath.LOG_TABLE[n]; + }, + + gexp: function (n) { + + while (n < 0) { + n += 255; + } + + while (n >= 256) { + n -= 255; + } + + return QRMath.EXP_TABLE[n]; + }, + + EXP_TABLE: new Array(256), + + LOG_TABLE: new Array(256) + +}; + +for (var i = 0; i < 8; i++) { + QRMath.EXP_TABLE[i] = 1 << i; +} +for (var i = 8; i < 256; i++) { + QRMath.EXP_TABLE[i] = QRMath.EXP_TABLE[i - 4] ^ QRMath.EXP_TABLE[i - 5] ^ QRMath.EXP_TABLE[i - 6] ^ QRMath.EXP_TABLE[i - 8]; +} +for (var i = 0; i < 255; i++) { + QRMath.LOG_TABLE[QRMath.EXP_TABLE[i]] = i; +} + +//--------------------------------------------------------------------- +// QRPolynomial +//--------------------------------------------------------------------- + +function QRPolynomial(num, shift) { + + if (num.length == undefined) { + throw new Error(num.length + "/" + shift); + } + + var offset = 0; + + while (offset < num.length && num[offset] == 0) { + offset++; + } + + this.num = new Array(num.length - offset + shift); + for (var i = 0; i < num.length - offset; i++) { + this.num[i] = num[i + offset]; + } +} + +QRPolynomial.prototype = { + + get: function (index) { + return this.num[index]; + }, + + getLength: function () { + return this.num.length; + }, + + multiply: function (e) { + + var num = new Array(this.getLength() + e.getLength() - 1); + + for (var i = 0; i < this.getLength(); i++) { + for (var j = 0; j < e.getLength(); j++) { + num[i + j] ^= QRMath.gexp(QRMath.glog(this.get(i)) + QRMath.glog(e.get(j))); + } + } + + return new QRPolynomial(num, 0); + }, + + mod: function (e) { + + if (this.getLength() - e.getLength() < 0) { + return this; + } + + var ratio = QRMath.glog(this.get(0)) - QRMath.glog(e.get(0)); + + var num = new Array(this.getLength()); + + for (var i = 0; i < this.getLength(); i++) { + num[i] = this.get(i); + } + + for (var i = 0; i < e.getLength(); i++) { + num[i] ^= QRMath.gexp(QRMath.glog(e.get(i)) + ratio); + } + + // recursive call + return new QRPolynomial(num, 0).mod(e); + } +}; + +//--------------------------------------------------------------------- +// QRRSBlock +//--------------------------------------------------------------------- + +function QRRSBlock(totalCount, dataCount) { + this.totalCount = totalCount; + this.dataCount = dataCount; +} + +QRRSBlock.RS_BLOCK_TABLE = [ + +// L +// M +// Q +// H + +// 1 +[1, 26, 19], [1, 26, 16], [1, 26, 13], [1, 26, 9], + +// 2 +[1, 44, 34], [1, 44, 28], [1, 44, 22], [1, 44, 16], + +// 3 +[1, 70, 55], [1, 70, 44], [2, 35, 17], [2, 35, 13], + +// 4 +[1, 100, 80], [2, 50, 32], [2, 50, 24], [4, 25, 9], + +// 5 +[1, 134, 108], [2, 67, 43], [2, 33, 15, 2, 34, 16], [2, 33, 11, 2, 34, 12], + +// 6 +[2, 86, 68], [4, 43, 27], [4, 43, 19], [4, 43, 15], + +// 7 +[2, 98, 78], [4, 49, 31], [2, 32, 14, 4, 33, 15], [4, 39, 13, 1, 40, 14], + +// 8 +[2, 121, 97], [2, 60, 38, 2, 61, 39], [4, 40, 18, 2, 41, 19], [4, 40, 14, 2, 41, 15], + +// 9 +[2, 146, 116], [3, 58, 36, 2, 59, 37], [4, 36, 16, 4, 37, 17], [4, 36, 12, 4, 37, 13], + +// 10 +[2, 86, 68, 2, 87, 69], [4, 69, 43, 1, 70, 44], [6, 43, 19, 2, 44, 20], [6, 43, 15, 2, 44, 16], + +// 11 +[4, 101, 81], [1, 80, 50, 4, 81, 51], [4, 50, 22, 4, 51, 23], [3, 36, 12, 8, 37, 13], + +// 12 +[2, 116, 92, 2, 117, 93], [6, 58, 36, 2, 59, 37], [4, 46, 20, 6, 47, 21], [7, 42, 14, 4, 43, 15], + +// 13 +[4, 133, 107], [8, 59, 37, 1, 60, 38], [8, 44, 20, 4, 45, 21], [12, 33, 11, 4, 34, 12], + +// 14 +[3, 145, 115, 1, 146, 116], [4, 64, 40, 5, 65, 41], [11, 36, 16, 5, 37, 17], [11, 36, 12, 5, 37, 13], + +// 15 +[5, 109, 87, 1, 110, 88], [5, 65, 41, 5, 66, 42], [5, 54, 24, 7, 55, 25], [11, 36, 12], + +// 16 +[5, 122, 98, 1, 123, 99], [7, 73, 45, 3, 74, 46], [15, 43, 19, 2, 44, 20], [3, 45, 15, 13, 46, 16], + +// 17 +[1, 135, 107, 5, 136, 108], [10, 74, 46, 1, 75, 47], [1, 50, 22, 15, 51, 23], [2, 42, 14, 17, 43, 15], + +// 18 +[5, 150, 120, 1, 151, 121], [9, 69, 43, 4, 70, 44], [17, 50, 22, 1, 51, 23], [2, 42, 14, 19, 43, 15], + +// 19 +[3, 141, 113, 4, 142, 114], [3, 70, 44, 11, 71, 45], [17, 47, 21, 4, 48, 22], [9, 39, 13, 16, 40, 14], + +// 20 +[3, 135, 107, 5, 136, 108], [3, 67, 41, 13, 68, 42], [15, 54, 24, 5, 55, 25], [15, 43, 15, 10, 44, 16], + +// 21 +[4, 144, 116, 4, 145, 117], [17, 68, 42], [17, 50, 22, 6, 51, 23], [19, 46, 16, 6, 47, 17], + +// 22 +[2, 139, 111, 7, 140, 112], [17, 74, 46], [7, 54, 24, 16, 55, 25], [34, 37, 13], + +// 23 +[4, 151, 121, 5, 152, 122], [4, 75, 47, 14, 76, 48], [11, 54, 24, 14, 55, 25], [16, 45, 15, 14, 46, 16], + +// 24 +[6, 147, 117, 4, 148, 118], [6, 73, 45, 14, 74, 46], [11, 54, 24, 16, 55, 25], [30, 46, 16, 2, 47, 17], + +// 25 +[8, 132, 106, 4, 133, 107], [8, 75, 47, 13, 76, 48], [7, 54, 24, 22, 55, 25], [22, 45, 15, 13, 46, 16], + +// 26 +[10, 142, 114, 2, 143, 115], [19, 74, 46, 4, 75, 47], [28, 50, 22, 6, 51, 23], [33, 46, 16, 4, 47, 17], + +// 27 +[8, 152, 122, 4, 153, 123], [22, 73, 45, 3, 74, 46], [8, 53, 23, 26, 54, 24], [12, 45, 15, 28, 46, 16], + +// 28 +[3, 147, 117, 10, 148, 118], [3, 73, 45, 23, 74, 46], [4, 54, 24, 31, 55, 25], [11, 45, 15, 31, 46, 16], + +// 29 +[7, 146, 116, 7, 147, 117], [21, 73, 45, 7, 74, 46], [1, 53, 23, 37, 54, 24], [19, 45, 15, 26, 46, 16], + +// 30 +[5, 145, 115, 10, 146, 116], [19, 75, 47, 10, 76, 48], [15, 54, 24, 25, 55, 25], [23, 45, 15, 25, 46, 16], + +// 31 +[13, 145, 115, 3, 146, 116], [2, 74, 46, 29, 75, 47], [42, 54, 24, 1, 55, 25], [23, 45, 15, 28, 46, 16], + +// 32 +[17, 145, 115], [10, 74, 46, 23, 75, 47], [10, 54, 24, 35, 55, 25], [19, 45, 15, 35, 46, 16], + +// 33 +[17, 145, 115, 1, 146, 116], [14, 74, 46, 21, 75, 47], [29, 54, 24, 19, 55, 25], [11, 45, 15, 46, 46, 16], + +// 34 +[13, 145, 115, 6, 146, 116], [14, 74, 46, 23, 75, 47], [44, 54, 24, 7, 55, 25], [59, 46, 16, 1, 47, 17], + +// 35 +[12, 151, 121, 7, 152, 122], [12, 75, 47, 26, 76, 48], [39, 54, 24, 14, 55, 25], [22, 45, 15, 41, 46, 16], + +// 36 +[6, 151, 121, 14, 152, 122], [6, 75, 47, 34, 76, 48], [46, 54, 24, 10, 55, 25], [2, 45, 15, 64, 46, 16], + +// 37 +[17, 152, 122, 4, 153, 123], [29, 74, 46, 14, 75, 47], [49, 54, 24, 10, 55, 25], [24, 45, 15, 46, 46, 16], + +// 38 +[4, 152, 122, 18, 153, 123], [13, 74, 46, 32, 75, 47], [48, 54, 24, 14, 55, 25], [42, 45, 15, 32, 46, 16], + +// 39 +[20, 147, 117, 4, 148, 118], [40, 75, 47, 7, 76, 48], [43, 54, 24, 22, 55, 25], [10, 45, 15, 67, 46, 16], + +// 40 +[19, 148, 118, 6, 149, 119], [18, 75, 47, 31, 76, 48], [34, 54, 24, 34, 55, 25], [20, 45, 15, 61, 46, 16]]; + +QRRSBlock.getRSBlocks = function (typeNumber, errorCorrectLevel) { + + var rsBlock = QRRSBlock.getRsBlockTable(typeNumber, errorCorrectLevel); + + if (rsBlock == undefined) { + throw new Error("bad rs block @ typeNumber:" + typeNumber + "/errorCorrectLevel:" + errorCorrectLevel); + } + + var length = rsBlock.length / 3; + + var list = new Array(); + + for (var i = 0; i < length; i++) { + + var count = rsBlock[i * 3 + 0]; + var totalCount = rsBlock[i * 3 + 1]; + var dataCount = rsBlock[i * 3 + 2]; + + for (var j = 0; j < count; j++) { + list.push(new QRRSBlock(totalCount, dataCount)); + } + } + + return list; +}; + +QRRSBlock.getRsBlockTable = function (typeNumber, errorCorrectLevel) { + + switch (errorCorrectLevel) { + case QRErrorCorrectLevel.L: + return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 0]; + case QRErrorCorrectLevel.M: + return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 1]; + case QRErrorCorrectLevel.Q: + return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 2]; + case QRErrorCorrectLevel.H: + return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 3]; + default: + return undefined; + } +}; + +//--------------------------------------------------------------------- +// QRBitBuffer +//--------------------------------------------------------------------- + +function QRBitBuffer() { + this.buffer = new Array(); + this.length = 0; +} + +QRBitBuffer.prototype = { + + get: function (index) { + var bufIndex = Math.floor(index / 8); + return (this.buffer[bufIndex] >>> 7 - index % 8 & 1) == 1; + }, + + put: function (num, length) { + for (var i = 0; i < length; i++) { + this.putBit((num >>> length - i - 1 & 1) == 1); + } + }, + + getLengthInBits: function () { + return this.length; + }, + + putBit: function (bit) { + + var bufIndex = Math.floor(this.length / 8); + if (this.buffer.length <= bufIndex) { + this.buffer.push(0); + } + + if (bit) { + this.buffer[bufIndex] |= 0x80 >>> this.length % 8; + } + + this.length++; + } +}; + +// support Chinese +function utf16to8(str) { + var out, i, len, c; + out = ''; + len = str.length; + for (i = 0; i < len; i++) { + c = str.charCodeAt(i); + if (c >= 0x0001 && c <= 0x007F) { + out += str.charAt(i); + } else if (c > 0x07FF) { + out += String.fromCharCode(0xE0 | c >> 12 & 0x0F); + out += String.fromCharCode(0x80 | c >> 6 & 0x3F); + out += String.fromCharCode(0x80 | c >> 0 & 0x3F); + } else { + out += String.fromCharCode(0xC0 | c >> 6 & 0x1F); + out += String.fromCharCode(0x80 | c >> 0 & 0x3F); + } + } + return out; +} + +function drawQrcode(options) { + options = options || {}; + options = extend(true, { + width: 256, + height: 256, + x: 0, + y: 0, + typeNumber: -1, + correctLevel: QRErrorCorrectLevel.H, + background: '#ffffff', + foreground: '#000000', + image: { + imageResource: '', + dx: 0, + dy: 0, + dWidth: 100, + dHeight: 100 + } + }, options); + + if (!options.canvasId && !options.ctx) { + console.warn('please set canvasId or ctx!'); + return; + } + + createCanvas(); + + function createCanvas() { + // create the qrcode itself + var qrcode = new QRCode(options.typeNumber, options.correctLevel); + qrcode.addData(utf16to8(options.text)); + qrcode.make(); + + // get canvas context + var ctx; + if (options.ctx) { + ctx = options.ctx; + } else { + ctx = options._this ? wx.createCanvasContext && wx.createCanvasContext(options.canvasId, options._this) : wx.createCanvasContext && wx.createCanvasContext(options.canvasId); + } + + // compute tileW/tileH based on options.width/options.height + var tileW = options.width / qrcode.getModuleCount(); + var tileH = options.height / qrcode.getModuleCount(); + + // draw in the canvas + for (var row = 0; row < qrcode.getModuleCount(); row++) { + for (var col = 0; col < qrcode.getModuleCount(); col++) { + var style = qrcode.isDark(row, col) ? options.foreground : options.background; + ctx.setFillStyle(style); + var w = Math.ceil((col + 1) * tileW) - Math.floor(col * tileW); + var h = Math.ceil((row + 1) * tileW) - Math.floor(row * tileW); + ctx.fillRect(Math.round(col * tileW) + options.x, Math.round(row * tileH) + options.y, w, h); + } + } + + if (options.image.imageResource) { + ctx.drawImage(options.image.imageResource, options.image.dx, options.image.dy, options.image.dWidth, options.image.dHeight); + } + + ctx.draw(false, function (e) { + options.callback && options.callback(e); + }); + } +} + +return drawQrcode; + +}))); diff --git a/node_modules/weapp-qrcode/dist/weapp.qrcode.min.js b/node_modules/weapp-qrcode/dist/weapp.qrcode.min.js new file mode 100644 index 0000000..27cae47 --- /dev/null +++ b/node_modules/weapp-qrcode/dist/weapp.qrcode.min.js @@ -0,0 +1,5 @@ +/** + * weapp.qrcode.js v1.0.0 (https://github.com/yingye/weapp-qrcode#readme) + */ + +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):t.drawQrcode=e()}(this,function(){"use strict";var t=Object.prototype.hasOwnProperty,e=Object.prototype.toString,r=Object.defineProperty,o=Object.getOwnPropertyDescriptor,n=function(t){return"function"==typeof Array.isArray?Array.isArray(t):"[object Array]"===e.call(t)},i=function(r){if(!r||"[object Object]"!==e.call(r))return!1;var o,n=t.call(r,"constructor"),i=r.constructor&&r.constructor.prototype&&t.call(r.constructor.prototype,"isPrototypeOf");if(r.constructor&&!n&&!i)return!1;for(o in r);return void 0===o||t.call(r,o)},a=function(t,e){r&&"__proto__"===e.name?r(t,e.name,{enumerable:!0,configurable:!0,value:e.newValue,writable:!0}):t[e.name]=e.newValue},u=function(e,r){if("__proto__"===r){if(!t.call(e,r))return;if(o)return o(e,r).value}return e[r]},s=function t(){var e,r,o,s,h,l,f=arguments[0],g=1,c=arguments.length,d=!1;for("boolean"==typeof f&&(d=f,f=arguments[1]||{},g=2),(null==f||"object"!=typeof f&&"function"!=typeof f)&&(f={});g=7&&this.setupTypeNumber(t),null==this.dataCache&&(this.dataCache=l.createData(this.typeNumber,this.errorCorrectLevel,this.dataList)),this.mapData(this.dataCache,e)},setupPositionProbePattern:function(t,e){for(var r=-1;r<=7;r++)if(!(t+r<=-1||this.moduleCount<=t+r))for(var o=-1;o<=7;o++)e+o<=-1||this.moduleCount<=e+o||(this.modules[t+r][e+o]=0<=r&&r<=6&&(0==o||6==o)||0<=o&&o<=6&&(0==r||6==r)||2<=r&&r<=4&&2<=o&&o<=4)},getBestMaskPattern:function(){for(var t=0,e=0,r=0;r<8;r++){this.makeImpl(!0,r);var o=w.getLostPoint(this);(0==r||t>o)&&(t=o,e=r)}return e},createMovieClip:function(t,e,r){var o=t.createEmptyMovieClip(e,r);this.make();for(var n=0;n>r&1);this.modules[Math.floor(r/3)][r%3+this.moduleCount-8-3]=o}for(r=0;r<18;r++){o=!t&&1==(e>>r&1);this.modules[r%3+this.moduleCount-8-3][Math.floor(r/3)]=o}},setupTypeInfo:function(t,e){for(var r=this.errorCorrectLevel<<3|e,o=w.getBCHTypeInfo(r),n=0;n<15;n++){var i=!t&&1==(o>>n&1);n<6?this.modules[n][8]=i:n<8?this.modules[n+1][8]=i:this.modules[this.moduleCount-15+n][8]=i}for(n=0;n<15;n++){i=!t&&1==(o>>n&1);n<8?this.modules[8][this.moduleCount-n-1]=i:n<9?this.modules[8][15-n-1+1]=i:this.modules[8][15-n-1]=i}this.modules[this.moduleCount-8][8]=!t},mapData:function(t,e){for(var r=-1,o=this.moduleCount-1,n=7,i=0,a=this.moduleCount-1;a>0;a-=2)for(6==a&&a--;;){for(var u=0;u<2;u++)if(null==this.modules[o][a-u]){var s=!1;i>>n&1)),w.getMask(e,o,a-u)&&(s=!s),this.modules[o][a-u]=s,-1==--n&&(i++,n=7)}if((o+=r)<0||this.moduleCount<=o){o-=r,r=-r;break}}}},l.PAD0=236,l.PAD1=17,l.createData=function(t,e,r){for(var o=_.getRSBlocks(t,e),n=new D,i=0;i8*u)throw new Error("code length overflow. ("+n.getLengthInBits()+">"+8*u+")");for(n.getLengthInBits()+4<=8*u&&n.put(0,4);n.getLengthInBits()%8!=0;)n.putBit(!1);for(;!(n.getLengthInBits()>=8*u||(n.put(l.PAD0,8),n.getLengthInBits()>=8*u));)n.put(l.PAD1,8);return l.createBytes(n,o)},l.createBytes=function(t,e){for(var r=0,o=0,n=0,i=new Array(e.length),a=new Array(e.length),u=0;u=0?g.get(c):0}}var d=0;for(l=0;l=0;)e^=w.G15<=0;)e^=w.G18<>>=1;return e},getPatternPosition:function(t){return w.PATTERN_POSITION_TABLE[t-1]},getMask:function(t,e,r){switch(t){case c:return(e+r)%2==0;case d:return e%2==0;case m:return r%3==0;case v:return(e+r)%3==0;case p:return(Math.floor(e/2)+Math.floor(r/3))%2==0;case C:return e*r%2+e*r%3==0;case B:return(e*r%2+e*r%3)%2==0;case L:return(e*r%3+(e+r)%2)%2==0;default:throw new Error("bad maskPattern:"+t)}},getErrorCorrectPolynomial:function(t){for(var e=new A([1],0),r=0;r5&&(r+=3+i-5)}for(o=0;o=256;)t-=255;return y.EXP_TABLE[t]},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)},E=0;E<8;E++)y.EXP_TABLE[E]=1<>>7-t%8&1)},put:function(t,e){for(var r=0;r>>e-r-1&1))},getLengthInBits:function(){return this.length},putBit:function(t){var e=Math.floor(this.length/8);this.buffer.length<=e&&this.buffer.push(0),t&&(this.buffer[e]|=128>>>this.length%8),this.length++}},function(t){t=t||{},(t=s(!0,{width:256,height:256,x:0,y:0,typeNumber:-1,correctLevel:g.H,background:"#ffffff",foreground:"#000000",image:{imageResource:"",dx:0,dy:0,dWidth:100,dHeight:100}},t)).canvasId||t.ctx?function(){var e,r=new l(t.typeNumber,t.correctLevel);r.addData(function(t){var e,r,o,n;for(e="",o=t.length,r=0;r=1&&n<=127?e+=t.charAt(r):n>2047?(e+=String.fromCharCode(224|n>>12&15),e+=String.fromCharCode(128|n>>6&63),e+=String.fromCharCode(128|n>>0&63)):(e+=String.fromCharCode(192|n>>6&31),e+=String.fromCharCode(128|n>>0&63));return e}(t.text)),r.make(),e=t.ctx?t.ctx:t._this?wx.createCanvasContext&&wx.createCanvasContext(t.canvasId,t._this):wx.createCanvasContext&&wx.createCanvasContext(t.canvasId);for(var o=t.width/r.getModuleCount(),n=t.height/r.getModuleCount(),i=0;i= 0x0001) && (c <= 0x007F)) { + out += str.charAt(i) + } else if (c > 0x07FF) { + out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F)) + out += String.fromCharCode(0x80 | ((c >> 6) & 0x3F)) + out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F)) + } else { + out += String.fromCharCode(0xC0 | ((c >> 6) & 0x1F)) + out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F)) + } + } + return out +} + +function drawQrcode (options) { + options = options || {} + options = extend(true, { + width: 256, + height: 256, + x: 0, + y: 0, + typeNumber: -1, + correctLevel: QRErrorCorrectLevel.H, + background: '#ffffff', + foreground: '#000000', + image: { + imageResource: '', + dx: 0, + dy: 0, + dWidth: 100, + dHeight: 100 + } + }, options) + + if (!options.canvasId && !options.ctx) { + console.warn('please set canvasId or ctx!') + return + } + + createCanvas() + + function createCanvas () { + // create the qrcode itself + var qrcode = new QRCode(options.typeNumber, options.correctLevel) + qrcode.addData(utf16to8(options.text)) + qrcode.make() + + // get canvas context + var ctx + if (options.ctx) { + ctx = options.ctx + } else { + ctx = options._this ? wx.createCanvasContext && wx.createCanvasContext(options.canvasId, options._this) : wx.createCanvasContext && wx.createCanvasContext(options.canvasId) + } + + // compute tileW/tileH based on options.width/options.height + var tileW = options.width / qrcode.getModuleCount() + var tileH = options.height / qrcode.getModuleCount() + + // draw in the canvas + for (var row = 0; row < qrcode.getModuleCount(); row++) { + for (var col = 0; col < qrcode.getModuleCount(); col++) { + var style = qrcode.isDark(row, col) ? options.foreground : options.background + ctx.setFillStyle(style) + var w = (Math.ceil((col + 1) * tileW) - Math.floor(col * tileW)) + var h = (Math.ceil((row + 1) * tileW) - Math.floor(row * tileW)) + ctx.fillRect(Math.round(col * tileW) + options.x, Math.round(row * tileH) + options.y, w, h) + } + } + + if (options.image.imageResource) { + ctx.drawImage(options.image.imageResource, options.image.dx, options.image.dy, options.image.dWidth, options.image.dHeight) + } + + ctx.draw(false, function (e) { + options.callback && options.callback(e) + }) + } +} + +export default drawQrcode diff --git a/node_modules/weapp-qrcode/src/qrcode.js b/node_modules/weapp-qrcode/src/qrcode.js new file mode 100644 index 0000000..3289c78 --- /dev/null +++ b/node_modules/weapp-qrcode/src/qrcode.js @@ -0,0 +1,1242 @@ +//--------------------------------------------------------------------- +// QRCode for JavaScript +// +// Copyright (c) 2009 Kazuhiko Arase +// +// URL: http://www.d-project.com/ +// +// Licensed under the MIT license: +// http://www.opensource.org/licenses/mit-license.php +// +// The word "QR Code" is registered trademark of +// DENSO WAVE INCORPORATED +// http://www.denso-wave.com/qrcode/faqpatent-e.html +// +//--------------------------------------------------------------------- + +//--------------------------------------------------------------------- +// QR8bitByte +//--------------------------------------------------------------------- + +function QR8bitByte(data) { + this.mode = QRMode.MODE_8BIT_BYTE; + this.data = data; +} + +QR8bitByte.prototype = { + + getLength : function(buffer) { + return this.data.length; + }, + + write : function(buffer) { + for (var i = 0; i < this.data.length; i++) { + // not JIS ... + buffer.put(this.data.charCodeAt(i), 8); + } + } +}; + +//--------------------------------------------------------------------- +// QRCode +//--------------------------------------------------------------------- + +function QRCode(typeNumber, errorCorrectLevel) { + this.typeNumber = typeNumber; + this.errorCorrectLevel = errorCorrectLevel; + this.modules = null; + this.moduleCount = 0; + this.dataCache = null; + this.dataList = new Array(); +} + +QRCode.prototype = { + + addData : function(data) { + var newData = new QR8bitByte(data); + this.dataList.push(newData); + this.dataCache = null; + }, + + isDark : function(row, col) { + if (row < 0 || this.moduleCount <= row || col < 0 || this.moduleCount <= col) { + throw new Error(row + "," + col); + } + return this.modules[row][col]; + }, + + getModuleCount : function() { + return this.moduleCount; + }, + + make : function() { + // Calculate automatically typeNumber if provided is < 1 + if (this.typeNumber < 1 ){ + var typeNumber = 1; + for (typeNumber = 1; typeNumber < 40; typeNumber++) { + var rsBlocks = QRRSBlock.getRSBlocks(typeNumber, this.errorCorrectLevel); + + var buffer = new QRBitBuffer(); + var totalDataCount = 0; + for (var i = 0; i < rsBlocks.length; i++) { + totalDataCount += rsBlocks[i].dataCount; + } + + for (var i = 0; i < this.dataList.length; i++) { + var data = this.dataList[i]; + buffer.put(data.mode, 4); + buffer.put(data.getLength(), QRUtil.getLengthInBits(data.mode, typeNumber) ); + data.write(buffer); + } + if (buffer.getLengthInBits() <= totalDataCount * 8) + break; + } + this.typeNumber = typeNumber; + } + this.makeImpl(false, this.getBestMaskPattern() ); + }, + + makeImpl : function(test, maskPattern) { + + this.moduleCount = this.typeNumber * 4 + 17; + this.modules = new Array(this.moduleCount); + + for (var row = 0; row < this.moduleCount; row++) { + + this.modules[row] = new Array(this.moduleCount); + + for (var col = 0; col < this.moduleCount; col++) { + this.modules[row][col] = null;//(col + row) % 3; + } + } + + this.setupPositionProbePattern(0, 0); + this.setupPositionProbePattern(this.moduleCount - 7, 0); + this.setupPositionProbePattern(0, this.moduleCount - 7); + this.setupPositionAdjustPattern(); + this.setupTimingPattern(); + this.setupTypeInfo(test, maskPattern); + + if (this.typeNumber >= 7) { + this.setupTypeNumber(test); + } + + if (this.dataCache == null) { + this.dataCache = QRCode.createData(this.typeNumber, this.errorCorrectLevel, this.dataList); + } + + this.mapData(this.dataCache, maskPattern); + }, + + setupPositionProbePattern : function(row, col) { + + for (var r = -1; r <= 7; r++) { + + if (row + r <= -1 || this.moduleCount <= row + r) continue; + + for (var c = -1; c <= 7; c++) { + + if (col + c <= -1 || this.moduleCount <= col + c) continue; + + if ( (0 <= r && r <= 6 && (c == 0 || c == 6) ) + || (0 <= c && c <= 6 && (r == 0 || r == 6) ) + || (2 <= r && r <= 4 && 2 <= c && c <= 4) ) { + this.modules[row + r][col + c] = true; + } else { + this.modules[row + r][col + c] = false; + } + } + } + }, + + getBestMaskPattern : function() { + + var minLostPoint = 0; + var pattern = 0; + + for (var i = 0; i < 8; i++) { + + this.makeImpl(true, i); + + var lostPoint = QRUtil.getLostPoint(this); + + if (i == 0 || minLostPoint > lostPoint) { + minLostPoint = lostPoint; + pattern = i; + } + } + + return pattern; + }, + + createMovieClip : function(target_mc, instance_name, depth) { + + var qr_mc = target_mc.createEmptyMovieClip(instance_name, depth); + var cs = 1; + + this.make(); + + for (var row = 0; row < this.modules.length; row++) { + + var y = row * cs; + + for (var col = 0; col < this.modules[row].length; col++) { + + var x = col * cs; + var dark = this.modules[row][col]; + + if (dark) { + qr_mc.beginFill(0, 100); + qr_mc.moveTo(x, y); + qr_mc.lineTo(x + cs, y); + qr_mc.lineTo(x + cs, y + cs); + qr_mc.lineTo(x, y + cs); + qr_mc.endFill(); + } + } + } + + return qr_mc; + }, + + setupTimingPattern : function() { + + for (var r = 8; r < this.moduleCount - 8; r++) { + if (this.modules[r][6] != null) { + continue; + } + this.modules[r][6] = (r % 2 == 0); + } + + for (var c = 8; c < this.moduleCount - 8; c++) { + if (this.modules[6][c] != null) { + continue; + } + this.modules[6][c] = (c % 2 == 0); + } + }, + + setupPositionAdjustPattern : function() { + + var pos = QRUtil.getPatternPosition(this.typeNumber); + + for (var i = 0; i < pos.length; i++) { + + for (var j = 0; j < pos.length; j++) { + + var row = pos[i]; + var col = pos[j]; + + if (this.modules[row][col] != null) { + continue; + } + + for (var r = -2; r <= 2; r++) { + + for (var c = -2; c <= 2; c++) { + + if (r == -2 || r == 2 || c == -2 || c == 2 + || (r == 0 && c == 0) ) { + this.modules[row + r][col + c] = true; + } else { + this.modules[row + r][col + c] = false; + } + } + } + } + } + }, + + setupTypeNumber : function(test) { + + var bits = QRUtil.getBCHTypeNumber(this.typeNumber); + + for (var i = 0; i < 18; i++) { + var mod = (!test && ( (bits >> i) & 1) == 1); + this.modules[Math.floor(i / 3)][i % 3 + this.moduleCount - 8 - 3] = mod; + } + + for (var i = 0; i < 18; i++) { + var mod = (!test && ( (bits >> i) & 1) == 1); + this.modules[i % 3 + this.moduleCount - 8 - 3][Math.floor(i / 3)] = mod; + } + }, + + setupTypeInfo : function(test, maskPattern) { + + var data = (this.errorCorrectLevel << 3) | maskPattern; + var bits = QRUtil.getBCHTypeInfo(data); + + // vertical + for (var i = 0; i < 15; i++) { + + var mod = (!test && ( (bits >> i) & 1) == 1); + + if (i < 6) { + this.modules[i][8] = mod; + } else if (i < 8) { + this.modules[i + 1][8] = mod; + } else { + this.modules[this.moduleCount - 15 + i][8] = mod; + } + } + + // horizontal + for (var i = 0; i < 15; i++) { + + var mod = (!test && ( (bits >> i) & 1) == 1); + + if (i < 8) { + this.modules[8][this.moduleCount - i - 1] = mod; + } else if (i < 9) { + this.modules[8][15 - i - 1 + 1] = mod; + } else { + this.modules[8][15 - i - 1] = mod; + } + } + + // fixed module + this.modules[this.moduleCount - 8][8] = (!test); + + }, + + mapData : function(data, maskPattern) { + + var inc = -1; + var row = this.moduleCount - 1; + var bitIndex = 7; + var byteIndex = 0; + + for (var col = this.moduleCount - 1; col > 0; col -= 2) { + + if (col == 6) col--; + + while (true) { + + for (var c = 0; c < 2; c++) { + + if (this.modules[row][col - c] == null) { + + var dark = false; + + if (byteIndex < data.length) { + dark = ( ( (data[byteIndex] >>> bitIndex) & 1) == 1); + } + + var mask = QRUtil.getMask(maskPattern, row, col - c); + + if (mask) { + dark = !dark; + } + + this.modules[row][col - c] = dark; + bitIndex--; + + if (bitIndex == -1) { + byteIndex++; + bitIndex = 7; + } + } + } + + row += inc; + + if (row < 0 || this.moduleCount <= row) { + row -= inc; + inc = -inc; + break; + } + } + } + + } + +}; + +QRCode.PAD0 = 0xEC; +QRCode.PAD1 = 0x11; + +QRCode.createData = function(typeNumber, errorCorrectLevel, dataList) { + + var rsBlocks = QRRSBlock.getRSBlocks(typeNumber, errorCorrectLevel); + + var buffer = new QRBitBuffer(); + + for (var i = 0; i < dataList.length; i++) { + var data = dataList[i]; + buffer.put(data.mode, 4); + buffer.put(data.getLength(), QRUtil.getLengthInBits(data.mode, typeNumber) ); + data.write(buffer); + } + + // calc num max data. + var totalDataCount = 0; + for (var i = 0; i < rsBlocks.length; i++) { + totalDataCount += rsBlocks[i].dataCount; + } + + if (buffer.getLengthInBits() > totalDataCount * 8) { + throw new Error("code length overflow. (" + + buffer.getLengthInBits() + + ">" + + totalDataCount * 8 + + ")"); + } + + // end code + if (buffer.getLengthInBits() + 4 <= totalDataCount * 8) { + buffer.put(0, 4); + } + + // padding + while (buffer.getLengthInBits() % 8 != 0) { + buffer.putBit(false); + } + + // padding + while (true) { + + if (buffer.getLengthInBits() >= totalDataCount * 8) { + break; + } + buffer.put(QRCode.PAD0, 8); + + if (buffer.getLengthInBits() >= totalDataCount * 8) { + break; + } + buffer.put(QRCode.PAD1, 8); + } + + return QRCode.createBytes(buffer, rsBlocks); +} + +QRCode.createBytes = function(buffer, rsBlocks) { + + var offset = 0; + + var maxDcCount = 0; + var maxEcCount = 0; + + var dcdata = new Array(rsBlocks.length); + var ecdata = new Array(rsBlocks.length); + + for (var r = 0; r < rsBlocks.length; r++) { + + var dcCount = rsBlocks[r].dataCount; + var ecCount = rsBlocks[r].totalCount - dcCount; + + maxDcCount = Math.max(maxDcCount, dcCount); + maxEcCount = Math.max(maxEcCount, ecCount); + + dcdata[r] = new Array(dcCount); + + for (var i = 0; i < dcdata[r].length; i++) { + dcdata[r][i] = 0xff & buffer.buffer[i + offset]; + } + offset += dcCount; + + var rsPoly = QRUtil.getErrorCorrectPolynomial(ecCount); + var rawPoly = new QRPolynomial(dcdata[r], rsPoly.getLength() - 1); + + var modPoly = rawPoly.mod(rsPoly); + ecdata[r] = new Array(rsPoly.getLength() - 1); + for (var i = 0; i < ecdata[r].length; i++) { + var modIndex = i + modPoly.getLength() - ecdata[r].length; + ecdata[r][i] = (modIndex >= 0)? modPoly.get(modIndex) : 0; + } + + } + + var totalCodeCount = 0; + for (var i = 0; i < rsBlocks.length; i++) { + totalCodeCount += rsBlocks[i].totalCount; + } + + var data = new Array(totalCodeCount); + var index = 0; + + for (var i = 0; i < maxDcCount; i++) { + for (var r = 0; r < rsBlocks.length; r++) { + if (i < dcdata[r].length) { + data[index++] = dcdata[r][i]; + } + } + } + + for (var i = 0; i < maxEcCount; i++) { + for (var r = 0; r < rsBlocks.length; r++) { + if (i < ecdata[r].length) { + data[index++] = ecdata[r][i]; + } + } + } + + return data; + +} + +//--------------------------------------------------------------------- +// QRMode +//--------------------------------------------------------------------- + +var QRMode = { + MODE_NUMBER : 1 << 0, + MODE_ALPHA_NUM : 1 << 1, + MODE_8BIT_BYTE : 1 << 2, + MODE_KANJI : 1 << 3 +}; + +//--------------------------------------------------------------------- +// QRErrorCorrectLevel +//--------------------------------------------------------------------- + +var QRErrorCorrectLevel = { + L : 1, + M : 0, + Q : 3, + H : 2 +}; + +//--------------------------------------------------------------------- +// QRMaskPattern +//--------------------------------------------------------------------- + +var QRMaskPattern = { + PATTERN000 : 0, + PATTERN001 : 1, + PATTERN010 : 2, + PATTERN011 : 3, + PATTERN100 : 4, + PATTERN101 : 5, + PATTERN110 : 6, + PATTERN111 : 7 +}; + +//--------------------------------------------------------------------- +// QRUtil +//--------------------------------------------------------------------- + +var QRUtil = { + + PATTERN_POSITION_TABLE : [ + [], + [6, 18], + [6, 22], + [6, 26], + [6, 30], + [6, 34], + [6, 22, 38], + [6, 24, 42], + [6, 26, 46], + [6, 28, 50], + [6, 30, 54], + [6, 32, 58], + [6, 34, 62], + [6, 26, 46, 66], + [6, 26, 48, 70], + [6, 26, 50, 74], + [6, 30, 54, 78], + [6, 30, 56, 82], + [6, 30, 58, 86], + [6, 34, 62, 90], + [6, 28, 50, 72, 94], + [6, 26, 50, 74, 98], + [6, 30, 54, 78, 102], + [6, 28, 54, 80, 106], + [6, 32, 58, 84, 110], + [6, 30, 58, 86, 114], + [6, 34, 62, 90, 118], + [6, 26, 50, 74, 98, 122], + [6, 30, 54, 78, 102, 126], + [6, 26, 52, 78, 104, 130], + [6, 30, 56, 82, 108, 134], + [6, 34, 60, 86, 112, 138], + [6, 30, 58, 86, 114, 142], + [6, 34, 62, 90, 118, 146], + [6, 30, 54, 78, 102, 126, 150], + [6, 24, 50, 76, 102, 128, 154], + [6, 28, 54, 80, 106, 132, 158], + [6, 32, 58, 84, 110, 136, 162], + [6, 26, 54, 82, 110, 138, 166], + [6, 30, 58, 86, 114, 142, 170] + ], + + G15 : (1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0), + G18 : (1 << 12) | (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | (1 << 5) | (1 << 2) | (1 << 0), + G15_MASK : (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1), + + getBCHTypeInfo : function(data) { + var d = data << 10; + while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15) >= 0) { + d ^= (QRUtil.G15 << (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15) ) ); + } + return ( (data << 10) | d) ^ QRUtil.G15_MASK; + }, + + getBCHTypeNumber : function(data) { + var d = data << 12; + while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18) >= 0) { + d ^= (QRUtil.G18 << (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18) ) ); + } + return (data << 12) | d; + }, + + getBCHDigit : function(data) { + + var digit = 0; + + while (data != 0) { + digit++; + data >>>= 1; + } + + return digit; + }, + + getPatternPosition : function(typeNumber) { + return QRUtil.PATTERN_POSITION_TABLE[typeNumber - 1]; + }, + + getMask : function(maskPattern, i, j) { + + switch (maskPattern) { + + case QRMaskPattern.PATTERN000 : return (i + j) % 2 == 0; + case QRMaskPattern.PATTERN001 : return i % 2 == 0; + case QRMaskPattern.PATTERN010 : return j % 3 == 0; + case QRMaskPattern.PATTERN011 : return (i + j) % 3 == 0; + case QRMaskPattern.PATTERN100 : return (Math.floor(i / 2) + Math.floor(j / 3) ) % 2 == 0; + case QRMaskPattern.PATTERN101 : return (i * j) % 2 + (i * j) % 3 == 0; + case QRMaskPattern.PATTERN110 : return ( (i * j) % 2 + (i * j) % 3) % 2 == 0; + case QRMaskPattern.PATTERN111 : return ( (i * j) % 3 + (i + j) % 2) % 2 == 0; + + default : + throw new Error("bad maskPattern:" + maskPattern); + } + }, + + getErrorCorrectPolynomial : function(errorCorrectLength) { + + var a = new QRPolynomial([1], 0); + + for (var i = 0; i < errorCorrectLength; i++) { + a = a.multiply(new QRPolynomial([1, QRMath.gexp(i)], 0) ); + } + + return a; + }, + + getLengthInBits : function(mode, type) { + + if (1 <= type && type < 10) { + + // 1 - 9 + + switch(mode) { + case QRMode.MODE_NUMBER : return 10; + case QRMode.MODE_ALPHA_NUM : return 9; + case QRMode.MODE_8BIT_BYTE : return 8; + case QRMode.MODE_KANJI : return 8; + default : + throw new Error("mode:" + mode); + } + + } else if (type < 27) { + + // 10 - 26 + + switch(mode) { + case QRMode.MODE_NUMBER : return 12; + case QRMode.MODE_ALPHA_NUM : return 11; + case QRMode.MODE_8BIT_BYTE : return 16; + case QRMode.MODE_KANJI : return 10; + default : + throw new Error("mode:" + mode); + } + + } else if (type < 41) { + + // 27 - 40 + + switch(mode) { + case QRMode.MODE_NUMBER : return 14; + case QRMode.MODE_ALPHA_NUM : return 13; + case QRMode.MODE_8BIT_BYTE : return 16; + case QRMode.MODE_KANJI : return 12; + default : + throw new Error("mode:" + mode); + } + + } else { + throw new Error("type:" + type); + } + }, + + getLostPoint : function(qrCode) { + + var moduleCount = qrCode.getModuleCount(); + + var lostPoint = 0; + + // LEVEL1 + + for (var row = 0; row < moduleCount; row++) { + + for (var col = 0; col < moduleCount; col++) { + + var sameCount = 0; + var dark = qrCode.isDark(row, col); + + for (var r = -1; r <= 1; r++) { + + if (row + r < 0 || moduleCount <= row + r) { + continue; + } + + for (var c = -1; c <= 1; c++) { + + if (col + c < 0 || moduleCount <= col + c) { + continue; + } + + if (r == 0 && c == 0) { + continue; + } + + if (dark == qrCode.isDark(row + r, col + c) ) { + sameCount++; + } + } + } + + if (sameCount > 5) { + lostPoint += (3 + sameCount - 5); + } + } + } + + // LEVEL2 + + for (var row = 0; row < moduleCount - 1; row++) { + for (var col = 0; col < moduleCount - 1; col++) { + var count = 0; + if (qrCode.isDark(row, col ) ) count++; + if (qrCode.isDark(row + 1, col ) ) count++; + if (qrCode.isDark(row, col + 1) ) count++; + if (qrCode.isDark(row + 1, col + 1) ) count++; + if (count == 0 || count == 4) { + lostPoint += 3; + } + } + } + + // LEVEL3 + + for (var row = 0; row < moduleCount; row++) { + for (var col = 0; col < moduleCount - 6; col++) { + if (qrCode.isDark(row, col) + && !qrCode.isDark(row, col + 1) + && qrCode.isDark(row, col + 2) + && qrCode.isDark(row, col + 3) + && qrCode.isDark(row, col + 4) + && !qrCode.isDark(row, col + 5) + && qrCode.isDark(row, col + 6) ) { + lostPoint += 40; + } + } + } + + for (var col = 0; col < moduleCount; col++) { + for (var row = 0; row < moduleCount - 6; row++) { + if (qrCode.isDark(row, col) + && !qrCode.isDark(row + 1, col) + && qrCode.isDark(row + 2, col) + && qrCode.isDark(row + 3, col) + && qrCode.isDark(row + 4, col) + && !qrCode.isDark(row + 5, col) + && qrCode.isDark(row + 6, col) ) { + lostPoint += 40; + } + } + } + + // LEVEL4 + + var darkCount = 0; + + for (var col = 0; col < moduleCount; col++) { + for (var row = 0; row < moduleCount; row++) { + if (qrCode.isDark(row, col) ) { + darkCount++; + } + } + } + + var ratio = Math.abs(100 * darkCount / moduleCount / moduleCount - 50) / 5; + lostPoint += ratio * 10; + + return lostPoint; + } + +}; + + +//--------------------------------------------------------------------- +// QRMath +//--------------------------------------------------------------------- + +var QRMath = { + + glog : function(n) { + + if (n < 1) { + throw new Error("glog(" + n + ")"); + } + + return QRMath.LOG_TABLE[n]; + }, + + gexp : function(n) { + + while (n < 0) { + n += 255; + } + + while (n >= 256) { + n -= 255; + } + + return QRMath.EXP_TABLE[n]; + }, + + EXP_TABLE : new Array(256), + + LOG_TABLE : new Array(256) + +}; + +for (var i = 0; i < 8; i++) { + QRMath.EXP_TABLE[i] = 1 << i; +} +for (var i = 8; i < 256; i++) { + QRMath.EXP_TABLE[i] = QRMath.EXP_TABLE[i - 4] + ^ QRMath.EXP_TABLE[i - 5] + ^ QRMath.EXP_TABLE[i - 6] + ^ QRMath.EXP_TABLE[i - 8]; +} +for (var i = 0; i < 255; i++) { + QRMath.LOG_TABLE[QRMath.EXP_TABLE[i] ] = i; +} + +//--------------------------------------------------------------------- +// QRPolynomial +//--------------------------------------------------------------------- + +function QRPolynomial(num, shift) { + + if (num.length == undefined) { + throw new Error(num.length + "/" + shift); + } + + var offset = 0; + + while (offset < num.length && num[offset] == 0) { + offset++; + } + + this.num = new Array(num.length - offset + shift); + for (var i = 0; i < num.length - offset; i++) { + this.num[i] = num[i + offset]; + } +} + +QRPolynomial.prototype = { + + get : function(index) { + return this.num[index]; + }, + + getLength : function() { + return this.num.length; + }, + + multiply : function(e) { + + var num = new Array(this.getLength() + e.getLength() - 1); + + for (var i = 0; i < this.getLength(); i++) { + for (var j = 0; j < e.getLength(); j++) { + num[i + j] ^= QRMath.gexp(QRMath.glog(this.get(i) ) + QRMath.glog(e.get(j) ) ); + } + } + + return new QRPolynomial(num, 0); + }, + + mod : function(e) { + + if (this.getLength() - e.getLength() < 0) { + return this; + } + + var ratio = QRMath.glog(this.get(0) ) - QRMath.glog(e.get(0) ); + + var num = new Array(this.getLength() ); + + for (var i = 0; i < this.getLength(); i++) { + num[i] = this.get(i); + } + + for (var i = 0; i < e.getLength(); i++) { + num[i] ^= QRMath.gexp(QRMath.glog(e.get(i) ) + ratio); + } + + // recursive call + return new QRPolynomial(num, 0).mod(e); + } +}; + +//--------------------------------------------------------------------- +// QRRSBlock +//--------------------------------------------------------------------- + +function QRRSBlock(totalCount, dataCount) { + this.totalCount = totalCount; + this.dataCount = dataCount; +} + +QRRSBlock.RS_BLOCK_TABLE = [ + + // L + // M + // Q + // H + + // 1 + [1, 26, 19], + [1, 26, 16], + [1, 26, 13], + [1, 26, 9], + + // 2 + [1, 44, 34], + [1, 44, 28], + [1, 44, 22], + [1, 44, 16], + + // 3 + [1, 70, 55], + [1, 70, 44], + [2, 35, 17], + [2, 35, 13], + + // 4 + [1, 100, 80], + [2, 50, 32], + [2, 50, 24], + [4, 25, 9], + + // 5 + [1, 134, 108], + [2, 67, 43], + [2, 33, 15, 2, 34, 16], + [2, 33, 11, 2, 34, 12], + + // 6 + [2, 86, 68], + [4, 43, 27], + [4, 43, 19], + [4, 43, 15], + + // 7 + [2, 98, 78], + [4, 49, 31], + [2, 32, 14, 4, 33, 15], + [4, 39, 13, 1, 40, 14], + + // 8 + [2, 121, 97], + [2, 60, 38, 2, 61, 39], + [4, 40, 18, 2, 41, 19], + [4, 40, 14, 2, 41, 15], + + // 9 + [2, 146, 116], + [3, 58, 36, 2, 59, 37], + [4, 36, 16, 4, 37, 17], + [4, 36, 12, 4, 37, 13], + + // 10 + [2, 86, 68, 2, 87, 69], + [4, 69, 43, 1, 70, 44], + [6, 43, 19, 2, 44, 20], + [6, 43, 15, 2, 44, 16], + + // 11 + [4, 101, 81], + [1, 80, 50, 4, 81, 51], + [4, 50, 22, 4, 51, 23], + [3, 36, 12, 8, 37, 13], + + // 12 + [2, 116, 92, 2, 117, 93], + [6, 58, 36, 2, 59, 37], + [4, 46, 20, 6, 47, 21], + [7, 42, 14, 4, 43, 15], + + // 13 + [4, 133, 107], + [8, 59, 37, 1, 60, 38], + [8, 44, 20, 4, 45, 21], + [12, 33, 11, 4, 34, 12], + + // 14 + [3, 145, 115, 1, 146, 116], + [4, 64, 40, 5, 65, 41], + [11, 36, 16, 5, 37, 17], + [11, 36, 12, 5, 37, 13], + + // 15 + [5, 109, 87, 1, 110, 88], + [5, 65, 41, 5, 66, 42], + [5, 54, 24, 7, 55, 25], + [11, 36, 12], + + // 16 + [5, 122, 98, 1, 123, 99], + [7, 73, 45, 3, 74, 46], + [15, 43, 19, 2, 44, 20], + [3, 45, 15, 13, 46, 16], + + // 17 + [1, 135, 107, 5, 136, 108], + [10, 74, 46, 1, 75, 47], + [1, 50, 22, 15, 51, 23], + [2, 42, 14, 17, 43, 15], + + // 18 + [5, 150, 120, 1, 151, 121], + [9, 69, 43, 4, 70, 44], + [17, 50, 22, 1, 51, 23], + [2, 42, 14, 19, 43, 15], + + // 19 + [3, 141, 113, 4, 142, 114], + [3, 70, 44, 11, 71, 45], + [17, 47, 21, 4, 48, 22], + [9, 39, 13, 16, 40, 14], + + // 20 + [3, 135, 107, 5, 136, 108], + [3, 67, 41, 13, 68, 42], + [15, 54, 24, 5, 55, 25], + [15, 43, 15, 10, 44, 16], + + // 21 + [4, 144, 116, 4, 145, 117], + [17, 68, 42], + [17, 50, 22, 6, 51, 23], + [19, 46, 16, 6, 47, 17], + + // 22 + [2, 139, 111, 7, 140, 112], + [17, 74, 46], + [7, 54, 24, 16, 55, 25], + [34, 37, 13], + + // 23 + [4, 151, 121, 5, 152, 122], + [4, 75, 47, 14, 76, 48], + [11, 54, 24, 14, 55, 25], + [16, 45, 15, 14, 46, 16], + + // 24 + [6, 147, 117, 4, 148, 118], + [6, 73, 45, 14, 74, 46], + [11, 54, 24, 16, 55, 25], + [30, 46, 16, 2, 47, 17], + + // 25 + [8, 132, 106, 4, 133, 107], + [8, 75, 47, 13, 76, 48], + [7, 54, 24, 22, 55, 25], + [22, 45, 15, 13, 46, 16], + + // 26 + [10, 142, 114, 2, 143, 115], + [19, 74, 46, 4, 75, 47], + [28, 50, 22, 6, 51, 23], + [33, 46, 16, 4, 47, 17], + + // 27 + [8, 152, 122, 4, 153, 123], + [22, 73, 45, 3, 74, 46], + [8, 53, 23, 26, 54, 24], + [12, 45, 15, 28, 46, 16], + + // 28 + [3, 147, 117, 10, 148, 118], + [3, 73, 45, 23, 74, 46], + [4, 54, 24, 31, 55, 25], + [11, 45, 15, 31, 46, 16], + + // 29 + [7, 146, 116, 7, 147, 117], + [21, 73, 45, 7, 74, 46], + [1, 53, 23, 37, 54, 24], + [19, 45, 15, 26, 46, 16], + + // 30 + [5, 145, 115, 10, 146, 116], + [19, 75, 47, 10, 76, 48], + [15, 54, 24, 25, 55, 25], + [23, 45, 15, 25, 46, 16], + + // 31 + [13, 145, 115, 3, 146, 116], + [2, 74, 46, 29, 75, 47], + [42, 54, 24, 1, 55, 25], + [23, 45, 15, 28, 46, 16], + + // 32 + [17, 145, 115], + [10, 74, 46, 23, 75, 47], + [10, 54, 24, 35, 55, 25], + [19, 45, 15, 35, 46, 16], + + // 33 + [17, 145, 115, 1, 146, 116], + [14, 74, 46, 21, 75, 47], + [29, 54, 24, 19, 55, 25], + [11, 45, 15, 46, 46, 16], + + // 34 + [13, 145, 115, 6, 146, 116], + [14, 74, 46, 23, 75, 47], + [44, 54, 24, 7, 55, 25], + [59, 46, 16, 1, 47, 17], + + // 35 + [12, 151, 121, 7, 152, 122], + [12, 75, 47, 26, 76, 48], + [39, 54, 24, 14, 55, 25], + [22, 45, 15, 41, 46, 16], + + // 36 + [6, 151, 121, 14, 152, 122], + [6, 75, 47, 34, 76, 48], + [46, 54, 24, 10, 55, 25], + [2, 45, 15, 64, 46, 16], + + // 37 + [17, 152, 122, 4, 153, 123], + [29, 74, 46, 14, 75, 47], + [49, 54, 24, 10, 55, 25], + [24, 45, 15, 46, 46, 16], + + // 38 + [4, 152, 122, 18, 153, 123], + [13, 74, 46, 32, 75, 47], + [48, 54, 24, 14, 55, 25], + [42, 45, 15, 32, 46, 16], + + // 39 + [20, 147, 117, 4, 148, 118], + [40, 75, 47, 7, 76, 48], + [43, 54, 24, 22, 55, 25], + [10, 45, 15, 67, 46, 16], + + // 40 + [19, 148, 118, 6, 149, 119], + [18, 75, 47, 31, 76, 48], + [34, 54, 24, 34, 55, 25], + [20, 45, 15, 61, 46, 16] +]; + +QRRSBlock.getRSBlocks = function(typeNumber, errorCorrectLevel) { + + var rsBlock = QRRSBlock.getRsBlockTable(typeNumber, errorCorrectLevel); + + if (rsBlock == undefined) { + throw new Error("bad rs block @ typeNumber:" + typeNumber + "/errorCorrectLevel:" + errorCorrectLevel); + } + + var length = rsBlock.length / 3; + + var list = new Array(); + + for (var i = 0; i < length; i++) { + + var count = rsBlock[i * 3 + 0]; + var totalCount = rsBlock[i * 3 + 1]; + var dataCount = rsBlock[i * 3 + 2]; + + for (var j = 0; j < count; j++) { + list.push(new QRRSBlock(totalCount, dataCount) ); + } + } + + return list; +} + +QRRSBlock.getRsBlockTable = function(typeNumber, errorCorrectLevel) { + + switch(errorCorrectLevel) { + case QRErrorCorrectLevel.L : + return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 0]; + case QRErrorCorrectLevel.M : + return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 1]; + case QRErrorCorrectLevel.Q : + return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 2]; + case QRErrorCorrectLevel.H : + return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 3]; + default : + return undefined; + } +} + +//--------------------------------------------------------------------- +// QRBitBuffer +//--------------------------------------------------------------------- + +function QRBitBuffer() { + this.buffer = new Array(); + this.length = 0; +} + +QRBitBuffer.prototype = { + + get : function(index) { + var bufIndex = Math.floor(index / 8); + return ( (this.buffer[bufIndex] >>> (7 - index % 8) ) & 1) == 1; + }, + + put : function(num, length) { + for (var i = 0; i < length; i++) { + this.putBit( ( (num >>> (length - i - 1) ) & 1) == 1); + } + }, + + getLengthInBits : function() { + return this.length; + }, + + putBit : function(bit) { + + var bufIndex = Math.floor(this.length / 8); + if (this.buffer.length <= bufIndex) { + this.buffer.push(0); + } + + if (bit) { + this.buffer[bufIndex] |= (0x80 >>> (this.length % 8) ); + } + + this.length++; + } +}; + +export { + QRCode, + QRErrorCorrectLevel +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..00a8891 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,19 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "weapp-qrcode": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/weapp-qrcode/-/weapp-qrcode-1.0.0.tgz", + "integrity": "sha512-4sa3W0rGDVJ9QaeZpAKlAuUxVyjhDwiUqHyGK/jJMsRMXnhb4yO8qWU/pZruMo+iT5J6CraS67lDMFb1VY+RaA==", + "requires": { + "extend": "^3.0.2" + } + } + } +} diff --git a/package.json b/package.json index f3292f8..7a6830e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,7 @@ { "dependencies": { - "uview-ui": "^2.0.36" + "uview-ui": "^2.0.36", + "weapp-qrcode": "^1.0.0" }, "devDependencies": { "sass": "^1.69.5", diff --git a/pages/orderList/orderList.vue b/pages/orderList/orderList.vue index ff0574d..ff90f3e 100644 --- a/pages/orderList/orderList.vue +++ b/pages/orderList/orderList.vue @@ -17,40 +17,51 @@ 订单编号:{{item.orderNo}} - {{ getStatus(item.status) }} + {{ getStatus(item.orderStatus) }} - {{ item.busiTypeStr }} + {{ item.goodsTitle }} - {{ item.address }} + {{ item.tenantName | 蓝安-中鑫之宝 }} 共计 - 781 + {{item.payMoney}} - {{ item.date }} + {{formatTimestamp(item.createTime)}} - 查看订单 - 评价订单 + 支付 + 查看订单 + 评价订单 + + + + 收款码 + + + + + diff --git a/uni_modules/uni-popup/components/uni-popup-message/uni-popup-message.vue b/uni_modules/uni-popup/components/uni-popup-message/uni-popup-message.vue new file mode 100644 index 0000000..91370a8 --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup-message/uni-popup-message.vue @@ -0,0 +1,143 @@ + + + + diff --git a/uni_modules/uni-popup/components/uni-popup-share/uni-popup-share.vue b/uni_modules/uni-popup/components/uni-popup-share/uni-popup-share.vue new file mode 100644 index 0000000..f7e667c --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup-share/uni-popup-share.vue @@ -0,0 +1,187 @@ + + + + diff --git a/uni_modules/uni-popup/components/uni-popup/i18n/en.json b/uni_modules/uni-popup/components/uni-popup/i18n/en.json new file mode 100644 index 0000000..7f1bd06 --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup/i18n/en.json @@ -0,0 +1,7 @@ +{ + "uni-popup.cancel": "cancel", + "uni-popup.ok": "ok", + "uni-popup.placeholder": "pleace enter", + "uni-popup.title": "Hint", + "uni-popup.shareTitle": "Share to" +} diff --git a/uni_modules/uni-popup/components/uni-popup/i18n/index.js b/uni_modules/uni-popup/components/uni-popup/i18n/index.js new file mode 100644 index 0000000..de7509c --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup/i18n/index.js @@ -0,0 +1,8 @@ +import en from './en.json' +import zhHans from './zh-Hans.json' +import zhHant from './zh-Hant.json' +export default { + en, + 'zh-Hans': zhHans, + 'zh-Hant': zhHant +} diff --git a/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hans.json b/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hans.json new file mode 100644 index 0000000..5e3003c --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hans.json @@ -0,0 +1,7 @@ +{ + "uni-popup.cancel": "取消", + "uni-popup.ok": "确定", + "uni-popup.placeholder": "请输入", + "uni-popup.title": "提示", + "uni-popup.shareTitle": "分享到" +} diff --git a/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hant.json b/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hant.json new file mode 100644 index 0000000..13e39eb --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hant.json @@ -0,0 +1,7 @@ +{ + "uni-popup.cancel": "取消", + "uni-popup.ok": "確定", + "uni-popup.placeholder": "請輸入", + "uni-popup.title": "提示", + "uni-popup.shareTitle": "分享到" +} diff --git a/uni_modules/uni-popup/components/uni-popup/keypress.js b/uni_modules/uni-popup/components/uni-popup/keypress.js new file mode 100644 index 0000000..62dda46 --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup/keypress.js @@ -0,0 +1,45 @@ +// #ifdef H5 +export default { + name: 'Keypress', + props: { + disable: { + type: Boolean, + default: false + } + }, + mounted () { + const keyNames = { + esc: ['Esc', 'Escape'], + tab: 'Tab', + enter: 'Enter', + space: [' ', 'Spacebar'], + up: ['Up', 'ArrowUp'], + left: ['Left', 'ArrowLeft'], + right: ['Right', 'ArrowRight'], + down: ['Down', 'ArrowDown'], + delete: ['Backspace', 'Delete', 'Del'] + } + const listener = ($event) => { + if (this.disable) { + return + } + const keyName = Object.keys(keyNames).find(key => { + const keyName = $event.key + const value = keyNames[key] + return value === keyName || (Array.isArray(value) && value.includes(keyName)) + }) + if (keyName) { + // 避免和其他按键事件冲突 + setTimeout(() => { + this.$emit(keyName, {}) + }, 0) + } + } + document.addEventListener('keyup', listener) + // this.$once('hook:beforeDestroy', () => { + // document.removeEventListener('keyup', listener) + // }) + }, + render: () => {} +} +// #endif diff --git a/uni_modules/uni-popup/components/uni-popup/popup.js b/uni_modules/uni-popup/components/uni-popup/popup.js new file mode 100644 index 0000000..c4e5781 --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup/popup.js @@ -0,0 +1,26 @@ + +export default { + data() { + return { + + } + }, + created(){ + this.popup = this.getParent() + }, + methods:{ + /** + * 获取父元素实例 + */ + getParent(name = 'uniPopup') { + let parent = this.$parent; + let parentName = parent.$options.name; + while (parentName !== name) { + parent = parent.$parent; + if (!parent) return false + parentName = parent.$options.name; + } + return parent; + }, + } +} diff --git a/uni_modules/uni-popup/components/uni-popup/uni-popup.uvue b/uni_modules/uni-popup/components/uni-popup/uni-popup.uvue new file mode 100644 index 0000000..5eb8d5b --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup/uni-popup.uvue @@ -0,0 +1,90 @@ + + + + + \ No newline at end of file diff --git a/uni_modules/uni-popup/components/uni-popup/uni-popup.vue b/uni_modules/uni-popup/components/uni-popup/uni-popup.vue new file mode 100644 index 0000000..f0b99e3 --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup/uni-popup.vue @@ -0,0 +1,506 @@ + + + + diff --git a/uni_modules/uni-popup/package.json b/uni_modules/uni-popup/package.json new file mode 100644 index 0000000..0a4ebf7 --- /dev/null +++ b/uni_modules/uni-popup/package.json @@ -0,0 +1,88 @@ +{ + "id": "uni-popup", + "displayName": "uni-popup 弹出层", + "version": "1.9.2", + "description": " Popup 组件,提供常用的弹层", + "keywords": [ + "uni-ui", + "弹出层", + "弹窗", + "popup", + "弹框" + ], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui", + "type": "component-vue" + }, + "uni_modules": { + "dependencies": [ + "uni-scss", + "uni-transition" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y", + "alipay": "n" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-popup/readme.md b/uni_modules/uni-popup/readme.md new file mode 100644 index 0000000..fdad4b3 --- /dev/null +++ b/uni_modules/uni-popup/readme.md @@ -0,0 +1,17 @@ + + +## Popup 弹出层 +> **组件名:uni-popup** +> 代码块: `uPopup` +> 关联组件:`uni-transition` + + +弹出层组件,在应用中弹出一个消息提示窗口、提示框等 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-popup) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 + + + + + diff --git a/uni_modules/uni-transition/changelog.md b/uni_modules/uni-transition/changelog.md new file mode 100644 index 0000000..faaf336 --- /dev/null +++ b/uni_modules/uni-transition/changelog.md @@ -0,0 +1,24 @@ +## 1.3.3(2024-04-23) +- 修复 当元素会受变量影响自动隐藏的bug +## 1.3.2(2023-05-04) +- 修复 NVUE 平台报错的问题 +## 1.3.1(2021-11-23) +- 修复 init 方法初始化问题 +## 1.3.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-transition](https://uniapp.dcloud.io/component/uniui/uni-transition) +## 1.2.1(2021-09-27) +- 修复 init 方法不生效的 Bug +## 1.2.0(2021-07-30) +- 组件兼容 vue3,如何创建 vue3 项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.1.1(2021-05-12) +- 新增 示例地址 +- 修复 示例项目缺少组件的 Bug +## 1.1.0(2021-04-22) +- 新增 通过方法自定义动画 +- 新增 custom-class 非 NVUE 平台支持自定义 class 定制样式 +- 优化 动画触发逻辑,使动画更流畅 +- 优化 支持单独的动画类型 +- 优化 文档示例 +## 1.0.2(2021-02-05) +- 调整为 uni_modules 目录规范 diff --git a/uni_modules/uni-transition/components/uni-transition/createAnimation.js b/uni_modules/uni-transition/components/uni-transition/createAnimation.js new file mode 100644 index 0000000..8f89b18 --- /dev/null +++ b/uni_modules/uni-transition/components/uni-transition/createAnimation.js @@ -0,0 +1,131 @@ +// const defaultOption = { +// duration: 300, +// timingFunction: 'linear', +// delay: 0, +// transformOrigin: '50% 50% 0' +// } +// #ifdef APP-NVUE +const nvueAnimation = uni.requireNativePlugin('animation') +// #endif +class MPAnimation { + constructor(options, _this) { + this.options = options + // 在iOS10+QQ小程序平台下,传给原生的对象一定是个普通对象而不是Proxy对象,否则会报parameter should be Object instead of ProxyObject的错误 + this.animation = uni.createAnimation({ + ...options + }) + this.currentStepAnimates = {} + this.next = 0 + this.$ = _this + + } + + _nvuePushAnimates(type, args) { + let aniObj = this.currentStepAnimates[this.next] + let styles = {} + if (!aniObj) { + styles = { + styles: {}, + config: {} + } + } else { + styles = aniObj + } + if (animateTypes1.includes(type)) { + if (!styles.styles.transform) { + styles.styles.transform = '' + } + let unit = '' + if(type === 'rotate'){ + unit = 'deg' + } + styles.styles.transform += `${type}(${args+unit}) ` + } else { + styles.styles[type] = `${args}` + } + this.currentStepAnimates[this.next] = styles + } + _animateRun(styles = {}, config = {}) { + let ref = this.$.$refs['ani'].ref + if (!ref) return + return new Promise((resolve, reject) => { + nvueAnimation.transition(ref, { + styles, + ...config + }, res => { + resolve() + }) + }) + } + + _nvueNextAnimate(animates, step = 0, fn) { + let obj = animates[step] + if (obj) { + let { + styles, + config + } = obj + this._animateRun(styles, config).then(() => { + step += 1 + this._nvueNextAnimate(animates, step, fn) + }) + } else { + this.currentStepAnimates = {} + typeof fn === 'function' && fn() + this.isEnd = true + } + } + + step(config = {}) { + // #ifndef APP-NVUE + this.animation.step(config) + // #endif + // #ifdef APP-NVUE + this.currentStepAnimates[this.next].config = Object.assign({}, this.options, config) + this.currentStepAnimates[this.next].styles.transformOrigin = this.currentStepAnimates[this.next].config.transformOrigin + this.next++ + // #endif + return this + } + + run(fn) { + // #ifndef APP-NVUE + this.$.animationData = this.animation.export() + this.$.timer = setTimeout(() => { + typeof fn === 'function' && fn() + }, this.$.durationTime) + // #endif + // #ifdef APP-NVUE + this.isEnd = false + let ref = this.$.$refs['ani'] && this.$.$refs['ani'].ref + if(!ref) return + this._nvueNextAnimate(this.currentStepAnimates, 0, fn) + this.next = 0 + // #endif + } +} + + +const animateTypes1 = ['matrix', 'matrix3d', 'rotate', 'rotate3d', 'rotateX', 'rotateY', 'rotateZ', 'scale', 'scale3d', + 'scaleX', 'scaleY', 'scaleZ', 'skew', 'skewX', 'skewY', 'translate', 'translate3d', 'translateX', 'translateY', + 'translateZ' +] +const animateTypes2 = ['opacity', 'backgroundColor'] +const animateTypes3 = ['width', 'height', 'left', 'right', 'top', 'bottom'] +animateTypes1.concat(animateTypes2, animateTypes3).forEach(type => { + MPAnimation.prototype[type] = function(...args) { + // #ifndef APP-NVUE + this.animation[type](...args) + // #endif + // #ifdef APP-NVUE + this._nvuePushAnimates(type, args) + // #endif + return this + } +}) + +export function createAnimation(option, _this) { + if(!_this) return + clearTimeout(_this.timer) + return new MPAnimation(option, _this) +} diff --git a/uni_modules/uni-transition/components/uni-transition/uni-transition.vue b/uni_modules/uni-transition/components/uni-transition/uni-transition.vue new file mode 100644 index 0000000..f3ddd1f --- /dev/null +++ b/uni_modules/uni-transition/components/uni-transition/uni-transition.vue @@ -0,0 +1,286 @@ + + + + + diff --git a/uni_modules/uni-transition/package.json b/uni_modules/uni-transition/package.json new file mode 100644 index 0000000..d5c20e1 --- /dev/null +++ b/uni_modules/uni-transition/package.json @@ -0,0 +1,85 @@ +{ + "id": "uni-transition", + "displayName": "uni-transition 过渡动画", + "version": "1.3.3", + "description": "元素的简单过渡动画", + "keywords": [ + "uni-ui", + "uniui", + "动画", + "过渡", + "过渡动画" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, +"dcloudext": { + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui", + "type": "component-vue" + }, + "uni_modules": { + "dependencies": ["uni-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y", + "alipay": "n" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-transition/readme.md b/uni_modules/uni-transition/readme.md new file mode 100644 index 0000000..2f8a77e --- /dev/null +++ b/uni_modules/uni-transition/readme.md @@ -0,0 +1,11 @@ + + +## Transition 过渡动画 +> **组件名:uni-transition** +> 代码块: `uTransition` + + +元素过渡动画 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-transition) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file