Prechádzať zdrojové kódy

update 新版直播的调整分组

dusenyao 2 rokov pred
rodič
commit
fa22da561f

+ 470 - 188
package-lock.json

@@ -15,7 +15,7 @@
         "book-ui": "file:../book-ui-0.3.24.tgz",
         "core-js": "^3.27.2",
         "dayjs": "^1.11.7",
-        "element-ui": "^2.15.12",
+        "element-ui": "^2.15.13",
         "gcls-book-question-ui": "file:../gcls-book-question-ui-0.1.0.tgz",
         "jquery": "^3.6.3",
         "js-base64": "^3.7.5",
@@ -58,13 +58,12 @@
         "sass": "^1.58.0",
         "sass-loader": "^10.4.1",
         "script-ext-html-webpack-plugin": "^2.1.5",
-        "stylelint": "^14.16.1",
-        "stylelint-config-prettier": "^9.0.4",
+        "stylelint": "^15.1.0",
         "stylelint-config-recess-order": "^3.1.0",
         "stylelint-config-recommended-vue": "^1.4.0",
-        "stylelint-config-standard-scss": "^6.1.0",
+        "stylelint-config-standard-scss": "^7.0.0",
         "stylelint-declaration-block-no-ignored-properties": "^2.6.0",
-        "stylelint-webpack-plugin": "^3.3.0",
+        "stylelint-webpack-plugin": "^4.0.0",
         "svg-sprite-loader": "^6.0.11",
         "svgo": "^2.8.0",
         "vue-demi": "^0.13.11",
@@ -2121,21 +2120,50 @@
       "dev": true,
       "license": "MIT"
     },
-    "node_modules/@csstools/selector-specificity": {
-      "version": "2.0.2",
-      "resolved": "https://repo.huaweicloud.com/repository/npm/@csstools/selector-specificity/-/selector-specificity-2.0.2.tgz",
-      "integrity": "sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg==",
+    "node_modules/@csstools/css-parser-algorithms": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.0.1.tgz",
+      "integrity": "sha512-B9/8PmOtU6nBiibJg0glnNktQDZ3rZnGn/7UmDfrm2vMtrdlXO3p7ErE95N0up80IRk9YEtB5jyj/TmQ1WH3dw==",
       "dev": true,
-      "license": "CC0-1.0",
       "engines": {
-        "node": "^12 || ^14 || >=16"
+        "node": "^14 || ^16 || >=18"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/csstools"
+      "peerDependencies": {
+        "@csstools/css-tokenizer": "^2.0.0"
+      }
+    },
+    "node_modules/@csstools/css-tokenizer": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/@csstools/css-tokenizer/-/css-tokenizer-2.0.1.tgz",
+      "integrity": "sha512-sYD3H7ReR88S/4+V5VbKiBEUJF4FqvG+8aNJkxqoPAnbhFziDG22IDZc4+h+xA63SfgM+h15lq5OnLeCxQ9nPA==",
+      "dev": true,
+      "engines": {
+        "node": "^14 || ^16 || >=18"
+      }
+    },
+    "node_modules/@csstools/media-query-list-parser": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/@csstools/media-query-list-parser/-/media-query-list-parser-2.0.1.tgz",
+      "integrity": "sha512-X2/OuzEbjaxhzm97UJ+95GrMeT29d1Ib+Pu+paGLuRWZnWRK9sI9r3ikmKXPWGA1C4y4JEdBEFpp9jEqCvLeRA==",
+      "dev": true,
+      "engines": {
+        "node": "^14 || ^16 || >=18"
       },
       "peerDependencies": {
-        "postcss": "^8.2",
+        "@csstools/css-parser-algorithms": "^2.0.0",
+        "@csstools/css-tokenizer": "^2.0.0"
+      }
+    },
+    "node_modules/@csstools/selector-specificity": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmmirror.com/@csstools/selector-specificity/-/selector-specificity-2.1.1.tgz",
+      "integrity": "sha512-jwx+WCqszn53YHOfvFMJJRd/B2GqkCBt+1MJSG6o5/s8+ytHMvDZXsJgUEWLk12UnLd7HYKac4BYU5i/Ron1Cw==",
+      "dev": true,
+      "engines": {
+        "node": "^14 || ^16 || >=18"
+      },
+      "peerDependencies": {
+        "postcss": "^8.4",
         "postcss-selector-parser": "^6.0.10"
       }
     },
@@ -8089,10 +8117,9 @@
       "dev": true
     },
     "node_modules/element-ui": {
-      "version": "2.15.12",
-      "resolved": "https://repo.huaweicloud.com/repository/npm/element-ui/-/element-ui-2.15.12.tgz",
-      "integrity": "sha512-Y5FMT2BPOindU2GkDEQ5ZKUVxDawKONRNMh2eL3uBx1FOtvUJ+L6IxXLVsNxq4WnaX/UnVNgWXebl7DobygZMg==",
-      "license": "MIT",
+      "version": "2.15.13",
+      "resolved": "https://registry.npmmirror.com/element-ui/-/element-ui-2.15.13.tgz",
+      "integrity": "sha512-LJoatEYX6WV74FqXBss8Xfho9fh9rjDSzrDrTyREdGb1h1R3uRvmLh5jqp2JU137aj4/BgqA3K06RQpQBX33Bg==",
       "dependencies": {
         "async-validator": "~1.8.1",
         "babel-helper-vue-jsx-merge-props": "^2.0.0",
@@ -17366,26 +17393,15 @@
       }
     },
     "node_modules/postcss-scss": {
-      "version": "4.0.5",
-      "resolved": "https://repo.huaweicloud.com/repository/npm/postcss-scss/-/postcss-scss-4.0.5.tgz",
-      "integrity": "sha512-F7xpB6TrXyqUh3GKdyB4Gkp3QL3DDW1+uI+gxx/oJnUt/qXI4trj5OGlp9rOKdoABGULuqtqeG+3HEVQk4DjmA==",
+      "version": "4.0.6",
+      "resolved": "https://registry.npmmirror.com/postcss-scss/-/postcss-scss-4.0.6.tgz",
+      "integrity": "sha512-rLDPhJY4z/i4nVFZ27j9GqLxj1pwxE80eAzUNRMXtcpipFYIeowerzBgG3yJhMtObGEXidtIgbUpQ3eLDsf5OQ==",
       "dev": true,
-      "funding": [
-        {
-          "type": "opencollective",
-          "url": "https://opencollective.com/postcss/"
-        },
-        {
-          "type": "tidelift",
-          "url": "https://tidelift.com/funding/github/npm/postcss-scss"
-        }
-      ],
-      "license": "MIT",
       "engines": {
         "node": ">=12.0"
       },
       "peerDependencies": {
-        "postcss": "^8.3.3"
+        "postcss": "^8.4.19"
       }
     },
     "node_modules/postcss-selector-parser": {
@@ -20088,16 +20104,20 @@
       }
     },
     "node_modules/stylelint": {
-      "version": "14.16.1",
-      "resolved": "https://registry.npmmirror.com/stylelint/-/stylelint-14.16.1.tgz",
-      "integrity": "sha512-ErlzR/T3hhbV+a925/gbfc3f3Fep9/bnspMiJPorfGEmcBbXdS+oo6LrVtoUZ/w9fqD6o6k7PtUlCOsCRdjX/A==",
+      "version": "15.1.0",
+      "resolved": "https://registry.npmmirror.com/stylelint/-/stylelint-15.1.0.tgz",
+      "integrity": "sha512-Tw8OyIiYhxnIHUzgoLlCyWgCUKsPYiP3TDgs7M1VbayS+q5qZly2yxABg+YPe/hFRWiu0cOtptCtpyrn1CrnYw==",
       "dev": true,
       "dependencies": {
-        "@csstools/selector-specificity": "^2.0.2",
+        "@csstools/css-parser-algorithms": "^2.0.1",
+        "@csstools/css-tokenizer": "^2.0.1",
+        "@csstools/media-query-list-parser": "^2.0.1",
+        "@csstools/selector-specificity": "^2.1.1",
         "balanced-match": "^2.0.0",
         "colord": "^2.9.3",
-        "cosmiconfig": "^7.1.0",
+        "cosmiconfig": "^8.0.0",
         "css-functions-list": "^3.1.0",
+        "css-tree": "^2.3.1",
         "debug": "^4.3.4",
         "fast-glob": "^3.2.12",
         "fastest-levenshtein": "^1.0.16",
@@ -20106,7 +20126,7 @@
         "globby": "^11.1.0",
         "globjoin": "^0.1.4",
         "html-tags": "^3.2.0",
-        "ignore": "^5.2.1",
+        "ignore": "^5.2.4",
         "import-lazy": "^4.0.0",
         "imurmurhash": "^0.1.4",
         "is-plain-object": "^5.0.0",
@@ -20116,7 +20136,7 @@
         "micromatch": "^4.0.5",
         "normalize-path": "^3.0.0",
         "picocolors": "^1.0.0",
-        "postcss": "^8.4.19",
+        "postcss": "^8.4.21",
         "postcss-media-query-parser": "^0.2.3",
         "postcss-resolve-nested-selector": "^0.1.1",
         "postcss-safe-parser": "^6.0.0",
@@ -20130,13 +20150,13 @@
         "svg-tags": "^1.0.0",
         "table": "^6.8.1",
         "v8-compile-cache": "^2.3.0",
-        "write-file-atomic": "^4.0.2"
+        "write-file-atomic": "^5.0.0"
       },
       "bin": {
         "stylelint": "bin/stylelint.js"
       },
       "engines": {
-        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+        "node": "^14.13.1 || >=16.0.0"
       }
     },
     "node_modules/stylelint-config-html": {
@@ -20153,23 +20173,6 @@
         "stylelint": ">=14.0.0"
       }
     },
