lex 2 éve
szülő
commit
7cecb92f73

+ 369 - 20
package-lock.json

@@ -23,6 +23,7 @@
         "normalize.css": "^8.0.1",
         "numeral": "^2.0.6",
         "plyr": "^3.6.12",
+        "qrcode": "^1.5.1",
         "qrcode.vue": "^3.3.3",
         "query-string": "^7.1.1",
         "umi-request": "^1.4.0",
@@ -2799,7 +2800,6 @@
       "version": "5.0.1",
       "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz",
       "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
-      "dev": true,
       "license": "MIT",
       "engines": {
         "node": ">=8"
@@ -2809,7 +2809,6 @@
       "version": "4.3.0",
       "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
       "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
       "license": "MIT",
       "dependencies": {
         "color-convert": "^2.0.1"
@@ -3404,6 +3403,29 @@
         "node": ">= 10"
       }
     },
+    "node_modules/cliui": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmmirror.com/cliui/-/cliui-6.0.0.tgz",
+      "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
+      "dependencies": {
+        "string-width": "^4.2.0",
+        "strip-ansi": "^6.0.0",
+        "wrap-ansi": "^6.2.0"
+      }
+    },
+    "node_modules/cliui/node_modules/wrap-ansi": {
+      "version": "6.2.0",
+      "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+      "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+      "dependencies": {
+        "ansi-styles": "^4.0.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
     "node_modules/clone": {
       "version": "1.0.4",
       "resolved": "https://registry.npmmirror.com/clone/-/clone-1.0.4.tgz",
@@ -3418,7 +3440,6 @@
       "version": "2.0.1",
       "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
       "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
       "license": "MIT",
       "dependencies": {
         "color-name": "~1.1.4"
@@ -3431,7 +3452,6 @@
       "version": "1.1.4",
       "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
       "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true,
       "license": "MIT"
     },
     "node_modules/colorette": {
@@ -3651,6 +3671,14 @@
         }
       }
     },
+    "node_modules/decamelize": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/decamelize/-/decamelize-1.2.0.tgz",
+      "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
     "node_modules/decode-uri-component": {
       "version": "0.2.0",
       "resolved": "https://registry.npmmirror.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
@@ -3723,6 +3751,11 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/dijkstrajs": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/dijkstrajs/-/dijkstrajs-1.0.2.tgz",
+      "integrity": "sha512-QV6PMaHTCNmKSeP6QoXhVTw9snc9VD8MulTT0Bd99Pacp4SS1cjcrYPgBPmibqKVtMJJfqC6XvOXgPMEEPH/fg=="
+    },
     "node_modules/dir-glob": {
       "version": "3.0.1",
       "resolved": "https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz",
@@ -3876,9 +3909,13 @@
       "version": "8.0.0",
       "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz",
       "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
-      "dev": true,
       "license": "MIT"
     },
+    "node_modules/encode-utf8": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/encode-utf8/-/encode-utf8-1.0.3.tgz",
+      "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw=="
+    },
     "node_modules/encoding": {
       "version": "0.1.13",
       "resolved": "https://registry.npmmirror.com/encoding/-/encoding-0.1.13.tgz",
@@ -4602,6 +4639,18 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/find-up": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz",
+      "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+      "dependencies": {
+        "locate-path": "^5.0.0",
+        "path-exists": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
     "node_modules/findup-sync": {
       "version": "5.0.0",
       "resolved": "https://registry.npmmirror.com/findup-sync/-/findup-sync-5.0.0.tgz",
@@ -4760,6 +4809,14 @@
         "node": ">=6.9.0"
       }
     },
+    "node_modules/get-caller-file": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz",
+      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+      "engines": {
+        "node": "6.* || 8.* || >= 10.*"
+      }
+    },
     "node_modules/get-intrinsic": {
       "version": "1.1.1",
       "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
@@ -5323,7 +5380,6 @@
       "version": "3.0.0",
       "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
       "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
-      "dev": true,
       "license": "MIT",
       "engines": {
         "node": ">=8"
@@ -5941,6 +5997,17 @@
       "integrity": "sha512-AgQGZisAlTPbTEzrHPb6q+NYBMD+DP9uvGSIjSUM5uG+0jG15cb8axWpxuOIqrmQjn6scaaH8JwloiP27b2KXA==",
       "license": "MIT"
     },
+    "node_modules/locate-path": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz",
+      "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+      "dependencies": {
+        "p-locate": "^4.1.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
     "node_modules/lodash": {
       "version": "4.17.21",
       "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz",
@@ -6818,6 +6885,28 @@
         "node": ">=4"
       }
     },
+    "node_modules/p-limit": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz",
+      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+      "dependencies": {
+        "p-try": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/p-locate": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz",
+      "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+      "dependencies": {
+        "p-limit": "^2.2.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
     "node_modules/p-map": {
       "version": "4.0.0",
       "resolved": "https://registry.npmmirror.com/p-map/-/p-map-4.0.0.tgz",
@@ -6834,6 +6923,14 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
+    "node_modules/p-try": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz",
+      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+      "engines": {
+        "node": ">=6"
+      }
+    },
     "node_modules/param-case": {
       "version": "3.0.4",
       "resolved": "https://registry.npmmirror.com/param-case/-/param-case-3.0.4.tgz",
@@ -6915,6 +7012,14 @@
         "tslib": "^2.0.3"
       }
     },
+    "node_modules/path-exists": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz",
+      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+      "engines": {
+        "node": ">=8"
+      }
+    },
     "node_modules/path-is-absolute": {
       "version": "1.0.1",
       "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
@@ -7052,6 +7157,14 @@
         "url-polyfill": "^1.1.12"
       }
     },
+    "node_modules/pngjs": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmmirror.com/pngjs/-/pngjs-5.0.0.tgz",
+      "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==",
+      "engines": {
+        "node": ">=10.13.0"
+      }
+    },
     "node_modules/postcss": {
       "version": "8.4.14",
       "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.14.tgz",
@@ -7307,6 +7420,23 @@
         "node": ">=6"
       }
     },
+    "node_modules/qrcode": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmmirror.com/qrcode/-/qrcode-1.5.1.tgz",
+      "integrity": "sha512-nS8NJ1Z3md8uTjKtP+SGGhfqmTCs5flU/xR623oI0JX+Wepz9R8UrRVCTBTJm3qGw3rH6jJ6MUHjkDx15cxSSg==",
+      "dependencies": {
+        "dijkstrajs": "^1.0.1",
+        "encode-utf8": "^1.0.3",
+        "pngjs": "^5.0.0",
+        "yargs": "^15.3.1"
+      },
+      "bin": {
+        "qrcode": "bin/qrcode"
+      },
+      "engines": {
+        "node": ">=10.13.0"
+      }
+    },
     "node_modules/qrcode.vue": {
       "version": "3.3.3",
       "resolved": "https://registry.npmmirror.com/qrcode.vue/-/qrcode.vue-3.3.3.tgz",
@@ -7505,6 +7635,19 @@
       "dev": true,
       "license": "MIT"
     },
+    "node_modules/require-directory": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz",
+      "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/require-main-filename": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/require-main-filename/-/require-main-filename-2.0.0.tgz",
+      "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="
+    },
     "node_modules/resize-detector": {
       "version": "0.3.0",
       "resolved": "https://registry.npmmirror.com/resize-detector/-/resize-detector-0.3.0.tgz",
@@ -7706,6 +7849,11 @@
         "upper-case-first": "^2.0.2"
       }
     },
+    "node_modules/set-blocking": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/set-blocking/-/set-blocking-2.0.0.tgz",
+      "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="
+    },
     "node_modules/shebang-command": {
       "version": "2.0.0",
       "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz",
@@ -7892,7 +8040,6 @@
       "version": "4.2.2",
       "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.2.tgz",
       "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
-      "dev": true,
       "license": "MIT",
       "dependencies": {
         "emoji-regex": "^8.0.0",
@@ -7907,7 +8054,6 @@
       "version": "6.0.1",
       "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz",
       "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-      "dev": true,
       "license": "MIT",
       "dependencies": {
         "ansi-regex": "^5.0.1"
@@ -8815,6 +8961,11 @@
         "which": "bin/which"
       }
     },
+    "node_modules/which-module": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/which-module/-/which-module-2.0.0.tgz",
+      "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q=="
+    },
     "node_modules/with": {
       "version": "7.0.2",
       "resolved": "https://registry.npmmirror.com/with/-/with-7.0.2.tgz",
@@ -8873,6 +9024,11 @@
       "dev": true,
       "license": "ISC"
     },
