eslint检查所有文件

This commit is contained in:
zyronon 2024-04-02 17:24:18 +08:00
parent 6f165f997a
commit 529557fc75
104 changed files with 1052 additions and 658 deletions

View File

@ -1,14 +1,19 @@
/* eslint-env node */ /* eslint-env node */
require('@rushstack/eslint-patch/modern-module-resolution') require('@rushstack/eslint-patch/modern-module-resolution');
module.exports = { module.exports = {
root: true, root: true,
'extends': [ 'extends': [
'plugin:vue/vue3-essential', 'plugin:vue/vue3-essential',
'eslint:recommended', 'eslint:recommended',
'@vue/eslint-config-typescript',
'@vue/eslint-config-prettier/skip-formatting' '@vue/eslint-config-prettier/skip-formatting'
], ],
parserOptions: { parserOptions: {
ecmaVersion: 'latest' ecmaVersion: 'latest'
} },
} rules: {
'vue/multi-word-component-names': 0
},
'ignorePatterns': ['vite.config.js', 'mobile-select.js']
};

View File

@ -1,7 +1,6 @@
import fs from 'fs' import fs from 'fs'
let read = './data/detail_comments_2024-03-29.json' let read = './data/detail_comments_2024-03-29.json'
let save = './data/'
let video_ids = [ let video_ids = [
'7260749400622894336', '7260749400622894336',

View File

@ -10,7 +10,7 @@ let saveFilePath = './imgs/'
const downloadImage = async (src, dest) => { const downloadImage = async (src, dest) => {
console.log('下载:', src) console.log('下载:', src)
return new Promise((resolve) => { return new Promise((resolve) => {
request.head(src, (err, res, body) => { request.head(src, (err) => {
if (err) { if (err) {
console.log(err) console.log(err)
return return

View File

@ -2,7 +2,6 @@ import fs from 'fs'
import { users } from './user/data.js' import { users } from './user/data.js'
let read = './post/data/' let read = './post/data/'
let save = './format/'
let max = 0 let max = 0
let map = [] let map = []

View File

@ -9,7 +9,7 @@ let inputData = JSON.parse(saveFileStr)
const downloadImage = async (src, dest, callback) => { const downloadImage = async (src, dest, callback) => {
console.log('下载:', src, dest, Date.now()) console.log('下载:', src, dest, Date.now())
return new Promise((resolve) => { return new Promise((resolve) => {
request.head(src, (err, res, body) => { request.head(src, (err) => {
if (err) { if (err) {
console.log(err) console.log(err)
return return
@ -27,12 +27,6 @@ const downloadImage = async (src, dest, callback) => {
let saveFilePath = './user-imgs/' let saveFilePath = './user-imgs/'
async function sleep(val) {
return new Promise((resolve) => {
setTimeout(resolve, val)
})
}
async function test(list) { async function test(list) {
for (let j = 0; j < list.length; j++) { for (let j = 0; j < list.length; j++) {
let a = list[j] let a = list[j]
@ -70,11 +64,7 @@ for (let i = 0; i < inputData.slice(0, 1111).length; i++) {
await test(v.white_cover_url) await test(v.white_cover_url)
delete v.cover_and_head_image_info delete v.cover_and_head_image_info
fs.writeFileSync(fileName, JSON.stringify(inputData, null, 2)) fs.writeFileSync(fileName, JSON.stringify(inputData, null, 2))
if ( if (v.share_info && v.share_info.share_image_url && v.share_info.share_image_url.url_list) {
v.share_info &&
v.share_info.share_image_url &&
v.share_info.share_image_url.url_list
) {
let r = await test2(v.share_info.share_image_url.url_list) let r = await test2(v.share_info.share_image_url.url_list)
if (r.length) { if (r.length) {
v.share_info.share_image_url.url_list = r v.share_info.share_image_url.url_list = r

View File

@ -10,7 +10,7 @@ let inputData = JSON.parse(saveFileStr)
const downloadImage = async (src, dest, callback) => { const downloadImage = async (src, dest, callback) => {
console.log('下载:', src, dest, Date.now()) console.log('下载:', src, dest, Date.now())
return new Promise((resolve) => { return new Promise((resolve) => {
request.head(src, (err, res, body) => { request.head(src, (err) => {
if (err) { if (err) {
console.log(err) console.log(err)
return return
@ -41,16 +41,16 @@ async function test(list) {
let name = nanoid() + '.png' let name = nanoid() + '.png'
imgList.push({ imgList.push({
name, name,
url: coverUrl, url: coverUrl
}) })
await downloadImage(coverUrl, saveFilePath + name, () => { await downloadImage(coverUrl, saveFilePath + name, () => {
// console.log('close', name) // console.log('close', name)
list[j] = { list[j] = {
info_list: [ info_list: [
{ {
url: name, url: name
}, }
], ]
} }
fs.writeFileSync(savefileName, JSON.stringify(inputData, null, 2)) fs.writeFileSync(savefileName, JSON.stringify(inputData, null, 2))
}) })
@ -59,9 +59,9 @@ async function test(list) {
list[j] = { list[j] = {
info_list: [ info_list: [
{ {
url: imgList[rIndex].name, url: imgList[rIndex].name
}, }
], ]
} }
console.log('重复') console.log('重复')
fs.writeFileSync(savefileName, JSON.stringify(inputData, null, 2)) fs.writeFileSync(savefileName, JSON.stringify(inputData, null, 2))
@ -77,7 +77,7 @@ for (let i = 0; i < inputData.slice(0, 111111).length; i++) {
let name = nanoid() + '.png' let name = nanoid() + '.png'
imgList.push({ imgList.push({
name, name,
url: url, url: url
}) })
await downloadImage(url, saveFilePath + name, () => { await downloadImage(url, saveFilePath + name, () => {
// console.log('close', name) // console.log('close', name)

View File

@ -17,6 +17,7 @@
"core-js": "3.21.1", "core-js": "3.21.1",
"dayjs": "1.11.0", "dayjs": "1.11.0",
"gl-matrix": "3.4.3", "gl-matrix": "3.4.3",
"jquery": "^3.7.1",
"mitt": "3.0.0", "mitt": "3.0.0",
"mobile-select": "1.1.2", "mobile-select": "1.1.2",
"mockjs": "^1.1.0", "mockjs": "^1.1.0",
@ -27,20 +28,36 @@
}, },
"devDependencies": { "devDependencies": {
"@iconify/vue": "^4.1.1", "@iconify/vue": "^4.1.1",
"@rushstack/eslint-patch": "^1.3.3",
"@types/jquery": "3.5.29",
"@types/lodash-es": "^4.17.9", "@types/lodash-es": "^4.17.9",
"@vitejs/plugin-vue": "4.0.0", "@vitejs/plugin-vue": "4.0.0",
"@vitejs/plugin-vue-jsx": "^3.1.0",
"@vue/eslint-config-prettier": "^8.0.0",
"@vue/eslint-config-typescript": "^12.0.0",
"eslint": "^8.57.0",
"eslint-plugin-vue": "^9.17.0",
"husky": "^9.0.11",
"less": "4.1.3", "less": "4.1.3",
"lint-staged": "^15.2.2",
"prettier": "^3.2.5",
"rollup-plugin-visualizer": "^5.9.2", "rollup-plugin-visualizer": "^5.9.2",
"unplugin-vue-define-options": "^1.4.1", "unplugin-vue-define-options": "^1.4.1",
"vite": "4.5.2", "vite": "4.5.2",
"vite-plugin-cdn-import": "0.3.5", "vite-plugin-cdn-import": "0.3.5",
"vite-plugin-compression": "^0.5.1", "vite-plugin-compression": "^0.5.1",
"vite-plugin-imagemin": "^0.6.1", "vite-plugin-imagemin": "^0.6.1"
"@rushstack/eslint-patch": "^1.3.3", },
"@vitejs/plugin-vue-jsx": "^3.1.0", "husky":{
"@vue/eslint-config-prettier": "^8.0.0", "hooks": {
"eslint": "^8.49.0", "pre-commit": "lint-staged"
"eslint-plugin-vue": "^9.17.0", }
"prettier": "^3.0.3" },
"lint-staged": {
"src/**": [
"prettier --write src/",
"eslint . --ext .vue,.js,.jsx,.cjs,.mjs --fix --ignore-path .gitignore",
"git add"
]
} }
} }

View File

@ -23,6 +23,9 @@ dependencies:
gl-matrix: gl-matrix:
specifier: 3.4.3 specifier: 3.4.3
version: 3.4.3 version: 3.4.3
jquery:
specifier: ^3.7.1
version: 3.7.1
mitt: mitt:
specifier: 3.0.0 specifier: 3.0.0
version: 3.0.0 version: 3.0.0
@ -34,10 +37,10 @@ dependencies:
version: 1.1.0 version: 1.1.0
pinia: pinia:
specifier: ^2.1.7 specifier: ^2.1.7
version: 2.1.7(vue@3.4.21) version: 2.1.7(typescript@5.4.3)(vue@3.4.21)
vue: vue:
specifier: 3.4.21 specifier: 3.4.21
version: 3.4.21 version: 3.4.21(typescript@5.4.3)
vue-router: vue-router:
specifier: 4.3.0 specifier: 4.3.0
version: 4.3.0(vue@3.4.21) version: 4.3.0(vue@3.4.21)
@ -52,6 +55,9 @@ devDependencies:
'@rushstack/eslint-patch': '@rushstack/eslint-patch':
specifier: ^1.3.3 specifier: ^1.3.3
version: 1.10.1 version: 1.10.1
'@types/jquery':
specifier: 3.5.29
version: 3.5.29
'@types/lodash-es': '@types/lodash-es':
specifier: ^4.17.9 specifier: ^4.17.9
version: 4.17.12 version: 4.17.12
@ -64,17 +70,26 @@ devDependencies:
'@vue/eslint-config-prettier': '@vue/eslint-config-prettier':
specifier: ^8.0.0 specifier: ^8.0.0
version: 8.0.0(eslint@8.57.0)(prettier@3.2.5) version: 8.0.0(eslint@8.57.0)(prettier@3.2.5)
'@vue/eslint-config-typescript':
specifier: ^12.0.0
version: 12.0.0(eslint-plugin-vue@9.24.0)(eslint@8.57.0)(typescript@5.4.3)
eslint: eslint:
specifier: ^8.49.0 specifier: ^8.57.0
version: 8.57.0 version: 8.57.0
eslint-plugin-vue: eslint-plugin-vue:
specifier: ^9.17.0 specifier: ^9.17.0
version: 9.24.0(eslint@8.57.0) version: 9.24.0(eslint@8.57.0)
husky:
specifier: ^9.0.11
version: 9.0.11
less: less:
specifier: 4.1.3 specifier: 4.1.3
version: 4.1.3 version: 4.1.3
lint-staged:
specifier: ^15.2.2
version: 15.2.2
prettier: prettier:
specifier: ^3.0.3 specifier: ^3.2.5
version: 3.2.5 version: 3.2.5
rollup-plugin-visualizer: rollup-plugin-visualizer:
specifier: ^5.9.2 specifier: ^5.9.2
@ -755,7 +770,7 @@ packages:
vue: '>=3' vue: '>=3'
dependencies: dependencies:
'@iconify/types': 2.0.0 '@iconify/types': 2.0.0
vue: 3.4.21 vue: 3.4.21(typescript@5.4.3)
dev: true dev: true
/@jambonn/vue-lazyload@1.0.9(vue@3.4.21): /@jambonn/vue-lazyload@1.0.9(vue@3.4.21):
@ -764,7 +779,7 @@ packages:
peerDependencies: peerDependencies:
vue: ^3.0.11 vue: ^3.0.11
dependencies: dependencies:
vue: 3.4.21 vue: 3.4.21(typescript@5.4.3)
dev: false dev: false
/@jridgewell/gen-mapping@0.3.3: /@jridgewell/gen-mapping@0.3.3:
@ -934,6 +949,16 @@ packages:
'@types/node': 20.11.30 '@types/node': 20.11.30
dev: true dev: true
/@types/jquery@3.5.29:
resolution: {integrity: sha512-oXQQC9X9MOPRrMhPHHOsXqeQDnWeCDT3PelUIg/Oy8FAbzSZtFHRjc7IpbfFVmpLtJ+UOoywpRsuO5Jxjybyeg==}
dependencies:
'@types/sizzle': 2.3.8
dev: true
/@types/json-schema@7.0.15:
resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
dev: true
/@types/keyv@3.1.4: /@types/keyv@3.1.4:
resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==}
dependencies: dependencies:
@ -966,12 +991,152 @@ packages:
'@types/node': 20.11.30 '@types/node': 20.11.30
dev: true dev: true
/@types/semver@7.5.8:
resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==}
dev: true
/@types/sizzle@2.3.8:
resolution: {integrity: sha512-0vWLNK2D5MT9dg0iOo8GlKguPAU02QjmZitPEsXRuJXU/OGIOt9vT9Fc26wtYuavLxtO45v9PGleoL9Z0k1LHg==}
dev: true
/@types/svgo@2.6.4: /@types/svgo@2.6.4:
resolution: {integrity: sha512-l4cmyPEckf8moNYHdJ+4wkHvFxjyW6ulm9l4YGaOxeyBWPhBOT0gvni1InpFPdzx1dKf/2s62qGITwxNWnPQng==} resolution: {integrity: sha512-l4cmyPEckf8moNYHdJ+4wkHvFxjyW6ulm9l4YGaOxeyBWPhBOT0gvni1InpFPdzx1dKf/2s62qGITwxNWnPQng==}
dependencies: dependencies:
'@types/node': 20.11.30 '@types/node': 20.11.30
dev: true dev: true
/@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.4.3):
resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==}
engines: {node: ^16.0.0 || >=18.0.0}
peerDependencies:
'@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha
eslint: ^7.0.0 || ^8.0.0
typescript: '*'
peerDependenciesMeta:
typescript:
optional: true
dependencies:
'@eslint-community/regexpp': 4.10.0
'@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.4.3)
'@typescript-eslint/scope-manager': 6.21.0
'@typescript-eslint/type-utils': 6.21.0(eslint@8.57.0)(typescript@5.4.3)
'@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.4.3)
'@typescript-eslint/visitor-keys': 6.21.0
debug: 4.3.4
eslint: 8.57.0
graphemer: 1.4.0
ignore: 5.3.1
natural-compare: 1.4.0
semver: 7.6.0
ts-api-utils: 1.3.0(typescript@5.4.3)
typescript: 5.4.3
transitivePeerDependencies:
- supports-color
dev: true
/@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.3):
resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==}
engines: {node: ^16.0.0 || >=18.0.0}
peerDependencies:
eslint: ^7.0.0 || ^8.0.0
typescript: '*'
peerDependenciesMeta:
typescript:
optional: true
dependencies:
'@typescript-eslint/scope-manager': 6.21.0
'@typescript-eslint/types': 6.21.0
'@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.3)
'@typescript-eslint/visitor-keys': 6.21.0
debug: 4.3.4
eslint: 8.57.0
typescript: 5.4.3
transitivePeerDependencies:
- supports-color
dev: true
/@typescript-eslint/scope-manager@6.21.0:
resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==}
engines: {node: ^16.0.0 || >=18.0.0}
dependencies:
'@typescript-eslint/types': 6.21.0
'@typescript-eslint/visitor-keys': 6.21.0
dev: true
/@typescript-eslint/type-utils@6.21.0(eslint@8.57.0)(typescript@5.4.3):
resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==}
engines: {node: ^16.0.0 || >=18.0.0}
peerDependencies:
eslint: ^7.0.0 || ^8.0.0
typescript: '*'
peerDependenciesMeta:
typescript:
optional: true
dependencies:
'@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.3)
'@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.4.3)
debug: 4.3.4
eslint: 8.57.0
ts-api-utils: 1.3.0(typescript@5.4.3)
typescript: 5.4.3
transitivePeerDependencies:
- supports-color
dev: true
/@typescript-eslint/types@6.21.0:
resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==}
engines: {node: ^16.0.0 || >=18.0.0}
dev: true
/@typescript-eslint/typescript-estree@6.21.0(typescript@5.4.3):
resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==}
engines: {node: ^16.0.0 || >=18.0.0}
peerDependencies:
typescript: '*'
peerDependenciesMeta:
typescript:
optional: true
dependencies:
'@typescript-eslint/types': 6.21.0
'@typescript-eslint/visitor-keys': 6.21.0
debug: 4.3.4
globby: 11.1.0
is-glob: 4.0.3
minimatch: 9.0.3
semver: 7.6.0
ts-api-utils: 1.3.0(typescript@5.4.3)
typescript: 5.4.3
transitivePeerDependencies:
- supports-color
dev: true
/@typescript-eslint/utils@6.21.0(eslint@8.57.0)(typescript@5.4.3):
resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==}
engines: {node: ^16.0.0 || >=18.0.0}
peerDependencies:
eslint: ^7.0.0 || ^8.0.0
dependencies:
'@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0)
'@types/json-schema': 7.0.15
'@types/semver': 7.5.8
'@typescript-eslint/scope-manager': 6.21.0
'@typescript-eslint/types': 6.21.0
'@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.3)
eslint: 8.57.0
semver: 7.6.0
transitivePeerDependencies:
- supports-color
- typescript
dev: true
/@typescript-eslint/visitor-keys@6.21.0:
resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==}
engines: {node: ^16.0.0 || >=18.0.0}
dependencies:
'@typescript-eslint/types': 6.21.0
eslint-visitor-keys: 3.4.3
dev: true
/@ungap/structured-clone@1.2.0: /@ungap/structured-clone@1.2.0:
resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==}
dev: true dev: true
@ -987,7 +1152,7 @@ packages:
'@babel/plugin-transform-typescript': 7.24.1(@babel/core@7.24.3) '@babel/plugin-transform-typescript': 7.24.1(@babel/core@7.24.3)
'@vue/babel-plugin-jsx': 1.1.5(@babel/core@7.24.3) '@vue/babel-plugin-jsx': 1.1.5(@babel/core@7.24.3)
vite: 4.5.2(less@4.1.3) vite: 4.5.2(less@4.1.3)
vue: 3.4.21 vue: 3.4.21(typescript@5.4.3)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
dev: true dev: true
@ -1000,7 +1165,7 @@ packages:
vue: ^3.2.25 vue: ^3.2.25
dependencies: dependencies:
vite: 4.5.2(less@4.1.3) vite: 4.5.2(less@4.1.3)
vue: 3.4.21 vue: 3.4.21(typescript@5.4.3)
dev: true dev: true
/@vue-macros/common@1.10.1(rollup@2.79.1)(vue@3.4.21): /@vue-macros/common@1.10.1(rollup@2.79.1)(vue@3.4.21):
@ -1018,7 +1183,7 @@ packages:
ast-kit: 0.11.3(rollup@2.79.1) ast-kit: 0.11.3(rollup@2.79.1)
local-pkg: 0.5.0 local-pkg: 0.5.0
magic-string-ast: 0.3.0 magic-string-ast: 0.3.0
vue: 3.4.21 vue: 3.4.21(typescript@5.4.3)
transitivePeerDependencies: transitivePeerDependencies:
- rollup - rollup
dev: true dev: true
@ -1106,6 +1271,27 @@ packages:
- '@types/eslint' - '@types/eslint'
dev: true dev: true
/@vue/eslint-config-typescript@12.0.0(eslint-plugin-vue@9.24.0)(eslint@8.57.0)(typescript@5.4.3):
resolution: {integrity: sha512-StxLFet2Qe97T8+7L8pGlhYBBr8Eg05LPuTDVopQV6il+SK6qqom59BA/rcFipUef2jD8P2X44Vd8tMFytfvlg==}
engines: {node: ^14.17.0 || >=16.0.0}
peerDependencies:
eslint: ^6.2.0 || ^7.0.0 || ^8.0.0
eslint-plugin-vue: ^9.0.0
typescript: '*'
peerDependenciesMeta:
typescript:
optional: true
dependencies:
'@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.4.3)
'@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.4.3)
eslint: 8.57.0
eslint-plugin-vue: 9.24.0(eslint@8.57.0)
typescript: 5.4.3
vue-eslint-parser: 9.4.2(eslint@8.57.0)
transitivePeerDependencies:
- supports-color
dev: true
/@vue/reactivity@3.4.21: /@vue/reactivity@3.4.21:
resolution: {integrity: sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw==} resolution: {integrity: sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw==}
dependencies: dependencies:
@ -1131,7 +1317,7 @@ packages:
dependencies: dependencies:
'@vue/compiler-ssr': 3.4.21 '@vue/compiler-ssr': 3.4.21
'@vue/shared': 3.4.21 '@vue/shared': 3.4.21
vue: 3.4.21 vue: 3.4.21(typescript@5.4.3)
/@vue/shared@3.4.21: /@vue/shared@3.4.21:
resolution: {integrity: sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==} resolution: {integrity: sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==}
@ -1159,6 +1345,11 @@ packages:
uri-js: 4.4.1 uri-js: 4.4.1
dev: true dev: true
/ansi-escapes@6.2.1:
resolution: {integrity: sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==}
engines: {node: '>=14.16'}
dev: true
/ansi-regex@2.1.1: /ansi-regex@2.1.1:
resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
@ -1170,6 +1361,11 @@ packages:
requiresBuild: true requiresBuild: true
dev: true dev: true
/ansi-regex@6.0.1:
resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==}
engines: {node: '>=12'}
dev: true
/ansi-styles@2.2.1: /ansi-styles@2.2.1:
resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
@ -1189,6 +1385,11 @@ packages:
color-convert: 2.0.1 color-convert: 2.0.1
dev: true dev: true
/ansi-styles@6.2.1:
resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==}
engines: {node: '>=12'}
dev: true
/anymatch@3.1.3: /anymatch@3.1.3:
resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
engines: {node: '>= 8'} engines: {node: '>= 8'}
@ -1359,6 +1560,12 @@ packages:
concat-map: 0.0.1 concat-map: 0.0.1
dev: true dev: true
/brace-expansion@2.0.1:
resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
dependencies:
balanced-match: 1.0.2
dev: true
/braces@3.0.2: /braces@3.0.2:
resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
engines: {node: '>=8'} engines: {node: '>=8'}
@ -1480,6 +1687,11 @@ packages:
supports-color: 7.2.0 supports-color: 7.2.0
dev: true dev: true
/chalk@5.3.0:
resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==}
engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
dev: true
/chokidar@3.6.0: /chokidar@3.6.0:
resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
engines: {node: '>= 8.10.0'} engines: {node: '>= 8.10.0'}
@ -1495,6 +1707,21 @@ packages:
fsevents: 2.3.3 fsevents: 2.3.3
dev: true dev: true
/cli-cursor@4.0.0:
resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
dependencies:
restore-cursor: 4.0.0
dev: true
/cli-truncate@4.0.0:
resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==}
engines: {node: '>=18'}
dependencies:
slice-ansi: 5.0.0
string-width: 7.1.0
dev: true
/cliui@8.0.1: /cliui@8.0.1:
resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
engines: {node: '>=12'} engines: {node: '>=12'}
@ -1531,6 +1758,10 @@ packages:
resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
dev: true dev: true
/colorette@2.0.20:
resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==}
dev: true
/combined-stream@1.0.8: /combined-stream@1.0.8:
resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
engines: {node: '>= 0.8'} engines: {node: '>= 0.8'}
@ -1545,6 +1776,11 @@ packages:
keypress: 0.1.0 keypress: 0.1.0
dev: false dev: false
/commander@11.1.0:
resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==}
engines: {node: '>=16'}
dev: true
/commander@2.20.3: /commander@2.20.3:
resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
dev: true dev: true
@ -1882,6 +2118,10 @@ packages:
resolution: {integrity: sha512-rxFVtrMGMFROr4qqU6n95rUi9IlfIm+lIAt+hOToy/9r6CDv0XiEcQdC3VP71y1pE5CFTzKV0RvxOGYCPWWHPw==} resolution: {integrity: sha512-rxFVtrMGMFROr4qqU6n95rUi9IlfIm+lIAt+hOToy/9r6CDv0XiEcQdC3VP71y1pE5CFTzKV0RvxOGYCPWWHPw==}
dev: true dev: true
/emoji-regex@10.3.0:
resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==}
dev: true
/emoji-regex@8.0.0: /emoji-regex@8.0.0:
resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
requiresBuild: true requiresBuild: true
@ -2315,6 +2555,10 @@ packages:
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
dev: true dev: true
/eventemitter3@5.0.1:
resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==}
dev: true
/exec-buffer@3.2.0: /exec-buffer@3.2.0:
resolution: {integrity: sha512-wsiD+2Tp6BWHoVv3B+5Dcx6E7u5zky+hUwOHjuH2hKSLR3dvRmX8fk8UD8uqQixHs4Wk6eDmiegVrMPjKj7wpA==} resolution: {integrity: sha512-wsiD+2Tp6BWHoVv3B+5Dcx6E7u5zky+hUwOHjuH2hKSLR3dvRmX8fk8UD8uqQixHs4Wk6eDmiegVrMPjKj7wpA==}
engines: {node: '>=4'} engines: {node: '>=4'}
@ -2382,6 +2626,21 @@ packages:
strip-final-newline: 2.0.0 strip-final-newline: 2.0.0
dev: true dev: true
/execa@8.0.1:
resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==}
engines: {node: '>=16.17'}
dependencies:
cross-spawn: 7.0.3
get-stream: 8.0.1
human-signals: 5.0.0
is-stream: 3.0.0
merge-stream: 2.0.0
npm-run-path: 5.3.0
onetime: 6.0.0
signal-exit: 4.1.0
strip-final-newline: 3.0.0
dev: true
/executable@4.1.1: /executable@4.1.1:
resolution: {integrity: sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==} resolution: {integrity: sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==}
engines: {node: '>=4'} engines: {node: '>=4'}
@ -2622,6 +2881,11 @@ packages:
engines: {node: 6.* || 8.* || >= 10.*} engines: {node: 6.* || 8.* || >= 10.*}
dev: true dev: true
/get-east-asian-width@1.2.0:
resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==}
engines: {node: '>=18'}
dev: true
/get-proxy@2.1.0: /get-proxy@2.1.0:
resolution: {integrity: sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw==} resolution: {integrity: sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw==}
engines: {node: '>=4'} engines: {node: '>=4'}
@ -2666,6 +2930,11 @@ packages:
engines: {node: '>=10'} engines: {node: '>=10'}
dev: true dev: true
/get-stream@8.0.1:
resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==}
engines: {node: '>=16'}
dev: true
/gifsicle@5.2.0: /gifsicle@5.2.0:
resolution: {integrity: sha512-vOIS3j0XoTCxq9pkGj43gEix82RkI5FveNgaFZutjbaui/HH+4fR8Y56dwXDuxYo8hR4xOo6/j2h1WHoQW6XLw==} resolution: {integrity: sha512-vOIS3j0XoTCxq9pkGj43gEix82RkI5FveNgaFZutjbaui/HH+4fR8Y56dwXDuxYo8hR4xOo6/j2h1WHoQW6XLw==}
engines: {node: '>=10'} engines: {node: '>=10'}
@ -2734,6 +3003,18 @@ packages:
slash: 3.0.0 slash: 3.0.0
dev: true dev: true
/globby@11.1.0:
resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
engines: {node: '>=10'}
dependencies:
array-union: 2.1.0
dir-glob: 3.0.1
fast-glob: 3.3.2
ignore: 5.3.1
merge2: 1.4.1
slash: 3.0.0
dev: true
/got@7.1.0: /got@7.1.0:
resolution: {integrity: sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==} resolution: {integrity: sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==}
engines: {node: '>=4'} engines: {node: '>=4'}
@ -2847,6 +3128,17 @@ packages:
engines: {node: '>=10.17.0'} engines: {node: '>=10.17.0'}
dev: true dev: true
/human-signals@5.0.0:
resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==}
engines: {node: '>=16.17.0'}
dev: true
/husky@9.0.11:
resolution: {integrity: sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==}
engines: {node: '>=18'}
hasBin: true
dev: true
/iconv-lite@0.6.3: /iconv-lite@0.6.3:
resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
@ -3050,6 +3342,18 @@ packages:
requiresBuild: true requiresBuild: true
dev: true dev: true
/is-fullwidth-code-point@4.0.0:
resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==}
engines: {node: '>=12'}
dev: true
/is-fullwidth-code-point@5.0.0:
resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==}
engines: {node: '>=18'}
dependencies:
get-east-asian-width: 1.2.0
dev: true
/is-gif@3.0.0: /is-gif@3.0.0:
resolution: {integrity: sha512-IqJ/jlbw5WJSNfwQ/lHEDXF8rxhRgF6ythk2oiEvhpG29F704eX9NO6TvPfMiq9DrbwgcEDnETYNcZDPewQoVw==} resolution: {integrity: sha512-IqJ/jlbw5WJSNfwQ/lHEDXF8rxhRgF6ythk2oiEvhpG29F704eX9NO6TvPfMiq9DrbwgcEDnETYNcZDPewQoVw==}
engines: {node: '>=6'} engines: {node: '>=6'}
@ -3118,6 +3422,11 @@ packages:
engines: {node: '>=8'} engines: {node: '>=8'}
dev: true dev: true
/is-stream@3.0.0:
resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
dev: true
/is-svg@4.4.0: /is-svg@4.4.0:
resolution: {integrity: sha512-v+AgVwiK5DsGtT9ng+m4mClp6zDAmwrW8nZi6Gg15qzvBnRWWdfWA1TGaXyCDnWq5g5asofIgMVl3PjKxvk1ug==} resolution: {integrity: sha512-v+AgVwiK5DsGtT9ng+m4mClp6zDAmwrW8nZi6Gg15qzvBnRWWdfWA1TGaXyCDnWq5g5asofIgMVl3PjKxvk1ug==}
engines: {node: '>=6'} engines: {node: '>=6'}
@ -3177,6 +3486,10 @@ packages:
bin-wrapper: 4.1.0 bin-wrapper: 4.1.0
dev: true dev: true
/jquery@3.7.1:
resolution: {integrity: sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==}
dev: false
/js-tokens@4.0.0: /js-tokens@4.0.0:
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
dev: true dev: true
@ -3277,6 +3590,42 @@ packages:
type-check: 0.4.0 type-check: 0.4.0
dev: true dev: true
/lilconfig@3.0.0:
resolution: {integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==}
engines: {node: '>=14'}
dev: true
/lint-staged@15.2.2:
resolution: {integrity: sha512-TiTt93OPh1OZOsb5B7k96A/ATl2AjIZo+vnzFZ6oHK5FuTk63ByDtxGQpHm+kFETjEWqgkF95M8FRXKR/LEBcw==}
engines: {node: '>=18.12.0'}
hasBin: true
dependencies:
chalk: 5.3.0
commander: 11.1.0
debug: 4.3.4
execa: 8.0.1
lilconfig: 3.0.0
listr2: 8.0.1
micromatch: 4.0.5
pidtree: 0.6.0
string-argv: 0.3.2
yaml: 2.3.4
transitivePeerDependencies:
- supports-color
dev: true
/listr2@8.0.1:
resolution: {integrity: sha512-ovJXBXkKGfq+CwmKTjluEqFi3p4h8xvkxGQQAQan22YCgef4KZ1mKGjzfGh6PL6AW5Csw0QiQPNuQyH+6Xk3hA==}
engines: {node: '>=18.0.0'}
dependencies:
cli-truncate: 4.0.0
colorette: 2.0.20
eventemitter3: 5.0.1
log-update: 6.0.0
rfdc: 1.3.1
wrap-ansi: 9.0.0
dev: true
/load-json-file@1.1.0: /load-json-file@1.1.0:
resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==} resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
@ -3311,6 +3660,17 @@ packages:
resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
dev: true dev: true
/log-update@6.0.0:
resolution: {integrity: sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==}
engines: {node: '>=18'}
dependencies:
ansi-escapes: 6.2.1
cli-cursor: 4.0.0
slice-ansi: 7.1.0
strip-ansi: 7.1.0
wrap-ansi: 9.0.0
dev: true
/logalot@2.1.0: /logalot@2.1.0:
resolution: {integrity: sha512-Ah4CgdSRfeCJagxQhcVNMi9BfGYyEKLa6d7OA6xSbld/Hg3Cf2QiOa1mDpmG7Ve8LOH6DN3mdttzjQAvWTyVkw==} resolution: {integrity: sha512-Ah4CgdSRfeCJagxQhcVNMi9BfGYyEKLa6d7OA6xSbld/Hg3Cf2QiOa1mDpmG7Ve8LOH6DN3mdttzjQAvWTyVkw==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
@ -3483,6 +3843,11 @@ packages:
engines: {node: '>=6'} engines: {node: '>=6'}
dev: true dev: true
/mimic-fn@4.0.0:
resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==}
engines: {node: '>=12'}
dev: true
/mimic-response@1.0.1: /mimic-response@1.0.1:
resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==}
engines: {node: '>=4'} engines: {node: '>=4'}
@ -3495,6 +3860,13 @@ packages:
brace-expansion: 1.1.11 brace-expansion: 1.1.11
dev: true dev: true
/minimatch@9.0.3:
resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==}
engines: {node: '>=16 || 14 >=14.17'}
dependencies:
brace-expansion: 2.0.1
dev: true
/minimist@1.2.8: /minimist@1.2.8:
resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
dev: true dev: true
@ -3625,6 +3997,13 @@ packages:
path-key: 3.1.1 path-key: 3.1.1
dev: true dev: true
/npm-run-path@5.3.0:
resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
dependencies:
path-key: 4.0.0
dev: true
/nth-check@2.1.1: /nth-check@2.1.1:
resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
dependencies: dependencies:
@ -3650,6 +4029,13 @@ packages:
mimic-fn: 2.1.0 mimic-fn: 2.1.0
dev: true dev: true
/onetime@6.0.0:
resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==}
engines: {node: '>=12'}
dependencies:
mimic-fn: 4.0.0
dev: true
/open@8.4.2: /open@8.4.2:
resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==}
engines: {node: '>=12'} engines: {node: '>=12'}
@ -3821,6 +4207,11 @@ packages:
engines: {node: '>=8'} engines: {node: '>=8'}
dev: true dev: true
/path-key@4.0.0:
resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==}
engines: {node: '>=12'}
dev: true
/path-parse@1.0.7: /path-parse@1.0.7:
resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
dev: true dev: true
@ -3859,6 +4250,12 @@ packages:
engines: {node: '>=8.6'} engines: {node: '>=8.6'}
dev: true dev: true
/pidtree@0.6.0:
resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==}
engines: {node: '>=0.10'}
hasBin: true
dev: true
/pify@2.3.0: /pify@2.3.0:
resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
@ -3875,7 +4272,7 @@ packages:
requiresBuild: true requiresBuild: true
dev: true dev: true
/pinia@2.1.7(vue@3.4.21): /pinia@2.1.7(typescript@5.4.3)(vue@3.4.21):
resolution: {integrity: sha512-+C2AHFtcFqjPih0zpYuvof37SFxMQ7OEG2zV9jRI12i9BOy3YQVAHwdKtyyc8pDcDyIc33WCIsZaCFWU7WWxGQ==} resolution: {integrity: sha512-+C2AHFtcFqjPih0zpYuvof37SFxMQ7OEG2zV9jRI12i9BOy3YQVAHwdKtyyc8pDcDyIc33WCIsZaCFWU7WWxGQ==}
peerDependencies: peerDependencies:
'@vue/composition-api': ^1.4.0 '@vue/composition-api': ^1.4.0
@ -3888,7 +4285,8 @@ packages:
optional: true optional: true
dependencies: dependencies:
'@vue/devtools-api': 6.5.1 '@vue/devtools-api': 6.5.1
vue: 3.4.21 typescript: 5.4.3
vue: 3.4.21(typescript@5.4.3)
vue-demi: 0.14.7(vue@3.4.21) vue-demi: 0.14.7(vue@3.4.21)
dev: false dev: false
@ -4104,11 +4502,23 @@ packages:
lowercase-keys: 1.0.1 lowercase-keys: 1.0.1
dev: true dev: true
/restore-cursor@4.0.0:
resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
dependencies:
onetime: 5.1.2
signal-exit: 3.0.7
dev: true
/reusify@1.0.4: /reusify@1.0.4:
resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
engines: {iojs: '>=1.0.0', node: '>=0.10.0'} engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
dev: true dev: true
/rfdc@1.3.1:
resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==}
dev: true
/rimraf@2.7.1: /rimraf@2.7.1:
resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==}
hasBin: true hasBin: true
@ -4262,11 +4672,32 @@ packages:
requiresBuild: true requiresBuild: true
dev: true dev: true
/signal-exit@4.1.0:
resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
engines: {node: '>=14'}
dev: true
/slash@3.0.0: /slash@3.0.0:
resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
engines: {node: '>=8'} engines: {node: '>=8'}
dev: true dev: true
/slice-ansi@5.0.0:
resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==}
engines: {node: '>=12'}
dependencies:
ansi-styles: 6.2.1
is-fullwidth-code-point: 4.0.0
dev: true
/slice-ansi@7.1.0:
resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==}
engines: {node: '>=18'}
dependencies:
ansi-styles: 6.2.1
is-fullwidth-code-point: 5.0.0
dev: true
/sort-keys-length@1.0.1: /sort-keys-length@1.0.1:
resolution: {integrity: sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==} resolution: {integrity: sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
@ -4348,6 +4779,11 @@ packages:
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
dev: true dev: true
/string-argv@0.3.2:
resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==}
engines: {node: '>=0.6.19'}
dev: true
/string-width@4.2.3: /string-width@4.2.3:
resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
engines: {node: '>=8'} engines: {node: '>=8'}
@ -4358,6 +4794,15 @@ packages:
strip-ansi: 6.0.1 strip-ansi: 6.0.1
dev: true dev: true
/string-width@7.1.0:
resolution: {integrity: sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==}
engines: {node: '>=18'}
dependencies:
emoji-regex: 10.3.0
get-east-asian-width: 1.2.0
strip-ansi: 7.1.0
dev: true
/string_decoder@1.1.1: /string_decoder@1.1.1:
resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==}
dependencies: dependencies:
@ -4379,6 +4824,13 @@ packages:
ansi-regex: 5.0.1 ansi-regex: 5.0.1
dev: true dev: true
/strip-ansi@7.1.0:
resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==}
engines: {node: '>=12'}
dependencies:
ansi-regex: 6.0.1
dev: true
/strip-bom@2.0.0: /strip-bom@2.0.0:
resolution: {integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==} resolution: {integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
@ -4402,6 +4854,11 @@ packages:
engines: {node: '>=6'} engines: {node: '>=6'}
dev: true dev: true
/strip-final-newline@3.0.0:
resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==}
engines: {node: '>=12'}
dev: true
/strip-indent@1.0.1: /strip-indent@1.0.1:
resolution: {integrity: sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==} resolution: {integrity: sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
@ -4542,6 +4999,15 @@ packages:
escape-string-regexp: 1.0.5 escape-string-regexp: 1.0.5
dev: true dev: true
/ts-api-utils@1.3.0(typescript@5.4.3):
resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==}
engines: {node: '>=16'}
peerDependencies:
typescript: '>=4.2.0'
dependencies:
typescript: 5.4.3
dev: true
/tslib@2.6.2: /tslib@2.6.2:
resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==}
dev: true dev: true
@ -4569,6 +5035,11 @@ packages:
engines: {node: '>=10'} engines: {node: '>=10'}
dev: true dev: true
/typescript@5.4.3:
resolution: {integrity: sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==}
engines: {node: '>=14.17'}
hasBin: true
/ufo@1.4.0: /ufo@1.4.0:
resolution: {integrity: sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==} resolution: {integrity: sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==}
dev: true dev: true
@ -4766,7 +5237,7 @@ packages:
'@vue/composition-api': '@vue/composition-api':
optional: true optional: true
dependencies: dependencies:
vue: 3.4.21 vue: 3.4.21(typescript@5.4.3)
dev: false dev: false
/vue-eslint-parser@9.4.2(eslint@8.57.0): /vue-eslint-parser@9.4.2(eslint@8.57.0):
@ -4793,7 +5264,7 @@ packages:
vue: ^3.2.0 vue: ^3.2.0
dependencies: dependencies:
'@vue/devtools-api': 6.5.1 '@vue/devtools-api': 6.5.1
vue: 3.4.21 vue: 3.4.21(typescript@5.4.3)
dev: false dev: false
/vue-switches@2.0.1: /vue-switches@2.0.1:
@ -4810,7 +5281,7 @@ packages:
csstype: 3.1.2 csstype: 3.1.2
dev: false dev: false
/vue@3.4.21: /vue@3.4.21(typescript@5.4.3):
resolution: {integrity: sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==} resolution: {integrity: sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==}
peerDependencies: peerDependencies:
typescript: '*' typescript: '*'
@ -4823,6 +5294,7 @@ packages:
'@vue/runtime-dom': 3.4.21 '@vue/runtime-dom': 3.4.21
'@vue/server-renderer': 3.4.21(vue@3.4.21) '@vue/server-renderer': 3.4.21(vue@3.4.21)
'@vue/shared': 3.4.21 '@vue/shared': 3.4.21
typescript: 5.4.3
/webpack-sources@3.2.3: /webpack-sources@3.2.3:
resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==}
@ -4857,6 +5329,15 @@ packages:
strip-ansi: 6.0.1 strip-ansi: 6.0.1
dev: true dev: true
/wrap-ansi@9.0.0:
resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==}
engines: {node: '>=18'}
dependencies:
ansi-styles: 6.2.1
string-width: 7.1.0
strip-ansi: 7.1.0
dev: true
/wrappy@1.0.2: /wrappy@1.0.2:
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
requiresBuild: true requiresBuild: true
@ -4889,6 +5370,11 @@ packages:
resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
dev: true dev: true
/yaml@2.3.4:
resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==}
engines: {node: '>= 14'}
dev: true
/yargs-parser@21.1.1: /yargs-parser@21.1.1:
resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
engines: {node: '>=12'} engines: {node: '>=12'}

View File

@ -76,10 +76,14 @@ export default {
try { try {
navigator.control.gesture(false) navigator.control.gesture(false)
} catch (e) {} } catch (e) {
//
}
try { try {
navigator.control.longpressMenu(false) navigator.control.longpressMenu(false)
} catch (e) {} } catch (e) {
//
}
document.onselectstart = new Function('return false') // document.onselectstart = new Function('return false') //
} }
} }

View File

@ -1,5 +1,4 @@
import CONST_VAR from '../../utils/const_var' import CONST_VAR from '../../utils/const_var'
import posts6 from '@/assets/data/posts6.json'
export default { export default {
videos: [], videos: [],

View File

@ -28,7 +28,7 @@ export default {
return {} return {}
}, },
methods: { methods: {
changeText(e) { changeText() {
this.$emit('update:modelValue', this.$el.innerText) this.$emit('update:modelValue', this.$el.innerText)
} }
} }

View File

@ -27,7 +27,7 @@
import bus, { EVENT_KEY } from '../utils/bus' import bus, { EVENT_KEY } from '../utils/bus'
export default { export default {
name: 'Footer', name: 'BaseFooter',
props: ['initTab', 'isWhite'], props: ['initTab', 'isWhite'],
data() { data() {
return { return {
@ -39,8 +39,8 @@ export default {
}, },
created() { created() {
bus.on('setFooterVisible', (e) => (this.visible = e)) bus.on('setFooterVisible', (e) => (this.visible = e))
bus.on(EVENT_KEY.ENTER_FULLSCREEN, (e) => (this.visible = false)) bus.on(EVENT_KEY.ENTER_FULLSCREEN, () => (this.visible = false))
bus.on(EVENT_KEY.EXIT_FULLSCREEN, (e) => (this.visible = true)) bus.on(EVENT_KEY.EXIT_FULLSCREEN, () => (this.visible = true))
}, },
unmounted() { unmounted() {
bus.off(EVENT_KEY.ENTER_FULLSCREEN) bus.off(EVENT_KEY.ENTER_FULLSCREEN)

View File

@ -5,7 +5,7 @@
//使FromBottomDialog.vuejs appenddom //使FromBottomDialog.vuejs appenddom
//使app //使app
export default { export default {
name: 'Mask', name: 'BaseMask',
props: { props: {
mode: { mode: {
type: String, type: String,

View File

@ -77,7 +77,12 @@ export default {
name: 'Call', name: 'Call',
components: {}, components: {},
props: { props: {
modelValue: false modelValue: {
type: Boolean,
default() {
return false
}
}
}, },
data() { data() {
return { return {
@ -118,7 +123,7 @@ export default {
this.callFloatLeft = e.touches[0].pageX - 35 this.callFloatLeft = e.touches[0].pageX - 35
this.callFloatTop = e.touches[0].pageY - 40 this.callFloatTop = e.touches[0].pageY - 40
}, },
touchend(e) { touchend() {
this.callFloatTransitionTime = 300 this.callFloatTransitionTime = 300
if (this.callFloatLeft < this.width / 2) { if (this.callFloatLeft < this.width / 2) {
this.callFloatLeft = 15 this.callFloatLeft = 15

View File

@ -23,7 +23,8 @@
<div class="comment"> <div class="comment">
<div class="wrapper" v-if="comments.length"> <div class="wrapper" v-if="comments.length">
<div class="items"> <div class="items">
<div class="item" v-for="item in comments" v-longpress="(e) => showOptions(item)"> <div class="item" :key="i" v-for="(item, i) in comments">
<!-- v-longpress="(e) => showOptions(item)"-->
<div class="main"> <div class="main">
<div class="content"> <div class="content">
<img :src="_checkImgUrl(item.avatar)" alt="" class="head-image" /> <img :src="_checkImgUrl(item.avatar)" alt="" class="head-image" />
@ -69,7 +70,7 @@
</div> </div>
<div class="replies" v-if="Number(item.sub_comment_count)"> <div class="replies" v-if="Number(item.sub_comment_count)">
<template v-if="item.showChildren"> <template v-if="item.showChildren">
<div class="reply" v-for="child in item.children"> <div class="reply" :key="i" v-for="(child, i) in item.children">
<!-- v-longpress="e => showOptions(child)"--> <!-- v-longpress="e => showOptions(child)"-->
<div class="content"> <div class="content">
<img :src="_checkImgUrl(child.avatar)" alt="" class="head-image" /> <img :src="_checkImgUrl(child.avatar)" alt="" class="head-image" />
@ -129,12 +130,12 @@
</div> </div>
<Loading v-else style="position: absolute" /> <Loading v-else style="position: absolute" />
<transition name="fade"> <transition name="fade">
<Mask v-if="isCall" mode="lightgray" @click="isCall = false" /> <BaseMask v-if="isCall" mode="lightgray" @click="isCall = false" />
</transition> </transition>
<div class="input-toolbar"> <div class="input-toolbar">
<transition name="fade"> <transition name="fade">
<div class="call-friend" v-if="isCall"> <div class="call-friend" v-if="isCall">
<div class="friend" v-for="item in friends.all" @click="toggleCall(item)"> <div class="friend" :key="i" v-for="(item, i) in friends.all" @click="toggleCall(item)">
<img <img
:style="item.select ? 'opacity: .5;' : ''" :style="item.select ? 'opacity: .5;' : ''"
class="avatar" class="avatar"
@ -179,12 +180,10 @@ import Search from './Search'
import { $no, _checkImgUrl, _formatNumber, sampleSize } from '@/utils' import { $no, _checkImgUrl, _formatNumber, sampleSize } from '@/utils'
import { useBaseStore } from '@/store/pinia' import { useBaseStore } from '@/store/pinia'
import { videoComments } from '@/api/videos' import { videoComments } from '@/api/videos'
import Popover from '@/pages/login/components/Tooltip.vue'
export default { export default {
name: 'Comment', name: 'Comment',
components: { components: {
Popover,
AutoInput, AutoInput,
ConfirmDialog, ConfirmDialog,
FromBottomDialog, FromBottomDialog,
@ -192,7 +191,12 @@ export default {
Search Search
}, },
props: { props: {
modelValue: false, modelValue: {
type: Boolean,
default() {
return false
}
},
videoId: { videoId: {
type: String, type: String,
default: null default: null
@ -300,7 +304,6 @@ export default {
row.user_digged = !row.user_digged row.user_digged = !row.user_digged
}, },
showOptions(row) { showOptions(row) {
return
this.$showSelectDialog(this.options, (e) => { this.$showSelectDialog(this.options, (e) => {
if (e.id === 1) { if (e.id === 1) {
this.selectRow = row this.selectRow = row
@ -437,6 +440,7 @@ export default {
span { span {
margin-right: 5rem; margin-right: 5rem;
} }
svg { svg {
font-size: 10rem; font-size: 10rem;
} }

View File

@ -49,7 +49,12 @@ export default {
name: 'DouyinCode', name: 'DouyinCode',
props: { props: {
item: {}, item: {},
modelValue: false modelValue: {
type: Boolean,
default() {
return false
}
}
}, },
data() { data() {
return {} return {}
@ -108,6 +113,7 @@ export default {
-webkit-line-clamp: 1; // -webkit-line-clamp: 1; //
} }
} }
.code { .code {
width: 60rem; width: 60rem;
} }

View File

@ -1,6 +1,6 @@
<template> <template>
<div class="posters"> <div class="posters">
<div class="poster-item" v-for="(i, index) in list" @click="goDetail(index)"> <div class="poster-item" :key="index" v-for="(i, index) in list" @click="goDetail(index)">
<img class="poster" v-lazy="_checkImgUrl(i.video.cover.url_list[0])" alt="" /> <img class="poster" v-lazy="_checkImgUrl(i.video.cover.url_list[0])" alt="" />
<div class="num" v-if="mode === 'normal'"> <div class="num" v-if="mode === 'normal'">
<Icon icon="icon-park-outline:like" /> <Icon icon="icon-park-outline:like" />

View File

@ -30,7 +30,7 @@
</template> </template>
<script> <script>
//TODO  //TODO
export default { export default {
name: 'Search', name: 'Search',
props: { props: {

View File

@ -16,7 +16,12 @@
<dy-back mode="light" img="close" direction="right" @click.stop="closeShare"></dy-back> <dy-back mode="light" img="close" direction="right" @click.stop="closeShare"></dy-back>
</div> </div>
<div class="friends list"> <div class="friends list">
<div class="option" v-for="item in friends.all" @click.stop="toggleCall(item)"> <div
class="option"
:key="i"
v-for="(item, i) in friends.all"
@click.stop="toggleCall(item)"
>
<img <img
:style="item.select ? 'opacity: .5;' : ''" :style="item.select ? 'opacity: .5;' : ''"
class="avatar" class="avatar"
@ -137,39 +142,48 @@
<script> <script>
import { mapState } from 'pinia' import { mapState } from 'pinia'
import Check from './Check'
import FromBottomDialog from './dialog/FromBottomDialog' import FromBottomDialog from './dialog/FromBottomDialog'
import DouyinCode from './DouyinCode'
import { useBaseStore } from '@/store/pinia' import { useBaseStore } from '@/store/pinia'
import { $no, _copy } from '@/utils' import { $no, _copy } from '@/utils'
export default { export default {
name: 'Share', name: 'Share',
components: { components: {
FromBottomDialog, FromBottomDialog
Check,
DouyinCode
}, },
props: { props: {
modelValue: false, modelValue: {
type: Boolean,
default() {
return false
}
},
item: {}, item: {},
videoId: { videoId: {
type: String, type: String,
default: null default() {
return null
}
}, },
pageId: { pageId: {
type: String, type: String,
default: 'home-index' default() {
return 'home-index'
}
}, },
canDownload: { canDownload: {
type: Boolean, type: Boolean,
default: true default() {
return true
}
}, },
mode: { mode: {
type: String, type: String,
default: 'video' default() {
//music return 'video'
//qrcode //music
//qrcode
}
} }
}, },
computed: { computed: {

View File

@ -141,7 +141,7 @@
</div> </div>
<div class="other"> <div class="other">
<div class="scroll-x" @touchmove="stop"> <div class="scroll-x" @touchmove="stop">
<div class="item" v-for="item in props.currentItem.author.card_entries"> <div class="item" :key="i" v-for="(item, i) in props.currentItem.author.card_entries">
<img :src="_checkImgUrl(item.icon_dark.url_list[0])" alt="" /> <img :src="_checkImgUrl(item.icon_dark.url_list[0])" alt="" />
<div class="right"> <div class="right">
<div class="top">{{ item.title }}</div> <div class="top">{{ item.title }}</div>
@ -157,6 +157,7 @@
class="follow-wrapper" class="follow-wrapper"
:class="props.currentItem.author.follow_status ? 'follow-wrapper-followed' : ''" :class="props.currentItem.author.follow_status ? 'follow-wrapper-followed' : ''"
> >
<!-- eslint-disable-next-line vue/no-mutating-props-->
<div class="no-follow" @click="props.currentItem.author.follow_status = 1"> <div class="no-follow" @click="props.currentItem.author.follow_status = 1">
<img src="@/assets/img/icon/add-white.png" alt="" /> <img src="@/assets/img/icon/add-white.png" alt="" />
<span>关注</span> <span>关注</span>
@ -193,7 +194,7 @@
<img src="@/assets/img/icon/about-gray.png" /> <img src="@/assets/img/icon/about-gray.png" />
</div> </div>
<div class="friends" @touchmove="stop"> <div class="friends" @touchmove="stop">
<div class="friend" v-for="item in baseStore.friends.all"> <div class="friend" :key="i" v-for="(item, i) in baseStore.friends.all">
<img <img
:style="item.select ? 'opacity: .5;' : ''" :style="item.select ? 'opacity: .5;' : ''"
class="avatar" class="avatar"
@ -238,9 +239,8 @@ import { useNav } from '@/utils/hooks/useNav'
import Posters from '@/components/Posters' import Posters from '@/components/Posters'
import { DefaultUser } from '@/utils/const_var' import { DefaultUser } from '@/utils/const_var'
import Loading from '@/components/Loading.vue' import Loading from '@/components/Loading.vue'
import { FILE_URL } from '@/config'
import { useBaseStore } from '@/store/pinia' import { useBaseStore } from '@/store/pinia'
import { userinfo, userVideoList } from '@/api/user' import { userVideoList } from '@/api/user'
const $nav = useNav() const $nav = useNav()
const baseStore = useBaseStore() const baseStore = useBaseStore()
@ -248,14 +248,18 @@ const emit = defineEmits(['update:currentItem', 'back'])
const props = defineProps({ const props = defineProps({
currentItem: { currentItem: {
type: Object, type: Object,
default: { default() {
author: DefaultUser, return {
aweme_list: [] author: DefaultUser,
aweme_list: []
}
} }
}, },
active: { active: {
type: Boolean, type: Boolean,
default: false default() {
return false
}
} }
}) })
const main = ref(null) const main = ref(null)
@ -308,7 +312,7 @@ watch(
watch( watch(
() => props.currentItem.author.uid, () => props.currentItem.author.uid,
async (newVal) => { async () => {
if (props.currentItem.author.uid !== state.uid) { if (props.currentItem.author.uid !== state.uid) {
state.uid = props.currentItem.author.uid state.uid = props.currentItem.author.uid
emit('update:currentItem', Object.assign(props.currentItem, { aweme_list: [] })) emit('update:currentItem', Object.assign(props.currentItem, { aweme_list: [] }))
@ -322,9 +326,7 @@ function stop(e) {
function followButton() {} function followButton() {}
function back() {} function scroll() {
function scroll(e) {
// console.log('scroll', page.value.scrollTop) // console.log('scroll', page.value.scrollTop)
let scrollTop = page.value.scrollTop let scrollTop = page.value.scrollTop
let totalY = total.value.getBoundingClientRect().y let totalY = total.value.getBoundingClientRect().y
@ -366,7 +368,7 @@ function touchMove(e) {
} }
} }
function touchEnd(e) { function touchEnd() {
if (state.isTop) { if (state.isTop) {
state.isTop = false state.isTop = false
cover.value.style.transition = 'all .3s' cover.value.style.transition = 'all .3s'

View File

@ -160,7 +160,7 @@ export default {
this.$setCss(this.$refs.dialog, 'transform', `translate3d(0,${this.moveYDistance}px,0)`) this.$setCss(this.$refs.dialog, 'transform', `translate3d(0,${this.moveYDistance}px,0)`)
} }
}, },
end(e) { end() {
// //
if (Date.now() - this.startTime < 150 && Math.abs(this.moveYDistance) < 30) { if (Date.now() - this.startTime < 150 && Math.abs(this.moveYDistance) < 30) {
return return

View File

@ -1,7 +1,7 @@
<template> <template>
<div class="SelectDialog" @click="$emit('cancel')"> <div class="SelectDialog" @click="$emit('cancel')">
<div class="content"> <div class="content">
<div class="item" v-for="item in list" @click.stop="$emit('ok', item)"> <div class="item" :key="i" v-for="(item, i) in list" @click.stop="$emit('ok', item)">
{{ item.name }} {{ item.name }}
</div> </div>
</div> </div>

View File

@ -185,7 +185,7 @@ export default {
this.currentTime = Math.ceil(e.target.currentTime) this.currentTime = Math.ceil(e.target.currentTime)
this.playX = (this.currentTime - 1) * this.step this.playX = (this.currentTime - 1) * this.step
} }
video.addEventListener('loadedmetadata', (e) => { video.addEventListener('loadedmetadata', () => {
this.videoScreenHeight = video.videoHeight / (video.videoWidth / this.width) this.videoScreenHeight = video.videoHeight / (video.videoWidth / this.width)
this.duration = video.duration this.duration = video.duration
this.progressBarRect = this.$refs.progress.getBoundingClientRect() this.progressBarRect = this.$refs.progress.getBoundingClientRect()
@ -193,7 +193,7 @@ export default {
video.addEventListener('timeupdate', fun) video.addEventListener('timeupdate', fun)
}) })
let eventTester = (e, t) => { let eventTester = (e) => {
video.addEventListener( video.addEventListener(
e, e,
() => { () => {
@ -287,7 +287,7 @@ export default {
this.commentVisible = true this.commentVisible = true
} }
}, },
onCloseComments(id) { onCloseComments() {
if (this.commentVisible) { if (this.commentVisible) {
Utils.$setCss(this.$refs.video, 'transition-duration', `300ms`) Utils.$setCss(this.$refs.video, 'transition-duration', `300ms`)
Utils.$setCss(this.$refs.video, 'height', '100%') Utils.$setCss(this.$refs.video, 'height', '100%')

View File

@ -63,7 +63,7 @@ export default {
style={{ style={{
width: this.tabStyleWidth || 100 / this.tabTexts.length + '%' width: this.tabStyleWidth || 100 / this.tabTexts.length + '%'
}} }}
onClick={(e) => this.changeIndex(index)} onClick={() => this.changeIndex(index)}
> >
<span> {item}</span> <span> {item}</span>
</div> </div>

View File

@ -63,7 +63,7 @@ export default {
style={{ style={{
width: this.tabStyleWidth || 100 / this.tabTexts.length + '%' width: this.tabStyleWidth || 100 / this.tabTexts.length + '%'
}} }}
onClick={(e) => this.changeIndex(index)} onClick={( ) => this.changeIndex(index)}
> >
<span> {item}</span> <span> {item}</span>
</div> </div>

View File

@ -1,6 +1,5 @@
<script setup> <script setup>
import { reactive } from 'vue' import { reactive } from 'vue'
import bus from '../../utils/bus'
const props = defineProps({ const props = defineProps({
item: { item: {

View File

@ -1,7 +1,6 @@
<script setup> <script setup>
import BaseMusic from '../BaseMusic' import BaseMusic from '../BaseMusic'
import Utils from '../../utils' import Utils from '../../utils'
import { reactive } from 'vue'
import bus, { EVENT_KEY } from '@/utils/bus' import bus, { EVENT_KEY } from '@/utils/bus'
import { Icon } from '@iconify/vue' import { Icon } from '@iconify/vue'
@ -26,7 +25,6 @@ const props = defineProps({
} }
}) })
const emit = defineEmits(['update:item', 'goUserInfo', 'showComments', 'showShare', 'goMusic']) const emit = defineEmits(['update:item', 'goUserInfo', 'showComments', 'showShare', 'goMusic'])
const state = reactive({})
function loved() { function loved() {
Utils.updateItem(props, 'isLoved', !props.item.isLoved, emit) Utils.updateItem(props, 'isLoved', !props.item.isLoved, emit)

View File

@ -8,7 +8,7 @@
@touchmove="touchMove" @touchmove="touchMove"
@touchend="touchEnd" @touchend="touchEnd"
> >
<div class="img-slide-item" v-for="(img, index) in item.imgs"> <div class="img-slide-item" :key="index" v-for="(img, index) in item.imgs">
<img :ref="(e) => setItemRef(e, 'itemRefs')" :src="img + '&d=' + index" /> <img :ref="(e) => setItemRef(e, 'itemRefs')" :src="img + '&d=' + index" />
</div> </div>
</div> </div>
@ -40,7 +40,7 @@
@touchmove="progressBarTouchMove" @touchmove="progressBarTouchMove"
@touchend="progressBarTouchMEnd" @touchend="progressBarTouchMEnd"
> >
<div class="bar" v-for="(img, index) in item.imgs"> <div class="bar" :key="index" v-for="(img, index) in item.imgs">
<div class="progress" :style="getWidth(index)"></div> <div class="progress" :style="getWidth(index)"></div>
</div> </div>
</div> </div>
@ -50,6 +50,7 @@
<img <img
:src="img + '&d=' + index" :src="img + '&d=' + index"
:class="{ 'preview-img': index === state.localIndex }" :class="{ 'preview-img': index === state.localIndex }"
:key="index"
v-for="(img, index) in props.item.imgs" v-for="(img, index) in props.item.imgs"
:ref="(e) => setItemRef(e, 'previewImgs')" :ref="(e) => setItemRef(e, 'previewImgs')"
/> />
@ -86,19 +87,19 @@
<script setup lang="jsx"> <script setup lang="jsx">
import enums from '../../utils/enums' import enums from '../../utils/enums'
import Utils, { $no, $notice } from '../../utils' import Utils from '../../utils'
import GM, { $notice } from '../../utils'
import { mat4 } from 'gl-matrix' import { mat4 } from 'gl-matrix'
import { Icon } from '@iconify/vue' import { Icon } from '@iconify/vue'
import { import {
onMounted, nextTick,
onBeforeUpdate, onBeforeUpdate,
onMounted,
onUnmounted,
provide,
reactive, reactive,
ref, ref,
watch, watch
computed,
provide,
nextTick,
onUnmounted
} from 'vue' } from 'vue'
import { import {
getSlideDistance, getSlideDistance,
@ -111,9 +112,9 @@ import {
import { SlideAlbumOperationStatus, SlideItemPlayStatus, SlideType } from '../../utils/const_var' import { SlideAlbumOperationStatus, SlideItemPlayStatus, SlideType } from '../../utils/const_var'
import ItemToolbar from './ItemToolbar' import ItemToolbar from './ItemToolbar'
import ItemDesc from './ItemDesc' import ItemDesc from './ItemDesc'
import GM from '../../utils'
import { cloneDeep } from '@/utils' import { cloneDeep } from '@/utils'
import bus, { EVENT_KEY } from '../../utils/bus' import bus, { EVENT_KEY } from '../../utils/bus'
import $ from 'jquery'
let out = new Float32Array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]) let out = new Float32Array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
let ov = new Float32Array([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]) let ov = new Float32Array([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1])
@ -348,7 +349,7 @@ onBeforeUpdate(() => {
watch( watch(
() => state.localIndex, () => state.localIndex,
(newVal) => { () => {
GM.$setCss(wrapperEl.value, 'transition-duration', `300ms`) GM.$setCss(wrapperEl.value, 'transition-duration', `300ms`)
GM.$setCss( GM.$setCss(
wrapperEl.value, wrapperEl.value,
@ -594,7 +595,7 @@ function setItemRef(el, key) {
el && state[key].push(el) el && state[key].push(el)
} }
function canNext(isNext, e) { function canNext(isNext) {
let res = !( let res = !(
(state.localIndex === 0 && !isNext) || (state.localIndex === 0 && !isNext) ||
(state.localIndex === props.item.imgs.length - 1 && isNext) (state.localIndex === props.item.imgs.length - 1 && isNext)

View File

@ -4,7 +4,8 @@
<div <div
class="bullet" class="bullet"
:class="{ active: currentSlideItemIndex === item - 1 }" :class="{ active: currentSlideItemIndex === item - 1 }"
v-for="item in slideItems.length" :key="i"
v-for="(item, i) in slideItems.length"
></div> ></div>
</div> </div>
@ -23,14 +24,11 @@
<script> <script>
import bus from '../../utils/bus' import bus from '../../utils/bus'
import Loading from '../Loading'
import { useBaseStore } from '@/store/pinia' import { useBaseStore } from '@/store/pinia'
export default { export default {
name: 'BaseSlideList', name: 'BaseSlideList',
components: { components: {},
Loading
},
props: { props: {
canMove: { canMove: {
type: Boolean, type: Boolean,
@ -100,6 +98,7 @@ export default {
transform: `translate3d(0, ${this.homeLoadingMoveYDistance > 60 ? 60 : this.homeLoadingMoveYDistance}px, 0)` transform: `translate3d(0, ${this.homeLoadingMoveYDistance > 60 ? 60 : this.homeLoadingMoveYDistance}px, 0)`
} }
} }
return {}
} }
}, },
data() { data() {
@ -199,7 +198,7 @@ export default {
) )
} }
}, },
async checkChildren(init) { async checkChildren() {
this.slideList = this.$refs.slideList this.slideList = this.$refs.slideList
this.slideItems = this.slideList.children this.slideItems = this.slideList.children
this.wrapperWidth = this.$getCss(this.slideList, 'width') this.wrapperWidth = this.$getCss(this.slideList, 'width')

View File

@ -18,6 +18,7 @@
<div class="poster-wrapper"> <div class="poster-wrapper">
<div <div
class="poster-item" class="poster-item"
:key="index"
v-for="(i, index) in modelValue.videos.slice(0, 3)" v-for="(i, index) in modelValue.videos.slice(0, 3)"
@click="globalMethods.$no" @click="globalMethods.$no"
> >
@ -36,14 +37,12 @@
</div> </div>
</template> </template>
<script> <script>
import Posters from '../Posters'
import globalMethods from '../../utils' import globalMethods from '../../utils'
import BaseButton from '../BaseButton' import BaseButton from '../BaseButton'
export default { export default {
name: 'SlideUser', name: 'SlideUser',
components: { components: {
Posters,
BaseButton BaseButton
}, },
props: { props: {

View File

@ -1,5 +1,5 @@
<script setup lang="jsx"> <script setup lang="jsx">
import { createApp, onMounted, reactive, ref, render, watch } from 'vue' import { createApp, onMounted, reactive, ref, render as vueRender, watch } from 'vue'
import GM from '../../utils' import GM from '../../utils'
import { import {
getSlideDistance, getSlideDistance,
@ -125,7 +125,7 @@ watch(
watch( watch(
() => props.active, () => props.active,
(newVal, oldVal) => { (newVal) => {
if (newVal && !props.list.length) { if (newVal && !props.list.length) {
return emit('refresh') return emit('refresh')
} }
@ -206,10 +206,10 @@ function getInsEl(item, index, play = false) {
if (import.meta.env.PROD) { if (import.meta.env.PROD) {
parent.classList.add('slide-item') parent.classList.add('slide-item')
parent.setAttribute('data-index', index) parent.setAttribute('data-index', index)
render(slideVNode, parent) vueRender(slideVNode, parent)
appInsMap.set(index, { appInsMap.set(index, {
unmount: () => { unmount: () => {
render(null, parent) vueRender(null, parent)
parent.remove() parent.remove()
} }
}) })

View File

@ -1,12 +1,10 @@
import resource from '../assets/data/resource.js' import resource from '../assets/data/resource.js'
import posts6 from '@/assets/data/posts6.json' import posts6 from '@/assets/data/posts6.json'
import { _copy, cloneDeep, random, sampleSize } from '@/utils' import { cloneDeep, random } from '@/utils'
import { BASE_URL, FILE_URL } from '@/config' import { BASE_URL, FILE_URL } from '@/config'
import { useBaseStore } from '@/store/pinia' import { useBaseStore } from '@/store/pinia'
import axiosInstance from '@/utils/request' import axiosInstance from '@/utils/request'
import MockAdapter from 'axios-mock-adapter' import MockAdapter from 'axios-mock-adapter'
import Mock from 'mockjs'
import { panel } from '@/api/user'
const mock = new MockAdapter(axiosInstance, { delayResponse: 300 }) const mock = new MockAdapter(axiosInstance, { delayResponse: 300 })
@ -24,6 +22,7 @@ let allRecommendVideos = posts6.map((v) => {
}) })
// console.log('allRecommendVideos', allRecommendVideos) // console.log('allRecommendVideos', allRecommendVideos)
// eslint-disable-next-line no-unused-vars
let t = [ let t = [
{ {
type: 'imgs', type: 'imgs',
@ -47,6 +46,7 @@ let t = [
} }
} }
] ]
// allRecommendVideos.unshift(...t) // allRecommendVideos.unshift(...t)
// { // {
// type: 'user-imgs', // type: 'user-imgs',
@ -210,7 +210,7 @@ export async function startMock() {
] ]
}) })
mock.onGet(/user\/collect/).reply(async (config) => { mock.onGet(/user\/collect/).reply(async () => {
return [ return [
200, 200,
{ {
@ -240,7 +240,7 @@ export async function startMock() {
return [200, { code: 500 }] return [200, { code: 500 }]
}) })
mock.onGet(/user\/panel/).reply(async (config) => { mock.onGet(/user\/panel/).reply(async () => {
let r2 = await fetch(BASE_URL + '/data/users.json') let r2 = await fetch(BASE_URL + '/data/users.json')
let v = await r2.json() let v = await r2.json()
// let item = v.find(a => a.uid === '68310389333') // let item = v.find(a => a.uid === '68310389333')
@ -252,7 +252,7 @@ export async function startMock() {
return [200, { code: 500 }] return [200, { code: 500 }]
}) })
mock.onGet(/user\/friends/).reply(async (config) => { mock.onGet(/user\/friends/).reply(async () => {
let r2 = await fetch(BASE_URL + '/data/users.json') let r2 = await fetch(BASE_URL + '/data/users.json')
let v = await r2.json() let v = await r2.json()
return [200, { data: v, code: 200 }] return [200, { data: v, code: 200 }]

View File

@ -68,7 +68,7 @@
>欢迎来到直播间抖音严禁未成年人直播或打赏直接间内严禁出现违法违规低俗色情吸烟酗酒等内容如主播在直播过程中以不当方式诱导打赏私下交易请谨慎判断以防人身财产损失请大家注意财产安全谨防网络诈骗</span >欢迎来到直播间抖音严禁未成年人直播或打赏直接间内严禁出现违法违规低俗色情吸烟酗酒等内容如主播在直播过程中以不当方式诱导打赏私下交易请谨慎判断以防人身财产损失请大家注意财产安全谨防网络诈骗</span
> >
</div> </div>
<div class="comment" v-for="i in list"> <div class="comment" :key="j" v-for="(i, j) in list">
<div class="level"> <div class="level">
<div class="wrapper"> <div class="wrapper">
<img src="../../assets/img/icon/home/level.webp" alt="" /> <img src="../../assets/img/icon/home/level.webp" alt="" />

View File

@ -8,7 +8,7 @@
</div> </div>
</transition> </transition>
<div class="right"> <div class="right">
<!-- TODO 没有淡入淡出的特效--> <!-- TODO 没有淡入淡出的特效-->
<template v-if="isFixed"> <template v-if="isFixed">
<img <img
class="star" class="star"
@ -110,7 +110,6 @@ import Share from '../../components/Share'
import DouyinCode from '../../components/DouyinCode' import DouyinCode from '../../components/DouyinCode'
import ConfirmDialog from '../../components/dialog/ConfirmDialog' import ConfirmDialog from '../../components/dialog/ConfirmDialog'
import ShareToFriend from './components/ShareToFriend' import ShareToFriend from './components/ShareToFriend'
import resource from '../../assets/data/resource'
import { myVideo } from '@/api/videos' import { myVideo } from '@/api/videos'
export default { export default {
@ -157,7 +156,7 @@ export default {
} }
}, },
watch: { watch: {
shareType(newVal, oldVal) { shareType(newVal) {
if (newVal === -1) return if (newVal === -1) return
this.showSharePassword = true this.showSharePassword = true
switch (newVal) { switch (newVal) {

View File

@ -20,7 +20,12 @@
<SlideHorizontal name="musicRankList" v-model:index="contentIndex"> <SlideHorizontal name="musicRankList" v-model:index="contentIndex">
<SlideItem> <SlideItem>
<div class="list"> <div class="list">
<div class="item" v-for="(item, index) in hotList" @click="togglePlay(item, hotList)"> <div
class="item"
:key="index"
v-for="(item, index) in hotList"
@click="togglePlay(item, hotList)"
>
<div class="top"> <div class="top">
<div class="rank-wrapper"> <div class="rank-wrapper">
<img <img
@ -108,7 +113,12 @@
</SlideItem> </SlideItem>
<SlideItem> <SlideItem>
<div class="list"> <div class="list">
<div class="item" v-for="(item, index) in hotList" @click="togglePlay(item, hotList)"> <div
class="item"
:key="index"
v-for="(item, index) in hotList"
@click="togglePlay(item, hotList)"
>
<div class="top"> <div class="top">
<div class="rank-wrapper"> <div class="rank-wrapper">
<img <img
@ -196,7 +206,12 @@
</SlideItem> </SlideItem>
<SlideItem> <SlideItem>
<div class="list"> <div class="list">
<div class="item" v-for="(item, index) in hotList" @click="togglePlay(item, hotList)"> <div
class="item"
:key="index"
v-for="(item, index) in hotList"
@click="togglePlay(item, hotList)"
>
<div class="top"> <div class="top">
<div class="rank-wrapper"> <div class="rank-wrapper">
<img <img

View File

@ -62,6 +62,7 @@ function getUserMedia(constrains, success, error) {
navigator.webkitGetUserMedia(constrains).then(success).catch(error) navigator.webkitGetUserMedia(constrains).then(success).catch(error)
} else if (navigator.mozGetUserMedia) { } else if (navigator.mozGetUserMedia) {
//Firefox //Firefox
// eslint-disable-next-line no-undef
navagator.mozGetUserMedia(constrains).then(success).catch(error) navagator.mozGetUserMedia(constrains).then(success).catch(error)
} else if (navigator.getUserMedia) { } else if (navigator.getUserMedia) {
//API //API

View File

@ -2,11 +2,11 @@
<div class="Search"> <div class="Search">
<div class="header"> <div class="header">
<dy-back mode="light" @click="$back" class="mr1r"></dy-back> <dy-back mode="light" @click="$back" class="mr1r"></dy-back>
<BSearch placeholder="搜索用户名字/抖音号" :isShowRightText="true" @notice="$no"> </BSearch> <BSearch placeholder="搜索用户名字/抖音号" :isShowRightText="true" @notice="$no"></BSearch>
</div> </div>
<div class="content"> <div class="content">
<div class="history"> <div class="history">
<div class="row" v-for="(item, index) in lHistory"> <div class="row" :key="index" v-for="(item, index) in lHistory">
<div class="left"> <div class="left">
<img src="../../assets/img/icon/home/time-white.png" alt="" /> <img src="../../assets/img/icon/home/time-white.png" alt="" />
<span> {{ item }}</span> <span> {{ item }}</span>
@ -26,7 +26,7 @@
</div> </div>
</div> </div>
<div class="keys"> <div class="keys">
<div class="key" v-for="(item, index) in randomGuess"> <div class="key" :key="index" v-for="(item, index) in randomGuess">
<span class="desc">{{ item.name }}</span> <span class="desc">{{ item.name }}</span>
<img <img
v-if="item.type === 1" v-if="item.type === 1"
@ -66,7 +66,7 @@
</div> </div>
</div> </div>
</div> </div>
<div class="l-row" v-for="(item, index) in hotRankList"> <div class="l-row" :key="index" v-for="(item, index) in hotRankList">
<div class="rank-wrapper"> <div class="rank-wrapper">
<img <img
v-if="index === 0" v-if="index === 0"
@ -112,7 +112,7 @@
</SlideItem> </SlideItem>
<SlideItem> <SlideItem>
<div class="slide1" ref="slide1"> <div class="slide1" ref="slide1">
<div class="l-row" v-for="(item, index) in liveRankList"> <div class="l-row" :key="index" v-for="(item, index) in liveRankList">
<div class="rank-wrapper"> <div class="rank-wrapper">
<div class="rank" :class="{ top: index < 3 }"> <div class="rank" :class="{ top: index < 3 }">
{{ index + 1 }} {{ index + 1 }}
@ -143,6 +143,7 @@
<div class="slide2" ref="slide2"> <div class="slide2" ref="slide2">
<div <div
class="l-row" class="l-row"
:key="index"
v-for="(item, index) in musicRankList" v-for="(item, index) in musicRankList"
@click="$nav('/home/music-rank-list')" @click="$nav('/home/music-rank-list')"
> >
@ -174,13 +175,14 @@
<div <div
class="brand" class="brand"
@click="toggleKey(key)" @click="toggleKey(key)"
:key="i"
:class="{ active: key === selectBrandKey }" :class="{ active: key === selectBrandKey }"
v-for="key in Object.keys(brandRankList)" v-for="(key, i) in Object.keys(brandRankList)"
> >
{{ key }} {{ key }}
</div> </div>
</div> </div>
<div class="l-row" v-for="(item, index) in selectBrandList"> <div class="l-row" :key="index" v-for="(item, index) in selectBrandList">
<div class="rank-wrapper"> <div class="rank-wrapper">
<div class="rank" :class="{ top: index < 3 }"> <div class="rank" :class="{ top: index < 3 }">
{{ index + 1 }} {{ index + 1 }}

View File

@ -33,7 +33,7 @@
<div class="text-num">{{ desc.length }}/200</div> <div class="text-num">{{ desc.length }}/200</div>
</div> </div>
<div class="upload-photo"> <div class="upload-photo">
<div class="photo-wrapper" v-for="(item, index) in photos"> <div class="photo-wrapper" :key="index" v-for="(item, index) in photos">
<img class="photo" :src="item" alt="" /> <img class="photo" :src="item" alt="" />
<img <img
class="close" class="close"

View File

@ -91,13 +91,20 @@ export default {
props: { props: {
currentItem: { currentItem: {
type: Object, type: Object,
default: { default() {
user: DefaultUser, return {
isRequest: false, user: DefaultUser,
post: [] isRequest: false,
post: []
}
} }
}, },
modelValue: false modelValue: {
type: Boolean,
default() {
return false
}
}
}, },
data() { data() {
return { return {

View File

@ -55,13 +55,20 @@ export default {
props: { props: {
currentItem: { currentItem: {
type: Object, type: Object,
default: { default() {
user: DefaultUser, return {
isRequest: false, user: DefaultUser,
post: [] isRequest: false,
post: []
}
} }
}, },
modelValue: false modelValue: {
type: Boolean,
default() {
return false
}
}
}, },
data() { data() {
return { return {

View File

@ -63,7 +63,12 @@ export default {
Loading Loading
}, },
props: { props: {
loading: false, loading: {
type: Boolean,
default() {
return false
}
},
//slidListslidListindicator //slidListslidListindicator
name: { name: {
type: String, type: String,
@ -142,6 +147,7 @@ export default {
transform: this.transform transform: this.transform
} }
} }
return {}
} }
}, },
created() {}, created() {},

View File

@ -165,13 +165,18 @@ import Check from '../../../components/Check'
export default { export default {
name: 'Test', name: 'Test',
props: { props: {
modelValue: false modelValue: {
type: Boolean,
default() {
return false
}
}
}, },
components: { components: {
Check Check
}, },
watch: { watch: {
modelValue(newVal) { modelValue() {
this.type1 = false this.type1 = false
this.type2 = false this.type2 = false
this.type3 = false this.type3 = false

View File

@ -46,8 +46,8 @@
发送视频到微博 发送视频到微博
</dy-button> </dy-button>
<dy-button v-if="!showDownload" class="mt1r" type="white" @click="$no" <dy-button v-if="!showDownload" class="mt1r" type="white" @click="$no"
>复制口令发给好友</dy-button >复制口令发给好友
> </dy-button>
</template> </template>
<template v-else> <template v-else>
@ -96,7 +96,12 @@
</template> </template>
</div> </div>
<div class="dialog-friends"> <div class="dialog-friends">
<div class="dialog-friend" v-for="item in localFriends.all" @click="share(item)"> <div
class="dialog-friend"
:key="i"
v-for="(item, i) in localFriends.all"
@click="share(item)"
>
<img :src="$imgPreview(item.avatar)" alt="" /> <img :src="$imgPreview(item.avatar)" alt="" />
<div class="right"> <div class="right">
<span>{{ item.name }}</span> <span>{{ item.name }}</span>
@ -141,7 +146,7 @@ export default {
} }
}, },
watch: { watch: {
type(newVal, oldVal) { type(newVal) {
this.change(newVal) this.change(newVal)
}, },
showShareDialog() { showShareDialog() {
@ -203,7 +208,7 @@ export default {
this.$emit('update:type', -1) this.$emit('update:type', -1)
}, },
downloadVideo() { downloadVideo() {
return new Promise((resolve, reject) => { return new Promise((resolve) => {
this.progress = 0 this.progress = 0
this.downloading = true this.downloading = true
let time = setInterval(() => { let time = setInterval(() => {

View File

@ -20,7 +20,12 @@
/> />
<template v-if="searchKey"> <template v-if="searchKey">
<div class="friend-list" v-if="searchResult.length"> <div class="friend-list" v-if="searchResult.length">
<div class="friend-item" v-for="item in searchResult" @click="handleClick2(item)"> <div
class="friend-item"
:key="i"
v-for="(item, i) in searchResult"
@click="handleClick2(item)"
>
<img class="left" v-lazy="$imgPreview(item.avatar)" alt="" /> <img class="left" v-lazy="$imgPreview(item.avatar)" alt="" />
<div class="right"> <div class="right">
<div class="info"> <div class="info">
@ -54,7 +59,7 @@
</div> </div>
<div class="friend-list"> <div class="friend-list">
<div class="index">所有朋友</div> <div class="index">所有朋友</div>
<div class="friend-item" v-for="item in localFriends"> <div class="friend-item" :key="i" v-for="(item, i) in localFriends">
<img class="left" v-lazy="$imgPreview(item.avatar)" alt="" /> <img class="left" v-lazy="$imgPreview(item.avatar)" alt="" />
<div class="right"> <div class="right">
<span>{{ item.name }}</span> <span>{{ item.name }}</span>
@ -74,7 +79,7 @@
</div> </div>
<div class="chat-list"> <div class="chat-list">
<div class="chat-item" v-for="item in localFriends"> <div class="chat-item" :key="i" v-for="(item, i) in localFriends">
<img class="left" v-lazy="$imgPreview(item.avatar)" alt="" /> <img class="left" v-lazy="$imgPreview(item.avatar)" alt="" />
<div class="right"> <div class="right">
<div class="title"> <div class="title">
@ -95,7 +100,6 @@
import FromBottomDialog from '../../../components/dialog/FromBottomDialog' import FromBottomDialog from '../../../components/dialog/FromBottomDialog'
import { mapState } from 'pinia' import { mapState } from 'pinia'
import Search from '../../../components/Search' import Search from '../../../components/Search'
import Check from '../../../components/Check'
import { useBaseStore } from '@/store/pinia' import { useBaseStore } from '@/store/pinia'
/* /*
分享给朋友 分享给朋友
@ -104,11 +108,15 @@ export default {
name: 'ShareTo', name: 'ShareTo',
components: { components: {
FromBottomDialog, FromBottomDialog,
Search, Search
Check
}, },
props: { props: {
modelValue: false, modelValue: {
type: Boolean,
default() {
return false
}
},
pageId: { pageId: {
type: String, type: String,
default: 'home-index' default: 'home-index'

View File

@ -54,7 +54,7 @@
<to-share item-type="code" @click="$no" /> <to-share item-type="code" @click="$no" />
</div> </div>
<div class="friends"> <div class="friends">
<div class="item" v-for="item in friends.all"> <div class="item" :key="i" v-for="(item, i) in friends.all">
<img class="left" v-lazy="$imgPreview(item.avatar)" alt="" /> <img class="left" v-lazy="$imgPreview(item.avatar)" alt="" />
<div class="right"> <div class="right">
<span>{{ item.name }}</span> <span>{{ item.name }}</span>
@ -87,7 +87,6 @@ export default {
name: 'Share', name: 'Share',
components: { components: {
FromBottomDialog, FromBottomDialog,
LoadingCircle,
// DouyinCode, // DouyinCode,
ToShare: { ToShare: {
components: { components: {
@ -200,7 +199,12 @@ export default {
} }
}, },
props: { props: {
modelValue: false, modelValue: {
type: Boolean,
default() {
return false
}
},
videoId: { videoId: {
type: String, type: String,
default: null default: null

View File

@ -46,7 +46,7 @@
</div> </div>
</div> </div>
<div class="content"> <div class="content">
<div class="item avatar" @click="$no" v-for="i in 6"> <div class="item avatar" @click="$no" :key="i" v-for="i in 6">
<img <img
src="https://img.tol.vip/avatar/WEIXIN/3aSuTGYTzjHvcHy0y0tH1eiShKRk9Sgd.jpg?_upt=de4a5c251709635127" src="https://img.tol.vip/avatar/WEIXIN/3aSuTGYTzjHvcHy0y0tH1eiShKRk9Sgd.jpg?_upt=de4a5c251709635127"
/> />
@ -123,8 +123,8 @@
<Slide4 :active="state.navIndex === 4 && state.baseIndex === 1" /> <Slide4 :active="state.navIndex === 4 && state.baseIndex === 1" />
</SlideHorizontal> </SlideHorizontal>
<Footer v-bind:init-tab="1" /> <BaseFooter v-bind:init-tab="1" />
<Mask <BaseMask
v-if="state.baseIndex === 0" v-if="state.baseIndex === 0"
@click="state.baseIndex = 1" @click="state.baseIndex = 1"
mode="white" mode="white"
@ -278,25 +278,25 @@ function setCurrentItem(item) {
} }
onMounted(() => { onMounted(() => {
bus.on(EVENT_KEY.ENTER_FULLSCREEN, (e) => { bus.on(EVENT_KEY.ENTER_FULLSCREEN, () => {
if (!state.active) return if (!state.active) return
state.fullScreen = true state.fullScreen = true
}) })
bus.on(EVENT_KEY.EXIT_FULLSCREEN, (e) => { bus.on(EVENT_KEY.EXIT_FULLSCREEN, () => {
if (!state.active) return if (!state.active) return
state.fullScreen = false state.fullScreen = false
}) })
bus.on(EVENT_KEY.OPEN_COMMENTS, (e) => { bus.on(EVENT_KEY.OPEN_COMMENTS, () => {
if (!state.active) return if (!state.active) return
bus.emit(EVENT_KEY.ENTER_FULLSCREEN) bus.emit(EVENT_KEY.ENTER_FULLSCREEN)
state.commentVisible = true state.commentVisible = true
}) })
bus.on(EVENT_KEY.CLOSE_COMMENTS, (e) => { bus.on(EVENT_KEY.CLOSE_COMMENTS, () => {
if (!state.active) return if (!state.active) return
bus.emit(EVENT_KEY.EXIT_FULLSCREEN) bus.emit(EVENT_KEY.EXIT_FULLSCREEN)
state.commentVisible = false state.commentVisible = false
}) })
bus.on(EVENT_KEY.SHOW_SHARE, (e) => { bus.on(EVENT_KEY.SHOW_SHARE, () => {
if (!state.active) return if (!state.active) return
state.isSharing = true state.isSharing = true
}) })

View File

@ -56,6 +56,7 @@ import ScrollList from '@/components/ScrollList.vue'
import { useBaseStore } from '@/store/pinia' import { useBaseStore } from '@/store/pinia'
import AlbumDetail from '@/pages/other/AlbumDetail.vue' import AlbumDetail from '@/pages/other/AlbumDetail.vue'
import Mock from 'mockjs' import Mock from 'mockjs'
import $ from 'jquery'
//@click="nav('album-detail',{},item)" //@click="nav('album-detail',{},item)"

View File

@ -1,23 +1,14 @@
<script setup> <script setup>
import { onMounted, reactive, ref, watch } from 'vue' import { reactive, ref, watch } from 'vue'
import { _checkImgUrl, _duration, _formatNumber } from '@/utils' import { _checkImgUrl, _duration, _formatNumber } from '@/utils'
import { recommendedVideo } from '@/api/videos' import { recommendedVideo } from '@/api/videos'
import { useBaseStore } from '@/store/pinia'
import ScrollList from '@/components/ScrollList.vue' import ScrollList from '@/components/ScrollList.vue'
import { useNav } from '@/utils/hooks/useNav' import { useNav } from '@/utils/hooks/useNav'
const baseStore = useBaseStore()
const props = defineProps({ const props = defineProps({
active: Boolean active: Boolean
}) })
const p = {
onShowComments() {
console.log('onShowComments')
}
}
const playingEl = ref() const playingEl = ref()
const state = reactive({ const state = reactive({
show: false, show: false,
@ -52,7 +43,7 @@ watch(
const obList = [] const obList = []
const vIsCanPlay = { const vIsCanPlay = {
mounted(el, binding, vnode, prevVnode) { mounted(el) {
const observer = new IntersectionObserver( const observer = new IntersectionObserver(
(entries) => { (entries) => {
if (entries[0].isIntersecting) { if (entries[0].isIntersecting) {
@ -76,7 +67,7 @@ const vIsCanPlay = {
observer.observe(el) observer.observe(el)
obList.push(observer) obList.push(observer)
}, },
unmounted(el, binding, vnode, prevVnode) { unmounted() {
obList.map((v) => { obList.map((v) => {
v.disconnect() v.disconnect()
}) })
@ -99,6 +90,7 @@ const nav = useNav()
i % 9 === 0 ? '' : i % 2 === 1 && 'l', i % 9 === 0 ? '' : i % 2 === 1 && 'l',
i % 9 === 0 ? '' : i % 2 === 0 && 'r' i % 9 === 0 ? '' : i % 2 === 0 && 'r'
]" ]"
:key="i"
v-for="(item, i) in list" v-for="(item, i) in list"
> >
<div class="video-wrapper" v-if="i % 9 === 0"> <div class="video-wrapper" v-if="i % 9 === 0">

View File

@ -77,18 +77,11 @@ const props = defineProps({
default: false default: false
} }
}) })
const emit = defineEmits(['update:item', 'goUserInfo', 'showComments', 'showShare', 'goMusic'])
function stop(e) { function stop(e) {
e.stopPropagation() e.stopPropagation()
} }
const p = {
onShowComments() {
console.log('onShowComments')
}
}
const subTypeRef = ref(null) const subTypeRef = ref(null)
const state = reactive({ const state = reactive({
index: 0, index: 0,

View File

@ -2,7 +2,7 @@
<SlideItem class="slide-item-class"> <SlideItem class="slide-item-class">
<div class="sub-type" :class="state.subTypeIsTop ? 'top' : ''" ref="subTypeRef"> <div class="sub-type" :class="state.subTypeIsTop ? 'top' : ''" ref="subTypeRef">
<div class="card" @touchmove.capture="stop"> <div class="card" @touchmove.capture="stop">
<div class="nav-item" v-for="i in store.users"> <div class="nav-item" :key="j" v-for="(i, j) in store.users">
<img :src="_checkImgUrl(i.avatar_168x168.url_list[0])" alt="" /> <img :src="_checkImgUrl(i.avatar_168x168.url_list[0])" alt="" />
<span>{{ i.nickname }}</span> <span>{{ i.nickname }}</span>
</div> </div>

View File

@ -19,7 +19,6 @@
import SlideVerticalInfinite from '@/components/slide/SlideVerticalInfinite.vue' import SlideVerticalInfinite from '@/components/slide/SlideVerticalInfinite.vue'
import { onMounted, onUnmounted, reactive, ref } from 'vue' import { onMounted, onUnmounted, reactive, ref } from 'vue'
import bus, { EVENT_KEY } from '@/utils/bus' import bus, { EVENT_KEY } from '@/utils/bus'
import { $notice } from '@/utils'
import { useSlideListItemRender } from '@/utils/hooks/useSlideListItemRender' import { useSlideListItemRender } from '@/utils/hooks/useSlideListItemRender'
import { useBaseStore } from '@/store/pinia' import { useBaseStore } from '@/store/pinia'
@ -44,7 +43,9 @@ const props = defineProps({
}, },
list: { list: {
type: Array, type: Array,
default: [] default() {
return []
}
} }
}) })
@ -94,15 +95,15 @@ async function getData(refresh = false) {
} }
} }
function dislike() { // function dislike() {
listRef.value.dislike(state.list[1]) // listRef.value.dislike(state.list[1])
state.list[state.index] = state.list[1] // state.list[state.index] = state.list[1]
$notice('操作成功,将减少此类视频的推荐') // $notice('')
} // }
function end() { // function end() {
// this.$notice('') // // this.$notice('')
} // }
function click(uniqueId) { function click(uniqueId) {
if (uniqueId !== state.uniqueId) return if (uniqueId !== state.uniqueId) return

View File

@ -14,7 +14,7 @@ export default {
created() {}, created() {},
methods: { methods: {
async check() { async check() {
return new Promise((resolve, reject) => { return new Promise((resolve) => {
if (this.isAgree) { if (this.isAgree) {
resolve(true) resolve(true)
} else { } else {

View File

@ -36,13 +36,11 @@
</div> </div>
</template> </template>
<script> <script>
import Check from '../../components/Check'
import LoginInput from './components/LoginInput' import LoginInput from './components/LoginInput'
export default { export default {
name: 'VerificationCode', name: 'VerificationCode',
components: { components: {
Check,
LoginInput LoginInput
}, },
data() { data() {

View File

@ -68,8 +68,18 @@
export default { export default {
name: 'LoginInput', name: 'LoginInput',
props: { props: {
modelValue: '', modelValue: {
placeholder: '', type: String,
default() {
return ''
}
},
placeholder: {
type: String,
default() {
return ''
}
},
type: { type: {
type: String, type: String,
default: 'phone' default: 'phone'
@ -102,7 +112,7 @@ export default {
watch: { watch: {
isSendVerificationCode: { isSendVerificationCode: {
immediate: true, immediate: true,
handler(newVal, oldVal) { handler(newVal) {
if (newVal) { if (newVal) {
this.verificationCodeBtnText = 60 this.verificationCodeBtnText = 60
let ticker = setInterval(() => { let ticker = setInterval(() => {

View File

@ -51,11 +51,11 @@
<div v-if="currentFixedIndicator" class="row no-active no-padding border index fixed"> <div v-if="currentFixedIndicator" class="row no-active no-padding border index fixed">
<span>{{ currentFixedIndicator }}</span> <span>{{ currentFixedIndicator }}</span>
</div> </div>
<div v-for="(value, name) of countryOk"> <div :key="name" v-for="(value, name) of countryOk">
<div :class="name" class="row no-active no-padding border index"> <div :class="name" class="row no-active no-padding border index">
<span>{{ name }}</span> <span>{{ name }}</span>
</div> </div>
<div class="row no-active no-padding border" v-for="item of value"> <div class="row no-active no-padding border" :key="i" v-for="(item, i) of value">
<span>{{ item.name }}</span> <span>{{ item.name }}</span>
</div> </div>
</div> </div>
@ -2366,8 +2366,8 @@ export default {
render(currentIndex) render(currentIndex)
} }
}) })
ul.addEventListener('touchend', function ($e) { ul.addEventListener('touchend', function () {
items.forEach((el, index) => { items.forEach((el) => {
el.style.transform = `translate3d(0,0,0) ${resetScale}` el.style.transform = `translate3d(0,0,0) ${resetScale}`
el.style.color = resetColor el.style.color = resetColor
}) })

View File

@ -115,7 +115,7 @@
</div> </div>
<div class="item" v-if="userinfo.province || userinfo.city"> <div class="item" v-if="userinfo.province || userinfo.city">
{{ userinfo.province }} {{ userinfo.province }}
<template v-if="userinfo.province && userinfo.city"> - </template> <template v-if="userinfo.province && userinfo.city"> -</template>
{{ userinfo.city }} {{ userinfo.city }}
</div> </div>
<div class="item" v-if="userinfo.school?.name"> <div class="item" v-if="userinfo.school?.name">
@ -220,7 +220,8 @@
<div <div
class="item" class="item"
@click.stop="$nav('/home/music', i)" @click.stop="$nav('/home/music', i)"
v-for="i in videos.collect.music.list.slice(0, 3)" :key="j"
v-for="(i, j) in videos.collect.music.list.slice(0, 3)"
> >
<img class="poster" :src="$imgPreview(i.cover)" alt="" /> <img class="poster" :src="$imgPreview(i.cover)" alt="" />
<div class="title">{{ i.name }}</div> <div class="title">{{ i.name }}</div>
@ -233,7 +234,7 @@
</SlideItem> </SlideItem>
</SlideRowList> </SlideRowList>
</div> </div>
<Footer v-bind:init-tab="5" /> <BaseFooter v-bind:init-tab="5" />
<transition name="fade"> <transition name="fade">
<div class="mask" v-if="baseActiveIndex === 1" @click="baseActiveIndex = 0"></div> <div class="mask" v-if="baseActiveIndex === 1" @click="baseActiveIndex = 0"></div>
</transition> </transition>
@ -371,7 +372,6 @@
</template> </template>
<script> <script>
import Posters from '../../components/Posters' import Posters from '../../components/Posters'
import Footer from '../../components/Footer'
import Indicator from '../../components/slide/Indicator' import Indicator from '../../components/slide/Indicator'
import { nextTick } from 'vue' import { nextTick } from 'vue'
import { mapState } from 'pinia' import { mapState } from 'pinia'
@ -379,14 +379,13 @@ import { mapState } from 'pinia'
import bus from '../../utils/bus' import bus from '../../utils/bus'
import ConfirmDialog from '../../components/dialog/ConfirmDialog' import ConfirmDialog from '../../components/dialog/ConfirmDialog'
import { $no, _checkImgUrl, _formatNumber, _getUserDouyinId } from '@/utils' import { $no, _checkImgUrl, _formatNumber, _getUserDouyinId } from '@/utils'
import SlideHorizontal from '@/components/slide/SlideHorizontal.vue'
import { likeVideo, myVideo, privateVideo } from '@/api/videos' import { likeVideo, myVideo, privateVideo } from '@/api/videos'
import { useBaseStore } from '@/store/pinia' import { useBaseStore } from '@/store/pinia'
import { userCollect } from '@/api/user' import { userCollect } from '@/api/user'
export default { export default {
name: 'Me', name: 'Me',
components: { Posters, Footer, Indicator, ConfirmDialog, SlideHorizontal }, components: { Posters, Indicator, ConfirmDialog },
data() { data() {
return { return {
previewImg: '', previewImg: '',
@ -508,7 +507,7 @@ export default {
async getScrollAreaHeight(index = this.contentIndex) { async getScrollAreaHeight(index = this.contentIndex) {
let scrollAreaHeight = 0 let scrollAreaHeight = 0
if (index === 3) { if (index === 3) {
await nextTick(async () => { nextTick(async () => {
scrollAreaHeight = this.$refs.collect.clientHeight + 60 + 40 scrollAreaHeight = this.$refs.collect.clientHeight + 60 + 40
}) })
} else { } else {
@ -638,7 +637,7 @@ export default {
this.fixedLocationY = this.startLocationY = e.touches[0].pageY this.fixedLocationY = this.startLocationY = e.touches[0].pageY
this.startTime = Date.now() this.startTime = Date.now()
}, },
move(e) { move() {
// (!this.isScroll) && e.preventDefault(); // (!this.isScroll) && e.preventDefault();
}, },
async scroll() { async scroll() {

View File

@ -58,7 +58,7 @@ export default {
} }
}, },
watch: { watch: {
shareType(newVal, oldVal) { shareType(newVal) {
if (newVal === -1) return if (newVal === -1) return
this.showSharePassword = true this.showSharePassword = true
switch (newVal) { switch (newVal) {

View File

@ -27,7 +27,12 @@
<img class="menu" src="../../assets/img/icon/menu-white.png" alt="" /> <img class="menu" src="../../assets/img/icon/menu-white.png" alt="" />
</div> </div>
<div class="collect-list"> <div class="collect-list">
<div class="item" v-for="(item, index) in collectMusic" @click="page2PlayMusic(item)"> <div
class="item"
:key="index"
v-for="(item, index) in collectMusic"
@click="page2PlayMusic(item)"
>
<div class="left"> <div class="left">
<div class="cover-wrapper"> <div class="cover-wrapper">
<img v-lazy="$imgPreview(item.cover)" alt="" class="cover" /> <img v-lazy="$imgPreview(item.cover)" alt="" class="cover" />
@ -60,6 +65,7 @@
<div class="recommend-list"> <div class="recommend-list">
<div <div
class="item" class="item"
:key="index"
v-for="(item, index) in recommendMusic" v-for="(item, index) in recommendMusic"
@click="page2PlayMusic(item)" @click="page2PlayMusic(item)"
> >
@ -150,9 +156,7 @@
<script> <script>
import { mapState } from 'pinia' import { mapState } from 'pinia'
import Switches from '../message/components/swtich/switches' import Switches from '../message/components/swtich/switches'
import SlideItemMusic from './components/SlideItemMusic'
import IndicatorLight from '../../components/slide/IndicatorLight' import IndicatorLight from '../../components/slide/IndicatorLight'
import FromBottomDialog from '../../components/dialog/FromBottomDialog'
import GuessMusic from './components/GuessMusic' import GuessMusic from './components/GuessMusic'
import CollectMusic from './components/CollectMusic' import CollectMusic from './components/CollectMusic'
import Loading from '../../components/Loading' import Loading from '../../components/Loading'
@ -163,9 +167,7 @@ import { useBaseStore } from '@/store/pinia'
export default { export default {
name: 'MyMusic', name: 'MyMusic',
components: { components: {
FromBottomDialog,
Switches, Switches,
SlideItemMusic,
IndicatorLight, IndicatorLight,
GuessMusic, GuessMusic,
CollectMusic, CollectMusic,

View File

@ -8,7 +8,7 @@
<div class="content"> <div class="content">
<div class="request"> <div class="request">
<div class="list"> <div class="list">
<div class="item" v-for="item in friends.all"> <div class="item" :key="i" v-for="(item, i) in friends.all">
<div class="left"> <div class="left">
<img :src="$imgPreview(item.avatar)" /> <img :src="$imgPreview(item.avatar)" />
<span class="name">{{ item.name }}</span> <span class="name">{{ item.name }}</span>
@ -22,12 +22,11 @@
</template> </template>
<script> <script>
import { mapState } from 'pinia' import { mapState } from 'pinia'
import FromBottomDialog from '../../components/dialog/FromBottomDialog'
import { useBaseStore } from '@/store/pinia' import { useBaseStore } from '@/store/pinia'
export default { export default {
name: 'MyRequestUpdate', name: 'MyRequestUpdate',
components: { FromBottomDialog }, components: {},
data() { data() {
return {} return {}
}, },

View File

@ -26,7 +26,7 @@
<!-- <div class="subtitle f12">上次发布作品2020-08-01 上次开播昨天23:12</div>--> <!-- <div class="subtitle f12">上次发布作品2020-08-01 上次开播昨天23:12</div>-->
<div class="subtitle f12">历史求更新粉丝送礼后7天未开播则退还礼物</div> <div class="subtitle f12">历史求更新粉丝送礼后7天未开播则退还礼物</div>
<div class="list"> <div class="list">
<div class="item" v-for="item in friends.all"> <div class="item" :key="i" v-for="(item, i) in friends.all">
<div class="left"> <div class="left">
<img :src="$imgPreview(item.avatar)" /> <img :src="$imgPreview(item.avatar)" />
<span class="name">{{ item.name }}</span> <span class="name">{{ item.name }}</span>

View File

@ -7,7 +7,12 @@
</BaseHeader> </BaseHeader>
<div class="content"> <div class="content">
<div class="list"> <div class="list">
<div class="item" v-for="(item, index) in list" @click="togglePlay(item, list)"> <div
class="item"
v-for="(item, index) in list"
:key="index"
@click="togglePlay(item, list)"
>
<div class="music"> <div class="music">
<div class="cover-wrapper"> <div class="cover-wrapper">
<img v-lazy="$imgPreview(item.cover)" alt="" class="cover" /> <img v-lazy="$imgPreview(item.cover)" alt="" class="cover" />
@ -103,7 +108,7 @@ export default {
this.getData() this.getData()
}, },
mounted() { mounted() {
this.audio.addEventListener('loadedmetadata', (e) => { this.audio.addEventListener('loadedmetadata', () => {
this.currentItem.duration = this.audio.duration this.currentItem.duration = this.audio.duration
this.step = this.bodyWidth / Math.floor(this.audio.duration) this.step = this.bodyWidth / Math.floor(this.audio.duration)
}) })

View File

@ -15,7 +15,6 @@
</div> </div>
</template> </template>
<script> <script>
import resource from '../../../assets/data/resource'
import Posters from '../../../components/Posters' import Posters from '../../../components/Posters'
import Scroll from '../../../components/Scroll' import Scroll from '../../../components/Scroll'
import { myVideo } from '@/api/videos' import { myVideo } from '@/api/videos'

View File

@ -12,9 +12,10 @@
@previous="previous" @previous="previous"
@next="next" @next="next"
@slideCanMove="(e) => (this.slideCanMove = e)" @slideCanMove="(e) => (this.slideCanMove = e)"
v-model="list[index]" :model-value="list[index]"
v-model:isLoop="isLoop" v-model:isLoop="isLoop"
v-for="(item, index) in list" v-for="(item, index) in list"
:key="index"
/> />
</SlideVertical> </SlideVertical>
<from-bottom-dialog <from-bottom-dialog
@ -37,9 +38,10 @@
<div class="wrapper"> <div class="wrapper">
<div <div
class="l-row" class="l-row"
@click="play(index)"
:class="{ active: activeIndex === index }"
v-for="(item, index) in list" v-for="(item, index) in list"
@click="play(index)"
:key="index"
:class="{ active: activeIndex === index }"
> >
<div class="left"> <div class="left">
<img <img
@ -71,9 +73,7 @@
</template> </template>
<script> <script>
import FromBottomDialog from '../../../components/dialog/FromBottomDialog' import FromBottomDialog from '../../../components/dialog/FromBottomDialog'
import Switches from '../../message/components/swtich/switches'
import SlideItemMusic from './SlideItemMusic' import SlideItemMusic from './SlideItemMusic'
import IndicatorLight from '../../../components/slide/IndicatorLight'
import Share from '../../../components/Share' import Share from '../../../components/Share'
import ShareToFriend from '../../home/components/ShareToFriend' import ShareToFriend from '../../home/components/ShareToFriend'
import SlideVertical from '@/components/slide/SlideVertical.vue' import SlideVertical from '@/components/slide/SlideVertical.vue'
@ -83,16 +83,16 @@ export default {
components: { components: {
SlideVertical, SlideVertical,
FromBottomDialog, FromBottomDialog,
Switches,
SlideItemMusic, SlideItemMusic,
IndicatorLight,
Share, Share,
ShareToFriend ShareToFriend
}, },
props: { props: {
list: { list: {
type: Array, type: Array,
default: [] default() {
return []
}
}, },
page2SlideIndex: { page2SlideIndex: {
type: Number, type: Number,
@ -123,7 +123,7 @@ export default {
}, },
created() {}, created() {},
watch: { watch: {
activeIndex(newVal, oldVal) { activeIndex(newVal) {
this.itemRefs.map((ref) => { this.itemRefs.map((ref) => {
ref.togglePlay(false) ref.togglePlay(false)
}) })

View File

@ -12,8 +12,9 @@
@previous="previous" @previous="previous"
@next="next" @next="next"
@slideCanMove="(e) => (this.slideCanMove = e)" @slideCanMove="(e) => (this.slideCanMove = e)"
v-model="list[index]" :model-value="list[index]"
v-model:isLoop="isLoop" v-model:isLoop="isLoop"
:key="index"
v-for="(item, index) in list" v-for="(item, index) in list"
/> />
</SlideVertical> </SlideVertical>
@ -40,6 +41,7 @@
@click="play(index)" @click="play(index)"
:class="{ active: guessSlideIndex === index }" :class="{ active: guessSlideIndex === index }"
v-for="(item, index) in list" v-for="(item, index) in list"
:key="index"
> >
<div class="left"> <div class="left">
<img <img
@ -71,9 +73,7 @@
</template> </template>
<script> <script>
import FromBottomDialog from '../../../components/dialog/FromBottomDialog' import FromBottomDialog from '../../../components/dialog/FromBottomDialog'
import Switches from '../../message/components/swtich/switches'
import SlideItemMusic from './SlideItemMusic' import SlideItemMusic from './SlideItemMusic'
import IndicatorLight from '../../../components/slide/IndicatorLight'
import Share from '../../../components/Share' import Share from '../../../components/Share'
import ShareToFriend from '../../home/components/ShareToFriend' import ShareToFriend from '../../home/components/ShareToFriend'
import SlideVertical from '@/components/slide/SlideVertical.vue' import SlideVertical from '@/components/slide/SlideVertical.vue'
@ -83,16 +83,16 @@ export default {
components: { components: {
SlideVertical, SlideVertical,
FromBottomDialog, FromBottomDialog,
Switches,
SlideItemMusic, SlideItemMusic,
IndicatorLight,
Share, Share,
ShareToFriend ShareToFriend
}, },
props: { props: {
list: { list: {
type: Array, type: Array,
default: [] default() {
return []
}
} }
}, },
data() { data() {
@ -108,7 +108,7 @@ export default {
} }
}, },
watch: { watch: {
guessSlideIndex(newVal, oldVal) { guessSlideIndex(newVal) {
this.itemRefs.map((ref) => { this.itemRefs.map((ref) => {
ref.togglePlay(false) ref.togglePlay(false)
}) })

View File

@ -6,7 +6,7 @@
</div> </div>
<div class="lyrics-wrapper" ref="lyrics-wrapper" @click="isFullLyrics = true"> <div class="lyrics-wrapper" ref="lyrics-wrapper" @click="isFullLyrics = true">
<div class="container"> <div class="container">
<div class="lyrics" v-for="item in lyricsFullTexts">{{ item.c }}</div> <div class="lyrics" :key="i" v-for="(item, i) in lyricsFullTexts">{{ item.c }}</div>
</div> </div>
</div> </div>
<!-- <div class="lyrics-mask" @click="isFullLyrics = true"></div>--> <!-- <div class="lyrics-mask" @click="isFullLyrics = true"></div>-->
@ -18,7 +18,7 @@
@touchmove="$emit('slideCanMove', false)" @touchmove="$emit('slideCanMove', false)"
@touchend="$emit('slideCanMove', true)" @touchend="$emit('slideCanMove', true)"
> >
<div class="item" v-for="item in lyricsFullTexts">{{ item.c }}</div> <div class="item" :key="i" v-for="(item, i) in lyricsFullTexts">{{ item.c }}</div>
</div> </div>
</div> </div>
<div class="bottom"> <div class="bottom">
@ -139,10 +139,11 @@ export default {
created() {}, created() {},
mounted() { mounted() {
this.audio.src = this.modelValue.mp3 this.audio.src = this.modelValue.mp3
// eslint-disable-next-line no-undef
if (process.env.NODE_ENV === 'development') { if (process.env.NODE_ENV === 'development') {
this.audio.volume = 0.2 this.audio.volume = 0.2
} }
this.audio.addEventListener('loadedmetadata', (e) => { this.audio.addEventListener('loadedmetadata', () => {
this.duration = this.audio.duration this.duration = this.audio.duration
this.slideBarWidth = this.$refs.slideBar.clientWidth this.slideBarWidth = this.$refs.slideBar.clientWidth
this.step = this.slideBarWidth / Math.floor(this.duration) this.step = this.slideBarWidth / Math.floor(this.duration)
@ -180,8 +181,8 @@ export default {
} }
} }
}) })
this.audio.addEventListener('play', (e) => (this.isPlay = true)) this.audio.addEventListener('play', () => (this.isPlay = true))
this.audio.addEventListener('ended', (e) => { this.audio.addEventListener('ended', () => {
if (this.isLoop) { if (this.isLoop) {
this.lastPageX = 0 this.lastPageX = 0
this.audio.currentTime = 0 this.audio.currentTime = 0

View File

@ -103,6 +103,7 @@ export default {
if (this.localSchool.displayType === enums.DISPLAY_TYPE.ALL) return '公开可见' if (this.localSchool.displayType === enums.DISPLAY_TYPE.ALL) return '公开可见'
if (this.localSchool.displayType === enums.DISPLAY_TYPE.SCHOOL) return '校友可见' if (this.localSchool.displayType === enums.DISPLAY_TYPE.SCHOOL) return '校友可见'
if (this.localSchool.displayType === enums.DISPLAY_TYPE.ME) return '仅自己可见' if (this.localSchool.displayType === enums.DISPLAY_TYPE.ME) return '仅自己可见'
return ''
}, },
school() { school() {
return this.userinfo.school return this.userinfo.school

View File

@ -7,7 +7,7 @@
</BaseHeader> </BaseHeader>
<div class="content"> <div class="content">
<div class="schools"> <div class="schools">
<div class="row" @click="save(item)" v-for="item in list"> <div class="row" @click="save(item)" :key="i" v-for="(item, i) in list">
<span>{{ item }}</span> <span>{{ item }}</span>
</div> </div>
</div> </div>
@ -56,7 +56,7 @@ export default {
...mapState(useBaseStore, ['userinfo']) ...mapState(useBaseStore, ['userinfo'])
}, },
methods: { methods: {
async save(item) { async save() {
this.$showLoading() this.$showLoading()
let data = { ...this.userinfo, ...{ location: '中国-四川-成都' } } let data = { ...this.userinfo, ...{ location: '中国-四川-成都' } }
this.baseStore.setUserinfo(data) this.baseStore.setUserinfo(data)

View File

@ -10,7 +10,7 @@
</BaseHeader> </BaseHeader>
<div class="content"> <div class="content">
<div class="nearby"> <div class="nearby">
<div class="item" v-for="item in departments" @click="setDepartment(item)"> <div class="item" :key="i" v-for="(item, i) in departments" @click="setDepartment(item)">
{{ item }} {{ item }}
</div> </div>
</div> </div>
@ -19,13 +19,9 @@
</template> </template>
<script> <script>
import Search from '../../../components/Search'
export default { export default {
name: 'ChooseSchool', name: 'ChooseSchool',
components: { components: {},
Search
},
data() { data() {
return { return {
departments: [], departments: [],

View File

@ -26,11 +26,11 @@
<dy-back scale=".8" direction="right"></dy-back> <dy-back scale=".8" direction="right"></dy-back>
</div> </div>
</div> </div>
<div v-for="(value, name) of countryOk"> <div :key="name" v-for="(value, name) of countryOk">
<div class="row"> <div class="row">
<span>{{ name }}</span> <span>{{ name }}</span>
</div> </div>
<div class="row" v-for="item of value"> <div class="row" :key="i" v-for="(item, i) of value">
<span>{{ item.name }}</span> <span>{{ item.name }}</span>
</div> </div>
</div> </div>
@ -1197,7 +1197,7 @@ export default {
} }
}, },
methods: { methods: {
async save(item) { async save() {
this.$showLoading() this.$showLoading()
let data = { ...this.userinfo, ...{ location: '暂不设置' } } let data = { ...this.userinfo, ...{ location: '暂不设置' } }
this.baseStore.setUserinfo(data) this.baseStore.setUserinfo(data)

View File

@ -7,7 +7,7 @@
</BaseHeader> </BaseHeader>
<div class="content"> <div class="content">
<div class="schools"> <div class="schools">
<div class="row" @click="$nav('/me/choose-city')" v-for="item in list"> <div class="row" @click="$nav('/me/choose-city')" :key="i" v-for="(item, i) in list">
<span>{{ item }}</span> <span>{{ item }}</span>
<div class="right"> <div class="right">
<dy-back scale=".8" direction="right"></dy-back> <dy-back scale=".8" direction="right"></dy-back>

View File

@ -24,31 +24,30 @@
<img src="../../../assets/img/icon/location.svg" alt="" /> <img src="../../../assets/img/icon/location.svg" alt="" />
<span>离我最近</span> <span>离我最近</span>
</div> </div>
<div v-if="nearby.length" class="item" v-for="item in nearby" @click="setSchool(item)"> <template v-if="nearby.length">
{{ item }} <div class="item" :key="i" v-for="(item, i) in nearby" @click="setSchool(item)">
</div> {{ item }}
</div>
</template>
<div v-else class="item">无法获取</div> <div v-else class="item">无法获取</div>
</div> </div>
<div class="line" style="width: calc(100% - 40rem); margin-left: 20rem"></div> <div class="line" style="width: calc(100% - 40rem); margin-left: 20rem"></div>
<div class="schools" v-if="!isSearch"> <div class="schools" v-if="!isSearch">
<div class="item" v-for="item in schools" @click="setSchool(item)"> <div class="item" :key="i" v-for="(item, i) in schools" @click="setSchool(item)">
{{ item }} {{ item }}
</div> </div>
</div> </div>
<div v-if="isSearch"> <div v-if="isSearch">
<div <template v-if="searchSchools.length">
v-if="searchSchools.length" <div class="item" :key="i" v-for="(item, i) in searchSchools" @click="setSchool(item)">
class="item" <span v-if="item.indexOf(schoolName) > -1">
v-for="item in searchSchools" {{ item.substr(0, item.indexOf(schoolName)) }}
@click="setSchool(item)" <span style="color: #f50">{{ schoolName }}</span>
> {{ item.substr(item.indexOf(schoolName) + schoolName.length) }}
<span v-if="item.indexOf(schoolName) > -1"> </span>
{{ item.substr(0, item.indexOf(schoolName)) }} <span v-else>{{ item }}</span>
<span style="color: #f50">{{ schoolName }}</span> </div>
{{ item.substr(item.indexOf(schoolName) + schoolName.length) }} </template>
</span>
<span v-else>{{ item }}</span>
</div>
<div v-else class="empty"> <div v-else class="empty">
<img src="../../../assets/img/icon/head-image.jpeg" alt="" /> <img src="../../../assets/img/icon/head-image.jpeg" alt="" />
<div class="title">搜索结果为空</div> <div class="title">搜索结果为空</div>

View File

@ -28,7 +28,7 @@
</template> </template>
<script> <script>
//TODO  //TODO
export default { export default {
name: 'DeclareSchool', name: 'DeclareSchool',
data() { data() {

View File

@ -71,7 +71,7 @@
<img v-lazy="_checkImgUrl(userinfo.cover_url[0].url_list[0])" alt="" class="poster" /> <img v-lazy="_checkImgUrl(userinfo.cover_url[0].url_list[0])" alt="" class="poster" />
</div> </div>
</div> </div>
<div class="message" v-for="item in showMessageList" @click="$no"> <div class="message" :key="i" v-for="(item, i) in showMessageList" @click="$no">
<div class="left"> <div class="left">
<img v-lazy="$imgPreview(item.author.avatar)" alt="" class="avatar" /> <img v-lazy="$imgPreview(item.author.avatar)" alt="" class="avatar" />
<img <img
@ -134,7 +134,6 @@
</template> </template>
<script> <script>
import { mapState } from 'pinia' import { mapState } from 'pinia'
import People from '../people/components/People'
import Scroll from '../../components/Scroll' import Scroll from '../../components/Scroll'
import Loading from '../../components/Loading' import Loading from '../../components/Loading'
import Peoples from '../people/components/Peoples' import Peoples from '../people/components/Peoples'
@ -148,7 +147,6 @@ export default {
name: 'AllMessage', name: 'AllMessage',
components: { components: {
Scroll, Scroll,
People,
Loading, Loading,
Peoples Peoples
}, },
@ -175,6 +173,8 @@ export default {
return '@我的' return '@我的'
case 4: case 4:
return '评论' return '评论'
default:
return ''
} }
}, },
showMessageList() { showMessageList() {

View File

@ -14,7 +14,12 @@
</BaseHeader> </BaseHeader>
<div class="content"> <div class="content">
<div class="list"> <div class="list">
<div class="local-row" v-for="item of friends.all" @click="toggleSelect(item)"> <div
class="local-row"
:key="i"
v-for="(item, i) of friends.all"
@click="toggleSelect(item)"
>
<Check mode="red" v-model="item.select" /> <Check mode="red" v-model="item.select" />
<img :src="$imgPreview(item.avatar)" alt="" /> <img :src="$imgPreview(item.avatar)" alt="" />
<div class="desc"> <div class="desc">
@ -30,13 +35,12 @@
</div> </div>
</template> </template>
<script> <script>
import Search from '../../components/Search'
import Check from '../../components/Check' import Check from '../../components/Check'
import { friends } from '@/api/user' import { friends } from '@/api/user'
export default { export default {
name: 'Share2Friend', name: 'Share2Friend',
components: { Search, Check }, components: { Check },
props: {}, props: {},
computed: { computed: {
// ...mapState(['friends']), // ...mapState(['friends']),

View File

@ -12,6 +12,7 @@
<div <div
class="friend pr1r pl1r" class="friend pr1r pl1r"
@click="$nav('/message/chat')" @click="$nav('/message/chat')"
:key="index"
v-for="(item, index) in friends.all" v-for="(item, index) in friends.all"
> >
<div class="avatar" :class="index % 2 === 0 ? 'on-line' : ''"> <div class="avatar" :class="index % 2 === 0 ? 'on-line' : ''">
@ -260,7 +261,8 @@
<div class="search-result" v-if="searchFriends.length"> <div class="search-result" v-if="searchFriends.length">
<div <div
class="search-result-item" class="search-result-item"
v-for="item in searchFriends" :key="i"
v-for="(item, i) in searchFriends"
@click="handleClick(item)" @click="handleClick(item)"
> >
<img class="left" src="../../assets/img/icon/head-image.jpeg" alt="" /> <img class="left" src="../../assets/img/icon/head-image.jpeg" alt="" />
@ -295,7 +297,8 @@
<div class="index">Z</div> <div class="index">Z</div>
<div <div
class="friend-item" class="friend-item"
v-for="item in friends.all" :key="i"
v-for="(item, i) in friends.all"
@click="item.select = !item.select" @click="item.select = !item.select"
> >
<img class="left" :src="$imgPreview(item.avatar)" alt="" /> <img class="left" :src="$imgPreview(item.avatar)" alt="" />
@ -318,7 +321,7 @@
</div> </div>
<div class="chat-list"> <div class="chat-list">
<div class="chat-item" v-for="item in 15"> <div class="chat-item" :key="i" v-for="(item, i) in 15">
<img class="left" src="../../assets/img/icon/head-image.jpeg" alt="" /> <img class="left" src="../../assets/img/icon/head-image.jpeg" alt="" />
<div class="right"> <div class="right">
<div class="title"> <div class="title">
@ -362,10 +365,10 @@
</Scroll> </Scroll>
</div> </div>
</div> </div>
<Mask /> <BaseMask />
</div> </div>
</transition> </transition>
<Footer v-bind:init-tab="4" /> <BaseFooter v-bind:init-tab="4" />
</div> </div>
<div class="searching" v-show="searching"> <div class="searching" v-show="searching">
@ -390,7 +393,7 @@
</div> </div>
</div> </div>
<People <People
v-for="(item, index) in searchFriendsAll.slice(0, 3)" v-for="item in searchFriendsAll.slice(0, 3)"
:key="item.id" :key="item.id"
mode="search" mode="search"
:searchKey="searchKey" :searchKey="searchKey"
@ -411,7 +414,7 @@
</template> </template>
<template v-else> <template v-else>
<div class="sub-title">更多聊天</div> <div class="sub-title">更多聊天</div>
<People v-for="(item, index) in moreChat" :key="item.id" :people="item" /> <People v-for="item in moreChat" :key="item.id" :people="item" />
</template> </template>
</div> </div>
</div> </div>
@ -419,13 +422,11 @@
</template> </template>
<script> <script>
import Footer from '../../components/Footer.vue'
import Search from '../../components/Search' import Search from '../../components/Search'
import FromBottomDialog from '../../components/dialog/FromBottomDialog' import FromBottomDialog from '../../components/dialog/FromBottomDialog'
import Check from '../../components/Check' import Check from '../../components/Check'
import { mapState } from 'pinia' import { mapState } from 'pinia'
import Peoples from '../people/components/Peoples' import Peoples from '../people/components/Peoples'
import Mask from '../../components/Mask'
import Scroll from '../../components/Scroll' import Scroll from '../../components/Scroll'
import People from '../people/components/People' import People from '../people/components/People'
import BasePage from '../BasePage' import BasePage from '../BasePage'
@ -436,8 +437,6 @@ export default {
name: 'Message', name: 'Message',
components: { components: {
Scroll, Scroll,
Mask,
Footer,
Search, Search,
FromBottomDialog, FromBottomDialog,
Check, Check,
@ -474,7 +473,7 @@ export default {
watch: { watch: {
createChatSearchKey(newVal) { createChatSearchKey(newVal) {
if (newVal) { if (newVal) {
//TODO  //TODO
this.searchFriends = this.friends.all.filter((v) => { this.searchFriends = this.friends.all.filter((v) => {
if (v.name.includes(newVal)) return true if (v.name.includes(newVal)) return true
return v.account.includes(newVal) return v.account.includes(newVal)

View File

@ -9,7 +9,7 @@
:isShowRightText="true" :isShowRightText="true"
/> />
<People <People
v-for="(item, index) in searchFriendsAll" v-for="item in searchFriendsAll"
:key="item.id" :key="item.id"
mode="search" mode="search"
:searchKey="searchKey" :searchKey="searchKey"

View File

@ -27,7 +27,12 @@ export default {
name: 'RedPacketDetail', name: 'RedPacketDetail',
components: {}, components: {},
props: { props: {
modelValue: false modelValue: {
type: Boolean,
default() {
return false
}
}
}, },
data() { data() {
return {} return {}

View File

@ -10,7 +10,8 @@
<div class="wrapper"> <div class="wrapper">
<img <img
:src="$imgPreview(item.avatar)" :src="$imgPreview(item.avatar)"
v-for="item in selectFriends" :key="i"
v-for="(item, i) in selectFriends"
@click="toggleSelect(item)" @click="toggleSelect(item)"
/> />
</div> </div>
@ -37,7 +38,12 @@
v-show="searchKey" v-show="searchKey"
> >
<div class="list" v-if="searchResult.length"> <div class="list" v-if="searchResult.length">
<div class="local-row" v-for="item of searchResult" @click="handleClick(item)"> <div
class="local-row"
:key="i"
v-for="(item, i) of searchResult"
@click="handleClick(item)"
>
<Check mode="red" v-model="item.select" /> <Check mode="red" v-model="item.select" />
<img :src="$imgPreview(item.avatar)" alt="" /> <img :src="$imgPreview(item.avatar)" alt="" />
<div class="desc"> <div class="desc">
@ -79,23 +85,33 @@
<dy-back :scale="0.7" direction="right"></dy-back> <dy-back :scale="0.7" direction="right"></dy-back>
</div> </div>
<div class="title">最近聊天</div> <div class="title">最近聊天</div>
<div class="local-row" v-for="item of friends.recent" @click="toggleSelect(item)"> <div
class="local-row"
:key="i"
v-for="(item, i) of friends.recent"
@click="toggleSelect(item)"
>
<Check mode="red" v-model="item.select" /> <Check mode="red" v-model="item.select" />
<img :src="$imgPreview(item.avatar)" alt="" /> <img :src="$imgPreview(item.avatar)" alt="" />
<span>{{ item.name }}</span> <span>{{ item.name }}</span>
</div> </div>
<div class="title">互关好友</div> <div class="title">互关好友</div>
<div class="local-row" v-for="item of friends.eachOther" @click="toggleSelect(item)"> <div
class="local-row"
:key="i"
v-for="(item, i) of friends.eachOther"
@click="toggleSelect(item)"
>
<Check mode="red" v-model="item.select" /> <Check mode="red" v-model="item.select" />
<img :src="$imgPreview(item.avatar)" alt="" /> <img :src="$imgPreview(item.avatar)" alt="" />
<span>{{ item.name }}</span> <span>{{ item.name }}</span>
</div> </div>
<div class="title">全部</div> <div class="title">全部</div>
<div v-for="(value, name) of friendsSort"> <div :key="name" v-for="(value, name) of friendsSort">
<div :class="name === '#' ? 'top' : name" class="title"> <div :class="name === '#' ? 'top' : name" class="title">
<span>{{ name }}</span> <span>{{ name }}</span>
</div> </div>
<div class="local-row" v-for="item of value" @click="toggleSelect(item)"> <div class="local-row" :key="i" v-for="(item, i) of value" @click="toggleSelect(item)">
<Check mode="red" v-model="item.select" /> <Check mode="red" v-model="item.select" />
<img :src="$imgPreview(item.avatar)" alt="" /> <img :src="$imgPreview(item.avatar)" alt="" />
<span>{{ item.name }}</span> <span>{{ item.name }}</span>
@ -161,13 +177,12 @@
</div> </div>
</template> </template>
<script> <script>
import Search from '../../components/Search'
import Check from '../../components/Check' import Check from '../../components/Check'
import { friends } from '@/api/user' import { friends } from '@/api/user'
export default { export default {
name: 'Share2Friend', name: 'Share2Friend',
components: { Search, Check }, components: { Check },
props: {}, props: {},
computed: { computed: {
// ...mapState(['friends']), // ...mapState(['friends']),
@ -231,11 +246,11 @@ export default {
render(currentIndex) render(currentIndex)
} }
}) })
ul.addEventListener('touchend', (e) => { ul.addEventListener('touchend', () => {
return (this.currentFixedIndicator = '') return (this.currentFixedIndicator = '')
}) })
let render = (currentIndex) => { let render = (currentIndex) => {
items.forEach((el, index) => { items.forEach((el) => {
el.style.color = resetColor el.style.color = resetColor
}) })
items[currentIndex].style.color = '#fff' items[currentIndex].style.color = '#fff'

View File

@ -26,8 +26,8 @@
@itemClick="clickItem" @itemClick="clickItem"
v-longpress="showTooltip" v-longpress="showTooltip"
:message="item" :message="item"
:key="index"
v-for="(item, index) in messages" v-for="(item, index) in messages"
:key="item"
></ChatMessage> ></ChatMessage>
</div> </div>
<div class="footer"> <div class="footer">
@ -135,7 +135,7 @@
<!-- 红包 --> <!-- 红包 -->
<transition name="scale"> <transition name="scale">
<div class="red-packet" v-if="isShowOpenRedPacket"> <div class="red-packet" v-if="isShowOpenRedPacket">
<Mask @click="isShowOpenRedPacket = false" /> <BaseMask @click="isShowOpenRedPacket = false" />
<div class="content"> <div class="content">
<template v-if="isOpened"> <template v-if="isOpened">
<img src="../../../assets/img/icon/message/chat/bg-open.png" alt="" class="bg" /> <img src="../../../assets/img/icon/message/chat/bg-open.png" alt="" class="bg" />
@ -184,11 +184,11 @@
<script> <script>
import ChatMessage from '../components/ChatMessage' import ChatMessage from '../components/ChatMessage'
import { inject, nextTick } from 'vue' import { inject, nextTick } from 'vue'
import Mask from '../../../components/Mask'
import { mapState } from 'pinia' import { mapState } from 'pinia'
import Loading from '../../../components/Loading' import Loading from '../../../components/Loading'
import { useBaseStore } from '@/store/pinia' import { useBaseStore } from '@/store/pinia'
import { _checkImgUrl } from '@/utils' import { _checkImgUrl } from '@/utils'
import $ from "jquery";
let CALL_STATE = { let CALL_STATE = {
REJECT: 0, REJECT: 0,
@ -228,7 +228,6 @@ export default {
name: 'Chat', name: 'Chat',
components: { components: {
Loading, Loading,
Mask,
ChatMessage ChatMessage
}, },
data() { data() {

View File

@ -11,6 +11,7 @@
@follow="follow(index)" @follow="follow(index)"
@unfollow="unfollow(index)" @unfollow="unfollow(index)"
mode="normal-add-button" mode="normal-add-button"
:key="index"
v-for="(item, index) in list" v-for="(item, index) in list"
:people="item" :people="item"
/> />
@ -58,7 +59,6 @@
<script> <script>
import Switches from '../components/swtich/switches' import Switches from '../components/swtich/switches'
import People from '../../people/components/People' import People from '../../people/components/People'
import FromBottomDialog from '../../../components/dialog/FromBottomDialog'
import BlockDialog from '../components/BlockDialog' import BlockDialog from '../components/BlockDialog'
import CONST_VAR from '../../../utils/const_var' import CONST_VAR from '../../../utils/const_var'
@ -67,7 +67,6 @@ export default {
components: { components: {
Switches, Switches,
People, People,
FromBottomDialog,
BlockDialog BlockDialog
}, },
data() { data() {

View File

@ -26,7 +26,12 @@ export default {
FromBottomDialog FromBottomDialog
}, },
props: { props: {
modelValue: false modelValue: {
type: Boolean,
default() {
return false
}
}
}, },
data() { data() {
return {} return {}

View File

@ -91,6 +91,7 @@
<div class="loves" v-if="message.loved?.length"> <div class="loves" v-if="message.loved?.length">
<img src="../../../assets/img/icon/loved.svg" alt="" /> <img src="../../../assets/img/icon/loved.svg" alt="" />
<img <img
:key="user"
v-for="user in message.loved" v-for="user in message.loved"
src="../../../assets/img/icon/head-image.jpeg" src="../../../assets/img/icon/head-image.jpeg"
alt="" alt=""
@ -112,14 +113,17 @@ let CALL_STATE = {
RESOLVE: 1, RESOLVE: 1,
NONE: 2 NONE: 2
} }
// eslint-disable-next-line
let VIDEO_STATE = { let VIDEO_STATE = {
VALID: 0, VALID: 0,
INVALID: 1 INVALID: 1
} }
// eslint-disable-next-line
let AUDIO_STATE = { let AUDIO_STATE = {
NORMAL: 0, NORMAL: 0,
SENDING: 1 SENDING: 1
} }
// eslint-disable-next-line
let READ_STATE = { let READ_STATE = {
SENDING: 0, SENDING: 0,
ARRIVED: 1, ARRIVED: 1,

View File

@ -10,8 +10,8 @@
<div class="content"> <div class="content">
<NoMore /> <NoMore />
<div class="list"> <div class="list">
<!--TODO 超过3行显示全文--> <!--TODO 超过3行显示全文-->
<div class="item" v-for="item in list" @click="goDetail(item)"> <div class="item" :key="i" v-for="(item, i) in list" @click="goDetail(item)">
<div class="title"> <div class="title">
{{ item.title }} {{ item.title }}
<div class="ml1r not-read" v-if="!item.read"></div> <div class="ml1r not-read" v-if="!item.read"></div>

View File

@ -13,7 +13,7 @@
<Scroll ref="mainScroll"> <Scroll ref="mainScroll">
<div class="list"> <div class="list">
<NoMore /> <NoMore />
<div class="item" v-for="item in list" @click="goDetail(item)"> <div class="item" :key="i" v-for="(item, i) in list" @click="goDetail(item)">
<div class="title">{{ item.title }}</div> <div class="title">{{ item.title }}</div>
<div class="time">{{ item.time }}</div> <div class="time">{{ item.time }}</div>
<div class="content-text">{{ item.content }}</div> <div class="content-text">{{ item.content }}</div>
@ -25,8 +25,6 @@
</template> </template>
<script> <script>
import { nextTick } from 'vue' import { nextTick } from 'vue'
import Mask from '../../../components/Mask'
import FromBottomDialog from '../../../components/dialog/FromBottomDialog'
import Scroll from '../../../components/Scroll' import Scroll from '../../../components/Scroll'
import BasePage from '../../BasePage' import BasePage from '../../BasePage'
@ -34,8 +32,7 @@ export default {
extends: BasePage, extends: BasePage,
name: 'LiveNotice', name: 'LiveNotice',
components: { components: {
Scroll, Scroll
FromBottomDialog
}, },
data() { data() {
return { return {

View File

@ -15,8 +15,8 @@
<Scroll ref="mainScroll"> <Scroll ref="mainScroll">
<div class="list"> <div class="list">
<NoMore /> <NoMore />
<!--TODO 超过3行显示全文--> <!--TODO 超过3行显示全文-->
<div class="item" v-for="item in list" @click="$no"> <div class="item" :key="i" v-for="(item, i) in list" @click="$no">
<div class="header"> <div class="header">
<div class="left"> <div class="left">
<img src="../../../assets/img/icon/msg-icon9.webp" alt="" /> <img src="../../../assets/img/icon/msg-icon9.webp" alt="" />

View File

@ -79,7 +79,12 @@ export default {
name: 'NoticeSetting', name: 'NoticeSetting',
components: { Switches }, components: { Switches },
props: { props: {
modelValue: false modelValue: {
type: Boolean,
default() {
return false
}
}
}, },
data() { data() {
return { return {

View File

@ -15,8 +15,8 @@
<Scroll ref="mainScroll"> <Scroll ref="mainScroll">
<div class="list"> <div class="list">
<NoMore /> <NoMore />
<!--TODO 超过3行显示全文--> <!--TODO 超过3行显示全文-->
<div class="item" v-for="item in list" @click="goDetail(item)"> <div class="item" :key="i" v-for="(item, i) in list" @click="goDetail(item)">
<div class="title"> <div class="title">
{{ item.title }} {{ item.title }}
<div class="ml1r not-read" v-if="!item.read"></div> <div class="ml1r not-read" v-if="!item.read"></div>
@ -31,7 +31,7 @@
</div> </div>
</Scroll> </Scroll>
<!-- TODO 子页面未做--> <!--TODO 子页面未做-->
<div class="hover-dialog left" v-if="isShowLeftHover"> <div class="hover-dialog left" v-if="isShowLeftHover">
<div class="arrow"></div> <div class="arrow"></div>
<div class="l-row no-border" @click="$no">登录设备管理</div> <div class="l-row no-border" @click="$no">登录设备管理</div>
@ -45,7 +45,7 @@
<div class="l-row" @click="$no">安全课堂</div> <div class="l-row" @click="$no">安全课堂</div>
</div> </div>
<Mask mode="white" v-if="isShowMask" @click="isShowMask = false" /> <BaseMask mode="white" v-if="isShowMask" @click="isShowMask = false" />
<div class="options"> <div class="options">
<div class="option" @click="isShowLeftHover = !isShowLeftHover"> <div class="option" @click="isShowLeftHover = !isShowLeftHover">
@ -65,14 +65,13 @@
</template> </template>
<script> <script>
import { nextTick } from 'vue' import { nextTick } from 'vue'
import Mask from '../../../components/Mask'
import Scroll from '../../../components/Scroll' import Scroll from '../../../components/Scroll'
import BasePage from '../../BasePage' import BasePage from '../../BasePage'
export default { export default {
extends: BasePage, extends: BasePage,
name: 'SystemNotice', name: 'SystemNotice',
components: { Mask, Scroll }, components: { Scroll },
data() { data() {
return { return {
loading: false, loading: false,

View File

@ -13,8 +13,8 @@
<Scroll ref="mainScroll"> <Scroll ref="mainScroll">
<div class="list"> <div class="list">
<NoMore /> <NoMore />
<!--TODO 超过3行显示全文--> <!--TODO 超过3行显示全文-->
<div class="item" v-for="item in list" @click="goDetail(item)"> <div class="item" :key="i" v-for="(item, i) in list" @click="goDetail(item)">
<div class="header"> <div class="header">
<div class="left"> <div class="left">
<img src="../../../assets/img/icon/message/task.webp" alt="" /> <img src="../../../assets/img/icon/message/task.webp" alt="" />
@ -63,7 +63,6 @@
</template> </template>
<script> <script>
import { nextTick } from 'vue' import { nextTick } from 'vue'
import Mask from '../../../components/Mask'
import FromBottomDialog from '../../../components/dialog/FromBottomDialog' import FromBottomDialog from '../../../components/dialog/FromBottomDialog'
import Scroll from '../../../components/Scroll' import Scroll from '../../../components/Scroll'
import BasePage from '../../BasePage' import BasePage from '../../BasePage'

View File

@ -10,7 +10,7 @@
<div class="scroll" ref="scrollEl"> <div class="scroll" ref="scrollEl">
<div class="slide-imgs"> <div class="slide-imgs">
<SlideHorizontal v-model:index="state.index"> <SlideHorizontal v-model:index="state.index">
<SlideItem v-for="item in props.detail.note_card?.image_list"> <SlideItem :key="i" v-for="(item, i) in props.detail.note_card?.image_list">
<img :src="_checkImgUrl(item.info_list?.[0]?.url)" alt="" /> <img :src="_checkImgUrl(item.info_list?.[0]?.url)" alt="" />
</SlideItem> </SlideItem>
</SlideHorizontal> </SlideHorizontal>
@ -19,7 +19,8 @@
<div <div
class="indicator" class="indicator"
:class="[i <= state.index + 1 && 'active']" :class="[i <= state.index + 1 && 'active']"
v-for="i in props.detail.note_card?.image_list?.length" :key="j"
v-for="(i, j) in props.detail.note_card?.image_list?.length"
></div> ></div>
</div> </div>
</div> </div>
@ -49,7 +50,11 @@
<Icon class="arrow" icon="mingcute:right-line" /> <Icon class="arrow" icon="mingcute:right-line" />
</div> </div>
</header> </header>
<div class="comment" v-for="i in props.detail.note_card.comment_list.slice(0, 2)"> <div
class="comment"
:key="j"
v-for="(i, j) in props.detail.note_card.comment_list.slice(0, 2)"
>
<img src="https://cdn.seovx.com/?mom=302" alt="" class="avatar" /> <img src="https://cdn.seovx.com/?mom=302" alt="" class="avatar" />
<span> {{ i.name }}{{ i.text }} </span> <span> {{ i.name }}{{ i.text }} </span>
</div> </div>

View File

@ -129,14 +129,6 @@ const nav = useNav()
const router = useRouter() const router = useRouter()
const baseStore = useBaseStore() const baseStore = useBaseStore()
const data = reactive({
dialog: {
shareToFriend: false,
permissionDialog: false,
test: false
},
isMy: false
})
const state = reactive({ const state = reactive({
baseIndex: 1, baseIndex: 1,
@ -199,17 +191,17 @@ function setCurrentItem(item) {
} }
onMounted(() => { onMounted(() => {
bus.on(EVENT_KEY.ENTER_FULLSCREEN, (e) => (state.fullScreen = true)) bus.on(EVENT_KEY.ENTER_FULLSCREEN, () => (state.fullScreen = true))
bus.on(EVENT_KEY.EXIT_FULLSCREEN, (e) => (state.fullScreen = false)) bus.on(EVENT_KEY.EXIT_FULLSCREEN, () => (state.fullScreen = false))
bus.on(EVENT_KEY.OPEN_COMMENTS, (e) => { bus.on(EVENT_KEY.OPEN_COMMENTS, () => {
bus.emit(EVENT_KEY.ENTER_FULLSCREEN) bus.emit(EVENT_KEY.ENTER_FULLSCREEN)
state.commentVisible = true state.commentVisible = true
}) })
bus.on(EVENT_KEY.CLOSE_COMMENTS, (e) => { bus.on(EVENT_KEY.CLOSE_COMMENTS, () => {
bus.emit(EVENT_KEY.EXIT_FULLSCREEN) bus.emit(EVENT_KEY.EXIT_FULLSCREEN)
state.commentVisible = false state.commentVisible = false
}) })
bus.on(EVENT_KEY.SHOW_SHARE, (e) => { bus.on(EVENT_KEY.SHOW_SHARE, () => {
state.isSharing = true state.isSharing = true
}) })
bus.on(EVENT_KEY.NAV, ({ path, query }) => nav(path, query)) bus.on(EVENT_KEY.NAV, ({ path, query }) => nav(path, query))

View File

@ -1,205 +0,0 @@
<template>
<div id="video-detail">
<div class="search-wrapper">
<Icon class="back" icon="icon-park-outline:left" @click="$back" />
<div class="search" @click="nav('/home/search')">
<div class="left">
<Icon class="icon" icon="ion:search" />
<span>搜你想看的</span>
</div>
<div class="right">
<span class="gang">|</span>
<span class="txt">搜索</span>
</div>
</div>
</div>
<div class="content">
<SlideVerticalInfinite
ref="listRef"
v-love="state.uniqueId"
:id="state.uniqueId"
:uniqueId="state.uniqueId"
name="main"
:active="true"
:loading="false"
v-model:index="state.index"
:render="render"
:list="state.list"
/>
</div>
<div class="footer">
<div class="comment">
<div class="left">
<img
:src="_checkImgUrl(store.userinfo.avatar_168x168.url_list[0])"
class="avatar"
alt=""
/>
<span>善语结善缘恶言伤人心</span>
</div>
<div class="right">
<Icon icon="tabler:photo" />
<Icon icon="ion:at-sharp" />
<Icon icon="fa-regular:laugh" />
</div>
</div>
</div>
</div>
</template>
<script setup>
import { onMounted, reactive } from 'vue'
import { useBaseStore } from '@/store/pinia'
import SlideVerticalInfinite from '@/components/slide/SlideVerticalInfinite.vue'
import { useSlideListItemRender } from '@/utils/hooks/useSlideListItemRender'
import { _checkImgUrl } from '@/utils'
import { useNav } from '@/utils/hooks/useNav'
defineOptions({
name: 'VideoDetail'
})
const nav = useNav()
const store = useBaseStore()
const data = reactive({
dialog: {
shareToFriend: false,
permissionDialog: false,
test: false
},
isMy: false
})
const state = reactive({
index: 0,
list: [],
uniqueId: 'uniqueId_2',
totalSize: 0,
pageSize: 10,
pageNo: 0
})
const render = useSlideListItemRender()
onMounted(() => {
// console.log('s', store.routeData)
state.index = store.routeData.index
state.list = store.routeData.list
// console.log('sss', state.list[state.index])
})
</script>
<style scoped lang="less">
@import '../../assets/less/index';
#video-detail {
position: fixed;
font-size: 14rem;
top: 0;
bottom: 0;
left: 0;
right: 0;
height: 100%;
width: 100%;
background: black;
.search-wrapper {
z-index: 9;
position: fixed;
top: 8rem;
left: 0;
width: 100vw;
padding: 0 15rem;
box-sizing: border-box;
display: flex;
align-items: center;
gap: 15rem;
.back {
color: white;
font-size: 30rem;
}
.search {
color: var(--second-btn-color);
display: flex;
background: rgba(171, 169, 169, 0.4);
border-radius: 8rem;
flex: 1;
padding: 8rem;
justify-content: space-between;
.left {
font-size: 15rem;
display: flex;
align-items: center;
color: gainsboro;
gap: 5rem;
line-height: 1;
svg {
font-size: 14rem;
}
}
.right {
display: flex;
align-items: center;
gap: 10rem;
font-size: 16rem;
.gang {
color: dimgrey;
}
.txt {
color: white;
}
}
}
}
.content {
height: calc(var(--vh, 1vh) * 100 - var(--footer-height));
}
.footer {
height: var(--footer-height);
position: fixed;
bottom: 0;
width: 100%;
display: flex;
justify-content: center;
align-items: center;
}
.comment {
color: var(--second-text-color);
z-index: 9;
width: 95%;
height: 75%;
box-sizing: border-box;
padding: 0 10px;
display: flex;
justify-content: space-between;
align-items: center;
background: rgb(37, 37, 37);
border-radius: 50rem;
.avatar {
height: 70%;
border-radius: 50%;
}
.left {
height: 100%;
display: flex;
align-items: center;
gap: 10rem;
}
.right {
.left;
gap: 15rem;
font-size: 24rem;
}
}
}
</style>

View File

@ -11,7 +11,7 @@
<div class="left">已有20+位朋友加入抖音</div> <div class="left">已有20+位朋友加入抖音</div>
</div> </div>
<div class="list"> <div class="list">
<People v-for="item in list" :people="item"></People> <People :key="i" v-for="(item, i) in list" :people="item"></People>
</div> </div>
</div> </div>
<div class="footer">为尊重用户选择仅展示已授权用户</div> <div class="footer">为尊重用户选择仅展示已授权用户</div>

View File

@ -58,7 +58,12 @@
style="width: 10rem; margin-left: 2rem" style="width: 10rem; margin-left: 2rem"
/> />
</div> </div>
<People v-for="item in friends.all" :people="item" mode="recommend"></People> <People
:key="i"
v-for="(item, i) in friends.all"
:people="item"
mode="recommend"
></People>
</div> </div>
<div class="is-search" v-else> <div class="is-search" v-else>
<div class="tooltip" v-if="searchKey && !isSearch"> <div class="tooltip" v-if="searchKey && !isSearch">
@ -66,24 +71,26 @@
搜索用户名字/抖音号<span class="searchKey">{{ searchKey }}</span> 搜索用户名字/抖音号<span class="searchKey">{{ searchKey }}</span>
</div> </div>
<!-- TODO --> <!-- TODO -->
<People <template v-if="isSearch">
v-if="isSearch" <People
v-for="item in friends.all" :key="i"
:people="item" v-for="(item, i) in friends.all"
mode="recommend" :people="item"
></People> mode="recommend"
></People>
</template>
</div> </div>
</SlideItem> </SlideItem>
<SlideItem class="tab2" style="overflow: auto"> <SlideItem class="tab2" style="overflow: auto">
<Search placeholder="搜索用户备注或名字" class="mr20p ml20p mt10p"></Search> <Search placeholder="搜索用户备注或名字" class="mr20p ml20p mt10p"></Search>
<div class="title">{{ friends.all.length }} 位朋友</div> <div class="title">{{ friends.all.length }} 位朋友</div>
<People v-for="item in friends.all" :people="item" mode="friend"></People> <People :key="i" v-for="(item, i) in friends.all" :people="item" mode="friend"></People>
<NoMore class="mb5r" /> <NoMore class="mb5r" />
</SlideItem> </SlideItem>
</SlideHorizontal> </SlideHorizontal>
<transition name="fade"> <transition name="fade">
<Mask v-if="maskDialog" @click="maskDialog = false"></Mask> <BaseMask v-if="maskDialog" @click="maskDialog = false"/>
</transition> </transition>
<transition name="fade"> <transition name="fade">

View File

@ -35,7 +35,7 @@
/> />
<div class="is-search" v-if="searchKey"> <div class="is-search" v-if="searchKey">
<div class="search-result" v-if="searchFriends.length"> <div class="search-result" v-if="searchFriends.length">
<People v-for="item in searchFriends" :people="item"></People> <People :key="i" v-for="(item, i) in searchFriends" :people="item"></People>
</div> </div>
<div class="no-result" v-else> <div class="no-result" v-else>
<img src="../../assets/img/icon/no-result.png" alt="" /> <img src="../../assets/img/icon/no-result.png" alt="" />
@ -45,11 +45,11 @@
</div> </div>
<div class="no-search" v-else> <div class="no-search" v-else>
<div class="title">我的关注</div> <div class="title">我的关注</div>
<People v-for="item in friends.all" :people="item"></People> <People :key="i" v-for="(item, i) in friends.all" :people="item"></People>
</div> </div>
</SlideItem> </SlideItem>
<SlideItem class="tab2"> <SlideItem class="tab2">
<People v-for="item in friends.all" :people="item"></People> <People :key="i" v-for="(item, i) in friends.all" :people="item"></People>
<NoMore /> <NoMore />
</SlideItem> </SlideItem>
</SlideHorizontal> </SlideHorizontal>
@ -60,7 +60,6 @@
import People from './components/People' import People from './components/People'
import Search from '../../components/Search' import Search from '../../components/Search'
import Indicator from '../../components/slide/Indicator' import Indicator from '../../components/slide/Indicator'
import FromBottomDialog from '../../components/dialog/FromBottomDialog'
import { mapState } from 'pinia' import { mapState } from 'pinia'
import { useBaseStore } from '@/store/pinia' import { useBaseStore } from '@/store/pinia'
@ -69,8 +68,7 @@ export default {
components: { components: {
People, People,
Search, Search,
Indicator, Indicator
FromBottomDialog
}, },
data() { data() {
return { return {
@ -87,7 +85,7 @@ export default {
watch: { watch: {
searchKey(newVal) { searchKey(newVal) {
if (newVal) { if (newVal) {
//TODO  //TODO
this.searchFriends = this.friends.all.filter((v) => { this.searchFriends = this.friends.all.filter((v) => {
if (v.name.includes(newVal)) return true if (v.name.includes(newVal)) return true
return v.account.includes(newVal) return v.account.includes(newVal)

View File

@ -64,7 +64,7 @@
<template v-if="people.type === RELATE_ENUM.REQUEST_FOLLOW"> <template v-if="people.type === RELATE_ENUM.REQUEST_FOLLOW">
发来一个关注请求 发来一个关注请求
</template> </template>
<template v-else> 关注了你 </template> <template v-else> 关注了你</template>
</div> </div>
<div class="detail">07-23</div> <div class="detail">07-23</div>
</div> </div>
@ -166,7 +166,9 @@ export default {
props: { props: {
people: { people: {
type: Object, type: Object,
default: {} default() {
return {}
}
}, },
mode: { mode: {
type: String, type: String,

View File

@ -43,7 +43,9 @@ export default {
props: { props: {
list: { list: {
type: Array, type: Array,
default: [] default() {
return []
}
}, },
mode: { mode: {
type: String, type: String,

View File

@ -48,7 +48,7 @@
<div class="slide-imgs"> <div class="slide-imgs">
<SlideHorizontal v-model:index="state.index"> <SlideHorizontal v-model:index="state.index">
<SlideItem v-for="item in state.detail.imgs"> <SlideItem v-for="(item, i) in state.detail.imgs" :key="i">
<img v-lazy="_checkImgUrl('goods/' + item)" alt="" /> <img v-lazy="_checkImgUrl('goods/' + item)" alt="" />
</SlideItem> </SlideItem>
</SlideHorizontal> </SlideHorizontal>
@ -264,7 +264,8 @@
v-lazy="_checkImgUrl('goods/' + i)" v-lazy="_checkImgUrl('goods/' + i)"
alt="" alt=""
class="avatar" class="avatar"
v-for="i in state.detail.imgs" :key="j"
v-for="(i, j) in state.detail.imgs"
/> />
</div> </div>
</div> </div>
@ -275,6 +276,7 @@
class="item" class="item"
:class="activeIndexs.includes(i) && 'active'" :class="activeIndexs.includes(i) && 'active'"
@click="toggle(i)" @click="toggle(i)"
:key="i"
v-for="(item, i) in 3" v-for="(item, i) in 3"
> >
<header> <header>

View File

@ -108,12 +108,11 @@
</WaterfallList> </WaterfallList>
</template> </template>
</ScrollList> </ScrollList>
<Footer v-bind:init-tab="2" :is-white="true" style="position: fixed; left: 0" /> <BaseFooter v-bind:init-tab="2" :is-white="true" style="position: fixed; left: 0" />
</div> </div>
</template> </template>
<script setup lang="jsx"> <script setup lang="jsx">
import { onMounted, reactive } from 'vue'
import { useNav } from '@/utils/hooks/useNav' import { useNav } from '@/utils/hooks/useNav'
import { $no, _checkImgUrl } from '@/utils' import { $no, _checkImgUrl } from '@/utils'
import ScrollList from '@/components/ScrollList.vue' import ScrollList from '@/components/ScrollList.vue'
@ -125,12 +124,6 @@ defineOptions({
}) })
const nav = useNav() const nav = useNav()
const state = reactive({
listEl: null,
fixed: false
})
onMounted(() => {})
</script> </script>
<style scoped lang="less"> <style scoped lang="less">

View File

@ -6,17 +6,13 @@
</div> </div>
</template> </template>
<script> <script>
import ShareToFriend from '../home/components/ShareToFriend'
import BaseButton from '../../components/BaseButton' import BaseButton from '../../components/BaseButton'
import Search from '../../components/Search'
import VideoShare from '../home/components/VideoShare' import VideoShare from '../home/components/VideoShare'
export default { export default {
name: 'Test4', name: 'Test4',
components: { components: {
BaseButton, BaseButton,
ShareToFriend,
Search,
VideoShare VideoShare
}, },
props: { props: {

View File

@ -1,5 +1,3 @@
import globalMethods from './index'
export default class Dom { export default class Dom {
els = [] els = []

Some files were not shown because too many files have changed in this diff Show More