-    "node_modules/stylelint-config-prettier": {
-      "version": "9.0.4",
-      "resolved": "https://repo.huaweicloud.com/repository/npm/stylelint-config-prettier/-/stylelint-config-prettier-9.0.4.tgz",
-      "integrity": "sha512-38nIGTGpFOiK5LjJ8Ma1yUgpKENxoKSOhbDNSemY7Ep0VsJoXIW9Iq/2hSt699oB9tReynfWicTAoIHiq8Rvbg==",
-      "dev": true,
-      "license": "MIT",
-      "bin": {
-        "stylelint-config-prettier": "bin/check.js",
-        "stylelint-config-prettier-check": "bin/check.js"
-      },
-      "engines": {
-        "node": ">= 12"
-      },
-      "peerDependencies": {
-        "stylelint": ">=11.0.0"
-      }
-    },
     "node_modules/stylelint-config-recess-order": {
       "version": "3.1.0",
       "resolved": "https://registry.npmmirror.com/stylelint-config-recess-order/-/stylelint-config-recess-order-3.1.0.tgz",
@@ -20183,29 +20186,27 @@
       }
     },
     "node_modules/stylelint-config-recommended": {
-      "version": "9.0.0",
-      "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-9.0.0.tgz",
-      "integrity": "sha512-9YQSrJq4NvvRuTbzDsWX3rrFOzOlYBmZP+o513BJN/yfEmGSr0AxdvrWs0P/ilSpVV/wisamAHu5XSk8Rcf4CQ==",
+      "version": "10.0.1",
+      "resolved": "https://registry.npmmirror.com/stylelint-config-recommended/-/stylelint-config-recommended-10.0.1.tgz",
+      "integrity": "sha512-TQ4xQ48tW4QSlODcti7pgSRqBZcUaBzuh0jPpfiMhwJKBPkqzTIAU+IrSWL/7BgXlOM90DjB7YaNgFpx8QWhuA==",
       "dev": true,
-      "license": "MIT",
       "peerDependencies": {
-        "stylelint": "^14.10.0"
+        "stylelint": "^15.0.0"
       }
     },
     "node_modules/stylelint-config-recommended-scss": {
-      "version": "8.0.0",
-      "resolved": "https://repo.huaweicloud.com/repository/npm/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-8.0.0.tgz",
-      "integrity": "sha512-BxjxEzRaZoQb7Iinc3p92GS6zRdRAkIuEu2ZFLTxJK2e1AIcCb5B5MXY9KOXdGTnYFZ+KKx6R4Fv9zU6CtMYPQ==",
+      "version": "9.0.0",
+      "resolved": "https://registry.npmmirror.com/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-9.0.0.tgz",
+      "integrity": "sha512-5e9pn3Ztfncd8s9OqvvCW7tZpYe+vGmPi7VEXX7XEp+Kj38PnKCrvFCBL+hQ7rkD4d5QzjB3BxlFEyo/30UWUw==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "postcss-scss": "^4.0.2",
-        "stylelint-config-recommended": "^9.0.0",
-        "stylelint-scss": "^4.0.0"
+        "stylelint-config-recommended": "^10.0.1",
+        "stylelint-scss": "^4.4.0"
       },
       "peerDependencies": {
         "postcss": "^8.3.3",
-        "stylelint": "^14.10.0"
+        "stylelint": "^15.0.0"
       },
       "peerDependenciesMeta": {
         "postcss": {
@@ -20252,31 +20253,29 @@
       }
     },
     "node_modules/stylelint-config-standard": {
-      "version": "29.0.0",
-      "resolved": "https://repo.huaweicloud.com/repository/npm/stylelint-config-standard/-/stylelint-config-standard-29.0.0.tgz",
-      "integrity": "sha512-uy8tZLbfq6ZrXy4JKu3W+7lYLgRQBxYTUUB88vPgQ+ZzAxdrvcaSUW9hOMNLYBnwH+9Kkj19M2DHdZ4gKwI7tg==",
+      "version": "30.0.1",
+      "resolved": "https://registry.npmmirror.com/stylelint-config-standard/-/stylelint-config-standard-30.0.1.tgz",
+      "integrity": "sha512-NbeHOmpRQhjZh5XB1B/S4MLRWvz4xxAxeDBjzl0tY2xEcayNhLbaRGF0ZQzq+DQZLCcPpOHeS2Ru1ydbkhkmLg==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
-        "stylelint-config-recommended": "^9.0.0"
+        "stylelint-config-recommended": "^10.0.1"
       },
       "peerDependencies": {
-        "stylelint": "^14.14.0"
+        "stylelint": "^15.0.0"
       }
     },
     "node_modules/stylelint-config-standard-scss": {
-      "version": "6.1.0",
-      "resolved": "https://repo.huaweicloud.com/repository/npm/stylelint-config-standard-scss/-/stylelint-config-standard-scss-6.1.0.tgz",
-      "integrity": "sha512-iZ2B5kQT2G3rUzx+437cEpdcnFOQkwnwqXuY8Z0QUwIHQVE8mnYChGAquyKFUKZRZ0pRnrciARlPaR1RBtPb0Q==",
+      "version": "7.0.0",
+      "resolved": "https://registry.npmmirror.com/stylelint-config-standard-scss/-/stylelint-config-standard-scss-7.0.0.tgz",
+      "integrity": "sha512-rHgydRJxN4Q9lDcwrLFoiFA3S8CRqsUcyBBCLwEMjIwzJViluFfsOKFPSomx6hScVQgQ4//Fx0hRKiSHyO0ihw==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
-        "stylelint-config-recommended-scss": "^8.0.0",
-        "stylelint-config-standard": "^29.0.0"
+        "stylelint-config-recommended-scss": "^9.0.0",
+        "stylelint-config-standard": "^30.0.1"
       },
       "peerDependencies": {
         "postcss": "^8.3.3",
-        "stylelint": "^14.14.0"
+        "stylelint": "^15.0.0"
       },
       "peerDependenciesMeta": {
         "postcss": {
@@ -20312,11 +20311,10 @@
       }
     },
     "node_modules/stylelint-scss": {
-      "version": "4.3.0",
-      "resolved": "https://repo.huaweicloud.com/repository/npm/stylelint-scss/-/stylelint-scss-4.3.0.tgz",
-      "integrity": "sha512-GvSaKCA3tipzZHoz+nNO7S02ZqOsdBzMiCx9poSmLlb3tdJlGddEX/8QzCOD8O7GQan9bjsvLMsO5xiw6IhhIQ==",
+      "version": "4.4.0",
+      "resolved": "https://registry.npmmirror.com/stylelint-scss/-/stylelint-scss-4.4.0.tgz",
+      "integrity": "sha512-Qy66a+/30aylFhPmUArHhVsHOun1qrO93LGT15uzLuLjWS7hKDfpFm34mYo1ndR4MCo8W4bEZM1+AlJRJORaaw==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "lodash": "^4.17.21",
         "postcss-media-query-parser": "^0.2.3",
@@ -20325,34 +20323,73 @@
         "postcss-value-parser": "^4.1.0"
       },
       "peerDependencies": {
-        "stylelint": "^14.5.1"
+        "stylelint": "^14.5.1 || ^15.0.0"
       }
     },
     "node_modules/stylelint-webpack-plugin": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/stylelint-webpack-plugin/-/stylelint-webpack-plugin-3.3.0.tgz",
-      "integrity": "sha512-F53bapIZ9zI16ero8IWm6TrUE6SSibZBphJE9b5rR2FxtvmGmm1YmS+a5xjQzn63+cv71GVSCu4byX66fBLpEw==",
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/stylelint-webpack-plugin/-/stylelint-webpack-plugin-4.0.0.tgz",
+      "integrity": "sha512-VDxJ2/TLvykZCwa6CLfqN6pR/smkI3ry5x+p4ujxdJklUyEmkcxxumpL3x1k9XI55IxPqu8d2wXcGo3qWBChHA==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "globby": "^11.1.0",
-        "jest-worker": "^28.1.0",
+        "jest-worker": "^29.4.1",
         "micromatch": "^4.0.5",
         "normalize-path": "^3.0.0",
         "schema-utils": "^4.0.0"
       },
       "engines": {
-        "node": ">= 12.13.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/webpack"
+        "node": ">= 14.15.0"
       },
       "peerDependencies": {
         "stylelint": "^13.0.0 || ^14.0.0",
         "webpack": "^5.0.0"
       }
     },