+    "node_modules/y18n": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmmirror.com/y18n/-/y18n-4.0.3.tgz",
+      "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ=="
+    },
     "node_modules/yallist": {
       "version": "4.0.0",
       "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz",
@@ -8890,6 +9046,47 @@
         "node": ">= 6"
       }
     },
+    "node_modules/yargs": {
+      "version": "15.4.1",
+      "resolved": "https://registry.npmmirror.com/yargs/-/yargs-15.4.1.tgz",
+      "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
+      "dependencies": {
+        "cliui": "^6.0.0",
+        "decamelize": "^1.2.0",
+        "find-up": "^4.1.0",
+        "get-caller-file": "^2.0.1",
+        "require-directory": "^2.1.1",
+        "require-main-filename": "^2.0.0",
+        "set-blocking": "^2.0.0",
+        "string-width": "^4.2.0",
+        "which-module": "^2.0.0",
+        "y18n": "^4.0.0",
+        "yargs-parser": "^18.1.2"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/yargs-parser": {
+      "version": "18.1.3",
+      "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-18.1.3.tgz",
+      "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
+      "dependencies": {
+        "camelcase": "^5.0.0",
+        "decamelize": "^1.2.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/yargs-parser/node_modules/camelcase": {
+      "version": "5.3.1",
+      "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz",
+      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+      "engines": {
+        "node": ">=6"
+      }
+    },
     "node_modules/yorkie": {
       "version": "2.0.0",
       "resolved": "https://registry.npmmirror.com/yorkie/-/yorkie-2.0.0.tgz",
@@ -10862,14 +11059,12 @@
     "ansi-regex": {
       "version": "5.0.1",
       "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz",
-      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
-      "dev": true
+      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="
     },
     "ansi-styles": {
       "version": "4.3.0",
       "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
       "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
       "requires": {
         "color-convert": "^2.0.1"
       }
@@ -11239,6 +11434,28 @@
       "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==",
       "dev": true
     },
+    "cliui": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmmirror.com/cliui/-/cliui-6.0.0.tgz",
+      "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
+      "requires": {
+        "string-width": "^4.2.0",
+        "strip-ansi": "^6.0.0",
+        "wrap-ansi": "^6.2.0"
+      },
+      "dependencies": {
+        "wrap-ansi": {
+          "version": "6.2.0",
+          "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+          "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+          "requires": {
+            "ansi-styles": "^4.0.0",
+            "string-width": "^4.1.0",
+            "strip-ansi": "^6.0.0"
+          }
+        }
+      }
+    },
     "clone": {
       "version": "1.0.4",
       "resolved": "https://registry.npmmirror.com/clone/-/clone-1.0.4.tgz",
@@ -11249,7 +11466,6 @@
       "version": "2.0.1",
       "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
       "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
       "requires": {
         "color-name": "~1.1.4"
       }
@@ -11257,8 +11473,7 @@
     "color-name": {
       "version": "1.1.4",
       "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
     },
     "colorette": {
       "version": "2.0.16",
@@ -11406,6 +11621,11 @@
         "ms": "2.1.2"
       }
     },
+    "decamelize": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/decamelize/-/decamelize-1.2.0.tgz",
+      "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA=="
+    },
     "decode-uri-component": {
       "version": "0.2.0",
       "resolved": "https://registry.npmmirror.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
@@ -11457,6 +11677,11 @@
       "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==",
       "dev": true
     },
+    "dijkstrajs": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/dijkstrajs/-/dijkstrajs-1.0.2.tgz",
+      "integrity": "sha512-QV6PMaHTCNmKSeP6QoXhVTw9snc9VD8MulTT0Bd99Pacp4SS1cjcrYPgBPmibqKVtMJJfqC6XvOXgPMEEPH/fg=="
+    },
     "dir-glob": {
       "version": "3.0.1",
       "resolved": "https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz",
@@ -11574,8 +11799,12 @@
     "emoji-regex": {
       "version": "8.0.0",
       "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz",
-      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
-      "dev": true
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+    },
+    "encode-utf8": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/encode-utf8/-/encode-utf8-1.0.3.tgz",
+      "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw=="
     },
     "encoding": {
       "version": "0.1.13",
@@ -12078,6 +12307,15 @@
       "resolved": "https://registry.npmmirror.com/filter-obj/-/filter-obj-1.1.0.tgz",
       "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ=="
     },
+    "find-up": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz",
+      "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+      "requires": {
+        "locate-path": "^5.0.0",
+        "path-exists": "^4.0.0"
+      }
+    },
     "findup-sync": {
       "version": "5.0.0",
       "resolved": "https://registry.npmmirror.com/findup-sync/-/findup-sync-5.0.0.tgz",
@@ -12185,6 +12423,11 @@
       "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
       "dev": true
     },
+    "get-caller-file": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz",
+      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
+    },
     "get-intrinsic": {
       "version": "1.1.1",
       "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
@@ -12565,8 +12808,7 @@
     "is-fullwidth-code-point": {
       "version": "3.0.0",
       "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
-      "dev": true
+      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
     },
     "is-glob": {
       "version": "4.0.3",
@@ -12973,6 +13215,14 @@
       "resolved": "https://registry.npmmirror.com/loadjs/-/loadjs-4.2.0.tgz",
       "integrity": "sha512-AgQGZisAlTPbTEzrHPb6q+NYBMD+DP9uvGSIjSUM5uG+0jG15cb8axWpxuOIqrmQjn6scaaH8JwloiP27b2KXA=="
     },
+    "locate-path": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz",
+      "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+      "requires": {
+        "p-locate": "^4.1.0"
+      }
+    },
     "lodash": {
       "version": "4.17.21",
       "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz",
@@ -13568,6 +13818,22 @@
       "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==",
       "dev": true
     },
+    "p-limit": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz",
+      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+      "requires": {
+        "p-try": "^2.0.0"
+      }
+    },
+    "p-locate": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz",
+      "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+      "requires": {
+        "p-limit": "^2.2.0"
+      }
+    },
     "p-map": {
       "version": "4.0.0",
       "resolved": "https://registry.npmmirror.com/p-map/-/p-map-4.0.0.tgz",
@@ -13577,6 +13843,11 @@
         "aggregate-error": "^3.0.0"
       }
     },
+    "p-try": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz",
+      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
+    },
     "param-case": {
       "version": "3.0.4",
       "resolved": "https://registry.npmmirror.com/param-case/-/param-case-3.0.4.tgz",
@@ -13639,6 +13910,11 @@
         "tslib": "^2.0.3"
       }
     },
+    "path-exists": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz",
+      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
+    },
     "path-is-absolute": {
       "version": "1.0.1",
       "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
@@ -13730,6 +14006,11 @@
         "url-polyfill": "^1.1.12"
       }
     },
+    "pngjs": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmmirror.com/pngjs/-/pngjs-5.0.0.tgz",
+      "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw=="
+    },
     "postcss": {
       "version": "8.4.14",
       "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.14.tgz",
@@ -13929,6 +14210,17 @@
       "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
       "dev": true
     },
+    "qrcode": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmmirror.com/qrcode/-/qrcode-1.5.1.tgz",
+      "integrity": "sha512-nS8NJ1Z3md8uTjKtP+SGGhfqmTCs5flU/xR623oI0JX+Wepz9R8UrRVCTBTJm3qGw3rH6jJ6MUHjkDx15cxSSg==",
+      "requires": {
+        "dijkstrajs": "^1.0.1",
+        "encode-utf8": "^1.0.3",
+        "pngjs": "^5.0.0",
+        "yargs": "^15.3.1"
+      }
+    },
     "qrcode.vue": {
       "version": "3.3.3",
       "resolved": "https://registry.npmmirror.com/qrcode.vue/-/qrcode.vue-3.3.3.tgz",
@@ -14062,6 +14354,16 @@
       "integrity": "sha512-i/wKzvcx7Er8tZnvqSxWuNO5ZGggu2UgZAqj/RyZ0si7lBTXL7kZiI/dWxzxnQjaY7s5HEy1qK21Do4Ncr6cVw==",
       "dev": true
     },