+    "node_modules/stylelint-webpack-plugin/node_modules/@jest/schemas": {
+      "version": "29.4.2",
+      "resolved": "https://registry.npmmirror.com/@jest/schemas/-/schemas-29.4.2.tgz",
+      "integrity": "sha512-ZrGzGfh31NtdVH8tn0mgJw4khQuNHiKqdzJAFbCaERbyCP9tHlxWuL/mnMu8P7e/+k4puWjI1NOzi/sFsjce/g==",
+      "dev": true,
+      "dependencies": {
+        "@sinclair/typebox": "^0.25.16"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+      }
+    },
+    "node_modules/stylelint-webpack-plugin/node_modules/@jest/types": {
+      "version": "29.4.2",
+      "resolved": "https://registry.npmmirror.com/@jest/types/-/types-29.4.2.tgz",
+      "integrity": "sha512-CKlngyGP0fwlgC1BRUtPZSiWLBhyS9dKwKmyGxk8Z6M82LBEGB2aLQSg+U1MyLsU+M7UjnlLllBM2BLWKVm/Uw==",
+      "dev": true,
+      "dependencies": {
+        "@jest/schemas": "^29.4.2",
+        "@types/istanbul-lib-coverage": "^2.0.0",
+        "@types/istanbul-reports": "^3.0.0",
+        "@types/node": "*",
+        "@types/yargs": "^17.0.8",
+        "chalk": "^4.0.0"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+      }
+    },
+    "node_modules/stylelint-webpack-plugin/node_modules/@sinclair/typebox": {
+      "version": "0.25.21",
+      "resolved": "https://registry.npmmirror.com/@sinclair/typebox/-/typebox-0.25.21.tgz",
+      "integrity": "sha512-gFukHN4t8K4+wVC+ECqeqwzBDeFeTzBXroBTqE6vcWrQGbEUpHO7LYdG0f4xnvYq4VOEwITSlHlp0JBAIFMS/g==",
+      "dev": true
+    },
+    "node_modules/stylelint-webpack-plugin/node_modules/@types/yargs": {
+      "version": "17.0.22",
+      "resolved": "https://registry.npmmirror.com/@types/yargs/-/yargs-17.0.22.tgz",
+      "integrity": "sha512-pet5WJ9U8yPVRhkwuEIp5ktAeAqRZOq4UdAyWLWzxbtpyXnzbtLdKiXAjJzi/KLmPGS9wk86lUFWZFN6sISo4g==",
+      "dev": true,
+      "dependencies": {
+        "@types/yargs-parser": "*"
+      }
+    },
     "node_modules/stylelint-webpack-plugin/node_modules/ajv": {
       "version": "8.11.0",
       "resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.11.0.tgz",
@@ -20383,29 +20420,100 @@
         "ajv": "^8.8.2"
       }
     },
+    "node_modules/stylelint-webpack-plugin/node_modules/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,
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/stylelint-webpack-plugin/node_modules/chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "dev": true,
+      "dependencies": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/stylelint-webpack-plugin/node_modules/chalk/node_modules/supports-color": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+      "dev": true,
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/stylelint-webpack-plugin/node_modules/color-convert": {
+      "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,
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "node_modules/stylelint-webpack-plugin/node_modules/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
+    },
     "node_modules/stylelint-webpack-plugin/node_modules/has-flag": {
       "version": "4.0.0",
       "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
       "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
       "dev": true,
-      "license": "MIT",
       "engines": {
         "node": ">=8"
       }
     },
+    "node_modules/stylelint-webpack-plugin/node_modules/jest-util": {
+      "version": "29.4.2",
+      "resolved": "https://registry.npmmirror.com/jest-util/-/jest-util-29.4.2.tgz",
+      "integrity": "sha512-wKnm6XpJgzMUSRFB7YF48CuwdzuDIHenVuoIb1PLuJ6F+uErZsuDkU+EiExkChf6473XcawBrSfDSnXl+/YG4g==",
+      "dev": true,
+      "dependencies": {
+        "@jest/types": "^29.4.2",
+        "@types/node": "*",
+        "chalk": "^4.0.0",
+        "ci-info": "^3.2.0",
+        "graceful-fs": "^4.2.9",
+        "picomatch": "^2.2.3"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+      }
+    },
     "node_modules/stylelint-webpack-plugin/node_modules/jest-worker": {
-      "version": "28.1.1",
-      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.1.tgz",
-      "integrity": "sha512-Au7slXB08C6h+xbJPp7VIb6U0XX5Kc9uel/WFc6/rcTzGiaVCBRngBExSYuXSLFPULPSYU3cJ3ybS988lNFQhQ==",
+      "version": "29.4.2",
+      "resolved": "https://registry.npmmirror.com/jest-worker/-/jest-worker-29.4.2.tgz",
+      "integrity": "sha512-VIuZA2hZmFyRbchsUCHEehoSf2HEl0YVF8SDJqtPnKorAaBuh42V8QsLnde0XP5F6TyCynGPEGgBOn3Fc+wZGw==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "@types/node": "*",
+        "jest-util": "^29.4.2",
         "merge-stream": "^2.0.0",
         "supports-color": "^8.0.0"
       },
       "engines": {
-        "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/stylelint-webpack-plugin/node_modules/json-schema-traverse": {
@@ -20440,17 +20548,19 @@
       "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz",
       "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
         "has-flag": "^4.0.0"
       },
       "engines": {
         "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/supports-color?sponsor=1"
       }
     },
+    "node_modules/stylelint/node_modules/argparse": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz",
+      "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+      "dev": true
+    },
     "node_modules/stylelint/node_modules/balanced-match": {
       "version": "2.0.0",
       "resolved": "https://repo.huaweicloud.com/repository/npm/balanced-match/-/balanced-match-2.0.0.tgz",
@@ -20494,20 +20604,31 @@
       "license": "MIT"
     },
     "node_modules/stylelint/node_modules/cosmiconfig": {
-      "version": "7.1.0",
-      "resolved": "https://repo.huaweicloud.com/repository/npm/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
-      "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==",
+      "version": "8.0.0",
+      "resolved": "https://registry.npmmirror.com/cosmiconfig/-/cosmiconfig-8.0.0.tgz",
+      "integrity": "sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ==",
       "dev": true,
-      "license": "MIT",
       "dependencies": {
-        "@types/parse-json": "^4.0.0",
         "import-fresh": "^3.2.1",
+        "js-yaml": "^4.1.0",
         "parse-json": "^5.0.0",
-        "path-type": "^4.0.0",
-        "yaml": "^1.10.0"
+        "path-type": "^4.0.0"
       },
       "engines": {
-        "node": ">=10"
+        "node": ">=14"
+      }
+    },
+    "node_modules/stylelint/node_modules/css-tree": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmmirror.com/css-tree/-/css-tree-2.3.1.tgz",
+      "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==",
+      "dev": true,
+      "dependencies": {
+        "mdn-data": "2.0.30",
+        "source-map-js": "^1.0.1"
+      },
+      "engines": {
+        "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0"
       }
     },
     "node_modules/stylelint/node_modules/fast-glob": {
@@ -20564,14 +20685,26 @@
       }
     },
     "node_modules/stylelint/node_modules/ignore": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.2.1.tgz",
-      "integrity": "sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA==",
+      "version": "5.2.4",
+      "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.2.4.tgz",
+      "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==",
       "dev": true,
       "engines": {
         "node": ">= 4"
       }
     },
+    "node_modules/stylelint/node_modules/js-yaml": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz",
+      "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+      "dev": true,
+      "dependencies": {
+        "argparse": "^2.0.1"
+      },
+      "bin": {
+        "js-yaml": "bin/js-yaml.js"
+      }
+    },
     "node_modules/stylelint/node_modules/map-obj": {
       "version": "4.3.0",
       "resolved": "https://repo.huaweicloud.com/repository/npm/map-obj/-/map-obj-4.3.0.tgz",
@@ -20585,6 +20718,12 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
+    "node_modules/stylelint/node_modules/mdn-data": {
+      "version": "2.0.30",
+      "resolved": "https://registry.npmmirror.com/mdn-data/-/mdn-data-2.0.30.tgz",
+      "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==",
+      "dev": true
+    },
     "node_modules/stylelint/node_modules/meow": {
       "version": "9.0.0",
       "resolved": "https://repo.huaweicloud.com/repository/npm/meow/-/meow-9.0.0.tgz",
@@ -20722,17 +20861,16 @@
       }
     },
     "node_modules/stylelint/node_modules/write-file-atomic": {
-      "version": "4.0.2",
-      "resolved": "https://repo.huaweicloud.com/repository/npm/write-file-atomic/-/write-file-atomic-4.0.2.tgz",
-      "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==",
+      "version": "5.0.0",
+      "resolved": "https://registry.npmmirror.com/write-file-atomic/-/write-file-atomic-5.0.0.tgz",
+      "integrity": "sha512-R7NYMnHSlV42K54lwY9lvW6MnSm1HSJqZL3xiSgi9E7//FYaI74r2G0rd+/X6VAMkHEdzxQaU5HUOXWUz5kA/w==",
       "dev": true,
-      "license": "ISC",
       "dependencies": {
         "imurmurhash": "^0.1.4",
         "signal-exit": "^3.0.7"
       },
       "engines": {
-        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
       }
     },
     "node_modules/supports-color": {
@@ -24970,10 +25108,28 @@
       "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==",
       "dev": true
     },
+    "@csstools/css-parser-algorithms": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.0.1.tgz",
+      "integrity": "sha512-B9/8PmOtU6nBiibJg0glnNktQDZ3rZnGn/7UmDfrm2vMtrdlXO3p7ErE95N0up80IRk9YEtB5jyj/TmQ1WH3dw==",
+      "dev": true
+    },
+    "@csstools/css-tokenizer": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/@csstools/css-tokenizer/-/css-tokenizer-2.0.1.tgz",
+      "integrity": "sha512-sYD3H7ReR88S/4+V5VbKiBEUJF4FqvG+8aNJkxqoPAnbhFziDG22IDZc4+h+xA63SfgM+h15lq5OnLeCxQ9nPA==",
+      "dev": true
+    },
+    "@csstools/media-query-list-parser": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/@csstools/media-query-list-parser/-/media-query-list-parser-2.0.1.tgz",
+      "integrity": "sha512-X2/OuzEbjaxhzm97UJ+95GrMeT29d1Ib+Pu+paGLuRWZnWRK9sI9r3ikmKXPWGA1C4y4JEdBEFpp9jEqCvLeRA==",
+      "dev": true
+    },
     "@csstools/selector-specificity": {
-      "version": "2.0.2",
-      "resolved": "https://repo.huaweicloud.com/repository/npm/@csstools/selector-specificity/-/selector-specificity-2.0.2.tgz",
-      "integrity": "sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg==",
+      "version": "2.1.1",
+      "resolved": "https://registry.npmmirror.com/@csstools/selector-specificity/-/selector-specificity-2.1.1.tgz",
+      "integrity": "sha512-jwx+WCqszn53YHOfvFMJJRd/B2GqkCBt+1MJSG6o5/s8+ytHMvDZXsJgUEWLk12UnLd7HYKac4BYU5i/Ron1Cw==",
       "dev": true
     },
     "@eslint/eslintrc": {
@@ -29285,9 +29441,9 @@
       "dev": true
     },
     "element-ui": {
-      "version": "2.15.12",
-      "resolved": "https://repo.huaweicloud.com/repository/npm/element-ui/-/element-ui-2.15.12.tgz",
-      "integrity": "sha512-Y5FMT2BPOindU2GkDEQ5ZKUVxDawKONRNMh2eL3uBx1FOtvUJ+L6IxXLVsNxq4WnaX/UnVNgWXebl7DobygZMg==",
+      "version": "2.15.13",
+      "resolved": "https://registry.npmmirror.com/element-ui/-/element-ui-2.15.13.tgz",
+      "integrity": "sha512-LJoatEYX6WV74FqXBss8Xfho9fh9rjDSzrDrTyREdGb1h1R3uRvmLh5jqp2JU137aj4/BgqA3K06RQpQBX33Bg==",
       "requires": {
         "async-validator": "~1.8.1",
         "babel-helper-vue-jsx-merge-props": "^2.0.0",
@@ -35691,9 +35847,9 @@
       "dev": true
     },
     "postcss-scss": {
-      "version": "4.0.5",
-      "resolved": "https://repo.huaweicloud.com/repository/npm/postcss-scss/-/postcss-scss-4.0.5.tgz",
-      "integrity": "sha512-F7xpB6TrXyqUh3GKdyB4Gkp3QL3DDW1+uI+gxx/oJnUt/qXI4trj5OGlp9rOKdoABGULuqtqeG+3HEVQk4DjmA==",
+      "version": "4.0.6",
+      "resolved": "https://registry.npmmirror.com/postcss-scss/-/postcss-scss-4.0.6.tgz",
+      "integrity": "sha512-rLDPhJY4z/i4nVFZ27j9GqLxj1pwxE80eAzUNRMXtcpipFYIeowerzBgG3yJhMtObGEXidtIgbUpQ3eLDsf5OQ==",
       "dev": true
     },
     "postcss-selector-parser": {
@@ -37648,16 +37804,20 @@
       }
     },
     "stylelint": {
-      "version": "14.16.1",
-      "resolved": "https://registry.npmmirror.com/stylelint/-/stylelint-14.16.1.tgz",
-      "integrity": "sha512-ErlzR/T3hhbV+a925/gbfc3f3Fep9/bnspMiJPorfGEmcBbXdS+oo6LrVtoUZ/w9fqD6o6k7PtUlCOsCRdjX/A==",
+      "version": "15.1.0",
+      "resolved": "https://registry.npmmirror.com/stylelint/-/stylelint-15.1.0.tgz",
+      "integrity": "sha512-Tw8OyIiYhxnIHUzgoLlCyWgCUKsPYiP3TDgs7M1VbayS+q5qZly2yxABg+YPe/hFRWiu0cOtptCtpyrn1CrnYw==",
       "dev": true,
       "requires": {
-        "@csstools/selector-specificity": "^2.0.2",
+        "@csstools/css-parser-algorithms": "^2.0.1",
+        "@csstools/css-tokenizer": "^2.0.1",
+        "@csstools/media-query-list-parser": "^2.0.1",
+        "@csstools/selector-specificity": "^2.1.1",
         "balanced-match": "^2.0.0",
         "colord": "^2.9.3",
-        "cosmiconfig": "^7.1.0",
+        "cosmiconfig": "^8.0.0",
         "css-functions-list": "^3.1.0",
+        "css-tree": "^2.3.1",
         "debug": "^4.3.4",
         "fast-glob": "^3.2.12",
         "fastest-levenshtein": "^1.0.16",
@@ -37666,7 +37826,7 @@
         "globby": "^11.1.0",
         "globjoin": "^0.1.4",
         "html-tags": "^3.2.0",
-        "ignore": "^5.2.1",
+        "ignore": "^5.2.4",
         "import-lazy": "^4.0.0",
         "imurmurhash": "^0.1.4",
         "is-plain-object": "^5.0.0",
@@ -37676,7 +37836,7 @@
         "micromatch": "^4.0.5",
         "normalize-path": "^3.0.0",
         "picocolors": "^1.0.0",
-        "postcss": "^8.4.19",
+        "postcss": "^8.4.21",
         "postcss-media-query-parser": "^0.2.3",
         "postcss-resolve-nested-selector": "^0.1.1",
         "postcss-safe-parser": "^6.0.0",
@@ -37690,9 +37850,15 @@
         "svg-tags": "^1.0.0",
         "table": "^6.8.1",
         "v8-compile-cache": "^2.3.0",
-        "write-file-atomic": "^4.0.2"
+        "write-file-atomic": "^5.0.0"
       },
       "dependencies": {
+        "argparse": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz",
+          "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+          "dev": true
+        },
         "balanced-match": {
           "version": "2.0.0",
           "resolved": "https://repo.huaweicloud.com/repository/npm/balanced-match/-/balanced-match-2.0.0.tgz",
@@ -37723,16 +37889,25 @@
           "dev": true
         },
         "cosmiconfig": {
-          "version": "7.1.0",
-          "resolved": "https://repo.huaweicloud.com/repository/npm/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
-          "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==",
+          "version": "8.0.0",
+          "resolved": "https://registry.npmmirror.com/cosmiconfig/-/cosmiconfig-8.0.0.tgz",
+          "integrity": "sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ==",
           "dev": true,
           "requires": {
-            "@types/parse-json": "^4.0.0",
             "import-fresh": "^3.2.1",
+            "js-yaml": "^4.1.0",
             "parse-json": "^5.0.0",
-            "path-type": "^4.0.0",
-            "yaml": "^1.10.0"
+            "path-type": "^4.0.0"
+          }
+        },
+        "css-tree": {
+          "version": "2.3.1",
+          "resolved": "https://registry.npmmirror.com/css-tree/-/css-tree-2.3.1.tgz",
+          "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==",
+          "dev": true,
+          "requires": {
+            "mdn-data": "2.0.30",
+            "source-map-js": "^1.0.1"
           }
         },
         "fast-glob": {
@@ -37773,17 +37948,32 @@
           }
         },
         "ignore": {
-          "version": "5.2.1",
-          "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.2.1.tgz",
-          "integrity": "sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA==",
+          "version": "5.2.4",
+          "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.2.4.tgz",
+          "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==",
           "dev": true
         },
+        "js-yaml": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz",
+          "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+          "dev": true,
+          "requires": {
+            "argparse": "^2.0.1"
+          }
+        },
         "map-obj": {
           "version": "4.3.0",
           "resolved": "https://repo.huaweicloud.com/repository/npm/map-obj/-/map-obj-4.3.0.tgz",
           "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==",
           "dev": true
         },