+    "require-directory": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz",
+      "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="
+    },
+    "require-main-filename": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/require-main-filename/-/require-main-filename-2.0.0.tgz",
+      "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="
+    },
     "resize-detector": {
       "version": "0.3.0",
       "resolved": "https://registry.npmmirror.com/resize-detector/-/resize-detector-0.3.0.tgz",
@@ -14197,6 +14499,11 @@
         "upper-case-first": "^2.0.2"
       }
     },
+    "set-blocking": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/set-blocking/-/set-blocking-2.0.0.tgz",
+      "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="
+    },
     "shebang-command": {
       "version": "2.0.0",
       "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz",
@@ -14315,7 +14622,6 @@
       "version": "4.2.2",
       "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.2.tgz",
       "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
-      "dev": true,
       "requires": {
         "emoji-regex": "^8.0.0",
         "is-fullwidth-code-point": "^3.0.0",
@@ -14326,7 +14632,6 @@
       "version": "6.0.1",
       "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz",
       "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-      "dev": true,
       "requires": {
         "ansi-regex": "^5.0.1"
       }
@@ -14965,6 +15270,11 @@
         "isexe": "^2.0.0"
       }
     },
+    "which-module": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmmirror.com/which-module/-/which-module-2.0.0.tgz",
+      "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q=="
+    },
     "with": {
       "version": "7.0.2",
       "resolved": "https://registry.npmmirror.com/with/-/with-7.0.2.tgz",
@@ -15006,6 +15316,11 @@
       "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
       "dev": true
     },
+    "y18n": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmmirror.com/y18n/-/y18n-4.0.3.tgz",
+      "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ=="
+    },
     "yallist": {
       "version": "4.0.0",
       "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz",
@@ -15018,6 +15333,40 @@
       "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
       "dev": true
     },
+    "yargs": {
+      "version": "15.4.1",
+      "resolved": "https://registry.npmmirror.com/yargs/-/yargs-15.4.1.tgz",
+      "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
+      "requires": {
+        "cliui": "^6.0.0",
+        "decamelize": "^1.2.0",
+        "find-up": "^4.1.0",
+        "get-caller-file": "^2.0.1",
+        "require-directory": "^2.1.1",
+        "require-main-filename": "^2.0.0",
+        "set-blocking": "^2.0.0",
+        "string-width": "^4.2.0",
+        "which-module": "^2.0.0",
+        "y18n": "^4.0.0",
+        "yargs-parser": "^18.1.2"
+      }
+    },
+    "yargs-parser": {
+      "version": "18.1.3",
+      "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-18.1.3.tgz",
+      "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
+      "requires": {
+        "camelcase": "^5.0.0",
+        "decamelize": "^1.2.0"
+      },
+      "dependencies": {
+        "camelcase": {
+          "version": "5.3.1",
+          "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz",
+          "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
+        }
+      }
+    },
     "yorkie": {
       "version": "2.0.0",
       "resolved": "https://registry.npmmirror.com/yorkie/-/yorkie-2.0.0.tgz",

+ 1 - 0
package.json

@@ -35,6 +35,7 @@
     "normalize.css": "^8.0.1",
     "numeral": "^2.0.6",
     "plyr": "^3.6.12",
+    "qrcode": "^1.5.1",
     "qrcode.vue": "^3.3.3",
     "query-string": "^7.1.1",
     "umi-request": "^1.4.0",

+ 0 - 2
src/business-components/course-video-item/index.tsx

@@ -1,9 +1,7 @@
 import { defineComponent, PropType } from 'vue'
 import styles from './index.module.less'
 import { Cell, Icon, Image } from 'vant'
-
 import videoStop from '@common/images/icon_video_stop.png'
-
 import bars from '@common/svg/bars.svg'
 
 /**

+ 6 - 2
src/business-components/user-detail/index.module.less

@@ -66,14 +66,14 @@
     }
     :global {
       .van-cell {
-        padding: 14px;
+        padding: 12px 14px;
       }
       .van-cell__title {
         flex-basis: 60%;
       }
       .van-cell__title,
       .van-cell__value {
-        display: flex;
+        display: flex !important;
         align-items: center;
       }
 
@@ -81,6 +81,10 @@
         flex-basis: 40%;
         justify-content: flex-end;
       }
+
+      .van-cell__label {
+        margin-top: 0;
+      }
     }
   }
 }

+ 2 - 1
src/business-components/user-detail/index.tsx

@@ -70,7 +70,8 @@ export default defineComponent({
                     style={{
                       display: 'flex',
                       alignItems: 'center',
-                      fontSize: '13px'
+                      fontSize: '13px',
+                      paddingTop: 'var(--van-cell-label-margin-top)'
                     }}
                   >
                     <Icon

BIN
src/common/images/logo.png


+ 88 - 0
src/components/col-share/index.module.less

@@ -0,0 +1,88 @@
+.shareContainer {
+  width: 333px;
+}
+.shareSection {
+  width: 305px;
+  padding: 14px;
+  background: #2dc7aa;
+  background-size: cover;
+  overflow: hidden;
+  border-radius: 10px;
+
+  .img {
+    width: 54px;
+    height: 54px;
+    border-radius: 50%;
+    margin-right: 12px;
+  }
+
+  .name {
+    font-size: 18px;
+    font-weight: 500;
+    color: #1a1a1a;
+    line-height: 18px;
+  }
+
+  .titleTips {
+    padding-top: 5px;
+    font-size: 14px;
+    color: #8a8a8a;
+    line-height: 18px;
+  }
+}
+
+.section {
+  background: #ffffff;
+  border-radius: 11px;
+  overflow: hidden;
+  padding: 14px 16px 20px;
+}
+
+.txt {
+  font-size: 16px;
+  color: #333333;
+  line-height: 1.5;
+
+  span {
+    font-size: 18px;
+    font-weight: 500;
+    color: #2dc7aa;
+  }
+}
+
+.teacherName {
+  padding-top: 20px;
+}
+
+.download {
+  margin-top: 10px;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  .logo {
+    font-size: 13px;
+    color: #349784;
+    line-height: 18px;
+    img {
+      width: 93px;
+      vertical-align: middle;
+      margin-bottom: 11px;
+    }
+  }
+
+  .qrcode {
+    // background: #ccc;
+    width: 76px;
+    height: 76px;
+  }
+}
+
+.shareGroupBtn {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  padding-top: 12px;
+  :global(.van-button) {
+    padding: 12px 32px;
+  }
+}

+ 114 - 0
src/components/col-share/index.tsx

@@ -0,0 +1,114 @@
+import { Button, Cell, Swipe, SwipeItem, Toast } from 'vant'
+import { defineComponent } from 'vue'
+import styles from './index.module.less'
+import { postMessage, promisefiyPostMessage } from '@/helpers/native-message'
+import html2canvas from 'html2canvas'
+import ShareItem from './share-item'
+
+export default defineComponent({
+  name: 'col-share',
+  props: {
+    teacherId: {
+      type: Number
+    },
+    shareUrl: {
+      type: String,
+      default: ''
+    }
+  },
+  data() {
+    return {
+      qrCode: '',
+      image: null as any
+    }
+  },
+  mounted() {
+    this.$nextTick(async () => {
+      const container: any = document.getElementById('share-preview-container')
+      html2canvas(container, { allowTaint: true, useCORS: true }).then(
+        canvas => {
+          const url = canvas.toDataURL('image/png')
+          this.image = url
+        }
+      )
+    })
+  },
+  methods: {
+    async onSaveImg() {
+      const res = await promisefiyPostMessage({
+        api: 'savePicture',
+        content: {
+          base64: this.image
+        }
+      })
+      if (res?.content?.status === 'success') {
+        Toast.success('保存成功')
+      } else {
+        Toast.fail('保存失败')
+      }
+    },
+    async shareShow() {
+      const image = this.image
+      if (image) {
+        postMessage(
+          {
+            api: 'shareAchievements',
+            content: {
+              title: '我在酷乐秀使用小酷Ai练习乐器',
+              desc: '酷乐秀小酷Ai帮助我自主练习乐器,真的太好用啦!每天都要坚持练习哦~',
+              image,
+              video: '',
+              type: 'image'
+            }
+          },
+          (res: any) => {
+            if (res && res.content) {
+              Toast(
+                res.content.message ||
+                  (res.content.status ? '分享成功' : '分享失败')
+              )
+            }
+          }
+        )
+      }
+    }
+  },
+  render() {
+    return (
+      <>
+        <div class={styles.shareContainer}>
+          <Swipe
+            showIndicators={false}
+            loop={false}
+            style={{ borderRadius: '10px', overflow: 'hidden' }}
+          >
+            <SwipeItem>
+              <ShareItem teacherId={this.teacherId} shareUrl={this.shareUrl} />
+            </SwipeItem>
+            <SwipeItem>
+              <ShareItem teacherId={this.teacherId} shareUrl={this.shareUrl} />
+            </SwipeItem>
+            <SwipeItem>
+              <ShareItem teacherId={this.teacherId} shareUrl={this.shareUrl} />
+            </SwipeItem>
+          </Swipe>
+        </div>
+
+        <div class={['btnGroup', styles.shareGroupBtn]}>
+          <Button type="primary" round onClick={this.onSaveImg}>
+            保存图片
+          </Button>
+          <Button
+            type="primary"
+            round
+            onClick={() => {
+              this.shareShow()
+            }}
+          >
+            立即分享
+          </Button>
+        </div>
+      </>
+    )
+  }
+})

+ 77 - 0
src/components/col-share/share-item.tsx

@@ -0,0 +1,77 @@
+import { Cell } from 'vant'
+import { defineComponent } from 'vue'
+import styles from './index.module.less'
+
+import QrCodeVue from 'qrcode.vue'
+// import { toPng } from 'html-to-image'
+
+import iconTeacher from '@/common/images/icon_teacher.png'
+import logo from '@/common/images/logo.png'
+import { state } from '@/state'
+
+export default defineComponent({
+  name: 'share-item',
+  props: {
+    teacherId: {
+      type: Number
+    },
+    shareUrl: {
+      type: String,
+      default: ''
+    }
+  },
+  render() {
+    return (
+      <div
+        class={[styles.shareSection, styles.shareContainer]}
+        id="share-preview-container"
+      >
+        <div class={styles.section}>
+          <Cell
+            center
+            border={false}
+            style={{ padding: 0 }}
+            v-slots={{
+              icon: () => (
+                <img
+                  src={
+                    state.user.data.heardUrl
+                      ? state.user.data.heardUrl +
+                        '?time=' +
+                        new Date().valueOf()
+                      : iconTeacher
+                  }
+                  class={styles.img}
+                  crossorigin="anonymous"
+                />
+              ),
+              title: () => (
+                <div>
+                  <p class={styles.name}>{state.user.data.username}</p>
+                  <p class={styles.titleTips}>酷乐秀入驻老师</p>
+                </div>
+              )
+            }}
+          />
+          <p class={[styles.txt, styles.teacherName]}>
+            <span>{state.user.data.username}</span>邀请您加入酷乐秀
+          </p>
+          <p class={styles.txt}>来与我一起踏入音乐殿堂吧!</p>
+        </div>
+
+        <div class={[styles.section, styles.download]}>
+          <div class={styles.logo}>
+            <img src={logo} />
+            <p>扫码下载酷乐秀开启教学之旅</p>
+          </div>
+          <div class={styles.qrcode}>
+            <QrCodeVue
+              value={this.shareUrl}
+              style={{ width: '100%', height: '100%' }}
+            />
+          </div>
+        </div>
+      </div>
+    )
+  }
+})

+ 0 - 0
src/components/col-sticky/index.module.less


+ 43 - 0
src/components/col-sticky/index.tsx

@@ -0,0 +1,43 @@
+import { useRect } from '@vant/use'
+import { defineComponent } from 'vue'
+
+export default defineComponent({
+  name: 'col-sticky',
+  props: {
+    position: {
+      type: String,
+      default: 'top' as 'top' | 'bottom'
+    }
+  },
+  data() {
+    return {
+      divStyle: {} as any,
+      sectionStyle: {
+        width: '100%',
+        height: 'auto'
+      }
+    }
+  },
+  mounted() {
+    if (this.position === 'top') {
+      this.divStyle.top = '0px'
+    } else {
+      this.divStyle.bottom = '0px'
+    }
+    const { height } = useRect((this as any).$refs.div)
+    this.sectionStyle.height = `${height}px`
+  },
+  render() {
+    return (
+      <div style={this.sectionStyle}>
+        <div
+          ref="div"
+          class="van-sticky van-sticky--fixed"
+          style={[this.divStyle, this.sectionStyle]}
+        >
+          {this.$slots.default && this.$slots.default()}
+        </div>
+      </div>
+    )
+  }
+})

+ 13 - 0
src/router/routes-teacher.ts

@@ -5,6 +5,18 @@ type metaType = {
   isRegister: boolean
 }
 
+// 不需要登录的路由
+const noLoginRouter = [
+  {
+    path: '/shareVideo',
+    name: 'shareVideo',
+    component: () => import('@/teacher/share-page/share-video/index'),
+    meta: {
+      title: '分享视频课'
+    }
+  }
+]
+
 export default [
   {
     path: '/',
@@ -215,6 +227,7 @@ export default [
     ]
   },
   ...rootRouter,
+  ...noLoginRouter,
   {
     path: '/:pathMatch(.*)*',
     component: () => import('@/views/404'),

+ 1 - 1
src/student/teacher-dependent/components/single.tsx

@@ -121,7 +121,7 @@ export default defineComponent({
                   {/* <video width="100%" class={styles.video}>
                     <source src={item.videoUrl} type="video/mp4" />
                   </video> */}