+        "mdn-data": {
+          "version": "2.0.30",
+          "resolved": "https://registry.npmmirror.com/mdn-data/-/mdn-data-2.0.30.tgz",
+          "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==",
+          "dev": true
+        },
         "meow": {
           "version": "9.0.0",
           "resolved": "https://repo.huaweicloud.com/repository/npm/meow/-/meow-9.0.0.tgz",
@@ -37876,9 +38066,9 @@
           "dev": true
         },
         "write-file-atomic": {
-          "version": "4.0.2",
-          "resolved": "https://repo.huaweicloud.com/repository/npm/write-file-atomic/-/write-file-atomic-4.0.2.tgz",
-          "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==",
+          "version": "5.0.0",
+          "resolved": "https://registry.npmmirror.com/write-file-atomic/-/write-file-atomic-5.0.0.tgz",
+          "integrity": "sha512-R7NYMnHSlV42K54lwY9lvW6MnSm1HSJqZL3xiSgi9E7//FYaI74r2G0rd+/X6VAMkHEdzxQaU5HUOXWUz5kA/w==",
           "dev": true,
           "requires": {
             "imurmurhash": "^0.1.4",
@@ -37893,12 +38083,6 @@
       "integrity": "sha512-rKQUUWDpaYC7ybsS6tLxddjn6DxhjSIXybElSmcTyVQj3ExhmU3q+l41ktrlwHRyY0M5SkTkZiwngvYPYmsgSQ==",
       "dev": true
     },
-    "stylelint-config-prettier": {
-      "version": "9.0.4",
-      "resolved": "https://repo.huaweicloud.com/repository/npm/stylelint-config-prettier/-/stylelint-config-prettier-9.0.4.tgz",
-      "integrity": "sha512-38nIGTGpFOiK5LjJ8Ma1yUgpKENxoKSOhbDNSemY7Ep0VsJoXIW9Iq/2hSt699oB9tReynfWicTAoIHiq8Rvbg==",
-      "dev": true
-    },
     "stylelint-config-recess-order": {
       "version": "3.1.0",
       "resolved": "https://registry.npmmirror.com/stylelint-config-recess-order/-/stylelint-config-recess-order-3.1.0.tgz",
@@ -37909,20 +38093,20 @@
       }
     },
     "stylelint-config-recommended": {
-      "version": "9.0.0",
-      "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-9.0.0.tgz",
-      "integrity": "sha512-9YQSrJq4NvvRuTbzDsWX3rrFOzOlYBmZP+o513BJN/yfEmGSr0AxdvrWs0P/ilSpVV/wisamAHu5XSk8Rcf4CQ==",
+      "version": "10.0.1",
+      "resolved": "https://registry.npmmirror.com/stylelint-config-recommended/-/stylelint-config-recommended-10.0.1.tgz",
+      "integrity": "sha512-TQ4xQ48tW4QSlODcti7pgSRqBZcUaBzuh0jPpfiMhwJKBPkqzTIAU+IrSWL/7BgXlOM90DjB7YaNgFpx8QWhuA==",
       "dev": true
     },
     "stylelint-config-recommended-scss": {
-      "version": "8.0.0",
-      "resolved": "https://repo.huaweicloud.com/repository/npm/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-8.0.0.tgz",
-      "integrity": "sha512-BxjxEzRaZoQb7Iinc3p92GS6zRdRAkIuEu2ZFLTxJK2e1AIcCb5B5MXY9KOXdGTnYFZ+KKx6R4Fv9zU6CtMYPQ==",
+      "version": "9.0.0",
+      "resolved": "https://registry.npmmirror.com/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-9.0.0.tgz",
+      "integrity": "sha512-5e9pn3Ztfncd8s9OqvvCW7tZpYe+vGmPi7VEXX7XEp+Kj38PnKCrvFCBL+hQ7rkD4d5QzjB3BxlFEyo/30UWUw==",
       "dev": true,
       "requires": {
         "postcss-scss": "^4.0.2",
-        "stylelint-config-recommended": "^9.0.0",
-        "stylelint-scss": "^4.0.0"
+        "stylelint-config-recommended": "^10.0.1",
+        "stylelint-scss": "^4.4.0"
       }
     },
     "stylelint-config-recommended-vue": {
@@ -37948,22 +38132,22 @@
       }
     },
     "stylelint-config-standard": {
-      "version": "29.0.0",
-      "resolved": "https://repo.huaweicloud.com/repository/npm/stylelint-config-standard/-/stylelint-config-standard-29.0.0.tgz",
-      "integrity": "sha512-uy8tZLbfq6ZrXy4JKu3W+7lYLgRQBxYTUUB88vPgQ+ZzAxdrvcaSUW9hOMNLYBnwH+9Kkj19M2DHdZ4gKwI7tg==",
+      "version": "30.0.1",
+      "resolved": "https://registry.npmmirror.com/stylelint-config-standard/-/stylelint-config-standard-30.0.1.tgz",
+      "integrity": "sha512-NbeHOmpRQhjZh5XB1B/S4MLRWvz4xxAxeDBjzl0tY2xEcayNhLbaRGF0ZQzq+DQZLCcPpOHeS2Ru1ydbkhkmLg==",
       "dev": true,
       "requires": {
-        "stylelint-config-recommended": "^9.0.0"
+        "stylelint-config-recommended": "^10.0.1"
       }
     },
     "stylelint-config-standard-scss": {
-      "version": "6.1.0",
-      "resolved": "https://repo.huaweicloud.com/repository/npm/stylelint-config-standard-scss/-/stylelint-config-standard-scss-6.1.0.tgz",
-      "integrity": "sha512-iZ2B5kQT2G3rUzx+437cEpdcnFOQkwnwqXuY8Z0QUwIHQVE8mnYChGAquyKFUKZRZ0pRnrciARlPaR1RBtPb0Q==",
+      "version": "7.0.0",
+      "resolved": "https://registry.npmmirror.com/stylelint-config-standard-scss/-/stylelint-config-standard-scss-7.0.0.tgz",
+      "integrity": "sha512-rHgydRJxN4Q9lDcwrLFoiFA3S8CRqsUcyBBCLwEMjIwzJViluFfsOKFPSomx6hScVQgQ4//Fx0hRKiSHyO0ihw==",
       "dev": true,
       "requires": {
-        "stylelint-config-recommended-scss": "^8.0.0",
-        "stylelint-config-standard": "^29.0.0"
+        "stylelint-config-recommended-scss": "^9.0.0",
+        "stylelint-config-standard": "^30.0.1"
       }
     },
     "stylelint-declaration-block-no-ignored-properties": {
@@ -37983,9 +38167,9 @@
       }
     },
     "stylelint-scss": {
-      "version": "4.3.0",
-      "resolved": "https://repo.huaweicloud.com/repository/npm/stylelint-scss/-/stylelint-scss-4.3.0.tgz",
-      "integrity": "sha512-GvSaKCA3tipzZHoz+nNO7S02ZqOsdBzMiCx9poSmLlb3tdJlGddEX/8QzCOD8O7GQan9bjsvLMsO5xiw6IhhIQ==",
+      "version": "4.4.0",
+      "resolved": "https://registry.npmmirror.com/stylelint-scss/-/stylelint-scss-4.4.0.tgz",
+      "integrity": "sha512-Qy66a+/30aylFhPmUArHhVsHOun1qrO93LGT15uzLuLjWS7hKDfpFm34mYo1ndR4MCo8W4bEZM1+AlJRJORaaw==",
       "dev": true,
       "requires": {
         "lodash": "^4.17.21",
@@ -37996,18 +38180,56 @@
       }
     },
     "stylelint-webpack-plugin": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/stylelint-webpack-plugin/-/stylelint-webpack-plugin-3.3.0.tgz",
-      "integrity": "sha512-F53bapIZ9zI16ero8IWm6TrUE6SSibZBphJE9b5rR2FxtvmGmm1YmS+a5xjQzn63+cv71GVSCu4byX66fBLpEw==",
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/stylelint-webpack-plugin/-/stylelint-webpack-plugin-4.0.0.tgz",
+      "integrity": "sha512-VDxJ2/TLvykZCwa6CLfqN6pR/smkI3ry5x+p4ujxdJklUyEmkcxxumpL3x1k9XI55IxPqu8d2wXcGo3qWBChHA==",
       "dev": true,
       "requires": {
         "globby": "^11.1.0",
-        "jest-worker": "^28.1.0",
+        "jest-worker": "^29.4.1",
         "micromatch": "^4.0.5",
         "normalize-path": "^3.0.0",
         "schema-utils": "^4.0.0"
       },
       "dependencies": {
+        "@jest/schemas": {
+          "version": "29.4.2",
+          "resolved": "https://registry.npmmirror.com/@jest/schemas/-/schemas-29.4.2.tgz",
+          "integrity": "sha512-ZrGzGfh31NtdVH8tn0mgJw4khQuNHiKqdzJAFbCaERbyCP9tHlxWuL/mnMu8P7e/+k4puWjI1NOzi/sFsjce/g==",
+          "dev": true,
+          "requires": {
+            "@sinclair/typebox": "^0.25.16"
+          }
+        },
+        "@jest/types": {
+          "version": "29.4.2",
+          "resolved": "https://registry.npmmirror.com/@jest/types/-/types-29.4.2.tgz",
+          "integrity": "sha512-CKlngyGP0fwlgC1BRUtPZSiWLBhyS9dKwKmyGxk8Z6M82LBEGB2aLQSg+U1MyLsU+M7UjnlLllBM2BLWKVm/Uw==",
+          "dev": true,
+          "requires": {
+            "@jest/schemas": "^29.4.2",
+            "@types/istanbul-lib-coverage": "^2.0.0",
+            "@types/istanbul-reports": "^3.0.0",
+            "@types/node": "*",
+            "@types/yargs": "^17.0.8",
+            "chalk": "^4.0.0"
+          }
+        },
+        "@sinclair/typebox": {
+          "version": "0.25.21",
+          "resolved": "https://registry.npmmirror.com/@sinclair/typebox/-/typebox-0.25.21.tgz",
+          "integrity": "sha512-gFukHN4t8K4+wVC+ECqeqwzBDeFeTzBXroBTqE6vcWrQGbEUpHO7LYdG0f4xnvYq4VOEwITSlHlp0JBAIFMS/g==",
+          "dev": true
+        },
+        "@types/yargs": {
+          "version": "17.0.22",
+          "resolved": "https://registry.npmmirror.com/@types/yargs/-/yargs-17.0.22.tgz",
+          "integrity": "sha512-pet5WJ9U8yPVRhkwuEIp5ktAeAqRZOq4UdAyWLWzxbtpyXnzbtLdKiXAjJzi/KLmPGS9wk86lUFWZFN6sISo4g==",
+          "dev": true,
+          "requires": {
+            "@types/yargs-parser": "*"
+          }
+        },
         "ajv": {
           "version": "8.11.0",
           "resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.11.0.tgz",
@@ -38029,19 +38251,79 @@
             "fast-deep-equal": "^3.1.3"
           }
         },
+        "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"
+          }
+        },
+        "chalk": {
+          "version": "4.1.2",
+          "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "7.2.0",
+              "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+              "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^4.0.0"
+              }
+            }
+          }
+        },
+        "color-convert": {
+          "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"
+          }
+        },
+        "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
+        },
         "has-flag": {
           "version": "4.0.0",
           "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
+        "jest-util": {
+          "version": "29.4.2",
+          "resolved": "https://registry.npmmirror.com/jest-util/-/jest-util-29.4.2.tgz",
+          "integrity": "sha512-wKnm6XpJgzMUSRFB7YF48CuwdzuDIHenVuoIb1PLuJ6F+uErZsuDkU+EiExkChf6473XcawBrSfDSnXl+/YG4g==",
+          "dev": true,
+          "requires": {
+            "@jest/types": "^29.4.2",
+            "@types/node": "*",
+            "chalk": "^4.0.0",
+            "ci-info": "^3.2.0",
+            "graceful-fs": "^4.2.9",
+            "picomatch": "^2.2.3"
+          }
+        },
         "jest-worker": {
-          "version": "28.1.1",
-          "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.1.tgz",
-          "integrity": "sha512-Au7slXB08C6h+xbJPp7VIb6U0XX5Kc9uel/WFc6/rcTzGiaVCBRngBExSYuXSLFPULPSYU3cJ3ybS988lNFQhQ==",
+          "version": "29.4.2",
+          "resolved": "https://registry.npmmirror.com/jest-worker/-/jest-worker-29.4.2.tgz",
+          "integrity": "sha512-VIuZA2hZmFyRbchsUCHEehoSf2HEl0YVF8SDJqtPnKorAaBuh42V8QsLnde0XP5F6TyCynGPEGgBOn3Fc+wZGw==",
           "dev": true,
           "requires": {
             "@types/node": "*",
+            "jest-util": "^29.4.2",
             "merge-stream": "^2.0.0",
             "supports-color": "^8.0.0"
           }

+ 5 - 6
package.json

@@ -20,7 +20,7 @@
     "book-ui": "file:../book-ui-0.3.24.tgz",
     "core-js": "^3.27.2",
     "dayjs": "^1.11.7",
-    "element-ui": "^2.15.12",
+    "element-ui": "^2.15.13",
     "gcls-book-question-ui": "file:../gcls-book-question-ui-0.1.0.tgz",
     "jquery": "^3.6.3",
     "js-base64": "^3.7.5",
@@ -63,13 +63,12 @@
     "sass": "^1.58.0",
     "sass-loader": "^10.4.1",
     "script-ext-html-webpack-plugin": "^2.1.5",
-    "stylelint": "^14.16.1",
-    "stylelint-config-prettier": "^9.0.4",
+    "stylelint": "^15.1.0",
     "stylelint-config-recess-order": "^3.1.0",
     "stylelint-config-recommended-vue": "^1.4.0",
-    "stylelint-config-standard-scss": "^6.1.0",
+    "stylelint-config-standard-scss": "^7.0.0",
     "stylelint-declaration-block-no-ignored-properties": "^2.6.0",
-    "stylelint-webpack-plugin": "^3.3.0",
+    "stylelint-webpack-plugin": "^4.0.0",
     "svg-sprite-loader": "^6.0.11",
     "svgo": "^2.8.0",
     "vue-loader": "^15.10.1",
@@ -82,6 +81,6 @@
   ],
   "engines": {
     "node": ">= 14",
-    "npm": ">= 3.0.0"
+    "npm": ">= 6.0.0"
   }
 }

BIN
src/assets/live/arrow-left-disabled.png


BIN
src/assets/live/arrow-right-disabled.png


+ 0 - 1
src/components/select/SelectTemplate.vue