-                  <Image src={iconUploadPoster} fit="cover" />
+                  <Image src={item.cover || iconUploadPoster} fit="cover" />
                 </div>
               ))}
             </div>

+ 3 - 0
src/student/teacher-dependent/teacher-elegant.module.less

@@ -59,6 +59,9 @@
     vertical-align: middle;
     overflow: hidden;
     position: relative;
+    display: flex;
+    align-items: center;
+    justify-content: center;
   }
 
   .teSection {

+ 2 - 9
src/student/teacher-dependent/teacher-elegant.tsx

@@ -9,6 +9,7 @@ import OrganSearch from '../practice-class/model/organ-search'
 import styles from './teacher-elegant.module.less'
 
 import iconTeacher from '@common/images/icon_teacher.png'
+import iconUploadPoster from '@common/images/icon_upload_poster.png'
 import bars from '@common/svg/bars.svg'
 import { useRect } from '@vant/use'
 
@@ -199,16 +200,8 @@ export default defineComponent({
                     this.onDetail(item)
                   }}
                 ></div>
-                {/* <Image class={styles.teCover} fit="cover" src={item.videoUrl} /> */}
                 <div class={styles.teCover}>
-                  <video width="100%" class={styles.video} preload="metadata">
-                    <source src={item.videoUrl + '#t=1,3'} type="video/mp4" />
-                  </video>
-                  {/* <video
-                    src={item.videoUrl + '#t=1'}
-                    width="100%"
-                    class={styles.video}
-                  ></video> */}
+                  <Image src={item.cover || iconUploadPoster} fit="cover" />
                   {item.living === 1 && (
                     <div class={styles.living}>
                       <Image src={bars} class={styles.animation} />

+ 2 - 2
src/student/video-class/video-class-detail.tsx

@@ -59,7 +59,7 @@ export default defineComponent({
       return state.user.data
     },
     offsetTop() {
-      let navHeight: number = this.navHeight
+      const navHeight: number = this.navHeight
       const top = Number(navHeight) + 44
       return top + 'px'
     }
@@ -95,7 +95,7 @@ export default defineComponent({
       })
       this.reload = false
 
-      let config = await request.get(
+      const config = await request.get(
         '/api-student/sysConfig/queryByParamNameList',
         {
           params: {

+ 0 - 177
src/teacher/income-consus/echarts.ts

@@ -266,180 +266,3 @@ export const pieChartOption = {
     '#FF3C3C'
   ]
 }
-
-// {
-//   status: true,
-//   data: {
-//     totalInAmount: 22.539999999999999,
-//     videoAmount: 0,
-//     practiceRate: 0.17999999999999999,
-//     musicAmount: 0,
-//     liveRate: 99.819999999999993,
-//     videoRate: 0,
-//     infoList: [
-//       {
-//         totalInAmount: 0,
-//         videoAmount: 0,
-//         practiceRate: 0,
-//         musicAmount: 0,
-//         liveRate: 0,
-//         videoRate: 0,
-//         infoList: null,
-//         timeStr: '2022-01',
-//         practiceAmount: 0,
-//         liveAmount: 0,
-//         musicRate: 0
-//       },
-//       {
-//         totalInAmount: 0,
-//         videoAmount: 0,
-//         practiceRate: 0,
-//         musicAmount: 0,
-//         liveRate: 0,
-//         videoRate: 0,
-//         infoList: null,
-//         timeStr: '2022-02',
-//         practiceAmount: 0,
-//         liveAmount: 0,
-//         musicRate: 0
-//       },
-//       {
-//         totalInAmount: 0,
-//         videoAmount: 0,
-//         practiceRate: 0,
-//         musicAmount: 0,
-//         liveRate: 0,
-//         videoRate: 0,
-//         infoList: null,
-//         timeStr: '2022-03',
-//         practiceAmount: 0,
-//         liveAmount: 0,
-//         musicRate: 0
-//       },
-//       {
-//         totalInAmount: 0,
-//         videoAmount: 0,
-//         practiceRate: 0,
-//         musicAmount: 0,
-//         liveRate: 0,
-//         videoRate: 0,
-//         infoList: null,
-//         timeStr: '2022-04',
-//         practiceAmount: 0,
-//         liveAmount: 0,
-//         musicRate: 0
-//       },
-//       {
-//         totalInAmount: 0,
-//         videoAmount: 0,
-//         practiceRate: 0,
-//         musicAmount: 0,
-//         liveRate: 0,
-//         videoRate: 0,
-//         infoList: null,
-//         timeStr: '2022-05',
-//         practiceAmount: 0,
-//         liveAmount: 0,
-//         musicRate: 0
-//       },
-//       {
-//         totalInAmount: 0,
-//         videoAmount: 0,
-//         practiceRate: 0,
-//         musicAmount: 0,
-//         liveRate: 0,
-//         videoRate: 0,
-//         infoList: null,
-//         timeStr: '2022-06',
-//         practiceAmount: 0,
-//         liveAmount: 0,
-//         musicRate: 0
-//       },
-//       {
-//         totalInAmount: 0,
-//         videoAmount: 0,
-//         practiceRate: 0,
-//         musicAmount: 0,
-//         liveRate: 0,
-//         videoRate: 0,
-//         infoList: null,
-//         timeStr: '2022-07',
-//         practiceAmount: 0.040000000000000001,
-//         liveAmount: 22.5,
-//         musicRate: 0
-//       },
-//       {
-//         totalInAmount: 0,
-//         videoAmount: 0,
-//         practiceRate: 0,
-//         musicAmount: 0,
-//         liveRate: 0,
-//         videoRate: 0,
-//         infoList: null,
-//         timeStr: '2022-08',
-//         practiceAmount: 0,
-//         liveAmount: 0,
-//         musicRate: 0
-//       },
-//       {
-//         totalInAmount: 0,
-//         videoAmount: 0,
-//         practiceRate: 0,
-//         musicAmount: 0,
-//         liveRate: 0,
-//         videoRate: 0,
-//         infoList: null,
-//         timeStr: '2022-09',
-//         practiceAmount: 0,
-//         liveAmount: 0,
-//         musicRate: 0
-//       },
-//       {
-//         totalInAmount: 0,
-//         videoAmount: 0,
-//         practiceRate: 0,
-//         musicAmount: 0,
-//         liveRate: 0,
-//         videoRate: 0,
-//         infoList: null,
-//         timeStr: '2022-10',
-//         practiceAmount: 0,
-//         liveAmount: 0,
-//         musicRate: 0
-//       },
-//       {
-//         totalInAmount: 0,
-//         videoAmount: 0,
-//         practiceRate: 0,
-//         musicAmount: 0,
-//         liveRate: 0,
-//         videoRate: 0,
-//         infoList: null,
-//         timeStr: '2022-11',
-//         practiceAmount: 0,
-//         liveAmount: 0,
-//         musicRate: 0
-//       },
-//       {
-//         totalInAmount: 0,
-//         videoAmount: 0,
-//         practiceRate: 0,
-//         musicAmount: 0,
-//         liveRate: 0,
-//         videoRate: 0,
-//         infoList: null,
-//         timeStr: '2022-12',
-//         practiceAmount: 0,
-//         liveAmount: 0,
-//         musicRate: 0
-//       }
-//     ],
-//     timeStr: '',
-//     practiceAmount: 0.040000000000000001,
-//     liveAmount: 22.5,
-//     musicRate: 0
-//   },
-//   code: 200,
-//   msg: '',
-//   nowTime: '2022-07-21 09:50:07'
-// }

+ 1 - 1
src/teacher/income-consus/index.module.less

@@ -223,7 +223,7 @@
     display: inline-block;
     padding-left: 9px;
     margin-right: 10px;
-    min-width: 70px;
+    min-width: 60px;
     color: #1a1a1a;
     border-right: 1px solid #808080;
   }

+ 47 - 19
src/teacher/live-class/live-detail.tsx

@@ -3,11 +3,12 @@ import SectionDetail from '@/business-components/section-detail'
 import UserDetail from '@/business-components/user-detail'
 import UserList from '@/business-components/user-list'
 import ColResult from '@/components/col-result'
+import ColShare from '@/components/col-share'
+import ColSticky from '@/components/col-sticky'
 import { postMessage } from '@/helpers/native-message'
 import request from '@/helpers/request'
-import { state } from '@/state'
 import dayjs from 'dayjs'
-import { Button, Sticky, Tab, Tabs, Toast } from 'vant'
+import { Button, Popup, Sticky, Tab, Tabs, Toast } from 'vant'
 import { defineComponent } from 'vue'
 import styles from './live-detail.module.less'
 interface IProps {
@@ -23,10 +24,12 @@ export default defineComponent({
   data() {
     const query = this.$route.query
     return {
+      share: query.share,
       joinRoom: query.joinRoom, // 原生传递过来的参数,判断是否进入直播间
       groupId: query.groupId,
       courseId: query.classId,
-      live: {} as any
+      live: {} as any,
+      shareStatus: false
     }
   },
   computed: {
@@ -36,9 +39,9 @@ export default defineComponent({
       const startTime = planList[0]?.startTime || new Date()
       const endTime = planList[0]?.endTime || new Date()
       return {
-        headUrl: state.user.data?.heardUrl,
-        username:
-          state.user.data?.username || `游客${state.user.data?.userId || ''}`,
+        headUrl: live.avatar,
+        username: live.userName,
+        id: live.teacherId,
         startTime:
           `${dayjs(startTime).format('YYYY-MM-DD')} ${dayjs(startTime).format(
             'HH:mm'
@@ -155,23 +158,24 @@ export default defineComponent({
             Toast('课程尚未开始,请耐心等候')
           }, 100)
         }
-      } catch {}
+      } catch {
+        //
+      }
     },
     async cancelCourseGroup() {
       try {
-        const res = await request.get(
-          '/api-teacher/courseGroup/cancelCourseGroup',
-          {
-            params: {
-              groupId: this.groupId
-            }
+        await request.get('/api-teacher/courseGroup/cancelCourseGroup', {
+          params: {
+            groupId: this.groupId
           }
-        )
+        })
         Toast('下架成功')
         setTimeout(() => {
           postMessage({ api: 'back', content: {} })
         }, 500)
-      } catch {}
+      } catch {
+        //
+      }
     }
   },
   render() {
@@ -219,7 +223,7 @@ export default defineComponent({
         </SectionDetail>
 
         {this.courseOffStatus && (
-          <Sticky offsetBottom={0} position="bottom">
+          <ColSticky position="bottom">
             <div class={['btnGroup']} style={{ paddingTop: '12px' }}>
               <Button
                 block
@@ -230,18 +234,42 @@ export default defineComponent({
                 下架
               </Button>
             </div>
-          </Sticky>
+          </ColSticky>
         )}
 
         {this.joinRoom == '1' && this.liveStatus.liveStatus !== 2 && (
-          <Sticky offsetBottom={0} position="bottom">
+          <ColSticky position="bottom">
             <div class={['btnGroup']} style={{ paddingTop: '12px' }}>
               <Button block round type="primary" onClick={this.onJoinRoom}>
                 进入直播间
               </Button>
             </div>
-          </Sticky>
+          </ColSticky>
         )}
+
+        {this.share == '1' && this.courseInfo.length > 0 && (
+          <ColSticky position="bottom">
+            <div class={['btnGroup']} style={{ paddingTop: '12px' }}>
+              <Button
+                block
+                round
+                type="primary"
+                onClick={() => {
+                  this.shareStatus = true
+                }}
+              >
+                分享
+              </Button>
+            </div>
+          </ColSticky>
+        )}
+
+        <Popup
+          v-model:show={this.shareStatus}
+          style={{ background: 'transparent' }}
+        >
+          <ColShare teacherId={this.userInfo.id} />
+        </Popup>
       </div>
     )
   }

+ 13 - 0
src/teacher/share-page/share-video/index.module.less

@@ -0,0 +1,13 @@
+.video-detail {
+  .introduction {
+    color: #7a7a7a;
+    line-height: 23px;
+    padding-bottom: 8px;
+  }
+
+  :global {
+    .van-tabs__wrap {
+      margin-bottom: 15px;
+    }
+  }
+}

+ 130 - 0
src/teacher/share-page/share-video/index.tsx

@@ -0,0 +1,130 @@
+import CourseVideoItem from '@/business-components/course-video-item'
+import SectionDetail from '@/business-components/section-detail'
+import UserDetail from '@/business-components/user-detail'
+import UserList from '@/business-components/user-list'
+import { Button, List, Tab, Tabs } from 'vant'
+import { defineComponent } from 'vue'
+import styles from './index.module.less'
+import request from '@/helpers/request'
+import ColResult from '@/components/col-result'
+import ColSticky from '@/components/col-sticky'
+export default defineComponent({
+  name: 'VideoDetail',
+  data() {
+    const query = this.$route.query
+    return {
+      userInfo: {} as any,
+      detailList: [],
+      buyUserList: [], // 购买学生数
+      dataShow: true, // 判断是否有数据
+      loading: false,
+      finished: false,
+      recomUserId: query.recomUserId, // 分享人编号
+      params: {
+        videoLessonGroupId: query.groupId,
+        page: 1,
+        rows: 20
+      }
+    }
+  },
+  async mounted() {
+    try {
+      const res = await request.post(`/api-teacher//open/videoShareProfit`, {
+        data: {
+          bizId: this.params.videoLessonGroupId,
+          userId: this.recomUserId
+        }
+      })
+      const result = res.data || {}
+      console.log(result)
+      const { lessonGroup, detailList } = result.videoGroup
+      this.userInfo = {
+        username: result.name,
+        headUrl: result.avatar,
+        buyNum: lessonGroup.countStudent,
+        lessonNum: lessonGroup.lessonCount,
+        lessonName: lessonGroup.lessonName,
+        lessonDesc: lessonGroup.lessonDesc,
+        lessonPrice: lessonGroup.lessonPrice,
+        lessonCoverUrl: lessonGroup.lessonCoverUrl
+      }
+
+      this.detailList = detailList || []
+
+      this.getList()
+    } catch {
+      //
+    }
+  },
+  methods: {
+    async getList() {
+      try {
+        const params = this.params
+        const res = await request.post('/api-teacher/videoLesson/pageStudent', {
+          data: {
+            ...params
+          }
+        })
+        this.loading = false
+        const result = res.data || {}
+        // 处理重复请求数据
+        if (this.buyUserList.length > 0 && result.pageNo === 1) {
+          return
+        }
+        this.buyUserList = this.buyUserList.concat(result.rows || [])
+        this.finished = result.pageNo >= result.totalPage
+        this.params.page = result.pageNo + 1
+        this.dataShow = this.buyUserList.length > 0
+      } catch {
+        this.dataShow = false
+        this.finished = true
+      }
+    },
+    onPlay(detail: any) {
+      this.$router.push({
+        path: '/videoClassDetail',
+        query: {
+          groupId: this.params.videoLessonGroupId,
+          classId: detail.id
+        }
+      })
+    }
+  },
+  render() {
+    return (
+      <div class={[styles['video-detail'], 'mb12']}>
+        <UserDetail userInfo={this.userInfo} />
+        <SectionDetail border>
+          <p class={styles.introduction}>{this.userInfo.lessonDesc}</p>
+        </SectionDetail>
+
+        <SectionDetail
+          title="课程列表"
+          icon="courseList"
+          contentStyle={{ paddingTop: '0' }}
+        >
+          {this.detailList.map((item: any) => (
+            <CourseVideoItem
+              class={'mb12'}
+              detail={{
+                id: item.id,
+                title: item.videoTitle,
+                content: item.videoContent,
+                imgUrl: item.coverUrl
+              }}
+              onPlay={this.onPlay}
+            />
+          ))}
+        </SectionDetail>
+
+        <ColSticky position="bottom">
+          <div class={['btnGroup']} style={{ paddingTop: '12px' }}>
+            <Button block round type="primary">
+              下载酷乐秀进入课程
+            </Button>
+          </div>
+        </ColSticky>
+      </div>
+    )
+  }
+})

+ 29 - 44
src/teacher/video-class/video-class-detail.tsx

@@ -48,7 +48,10 @@ export default defineComponent({
       params: {
         page: 1,
         rows: 20
-      }
+      },
+      freeRate: 0, // 试看百分比
+      trySee: false, // 是否试看
+      videoHeight: '212px'
     }
   },
   computed: {
@@ -56,7 +59,7 @@ export default defineComponent({
       return state.user.data
     },
     offsetTop() {
-      let navHeight: number = this.navHeight
+      const navHeight: number = this.navHeight
       const top = Number(navHeight) + 44
       return top + 'px'
     }
@@ -75,6 +78,11 @@ export default defineComponent({
       const result = res.data || {}
       this.title = result.lessonGroup.lessonName
       this.detailList = result.detailList || []
+
+      if (state.user.data?.userId !== result.lessonGroup.teacherId) {
+        this.trySee = !result.alreadyBuy
+      }
+
       this.detailList.forEach((item: any, index: number) => {
         if (item.id === Number(this.classId)) {
           this.posterUrl = item.coverUrl
@@ -84,6 +92,17 @@ export default defineComponent({
           this.videoContent = item.videoContent
         }
       })
+
+      const config = await request.get(
+        '/api-student/sysConfig/queryByParamNameList',
+        {
+          params: {
+            paramNames: 'video_lesson_free_rate'
+          }
+        }
+      )
+      this.freeRate = config.data[0]?.paramValue || 0
+
       this.getList()
     } catch {}
   },
@@ -98,7 +117,7 @@ export default defineComponent({
     },
     async getList() {
       try {
-        let params = this.params
+        const params = this.params
         const res = await request.post('/api-student/videoLesson/page', {
           data: {
             ...params,
@@ -162,7 +181,13 @@ export default defineComponent({
         <ColHeader
           v-slots={{
             default: () => (
-              <ColVideo src={this.srcUrl} poster={this.posterUrl} />
+              <ColVideo
+                src={this.srcUrl}
+                poster={this.posterUrl}
+                freeRate={Number(this.freeRate)}
+                trySee={this.trySee}
+                height={this.videoHeight}
+              />
             )
           }}
         />
@@ -219,47 +244,9 @@ export default defineComponent({
               </SectionDetail>
             </div>
           </Tab>
-          {/* <Tab title="简介" name={2}>
-            <Cell
-              class={styles['open-teacher-info']}
-              border={false}
-              v-slots={{
-                icon: () => (
-                  <Image
-                    class={styles.userLogo}
-                    src={this.users?.headUrl || iconStudent}
-                    fit="cover"
-                  />
-                )
-              }}
-            >
-              <div class={styles['teacher-info']}>
-                <div class={styles['users']}>
-                  <div class={styles['teacher-name']}>
-                    {this.users?.username}
-                  </div>
-                  <Rate
-                    modelValue={this.users?.starGrade}
-                    iconPrefix="iconfont"
-                    color="#FFC459"
-                    void-icon="star_default"
-                    icon="star_active"
-                    size={15}
-                  />
-                </div>
-                <div class={styles.level}>粉丝{this.users?.fansNum}</div>
-              </div>
-              <div class={styles['teacher-desc']}>
-              </div>
-            </Cell>
-            <SectionDetail>
-              <p class={styles.introduction}>课程介绍</p>
-            </SectionDetail>
-          </Tab> */}
           <Tab title="讨论" name={3}>
             <div
               style={{
-                // height: 'calc(100vh - 365px)',
                 overflowY: 'auto',
                 marginBottom:
                   'calc(var(--van-cell-vertical-padding) * 2 + var( --van-cell-line-height))'
@@ -312,7 +299,6 @@ export default defineComponent({
               )}
             </div>
 
-            {/* <Sticky offsetBottom={0} position="bottom"> */}
             <div class={styles.messageContainer}>
               <Field
                 placeholder="快来讨论吧~"
@@ -333,7 +319,6 @@ export default defineComponent({
                 }}
               />
             </div>
-            {/* </Sticky> */}
           </Tab>
         </Tabs>
       </div>

+ 49 - 11
src/teacher/video-class/video-detail.tsx

@@ -2,12 +2,13 @@ import CourseVideoItem from '@/business-components/course-video-item'
 import SectionDetail from '@/business-components/section-detail'
 import UserDetail from '@/business-components/user-detail'
 import UserList from '@/business-components/user-list'
-import { List, Tab, Tabs } from 'vant'
+import { Button, List, Popup, Sticky, Tab, Tabs, Toast } from 'vant'
 import { defineComponent } from 'vue'
-import { state } from '@/state'
 import styles from './video-detail.module.less'
 import request from '@/helpers/request'
 import ColResult from '@/components/col-result'
+import ColShare from '@/components/col-share'
+import ColSticky from '@/components/col-sticky'
 export default defineComponent({
   name: 'VideoDetail',
   data() {
@@ -19,11 +20,14 @@ export default defineComponent({
       dataShow: true, // 判断是否有数据
       loading: false,
       finished: false,
+      share: query.share,
       params: {
         videoLessonGroupId: query.groupId,
         page: 1,
         rows: 20
-      }
+      },
+      shareStatus: false,
+      shareUrl: ''
     }
   },
   async mounted() {
@@ -37,10 +41,10 @@ export default defineComponent({
         }
       )
       const result = res.data || {}
-      const users = state.user.data || {}
       this.userInfo = {
-        username: users.username || `游客${users.id || ''}`,
-        headUrl: users.heardUrl,
+        id: result.lessonGroup.teacherId,
+        username: result.lessonGroup.username,
+        headUrl: result.lessonGroup.avatar,
         buyNum: result.lessonGroup.countStudent,
         lessonNum: result.lessonGroup.lessonCount,
         lessonName: result.lessonGroup.lessonName,
@@ -48,16 +52,26 @@ export default defineComponent({
         lessonPrice: result.lessonGroup.lessonPrice,
         lessonCoverUrl: result.lessonGroup.lessonCoverUrl
       }
-
       this.detailList = result.detailList || []
 
+      // shareVideo?recomUserId=56&groupId=124
+      const shortRes = await request.post('/api-teacher/sysConfig/shortURL', {
+        requestType: 'form',
+        data: {
+          orginURL: `${location.origin}/teacher/#/shareVideo?recomUserId=${this.userInfo.id}&groupId=${this.params.videoLessonGroupId}`
+        }
+      })
+      this.shareUrl = shortRes.data
+
       this.getList()
-    } catch {}
+    } catch (e) {
+      console.log(e)
+    }
   },
   methods: {
     async getList() {
       try {
-        let params = this.params
+        const params = this.params
         const res = await request.post('/api-teacher/videoLesson/pageStudent', {
           data: {
             ...params
@@ -91,8 +105,8 @@ export default defineComponent({
   render() {
     return (
       <div class={[styles['video-detail'], 'mb12']}>
-        <UserDetail userInfo={this.userInfo} />
-        <SectionDetail>
+        {this.userInfo.id && <UserDetail userInfo={this.userInfo} />}
+        <SectionDetail border>
           <p class={styles.introduction}>{this.userInfo.lessonDesc}</p>
         </SectionDetail>
 
@@ -147,6 +161,30 @@ export default defineComponent({
             </Tab>
           </Tabs>
         </SectionDetail>
+
+        {this.share == '1' && this.detailList.length > 0 && (
+          <ColSticky position="bottom">
+            <div class={['btnGroup']} style={{ paddingTop: '12px' }}>
+              <Button
+                block
+                round
+                type="primary"
+                onClick={() => {
+                  this.shareStatus = true
+                }}
+              >
+                分享
+              </Button>
+            </div>
+          </ColSticky>
+        )}
+
+        <Popup
+          v-model:show={this.shareStatus}
+          style={{ background: 'transparent' }}
+        >
+          <ColShare teacherId={this.userInfo.id} shareUrl={this.shareUrl} />
+        </Popup>
       </div>
     )
   }

+ 8 - 3
src/views/live-class/index.tsx

@@ -111,11 +111,16 @@ export default defineComponent({
     onDetail(item: any) {
       this.params.subjectId &&
         sessionStorage.setItem('liveClassSubjectId', this.params.subjectId)
+      const params: any = {
+        groupId: item.courseGroupId
+      }
+      // 判断是否是老师端,如果是,则添加分享按钮
+      if (state.platformType === 'TEACHER') {
+        params.share = 1
+      }
       this.$router.push({
         path: '/liveDetail',
-        query: {
-          groupId: item.courseGroupId
-        }
+        query: params
       })
     }
   },

+ 8 - 3
src/views/video-class/index.tsx

@@ -108,11 +108,16 @@ export default defineComponent({
       this.onSort()
     },
     onDetail(item: any) {
+      const params: any = {
+        groupId: item.id
+      }
+      // 判断是否是老师端,如果是,则添加分享按钮
+      if (state.platformType === 'TEACHER') {
+        params.share = 1
+      }
       this.$router.push({
         path: '/videoDetail',
-        query: {
-          groupId: item.id
-        }
+        query: params
       })
     }
   },

+ 138 - 0
yarn.lock

@@ -1705,6 +1705,11 @@
     "pascal-case" "^3.1.2"
     "tslib" "^2.0.3"
 
+"camelcase@^5.0.0":
+  "integrity" "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
+  "resolved" "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz"
+  "version" "5.3.1"
+
 "camelcase@^6.0.0":
   "integrity" "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA=="
   "resolved" "https://registry.npmmirror.com/camelcase/-/camelcase-6.3.0.tgz"
@@ -1846,6 +1851,15 @@
   "resolved" "https://registry.npmmirror.com/cli-width/-/cli-width-3.0.0.tgz"
   "version" "3.0.0"
 
+"cliui@^6.0.0":
+  "integrity" "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ=="
+  "resolved" "https://registry.npmmirror.com/cliui/-/cliui-6.0.0.tgz"
+  "version" "6.0.0"
+  dependencies:
+    "string-width" "^4.2.0"
+    "strip-ansi" "^6.0.0"
+    "wrap-ansi" "^6.2.0"
+
 "clone@^1.0.2":
   "integrity" "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg=="
   "resolved" "https://registry.npmmirror.com/clone/-/clone-1.0.4.tgz"
@@ -1987,6 +2001,11 @@
   dependencies:
     "ms" "2.1.2"
 
+"decamelize@^1.2.0":
+  "integrity" "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA=="
+  "resolved" "https://registry.npmmirror.com/decamelize/-/decamelize-1.2.0.tgz"
+  "version" "1.2.0"
+
 "decode-uri-component@^0.2.0":
   "integrity" "sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og=="
   "resolved" "https://registry.npmmirror.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz"
@@ -2030,6 +2049,11 @@
   "resolved" "https://registry.npmmirror.com/detect-file/-/detect-file-1.0.0.tgz"
   "version" "1.0.0"
 
+"dijkstrajs@^1.0.1":
+  "integrity" "sha512-QV6PMaHTCNmKSeP6QoXhVTw9snc9VD8MulTT0Bd99Pacp4SS1cjcrYPgBPmibqKVtMJJfqC6XvOXgPMEEPH/fg=="
+  "resolved" "https://registry.npmmirror.com/dijkstrajs/-/dijkstrajs-1.0.2.tgz"
+  "version" "1.0.2"
+
 "dir-glob@^3.0.1":
   "integrity" "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA=="
   "resolved" "https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz"
@@ -2121,6 +2145,11 @@
   "resolved" "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-9.2.2.tgz"
   "version" "9.2.2"
 
+"encode-utf8@^1.0.3":
+  "integrity" "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw=="
+  "resolved" "https://registry.npmmirror.com/encode-utf8/-/encode-utf8-1.0.3.tgz"
+  "version" "1.0.3"
+
 "encoding@^0.1.11":
   "integrity" "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A=="
   "resolved" "https://registry.npmmirror.com/encoding/-/encoding-0.1.13.tgz"
@@ -2464,6 +2493,14 @@
   "resolved" "https://registry.npmmirror.com/filter-obj/-/filter-obj-1.1.0.tgz"
   "version" "1.1.0"
 
+"find-up@^4.1.0":
+  "integrity" "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="
+  "resolved" "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz"
+  "version" "4.1.0"
+  dependencies:
+    "locate-path" "^5.0.0"
+    "path-exists" "^4.0.0"
+
 "findup-sync@^5.0.0":
   "integrity" "sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ=="
   "resolved" "https://registry.npmmirror.com/findup-sync/-/findup-sync-5.0.0.tgz"
@@ -2552,6 +2589,11 @@
   "resolved" "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz"
   "version" "1.0.0-beta.2"
 
+"get-caller-file@^2.0.1":
+  "integrity" "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
+  "resolved" "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz"
+  "version" "2.0.5"
+
 "get-intrinsic@^1.0.2":
   "integrity" "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q=="
   "resolved" "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz"
@@ -3196,6 +3238,13 @@
   "resolved" "https://registry.npmmirror.com/loadjs/-/loadjs-4.2.0.tgz"
   "version" "4.2.0"
 
+"locate-path@^5.0.0":
+  "integrity" "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="
+  "resolved" "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz"
+  "version" "5.0.0"
+  dependencies:
+    "p-locate" "^4.1.0"
+
 "lodash.debounce@^4.0.8":
   "integrity" "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="
   "resolved" "https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz"
@@ -3586,6 +3635,20 @@
   "resolved" "https://registry.npmmirror.com/p-finally/-/p-finally-1.0.0.tgz"
   "version" "1.0.0"
 
+"p-limit@^2.2.0":
+  "integrity" "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="
+  "resolved" "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz"
+  "version" "2.3.0"
+  dependencies:
+    "p-try" "^2.0.0"
+
+"p-locate@^4.1.0":
+  "integrity" "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="
+  "resolved" "https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz"
+  "version" "4.1.0"
+  dependencies:
+    "p-limit" "^2.2.0"
+
 "p-map@^4.0.0":
   "integrity" "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ=="
   "resolved" "https://registry.npmmirror.com/p-map/-/p-map-4.0.0.tgz"
@@ -3593,6 +3656,11 @@
   dependencies:
     "aggregate-error" "^3.0.0"
 
+"p-try@^2.0.0":
+  "integrity" "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
+  "resolved" "https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz"
+  "version" "2.2.0"
+
 "param-case@^3.0.4":
   "integrity" "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A=="
   "resolved" "https://registry.npmmirror.com/param-case/-/param-case-3.0.4.tgz"
@@ -3643,6 +3711,11 @@
     "dot-case" "^3.0.4"
     "tslib" "^2.0.3"
 
+"path-exists@^4.0.0":
+  "integrity" "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
+  "resolved" "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz"
+  "version" "4.0.0"
+
 "path-is-absolute@^1.0.0":
   "integrity" "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="
   "resolved" "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz"
@@ -3718,6 +3791,11 @@
     "rangetouch" "^2.0.1"
     "url-polyfill" "^1.1.12"
 
+"pngjs@^5.0.0":
+  "integrity" "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw=="
+  "resolved" "https://registry.npmmirror.com/pngjs/-/pngjs-5.0.0.tgz"
+  "version" "5.0.0"
+
 "postcss-pxtorem@^6.0.0":
   "integrity" "sha512-ZRXrD7MLLjLk2RNGV6UA4f5Y7gy+a/j1EqjAfp9NdcNYVjUMvg5HTYduTjSkKBkRkfqbg/iKrjMO70V4g1LZeg=="
   "resolved" "https://registry.npmmirror.com/postcss-pxtorem/-/postcss-pxtorem-6.0.0.tgz"
@@ -3887,6 +3965,16 @@
   "resolved" "https://registry.npmmirror.com/qrcode.vue/-/qrcode.vue-3.3.3.tgz"
   "version" "3.3.3"
 
+"qrcode@^1.5.1":
+  "integrity" "sha512-nS8NJ1Z3md8uTjKtP+SGGhfqmTCs5flU/xR623oI0JX+Wepz9R8UrRVCTBTJm3qGw3rH6jJ6MUHjkDx15cxSSg=="
+  "resolved" "https://registry.npmmirror.com/qrcode/-/qrcode-1.5.1.tgz"
+  "version" "1.5.1"
+  dependencies:
+    "dijkstrajs" "^1.0.1"
+    "encode-utf8" "^1.0.3"
+    "pngjs" "^5.0.0"
+    "yargs" "^15.3.1"
+
 "qs@^6.9.1":
   "integrity" "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ=="
   "resolved" "https://registry.npmmirror.com/qs/-/qs-6.10.3.tgz"
@@ -3993,6 +4081,16 @@
   "resolved" "https://registry.npmmirror.com/request-light/-/request-light-0.5.7.tgz"
   "version" "0.5.7"
 
+"require-directory@^2.1.1":
+  "integrity" "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="
+  "resolved" "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz"
+  "version" "2.1.1"
+
+"require-main-filename@^2.0.0":
+  "integrity" "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="
+  "resolved" "https://registry.npmmirror.com/require-main-filename/-/require-main-filename-2.0.0.tgz"
+  "version" "2.0.0"
+
 "resize-detector@^0.3.0":
   "integrity" "sha512-R/tCuvuOHQ8o2boRP6vgx8hXCCy87H1eY9V5imBYeVNyNVpuL9ciReSccLj2gDcax9+2weXy3bc8Vv+NRXeEvQ=="
   "resolved" "https://registry.npmmirror.com/resize-detector/-/resize-detector-0.3.0.tgz"
@@ -4142,6 +4240,11 @@
     "tslib" "^2.0.3"
     "upper-case-first" "^2.0.2"
 
+"set-blocking@^2.0.0":
+  "integrity" "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="
+  "resolved" "https://registry.npmmirror.com/set-blocking/-/set-blocking-2.0.0.tgz"
+  "version" "2.0.0"
+
 "shebang-command@^1.2.0":
   "integrity" "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg=="
   "resolved" "https://registry.npmmirror.com/shebang-command/-/shebang-command-1.2.0.tgz"
@@ -4817,6 +4920,11 @@
   "resolved" "https://registry.npmmirror.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz"
   "version" "3.6.2"
 
+"which-module@^2.0.0":
+  "integrity" "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q=="
+  "resolved" "https://registry.npmmirror.com/which-module/-/which-module-2.0.0.tgz"
+  "version" "2.0.0"
+
 "which@^1.2.14", "which@^1.2.9":
   "integrity" "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ=="
   "resolved" "https://registry.npmmirror.com/which/-/which-1.3.1.tgz"
@@ -4874,6 +4982,11 @@
   "resolved" "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz"
   "version" "1.0.2"
 
+"y18n@^4.0.0":
+  "integrity" "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ=="
+  "resolved" "https://registry.npmmirror.com/y18n/-/y18n-4.0.3.tgz"
+  "version" "4.0.3"
+
 "yallist@^2.1.2":
   "integrity" "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A=="
   "resolved" "https://registry.npmmirror.com/yallist/-/yallist-2.1.2.tgz"
@@ -4889,6 +5002,31 @@
   "resolved" "https://registry.npmmirror.com/yaml/-/yaml-1.10.2.tgz"
   "version" "1.10.2"
 
+"yargs-parser@^18.1.2":
+  "integrity" "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ=="
+  "resolved" "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-18.1.3.tgz"
+  "version" "18.1.3"
+  dependencies:
+    "camelcase" "^5.0.0"
+    "decamelize" "^1.2.0"
+
+"yargs@^15.3.1":
+  "integrity" "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A=="
+  "resolved" "https://registry.npmmirror.com/yargs/-/yargs-15.4.1.tgz"
+  "version" "15.4.1"
+  dependencies:
+    "cliui" "^6.0.0"
+    "decamelize" "^1.2.0"
+    "find-up" "^4.1.0"
+    "get-caller-file" "^2.0.1"
+    "require-directory" "^2.1.1"
+    "require-main-filename" "^2.0.0"
+    "set-blocking" "^2.0.0"
+    "string-width" "^4.2.0"
+    "which-module" "^2.0.0"
+    "y18n" "^4.0.0"
+    "yargs-parser" "^18.1.2"
+
 "yorkie@^2.0.0":
   "integrity" "sha512-jcKpkthap6x63MB4TxwCyuIGkV0oYP/YRyuQU5UO0Yz/E/ZAu+653/uov+phdmO54n6BcvFRyyt0RRrWdN2mpw=="
   "resolved" "https://registry.npmmirror.com/yorkie/-/yorkie-2.0.0.tgz"