@@ -132,7 +132,6 @@ function confirmTemplate() {
 
 <style lang="scss">
 @import '~@/styles/mixin';
-
 @include dialog;
 @include pagination;
 

+ 100 - 44
src/views/new_live/student/components/StudentStream.vue

@@ -2,68 +2,91 @@
   <div class="stream">
     <div class="rotation-list">
       <div class="arrow-left">
-        <el-image :src="require('@/assets/live/arrow-left.png')" @click="changeCurPage(curPage - 1, 'pre')" />
+        <el-image
+          :src="
+            curPage <= 1 ? require('@/assets/live/arrow-left-disabled.png') : require('@/assets/live/arrow-left.png')
+          "
+          @click="changeCurPage(curPage - 1)"
+        />
       </div>
 
-      <div class="stream-list">
-        <div v-show="isTeacherInGroup" class="stream-list-item">
-          <div id="live" class="group-box"></div>
-          <div class="live-wrapper-stream">
-            <span>{{ teacherName }}</span>
+      <div :style="{ overflow: 'hidden', height: '100%' }">
+        <div class="stream-list" :style="{ 'row-gap': streamData.rowGap, 'column-gap': streamData.colGap }">
+          <div v-show="isTeacherInGroup" class="stream-list-item">
+            <div id="live" class="group-box"></div>
+            <div class="live-wrapper-stream">
+              <span>{{ teacherName }}</span>
+            </div>
           </div>
-        </div>
 
-        <!-- 学生自己 -->
-        <template v-if="!isAudience">
-          <div v-show="isLocalStream" class="stream-list-item">
-            <div id="group-local" class="group-box"></div>
+          <!-- 学生自己 -->
+          <template v-if="!isAudience">
+            <div v-show="isLocalStream" class="stream-list-item">
+              <div id="group-local" class="group-box"></div>
+              <div class="live-wrapper-stream">
+                <span>{{ studentSelf.student_name }}</span>
+              </div>
+            </div>
+
+            <div v-show="!isLocalStream" class="stream-list-item no-stream">
+              <el-avatar icon="el-icon-user" :src="studentSelf.student_image_url" :size="122" />
+              <span class="student-card">学生</span>
+
+              <div class="live-name">
+                <span class="name nowrap-ellipsis">
+                  {{ studentSelf.student_name }}
+                </span>
+              </div>
+            </div>
+          </template>
+
+          <!-- 有流列表 -->
+          <div v-for="(item, i) in streamList" :key="item.id()" class="stream-list-item">
+            <div :id="`group-${i}`" class="group-box"></div>
             <div class="live-wrapper-stream">
-              <span>{{ studentSelf.student_name }}</span>
+              <span>{{ searchStudentName(item.id()) }} </span>
             </div>
           </div>
-
-          <div v-show="!isLocalStream" class="stream-list-item no-stream">
-            <el-avatar icon="el-icon-user" :src="studentSelf.student_image_url" :size="122" />
+          <!-- 无流列表 -->
+          <div
+            v-for="({ student_image_url, student_id, student_name }, i) in noStreamList"
+            v-show="streamShow(i, 'noStream')"
+            :key="student_id"
+            class="stream-list-item no-stream"
+          >
+            <el-avatar icon="el-icon-user" :src="student_image_url" :size="122" />
             <span class="student-card">学生</span>
 
             <div class="live-name">
               <span class="name nowrap-ellipsis">
-                {{ studentSelf.student_name }}
+                {{ student_name }}
               </span>
             </div>
           </div>
-        </template>
-
-        <!-- 有流列表 -->
-        <div v-for="(item, i) in streamList" :key="item.id()" class="stream-list-item">
-          <div :id="`group-${i}`" class="group-box"></div>
-          <div class="live-wrapper-stream">
-            <span>{{ searchStudentName(item.id()) }} </span>
-          </div>
-        </div>
-        <!-- 无流列表 -->
-        <div
-          v-for="{ student_image_url, student_id, student_name } in noStreamList"
-          :key="student_id"
-          class="stream-list-item no-stream"
-        >
-          <el-avatar icon="el-icon-user" :src="student_image_url" :size="122" />
-          <span class="student-card">学生</span>
-
-          <div class="live-name">
-            <span class="name nowrap-ellipsis">
-              {{ student_name }}
-            </span>
-          </div>
         </div>
       </div>
 
       <div class="arrow-right">
-        <el-image :src="require('@/assets/live/arrow-right.png')" @click="changeCurPage(curPage + 1, 'next')" />
+        <el-image
+          :src="
+            curPage === streamData.pageNum
+              ? require('@/assets/live/arrow-right-disabled.png')
+              : require('@/assets/live/arrow-right.png')
+          "
+          @click="changeCurPage(curPage + 1)"
+        />
       </div>
     </div>
 
-    <div class="rotation-circle"></div>
+    <div class="rotation-circle">
+      <span
+        v-for="num in streamData.pageNum"
+        :key="num"
+        class="circle-item"
+        :class="{ active: num === curPage }"
+        @click="changeCurPage(num)"
+      ></span>
+    </div>
   </div>
 </template>
 
@@ -74,7 +97,9 @@ export default {
 </script>
 
 <script setup>
-defineProps({
+import { ref, computed } from 'vue';
+
+const props = defineProps({
   isLocalStream: {
     type: Boolean,
     required: true
@@ -108,6 +133,31 @@ defineProps({
     required: true
   }
 });
+
+let streamData = computed(() => {
+  let noStreamNum = props.noStreamList.length;
+  let streamNum = props.streamList.length;
+  let col = Math.floor((window.innerWidth - 98 - 132 - 96 + 24) / 168);
+  let colGap = `${24 + ((window.innerWidth - 98 - 132 - 96 + 24) % 168) / (col - 1)}px`;
+  let row = Math.floor((window.innerHeight - 192 - 129 + 24) / 182);
+  let rowGap = `${24 + ((window.innerHeight - 192 - 129 + 24) % 182) / (row - 1)}px`;
+  let t = props.isTeacherInGroup ? 1 : 0;
+  let a = props.isAudience ? 0 : 1;
+  let capacity = col * row - t - a;
+  let pageNum = Math.ceil((noStreamNum + streamNum) / (col * row));
+  return { col, row, capacity, pageNum, colGap, rowGap };
+});
+
+let curPage = ref(1);
+function changeCurPage(page) {
+  if (page < 1 || page > streamData.value.pageNum) return;
+  curPage.value = page;
+}
+
+function streamShow(i, type) {
+  let num = type === 'noStream' ? i + props.streamList.length : i;
+  return streamData.value.capacity * (curPage.value - 1) < num && num <= streamData.value.capacity * curPage.value;
+}
 </script>
 
 <style lang="scss" scoped>
@@ -123,6 +173,7 @@ defineProps({
     column-gap: 66px;
     align-items: center;
     width: 100%;
+    height: calc(100% - 76px);
     padding: 53px 49px 0;
 
     .arrow-left,
@@ -140,6 +191,8 @@ defineProps({
       flex: 1;
       flex-wrap: wrap;
       gap: 24px;
+      align-content: flex-start;
+      width: calc(100vw - 326px);
       height: 100%;
       overflow: hidden;
 
@@ -148,9 +201,10 @@ defineProps({
         display: flex;
         flex-direction: column;
         row-gap: 16px;
+        height: 158px;
 
         &.no-stream {
-          padding: 0 11px;
+          padding: 0 10px;
         }
 
         .live-wrapper-stream {
@@ -216,6 +270,7 @@ defineProps({
           column-gap: 8px;
           align-items: center;
           justify-content: center;
+          width: 124px;
 
           .more {
             vertical-align: middle;
@@ -231,7 +286,8 @@ defineProps({
     column-gap: 4px;
     align-items: center;
     justify-content: center;
-    padding: 32px 0;
+    height: 76px;
+    padding: 36px 0 32px;
 
     .circle-item {
       width: 8px;

+ 21 - 2
src/views/new_live/student/group.js

@@ -12,8 +12,7 @@ import {
 
 import i18n from '@/locales/i18n';
 
-const { closeVideo, getHistory, unSubscribeStream, createData, publishStream, pauseAudio, sendPublishMessage } =
-  useLive();
+const { closeVideo, unSubscribeStream, createData, publishStream, pauseAudio, sendPublishMessage } = useLive();
 
 export let room_id = ref('');
 export let session_id = ref('');
@@ -273,6 +272,13 @@ export function useInitListener({ streamList, roomContext, is_teacher_in_group,
         }
       });
     }
+
+    if (data.type === 'kick-out' && room_user_id.value === data.room_user_id) {
+      console.log('自己被踢出房间');
+      Message.warning('您已被踢出房间');
+      sendPublishMessage({ type: 'kick-out-success' });
+      exitRoom();
+    }
   });
 }
 
@@ -381,6 +387,19 @@ export function useGroupInit(_downloadWebSDK, task_id) {
       live_room_sys_user_id.value = liveId;
       room_id.value = rId;
       student_list.value = sList;
+      for (let i = 0; i < 60; i++) {
+        student_list.value.push({
+          is_mobile: 'false',
+          is_self: 'false',
+          is_teacher_role_in_room: 'false',
+          room_user_id: 'OMELGJaNgIxok0gq',
+          session_id: '1C22C87C969F800E8E63675441278F1968E238B75E42AD983B09766EB028CF89',
+          student_id: '20210621-1034-0000001',
+          student_image_url:
+            'https://file-kf.helxsoft.cn/CSFileServer/URL/001/150A524904005FBF325BB7A45408416F20230209153213PFAGLWFYXBTIBQUGSZNQFLGX8QV5VEBGVH9XGHFB_00101-20210708-14-FHBTMV0E.jpg',
+          student_name: `${i}杜森垚(学生)`
+        });
+      }
       noStreamList.value = sList.filter((item) => item.is_self === 'false');
       studentSelf.value = data;
       audience_list.value = aList;

+ 133 - 63
src/views/new_live/teacher/StreamList.vue

@@ -2,79 +2,108 @@
   <div v-show="isGroup" class="stream">
     <div class="rotation-list">
       <div class="arrow-left">
-        <el-image :src="require('@/assets/live/arrow-left.png')" @click="changeCurPage(curPage - 1)" />
+        <el-image
+          :src="
+            curPage <= 1 ? require('@/assets/live/arrow-left-disabled.png') : require('@/assets/live/arrow-left.png')
+          "
+          @click="changeCurPage(curPage - 1)"
+        />
       </div>
 
-      <div class="stream-list">
-        <div v-show="!isTeacherStream" class="stream-list-item no-stream">
-          <div class="portrait">
-            <span>{{ teacherName }}</span>
+      <div :style="{ overflow: 'hidden', height: '100%' }">
+        <div class="stream-list" :style="{ 'row-gap': streamData.rowGap, 'column-gap': streamData.colGap }">
+          <div v-show="!isTeacherStream" class="stream-list-item no-stream">
+            <div class="portrait">
+              <span>{{ teacherName }}</span>
+            </div>
+            <span class="teacher-card">教师</span>
+            <span class="name">
+              {{ teacherName }}
+            </span>
           </div>
-          <span class="teacher-card">教师</span>
-          <span class="name">
-            {{ teacherName }}
-          </span>
-        </div>
 
-        <div v-show="isTeacherStream" class="stream-list-item">
-          <div id="live" class="group-box"></div>
-          <div class="live-wrapper-stream">
-            <span>{{ teacherName }}</span>
+          <div v-show="isTeacherStream" class="stream-list-item">
+            <div id="live" class="group-box"></div>
+            <div class="live-wrapper-stream">
+              <span>{{ teacherName }}</span>
+            </div>
           </div>
-        </div>
-        <!-- 有流列表 -->
-        <div v-for="(item, i) in streamList" :key="item.id()" class="stream-list-item">
-          <div :id="`group-${i}`" class="group-box"></div>
-          <div class="live-wrapper-stream">
-            <span>{{ searchStudentName(item.id()) }} </span>
-            <el-popover popper-class="group-operation" trigger="click" placement="bottom-start">
-              <div class="operation">
-                <div class="operation-item" @click="openDialog(item.id().split('-')[0])">移动到...</div>
-                <div class="operation-item" @click="estoppel(item.id().split('-')[0])"><span>禁言</span></div>
-                <div class="operation-item" @click="kickOut(item.id().split('-')[0])">
-                  <span :style="{ color: '#EA5050' }">踢出</span>
+
+          <!-- 有流列表 -->
+          <div
+            v-for="(item, i) in streamList"
+            v-show="streamShow(i, 'stream')"
+            :key="item.id()"
+            class="stream-list-item"
+          >
+            <div :id="`group-${i}`" class="group-box"></div>
+            <div class="live-wrapper-stream">
+              <span>{{ searchStudentName(item.id()) }} </span>
+              <el-popover popper-class="group-operation" trigger="click" placement="bottom-start">
+                <div class="operation">
+                  <div class="operation-item" @click="openDialog(getRoomUserId(item.id()))">移动到...</div>
+                  <div class="operation-item" @click="estoppel(getRoomUserId(item.id()))"><span>禁言</span></div>
+                  <div class="operation-item" @click="kickOut(getRoomUserId(item.id()))">
+                    <span :style="{ color: '#EA5050' }">踢出</span>
+                  </div>
                 </div>
-              </div>
-              <img slot="reference" class="more" :src="require('@/assets/common/more-white.png')" />
-            </el-popover>
+                <img slot="reference" class="more" :src="require('@/assets/common/more-white.png')" />
+              </el-popover>
+            </div>
           </div>
-        </div>
-        <!-- 无流列表 -->
-        <div
-          v-for="{ student_image_url, student_id, student_name, room_user_id } in noStreamList"
-          :key="student_id"
-          class="stream-list-item no-stream"
-        >
-          <el-avatar icon="el-icon-user" :src="student_image_url" :size="122" />
-          <span class="student-card">学生</span>
-
-          <div class="live-name">
-            <span class="name nowrap-ellipsis">
-              {{ student_name }}
-            </span>
-            <!-- 弹出操作框 -->
-            <el-popover popper-class="group-operation" trigger="click" placement="bottom-start">
-              <div class="operation">
-                <div class="operation-item" @click="openDialog(room_user_id)">移动到...</div>
-                <div class="operation-item" @click="estoppel(room_user_id)">
-                  <span>禁言</span>
+          <!-- 无流列表 -->
+          <div
+            v-for="({ student_image_url, student_id, student_name, room_user_id }, i) in noStreamList"
+            v-show="streamShow(i, 'noStream')"
+            :key="student_id"
+            class="stream-list-item no-stream"
+          >
+            <el-avatar icon="el-icon-user" :src="student_image_url" :size="122" />
+            <span class="student-card">学生</span>
+
+            <div class="live-name">
+              <span class="name nowrap-ellipsis">
+                {{ student_name }}
+              </span>
+              <!-- 弹出操作框 -->
+              <el-popover popper-class="group-operation" trigger="click" placement="bottom-start">
+                <div class="operation">
+                  <div class="operation-item" @click="openDialog(room_user_id)">移动到...</div>
+                  <div class="operation-item" @click="estoppel(room_user_id)">
+                    <span>禁言</span>
+                  </div>
+                  <div class="operation-item" @click="kickOut(room_user_id)">
+                    <span :style="{ color: '#EA5050' }">踢出</span>
+                  </div>
                 </div>
-                <div class="operation-item" @click="kickOut(room_user_id)">
-                  <span :style="{ color: '#EA5050' }">踢出</span>
-                </div>
-              </div>
-              <img slot="reference" class="more" :src="require('@/assets/common/more.png')" />
-            </el-popover>
+                <img slot="reference" class="more" :src="require('@/assets/common/more.png')" />
+              </el-popover>
+            </div>
           </div>
         </div>
       </div>
 
       <div class="arrow-right">
-        <el-image :src="require('@/assets/live/arrow-right.png')" @click="changeCurPage(curPage + 1)" />
+        <el-image
+          :src="
+            curPage === streamData.pageNum
+              ? require('@/assets/live/arrow-right-disabled.png')
+              : require('@/assets/live/arrow-right.png')
+          "
+          @click="changeCurPage(curPage + 1)"
+        />
       </div>
     </div>
 
-    <div class="rotation-circle"></div>
+    <div class="rotation-circle">
+      <span
+        v-for="num in streamData.pageNum"
+        :key="num"
+        class="circle-item"
+        :class="{ active: num === curPage }"
+        @click="changeCurPage(num)"
+      ></span>
+    </div>
 
     <el-dialog :visible="visible" width="300px" top="30vh" :title="dialogTitle">
       <div class="adjust-group">
@@ -102,15 +131,17 @@ export default {
 </script>
 
 <script setup>
-import { ref, inject } from 'vue';
-import { useTeacherLiveRtc } from './live';
+import { ref, computed, inject } from 'vue';
 import { useLive } from '../common/common';
 import { Message, Loading } from 'element-ui';
 import { AdjustGroup } from '@/api/live';
 
-const { kickOut } = useTeacherLiveRtc();
 const { sendPublishMessage } = useLive();
 
+function getRoomUserId(id) {
+  return id.split('-')[0];
+}
+
 /**
  * 禁言
  * @param {String} room_user_id
@@ -122,6 +153,17 @@ function estoppel(room_user_id) {
   });
 }
 
+/**
+ * 踢出房间
+ * @param {String} room_user_id
+ */
+function kickOut(room_user_id) {
+  sendPublishMessage({
+    type: 'kick-out',
+    room_user_id
+  });
+}
+
 const props = defineProps({
   isTeacherStream: {
     type: Boolean,
@@ -171,6 +213,7 @@ function openDialog(id) {
   dialogTitle.value = `${props.searchStudentName(id)}移动到...`;
   studentId.value = props.studentList.find(({ room_user_id }) => room_user_id === id)?.student_id;
 }
+// 确定分组
 function confirm() {
   if (groupId.value.length === 0) return;
   visible.value = false;
@@ -195,7 +238,28 @@ function confirm() {
     });
 }
 
-function changeCurPage(page) {}
+let streamData = computed(() => {
+  let noStreamNum = props.noStreamList.length;
+  let streamNum = props.streamList.length;
+  let col = Math.floor((window.innerWidth - 98 - 132 - 96 + 24) / 168);
+  let colGap = `${24 + ((window.innerWidth - 98 - 132 - 96 + 24) % 168) / (col - 1)}px`;
+  let row = Math.floor((window.innerHeight - 192 - 129 + 24) / 182);
+  let rowGap = `${24 + ((window.innerHeight - 192 - 129 + 24) % 182) / (row - 1)}px`;
+  let capacity = col * row - 1;
+  let pageNum = Math.ceil((noStreamNum + streamNum) / (col * row));
+  return { col, row, capacity, pageNum, colGap, rowGap };
+});
+
+let curPage = ref(1);
+function changeCurPage(page) {
+  if (page < 1 || page > streamData.value.pageNum) return;
+  curPage.value = page;
+}
+
+function streamShow(i, type) {
+  let num = type === 'noStream' ? i + props.streamList.length : i;
+  return streamData.value.capacity * (curPage.value - 1) < num && num <= streamData.value.capacity * curPage.value;
+}
 </script>
 
 <style lang="scss" scoped>
@@ -211,6 +275,7 @@ function changeCurPage(page) {}
     column-gap: 66px;
     align-items: center;
     width: 100%;
+    height: calc(100% - 76px);
     padding: 53px 49px 0;
 
     .arrow-left,
@@ -228,6 +293,8 @@ function changeCurPage(page) {}
       flex: 1;
       flex-wrap: wrap;
       gap: 24px;
+      align-content: flex-start;
+      width: calc(100vw - 326px);
       height: 100%;
       overflow: hidden;
 
@@ -236,9 +303,10 @@ function changeCurPage(page) {}
         display: flex;
         flex-direction: column;
         row-gap: 16px;
+        height: 158px;
 
         &.no-stream {
-          padding: 0 11px;
+          padding: 0 10px;
         }
 
         .live-wrapper-stream {
@@ -304,6 +372,7 @@ function changeCurPage(page) {}
           column-gap: 8px;
           align-items: center;
           justify-content: center;
+          width: 124px;
 
           .more {
             vertical-align: middle;
@@ -319,7 +388,8 @@ function changeCurPage(page) {}
     column-gap: 4px;
     align-items: center;
     justify-content: center;
-    padding: 32px 0;
+    height: 76px;
+    padding: 36px 0 32px;
 
     .circle-item {
       width: 8px;

+ 4 - 0
src/views/new_live/teacher/group.js

@@ -176,6 +176,10 @@ export function useInitListener({ roomData, streamList, roomContext, liveStat, s
     if (data.type === 'estoppel-fail') {
       Message.warning('禁言失败');
     }
+
+    if (data.type === 'kick-out-success') {
+      Message.success('踢出成功');
+    }
   });
 
   /**

+ 0 - 1
src/views/teacher/student_list/SendMessage.vue

@@ -64,6 +64,5 @@ function send() {
 
 <style lang="scss">
 @import '~@/styles/mixin';
-
 @include dialog;
 </style>

+ 5 - 16
stylelint.config.js

@@ -1,11 +1,6 @@
 module.exports = {
   defaultSeverity: 'warning',
-  extends: [
-    'stylelint-config-standard-scss',
-    'stylelint-config-recess-order',
-    'stylelint-config-prettier',
-    'stylelint-config-recommended-vue'
-  ],
+  extends: ['stylelint-config-standard-scss', 'stylelint-config-recess-order', 'stylelint-config-recommended-vue'],
   plugins: ['stylelint-declaration-block-no-ignored-properties'],
   rules: {
     'scss/no-global-function-names': null,
@@ -36,20 +31,14 @@ module.exports = {
     'function-url-quotes': 'always',
     // 指定字符串引号为单引号
     'string-quotes': 'single',
-    // 在规则的分号之前不允许有空格
-    'at-rule-semicolon-space-before': 'never',
-    // 首行不允许空行
-    'no-empty-first-line': true,
-    // 不允许使用 unicode 作为顺序标记
-    'unicode-bom': 'never',
+    // 为类选择器指定一个模式
+    'selector-class-pattern': null,
     'at-rule-no-unknown': [true, { ignoreAtRules: ['import', 'include', 'mixin', 'include', 'extend'] }],
     'max-nesting-depth': [10, { ignore: ['blockless-at-rules', 'pseudo-classes'] }],
     'selector-no-qualifying-type': [true, { ignore: ['attribute', 'class', 'id'] }],
-    // 为类选择器指定一个模式
-    'selector-class-pattern': null,
-    'declaration-colon-newline-after': null,
     'value-keyword-case': ['lower', { camelCaseSvgKeywords: true }],
     'value-no-vendor-prefix': [true, { ignoreValues: ['box'] }],
-    'selector-pseudo-class-no-unknown': [true, { ignorePseudoClasses: ['deep'] }]
+    'selector-pseudo-class-no-unknown': [true, { ignorePseudoClasses: ['deep'] }],
+    'declaration-property-value-no-unknown': true
   }
 };