master
Janx 2 years ago
parent 5dd33c108c
commit 104cd0fcf2

173
package-lock.json generated

@ -12,13 +12,17 @@
"core-js": "^3.6.5",
"crypto-js": "^4.1.1",
"element-ui": "^2.4.5",
"lg-thumbnail.js": "^1.2.0",
"lightgallery.js": "^1.4.0",
"markdown-it": "^12.2.0",
"mavon-editor": "^2.9.1",
"qs": "^6.10.3",
"useless-files-webpack-plugin": "^1.0.1",
"vue": "^2.6.11",
"vue-baberrage": "^3.2.4",
"vue-ripple-directive": "^2.0.1",
"vue-router": "^3.2.0",
"vuedraggable": "^2.24.3",
"vuex": "^3.4.0",
"vuex-persistedstate": "^4.0.0"
},
@ -3381,8 +3385,7 @@
"node_modules/balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz",
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
"dev": true
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
},
"node_modules/base": {
"version": "0.11.2",
@ -3560,7 +3563,6 @@
"version": "1.1.11",
"resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"dev": true,
"dependencies": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
@ -4534,8 +4536,7 @@
"node_modules/concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
"dev": true
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
},
"node_modules/concat-stream": {
"version": "1.6.2",
@ -7311,8 +7312,7 @@
"node_modules/fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz",
"integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
"dev": true
"integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
},
"node_modules/fsevents": {
"version": "2.3.2",
@ -7434,7 +7434,6 @@
"version": "7.2.2",
"resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.2.tgz",
"integrity": "sha512-NzDgHDiJwKYByLrL5lONmQFpK/2G78SMMfo+E9CuGlX4IkvfKDsiQSNPwAYxEy+e6p7ZQ3uslSLlwlJcqezBmQ==",
"dev": true,
"dependencies": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
@ -8209,7 +8208,6 @@
"version": "1.0.6",
"resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz",
"integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
"dev": true,
"dependencies": {
"once": "^1.3.0",
"wrappy": "1"
@ -8218,8 +8216,7 @@
"node_modules/inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"dev": true
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
"node_modules/inquirer": {
"version": "7.3.3",
@ -8353,7 +8350,6 @@
"version": "1.4.0",
"resolved": "https://registry.npmmirror.com/interpret/-/interpret-1.4.0.tgz",
"integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==",
"dev": true,
"engines": {
"node": ">= 0.10"
}
@ -8502,7 +8498,6 @@
"version": "2.9.0",
"resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.9.0.tgz",
"integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==",
"dev": true,
"dependencies": {
"has": "^1.0.3"
}
@ -9039,6 +9034,16 @@
"node": ">= 0.8.0"
}
},
"node_modules/lg-thumbnail.js": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/lg-thumbnail.js/-/lg-thumbnail.js-1.2.0.tgz",
"integrity": "sha512-qmNFbjLv1spCf3sB8HRX9vW8UtKcgq7qJIg10jLqCozSquhTJwSPUb5vyPgl3cZpgLFjRMiOpIRgBjGrX4inNQ=="
},
"node_modules/lightgallery.js": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/lightgallery.js/-/lightgallery.js-1.4.0.tgz",
"integrity": "sha512-TK7auNMSz0sPjotq/VtKH/fe8GPkVRlmFf8F3zVsbFccLJL4r3U1VON+IggyE8Wy04QwbFQxTIIMqL7blibGSA=="
},
"node_modules/lines-and-columns": {
"version": "1.2.4",
"resolved": "https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
@ -9529,7 +9534,6 @@
"version": "3.1.2",
"resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz",
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"dev": true,
"dependencies": {
"brace-expansion": "^1.1.7"
},
@ -10097,7 +10101,6 @@
"version": "1.4.0",
"resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz",
"integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
"dev": true,
"dependencies": {
"wrappy": "1"
}
@ -10516,7 +10519,6 @@
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
@ -10539,8 +10541,7 @@
"node_modules/path-parse": {
"version": "1.0.7",
"resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz",
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
"dev": true
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
},
"node_modules/path-to-regexp": {
"version": "0.1.7",
@ -11741,6 +11742,17 @@
"node": ">=8.10.0"
}
},
"node_modules/rechoir": {
"version": "0.6.2",
"resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
"integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==",
"dependencies": {
"resolve": "^1.1.6"
},
"engines": {
"node": ">= 0.10"
}
},
"node_modules/regenerate": {
"version": "1.4.2",
"resolved": "https://registry.npmmirror.com/regenerate/-/regenerate-1.4.2.tgz",
@ -11991,7 +12003,6 @@
"version": "1.22.0",
"resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.0.tgz",
"integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==",
"dev": true,
"dependencies": {
"is-core-module": "^2.8.1",
"path-parse": "^1.0.7",
@ -12478,6 +12489,22 @@
"integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==",
"dev": true
},
"node_modules/shelljs": {
"version": "0.8.5",
"resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz",
"integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==",
"dependencies": {
"glob": "^7.0.0",
"interpret": "^1.0.0",
"rechoir": "^0.6.2"
},
"bin": {
"shjs": "bin/shjs"
},
"engines": {
"node": ">=4"
}
},
"node_modules/shvl": {
"version": "2.0.3",
"resolved": "https://registry.npmmirror.com/shvl/-/shvl-2.0.3.tgz",
@ -12810,6 +12837,11 @@
"node": ">=0.10.0"
}
},
"node_modules/sortablejs": {
"version": "1.10.2",
"resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.10.2.tgz",
"integrity": "sha512-YkPGufevysvfwn5rfdlGyrGjt7/CRHwvRPogD/lC+TnvcN29jDpCifKP+rBqf+LRldfXSTh+0CGLcSg0VIxq3A=="
},
"node_modules/source-list-map": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/source-list-map/-/source-list-map-2.0.1.tgz",
@ -13301,7 +13333,6 @@
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
"dev": true,
"engines": {
"node": ">= 0.4"
}
@ -14308,6 +14339,14 @@
"node": ">=0.10.0"
}
},
"node_modules/useless-files-webpack-plugin": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/useless-files-webpack-plugin/-/useless-files-webpack-plugin-1.0.1.tgz",
"integrity": "sha512-k1CXjiehq3gpDvZmUJB7RLBbYjsBLFcBWDp7FQunYnPpo1W8zjHceqOr7J5N0NZndmLotodKurARWua71E/ADA==",
"dependencies": {
"shelljs": "^0.8.1"
}
},
"node_modules/util": {
"version": "0.11.1",
"resolved": "https://registry.npmmirror.com/util/-/util-0.11.1.tgz",
@ -14688,6 +14727,14 @@
"integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==",
"dev": true
},
"node_modules/vuedraggable": {
"version": "2.24.3",
"resolved": "https://registry.npmjs.org/vuedraggable/-/vuedraggable-2.24.3.tgz",
"integrity": "sha512-6/HDXi92GzB+Hcs9fC6PAAozK1RLt1ewPTLjK0anTYguXLAeySDmcnqE8IC0xa7shvSzRjQXq3/+dsZ7ETGF3g==",
"dependencies": {
"sortablejs": "1.10.2"
}
},
"node_modules/vuex": {
"version": "3.6.2",
"resolved": "https://registry.npmmirror.com/vuex/-/vuex-3.6.2.tgz",
@ -15653,8 +15700,7 @@
"node_modules/wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
"dev": true
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
},
"node_modules/write": {
"version": "1.0.3",
@ -18475,8 +18521,7 @@
"balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz",
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
"dev": true
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
},
"base": {
"version": "0.11.2",
@ -18641,7 +18686,6 @@
"version": "1.1.11",
"resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"dev": true,
"requires": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
@ -19475,8 +19519,7 @@
"concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
"dev": true
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
},
"concat-stream": {
"version": "1.6.2",
@ -21768,8 +21811,7 @@
"fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz",
"integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
"dev": true
"integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
},
"fsevents": {
"version": "2.3.2",
@ -21866,7 +21908,6 @@
"version": "7.2.2",
"resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.2.tgz",
"integrity": "sha512-NzDgHDiJwKYByLrL5lONmQFpK/2G78SMMfo+E9CuGlX4IkvfKDsiQSNPwAYxEy+e6p7ZQ3uslSLlwlJcqezBmQ==",
"dev": true,
"requires": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
@ -22497,7 +22538,6 @@
"version": "1.0.6",
"resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz",
"integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
"dev": true,
"requires": {
"once": "^1.3.0",
"wrappy": "1"
@ -22506,8 +22546,7 @@
"inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"dev": true
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
"inquirer": {
"version": "7.3.3",
@ -22617,8 +22656,7 @@
"interpret": {
"version": "1.4.0",
"resolved": "https://registry.npmmirror.com/interpret/-/interpret-1.4.0.tgz",
"integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==",
"dev": true
"integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA=="
},
"ip": {
"version": "1.1.8",
@ -22737,7 +22775,6 @@
"version": "2.9.0",
"resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.9.0.tgz",
"integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==",
"dev": true,
"requires": {
"has": "^1.0.3"
}
@ -23166,6 +23203,16 @@
"type-check": "~0.3.2"
}
},
"lg-thumbnail.js": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/lg-thumbnail.js/-/lg-thumbnail.js-1.2.0.tgz",
"integrity": "sha512-qmNFbjLv1spCf3sB8HRX9vW8UtKcgq7qJIg10jLqCozSquhTJwSPUb5vyPgl3cZpgLFjRMiOpIRgBjGrX4inNQ=="
},
"lightgallery.js": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/lightgallery.js/-/lightgallery.js-1.4.0.tgz",
"integrity": "sha512-TK7auNMSz0sPjotq/VtKH/fe8GPkVRlmFf8F3zVsbFccLJL4r3U1VON+IggyE8Wy04QwbFQxTIIMqL7blibGSA=="
},
"lines-and-columns": {
"version": "1.2.4",
"resolved": "https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
@ -23580,7 +23627,6 @@
"version": "3.1.2",
"resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz",
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"dev": true,
"requires": {
"brace-expansion": "^1.1.7"
}
@ -24057,7 +24103,6 @@
"version": "1.4.0",
"resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz",
"integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
"dev": true,
"requires": {
"wrappy": "1"
}
@ -24400,8 +24445,7 @@
"path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
"dev": true
"integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="
},
"path-is-inside": {
"version": "1.0.2",
@ -24418,8 +24462,7 @@
"path-parse": {
"version": "1.0.7",
"resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz",
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
"dev": true
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
},
"path-to-regexp": {
"version": "0.1.7",
@ -25456,6 +25499,14 @@
"picomatch": "^2.2.1"
}
},
"rechoir": {
"version": "0.6.2",
"resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
"integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==",
"requires": {
"resolve": "^1.1.6"
}
},
"regenerate": {
"version": "1.4.2",
"resolved": "https://registry.npmmirror.com/regenerate/-/regenerate-1.4.2.tgz",
@ -25666,7 +25717,6 @@
"version": "1.22.0",
"resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.0.tgz",
"integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==",
"dev": true,
"requires": {
"is-core-module": "^2.8.1",
"path-parse": "^1.0.7",
@ -26076,6 +26126,16 @@
"integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==",
"dev": true
},
"shelljs": {
"version": "0.8.5",
"resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz",
"integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==",
"requires": {
"glob": "^7.0.0",
"interpret": "^1.0.0",
"rechoir": "^0.6.2"
}
},
"shvl": {
"version": "2.0.3",
"resolved": "https://registry.npmmirror.com/shvl/-/shvl-2.0.3.tgz",
@ -26361,6 +26421,11 @@
}
}
},
"sortablejs": {
"version": "1.10.2",
"resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.10.2.tgz",
"integrity": "sha512-YkPGufevysvfwn5rfdlGyrGjt7/CRHwvRPogD/lC+TnvcN29jDpCifKP+rBqf+LRldfXSTh+0CGLcSg0VIxq3A=="
},
"source-list-map": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/source-list-map/-/source-list-map-2.0.1.tgz",
@ -26778,8 +26843,7 @@
"supports-preserve-symlinks-flag": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
"dev": true
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="
},
"svg-tags": {
"version": "1.0.0",
@ -27606,6 +27670,14 @@
"integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
"dev": true
},
"useless-files-webpack-plugin": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/useless-files-webpack-plugin/-/useless-files-webpack-plugin-1.0.1.tgz",
"integrity": "sha512-k1CXjiehq3gpDvZmUJB7RLBbYjsBLFcBWDp7FQunYnPpo1W8zjHceqOr7J5N0NZndmLotodKurARWua71E/ADA==",
"requires": {
"shelljs": "^0.8.1"
}
},
"util": {
"version": "0.11.1",
"resolved": "https://registry.npmmirror.com/util/-/util-0.11.1.tgz",
@ -27930,6 +28002,14 @@
"integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==",
"dev": true
},
"vuedraggable": {
"version": "2.24.3",
"resolved": "https://registry.npmjs.org/vuedraggable/-/vuedraggable-2.24.3.tgz",
"integrity": "sha512-6/HDXi92GzB+Hcs9fC6PAAozK1RLt1ewPTLjK0anTYguXLAeySDmcnqE8IC0xa7shvSzRjQXq3/+dsZ7ETGF3g==",
"requires": {
"sortablejs": "1.10.2"
}
},
"vuex": {
"version": "3.6.2",
"resolved": "https://registry.npmmirror.com/vuex/-/vuex-3.6.2.tgz",
@ -28716,8 +28796,7 @@
"wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
"dev": true
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
},
"write": {
"version": "1.0.3",

@ -12,13 +12,17 @@
"core-js": "^3.6.5",
"crypto-js": "^4.1.1",
"element-ui": "^2.4.5",
"lg-thumbnail.js": "^1.2.0",
"lightgallery.js": "^1.4.0",
"markdown-it": "^12.2.0",
"mavon-editor": "^2.9.1",
"qs": "^6.10.3",
"useless-files-webpack-plugin": "^1.0.1",
"vue": "^2.6.11",
"vue-baberrage": "^3.2.4",
"vue-ripple-directive": "^2.0.1",
"vue-router": "^3.2.0",
"vuedraggable": "^2.24.3",
"vuex": "^3.4.0",
"vuex-persistedstate": "^4.0.0"
},

@ -1,19 +1,57 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<meta charset="utf-8" />
<meta name="Robots" content="all" />
<meta name="KEYWords" content="janx,pixiv,博客,游戏,动漫"/>
<meta name="DEscription" content="Janxland,Janx,动漫,游戏,博客">
<meta name="baidu-site-verification" content="codeva-FAjK1LxybY" />
<meta content="webkit" name="renderer" />
<!-- <meta http-equiv="X-UA-Compatible" content="IE=edge"> -->
<meta name="force-rendering" content="webkit"/>
<meta name="referrer" content="no-referrer" />
<meta name="viewport" content="width=device-width,initial-scale=1.0" />
<link rel="icon" href="./poetize.jpg" sizes="16x16">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>Sara</title>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/firacode@6.2.0/distr/fira_code.min.css">
<link href="https://cdn.bootcdn.net/ajax/libs/animate.css/4.1.1/animate.min.css" rel="stylesheet">
<title>Roginx</title>
<!-- <script>
fetch('https://search.heweather.net/find?key=3180d3c43e524753ab8bcef69dba023a&group=cn&lang=zh&location=450800')
.then(function(response) {
return response.json();
})
.then(function(myJson) {
top.dominCN = myJson.HeWeather6[0].basic[0]
});
</script> -->
<script type="text/javascript">
window.jQuery || document.write("<script src='https://cdn.bootcdn.net/ajax/libs/jquery/3.6.3/jquery.min.js'>"+ "<"+"/script>");
</script>
<script type="text/javascript">
window.$.cookie || document.write("<script src='https://cdn.bootcdn.net/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.min.js'>"+ "<"+"/script>");
</script>
<script src="https://cdn.bootcdn.net/ajax/libs/mobile-detect/1.4.5/mobile-detect.min.js"></script>
<script src="https://cdn.bootcss.com/animejs/2.2.0/anime.min.js"></script>
<!-- <script src="https://use.fontawesome.com/3eac4d4c53.js"></script> -->
<script src="https://cdn.bootcdn.net/ajax/libs/highlight.js/11.2.0/highlight.min.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/wow/1.1.2/wow.min.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/highlightjs-line-numbers.js/2.8.0/highlightjs-line-numbers.min.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/clipboard.js/2.0.8/clipboard.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/qiniu-js/3.4.0/qiniu.min.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/qiniu-js/3.4.1/qiniu.min.js"></script>
<!-- <script src="https://cdnjs.cloudflare.com/ajax/libs/qiniu-js/3.4.0/qiniu.min.js"></script> -->
<!-- lg插件 -->
<script src="./music-js/aes.js"></script>
<script src="./music-js/BigInt.js"></script>
<script src="./music-js/Barrett.js"></script>
<script src="./music-js/RSA.js"></script>
<script src="./music-js/163Api.js"></script>
<script src="./music-js/jsoup.js"></script>
<script src="./music-js/JMshake.js"></script>
<!-- 统计代码 https://analytics.apimoe.lol/ -->
<script defer src="https://analytics.apimoe.lol/pixel/CmhIWUSAeHp5v5Kq"></script>
<!-- /统计代码 -->
<style>
body {
margin: 0;
@ -23,6 +61,19 @@
<body>
<div id="app"></div>
</body>
<!-- lg -->
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.7/lightgallery.min.js"></script>
<link href="https://cdn.jsdelivr.net/npm/lightgallery@2.7/css/lightgallery-bundle.min.css" rel="stylesheet"></link>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.7.1/plugins/thumbnail/lg-thumbnail.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.7.1/plugins/hash/lg-hash.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.7.1/plugins/rotate/lg-rotate.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.7.1/plugins/video/lg-video.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.7.1/plugins/zoom/lg-zoom.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.7.1/plugins/fullscreen/lg-fullscreen.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.7.1/plugins/autoplay/lg-autoplay.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/lightgallery@2.7.1/plugins/comment/lg-comment.min.js"></script>
<!-- <script src="https://cdn.jsdelivr.net/npm/lightgallery@2.7.1/plugins/share/lg-share.min.js"></script> -->
<!-- <script src="https://cdn.jsdelivr.net/npm/lightgallery@2.7.1/plugins/pager/lg-pager.min.js"></script> -->
<script>
new WOW().init();
</script>

@ -0,0 +1,125 @@
/*https://music.163.com/weapi/song/enhance/player/url //mp3文件
https://music.163.com/weapi/song/lyric //歌词
https://music.163.com/weapi/v1/resource/comments/get //评论
https://music.163.com/weapi/v1/discovery/simiSong //还喜欢听的歌
params:YZDOQB4rCBrSTDdtOlkXOHwkCiDzJW1qPgBn3nzeV3YCCXMjV5G1pI6Jh97A33neWjCa4QQnVRs3hO2cMPPOXfbJNpvy/AZ/1RZEazlH9bM=
encSecKey:428701e2ac634debc0e4cb7449c05251ebf5f304ddf01566aeb5bcb6a5a9fa242a9c677b9610450d534328c3b859456ec04a51c54d78709ce4963af260f83006605665abb0bb9a839c8405cb63a8ccef2d0c6afb1a40eb929f5c06714d1162fc5b4dcedf54e9581fd720df036b76d9d27f495a75846dbe378f7553b636b3a327
params:Hw4jg6KU0cN4kAhsAV2ajQVIfUs/f9Ei+WtdQS/OZq+uQdmOgWX3ZQpEGAv6UskES7pHBC3iPiFnXq1CEqT4YoIOE452JIu9yfLzSQVODps=
encSecKey:6a9692525559fdef4c0c316a407b36685a01d103b893e819043506a005c5175e647c79ff4d40db801f386aff90e2c82395663ac325ba22871ba02672c9ef7f048975aef92723a399b5f3c01b8d88cb993c8f41f958f8d633df45da9a263295b9ff986da59496551aed97a51c4a9ba738e37f7588f2c431fa9c855a61a508b26c
"{"ids":"[525016797]","br":128000,"csrf_token":""}"
"{"id":"545272449","c":"[{\"id\":\"545272449\"}]","csrf_token":""}"
*/
var setV = {d:"{\"ids\":\"[\\\"1294899063\\\"]\",\"br\":\"128000\"}",e:'010001',f:"00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7",g:"0CoJUm6Qyw8W8jud"}
function __n(e) {
var t, r, n = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", i = "";
for (t = 0; e > t; t += 1)
r = Math.random() * n.length,
r = Math.floor(r),
i += n.charAt(r);
return i
}
function __i(e, t) { //aes加密
var r = CryptoJS.enc.Utf8.parse(t)
, n = CryptoJS.enc.Utf8.parse("0102030405060708")
, i = CryptoJS.enc.Utf8.parse(e)
, o = CryptoJS.AES.encrypt(i, r, {
iv: n,
mode: CryptoJS.mode.CBC
});
return o.toString()
}
function __o(e, t, r) { //rsa加密
//jsencrypt.js
var n, i;
return setMaxDigits(131),
n = new RSAKeyPair(t,"",r),
i = encryptedString(n, e)
}
//{"ids":"[\"1294899063\"]","br":"128000"}
//00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7
//010001
//0CoJUm6Qyw8W8jud
function __a(e, t, r, a) {
var s = {}
, u = __n(16);
return s.encText = __i(e, a),
s.encText = __i(s.encText, u),
s.encSecKey = __o(u, t, r),
s
}
function __s(e, t, r, n) {
var i = {};
return i.encText = o(e + n, t, r),
i
}
function __setCookie(){
var cookies = "_iuqxldmzr_=32; _ntes_nnid=d34abbe36ac175e613653695a024446f,1535182652738; _ntes_nuid=d34abbe36ac175e613653695a024446f; WM_TID=02fOyLZUkn9Cx1Mk8rdGUIf5JC8MOMzU; __utma=94650624.1729429031.1535186517.1535459615.1535555297.7; __utmz=94650624.1535555297.7.7.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; WM_NI=NrXqwYZgSXniPT5Sj2uwAAmfbnmw9eTbsy%2B9KFG7djd77oeuyenG%2FIVIP7WwEI3lASHxnnKaTIYedIb3zduFfaldpjd0UVGrUtqB1E7%2FpYt4zSYNR3iTtvLCd21g0GwfaHI%3D; WM_NIKE=9ca17ae2e6ffcda170e2e6eed5f662b39e97a9c961b28db6b7ee5c968b9795cc74b387a5a2f15bf8b38695d12af0fea7c3b92a8eae9892f6539ab99db9ed63948cfbb4e93ab7a98fa2f06ea2b2a398bc6f98bebd9aaa33899a89d8e762a8e9f990e87fbbbba2a8ae439697a0d8d67d8797fd8dc4598ca8a28fca6b98979786e743a2edb685f84ea6bfa485f362a8f09bb7c67a97acbfa3b44ff5f1c0baf740ba8d97afd139ab8cbc97cf49a8eeff88b34db5baafa9cc37e2a3; abt=10; JSESSIONID-WYYY=yZ%2F%2FTnIlU%2FEGC52vi1b06eYnhq4z4MCNjQjF%5CZ5aAsEdbr6Zj5cCmCJcyzE13%2Be%2BwcO%2BrQtlGvuJUmV7REDsba3Nmng3ICwVih8xZv9DJAO%2FI45IjIZgMwREShS94WefADq9rO0k%2B70b87pxzplAG0M%5C2vzSW4zkPf%2BNqKasDmExaSGr%3A1535703207465";
var colist = cookies.split("; ");
for(var i = 0; i<colist.length;i++){
var v_a = colist[i].split("=");
$.cookie(v_a[0],v_a[1]);
}
}
function __addListenround(id){
var la = $.cookie("listenround");
if (la == undefined){
la="";
} else {
la = la.replace(id+",","");
}
$.cookie("listenround",id+","+la);
}
function __addplayList(list){
var cookie = "";
for(var i = 0 ; list.length > i ;i++){
cookie = cookie + list[i].id + ",";
}
$.cookie("playList",cookie);
}
function __getplayList(){
return $.cookie("playList");
}
function __getListenround(){
return $.cookie("listenround");
}
function __addCur(point,id,cur){ //最后播放的位置
$.cookie("lastCur",point+","+id+","+cur);
}
function __getlastCur(){ //最后播放的位置
return $.cookie("lastCur");
}
function __getKeyton(){
var res = __a(setV.d,setV.e,setV.f,setV.g);
return [res.encText,res.encSecKey] ;
}
function __setSet(val){
console.error(val);
val.forEach(function (value, key, map) {
//$.cookie(key,value);
})
}
function __standardLyric(lyric){
var lyrics = lyric.lrc.lyric.split("\n");
var timeReg = /\[\d*:\d*((\.|\:)\d*)*\]/;
var ended = new Array();
for(var i=0;i<lyrics.length;i++){
var timeRegExpArr = lyrics[i].match(timeReg);
if(!timeRegExpArr)continue;
var clause = lyrics[i].replace(timeReg,'');
var time = 0;
var t = timeRegExpArr[0];
var min = Number(String(t.match(/\[\d*/)).slice(1));
var sec = Number(String(t.match(/\:\d*/)).slice(1));
time = min * 60 + sec; //时间秒计
ended[time] = clause;
}
return ended;
}

@ -0,0 +1,74 @@
// BarrettMu, a class for performing Barrett modular reduction computations in
// JavaScript.
//
// Requires BigInt.js.
//
// Copyright 2004-2005 David Shapiro.
//
// You may use, re-use, abuse, copy, and modify this code to your liking, but
// please keep this header.
//
// Thanks!
//
// Dave Shapiro
// dave@ohdave.com
function BarrettMu(m)
{
this.modulus = biCopy(m);
this.k = biHighIndex(this.modulus) + 1;
var b2k = new BigInt();
b2k.digits[2 * this.k] = 1; // b2k = b^(2k)
this.mu = biDivide(b2k, this.modulus);
this.bkplus1 = new BigInt();
this.bkplus1.digits[this.k + 1] = 1; // bkplus1 = b^(k+1)
this.modulo = BarrettMu_modulo;
this.multiplyMod = BarrettMu_multiplyMod;
this.powMod = BarrettMu_powMod;
}
function BarrettMu_modulo(x)
{
var q1 = biDivideByRadixPower(x, this.k - 1);
var q2 = biMultiply(q1, this.mu);
var q3 = biDivideByRadixPower(q2, this.k + 1);
var r1 = biModuloByRadixPower(x, this.k + 1);
var r2term = biMultiply(q3, this.modulus);
var r2 = biModuloByRadixPower(r2term, this.k + 1);
var r = biSubtract(r1, r2);
if (r.isNeg) {
r = biAdd(r, this.bkplus1);
}
var rgtem = biCompare(r, this.modulus) >= 0;
while (rgtem) {
r = biSubtract(r, this.modulus);
rgtem = biCompare(r, this.modulus) >= 0;
}
return r;
}
function BarrettMu_multiplyMod(x, y)
{
/*
x = this.modulo(x);
y = this.modulo(y);
*/
var xy = biMultiply(x, y);
return this.modulo(xy);
}
function BarrettMu_powMod(x, y)
{
var result = new BigInt();
result.digits[0] = 1;
var a = x;
var k = y;
while (true) {
if ((k.digits[0] & 1) != 0) result = this.multiplyMod(result, a);
k = biShiftRight(k, 1);
if (k.digits[0] == 0 && biHighIndex(k) == 0) break;
a = this.multiplyMod(a, a);
}
return result;
}

@ -0,0 +1,643 @@
// BigInt, a suite of routines for performing multiple-precision arithmetic in
// JavaScript.
//
// Copyright 1998-2005 David Shapiro.
//
// You may use, re-use, abuse,
// copy, and modify this code to your liking, but please keep this header.
// Thanks!
//
// Dave Shapiro
// dave@ohdave.com
// IMPORTANT THING: Be sure to set maxDigits according to your precision
// needs. Use the setMaxDigits() function to do this. See comments below.
//
// Tweaked by Ian Bunning
// Alterations:
// Fix bug in function biFromHex(s) to allow
// parsing of strings of length != 0 (mod 4)
// Changes made by Dave Shapiro as of 12/30/2004:
//
// The BigInt() constructor doesn't take a string anymore. If you want to
// create a BigInt from a string, use biFromDecimal() for base-10
// representations, biFromHex() for base-16 representations, or
// biFromString() for base-2-to-36 representations.
//
// biFromArray() has been removed. Use biCopy() instead, passing a BigInt
// instead of an array.
//
// The BigInt() constructor now only constructs a zeroed-out array.
// Alternatively, if you pass <true>, it won't construct any array. See the
// biCopy() method for an example of this.
//
// Be sure to set maxDigits depending on your precision needs. The default
// zeroed-out array ZERO_ARRAY is constructed inside the setMaxDigits()
// function. So use this function to set the variable. DON'T JUST SET THE
// VALUE. USE THE FUNCTION.
//
// ZERO_ARRAY exists to hopefully speed up construction of BigInts(). By
// precalculating the zero array, we can just use slice(0) to make copies of
// it. Presumably this calls faster native code, as opposed to setting the
// elements one at a time. I have not done any timing tests to verify this
// claim.
// Max number = 10^16 - 2 = 9999999999999998;
// 2^53 = 9007199254740992;
var biRadixBase = 2;
var biRadixBits = 16;
var bitsPerDigit = biRadixBits;
var biRadix = 1 << 16; // = 2^16 = 65536
var biHalfRadix = biRadix >>> 1;
var biRadixSquared = biRadix * biRadix;
var maxDigitVal = biRadix - 1;
var maxInteger = 9999999999999998;
// maxDigits:
// Change this to accommodate your largest number size. Use setMaxDigits()
// to change it!
//
// In general, if you're working with numbers of size N bits, you'll need 2*N
// bits of storage. Each digit holds 16 bits. So, a 1024-bit key will need
//
// 1024 * 2 / 16 = 128 digits of storage.
//
var maxDigits;
var ZERO_ARRAY;
var bigZero, bigOne;
function setMaxDigits(value)
{
maxDigits = value;
ZERO_ARRAY = new Array(maxDigits);
for (var iza = 0; iza < ZERO_ARRAY.length; iza++) ZERO_ARRAY[iza] = 0;
bigZero = new BigInt();
bigOne = new BigInt();
bigOne.digits[0] = 1;
}
setMaxDigits(20);
// The maximum number of digits in base 10 you can convert to an
// integer without JavaScript throwing up on you.
var dpl10 = 15;
// lr10 = 10 ^ dpl10
var lr10 = biFromNumber(1000000000000000);
function BigInt(flag)
{
if (typeof flag == "boolean" && flag == true) {
this.digits = null;
}
else {
this.digits = ZERO_ARRAY.slice(0);
}
this.isNeg = false;
}
function biFromDecimal(s)
{
var isNeg = s.charAt(0) == '-';
var i = isNeg ? 1 : 0;
var result;
// Skip leading zeros.
while (i < s.length && s.charAt(i) == '0') ++i;
if (i == s.length) {
result = new BigInt();
}
else {
var digitCount = s.length - i;
var fgl = digitCount % dpl10;
if (fgl == 0) fgl = dpl10;
result = biFromNumber(Number(s.substr(i, fgl)));
i += fgl;
while (i < s.length) {
result = biAdd(biMultiply(result, lr10),
biFromNumber(Number(s.substr(i, dpl10))));
i += dpl10;
}
result.isNeg = isNeg;
}
return result;
}
function biCopy(bi)
{
var result = new BigInt(true);
result.digits = bi.digits.slice(0);
result.isNeg = bi.isNeg;
return result;
}
function biFromNumber(i)
{
var result = new BigInt();
result.isNeg = i < 0;
i = Math.abs(i);
var j = 0;
while (i > 0) {
result.digits[j++] = i & maxDigitVal;
i >>= biRadixBits;
}
return result;
}
function reverseStr(s)
{
var result = "";
for (var i = s.length - 1; i > -1; --i) {
result += s.charAt(i);
}
return result;
}
var hexatrigesimalToChar = new Array(
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
'u', 'v', 'w', 'x', 'y', 'z'
);
function biToString(x, radix)
// 2 <= radix <= 36
{
var b = new BigInt();
b.digits[0] = radix;
var qr = biDivideModulo(x, b);
var result = hexatrigesimalToChar[qr[1].digits[0]];
while (biCompare(qr[0], bigZero) == 1) {
qr = biDivideModulo(qr[0], b);
digit = qr[1].digits[0];
result += hexatrigesimalToChar[qr[1].digits[0]];
}
return (x.isNeg ? "-" : "") + reverseStr(result);
}
function biToDecimal(x)
{
var b = new BigInt();
b.digits[0] = 10;
var qr = biDivideModulo(x, b);
var result = String(qr[1].digits[0]);
while (biCompare(qr[0], bigZero) == 1) {
qr = biDivideModulo(qr[0], b);
result += String(qr[1].digits[0]);
}
return (x.isNeg ? "-" : "") + reverseStr(result);
}
var hexToChar = new Array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'a', 'b', 'c', 'd', 'e', 'f');
function digitToHex(n)
{
var mask = 0xf;
var result = "";
for (i = 0; i < 4; ++i) {
result += hexToChar[n & mask];
n >>>= 4;
}
return reverseStr(result);
}
function biToHex(x)
{
var result = "";
var n = biHighIndex(x);
for (var i = biHighIndex(x); i > -1; --i) {
result += digitToHex(x.digits[i]);
}
return result;
}
function charToHex(c)
{
var ZERO = 48;
var NINE = ZERO + 9;
var littleA = 97;
var littleZ = littleA + 25;
var bigA = 65;
var bigZ = 65 + 25;
var result;
if (c >= ZERO && c <= NINE) {
result = c - ZERO;
} else if (c >= bigA && c <= bigZ) {
result = 10 + c - bigA;
} else if (c >= littleA && c <= littleZ) {
result = 10 + c - littleA;
} else {
result = 0;
}
return result;
}
function hexToDigit(s)
{
var result = 0;
var sl = Math.min(s.length, 4);
for (var i = 0; i < sl; ++i) {
result <<= 4;
result |= charToHex(s.charCodeAt(i))
}
return result;
}
function biFromHex(s)
{
var result = new BigInt();
var sl = s.length;
for (var i = sl, j = 0; i > 0; i -= 4, ++j) {
result.digits[j] = hexToDigit(s.substr(Math.max(i - 4, 0), Math.min(i, 4)));
}
return result;
}
function biFromString(s, radix)
{
var isNeg = s.charAt(0) == '-';
var istop = isNeg ? 1 : 0;
var result = new BigInt();
var place = new BigInt();
place.digits[0] = 1; // radix^0
for (var i = s.length - 1; i >= istop; i--) {
var c = s.charCodeAt(i);
var digit = charToHex(c);
var biDigit = biMultiplyDigit(place, digit);
result = biAdd(result, biDigit);
place = biMultiplyDigit(place, radix);
}
result.isNeg = isNeg;
return result;
}
function biToBytes(x)
// Returns a string containing raw bytes.
{
var result = "";
for (var i = biHighIndex(x); i > -1; --i) {
result += digitToBytes(x.digits[i]);
}
return result;
}
function digitToBytes(n)
// Convert two-byte digit to string containing both bytes.
{
var c1 = String.fromCharCode(n & 0xff);
n >>>= 8;
var c2 = String.fromCharCode(n & 0xff);
return c2 + c1;
}
function biDump(b)
{
return (b.isNeg ? "-" : "") + b.digits.join(" ");
}
function biAdd(x, y)
{
var result;
if (x.isNeg != y.isNeg) {
y.isNeg = !y.isNeg;
result = biSubtract(x, y);
y.isNeg = !y.isNeg;
}
else {
result = new BigInt();
var c = 0;
var n;
for (var i = 0; i < x.digits.length; ++i) {
n = x.digits[i] + y.digits[i] + c;
result.digits[i] = n & 0xffff;
c = Number(n >= biRadix);
}
result.isNeg = x.isNeg;
}
return result;
}
function biSubtract(x, y)
{
var result;
if (x.isNeg != y.isNeg) {
y.isNeg = !y.isNeg;
result = biAdd(x, y);
y.isNeg = !y.isNeg;
} else {
result = new BigInt();
var n, c;
c = 0;
for (var i = 0; i < x.digits.length; ++i) {
n = x.digits[i] - y.digits[i] + c;
result.digits[i] = n & 0xffff;
// Stupid non-conforming modulus operation.
if (result.digits[i] < 0) result.digits[i] += biRadix;
c = 0 - Number(n < 0);
}
// Fix up the negative sign, if any.
if (c == -1) {
c = 0;
for (var i = 0; i < x.digits.length; ++i) {
n = 0 - result.digits[i] + c;
result.digits[i] = n & 0xffff;
// Stupid non-conforming modulus operation.
if (result.digits[i] < 0) result.digits[i] += biRadix;
c = 0 - Number(n < 0);
}
// Result is opposite sign of arguments.
result.isNeg = !x.isNeg;
} else {
// Result is same sign.
result.isNeg = x.isNeg;
}
}
return result;
}
function biHighIndex(x)
{
var result = x.digits.length - 1;
while (result > 0 && x.digits[result] == 0) --result;
return result;
}
function biNumBits(x)
{
var n = biHighIndex(x);
var d = x.digits[n];
var m = (n + 1) * bitsPerDigit;
var result;
for (result = m; result > m - bitsPerDigit; --result) {
if ((d & 0x8000) != 0) break;
d <<= 1;
}
return result;
}
function biMultiply(x, y)
{
var result = new BigInt();
var c;
var n = biHighIndex(x);
var t = biHighIndex(y);
var u, uv, k;
for (var i = 0; i <= t; ++i) {
c = 0;
k = i;
for (j = 0; j <= n; ++j, ++k) {
uv = result.digits[k] + x.digits[j] * y.digits[i] + c;
result.digits[k] = uv & maxDigitVal;
c = uv >>> biRadixBits;
}
result.digits[i + n + 1] = c;
}
// Someone give me a logical xor, please.
result.isNeg = x.isNeg != y.isNeg;
return result;
}
function biMultiplyDigit(x, y)
{
var n, c, uv;
result = new BigInt();
n = biHighIndex(x);
c = 0;
for (var j = 0; j <= n; ++j) {
uv = result.digits[j] + x.digits[j] * y + c;
result.digits[j] = uv & maxDigitVal;
c = uv >>> biRadixBits;
}
result.digits[1 + n] = c;
return result;
}
function arrayCopy(src, srcStart, dest, destStart, n)
{
var m = Math.min(srcStart + n, src.length);
for (var i = srcStart, j = destStart; i < m; ++i, ++j) {
dest[j] = src[i];
}
}
var highBitMasks = new Array(0x0000, 0x8000, 0xC000, 0xE000, 0xF000, 0xF800,
0xFC00, 0xFE00, 0xFF00, 0xFF80, 0xFFC0, 0xFFE0,
0xFFF0, 0xFFF8, 0xFFFC, 0xFFFE, 0xFFFF);
function biShiftLeft(x, n)
{
var digitCount = Math.floor(n / bitsPerDigit);
var result = new BigInt();
arrayCopy(x.digits, 0, result.digits, digitCount,
result.digits.length - digitCount);
var bits = n % bitsPerDigit;
var rightBits = bitsPerDigit - bits;
for (var i = result.digits.length - 1, i1 = i - 1; i > 0; --i, --i1) {
result.digits[i] = ((result.digits[i] << bits) & maxDigitVal) |
((result.digits[i1] & highBitMasks[bits]) >>>
(rightBits));
}
result.digits[0] = ((result.digits[i] << bits) & maxDigitVal);
result.isNeg = x.isNeg;
return result;
}
var lowBitMasks = new Array(0x0000, 0x0001, 0x0003, 0x0007, 0x000F, 0x001F,
0x003F, 0x007F, 0x00FF, 0x01FF, 0x03FF, 0x07FF,
0x0FFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF);
function biShiftRight(x, n)
{
var digitCount = Math.floor(n / bitsPerDigit);
var result = new BigInt();
arrayCopy(x.digits, digitCount, result.digits, 0,
x.digits.length - digitCount);
var bits = n % bitsPerDigit;
var leftBits = bitsPerDigit - bits;
for (var i = 0, i1 = i + 1; i < result.digits.length - 1; ++i, ++i1) {
result.digits[i] = (result.digits[i] >>> bits) |
((result.digits[i1] & lowBitMasks[bits]) << leftBits);
}
result.digits[result.digits.length - 1] >>>= bits;
result.isNeg = x.isNeg;
return result;
}
function biMultiplyByRadixPower(x, n)
{
var result = new BigInt();
arrayCopy(x.digits, 0, result.digits, n, result.digits.length - n);
return result;
}
function biDivideByRadixPower(x, n)
{
var result = new BigInt();
arrayCopy(x.digits, n, result.digits, 0, result.digits.length - n);
return result;
}
function biModuloByRadixPower(x, n)
{
var result = new BigInt();
arrayCopy(x.digits, 0, result.digits, 0, n);
return result;
}
function biCompare(x, y)
{
if (x.isNeg != y.isNeg) {
return 1 - 2 * Number(x.isNeg);
}
for (var i = x.digits.length - 1; i >= 0; --i) {
if (x.digits[i] != y.digits[i]) {
if (x.isNeg) {
return 1 - 2 * Number(x.digits[i] > y.digits[i]);
} else {
return 1 - 2 * Number(x.digits[i] < y.digits[i]);
}
}
}
return 0;
}
function biDivideModulo(x, y)
{
var nb = biNumBits(x);
var tb = biNumBits(y);
var origYIsNeg = y.isNeg;
var q, r;
if (nb < tb) {
// |x| < |y|
if (x.isNeg) {
q = biCopy(bigOne);
q.isNeg = !y.isNeg;
x.isNeg = false;
y.isNeg = false;
r = biSubtract(y, x);
// Restore signs, 'cause they're references.
x.isNeg = true;
y.isNeg = origYIsNeg;
} else {
q = new BigInt();
r = biCopy(x);
}
return new Array(q, r);
}
q = new BigInt();
r = x;
// Normalize Y.
var t = Math.ceil(tb / bitsPerDigit) - 1;
var lambda = 0;
while (y.digits[t] < biHalfRadix) {
y = biShiftLeft(y, 1);
++lambda;
++tb;
t = Math.ceil(tb / bitsPerDigit) - 1;
}
// Shift r over to keep the quotient constant. We'll shift the
// remainder back at the end.
r = biShiftLeft(r, lambda);
nb += lambda; // Update the bit count for x.
var n = Math.ceil(nb / bitsPerDigit) - 1;
var b = biMultiplyByRadixPower(y, n - t);
while (biCompare(r, b) != -1) {
++q.digits[n - t];
r = biSubtract(r, b);
}
for (var i = n; i > t; --i) {
var ri = (i >= r.digits.length) ? 0 : r.digits[i];
var ri1 = (i - 1 >= r.digits.length) ? 0 : r.digits[i - 1];
var ri2 = (i - 2 >= r.digits.length) ? 0 : r.digits[i - 2];
var yt = (t >= y.digits.length) ? 0 : y.digits[t];
var yt1 = (t - 1 >= y.digits.length) ? 0 : y.digits[t - 1];
if (ri == yt) {
q.digits[i - t - 1] = maxDigitVal;
} else {
q.digits[i - t - 1] = Math.floor((ri * biRadix + ri1) / yt);
}
var c1 = q.digits[i - t - 1] * ((yt * biRadix) + yt1);
var c2 = (ri * biRadixSquared) + ((ri1 * biRadix) + ri2);
while (c1 > c2) {
--q.digits[i - t - 1];
c1 = q.digits[i - t - 1] * ((yt * biRadix) | yt1);
c2 = (ri * biRadix * biRadix) + ((ri1 * biRadix) + ri2);
}
b = biMultiplyByRadixPower(y, i - t - 1);
r = biSubtract(r, biMultiplyDigit(b, q.digits[i - t - 1]));
if (r.isNeg) {
r = biAdd(r, b);
--q.digits[i - t - 1];
}
}
r = biShiftRight(r, lambda);
// Fiddle with the signs and stuff to make sure that 0 <= r < y.
q.isNeg = x.isNeg != origYIsNeg;
if (x.isNeg) {
if (origYIsNeg) {
q = biAdd(q, bigOne);
} else {
q = biSubtract(q, bigOne);
}
y = biShiftRight(y, lambda);
r = biSubtract(y, r);
}
// Check for the unbelievably stupid degenerate case of r == -0.
if (r.digits[0] == 0 && biHighIndex(r) == 0) r.isNeg = false;
return new Array(q, r);
}
function biDivide(x, y)
{
return biDivideModulo(x, y)[0];
}
function biModulo(x, y)
{
return biDivideModulo(x, y)[1];
}
function biMultiplyMod(x, y, m)
{
return biModulo(biMultiply(x, y), m);
}
function biPow(x, y)
{
var result = bigOne;
var a = x;
while (true) {
if ((y & 1) != 0) result = biMultiply(result, a);
y >>= 1;
if (y == 0) break;
a = biMultiply(a, a);
}
return result;
}
function biPowMod(x, y, m)
{
var result = bigOne;
var a = x;
var k = y;
while (true) {
if ((k.digits[0] & 1) != 0) result = biMultiplyMod(result, a, m);
k = biShiftRight(k, 1);
if (k.digits[0] == 0 && biHighIndex(k) == 0) break;
a = biMultiplyMod(a, a, m);
}
return result;
}

@ -0,0 +1,62 @@
JMshake.prototype.canvas = null;
JMshake.prototype.stop = false;
function JMshake(canvas,audio){
this.canvas = canvas;//canvas
this.audio = audio;
}
JMshake.prototype.init = function(){
}
JMshake.prototype.eventBing = function(){
}
JMshake.prototype.loadMusic = function(){
var that = this;
var context = that.canvas.getContext("2d");
var WIDTH = that.canvas.width;
var HEIGHT = that.canvas.height;
//part3: 分析器
var AudCtx = new AudioContext();//音频内容
var analyser = AudCtx.createAnalyser();
var src = AudCtx.createMediaElementSource(that.audio);
src.connect(analyser);
analyser.connect(AudCtx.destination);
analyser.fftSize = 512;//快速傅里叶变换, 必须为2的N次方
var bufferLength = analyser.frequencyBinCount;// = fftSize * 0.5
//part4: 变量
var barWidth = 3;//间隔1px
var barHeight;
var dataArray = new Uint8Array(bufferLength);//8位无符号定长数组
//part5: 动态监听
function renderFrame() {
context.fillStyle = 'rgba(255, 255, 255, 0)';
context.clearRect(0, 0, WIDTH, HEIGHT);
context.fillRect(0, 0, WIDTH, HEIGHT);//画布拓展全屏,动态调整
analyser.getByteFrequencyData(dataArray);//获取当前时刻的音频数据
//part6: 绘画声压条
var x = 0;
for (var i = 0; i < bufferLength; i++) {
var data = dataArray[i];//int,0~255
var percentV = data / 255;//纵向比例
var percentH = i / bufferLength;//横向比例
barHeight = HEIGHT * percentV;
var r = 255 * percentV;//值越大越红
var g = 255 * percentH;//越靠右越绿
var b = 50;
context.fillStyle = "rgb(" + r + "," + g + "," + b + ")";
x = i*barWidth;//间隔1px
context.fillRect(x, HEIGHT - barHeight, barWidth, barHeight);
}
that.animation = requestAnimationFrame(renderFrame);
}
that.audio.oncanplaythrough = function Draw() {
window.cancelAnimationFrame(that.animation);
delete that.animation;
renderFrame();
}
}

@ -0,0 +1,572 @@
/*
* Copyright (c) 2015 Eric Wilde.
* Copyright 1998-2015 David Shapiro.
*
* RSA.js is a suite of routines for performing RSA public-key computations
* in JavaScript. The cryptographic functions herein are used for encoding
* and decoding strings to be sent over unsecure channels.
*
* To use these routines, a pair of public/private keys is created through a
* number of means (OpenSSL tools on Linux/Unix, Dave Shapiro's
* RSAKeyGenerator program on Windows). These keys are passed to RSAKeyPair
* as hexadecimal strings to create an encryption key object. This key object
* is then used with encryptedString to encrypt blocks of plaintext using the
* public key. The resulting cyphertext blocks can be decrypted with
* decryptedString.
*
* Note that the cryptographic functions herein are complementary to those
* found in CryptoFuncs.php and CryptoFuncs.pm. Hence, encrypted messages may
* be sent between programs written in any of those languages. The most
* useful, of course is to send messages encrypted by a Web page using RSA.js
* to a PHP or Perl script running on a Web servitron.
*
* Also, the optional padding flag may be specified on the call to
* encryptedString, in which case blocks of cyphertext that are compatible
* with real crypto libraries such as OpenSSL or Microsoft will be created.
* These blocks of cyphertext can then be sent to Web servitron that uses one
* of these crypto libraries for decryption. This allows messages encrypted
* with longer keys to be decrypted quickly on the Web server as well as
* making for more secure communications when a padding algorithm such as
* PKCS1v1.5 is used.
*
* These routines require BigInt.js and Barrett.js.
*/
/*****************************************************************************/
/*
* Modifications
* -------------
*
* 2014 Jan 11 E. Wilde Add optional padding flag to encryptedString
* for compatibility with real crypto libraries
* such as OpenSSL or Microsoft. Add PKCS1v1.5
* padding.
*
* 2015 Jan 5 D. Shapiro Add optional encoding flag for encryptedString
* and encapsulate padding and encoding constants
* in RSAAPP object.
*
* Original Code
* -------------
*
* Copyright 1998-2005 David Shapiro.
*
* You may use, re-use, abuse, copy, and modify this code to your liking, but
* please keep this header.
*
* Thanks!
*
* Dave Shapiro
* dave@ohdave.com
*/
/*****************************************************************************/
var RSAAPP = {};
RSAAPP.NoPadding = "NoPadding";
RSAAPP.PKCS1Padding = "PKCS1Padding";
RSAAPP.RawEncoding = "RawEncoding";
RSAAPP.NumericEncoding = "NumericEncoding"
/*****************************************************************************/
function RSAKeyPair(encryptionExponent, decryptionExponent, modulus, keylen)
/*
* encryptionExponent The encryption exponent (i.e. public
* encryption key) to be used for
* encrypting messages. If you aren't
* doing any encrypting, a dummy
* exponent such as "10001" can be
* passed.
*
* decryptionExponent The decryption exponent (i.e. private
* decryption key) to be used for
* decrypting messages. If you aren't
* doing any decrypting, a dummy
* exponent such as "10001" can be
* passed.
*
* modulus The modulus to be used both for
* encrypting and decrypting messages.
*
* keylen The optional length of the key, in
* bits. If omitted, RSAKeyPair will
* attempt to derive a key length (but,
* see the notes below).
*
* returns The "new" object creator returns an
* instance of a key object that can be
* used to encrypt/decrypt messages.
*
* This routine is invoked as the first step in the encryption or decryption
* process to take the three numbers (expressed as hexadecimal strings) that
* are used for RSA asymmetric encryption/decryption and turn them into a key
* object that can be used for encrypting and decrypting.
*
* The key object is created thusly:
*
* RSAKey = new RSAKeyPair("ABC12345", 10001, "987654FE");
*
* or:
*
* RSAKey = new RSAKeyPair("ABC12345", 10001, "987654FE", 64);
*
* Note that RSAKeyPair will try to derive the length of the key that is being
* used, from the key itself. The key length is especially useful when one of
* the padding options is used and/or when the encrypted messages created by
* the routine encryptedString are exchanged with a real crypto library such
* as OpenSSL or Microsoft, as it determines how many padding characters are
* appended.
*
* Usually, RSAKeyPair can determine the key length from the modulus of the
* key but this doesn't always work properly, depending on the actual value of
* the modulus. If you are exchanging messages with a real crypto library,
* such as OpenSSL or Microsoft, that depends on the fact that the blocks
* being passed to it are properly padded, you'll want the key length to be
* set properly. If that's the case, of if you just want to be sure, you
* should specify the key length that you used to generated the key, in bits
* when this routine is invoked.
*/
{
/*
* Convert from hexadecimal and save the encryption/decryption exponents and
* modulus as big integers in the key object.
*/
this.e = biFromHex(encryptionExponent);
this.d = biFromHex(decryptionExponent);
this.m = biFromHex(modulus);
/*
* Using big integers, we can represent two bytes per element in the big
* integer array, so we calculate the chunk size as:
*
* chunkSize = 2 * (number of digits in modulus - 1)
*
* Since biHighIndex returns the high index, not the number of digits, the
* number 1 has already been subtracted from its answer.
*
* However, having said all this, "User Knows Best". If our caller passes us
* a key length (in bits), we'll treat it as gospel truth.
*/
if (typeof(keylen) != 'number') { this.chunkSize = 2 * biHighIndex(this.m); }
else { this.chunkSize = keylen / 8; }
this.radix = 16;
/*
* Precalculate the stuff used for Barrett modular reductions.
*/
this.barrett = new BarrettMu(this.m);
}
/*****************************************************************************/
function encryptedString(key, s, pad, encoding)
/*
* key The previously-built RSA key whose
* public key component is to be used to
* encrypt the plaintext string.
*
* s The plaintext string that is to be
* encrypted, using the RSA assymmetric
* encryption method.
*
* pad The optional padding method to use
* when extending the plaintext to the
* full chunk size required by the RSA
* algorithm. To maintain compatibility
* with other crypto libraries, the
* padding method is described by a
* string. The default, if not
* specified is "OHDave". Here are the
* choices:
*
* OHDave - this is the original
* padding method employed by Dave
* Shapiro and Rob Saunders. If
* this method is chosen, the
* plaintext can be of any length.
* It will be padded to the correct
* length with zeros and then broken
* up into chunks of the correct
* length before being encrypted.
* The resultant cyphertext blocks
* will be separated by blanks.
*
* Note that the original code by
* Dave Shapiro reverses the byte
* order to little-endian, as the
* plaintext is encrypted. If
* either these JavaScript routines
* or one of the complementary
* PHP/Perl routines derived from
* this code is used for decryption,
* the byte order will be reversed
* again upon decryption so as to
* come out correctly.
*
* Also note that this padding
* method is claimed to be less
* secure than PKCS1Padding.
*
* NoPadding - this method truncates
* the plaintext to the length of
* the RSA key, if it is longer. If
* its length is shorter, it is
* padded with zeros. In either
* case, the plaintext string is
* reversed to preserve big-endian
* order before it is encrypted to
* maintain compatibility with real
* crypto libraries such as OpenSSL
* or Microsoft. When the
* cyphertext is to be decrypted
* by a crypto library, the
* library routine's RSAAPP.NoPadding
* flag, or its equivalent, should
* be used.
*
* Note that this padding method is
* claimed to be less secure than
* PKCS1Padding.
*
* PKCS1Padding - the PKCS1v1.5
* padding method (as described in
* RFC 2313) is employed to pad the
* plaintext string. The plaintext
* string must be no longer than the
* length of the RSA key minus 11,
* since PKCS1v1.5 requires 3 bytes
* of overhead and specifies a
* minimum pad of 8 bytes. The
* plaintext string is padded with
* randomly-generated bytes and then
* its order is reversed to preserve
* big-endian order before it is
* encrypted to maintain
* compatibility with real crypto
* libraries such as OpenSSL or
* Microsoft. When the cyphertext
* is to be decrypted by a crypto
* library, the library routine's
* RSAAPP.PKCS1Padding flag, or its
* equivalent, should be used.
*
* encoding The optional encoding scheme to use
* for the return value. If ommitted,
* numeric encoding will be used.
*
* RawEncoding - The return value
* is given as its raw value.
* This is the easiest method when
* interoperating with server-side
* OpenSSL, as no additional conversion
* is required. Use the constant
* RSAAPP.RawEncoding for this option.
*
* NumericEncoding - The return value
* is given as a number in hexadecimal.
* Perhaps useful for debugging, but
* will need to be translated back to
* its raw equivalent (e.g. using
* PHP's hex2bin) before using with
* OpenSSL. Use the constant
* RSAAPP.NumericEncoding for this option.
*
* returns The cyphertext block that results
* from encrypting the plaintext string
* s with the RSA key.
*
* This routine accepts a plaintext string that is to be encrypted with the
* public key component of the previously-built RSA key using the RSA
* assymmetric encryption method. Before it is encrypted, the plaintext
* string is padded to the same length as the encryption key for proper
* encryption.
*
* Depending on the padding method chosen, an optional header with block type
* is prepended, the plaintext is padded using zeros or randomly-generated
* bytes, and then the plaintext is possibly broken up into chunks.
*
* Note that, for padding with zeros, this routine was altered by Rob Saunders
* (rob@robsaunders.net). The new routine pads the string after it has been
* converted to an array. This fixes an incompatibility with Flash MX's
* ActionScript.
*
* The various padding schemes employed by this routine, and as presented to
* RSA for encryption, are shown below. Note that the RSA encryption done
* herein reverses the byte order as encryption is done:
*
* Plaintext In
* ------------
*
* d5 d4 d3 d2 d1 d0
*
* OHDave
* ------
*
* d5 d4 d3 d2 d1 d0 00 00 00 /.../ 00 00 00 00 00 00 00 00
*
* NoPadding
* ---------
*
* 00 00 00 00 00 00 00 00 00 /.../ 00 00 d0 d1 d2 d3 d4 d5
*
* PKCS1Padding
* ------------
*
* d0 d1 d2 d3 d4 d5 00 p0 p1 /.../ p2 p3 p4 p5 p6 p7 02 00
* \------------ ------------/
* \/
* Minimum 8 bytes pad length
*/
{
var a = new Array(); // The usual Alice and Bob stuff
var sl = s.length; // Plaintext string length
var i, j, k; // The usual Fortran index stuff
var padtype; // Type of padding to do
var encodingtype; // Type of output encoding
var rpad; // Random pad
var al; // Array length
var result = ""; // Cypthertext result
var block; // Big integer block to encrypt
var crypt; // Big integer result
var text; // Text result
/*
* Figure out the padding type.
*/
if (typeof(pad) == 'string') {
if (pad == RSAAPP.NoPadding) { padtype = 1; }
else if (pad == RSAAPP.PKCS1Padding) { padtype = 2; }
else { padtype = 0; }
}
else { padtype = 0; }
/*
* Determine encoding type.
*/
if (typeof(encoding) == 'string' && encoding == RSAAPP.RawEncoding) {
encodingtype = 1;
}
else { encodingtype = 0; }
/*
* If we're not using Dave's padding method, we need to truncate long
* plaintext blocks to the correct length for the padding method used:
*
* NoPadding - key length
* PKCS1Padding - key length - 11
*/
if (padtype == 1) {
if (sl > key.chunkSize) { sl = key.chunkSize; }
}
else if (padtype == 2) {
if (sl > (key.chunkSize-11)) { sl = key.chunkSize - 11; }
}
/*
* Convert the plaintext string to an array of characters so that we can work
* with individual characters.
*
* Note that, if we're talking to a real crypto library at the other end, we
* reverse the plaintext order to preserve big-endian order.
*/
i = 0;
if (padtype == 2) { j = sl - 1; }
else { j = key.chunkSize - 1; }
while (i < sl) {
if (padtype) { a[j] = s.charCodeAt(i); }
else { a[i] = s.charCodeAt(i); }
i++; j--;
}
/*
* Now is the time to add the padding.
*
* If we're doing PKCS1v1.5 padding, we pick up padding where we left off and
* pad the remainder of the block. Otherwise, we pad at the front of the
* block. This gives us the correct padding for big-endian blocks.
*
* The padding is either a zero byte or a randomly-generated non-zero byte.
*/
if (padtype == 1) { i = 0; }
j = key.chunkSize - (sl % key.chunkSize);
while (j > 0) {
if (padtype == 2) {
rpad = Math.floor(Math.random() * 256);
while (!rpad) { rpad = Math.floor(Math.random() * 256); }
a[i] = rpad;
}
else { a[i] = 0; }
i++; j--;
}
/*
* For PKCS1v1.5 padding, we need to fill in the block header.
*
* According to RFC 2313, a block type, a padding string, and the data shall
* be formatted into the encryption block:
*
* EncrBlock = 00 || BlockType || PadString || 00 || Data
*
* The block type shall be a single octet indicating the structure of the
* encryption block. For this version of the document it shall have value 00,
* 01, or 02. For a private-key operation, the block type shall be 00 or 01.
* For a public-key operation, it shall be 02.
*
* The padding string shall consist of enough octets to pad the encryption
* block to the length of the encryption key. For block type 00, the octets
* shall have value 00; for block type 01, they shall have value FF; and for
* block type 02, they shall be pseudorandomly generated and nonzero.
*
* Note that in a previous step, we wrote padding bytes into the first three
* bytes of the encryption block because it was simpler to do so. We now
* overwrite them.
*/
if (padtype == 2)
{
a[sl] = 0;
a[key.chunkSize-2] = 2;
a[key.chunkSize-1] = 0;
}
/*
* Carve up the plaintext and encrypt each of the resultant blocks.
*/
al = a.length;
for (i = 0; i < al; i += key.chunkSize) {
/*
* Get a block.
*/
block = new BigInt();
j = 0;
for (k = i; k < (i+key.chunkSize); ++j) {
block.digits[j] = a[k++];
block.digits[j] += a[k++] << 8;
}
/*
* Encrypt it, convert it to text, and append it to the result.
*/
crypt = key.barrett.powMod(block, key.e);
if (encodingtype == 1) {
text = biToBytes(crypt);
}
else {
text = (key.radix == 16) ? biToHex(crypt) : biToString(crypt, key.radix);
}
result += text;
}
/*
* Return the result, removing the last space.
*/
//result = (result.substring(0, result.length - 1));
return result;
}
/*****************************************************************************/
function decryptedString(key, c)
/*
* key The previously-built RSA key whose
* private key component is to be used
* to decrypt the cyphertext string.
*
* c The cyphertext string that is to be
* decrypted, using the RSA assymmetric
* encryption method.
*
* returns The plaintext block that results from
* decrypting the cyphertext string c
* with the RSA key.
*
* This routine is the complementary decryption routine that is meant to be
* used for JavaScript decryption of cyphertext blocks that were encrypted
* using the OHDave padding method of the encryptedString routine (in this
* module). It can also decrypt cyphertext blocks that were encrypted by
* RSAEncode (in CryptoFuncs.pm or CryptoFuncs.php) so that encrypted
* messages can be sent of insecure links (e.g. HTTP) to a Web page.
*
* It accepts a cyphertext string that is to be decrypted with the public key
* component of the previously-built RSA key using the RSA assymmetric
* encryption method. Multiple cyphertext blocks are broken apart, if they
* are found in c, and each block is decrypted. All of the decrypted blocks
* are concatenated back together to obtain the original plaintext string.
*
* This routine assumes that the plaintext was padded to the same length as
* the encryption key with zeros. Therefore, it removes any zero bytes that
* are found at the end of the last decrypted block, before it is appended to
* the decrypted plaintext string.
*
* Note that the encryptedString routine (in this module) works fairly quickly
* simply by virtue of the fact that the public key most often chosen is quite
* short (e.g. 0x10001). This routine does not have that luxury. The
* decryption key that it must employ is the full key length. For long keys,
* this can result in serious timing delays (e.g. 7-8 seconds to decrypt using
* 2048 bit keys on a reasonably fast machine, under the Firefox Web browser).
*
* If you intend to send encrypted messagess to a JavaScript program running
* under a Web browser, you might consider using shorter keys to keep the
* decryption times low. Alternately, a better scheme is to generate a random
* key for use by a symmetric encryption algorithm and transmit it to the
* other end, after encrypting it with encryptedString. The other end can use
* a real crypto library (e.g. OpenSSL or Microsoft) to decrypt the key and
* then use it to encrypt all of the messages (with a symmetric encryption
* algorithm such as Twofish or AES) bound for the JavaScript program.
* Symmetric decryption is orders of magnitude faster than asymmetric and
* should yield low decryption times, even when executed in JavaScript.
*
* Also note that only the OHDave padding method (e.g. zeros) is supported by
* this routine *AND* that this routine expects little-endian cyphertext, as
* created by the encryptedString routine (in this module) or the RSAEncode
* routine (in either CryptoFuncs.pm or CryptoFuncs.php). You can use one of
* the real crypto libraries to create cyphertext that can be decrypted by
* this routine, if you reverse the plaintext byte order first and then
* manually pad it with zero bytes. The plaintext should then be encrypted
* with the NoPadding flag or its equivalent in the crypto library of your
* choice.
*/
{
var blocks = c.split(" "); // Multiple blocks of cyphertext
var b; // The usual Alice and Bob stuff
var i, j; // The usual Fortran index stuff
var bi; // Cyphertext as a big integer
var result = ""; // Plaintext result
/*
* Carve up the cyphertext into blocks.
*/
for (i = 0; i < blocks.length; ++i) {
/*
* Depending on the radix being used for the key, convert this cyphertext
* block into a big integer.
*/
if (key.radix == 16) { bi = biFromHex(blocks[i]); }
else { bi = biFromString(blocks[i], key.radix); }
/*
* Decrypt the cyphertext.
*/
b = key.barrett.powMod(bi, key.d);
/*
* Convert the decrypted big integer back to the plaintext string. Since
* we are using big integers, each element thereof represents two bytes of
* plaintext.
*/
for (j = 0; j <= biHighIndex(b); ++j) {
result += String.fromCharCode(b.digits[j] & 255, b.digits[j] >> 8);
}
}
/*
* Remove trailing null, if any.
*/
if (result.charCodeAt(result.length - 1) == 0) {
result = result.substring(0, result.length - 1);
}
/*
* Return the plaintext.
*/
return (result);
}

@ -0,0 +1,35 @@
/*
CryptoJS v3.1.2
code.google.com/p/crypto-js
(c) 2009-2013 by Jeff Mott. All rights reserved.
code.google.com/p/crypto-js/wiki/License
*/
var CryptoJS=CryptoJS||function(u,p){var d={},l=d.lib={},s=function(){},t=l.Base={extend:function(a){s.prototype=this;var c=new s;a&&c.mixIn(a);c.hasOwnProperty("init")||(c.init=function(){c.$super.init.apply(this,arguments)});c.init.prototype=c;c.$super=this;return c},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var c in a)a.hasOwnProperty(c)&&(this[c]=a[c]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
r=l.WordArray=t.extend({init:function(a,c){a=this.words=a||[];this.sigBytes=c!=p?c:4*a.length},toString:function(a){return(a||v).stringify(this)},concat:function(a){var c=this.words,e=a.words,j=this.sigBytes;a=a.sigBytes;this.clamp();if(j%4)for(var k=0;k<a;k++)c[j+k>>>2]|=(e[k>>>2]>>>24-8*(k%4)&255)<<24-8*((j+k)%4);else if(65535<e.length)for(k=0;k<a;k+=4)c[j+k>>>2]=e[k>>>2];else c.push.apply(c,e);this.sigBytes+=a;return this},clamp:function(){var a=this.words,c=this.sigBytes;a[c>>>2]&=4294967295<<
32-8*(c%4);a.length=u.ceil(c/4)},clone:function(){var a=t.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var c=[],e=0;e<a;e+=4)c.push(4294967296*u.random()|0);return new r.init(c,a)}}),w=d.enc={},v=w.Hex={stringify:function(a){var c=a.words;a=a.sigBytes;for(var e=[],j=0;j<a;j++){var k=c[j>>>2]>>>24-8*(j%4)&255;e.push((k>>>4).toString(16));e.push((k&15).toString(16))}return e.join("")},parse:function(a){for(var c=a.length,e=[],j=0;j<c;j+=2)e[j>>>3]|=parseInt(a.substr(j,
2),16)<<24-4*(j%8);return new r.init(e,c/2)}},b=w.Latin1={stringify:function(a){var c=a.words;a=a.sigBytes;for(var e=[],j=0;j<a;j++)e.push(String.fromCharCode(c[j>>>2]>>>24-8*(j%4)&255));return e.join("")},parse:function(a){for(var c=a.length,e=[],j=0;j<c;j++)e[j>>>2]|=(a.charCodeAt(j)&255)<<24-8*(j%4);return new r.init(e,c)}},x=w.Utf8={stringify:function(a){try{return decodeURIComponent(escape(b.stringify(a)))}catch(c){throw Error("Malformed UTF-8 data");}},parse:function(a){return b.parse(unescape(encodeURIComponent(a)))}},
q=l.BufferedBlockAlgorithm=t.extend({reset:function(){this._data=new r.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=x.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var c=this._data,e=c.words,j=c.sigBytes,k=this.blockSize,b=j/(4*k),b=a?u.ceil(b):u.max((b|0)-this._minBufferSize,0);a=b*k;j=u.min(4*a,j);if(a){for(var q=0;q<a;q+=k)this._doProcessBlock(e,q);q=e.splice(0,a);c.sigBytes-=j}return new r.init(q,j)},clone:function(){var a=t.clone.call(this);
a._data=this._data.clone();return a},_minBufferSize:0});l.Hasher=q.extend({cfg:t.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){q.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(b,e){return(new a.init(e)).finalize(b)}},_createHmacHelper:function(a){return function(b,e){return(new n.HMAC.init(a,
e)).finalize(b)}}});var n=d.algo={};return d}(Math);
(function(){var u=CryptoJS,p=u.lib.WordArray;u.enc.Base64={stringify:function(d){var l=d.words,p=d.sigBytes,t=this._map;d.clamp();d=[];for(var r=0;r<p;r+=3)for(var w=(l[r>>>2]>>>24-8*(r%4)&255)<<16|(l[r+1>>>2]>>>24-8*((r+1)%4)&255)<<8|l[r+2>>>2]>>>24-8*((r+2)%4)&255,v=0;4>v&&r+0.75*v<p;v++)d.push(t.charAt(w>>>6*(3-v)&63));if(l=t.charAt(64))for(;d.length%4;)d.push(l);return d.join("")},parse:function(d){var l=d.length,s=this._map,t=s.charAt(64);t&&(t=d.indexOf(t),-1!=t&&(l=t));for(var t=[],r=0,w=0;w<
l;w++)if(w%4){var v=s.indexOf(d.charAt(w-1))<<2*(w%4),b=s.indexOf(d.charAt(w))>>>6-2*(w%4);t[r>>>2]|=(v|b)<<24-8*(r%4);r++}return p.create(t,r)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}})();
(function(u){function p(b,n,a,c,e,j,k){b=b+(n&a|~n&c)+e+k;return(b<<j|b>>>32-j)+n}function d(b,n,a,c,e,j,k){b=b+(n&c|a&~c)+e+k;return(b<<j|b>>>32-j)+n}function l(b,n,a,c,e,j,k){b=b+(n^a^c)+e+k;return(b<<j|b>>>32-j)+n}function s(b,n,a,c,e,j,k){b=b+(a^(n|~c))+e+k;return(b<<j|b>>>32-j)+n}for(var t=CryptoJS,r=t.lib,w=r.WordArray,v=r.Hasher,r=t.algo,b=[],x=0;64>x;x++)b[x]=4294967296*u.abs(u.sin(x+1))|0;r=r.MD5=v.extend({_doReset:function(){this._hash=new w.init([1732584193,4023233417,2562383102,271733878])},
_doProcessBlock:function(q,n){for(var a=0;16>a;a++){var c=n+a,e=q[c];q[c]=(e<<8|e>>>24)&16711935|(e<<24|e>>>8)&4278255360}var a=this._hash.words,c=q[n+0],e=q[n+1],j=q[n+2],k=q[n+3],z=q[n+4],r=q[n+5],t=q[n+6],w=q[n+7],v=q[n+8],A=q[n+9],B=q[n+10],C=q[n+11],u=q[n+12],D=q[n+13],E=q[n+14],x=q[n+15],f=a[0],m=a[1],g=a[2],h=a[3],f=p(f,m,g,h,c,7,b[0]),h=p(h,f,m,g,e,12,b[1]),g=p(g,h,f,m,j,17,b[2]),m=p(m,g,h,f,k,22,b[3]),f=p(f,m,g,h,z,7,b[4]),h=p(h,f,m,g,r,12,b[5]),g=p(g,h,f,m,t,17,b[6]),m=p(m,g,h,f,w,22,b[7]),
f=p(f,m,g,h,v,7,b[8]),h=p(h,f,m,g,A,12,b[9]),g=p(g,h,f,m,B,17,b[10]),m=p(m,g,h,f,C,22,b[11]),f=p(f,m,g,h,u,7,b[12]),h=p(h,f,m,g,D,12,b[13]),g=p(g,h,f,m,E,17,b[14]),m=p(m,g,h,f,x,22,b[15]),f=d(f,m,g,h,e,5,b[16]),h=d(h,f,m,g,t,9,b[17]),g=d(g,h,f,m,C,14,b[18]),m=d(m,g,h,f,c,20,b[19]),f=d(f,m,g,h,r,5,b[20]),h=d(h,f,m,g,B,9,b[21]),g=d(g,h,f,m,x,14,b[22]),m=d(m,g,h,f,z,20,b[23]),f=d(f,m,g,h,A,5,b[24]),h=d(h,f,m,g,E,9,b[25]),g=d(g,h,f,m,k,14,b[26]),m=d(m,g,h,f,v,20,b[27]),f=d(f,m,g,h,D,5,b[28]),h=d(h,f,
m,g,j,9,b[29]),g=d(g,h,f,m,w,14,b[30]),m=d(m,g,h,f,u,20,b[31]),f=l(f,m,g,h,r,4,b[32]),h=l(h,f,m,g,v,11,b[33]),g=l(g,h,f,m,C,16,b[34]),m=l(m,g,h,f,E,23,b[35]),f=l(f,m,g,h,e,4,b[36]),h=l(h,f,m,g,z,11,b[37]),g=l(g,h,f,m,w,16,b[38]),m=l(m,g,h,f,B,23,b[39]),f=l(f,m,g,h,D,4,b[40]),h=l(h,f,m,g,c,11,b[41]),g=l(g,h,f,m,k,16,b[42]),m=l(m,g,h,f,t,23,b[43]),f=l(f,m,g,h,A,4,b[44]),h=l(h,f,m,g,u,11,b[45]),g=l(g,h,f,m,x,16,b[46]),m=l(m,g,h,f,j,23,b[47]),f=s(f,m,g,h,c,6,b[48]),h=s(h,f,m,g,w,10,b[49]),g=s(g,h,f,m,
E,15,b[50]),m=s(m,g,h,f,r,21,b[51]),f=s(f,m,g,h,u,6,b[52]),h=s(h,f,m,g,k,10,b[53]),g=s(g,h,f,m,B,15,b[54]),m=s(m,g,h,f,e,21,b[55]),f=s(f,m,g,h,v,6,b[56]),h=s(h,f,m,g,x,10,b[57]),g=s(g,h,f,m,t,15,b[58]),m=s(m,g,h,f,D,21,b[59]),f=s(f,m,g,h,z,6,b[60]),h=s(h,f,m,g,C,10,b[61]),g=s(g,h,f,m,j,15,b[62]),m=s(m,g,h,f,A,21,b[63]);a[0]=a[0]+f|0;a[1]=a[1]+m|0;a[2]=a[2]+g|0;a[3]=a[3]+h|0},_doFinalize:function(){var b=this._data,n=b.words,a=8*this._nDataBytes,c=8*b.sigBytes;n[c>>>5]|=128<<24-c%32;var e=u.floor(a/
4294967296);n[(c+64>>>9<<4)+15]=(e<<8|e>>>24)&16711935|(e<<24|e>>>8)&4278255360;n[(c+64>>>9<<4)+14]=(a<<8|a>>>24)&16711935|(a<<24|a>>>8)&4278255360;b.sigBytes=4*(n.length+1);this._process();b=this._hash;n=b.words;for(a=0;4>a;a++)c=n[a],n[a]=(c<<8|c>>>24)&16711935|(c<<24|c>>>8)&4278255360;return b},clone:function(){var b=v.clone.call(this);b._hash=this._hash.clone();return b}});t.MD5=v._createHelper(r);t.HmacMD5=v._createHmacHelper(r)})(Math);
(function(){var u=CryptoJS,p=u.lib,d=p.Base,l=p.WordArray,p=u.algo,s=p.EvpKDF=d.extend({cfg:d.extend({keySize:4,hasher:p.MD5,iterations:1}),init:function(d){this.cfg=this.cfg.extend(d)},compute:function(d,r){for(var p=this.cfg,s=p.hasher.create(),b=l.create(),u=b.words,q=p.keySize,p=p.iterations;u.length<q;){n&&s.update(n);var n=s.update(d).finalize(r);s.reset();for(var a=1;a<p;a++)n=s.finalize(n),s.reset();b.concat(n)}b.sigBytes=4*q;return b}});u.EvpKDF=function(d,l,p){return s.create(p).compute(d,
l)}})();
CryptoJS.lib.Cipher||function(u){var p=CryptoJS,d=p.lib,l=d.Base,s=d.WordArray,t=d.BufferedBlockAlgorithm,r=p.enc.Base64,w=p.algo.EvpKDF,v=d.Cipher=t.extend({cfg:l.extend(),createEncryptor:function(e,a){return this.create(this._ENC_XFORM_MODE,e,a)},createDecryptor:function(e,a){return this.create(this._DEC_XFORM_MODE,e,a)},init:function(e,a,b){this.cfg=this.cfg.extend(b);this._xformMode=e;this._key=a;this.reset()},reset:function(){t.reset.call(this);this._doReset()},process:function(e){this._append(e);return this._process()},
finalize:function(e){e&&this._append(e);return this._doFinalize()},keySize:4,ivSize:4,_ENC_XFORM_MODE:1,_DEC_XFORM_MODE:2,_createHelper:function(e){return{encrypt:function(b,k,d){return("string"==typeof k?c:a).encrypt(e,b,k,d)},decrypt:function(b,k,d){return("string"==typeof k?c:a).decrypt(e,b,k,d)}}}});d.StreamCipher=v.extend({_doFinalize:function(){return this._process(!0)},blockSize:1});var b=p.mode={},x=function(e,a,b){var c=this._iv;c?this._iv=u:c=this._prevBlock;for(var d=0;d<b;d++)e[a+d]^=
c[d]},q=(d.BlockCipherMode=l.extend({createEncryptor:function(e,a){return this.Encryptor.create(e,a)},createDecryptor:function(e,a){return this.Decryptor.create(e,a)},init:function(e,a){this._cipher=e;this._iv=a}})).extend();q.Encryptor=q.extend({processBlock:function(e,a){var b=this._cipher,c=b.blockSize;x.call(this,e,a,c);b.encryptBlock(e,a);this._prevBlock=e.slice(a,a+c)}});q.Decryptor=q.extend({processBlock:function(e,a){var b=this._cipher,c=b.blockSize,d=e.slice(a,a+c);b.decryptBlock(e,a);x.call(this,
e,a,c);this._prevBlock=d}});b=b.CBC=q;q=(p.pad={}).Pkcs7={pad:function(a,b){for(var c=4*b,c=c-a.sigBytes%c,d=c<<24|c<<16|c<<8|c,l=[],n=0;n<c;n+=4)l.push(d);c=s.create(l,c);a.concat(c)},unpad:function(a){a.sigBytes-=a.words[a.sigBytes-1>>>2]&255}};d.BlockCipher=v.extend({cfg:v.cfg.extend({mode:b,padding:q}),reset:function(){v.reset.call(this);var a=this.cfg,b=a.iv,a=a.mode;if(this._xformMode==this._ENC_XFORM_MODE)var c=a.createEncryptor;else c=a.createDecryptor,this._minBufferSize=1;this._mode=c.call(a,
this,b&&b.words)},_doProcessBlock:function(a,b){this._mode.processBlock(a,b)},_doFinalize:function(){var a=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){a.pad(this._data,this.blockSize);var b=this._process(!0)}else b=this._process(!0),a.unpad(b);return b},blockSize:4});var n=d.CipherParams=l.extend({init:function(a){this.mixIn(a)},toString:function(a){return(a||this.formatter).stringify(this)}}),b=(p.format={}).OpenSSL={stringify:function(a){var b=a.ciphertext;a=a.salt;return(a?s.create([1398893684,
1701076831]).concat(a).concat(b):b).toString(r)},parse:function(a){a=r.parse(a);var b=a.words;if(1398893684==b[0]&&1701076831==b[1]){var c=s.create(b.slice(2,4));b.splice(0,4);a.sigBytes-=16}return n.create({ciphertext:a,salt:c})}},a=d.SerializableCipher=l.extend({cfg:l.extend({format:b}),encrypt:function(a,b,c,d){d=this.cfg.extend(d);var l=a.createEncryptor(c,d);b=l.finalize(b);l=l.cfg;return n.create({ciphertext:b,key:c,iv:l.iv,algorithm:a,mode:l.mode,padding:l.padding,blockSize:a.blockSize,formatter:d.format})},
decrypt:function(a,b,c,d){d=this.cfg.extend(d);b=this._parse(b,d.format);return a.createDecryptor(c,d).finalize(b.ciphertext)},_parse:function(a,b){return"string"==typeof a?b.parse(a,this):a}}),p=(p.kdf={}).OpenSSL={execute:function(a,b,c,d){d||(d=s.random(8));a=w.create({keySize:b+c}).compute(a,d);c=s.create(a.words.slice(b),4*c);a.sigBytes=4*b;return n.create({key:a,iv:c,salt:d})}},c=d.PasswordBasedCipher=a.extend({cfg:a.cfg.extend({kdf:p}),encrypt:function(b,c,d,l){l=this.cfg.extend(l);d=l.kdf.execute(d,
b.keySize,b.ivSize);l.iv=d.iv;b=a.encrypt.call(this,b,c,d.key,l);b.mixIn(d);return b},decrypt:function(b,c,d,l){l=this.cfg.extend(l);c=this._parse(c,l.format);d=l.kdf.execute(d,b.keySize,b.ivSize,c.salt);l.iv=d.iv;return a.decrypt.call(this,b,c,d.key,l)}})}();
(function(){for(var u=CryptoJS,p=u.lib.BlockCipher,d=u.algo,l=[],s=[],t=[],r=[],w=[],v=[],b=[],x=[],q=[],n=[],a=[],c=0;256>c;c++)a[c]=128>c?c<<1:c<<1^283;for(var e=0,j=0,c=0;256>c;c++){var k=j^j<<1^j<<2^j<<3^j<<4,k=k>>>8^k&255^99;l[e]=k;s[k]=e;var z=a[e],F=a[z],G=a[F],y=257*a[k]^16843008*k;t[e]=y<<24|y>>>8;r[e]=y<<16|y>>>16;w[e]=y<<8|y>>>24;v[e]=y;y=16843009*G^65537*F^257*z^16843008*e;b[k]=y<<24|y>>>8;x[k]=y<<16|y>>>16;q[k]=y<<8|y>>>24;n[k]=y;e?(e=z^a[a[a[G^z]]],j^=a[a[j]]):e=j=1}var H=[0,1,2,4,8,
16,32,64,128,27,54],d=d.AES=p.extend({_doReset:function(){for(var a=this._key,c=a.words,d=a.sigBytes/4,a=4*((this._nRounds=d+6)+1),e=this._keySchedule=[],j=0;j<a;j++)if(j<d)e[j]=c[j];else{var k=e[j-1];j%d?6<d&&4==j%d&&(k=l[k>>>24]<<24|l[k>>>16&255]<<16|l[k>>>8&255]<<8|l[k&255]):(k=k<<8|k>>>24,k=l[k>>>24]<<24|l[k>>>16&255]<<16|l[k>>>8&255]<<8|l[k&255],k^=H[j/d|0]<<24);e[j]=e[j-d]^k}c=this._invKeySchedule=[];for(d=0;d<a;d++)j=a-d,k=d%4?e[j]:e[j-4],c[d]=4>d||4>=j?k:b[l[k>>>24]]^x[l[k>>>16&255]]^q[l[k>>>
8&255]]^n[l[k&255]]},encryptBlock:function(a,b){this._doCryptBlock(a,b,this._keySchedule,t,r,w,v,l)},decryptBlock:function(a,c){var d=a[c+1];a[c+1]=a[c+3];a[c+3]=d;this._doCryptBlock(a,c,this._invKeySchedule,b,x,q,n,s);d=a[c+1];a[c+1]=a[c+3];a[c+3]=d},_doCryptBlock:function(a,b,c,d,e,j,l,f){for(var m=this._nRounds,g=a[b]^c[0],h=a[b+1]^c[1],k=a[b+2]^c[2],n=a[b+3]^c[3],p=4,r=1;r<m;r++)var q=d[g>>>24]^e[h>>>16&255]^j[k>>>8&255]^l[n&255]^c[p++],s=d[h>>>24]^e[k>>>16&255]^j[n>>>8&255]^l[g&255]^c[p++],t=
d[k>>>24]^e[n>>>16&255]^j[g>>>8&255]^l[h&255]^c[p++],n=d[n>>>24]^e[g>>>16&255]^j[h>>>8&255]^l[k&255]^c[p++],g=q,h=s,k=t;q=(f[g>>>24]<<24|f[h>>>16&255]<<16|f[k>>>8&255]<<8|f[n&255])^c[p++];s=(f[h>>>24]<<24|f[k>>>16&255]<<16|f[n>>>8&255]<<8|f[g&255])^c[p++];t=(f[k>>>24]<<24|f[n>>>16&255]<<16|f[g>>>8&255]<<8|f[h&255])^c[p++];n=(f[n>>>24]<<24|f[g>>>16&255]<<16|f[h>>>8&255]<<8|f[k&255])^c[p++];a[b]=q;a[b+1]=s;a[b+2]=t;a[b+3]=n},keySize:8});u.AES=p._createHelper(d)})();

File diff suppressed because one or more lines are too long

@ -0,0 +1,117 @@
/*!
* jQuery Cookie Plugin v1.4.1
* https://github.com/carhartl/jquery-cookie
*
* Copyright 2013 Klaus Hartl
* Released under the MIT license
*/
(function (factory) {
if (typeof define === 'function' && define.amd) {
// AMD
define(['jquery'], factory);
} else if (typeof exports === 'object') {
// CommonJS
factory(require('jquery'));
} else {
// Browser globals
factory(jQuery);
}
}(function ($) {
var pluses = /\+/g;
function encode(s) {
return config.raw ? s : encodeURIComponent(s);
}
function decode(s) {
return config.raw ? s : decodeURIComponent(s);
}
function stringifyCookieValue(value) {
return encode(config.json ? JSON.stringify(value) : String(value));
}
function parseCookieValue(s) {
if (s.indexOf('"') === 0) {
// This is a quoted cookie as according to RFC2068, unescape...
s = s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\');
}
try {
// Replace server-side written pluses with spaces.
// If we can't decode the cookie, ignore it, it's unusable.
// If we can't parse the cookie, ignore it, it's unusable.
s = decodeURIComponent(s.replace(pluses, ' '));
return config.json ? JSON.parse(s) : s;
} catch(e) {}
}
function read(s, converter) {
var value = config.raw ? s : parseCookieValue(s);
return $.isFunction(converter) ? converter(value) : value;
}
var config = $.cookie = function (key, value, options) {
// Write
if (value !== undefined && !$.isFunction(value)) {
options = $.extend({}, config.defaults, options);
if (typeof options.expires === 'number') {
var days = options.expires, t = options.expires = new Date();
t.setTime(+t + days * 864e+5);
}
return (document.cookie = [
encode(key), '=', stringifyCookieValue(value),
options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
options.path ? '; path=' + options.path : '',
options.domain ? '; domain=' + options.domain : '',
options.secure ? '; secure' : ''
].join(''));
}
// Read
var result = key ? undefined : {};
// To prevent the for loop in the first place assign an empty array
// in case there are no cookies at all. Also prevents odd result when
// calling $.cookie().
var cookies = document.cookie ? document.cookie.split('; ') : [];
for (var i = 0, l = cookies.length; i < l; i++) {
var parts = cookies[i].split('=');
var name = decode(parts.shift());
var cookie = parts.join('=');
if (key && key === name) {
// If second argument (value) is a function it's a converter...
result = read(cookie, value);
break;
}
// Prevent storing a cookie that we couldn't decode.
if (!key && (cookie = read(cookie)) !== undefined) {
result[name] = cookie;
}
}
return result;
};
config.defaults = {};
$.removeCookie = function (key, options) {
if ($.cookie(key) === undefined) {
return false;
}
// Must not alter options, thus extending a fresh object...
$.cookie(key, '', $.extend({}, options, { expires: -1 }));
return !$.cookie(key);
};
}));

@ -0,0 +1,253 @@
var JMusicjsoup = {
getRecommends:function(callback){
$.ajax({
url:'/musicapi/apiqq/musichall/fcgi-bin/fcg_yqqhomepagerecommend.fcg',
data:{'g_tk':5381,'uin':0,'format':'json','inCharset':'utf-8','outCharset':'utf-8','notice':0,'platform':'h5','needNewCode':1,'_':1535537714744},
dataType:'json',
type:'get',
async:true,
success:function(data){
callback._setRecommend(data);
}
});
},
getNewsongs:function(num,callback){
//"{"limit":10}"
setV.d = '{"limit":'+num+'}';
var res = __getKeyton();
$.ajax({
url:'/mapi163/weapi/personalized/newsong',
// data:{'params':'ujh2NED7JxtOit8f2Vo/sp+bqzzC9urfBWjZD60xDdA=','encSecKey':'302d922dd30c10cc489121d1e5e956db50d5d3f8cf1f46dae2c501d88d378cb4b4b11d732efafb3c02c8e5b4e6f2633a5422bf8a0f902a10eb1627ee3665d1dbf370de4356b9a9348f0a3ff8ffb188e996d8e2f8878a95effac07ab1295ebb81ff06127e3e58d339a07d6c824128b58d2f60b60c284b7a55b70ea5e4e126136a'},
data:{'params':res[0],'encSecKey':res[1]},
dataType:'json',
type:'post',
async:true,
success:function(data){
callback._setNewsongs(data);
}
});
},
getLyric:function(id,callback){
setV.d = '{"id":"'+id+'","lv":0,"tv":0}';
var res = __getKeyton();
$.ajax({
url:'/mapi163/weapi/song/lyric',
data:{'params':res[0],'encSecKey':res[1]},
dataType:'json',
type:'post',
async:true,
success:function(data){
callback._setLyric(id,data);
}
});
},
getListsongs:function(callback){
$.ajax({
url:'/mapi163/weapi/v3/playlist/detail',
data:{'params':'KvByhpvz7lzKJlmmur31pyP9wun0SzssbTnXHQveNOPYvGMFH7w8U+0pcbpv3NX0','encSecKey':'be25f5794f940eebbde77dba783699e38bc12db41eadee670e69ebd16a3b29277817dd1795814de4c8264a28e5383da8620736d21275cc3b1f32797c4c63ca76db5dcae60fb21cc2b5d02741ed49fef00dcdaf3e16027de3c5ede1c7d8b8c182f1b0c5fedac846a5f511dbcda94936425b7a5df71dfd54cad47120e26d974b64'},
dataType:'json',
type:'post',
async:true,
success:function(data){
callback._setListsongs(data);
}
});
},
getKeywordsHot(){
//https://music.163.com/weapi/search/hot
//d = "{"type":1111}"
},
getKeywordsTips(key,callback){ //关键词
setV.d = '{"s":"'+key+'"}';
var res = __getKeyton();
$.ajax({
url:'/mapi163/weapi/search/suggest/keyword',
data:{'params':res[0],'encSecKey':res[1]},
dataType:'json',
type:'post',
async:true,
success:function(data){
if(callback!=null){
callback._setKeywordsTips(data);
}
}
});
},
getSearchRes(key,limit,offset,callback){
//"{"s":"神","limit":20,"offset":20,"type":1,"strategy":5,"queryCorrect":true}" 继续获取
setV.d = '{"s":"'+key+'","type":1,"limit":'+limit+',"offset":'+offset+',"strategy":5,"queryCorrect":true}';
var res = __getKeyton();
$.ajax({
url:'/mapi163/weapi/search/get/',
data:{'params':res[0],'encSecKey':res[1]},
dataType:'json',
type:'post',
async:true,
success:function(data){
if(callback!=null){
callback._setSearchRessong(data);
}
//data.result;//"songs"下直接取个数 songs[0].name song[0].ar[0].name
}
});
},
getSongInfo(id,callback){
setV.d ='{"id":"'+id+'","c":"[{\\"id\\":\\"'+id+'\\"}]"}';
var res = __getKeyton();
$.ajax({
url:'/mapi163/weapi/v3/song/detail',
data:{'params':res[0],'encSecKey':res[1]},
dataType:'json',
type:'post',
async:true,
success:function(data){
if(callback!=null){
if(data.code==200){
callback._setSongInfo(id,data); //songs:data.playlist.[tracks,name]
}
}
},
error:function(err){
console.log(err);
}
});
},
getPlayLists(key,limit,offset,callback){
//获得歌单内容
//https://music.163.com/weapi/v3/playlist/detail
//d:"{"id":"2358852380","n":1000}" 歌单ID
//"{"s":"神","limit":20,"offset":20,"type":1,"strategy":5,"queryCorrect":true}" 继续获取
setV.d = '{"limit":'+limit+',"offset":'+offset+',"s":"'+key+'","total":"true","type":"1000","csrf_token":""}';
var res = __getKeyton();
$.ajax({
url:'/mapi163/weapi/cloudsearch/get/web',
data:{'params':res[0],'encSecKey':res[1]},
dataType:'json',
type:'post',
async:true,
success:function(data){
console.error(data);
if(callback!=null){
callback._setSearchResplay(data); //songs:data.playlist.[tracks,name]
}
}
});
},
getPlayList(id,callback){
//获得歌单内容
//https://music.163.com/weapi/v3/playlist/detail
//d:"{"id":"2358852380","n":1000}" 歌单ID
setV.d = `{"id":"${id}","total":"True","limit":1000,"n":1000,"csrf_token":"09556b378da338d2c373d38422f901a6"}`;
var res = __getKeyton();
$.ajax({
url:'/mapi163/weapi/v3/playlist/detail',
// url:'/mapi163/weapi/middle/clientcfg/config/list?csrf_token=',
data:{'params':res[0],'encSecKey':res[1]},
dataType:'json',
type:'post',
async:true,
success:function(data){
if(callback!=null){
callback._setPlayList(data); //songs:data.playlist.[tracks,name]
}
}
});
},
getuserPlayList(id,callback){
//获得用户的所有歌单
//https://music.163.com/weapi/v3/playlist/detail
//d:"{"id":"2358852380","n":1000}" 歌单ID
//"{"s":"神","limit":20,"offset":20,"type":1,"strategy":5,"queryCorrect":true}" 继续获取
setV.d = '{\"uid\":\"'+id+'\",\"offset\":"0","limit":"1001"}';
var res = __getKeyton();
$.ajax({
url:'/mapi163/weapi/user/playlist',
data:{'params':res[0],'encSecKey':res[1]},
dataType:'json',
type:'post',
async:true,
success:function(data){
if(callback!=null){
callback._setuserPlayList(data); //songs:data.playlist.[tracks,name]
}
}
});
},
getCommentsByPlayList(id,callback){
//获得评论内容
//https://music.163.com/weapi/v1/resource/comments/get
//d:"{"resourceType":0,"resourceId":"2358852380","limit":15}" 歌单ID
setV.d = '{"resourceType":0,"resourceId":"'+id+'","limit":15}';
var res = __getKeyton();
$.ajax({
url:'/mapi163/weapi/v1/resource/comments/get',
data:{'params':res[0],'encSecKey':res[1]},
dataType:'json',
type:'post',
async:true,
success:function(data){
if(callback!=null){
callback._setPlayList(data); //songs:data.playlist.[tracks,name]
}
}
});
},
getMp3Url(id,callback){
setV.d = `{"ids":"[\\"${id}\\"]","level":"lossless","encodeType":"aac","csrf_token":"","br":"128000"}`;
//setV.d = "{\"ids\":\"[\\\""+id+"\\\"]\",\"br\":\"128000\"}";
var res = __getKeyton();
$.ajax({
url:'/mapi163/weapi/song/enhance/player/url',
type:'post',
dataType:'json',
async:true,
data:{'params':res[0],'encSecKey':res[1]},
success:function(data){
if(callback!=null){
callback._setMp3Url(id,data);
}
},
error:function(err){
}
});
},
getOnline(callback){
$.ajax({
url:'/userarea',
type:'post',
dataType:'json',
async:true,
data:{"type":"ONLINE"},
success:function(data){
if(data.status == 0){
if(callback!=null){
Jsonp.getUser(data.message,callback);
}
}
},
error:function(err){
}
});
},
getUser(id,callback){
$.ajax({
url:'/userarea',
type:'post',
dataType:'json',
async:true,
data:{"type":"USER","id":id},
success:function(data){
if(callback!=null){
callback._setUser(data);
}
},
error:function(err){
}
});
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 36 KiB

@ -1,6 +1,6 @@
<template>
<div id="app">
<router-view/>
<router-view/>
</div>
</template>
@ -22,7 +22,9 @@ export default {
},
methods: {}
methods: {
}
}
</script>

@ -79,7 +79,19 @@
opacity: 1;
}
}
@keyframes fadeShow {
0% {
opacity: 0.5;
}
50% {
opacity: 0;
}
100% {
opacity: 0.5;
}
}
/* 下移 */
@keyframes my-shake {
0% {

@ -2,7 +2,9 @@
* {
box-sizing: border-box;
}
i{
user-select: none;
}
body {
color: var(--fontColor);
font-family: var(--globalFont), serif;
@ -11,10 +13,10 @@ body {
@font-face {
font-family: SmileySans;
src: url(../fonts/SmileySans.otf);
/* src: url(../fonts/SmileySans.otf); */
src: url(//qiniu.roginx.ink/cdn/fonts/%E9%92%89%E9%92%89%E8%BF%9B%E6%AD%A5%E4%BD%93.ttf);
font-display: swap;
}
/* 图片 */
.background-image {
width: 100vw;
@ -62,7 +64,7 @@ body {
position: absolute;
width: 100%;
height: 100%;
background-color: var(--maxMask);
background-color: var(--mask);
content: "";
}
@ -236,7 +238,7 @@ body {
position: absolute;
width: 100%;
height: 100%;
background-color: var(--maxMask);
background-color: var(--mask);
content: "";
}
@ -254,7 +256,221 @@ body {
cursor: pointer;
}
[ks-tag] {
position: relative
}
[ks-tag]:before,[ks-tag]:after {
position: absolute;
pointer-events: none
}
[ks-tag]:before {
width: 0;
height: 0;
opacity: 0;
content: '';
position: absolute;
transition: opacity .3s;
border: .5rem solid transparent
}
[ks-tag~=top]:before {
bottom: 100%;
border-top-color: rgba(0,0,0,.7)
}
[ks-tag~=bottom]:before {
top: 100%;
border-bottom-color: aliceblue;
}
[ks-tag~=top]:before,[ks-tag~=bottom]:before {
left: 50%;
transform: translateX(-50%)
}
[ks-tag=left]:before {
right: 100%;
border-left-color: rgba(0,0,0,.7)
}
[ks-tag=right]:before {
left: 100%;
border-right-color: rgba(0,0,0,.7)
}
[ks-tag=left]:before,[ks-tag=right]:before {
top: 50%;
transform: translateY(-50%)
}
[ks-tag~=top]:after {
bottom: 100%;
margin-bottom: 1rem
}
[ks-tag~=bottom]:after {
top: 100%;
margin-top: 1rem
}
[ks-tag=top]:after,[ks-tag=bottom]:after {
left: 50%;
transform: translateX(-50%)
}
[ks-tag=left]:after {
right: 100%;
margin-right: 1rem
}
[ks-tag=right]:after {
left: 100%;
margin-left: 1rem
}
[ks-tag=left]:after,[ks-tag=right]:after {
top: 50%;
transform: translateY(-50%)
}
[ks-tag~=left][ks-tag~=top]:after,[ks-tag~=left][ks-tag~=bottom]:after {
right: 0;
min-width: 4em
}
[ks-tag~=right][ks-tag~=top]:after,[ks-tag~=right][ks-tag~=bottom]:after {
left: 0;
min-width: 4em
}
[ks-text]:hover:before,[ks-text]:hover:after {
opacity: 1
}
[ks-text]:after {
opacity: 0;
z-index: 1;
color: #fff;
font-size: .85rem;
white-space: nowrap;
border-radius: .5rem;
padding: .25rem .5rem;
content: attr(ks-text);
transition: opacity .3s;
background: rgba(0,0,0,.7)
}
.mceTmpl{
position:relative;
user-select: none;
}
.check_label{
box-sizing: border-box;
width:100%;
display: block;
position: absolute;
width: 100%;
height: 120px;
opacity: 1;
bottom: 0;
left: 0;
background-image: linear-gradient(to bottom, rgba(255, 255, 255, 0) 0%, var(--background) 70%);
pointer-events: none;
}
.hideContext{
position: relative;
box-sizing: border-box;
width:100%;
max-height:120px;
min-height: 80px;
overflow: hidden;
transition:.3s;
}
.check_label::after{
content: '显示内容';
letter-spacing: .3em;
height: 1.2em;
background: #0000000a;
line-height: 1.2em;
bottom: 0px;
display: inline-block;
position: absolute;
left: 50%;
transform: translateX(-50%);
background-color: #333;
font-size: .8em;
color: #fff;
padding: 8px 14px;
border-radius: 4px;
box-shadow: 0px 2px 2px rgb(0 0 0 / 20%);
cursor: pointer;
pointer-events: auto;
}
.check_label:hover::after{
font-weight:550;
color:#FFF;
background: #000;
opacity: 1 !important;
transition:.3s;
}
.hideCheckInput{
display: none;
}
.hideCheckInput:checked ~ .check_label{
transition: .3s;
background-image: none;
}
.hideCheckInput:checked ~ .hideContext {
min-height: 300px;
max-height: unset;
transition: .3s;
}
.hideCheckInput:checked ~ .check_label::after{
content: '隐藏内容';
transition: 2s ease .5s;
opacity: 0;
}
.hideCheckInput:checked ~ .check_label:hover::after{
background: #000 !important;
animation:none;
transition: .4s !important;
}
.print{
width:1000px;
white-space:nowrap;
overflow:hidden;
-webkit-animation: dy 3s steps(60, end) infinite;
animation: dy 3s steps(50, end) infinite;
}
.spanFeather {
width: 100%;
overflow: hidden;
text-overflow: ellipsis;
}
@supports (-webkit-mask-image: inherit) or (mask-image: inherit) {
.spanFeather {
text-overflow: clip;
-webkit-mask-image: linear-gradient(
to right,
rgba(0, 0, 0, 1) calc(100% - 2em),
transparent
);
mask-image: linear-gradient(
to right,
rgba(0, 0, 0, 1) calc(100% - 2em),
transparent
);
}
}
@-webkit-keyframes dy{
from { width: 0;}
}
@keyframes dy{
from { width: 0;}
}
@media screen and (max-width: 400px) {
.el-dialog {
width: 75% !important;

@ -253,6 +253,7 @@
.hljs-ln {
margin: 6px 0 0;
width: 100%;
font-family: 'Fira Code';
}
.hljs-ln-line.hljs-ln-code {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 MiB

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 893 KiB

After

Width:  |  Height:  |  Size: 592 KiB

@ -0,0 +1,991 @@
[{
"text": "小黄脸",
"url": "https://i0.hdslb.com/bfs/emote/fa6dda8b876ed38609de38aa604be5ad109b8591.png",
"emote": [{
"text": "[2023]",
"url": "https://i0.hdslb.com/bfs/emote/fa6dda8b876ed38609de38aa604be5ad109b8591.png"
}, {
"text": "[足球]",
"url": "https://i0.hdslb.com/bfs/emote/f9157d9fa5ac3b8339cb8a8b7ad70eb40d4113c9.png"
}, {
"text": "[脱单doge]",
"url": "https://i0.hdslb.com/bfs/emote/bf7e00ecab02171f8461ee8cf439c73db9797748.png"
}, {
"text": "[微笑]",
"url": "https://i0.hdslb.com/bfs/emote/685612eadc33f6bc233776c6241813385844f182.png"
}, {
"text": "[口罩]",
"url": "https://i0.hdslb.com/bfs/emote/3ad2f66b151496d2a5fb0a8ea75f32265d778dd3.png"
}, {
"text": "[doge]",
"url": "https://i0.hdslb.com/bfs/emote/3087d273a78ccaff4bb1e9972e2ba2a7583c9f11.png"
}, {
"text": "[妙啊]",
"url": "https://i0.hdslb.com/bfs/emote/b4cb77159d58614a9b787b91b1cd22a81f383535.png"
}, {
"text": "[OK]",
"url": "https://i0.hdslb.com/bfs/emote/4683fd9ffc925fa6423110979d7dcac5eda297f4.png"
}, {
"text": "[星星眼]",
"url": "https://i0.hdslb.com/bfs/emote/63c9d1a31c0da745b61cdb35e0ecb28635675db2.png"
}, {
"text": "[辣眼睛]",
"url": "https://i0.hdslb.com/bfs/emote/35d62c496d1e4ea9e091243fa812866f5fecc101.png"
}, {
"text": "[吃瓜]",
"url": "https://i0.hdslb.com/bfs/emote/4191ce3c44c2b3df8fd97c33f85d3ab15f4f3c84.png"
}, {
"text": "[滑稽]",
"url": "https://i0.hdslb.com/bfs/emote/d15121545a99ac46774f1f4465b895fe2d1411c3.png"
}, {
"text": "[呲牙]",
"url": "https://i0.hdslb.com/bfs/emote/b5a5898491944a4268360f2e7a84623149672eb6.png"
}, {
"text": "[打call]",
"url": "https://i0.hdslb.com/bfs/emote/431432c43da3ee5aab5b0e4f8931953e649e9975.png"
}, {
"text": "[歪嘴]",
"url": "https://i0.hdslb.com/bfs/emote/4384050fbab0586259acdd170b510fe262f08a17.png"
}, {
"text": "[调皮]",
"url": "https://i0.hdslb.com/bfs/emote/8290b7308325e3179d2154327c85640af1528617.png"
}, {
"text": "[2022]",
"url": "https://i0.hdslb.com/bfs/emote/a783df2ce72952c44004007462324bde4b092a0c.png"
}, {
"text": "[虎年]",
"url": "https://i0.hdslb.com/bfs/emote/a062f5fa2bafe677e49b6963a2bbb11dd4fe1e11.png"
}, {
"text": "[豹富]",
"url": "https://i0.hdslb.com/bfs/emote/3d1dbe52ea16e12ff7b1c371196f728a4097fb33.png"
}, {
"text": "[嗑瓜子]",
"url": "https://i0.hdslb.com/bfs/emote/28a91da1685d90124cfeead74622e1ebb417c0eb.png"
}, {
"text": "[笑哭]",
"url": "https://i0.hdslb.com/bfs/emote/c3043ba94babf824dea03ce500d0e73763bf4f40.png"
}, {
"text": "[藏狐]",
"url": "https://i0.hdslb.com/bfs/emote/ba0937ef6f3ccca85e2e0047e6263f3b4da37201.png"
}, {
"text": "[脸红]",
"url": "https://i0.hdslb.com/bfs/emote/0922c375da40e6b69002bd89b858572f424dcfca.png"
}, {
"text": "[给心心]",
"url": "https://i0.hdslb.com/bfs/emote/1597302b98827463f5b75c7cac1f29ea6ce572c4.png"
}, {
"text": "[嘟嘟]",
"url": "https://i0.hdslb.com/bfs/emote/abd7404537d8162720ccbba9e0a8cdf75547e07a.png"
}, {
"text": "[哦呼]",
"url": "https://i0.hdslb.com/bfs/emote/362bded07ea5434886271d23fa25f5d85d8af06c.png"
}, {
"text": "[喜欢]",
"url": "https://i0.hdslb.com/bfs/emote/8a10a4d73a89f665feff3d46ca56e83dc68f9eb8.png"
}, {
"text": "[酸了]",
"url": "https://i0.hdslb.com/bfs/emote/92b1c8cbceea3ae0e8e32253ea414783e8ba7806.png"
}, {
"text": "[嫌弃]",
"url": "https://i0.hdslb.com/bfs/emote/de4c0783aaa60ec03de0a2b90858927bfad7154b.png"
}, {
"text": "[大哭]",
"url": "https://i0.hdslb.com/bfs/emote/2caafee2e5db4db72104650d87810cc2c123fc86.png"
}, {
"text": "[害羞]",
"url": "https://i0.hdslb.com/bfs/emote/9d2ec4e1fbd6cb1b4d12d2bbbdd124ccb83ddfda.png"
}, {
"text": "[疑惑]",
"url": "https://i0.hdslb.com/bfs/emote/b7840db4b1f9f4726b7cb23c0972720c1698d661.png"
}, {
"text": "[喜极而泣]",
"url": "https://i0.hdslb.com/bfs/emote/485a7e0c01c2d70707daae53bee4a9e2e31ef1ed.png"
}, {
"text": "[奸笑]",
"url": "https://i0.hdslb.com/bfs/emote/bb84906573472f0a84cebad1e9000eb6164a6f5a.png"
}, {
"text": "[笑]",
"url": "https://i0.hdslb.com/bfs/emote/81edf17314cea3b48674312b4364df44d5c01f17.png"
}, {
"text": "[偷笑]",
"url": "https://i0.hdslb.com/bfs/emote/6c49d226e76c42cd8002abc47b3112bc5a92f66a.png"
}, {
"text": "[惊讶]",
"url": "https://i0.hdslb.com/bfs/emote/f8e9a59cad52ae1a19622805696a35f0a0d853f3.png"
}, {
"text": "[捂脸]",
"url": "https://i0.hdslb.com/bfs/emote/6921bb43f0c634870b92f4a8ad41dada94a5296d.png"
}, {
"text": "[阴险]",
"url": "https://i0.hdslb.com/bfs/emote/ba8d5f8e7d136d59aab52c40fd3b8a43419eb03c.png"
}, {
"text": "[囧]",
"url": "https://i0.hdslb.com/bfs/emote/12e41d357a9807cc80ef1e1ed258127fcc791424.png"
}, {
"text": "[呆]",
"url": "https://i0.hdslb.com/bfs/emote/33ad6000d9f9f168a0976bc60937786f239e5d8c.png"
}, {
"text": "[抠鼻]",
"url": "https://i0.hdslb.com/bfs/emote/cb89184c97e3f6d50acfd7961c313ce50360d70f.png"
}, {
"text": "[大笑]",
"url": "https://i0.hdslb.com/bfs/emote/ca94ad1c7e6dac895eb5b33b7836b634c614d1c0.png"
}, {
"text": "[惊喜]",
"url": "https://i0.hdslb.com/bfs/emote/0afecaf3a3499479af946f29749e1a6c285b6f65.png"
}, {
"text": "[无语]",
"url": "https://i0.hdslb.com/bfs/emote/44667b7d9349957e903b1b62cb91fb9b13720f04.png"
}, {
"text": "[点赞]",
"url": "https://i0.hdslb.com/bfs/emote/1a67265993913f4c35d15a6028a30724e83e7d35.png"
}, {
"text": "[鼓掌]",
"url": "https://i0.hdslb.com/bfs/emote/895d1fc616b4b6c830cf96012880818c0e1de00d.png"
}, {
"text": "[尴尬]",
"url": "https://i0.hdslb.com/bfs/emote/cb321684ed5ce6eacdc2699092ab8fe7679e4fda.png"
}, {
"text": "[灵魂出窍]",
"url": "https://i0.hdslb.com/bfs/emote/43d3db7d97343c01b47e22cfabeca84b4251f35a.png"
}, {
"text": "[委屈]",
"url": "https://i0.hdslb.com/bfs/emote/d2f26cbdd6c96960320af03f5514c5b524990840.png"
}, {
"text": "[傲娇]",
"url": "https://i0.hdslb.com/bfs/emote/010540d0f61220a0db4922e4a679a1d8eca94f4e.png"
}, {
"text": "[疼]",
"url": "https://i0.hdslb.com/bfs/emote/905fd9a99ec316e353b9bd4ecd49a5f0a301eabf.png"
}, {
"text": "[冷]",
"url": "https://i0.hdslb.com/bfs/emote/cb0ebbd0668640f07ebfc0e03f7a18a8cd00b4ed.png"
}, {
"text": "[热]",
"url": "https://i0.hdslb.com/bfs/emote/4e58a2a6f5f1580ac33df2d2cf7ecad7d9ab3635.png"
}, {
"text": "[生病]",
"url": "https://i0.hdslb.com/bfs/emote/0f25ce04ae1d7baf98650986454c634f6612cb76.png"
}, {
"text": "[吓]",
"url": "https://i0.hdslb.com/bfs/emote/9c10c5ebc7bef27ec641b8a1877674e0c65fea5d.png"
}, {
"text": "[吐]",
"url": "https://i0.hdslb.com/bfs/emote/06946bfe71ac48a6078a0b662181bb5cad09decc.png"
}, {
"text": "[捂眼]",
"url": "https://i0.hdslb.com/bfs/emote/c5c6d6982e1e53e478daae554b239f2b227b172b.png"
}, {
"text": "[嘘声]",
"url": "https://i0.hdslb.com/bfs/emote/e64af664d20716e090f10411496998095f62f844.png"
}, {
"text": "[思考]",
"url": "https://i0.hdslb.com/bfs/emote/cfa9b7e89e4bfe04bbcd34ccb1b0df37f4fa905c.png"
}, {
"text": "[再见]",
"url": "https://i0.hdslb.com/bfs/emote/fc510306bae26c9aec7e287cdf201ded27b065b9.png"
}, {
"text": "[翻白眼]",
"url": "https://i0.hdslb.com/bfs/emote/eba54707c7168925b18f6f8b1f48d532fe08c2b1.png"
}, {
"text": "[哈欠]",
"url": "https://i0.hdslb.com/bfs/emote/888d877729cbec444ddbd1cf4c9af155a7a06086.png"
}, {
"text": "[奋斗]",
"url": "https://i0.hdslb.com/bfs/emote/bb2060c15dba7d3fd731c35079d1617f1afe3376.png"
}, {
"text": "[墨镜]",
"url": "https://i0.hdslb.com/bfs/emote/3a03aebfc06339d86a68c2d893303b46f4b85771.png"
}, {
"text": "[难过]",
"url": "https://i0.hdslb.com/bfs/emote/a651db36701610aa70a781fa98c07c9789b11543.png"
}, {
"text": "[撇嘴]",
"url": "https://i0.hdslb.com/bfs/emote/531863568e5668c5ac181d395508a0eeb1f0cda4.png"
}, {
"text": "[抓狂]",
"url": "https://i0.hdslb.com/bfs/emote/4c87afff88c22439c45b79e9d2035d21d5622eba.png"
}, {
"text": "[生气]",
"url": "https://i0.hdslb.com/bfs/emote/3195714219c4b582a4fb02033dd1519913d0246d.png"
}, {
"text": "[水稻]",
"url": "https://i0.hdslb.com/bfs/emote/d530fcaa5100ba12a17a79b55bad342d530c54e3.png"
}, {
"text": "[奶茶干杯]",
"url": "https://i0.hdslb.com/bfs/emote/d5a491990be551ce69f9660da948050df4eab331.png"
}, {
"text": "[汤圆]",
"url": "https://i0.hdslb.com/bfs/emote/93609633a9d194cf336687eb19c01dca95bde719.png"
}, {
"text": "[锦鲤]",
"url": "https://i0.hdslb.com/bfs/emote/643d6c19c8164ffd89e3e9cdf093cf5d773d979c.png"
}, {
"text": "[弹幕破百亿]",
"url": "https://i0.hdslb.com/bfs/emote/80891223ba023dff3141e377f4ea3b89918eb6a4.png"
}, {
"text": "[福到了]",
"url": "https://i0.hdslb.com/bfs/emote/5de5373d354c373cf1617b6b836f3a8d53c5a655.png"
}, {
"text": "[鸡腿]",
"url": "https://i0.hdslb.com/bfs/emote/c7860392815d345fa69c4f00ef18d67dccfbd574.png"
}, {
"text": "[雪花]",
"url": "https://i0.hdslb.com/bfs/emote/a41813c4edf8782047e172c884ebd4507ce5e449.png"
}, {
"text": "[视频卫星]",
"url": "https://i0.hdslb.com/bfs/emote/dce6fc7d6dfeafff01241924db60f8251cca5307.png"
}, {
"text": "[干杯]",
"url": "https://i0.hdslb.com/bfs/emote/8da12d5f55a2c7e9778dcc05b40571979fe208e6.png"
}, {
"text": "[黑洞]",
"url": "https://i0.hdslb.com/bfs/emote/c4e9f0e3f35961d5037cb071b16ddba2170b262c.png"
}, {
"text": "[爱心]",
"url": "https://i0.hdslb.com/bfs/emote/ed04066ea7124106d17ffcaf75600700e5442f5c.png"
}, {
"text": "[胜利]",
"url": "https://i0.hdslb.com/bfs/emote/b49fa9f4b1e7c3477918153b82c60b114d87347c.png"
}, {
"text": "[加油]",
"url": "https://i0.hdslb.com/bfs/emote/c7aaeacb21e107292d3bb053e5abde4a4459ed30.png"
}, {
"text": "[抱拳]",
"url": "https://i0.hdslb.com/bfs/emote/89516218158dbea18ab78e8873060bf95d33bbbe.png"
}, {
"text": "[响指]",
"url": "https://i0.hdslb.com/bfs/emote/1b5c53cf14336903e1d2ae3527ca380a1256a077.png"
}, {
"text": "[保佑]",
"url": "https://i0.hdslb.com/bfs/emote/fafe8d3de0dc139ebe995491d2dac458a865fb30.png"
}, {
"text": "[福]",
"url": "https://i0.hdslb.com/bfs/emote/802429a301ac5b35a0480d9526a070ce67cd8097.png"
}, {
"text": "[支持]",
"url": "https://i0.hdslb.com/bfs/emote/3c210366a5585706c09d4c686a9d942b39feeb50.png"
}, {
"text": "[拥抱]",
"url": "https://i0.hdslb.com/bfs/emote/41780a4254750cdaaccb20735730a36044e98ef3.png"
}, {
"text": "[跪了]",
"url": "https://i0.hdslb.com/bfs/emote/f2b3aee7e521de7799d4e3aa379b01be032698ac.png"
}, {
"text": "[怪我咯]",
"url": "https://i0.hdslb.com/bfs/emote/07cc6077f7f7d75b8d2c722dd9d9828a9fb9e46d.png"
}, {
"text": "[老鼠]",
"url": "https://i0.hdslb.com/bfs/emote/8e6fb491eb1bb0d5862e7ec8ccf9a3da12b6c155.png"
}, {
"text": "[牛年]",
"url": "https://i0.hdslb.com/bfs/emote/9275275ff1f2659310648221107d20bc4970f106.png"
}, {
"text": "[三星堆]",
"url": "https://i0.hdslb.com/bfs/emote/fc7dadaa6986e75b813aa26f3eff3281d5f1a6d1.png"
}, {
"text": "[洛天依]",
"url": "https://i0.hdslb.com/bfs/emote/9fe06f3594d9afaf4ee2b74770f1c3086ae0ba11.png"
}, {
"text": "[坎公骑冠剑_吃鸡]",
"url": "https://i0.hdslb.com/bfs/emote/c4248a7b6ab326d66c83fd1fb58f1a50f99df332.png"
}, {
"text": "[坎公骑冠剑_钻石]",
"url": "https://i0.hdslb.com/bfs/emote/0b97c7e50e0cc963370e62fbb9b55f51bbe7f8ab.png"
}, {
"text": "[坎公骑冠剑_无语]",
"url": "https://i0.hdslb.com/bfs/emote/80eba0ce64c3fc1279b4daede2f1979cb2380e78.png"
}, {
"text": "[来古-沉思]",
"url": "https://i0.hdslb.com/bfs/emote/4ee07ff03266d62b246be0b950bebb2abf3d997c.png"
}, {
"text": "[来古-呆滞]",
"url": "https://i0.hdslb.com/bfs/emote/9a70b365e523f2379f395031ceefcebb75a45903.png"
}, {
"text": "[来古-疑问]",
"url": "https://i0.hdslb.com/bfs/emote/032fdc0d9d9fe6334776f6c39518a959b73b98f4.png"
}, {
"text": "[来古-震撼]",
"url": "https://i0.hdslb.com/bfs/emote/8b40f228675602a317d32007de6b795c101135ec.png"
}, {
"text": "[来古-注意]",
"url": "https://i0.hdslb.com/bfs/emote/4b671ba32a2581cf40e5cd41c67b111eb8010de0.png"
}, {
"text": "[初音未来_大笑]",
"url": "https://i0.hdslb.com/bfs/emote/8e7f71cda83ce407b0684702983399f8ed982f17.png"
}, {
"text": "[原神_哇]",
"url": "https://i0.hdslb.com/bfs/emote/8188ddf95bace929d382c7a83214afde79d83bfc.png"
}, {
"text": "[原神_哼]",
"url": "https://i0.hdslb.com/bfs/emote/91ed33b74bc36873c3ac8b2648f70d7ab6d8ab78.png"
}, {
"text": "[原神_嗯]",
"url": "https://i0.hdslb.com/bfs/emote/8b0a87e414f453a29730b6e0f45ca61f2f898688.png"
}, {
"text": "[原神_欸嘿]",
"url": "https://i0.hdslb.com/bfs/emote/8fba438fcbe0550877b04efd768d857082307c5e.png"
}, {
"text": "[原神_喝茶]",
"url": "https://i0.hdslb.com/bfs/emote/1de5789fbb3526ef7823c54db7081790a38e7044.png"
}, {
"text": "[原神_生气]",
"url": "https://i0.hdslb.com/bfs/emote/90a38c34742899f8e84138ed55f56cad3ba611fb.png"
}, {
"text": "[保卫萝卜_白眼]",
"url": "https://i0.hdslb.com/bfs/emote/9fce63f38288700bf7be84f3be336cf895ba0902.png"
}, {
"text": "[保卫萝卜_笔芯]",
"url": "https://i0.hdslb.com/bfs/emote/5ff2ed5cb71b02010018cc5910ac7052a03769af.png"
}, {
"text": "[保卫萝卜_哭哭]",
"url": "https://i0.hdslb.com/bfs/emote/7d249f7c990111d3e2982f7477af15b7eb29cbd9.png"
}, {
"text": "[保卫萝卜_哇]",
"url": "https://i0.hdslb.com/bfs/emote/5f2370e561c32d841245f7b1aab2eef43aeb9544.png"
}, {
"text": "[保卫萝卜_问号]",
"url": "https://i0.hdslb.com/bfs/emote/41eb93f09fc4a4d0692a310e8a1f85ba60e96060.png"
}, {
"text": "[无悔华夏_不愧是你]",
"url": "https://i0.hdslb.com/bfs/emote/c58002c32ee78d45366e126f294cb3149dd64ac2.png"
}, {
"text": "[无悔华夏_吃瓜]",
"url": "https://i0.hdslb.com/bfs/emote/273dcff577551bafff4f1eae18561f871e73a6ba.png"
}, {
"text": "[无悔华夏_达咩]",
"url": "https://i0.hdslb.com/bfs/emote/cffab383f47bab7f6736ba9c8d6ac098113410d9.png"
}, {
"text": "[无悔华夏_点赞]",
"url": "https://i0.hdslb.com/bfs/emote/b0f2e8db405ec667c3e6aaabd7c15155b6ea8710.png"
}, {
"text": "[无悔华夏_好耶]",
"url": "https://i0.hdslb.com/bfs/emote/324cd79784aeb37dbf2f47f68bbe8ed5d01f975e.png"
}, {
"text": "[奥比岛_搬砖]",
"url": "https://i0.hdslb.com/bfs/emote/1fab697214918d91087373a999cc7ef8040ddf85.png"
}, {
"text": "[奥比岛_点赞]",
"url": "https://i0.hdslb.com/bfs/emote/fb0b476fe2ff30cd59385ea7d616627ac114161f.png"
}, {
"text": "[奥比岛_击爪]",
"url": "https://i0.hdslb.com/bfs/emote/35bba1bb8f164c5e844155548438248e6eaa8382.png"
}, {
"text": "[奥比岛_委屈]",
"url": "https://i0.hdslb.com/bfs/emote/fda155e7c33b40dbb94c24644e0635d47b6ef3cc.png"
}, {
"text": "[奥比岛_喜欢]",
"url": "https://i0.hdslb.com/bfs/emote/ed64e0c81ee194138bd9df30c65077ed978fb88c.png"
}]
}, {
"text": "热词系列一",
"url": "https://i0.hdslb.com/bfs/emote/21f15fe11b7a84d2f2121c16dec50a4e4556f865.png",
"emote": [{
"text": "[热词系列_三连]",
"url": "https://i0.hdslb.com/bfs/emote/21f15fe11b7a84d2f2121c16dec50a4e4556f865.png"
}, {
"text": "[热词系列_知识增加]",
"url": "https://i0.hdslb.com/bfs/emote/5637557320fbfb3292307735f0b8acd53a791241.png"
}, {
"text": "[热词表情_哎呦不错哦]",
"url": "https://i0.hdslb.com/bfs/emote/6209c2cdcdeb014efd9eae4e9d55b9efb9c18263.png"
}, {
"text": "[热词系列_好耶]",
"url": "https://i0.hdslb.com/bfs/emote/ee2d354d3e67e5d77bab31ad8af99cd5ac89c009.png"
}, {
"text": "[热词系列_你币有了]",
"url": "https://i0.hdslb.com/bfs/emote/84820c2b147a8ca02f3c4006b63f76c6313cbfa0.png"
}, {
"text": "[热词系列_对象]",
"url": "https://i0.hdslb.com/bfs/emote/a41763740a90c2b11bf282bf44ccee78066c98ff.png"
}, {
"text": "[热词系列_不孤鸟]",
"url": "https://i0.hdslb.com/bfs/emote/7b94a0c3fe95c603a85a13bacbaf726b8e5882dc.png"
}, {
"text": "[热词系列_洛水天依]",
"url": "https://i0.hdslb.com/bfs/emote/ab3845edcdc3bb8852c502f472a8caa9e921ae3a.png"
}, {
"text": "[热词系列_优雅]",
"url": "https://i0.hdslb.com/bfs/emote/d41bc3db2a0d5ac32eee0b454062c057e6198a21.png"
}, {
"text": "[热词系列_吹爆]",
"url": "https://i0.hdslb.com/bfs/emote/9c78c14bd395d75afeecd20276ec71324e9b97df.png"
}, {
"text": "[热词系列_秀]",
"url": "https://i0.hdslb.com/bfs/emote/1f8ab5644a10c3a01cc32cfe8f4d000296b06fb4.png"
}, {
"text": "[热词系列_妙啊]",
"url": "https://i0.hdslb.com/bfs/emote/3ed5b0b2e1f632884d93abe6ae2a387e6f4395fd.png"
}, {
"text": "[热词系列_标准结局]",
"url": "https://i0.hdslb.com/bfs/emote/6b812dc41844ae4bdb3d6b7dd66067db6b922a5d.png"
}, {
"text": "[热词系列_B站有房]",
"url": "https://i0.hdslb.com/bfs/emote/e2aeda75690b72b49ebc82f12e340678f5fc47c0.png"
}, {
"text": "[热词系列_破防了]",
"url": "https://i0.hdslb.com/bfs/emote/d2c5d5a131f9d247e4ab4eed875c752d6e89d69e.png"
}, {
"text": "[热词系列_多谢款待]",
"url": "https://i0.hdslb.com/bfs/emote/a4789b0eceb8fb9719c3a214aa89180528369091.png"
}, {
"text": "[热词系列_燃起来了]",
"url": "https://i0.hdslb.com/bfs/emote/5a6199d39ee57e6e00ee1db33a7d430f5a9ff045.png"
}, {
"text": "[热词系列_仙人指路]",
"url": "https://i0.hdslb.com/bfs/emote/bf7fed28bbed40f95e08f9bab78802849b10ce63.png"
}, {
"text": "[热词系列_饮茶先啦]",
"url": "https://i0.hdslb.com/bfs/emote/f4782fa5a072c766fc2b289b067ea3f19086bdf4.png"
}, {
"text": "[热词系列_再来亿遍]",
"url": "https://i0.hdslb.com/bfs/emote/011c8e452941c701c3f69810eaeaaed99d96b9ee.png"
}, {
"text": "[热词系列_热乎]",
"url": "https://i0.hdslb.com/bfs/emote/79ba29bf44db3f05acbf0179f5969cc21cb1b0e6.png"
}, {
"text": "[热词系列_好活]",
"url": "https://i0.hdslb.com/bfs/emote/7ec857e53ebaf37c59e96b5e56bcb0f05cd0b2d7.png"
}, {
"text": "[热词系列_排面]",
"url": "https://i0.hdslb.com/bfs/emote/a544563e68dec3f6fcb3200cb7ea71193a0afe61.png"
}, {
"text": "[热词系列_爷青回]",
"url": "https://i0.hdslb.com/bfs/emote/a26189ff1e681bddef7f6533f9aabe7604731a3e.png"
}, {
"text": "[热词系列_好家伙]",
"url": "https://i0.hdslb.com/bfs/emote/63ec80dea3066bd9f449ba999ba531fa61f7b4eb.png"
}, {
"text": "[热词系列_芜湖起飞]",
"url": "https://i0.hdslb.com/bfs/emote/78d04c6ce78a613c90d510cd45fe7e25c57ba00b.png"
}, {
"text": "[热词系列_夺笋呐]",
"url": "https://i0.hdslb.com/bfs/emote/e763846a534e790d402ee4ef1640c9bc02aaab37.png"
}, {
"text": "[热词系列_两面包夹芝士]",
"url": "https://i0.hdslb.com/bfs/emote/9903fefe88018d62fecad299f6af4eb2d588bbdc.png"
}, {
"text": "[热词系列_梦幻联动]",
"url": "https://i0.hdslb.com/bfs/emote/4809416be5ca787c2ec3e897e4fd022a58da6e0e.png"
}, {
"text": "[热词系列_泪目]",
"url": "https://i0.hdslb.com/bfs/emote/bba3703ab90b7d16fe9dbcb85ed949db687f8331.png"
}, {
"text": "[热词系列_保护]",
"url": "https://i0.hdslb.com/bfs/emote/55f8f6445ca7c3170cdfc5b16036abf639ce9b57.png"
}, {
"text": "[热词系列_爱了爱了]",
"url": "https://i0.hdslb.com/bfs/emote/2a165b555ba20391316366c664ed7891883dc5aa.png"
}, {
"text": "[热词系列_可以]",
"url": "https://i0.hdslb.com/bfs/emote/e08543c71202b36c590094417fcfbb80c3506cd8.png"
}, {
"text": "[热词系列_希望没事]",
"url": "https://i0.hdslb.com/bfs/emote/6c0d2e6c486d1ba5afd6204a96e102652464a01d.png"
}, {
"text": "[热词系列_打卡]",
"url": "https://i0.hdslb.com/bfs/emote/a9cf77c78e1b9b40aa3ed4862402fba008ee2f51.png"
}, {
"text": "[热词系列_DNA]",
"url": "https://i0.hdslb.com/bfs/emote/f6eb74f8230588f61a298af89061a7d75c5762e5.png"
}, {
"text": "[热词系列_这次一定]",
"url": "https://i0.hdslb.com/bfs/emote/a01ca28923daa7cc896c42f27deb4914e20dd572.png"
}, {
"text": "[热词系列_AWSL]",
"url": "https://i0.hdslb.com/bfs/emote/c37f88cf799f9badf9d84b7671dc3dd98c0fc0c2.png"
}, {
"text": "[热词系列_递话筒]",
"url": "https://i0.hdslb.com/bfs/emote/98e6950e39fbb4dd1c576042063ca632074070ba.png"
}, {
"text": "[热词系列_你细品]",
"url": "https://i0.hdslb.com/bfs/emote/535e00658e7e47966f154d3a167fa2365ebc4321.png"
}, {
"text": "[热词系列_咕咕]",
"url": "https://i0.hdslb.com/bfs/emote/d8065c2e7ce48c929317a94553499a46fecc262a.png"
}, {
"text": "[热词系列_张三]",
"url": "https://i0.hdslb.com/bfs/emote/255a938f39cea625032b6650036b31aa26c50a3c.png"
}, {
"text": "[热词系列_害]",
"url": "https://i0.hdslb.com/bfs/emote/cbe798a194612958537c5282fcca7c3bcd2aa15c.png"
}, {
"text": "[热词系列_我裂开了]",
"url": "https://i0.hdslb.com/bfs/emote/29bd57ec4e8952880fea6c9e47aee924e91f10c4.png"
}, {
"text": "[热词系列_有内味了]",
"url": "https://i0.hdslb.com/bfs/emote/7ca61680a905b5b6e2e335c630e725b648b03b4d.png"
}, {
"text": "[热词系列_猛男必看]",
"url": "https://i0.hdslb.com/bfs/emote/9ca4f723194ff9f6f5745591132c1d70fae5a4a8.png"
}, {
"text": "[热词系列_奥力给]",
"url": "https://i0.hdslb.com/bfs/emote/c9b8683827ec6c00fea5327c9bec14f581cef2aa.png"
}, {
"text": "[热词系列_问号]",
"url": "https://i0.hdslb.com/bfs/emote/c1d1e76c12180adc8558f47006fe0e7ded4154bb.png"
}, {
"text": "[热词系列_我哭了]",
"url": "https://i0.hdslb.com/bfs/emote/9e0b3877d649aaf6538fbdd3f937e240a9d808e4.png"
}, {
"text": "[热词系列_高产]",
"url": "https://i0.hdslb.com/bfs/emote/9db817cba4a7f4a42398f3b2ec7c0a8e0c247c42.png"
}, {
"text": "[热词系列_不愧是你]",
"url": "https://i0.hdslb.com/bfs/emote/9ff2e356797c57ee3b1675ade0883d2d2247be9b.png"
}, {
"text": "[热词系列_真香]",
"url": "https://i0.hdslb.com/bfs/emote/e68497c775feaac1c3b1a6cd63a50cfb11b767c4.png"
}, {
"text": "[热词系列_我全都要]",
"url": "https://i0.hdslb.com/bfs/emote/d424d1ad8d14c1c9b8367842bc68c658b9229bc1.png"
}, {
"text": "[热词系列_神仙UP]",
"url": "https://i0.hdslb.com/bfs/emote/a49e0d0db1e7d35a0f7411be13208951ab448f03.png"
}, {
"text": "[热词系列_福建舰]",
"url": "https://i0.hdslb.com/bfs/emote/9713ac27523fb76904f300ba1041b92db63bb220.png"
}, {
"text": "[热词系列_锤]",
"url": "https://i0.hdslb.com/bfs/emote/35668cc12ae25b9545420e4a85bf21a0bfc03e5d.png"
}, {
"text": "[热词系列_爷关更]",
"url": "https://i0.hdslb.com/bfs/emote/faad40c56447f1f8abcb4045c17ce159d113d1fd.png"
}, {
"text": "[热词系列_我酸了]",
"url": "https://i0.hdslb.com/bfs/emote/a8cbf3f6b8cd9377eeb15b9172f3cd683b2e4650.png"
}, {
"text": "[热词系列_有生之年]",
"url": "https://i0.hdslb.com/bfs/emote/f41fdafe2d0fbb8e8bc1598d2cf37e355560103a.png"
}, {
"text": "[热词系列_镇站之宝]",
"url": "https://i0.hdslb.com/bfs/emote/24e7a6a6e6383c987215fb905e3ee070aca259b5.png"
}, {
"text": "[热词系列_我太南了]",
"url": "https://i0.hdslb.com/bfs/emote/a523f3e4c63e4db1232365765d0ec452f83be97e.png"
}, {
"text": "[热词系列_完结撒花]",
"url": "https://i0.hdslb.com/bfs/emote/ea9db62ff5bca8e069cd70c4233353a802835422.png"
}, {
"text": "[热词系列_大师球]",
"url": "https://i0.hdslb.com/bfs/emote/f30089248dd137c568edabcb07cf67e0f6e98cf3.png"
}, {
"text": "[热词系列_知识盲区]",
"url": "https://i0.hdslb.com/bfs/emote/ccc94600b321a28116081e49ecedaa4ee8728312.png"
}, {
"text": "[热词系列_“狼火”]",
"url": "https://i0.hdslb.com/bfs/emote/33ccd3617bfa89e9d1498b13b7542b63f163e5de.png"
}, {
"text": "[热词系列_你可真星]",
"url": "https://i0.hdslb.com/bfs/emote/54c8ddff400abfe388060cabfbb579280fdea1be.png"
}]
}, {
"text": "tv_小电视",
"url": "http://i0.hdslb.com/bfs/emote/f3517fc58c71236da5f0355b688ba302ae90c074.png",
"emote": [{
"text": "[tv_白眼]",
"url": "http://i0.hdslb.com/bfs/emote/c1d59f439e379ee50eef488bcb5e5378e5044ea4.png"
}, {
"text": "[tv_doge]",
"url": "http://i0.hdslb.com/bfs/emote/6ea59c827c414b4a2955fe79e0f6fd3dcd515e24.png"
}, {
"text": "[tv_坏笑]",
"url": "http://i0.hdslb.com/bfs/emote/1f0b87f731a671079842116e0991c91c2c88645a.png"
}, {
"text": "[tv_难过]",
"url": "http://i0.hdslb.com/bfs/emote/87f46748d3f142ebc6586ff58860d0e2fc8263ba.png"
}, {
"text": "[tv_生气]",
"url": "http://i0.hdslb.com/bfs/emote/26702dcafdab5e8225b43ffd23c94ac1ff932654.png"
}, {
"text": "[tv_委屈]",
"url": "http://i0.hdslb.com/bfs/emote/d04dba7b5465779e9755d2ab6f0a897b9b33bb77.png"
}, {
"text": "[tv_斜眼笑]",
"url": "http://i0.hdslb.com/bfs/emote/911f987aa8bc1bee12d52aafe62bc41ef4474e6c.png"
}, {
"text": "[tv_呆]",
"url": "http://i0.hdslb.com/bfs/emote/fe1179ebaa191569b0d31cecafe7a2cd1c951c9d.png"
}, {
"text": "[tv_发怒]",
"url": "http://i0.hdslb.com/bfs/emote/34ba3cd204d5b05fec70ce08fa9fa0dd612409ff.png"
}, {
"text": "[tv_惊吓]",
"url": "http://i0.hdslb.com/bfs/emote/0d15c7e2ee58e935adc6a7193ee042388adc22af.png"
}, {
"text": "[tv_呕吐]",
"url": "http://i0.hdslb.com/bfs/emote/9f996894a39e282ccf5e66856af49483f81870f3.png"
}, {
"text": "[tv_思考]",
"url": "http://i0.hdslb.com/bfs/emote/90cf159733e558137ed20aa04d09964436f618a1.png"
}, {
"text": "[tv_微笑]",
"url": "http://i0.hdslb.com/bfs/emote/70dc5c7b56f93eb61bddba11e28fb1d18fddcd4c.png"
}, {
"text": "[tv_疑问]",
"url": "http://i0.hdslb.com/bfs/emote/0793d949b18d7be716078349c202c15ff166f314.png"
}, {
"text": "[tv_大哭]",
"url": "http://i0.hdslb.com/bfs/emote/23269aeb35f99daee28dda129676f6e9ea87934f.png"
}, {
"text": "[tv_鼓掌]",
"url": "http://i0.hdslb.com/bfs/emote/1d21793f96ef4e6f48b23e53e3b9e42da833a0f6.png"
}, {
"text": "[tv_抠鼻]",
"url": "http://i0.hdslb.com/bfs/emote/c666f55e88d471e51bbd9fab9bb308110824a6eb.png"
}, {
"text": "[tv_亲亲]",
"url": "http://i0.hdslb.com/bfs/emote/a8111ad55953ef5e3be3327ef94eb4a39d535d06.png"
}, {
"text": "[tv_调皮]",
"url": "http://i0.hdslb.com/bfs/emote/b9c41de8e82dd7a8515ae5e3cb63e898bf245186.png"
}, {
"text": "[tv_笑哭]",
"url": "http://i0.hdslb.com/bfs/emote/1abc628f6d4f4caf9d0e7800878f4697abbc8273.png"
}, {
"text": "[tv_晕]",
"url": "http://i0.hdslb.com/bfs/emote/5443c22b4d07fb1907ccc610c8e6db254f2461b7.png"
}, {
"text": "[tv_点赞]",
"url": "http://i0.hdslb.com/bfs/emote/f85c354995bd99e28fc76c869bfe42ba6438eff4.png"
}, {
"text": "[tv_害羞]",
"url": "http://i0.hdslb.com/bfs/emote/a37683fb5642fa3ddfc7f4e5525fd13e42a2bdb1.png"
}, {
"text": "[tv_睡着]",
"url": "http://i0.hdslb.com/bfs/emote/8b196675b53af58264f383c50ad0945048290b33.png"
}, {
"text": "[tv_色]",
"url": "http://i0.hdslb.com/bfs/emote/61822c7e9aae5da76475e7892534545336b23a6f.png"
}, {
"text": "[tv_吐血]",
"url": "http://i0.hdslb.com/bfs/emote/09dd16a7aa59b77baa1155d47484409624470c77.png"
}, {
"text": "[tv_无奈]",
"url": "http://i0.hdslb.com/bfs/emote/ea8ed89ee9878f2fece2dda0ea8a5dbfe21b5751.png"
}, {
"text": "[tv_再见]",
"url": "http://i0.hdslb.com/bfs/emote/180129b8ea851044ce71caf55cc8ce44bd4a4fc8.png"
}, {
"text": "[tv_流汗]",
"url": "http://i0.hdslb.com/bfs/emote/cead1c351ab8d79e9f369605beb90148db0fbed3.png"
}, {
"text": "[tv_偷笑]",
"url": "http://i0.hdslb.com/bfs/emote/bb690d4107620f1c15cff29509db529a73aee261.png"
}, {
"text": "[tv_抓狂]",
"url": "http://i0.hdslb.com/bfs/emote/fe31c08edad661d63762b04e17b8d5ae3c71a757.png"
}, {
"text": "[tv_黑人问号]",
"url": "http://i0.hdslb.com/bfs/emote/45821a01f51bc867da9edbaa2e070410819a95b2.png"
}, {
"text": "[tv_困]",
"url": "http://i0.hdslb.com/bfs/emote/241ee304e44c0af029adceb294399391e4737ef2.png"
}, {
"text": "[tv_打脸]",
"url": "http://i0.hdslb.com/bfs/emote/56ab10b624063e966bfcb76ea5dc4794d87dfd47.png"
}, {
"text": "[tv_闭嘴]",
"url": "http://i0.hdslb.com/bfs/emote/c9e990da7f6e93975e25fd8b70e2e290aa4086ef.png"
}, {
"text": "[tv_鄙视]",
"url": "http://i0.hdslb.com/bfs/emote/6e72339f346a692a495b123174b49e4e8e781303.png"
}, {
"text": "[tv_腼腆]",
"url": "http://i0.hdslb.com/bfs/emote/89712c0d4af73e67f89e35cbc518420380a7f6f4.png"
}, {
"text": "[tv_馋]",
"url": "http://i0.hdslb.com/bfs/emote/fc7e829b845c43c623c8b490ee3602b7f0e76a31.png"
}, {
"text": "[tv_可爱]",
"url": "http://i0.hdslb.com/bfs/emote/9e55fd9b500ac4b96613539f1ce2f9499e314ed9.png"
}, {
"text": "[tv_发财]",
"url": "http://i0.hdslb.com/bfs/emote/34db290afd2963723c6eb3c4560667db7253a21a.png"
}, {
"text": "[tv_生病]",
"url": "http://i0.hdslb.com/bfs/emote/8b0ec90e6b86771092a498c54f09fc94621c1900.png"
}, {
"text": "[tv_流鼻血]",
"url": "http://i0.hdslb.com/bfs/emote/c32d39db2737f89b904ca32700d140a9241b0767.png"
}, {
"text": "[tv_尴尬]",
"url": "http://i0.hdslb.com/bfs/emote/7cfa62dafc59798a3d3fb262d421eeeff166cfa4.png"
}, {
"text": "[tv_大佬]",
"url": "http://i0.hdslb.com/bfs/emote/093c1e2c490161aca397afc45573c877cdead616.png"
}, {
"text": "[tv_流泪]",
"url": "http://i0.hdslb.com/bfs/emote/7e71cde7858f0cd50d74b0264aa26db612a8a167.png"
}, {
"text": "[tv_冷漠]",
"url": "http://i0.hdslb.com/bfs/emote/b9cbc755c2b3ee43be07ca13de84e5b699a3f101.png"
}, {
"text": "[tv_皱眉]",
"url": "http://i0.hdslb.com/bfs/emote/72ccad6679fea0d14cce648b4d818e09b8ffea2d.png"
}, {
"text": "[tv_鬼脸]",
"url": "http://i0.hdslb.com/bfs/emote/0ffbbddf8a94d124ca2f54b360bbc04feb6bbfea.png"
}, {
"text": "[tv_调侃]",
"url": "http://i0.hdslb.com/bfs/emote/4bc022533ef31544ca0d72c12c808cf4a1cce3e3.png"
}, {
"text": "[tv_目瞪口呆]",
"url": "http://i0.hdslb.com/bfs/emote/0b8cb81a68de5d5365212c99375e7ace3e7891b7.png"
}]
}, {
"text": "颜文字",
"url": "http://i0.hdslb.com/bfs/emote/07c5bb57e45270c139172f6a590349d1c5aa9eb9.png",
"emote": [{
"text": "( ゜- ゜)つロ",
"url": "( ゜- ゜)つロ"
}, {
"text": "_(:з」∠)_",
"url": "_(:з」∠)_"
}, {
"text": "(⌒▽⌒)",
"url": "(⌒▽⌒)"
}, {
"text": "( ̄▽ ̄)",
"url": "( ̄▽ ̄)"
}, {
"text": "(=・ω・=)",
"url": "(=・ω・=)"
}, {
"text": "(*°▽°*)八(*°▽°*)♪",
"url": "(*°▽°*)八(*°▽°*)♪"
}, {
"text": "✿ヽ(°▽°)ノ✿",
"url": "✿ヽ(°▽°)ノ✿"
}, {
"text": "(¦3【▓▓】",
"url": "(¦3【▓▓】"
}, {
"text": "눈_눈",
"url": "눈_눈"
}, {
"text": "(ಡωಡ)",
"url": "(ಡωಡ)"
}, {
"text": "_(≧∇≦」∠)_",
"url": "_(≧∇≦」∠)_"
}, {
"text": "━━━∑(゚□゚*川━",
"url": "━━━∑(゚□゚*川━"
}, {
"text": "(`・ω・´)",
"url": "(`・ω・´)"
}, {
"text": "( ̄3 ̄)",
"url": "( ̄3 ̄)"
}, {
"text": "✧(≖ ◡ ≖✿)",
"url": "✧(≖ ◡ ≖✿)"
}, {
"text": "(・∀・)",
"url": "(・∀・)"
}, {
"text": "(〜 ̄△ ̄)〜",
"url": "(〜 ̄△ ̄)〜"
}, {
"text": "→_→",
"url": "→_→"
}, {
"text": "(°∀°)ノ",
"url": "(°∀°)ノ"
}, {
"text": "╮( ̄▽ ̄)╭",
"url": "╮( ̄▽ ̄)╭"
}, {
"text": "( ´_ゝ)",
"url": "( ´_ゝ)"
}, {
"text": "←_←",
"url": "←_←"
}, {
"text": "(;¬_¬)",
"url": "(;¬_¬)"
}, {
"text": "(゚Д゚≡゚д゚)!?",
"url": "(゚Д゚≡゚д゚)!?"
}, {
"text": "( ´・・)ノ(._.`)",
"url": "( ´・・)ノ(._.`)"
}, {
"text": "Σ(゚д゚;)",
"url": "Σ(゚д゚;)"
}, {
"text": "Σ(  ̄□ ̄||)<",
"url": "Σ(  ̄□ ̄||)<"
}, {
"text": "(´;ω;`)",
"url": "(´;ω;`)"
}, {
"text": "/TДT)/",
"url": "/TДT)/"
}, {
"text": "(^・ω・^)",
"url": "(^・ω・^)"
}, {
"text": "(。・ω・。)",
"url": "(。・ω・。)"
}, {
"text": "(● ̄(エ) ̄●)",
"url": "(● ̄(エ) ̄●)"
}, {
"text": "ε=ε=(ノ≧∇≦)",
"url": "ε=ε=(ノ≧∇≦)"
}, {
"text": "(´・_・`)",
"url": "(´・_・`)"
}, {
"text": "(-_-#)",
"url": "(-_-#)"
}, {
"text": "( ̄へ ̄)",
"url": "( ̄へ ̄)"
}, {
"text": "( ̄ε(# ̄) Σ",
"url": "( ̄ε(# ̄) Σ"
}, {
"text": "(╯°口°)╯(┴—┴",
"url": "(╯°口°)╯(┴—┴"
}, {
"text": "ヽ(`Д´)ノ",
"url": "ヽ(`Д´)ノ"
}, {
"text": "(\"▔□▔)/",
"url": "(\"▔□▔)/"
}, {
"text": "(º﹃º )",
"url": "(º﹃º )"
}, {
"text": "(๑>؂<๑)",
"url": "(๑>؂<๑)"
}, {
"text": "。゚(゚´Д`)゚。",
"url": "。゚(゚´Д`)゚。"
}, {
"text": "(∂ω∂)",
"url": "(∂ω∂)"
}, {
"text": "(┯_┯)",
"url": "(┯_┯)"
}, {
"text": "(・ω< )★",
"url": "(・ω< )★"
}, {
"text": "( ๑ˊ•̥▵•)੭₎₎",
"url": "( ๑ˊ•̥▵•)੭₎₎"
}, {
"text": "¥ㄟ(´・ᴗ・`)ノ¥",
"url": "¥ㄟ(´・ᴗ・`)ノ¥"
}, {
"text": "Σ_(꒪ཀ꒪」∠)_",
"url": "Σ_(꒪ཀ꒪」∠)_"
}, {
"text": "٩(๛ ˘ ³˘)۶❤",
"url": "٩(๛ ˘ ³˘)۶❤"
}, {
"text": "(๑‾᷅^‾᷅๑)",
"url": "(๑‾᷅^‾᷅๑)"
}]
}, {
"text": "小电视",
"url": "http://i0.hdslb.com/bfs/emote/ce49073ff96606a1a2674b3b4ef8e15fb0a399ff.png",
"emote": [{
"text": "[小电视_笑]",
"url": "http://i0.hdslb.com/bfs/emote/f80d384875183dfe2e24be13011c595c0210d273.png"
}, {
"text": "[小电视_发愁]",
"url": "http://i0.hdslb.com/bfs/emote/05e279abbf3f72d5cc45548504a4220c5514b8b9.png"
}, {
"text": "[小电视_赞]",
"url": "http://i0.hdslb.com/bfs/emote/86ccf6d0b5480169bf80f3582fae09d7ed455c06.png"
}, {
"text": "[小电视_差评]",
"url": "http://i0.hdslb.com/bfs/emote/38456e3bde2839b00b536a8be13934fa57c8e298.png"
}, {
"text": "[小电视_嘟嘴]",
"url": "http://i0.hdslb.com/bfs/emote/6fd437f547ef1e4f231ff475d02f58bb94cef5a5.png"
}, {
"text": "[小电视_汗]",
"url": "http://i0.hdslb.com/bfs/emote/5c150cec77eae1b05d5ca46526450ff3beeb44d2.png"
}, {
"text": "[小电视_害羞]",
"url": "http://i0.hdslb.com/bfs/emote/de3aee88f7b6cc20ba9480c96c02f83a844381a9.png"
}, {
"text": "[小电视_吃惊]",
"url": "http://i0.hdslb.com/bfs/emote/05188008ea84c70d94e0076e28de15bf56f4c441.png"
}, {
"text": "[小电视_哭泣]",
"url": "http://i0.hdslb.com/bfs/emote/938bdf98df945576ae88e2a22931db07ded9e663.png"
}, {
"text": "[小电视_太太喜欢]",
"url": "http://i0.hdslb.com/bfs/emote/eb41a8c04840e4f77e76a4bff7a29ac89c432f4e.png"
}, {
"text": "[小电视_好怒啊]",
"url": "http://i0.hdslb.com/bfs/emote/68d524b7e515396b6563d320fb710c64abfb1063.png"
}, {
"text": "[小电视_困惑]",
"url": "http://i0.hdslb.com/bfs/emote/6853161f0eab3332b874ab7c6c0311035b7538f3.png"
}, {
"text": "[小电视_我好兴奋]",
"url": "http://i0.hdslb.com/bfs/emote/a695fe1301aab2675ab6f6e34757c25a863a8617.png"
}, {
"text": "[小电视_思索]",
"url": "http://i0.hdslb.com/bfs/emote/f8219e484d5a55787c3f1722dc3112d0eba03a69.png"
}, {
"text": "[小电视_无语]",
"url": "http://i0.hdslb.com/bfs/emote/fbd12affebfdaadd3d721bffdb685a6b1ee71219.png"
}]
}, {
"text": "2233娘",
"url": "http://i0.hdslb.com/bfs/emote/f52830f0c01a4dc91457be5bb2ee49b1b5692cd5.png",
"emote": [{
"text": "[2233娘_大笑]",
"url": "http://i0.hdslb.com/bfs/emote/16b8794be990cefa6caeba4d901b934a227ee3b8.png"
}, {
"text": "[2233娘_吃惊]",
"url": "http://i0.hdslb.com/bfs/emote/d1628c43d35b1530c0504a643ff80b6189fa0a43.png"
}, {
"text": "[2233娘_大哭]",
"url": "http://i0.hdslb.com/bfs/emote/476a2a60f6e337b8c0697a592e0aa82781f6b33b.png"
}, {
"text": "[2233娘_耶]",
"url": "http://i0.hdslb.com/bfs/emote/d7178e258a0efc969b65ccc2b1322fb235f5dff4.png"
}, {
"text": "[2233娘_卖萌]",
"url": "http://i0.hdslb.com/bfs/emote/ea893aa25355de95ab4f03c2dad3f0c58d0c159e.png"
}, {
"text": "[2233娘_疑问]",
"url": "http://i0.hdslb.com/bfs/emote/0b41f509351958dbb63d472fec0132d1bd03bd14.png"
}, {
"text": "[2233娘_汗]",
"url": "http://i0.hdslb.com/bfs/emote/247cd9df8cdf84b18368c21e3b2dd374e84c0927.png"
}, {
"text": "[2233娘_困惑]",
"url": "http://i0.hdslb.com/bfs/emote/714eeb4eae0d0933b4ff08b7df788b1982f6b940.png"
}, {
"text": "[2233娘_怒]",
"url": "http://i0.hdslb.com/bfs/emote/f31953119c51b9748016440ac0b632f779929b37.png"
}, {
"text": "[2233娘_委屈]",
"url": "http://i0.hdslb.com/bfs/emote/d9d0bf9d358af8d5761093ec66d4e3f60d963a63.png"
}, {
"text": "[2233娘_郁闷]",
"url": "http://i0.hdslb.com/bfs/emote/485203fe7100f2c8fc40b2800a18fe20b35f2f1a.png"
}, {
"text": "[2233娘_第一]",
"url": "http://i0.hdslb.com/bfs/emote/3754ee6e5985bd0bd7dfb668981f2a8733398ebd.png"
}, {
"text": "[2233娘_喝水]",
"url": "http://i0.hdslb.com/bfs/emote/695bf5429472049b52c1e0de586f8a2511195a23.png"
}, {
"text": "[2233娘_吐魂]",
"url": "http://i0.hdslb.com/bfs/emote/e999af499edf38a91ca68b1a9d2f97042c1d6734.png"
}, {
"text": "[2233娘_无言]",
"url": "http://i0.hdslb.com/bfs/emote/fdb5870f32cfaf7949e0f88a13f6feba4a48b719.png"
}]
}]

@ -0,0 +1,352 @@
<template>
<section class="main">
<div class="container">
<div class="drag-box">
<div class="drag-box-item" ref="drag_box_item_pictures">
<div class="item-title">{{point=='pt'?'图片':'视频'}}</div>
<draggable
:list="list"
class="list-group"
draggable=".drag-item"
@start="dragging = true"
@end="dragging = false"
>
<div class="drag-item" v-for="item in list" :key="item.src">
<video v-if="point=='av'?true:false" class='drag-object' :src="item.src" onerror="this.src = 'https://ae01.alicdn.com/kf/Hb6aba101d8ff4d17a7d0c5d7e349690dB.gif';this.onerror=null;"></video>
<el-image v-if="point=='pt'?true:false"
:class="'drag-object'"
fit="cover"
:src="item.src"
:data-src="item.src"
:preview-src-list="[item.src]">
</el-image>
<!-- <img class="drag-object" :data-src="item.src" src="https://ae01.alicdn.com/kf/He2ac615faca74f3fba82050b09d2c36ch.gif" onerror="this.src = 'https://ae01.alicdn.com/kf/Hb6aba101d8ff4d17a7d0c5d7e349690dB.gif';this.onerror=null;" alt=""> -->
<div class="drag-delete-button" @click="removeItem(item)">x</div>
<el-input class="drag-object-text" v-model="item.text" placeholder="添加描述.."></el-input>
</div>
<div class="drag-add">
<svg @click.stop.right="v_if.addItemsVisible = true" @click="v_if.uploadVisible = true" t="1564625226383" class="drag-object" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1980" width="200" height="200"><path d="M915.746268 0h-807.911811C48.273134 0 0 48.482772 0 107.834457v807.911811c0 59.561323 48.482772 107.834457 107.834457 107.834456h807.911811c59.561323 0 107.834457-48.482772 107.834456-107.834456v-807.911811c0-59.343622-48.482772-107.834457-107.834456-107.834457z m56.634456 915.746268c0 31.139276-25.495181 56.634457-56.634456 56.634456h-807.911811c-31.139276 0-56.634457-25.495181-56.634457-56.634456v-807.911811c0-31.139276 25.495181-56.634457 56.634457-56.634457h807.911811c31.139276 0 56.634457 25.495181 56.634456 56.634457v807.911811z m-267.288189-429.451087H537.293606V318.488189a25.688693 25.688693 0 0 0-25.704819-25.704819A25.688693 25.688693 0 0 0 485.875906 318.488189v167.806992H318.068913c-14.215055 0-25.704819 11.497827-25.704819 25.495181a25.688693 25.688693 0 0 0 25.704819 25.704819H485.875906v167.806992a25.688693 25.688693 0 0 0 25.704818 25.704819 25.688693 25.688693 0 0 0 25.704819-25.704819V537.495181H705.108661a25.688693 25.688693 0 0 0 25.704819-25.704819c0-14.206992-11.497827-25.495181-25.704819-25.495181z" fill="#1296db" p-id="1981"></path></svg>
</div>
</draggable>
</div>
</div>
</div>
<el-dialog title="选择文件" :append-to-body="true" v-dialogDrag center :visible.sync="v_if.uploadVisible" width="80%">
<el-upload
list-type="picture-card"
multiple
ref="upload"
:action="$constant.qiniuUrl"
:data="qiniuParam"
:file-list="data.fileList"
:on-change="handleChange"
:before-upload="beforeUpload"
:on-success="handleSuccess"
:auto-upload = "false">
<i class="el-icon-plus"></i>
</el-upload>
<el-button type="primary" @click="commitFileList();"> </el-button>
</el-dialog>
<el-dialog title="输入链接(*,*)" :append-to-body="true" v-dialogDrag center :visible.sync="v_if.addItemsVisible" width="50%">
<el-input v-model="data.addSrcItems" @change="addSrcItems(data.addSrcItems)"></el-input>
</el-dialog>
</section>
</template>
<script>
// import bus from '../common/bus';
import draggable from 'vuedraggable'
// import lazyload from '../../utils/lazyload.js';
export default {
name: 'draglist',
props: {
isEdit:{
type: Boolean,
default: true
},
object:{
},
point:{
type: String,
default: 'pt'
},
isAdmin: {
type: Boolean,
default: false
},
prefix: {
type: String,
default: ""
},
maxSize: {
type: Number,
default: 5
},
maxNumber: {
type: Number,
default: 5
}
},
watch: {
// variable
isEdit(newVal, oldVal){
if(newVal){
return;
}
this.$emit("addPicture", this.returnObject());
}
},
data() {
return {
dragOptions:{
animation: 120,
scroll: true,
group: 'sortlist',
ghostClass: 'ghost-style'
},
list:new Array(),
data:{
addSrcItems:"",
fileList:[]
},
isClosed:!this.isEdit,
v_if:{
uploadVisible:false,
addItemsVisible:false,
},
qiniuParam: {
token: "",
key: ""
},
dragging:true,
cos:null,
}
},
components:{
draggable
},
created() {
if ((!this.isAdmin && !this.$common.isEmpty(this.$store.state.currentUser)) || (this.isAdmin && !this.$common.isEmpty(this.$store.state.currentAdmin))) {
this.getUpToken();
}
},
mounted(){
let list = new Array()
this.object = JSON.parse(this.object);
this.object?(this.object[0].forEach((element,index) => {
list.push({src:element,text:this.object[1][index]})
}),this.list = list):(this.list=new Array());
},
methods: {
getUpToken() {
this.$http.get(this.$constant.baseURL + "/qiniu/getUpToken", {}, this.isAdmin)
.then((res) => {
if (!this.$common.isEmpty(res.data)) {
this.qiniuParam.token = res.data;
}
})
.catch((error) => {
this.$message({
message: error.message,
type: "error"
});
});
},
handleSuccess(response, file, fileList) {
console.log(response);
this.qiniuParam.key = "";
let url = this.$constant.qiniuDownload + response.key;
this.list.push({src:url,text:""});
this.$common.saveResource(this, this.prefix, url, this.isAdmin);
},
handleChange(file, fileList) {
let flag = false;
// if (!/image\/\w+/.test(file.type)) {
// this.$message({
// message: "",
// type: "warning"
// });
// flag = true;
// }
if (file.size > this.maxSize * 1024 * 1024) {
this.$message({
message: "图片最大为" + this.maxSize + "M",
type: "warning"
});
flag = true;
}
if (flag) {
fileList.splice(fileList.size - 1, 1);
}
},
beforeUpload(file) {
if (this.$common.isEmpty(this.qiniuParam.token)) {
this.$message({
message: "上传出错!",
type: "warning"
});
return false;
}
this.qiniuParam.key = this.prefix + "/" + (!this.$common.isEmpty(this.$store.state.currentUser.username) ? (this.$store.state.currentUser.username.replace(/[^a-zA-Z]/g, '') + this.$store.state.currentUser.id) : (this.$store.state.currentAdmin.username.replace(/[^a-zA-Z]/g, '') + this.$store.state.currentAdmin.id)) + new Date().getTime() + Math.floor(Math.random() * 1000);
},
removeItem(item){
let index = this.list.indexOf(item);
if(index==-1) return;
this.list.splice(index,1);
},
returnObject(){
let pics = new Array();let texts = new Array();
this.list.forEach(element => {
pics.push(element.src);
texts.push(element.text);
});
return JSON.stringify([pics,texts]);
},
commitFileList(){
this.$confirm('将上传文件?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
let that = this;
this.$refs.upload.submit();
}).catch((e) => {
this.$message.error(e);
});
},
addSrcItems(items){
items.split(",").forEach(element => {
this.list.push({src:element,text:""});
});
this.data.addSrcItems = "";
},
}
}
</script>
<style scoped>
section.main .container{
padding: 0px;
}
.drag-box{
display: flex;
user-select: none;
}
.drag-box-item {
flex: 1;
background-color: #eff1f5;
border-radius: 6px;
border: 1px #e1e4e8 solid;
max-height:80vh;
overflow-y: scroll;
}
.drag-box-item::-webkit-scrollbar{
display: none;
}
.item-title{
padding: 8px 8px 8px 12px;
font-size: 14px;
line-height: 1.5;
color: #24292e;
font-weight: 600;
}
.drag-item{
display: inline-block;
position: relative;
border: 1px #e1e4e8 solid;
padding: 5px;
margin: 5px 8px;
list-style: none;
border: 1px solid #209eff3d;
border-radius: 6px;
cursor: pointer;
-webkit-transition: border .3s ease-in;
transition: border .3s ease-in;
width: 160px;
box-sizing: content-box;
}
.drag-add{
display: inline-block;
position: relative;
padding: 5px;
margin: 20px 10px;
list-style: none;
-webkit-transition: border .3s ease-in;
transition: border .3s ease-in;
width: 160px;
height:100px;
}
.drag-add svg{
height:50% !important;
width:50% !important;
position: absolute;
left:50%;
top:50%;
transform: translate(-50%,-50%);
}
.drag-add:hover svg path{
fill:#d4237a;
transition: .5s;
}
.drag-add path{
transition:0.3s ;
cursor:pointer;
transition: .5s;
}
.drag-object-text{
margin-top: 5px;
}
.drag-object {
object-fit: cover;
width: 160px;
height:100px;
display: block;
}
.drag-item .drag-delete-button{
content: "×";
width: 32px;
height: 32px;
position: absolute;
right: 0px;
top: 0px;
z-index: 10;
text-align: center;
border-radius: 50%;
line-height: 32px;
font-size: 1.5em;
color: #eee;
-webkit-transition: .3s ease-in;
transition: .3s ease-in;
transform: translate(50%,-40%);
background: #209eff3d;
opacity: 0;
pointer-events: all;
cursor: pointer;
}
.drag-item:hover .drag-delete-button{
-webkit-transition: .3s ease-in;
transition: .3s ease-in;
background: #20a0ff;
opacity: 1;
}
.drag-item:hover {
border: 1px solid #20a0ff;
}
.drag-title {
font-weight: 400;
line-height: 25px;
margin: 10px 0;
font-size: 22px;
color: #1f2f3d;
}
.ghost-style{
display: block;
color: transparent;
border-style: dashed
}
</style>

@ -60,6 +60,11 @@
icon: "el-icon-postcard",
index: "/postList",
title: "文章管理"
},
{
icon: "el-icon-postcard",
index: "/postShuoshuo",
title: "动态管理"
}, {
icon: "el-icon-notebook-2",
index: "/sortList",

@ -0,0 +1,349 @@
<template>
<div>
<el-tag effect="dark" class="my-tag">
<svg viewBox="0 0 1024 1024" width="20" height="20" style="vertical-align: -3px;">
<path d="M0 0h1024v1024H0V0z" fill="#202425" opacity=".01"></path>
<path
d="M682.666667 204.8h238.933333a34.133333 34.133333 0 0 1 34.133333 34.133333v648.533334a68.266667 68.266667 0 0 1-68.266666 68.266666h-204.8V204.8z"
fill="#FFAA44"></path>
<path
d="M68.266667 921.6a34.133333 34.133333 0 0 0 34.133333 34.133333h785.066667a68.266667 68.266667 0 0 1-68.266667-68.266666V102.4a34.133333 34.133333 0 0 0-34.133333-34.133333H102.4a34.133333 34.133333 0 0 0-34.133333 34.133333v819.2z"
fill="#11AA66"></path>
<path
d="M238.933333 307.2a34.133333 34.133333 0 0 0 0 68.266667h136.533334a34.133333 34.133333 0 1 0 0-68.266667H238.933333z m0 204.8a34.133333 34.133333 0 1 0 0 68.266667h409.6a34.133333 34.133333 0 1 0 0-68.266667H238.933333z m0 204.8a34.133333 34.133333 0 1 0 0 68.266667h204.8a34.133333 34.133333 0 1 0 0-68.266667H238.933333z"
fill="#FFFFFF"></path>
</svg>
文章信息
</el-tag>
<el-form :model="article" :rules="rules" ref="ruleForm" label-width="150px"
class="demo-ruleForm">
<el-form-item label="标题" prop="articleTitle">
<el-input v-model="article.articleTitle"></el-input>
</el-form-item>
<el-form-item label="心情" prop="articleEmotion">
<el-input v-model="article.articleEmotion"></el-input>
</el-form-item>
<el-form-item label="地点" prop="articleAddress">
<el-input v-model="article.articleAddress"></el-input>
</el-form-item>
<el-form-item label="内容" prop="articleContent">
<mavon-editor ref="md" @imgAdd="imgAdd" v-model="article.articleContent"/>
</el-form-item>
<el-form-item label="是否启用评论" prop="commentStatus">
<el-tag :type="article.commentStatus === false ? 'danger' : 'success'"
disable-transitions>
{{article.commentStatus === false ? '否' : '是'}}
</el-tag>
<el-switch v-model="article.commentStatus"></el-switch>
</el-form-item>
<el-form-item label="是否推荐" prop="recommendStatus">
<el-tag :type="article.recommendStatus === false ? 'danger' : 'success'"
disable-transitions>
{{article.recommendStatus === false ? '否' : '是'}}
</el-tag>
<el-switch v-model="article.recommendStatus"></el-switch>
</el-form-item>
<el-form-item label="是否可见" prop="viewStatus">
<el-tag :type="article.viewStatus === false ? 'danger' : 'success'"
disable-transitions>
{{article.viewStatus === false ? '否' : '是'}}
</el-tag>
<el-switch v-model="article.viewStatus"></el-switch>
</el-form-item>
<el-form-item label="配图" >
<el-button @click="visable.editPicture=true"></el-button>
<div style="display: flex">
<el-input v-model="article.articleCover"></el-input>
</div>
</el-form-item>
<el-dialog title="配图" :visible.sync="visable.editPicture" fullscreen>
<ObjectList @addPicture="addArticleCover" :point="'pt'" :isEdit="visable.editPicture" :prefix="`log-upload/${new Date().getFullYear()}/${new Date().getMonth()+1}`" :isAdmin="true" :maxSize="5" :maxNumber="16" :object="article.articleCover"></ObjectList>
</el-dialog>
<el-form-item v-if="article.viewStatus === false" label="不可见时的访问密码" prop="password">
<el-input v-model="article.password"></el-input>
</el-form-item>
<el-form-item label="分类" prop="sortId">
<el-select v-model="article.sortId" placeholder="请选择分类">
<el-option
v-for="item in sorts"
:key="item.id"
:label="item.sortName"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="标签" prop="labelId">
<el-select v-model="article.labelId" placeholder="请选择标签">
<el-option
v-for="item in labelsTemp"
:key="item.id"
:label="item.labelName"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
</el-form>
<div class="myCenter" style="margin-bottom: 22px">
<el-button type="primary" @click="submitForm('ruleForm')"></el-button>
<el-button type="danger" @click="resetForm('ruleForm')"></el-button>
</div>
</div>
</template>
<script>
const uploadPicture = () => import( "../common/uploadPicture");
const ObjectList = () => import( "./ObjectList");
export default {
components: {
// uploadPicture,
ObjectList
},
data() {
return {
id: this.$route.query.id,
token: "",
visable:{editPicture:false},
article: {
articleTitle: "",
articleContent: "",
articleAddress:"",
commentStatus: true,
recommendStatus: false,
viewStatus: true,
password: "",
articleCover: "",
sortId: null,
labelId: null
},
sorts: [],
labels: [],
labelsTemp: [],
rules: {
articleTitle: [
{required: true, message: '请输入标题', trigger: 'change'}
],
articleContent: [
{required: true, message: '请输入内容', trigger: 'change'}
],
commentStatus: [
{required: true, message: '是否启用评论', trigger: 'change'}
],
recommendStatus: [
{required: true, message: '是否推荐', trigger: 'change'}
],
viewStatus: [
{required: true, message: '是否可见', trigger: 'change'}
],
articleCover: [
{required: true, message: '封面', trigger: 'change'}
],
sortId: [
{required: true, message: '分类', trigger: 'change'}
],
labelId: [
{required: true, message: '标签', trigger: 'blur'}
]
}
}
},
computed: {},
watch: {
'article.sortId'(newVal, oldVal) {
if (oldVal !== null) {
this.article.labelId = null;
}
if (!this.$common.isEmpty(newVal) && !this.$common.isEmpty(this.labels)) {
this.labelsTemp = this.labels.filter(l => l.sortId === newVal);
}
}
},
created() {
this.getSortAndLabel();
this.getUpToken();
this.article.articleAddress = returnCitySN.cname;
},
mounted() {
},
methods: {
getUpToken() {
this.$http.get(this.$constant.baseURL + "/qiniu/getUpToken", {}, true)
.then((res) => {
if (!this.$common.isEmpty(res.data)) {
this.token = res.data;
}
})
.catch((error) => {
this.$message({
message: error.message,
type: "error"
});
});
},
imgAdd(pos, file) {
if (this.$common.isEmpty(this.token)) {
this.$message({
message: "上传出错!",
type: "warning"
});
return;
}
let fd = new FormData();
fd.append("file", file);
fd.append("token", this.token);
fd.append("key", "articlePicture" + "/" + this.$store.state.currentAdmin.username.replace(/[^a-zA-Z]/g, '') + this.$store.state.currentAdmin.id + new Date().getTime());
this.$http.uploadQiniu(this.$constant.qiniuUrl, fd)
.then((res) => {
if (!this.$common.isEmpty(res.key)) {
let url = this.$constant.qiniuDownload + res.key;
this.$common.saveResource(this, "articlePicture", url, true);
this.$refs.md.$img2Url(pos, url);
}
})
.catch((error) => {
this.$message({
message: error.message,
type: "error"
});
});
},
addArticleCover(res) {
console.log(res);
this.article.articleCover = res;
},
getSortAndLabel() {
this.$http.get(this.$constant.baseURL + "/webInfo/listSortAndLabel")
.then((res) => {
if (!this.$common.isEmpty(res.data)) {
this.sorts = res.data.sorts;
this.labels = res.data.labels;
if (!this.$common.isEmpty(this.id)) {
this.getArticle();
}
}
})
.catch((error) => {
this.$message({
message: error.message,
type: "error"
});
});
},
getArticle() {
this.$http.get(this.$constant.baseURL + "/admin/diary/getArticleById", {id: this.id}, true)
.then((res) => {
if (!this.$common.isEmpty(res.data)) {
this.article = res.data;
this.article.articleCover = this.article.articleItems;
}
})
.catch((error) => {
this.$message({
message: error.message,
type: "error"
});
});
},
submitForm(formName) {
let md = navigator.userAgent.match(/\((.+?)\)/g)[0];
this.article.articleDevice = md?md:'个人主机';
if (this.article.viewStatus === false && this.$common.isEmpty(this.article.password)) {
this.$message({
message: "文章不可见时必须输入密码!",
type: "error"
});
return;
}
this.$refs[formName].validate((valid) => {
if (valid) {
if (this.$common.isEmpty(this.id)) {
this.saveArticle(this.article, "/diary/saveArticle")
} else {
this.article.id = this.id;
this.saveArticle(this.article, "/diary/updateArticle")
}
} else {
this.$message({
message: "请完善必填项!",
type: "error"
});
}
});
},
resetForm(formName) {
this.$refs[formName].resetFields();
if (!this.$common.isEmpty(this.id)) {
this.getArticle();
}
},
saveArticle(value, url) {
this.$confirm('确认保存?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'success',
center: true
}).then(() => {
this.$http.post(this.$constant.baseURL + url, value, true)
.then((res) => {
this.$message({
message: "保存成功!",
type: "success"
});
this.$router.push({path: '/postList'});
})
.catch((error) => {
this.$message({
message: error.message,
type: "error"
});
});
}).catch(() => {
this.$message({
type: 'success',
message: '已取消保存!'
});
});
}
}
}
</script>
<style scoped>
.my-tag {
margin-bottom: 20px;
width: 100%;
text-align: left;
background: var(--lightYellow);
border: none;
height: 40px;
line-height: 40px;
font-size: 16px;
color: var(--black);
}
.table-td-thumb {
border-radius: 2px;
width: 40px;
height: 40px;
}
.el-switch {
margin-left: 10px;
}
.el-form-item {
margin-bottom: 40px;
}
</style>

@ -126,7 +126,8 @@
</div>
<!-- 文章内容 -->
<div v-html="articleContentHtml" class="entry-content"></div>
<div v-html="articleContentHtml" ref="articleContent" class="entry-content"></div>
<!-- v-viewer.rebuild="{inline: false}" -->
<!-- 最后更新时间 -->
<div class="article-update-time">
<span>文章最后更新于 {{ article.updateTime }}</span>
@ -191,6 +192,7 @@
const comment = () => import( "./comment/comment");
const process = () => import( "./common/process");
const commentBox = () => import( "./comment/commentBox");
import {navigation} from '../utils/tools.js'
import MarkdownIt from 'markdown-it';
export default {
@ -203,6 +205,7 @@
data() {
return {
dynamicGallery:null,
id: this.$route.query.id,
article: {},
articleContentHtml: "",
@ -215,7 +218,8 @@
this.getArticle();
},
mounted() {
// window.addEventListener("scroll", this.onScrollPage);
this.$store.commit("changePlaylist", 489085857)
// window.addEventListener("scroll", this.onScrollPage)
},
methods: {
deleteTreeHole(id) {
@ -329,6 +333,55 @@
});
}
},
/**
* 描点功能
*/
checkAnchor(){
this.$nextTick(()=>{
$(this.$refs.articleContent).find("a").toArray().forEach((item)=>{
let anchor = item.href;
if(anchor.indexOf("#SECTION")!=-1){
item.onclick=function(e){
navigation(anchor.substring(anchor.indexOf("#SECTION"),anchor.length))
};
item.href="javascript:void(0);";
} else {
item.target = "_blank";
}
});
})
},
checkImage(){
this.$nextTick(()=>{
let images = $(this.$refs.articleContent).find("img").toArray()
this.dynamicGallery?.destroy()
if (images.length > 0) {
this.dynamicGallery = lightGallery(document.createElement("div"), {
mobileSettings: {
controls: false,
showCloseIcon: true,
download: false,
},
dynamic: true,
thumbnail: true,
controls: false,
plugins: [lgZoom, lgThumbnail, lgRotate, lgAutoplay, lgFullscreen],
dynamicEl: images.map((obj) => {
return {
src: obj.src,
thumb: obj.thumb ? obj.thumb : obj.src,
subHtml: `<h4>${obj.alt}</h4>`,
}
}),
})
}
images.forEach(element => {
element.onclick = ()=>{
this.dynamicGallery.openGallery(images.indexOf((element)));
}
});
})
},
addId() {
let headings = $(".entry-content").find("h1, h2, h3, h4, h5, h6");
headings.attr('id', (i, id) => id || 'toc-' + i);
@ -339,11 +392,16 @@
if (!this.$common.isEmpty(res.data)) {
this.article = res.data;
this.getNews();
const md = new MarkdownIt({breaks: true});
const md = new MarkdownIt({breaks: true,html:true,linkify:true,typographer:true});
this.articleContentHtml = this.article.articleContent;
this.articleContentHtml = md.render(this.article.articleContent);
console.log(this.articleContentHtml);
this.$nextTick(() => {
document.title = this.article.articleTitle
this.highlight();
this.addId();
this.checkAnchor();
this.checkImage();
// todo toc
// this.getTocbot();
});
@ -445,6 +503,7 @@
bottom: 15px;
left: 20%;
color: var(--white);
text-shadow: 1px 1px 5px #00000088;
}
.article-info-news {

@ -135,7 +135,7 @@
<path
d="M675.2256 491.4688c-82.176 0-149.0432-66.8672-149.0432-149.0432s66.8672-149.0432 149.0432-149.0432 149.0432 66.8672 149.0432 149.0432-66.8672 149.0432-149.0432 149.0432z m0-192.2048c-23.808 0-43.2128 19.3536-43.2128 43.2128 0 23.808 19.3536 43.2128 43.2128 43.2128 23.808 0 43.2128-19.3536 43.2128-43.2128s-19.4048-43.2128-43.2128-43.2128z"
fill="#FFE37B"></path>
</svg> {{ article.label.labelName }}
</svg> {{article.label?article.label.labelName:"" }}
</span>
</div>
</div>

@ -0,0 +1,421 @@
<template>
<div ref="bangumiView">
<loader :loading="false">
<summary-card :class="{show:vif.isHover}" :fitem="hover_item" :style="summary_card_style"></summary-card>
<template >
<!-- 首页图片 -->
<el-image style="animation: header-effect 2s"
class="background-image"
v-once
:src="$constant.background.bangumi"
fit="cover">
<div slot="error" class="image-slot background-image-error"></div>
</el-image>
<!-- 首页文字 -->
<div class="signature-wall myCenter my-animation-hideToShow">
<h1 class="playful">
<span v-for="(a, index) in '🎇分享追番列表🎇'" :key="index">{{a}}</span>
</h1>
<div class="printer" @click="getGuShi()">
<printer :printerInfo="printerInfo">
<template slot="paper" slot-scope="scope">
<h3>
{{ scope.content }}<span class="cursor">|</span>
</h3>
</template>
</printer>
</div>
<div id="bannerWave1"></div>
<div id="bannerWave2"></div>
<i class="el-icon-arrow-down" @click="navigation('.page-container-wrap')"></i>
</div>
<!-- 首页内容 -->
<div class="page-container-wrap">
<div class="page-container">
<div class = "bv_container" >
<div class="bv_font">🎃我的追番追剧🎃</div>
<div class = "bv_block">
<anime @mouseout.native="vif.isHover=false" @mouseover.native="ihover($event,item)" v-for="(item,index) of list" :key="index" :fitem="item"></anime>
</div>
<!-- <div class="pageBlock"><li v-for="index of Math.ceil(anime.total / anime.limit)" :class="{pageBlock_selcted:pageIndex==index}" @click="getAnime(index,24)" :key="'page1'+index">{{index}}</li></div> -->
</div>
</div>
<!-- <div class="pagination-wrap">
<div @click="pageArticles()" class="pagination" v-if="pagination.total !== articles.length">
下一页
</div>
<div v-else style="user-select: none">
~~到底啦~~
</div>
</div> -->
<!-- <el-pagination
layout="total, sizes,prev,pager,next,jumper"
:page-size="pagination.size"
:total="pagination.total"
:current-page.sync="pagination.current"
@current-change="getAnime(pagination.current,24)"
@size-change="SizeChange"
/> -->
</div>
<!-- 页脚 -->
<div style="background: var(--background)">
<myFooter></myFooter>
</div>
</template>
</loader>
</div>
</template>
<script>
import anime from '../components/common/anime.vue'
// import game from '../card/game.vue'
const summaryCard = () => import( "./common/summary");
const printer = () => import( "./common/printer");
const myFooter = () => import( "./common/myFooter");
import {getShow,bangu_getCollection,bangu_getCollections} from '../utils/api.js'
import {navigation} from '../utils/tools.js'
export default {
components:{
anime,
myFooter,
printer,
"summary-card":summaryCard
},
name: 'MyAnime',
data () {
return {
loading: false,
showAside: true,
printerInfo: "观众眼中的热爱最为炽热",
pagination: {
current: 1,
size: 10,
total: 0,
searchKey: ""
},
guShi: {
"content": "观众眼中的热爱最为炽热.",
"origin": "",
"author": "",
"category": ""
},
summary_card_style:{}, //hover
hover_item:{subject:{}},
vif:{bangumiTv:true,isHover:false},
list:[],
flag:true,
anime:{data:[],total:42,limit:24,pageIndex:1},
pageIndex:1,
loadtips:"Loading...",
}
},
mounted(){
this.$store.commit("changePlaylist", 436692330);
let thi = this;
let timer;
this.getAnime(1,24);
this.$nextTick(()=>{
document.onscroll = function(e){
if(!thi.$refs.bangumiView) return
let now = document.body.scrollTop || document.documentElement.scrollTop;
let clientHeight = window.screen.height;
let scrollHeight = document.body.scrollHeight;
console.log(now,scrollHeight-clientHeight);
if(now>=(scrollHeight-clientHeight-200)&&thi.flag){
thi.pageIndex += 1;
thi.getAnime(thi.pageIndex,24);
}
};
});
},
created(){
},
methods:{
navigation(target){
navigation(target);
},
getAnime(pageIndex,num){
let that = this;
this.flag = false;
if(pageIndex-1>Math.ceil(this.anime.total / this.anime.limit)){ return;}
bangu_getCollection({subject_type:2,limit:num,offset:(pageIndex-1)*num},function(data){
console.log(data);
that.list.push(...data.data);
that.flag = true;
});
},
ihover(e,item){
this.vif.isHover = true;
this.hover_item = item;
let offset = e.currentTarget.getBoundingClientRect();
if(offset.x > window.screen.width/2) {
this.summary_card_style.left = offset.x-240 + "px";
} else {
this.summary_card_style.left = offset.x + offset.width + "px";
}
this.summary_card_style.top = offset.y + "px";
},
ifout(e){
console.log(e);
}
},
}
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
.signature-wall {
/* 向下排列 */
display: flex;
flex-direction: column;
position: relative;
user-select: none;
height: 100vh;
overflow: hidden;
}
.playful {
color: var(--white);
font-size: 40px;
}
/*.playful span {*/
/* position: relative;*/
/* color: #5362f6;*/
/* text-shadow: 0.25px 0.25px #e485f8, 0.5px 0.5px #e485f8, 0.75px 0.75px #e485f8,*/
/* 1px 1px #e485f8, 1.25px 1.25px #e485f8, 1.5px 1.5px #e485f8, 1.75px 1.75px #e485f8,*/
/* 2px 2px #e485f8, 2.25px 2.25px #e485f8, 2.5px 2.5px #e485f8, 2.75px 2.75px #e485f8,*/
/* 3px 3px #e485f8, 3.25px 3.25px #e485f8, 3.5px 3.5px #e485f8, 3.75px 3.75px #e485f8,*/
/* 4px 4px #e485f8, 4.25px 4.25px #e485f8, 4.5px 4.5px #e485f8, 4.75px 4.75px #e485f8,*/
/* 5px 5px #e485f8, 5.25px 5.25px #e485f8, 5.5px 5.5px #e485f8, 5.75px 5.75px #e485f8,*/
/* 6px 6px #e485f8;*/
/* animation: scatter 1.75s infinite;*/
/* font-weight: normal;*/
/*}*/
/*.playful span:nth-child(2n) {*/
/* color: #ed625c;*/
/* text-shadow: 0.25px 0.25px #f2a063, 0.5px 0.5px #f2a063, 0.75px 0.75px #f2a063,*/
/* 1px 1px #f2a063, 1.25px 1.25px #f2a063, 1.5px 1.5px #f2a063, 1.75px 1.75px #f2a063,*/
/* 2px 2px #f2a063, 2.25px 2.25px #f2a063, 2.5px 2.5px #f2a063, 2.75px 2.75px #f2a063,*/
/* 3px 3px #f2a063, 3.25px 3.25px #f2a063, 3.5px 3.5px #f2a063, 3.75px 3.75px #f2a063,*/
/* 4px 4px #f2a063, 4.25px 4.25px #f2a063, 4.5px 4.5px #f2a063, 4.75px 4.75px #f2a063,*/
/* 5px 5px #f2a063, 5.25px 5.25px #f2a063, 5.5px 5.5px #f2a063, 5.75px 5.75px #f2a063,*/
/* 6px 6px #f2a063;*/
/* animation-delay: 0.3s;*/
/*}*/
/*.playful span:nth-child(3n) {*/
/* color: #ffd913;*/
/* text-shadow: 0.25px 0.25px #6ec0a9, 0.5px 0.5px #6ec0a9, 0.75px 0.75px #6ec0a9,*/
/* 1px 1px #6ec0a9, 1.25px 1.25px #6ec0a9, 1.5px 1.5px #6ec0a9, 1.75px 1.75px #6ec0a9,*/
/* 2px 2px #6ec0a9, 2.25px 2.25px #6ec0a9, 2.5px 2.5px #6ec0a9, 2.75px 2.75px #6ec0a9,*/
/* 3px 3px #6ec0a9, 3.25px 3.25px #6ec0a9, 3.5px 3.5px #6ec0a9, 3.75px 3.75px #6ec0a9,*/
/* 4px 4px #6ec0a9, 4.25px 4.25px #6ec0a9, 4.5px 4.5px #6ec0a9, 4.75px 4.75px #6ec0a9,*/
/* 5px 5px #6ec0a9, 5.25px 5.25px #6ec0a9, 5.5px 5.5px #6ec0a9, 5.75px 5.75px #6ec0a9,*/
/* 6px 6px #6ec0a9;*/
/* animation-delay: 0.15s;*/
/*}*/
/*.playful span:nth-child(5n) {*/
/* color: #555bff;*/
/* text-shadow: 0.25px 0.25px #e485f8, 0.5px 0.5px #e485f8, 0.75px 0.75px #e485f8,*/
/* 1px 1px #e485f8, 1.25px 1.25px #e485f8, 1.5px 1.5px #e485f8, 1.75px 1.75px #e485f8,*/
/* 2px 2px #e485f8, 2.25px 2.25px #e485f8, 2.5px 2.5px #e485f8, 2.75px 2.75px #e485f8,*/
/* 3px 3px #e485f8, 3.25px 3.25px #e485f8, 3.5px 3.5px #e485f8, 3.75px 3.75px #e485f8,*/
/* 4px 4px #e485f8, 4.25px 4.25px #e485f8, 4.5px 4.5px #e485f8, 4.75px 4.75px #e485f8,*/
/* 5px 5px #e485f8, 5.25px 5.25px #e485f8, 5.5px 5.5px #e485f8, 5.75px 5.75px #e485f8,*/
/* 6px 6px #e485f8;*/
/* animation-delay: 0.4s;*/
/*}*/
/*.playful span:nth-child(7n) {*/
/* color: #ff9c55;*/
/* text-shadow: 0.25px 0.25px #ff5555, 0.5px 0.5px #ff5555, 0.75px 0.75px #ff5555,*/
/* 1px 1px #ff5555, 1.25px 1.25px #ff5555, 1.5px 1.5px #ff5555, 1.75px 1.75px #ff5555,*/
/* 2px 2px #ff5555, 2.25px 2.25px #ff5555, 2.5px 2.5px #ff5555, 2.75px 2.75px #ff5555,*/
/* 3px 3px #ff5555, 3.25px 3.25px #ff5555, 3.5px 3.5px #ff5555, 3.75px 3.75px #ff5555,*/
/* 4px 4px #ff5555, 4.25px 4.25px #ff5555, 4.5px 4.5px #ff5555, 4.75px 4.75px #ff5555,*/
/* 5px 5px #ff5555, 5.25px 5.25px #ff5555, 5.5px 5.5px #ff5555, 5.75px 5.75px #ff5555,*/
/* 6px 6px #ff5555;*/
/* animation-delay: 0.25s;*/
/*}*/
.printer {
cursor: pointer;
color: var(--white);
background: var(--translucent);
border-radius: 10px;
padding-left: 10px;
padding-right: 10px;
}
#bannerWave1 {
height: 84px;
background: var(--bannerWave1);
position: absolute;
width: 200%;
bottom: 0;
z-index: 10;
animation: gradientBG 120s linear infinite;
}
#bannerWave2 {
height: 100px;
background: var(--bannerWave2);
position: absolute;
width: 400%;
bottom: 0;
z-index: 5;
animation: gradientBG 120s linear infinite;
}
/* 光标 */
.cursor {
margin-left: 1px;
animation: hideToShow 0.7s infinite;
font-weight: 200;
}
.el-icon-arrow-down {
font-size: 40px;
font-weight: bold;
color: var(--white);
position: absolute;
bottom: 60px;
animation: my-shake 1.5s ease-out infinite;
z-index: 15;
cursor: pointer;
}
.page-container-wrap {
background: var(--background);
position: relative;
min-height: 100vh;
}
.page-container {
display: flex;
justify-content: center;
width: 90%;
padding: 0 0 40px 0;
margin: 0 auto;
flex-direction: row;
}
.pagination-wrap {
display: flex;
justify-content: center;
margin-top: 40px;
}
.pagination {
padding: 13px 15px;
border: 1px solid var(--lightGray);
border-radius: 3rem;
color: var(--greyFont);
width: 100px;
user-select: none;
cursor: pointer;
text-align: center;
}
.pagination:hover {
border: 1px solid var(--themeBackground);
color: var(--themeBackground);
box-shadow: 0 0 5px var(--themeBackground);
}
@media screen and (max-width: 1100px) {
.recent-posts {
width: 100%;
}
.page-container {
width: 100%;
}
}
@media screen and (max-width: 1000px) {
.page-container {
/* 文章栏与侧标栏垂直排列 */
flex-direction: column;
}
.aside-content {
width: 100%;
max-width: unset;
float: unset;
margin: 40px auto 0;
}
}
#BangumiView{
color: var(--font-color);
margin: auto;
text-align:center;
display:flex;
width:100%;
}
.bv_container{
width:100%;
}
.bv_font{
font-size: 1.8rem;
line-height: 3rem;
height: 3rem;
width: 100%;
text-align: center;
}
.bv_block{
position:relative;
display: grid;
flex-wrap: wrap;
grid-gap: 20px;
justify-content: center;
grid-template-columns: repeat(6,160px);
margin-top: 20px;
}
.bv_block::-webkit-scrollbar{
display: none;
}
.pageBlock{
display: flex;
justify-content: center;
text-align: center;
height: 32px;
list-style: none;
}
.pageBlock li {
width: 32px;
height: 32px;
margin: 0 5px 0;
line-height: 32px;
color: var(--focus-color);
background: #dc143c;
}
.pageBlock li.pageBlock_selcted,.pageBlock li:hover{
background-color: var(--font-color);
cursor: pointer;
}
@media screen and (max-width: 768px) {
.bv_block{
position:relative;
width:100%;
max-height: 85vh;
overflow-y:scroll;
display: flex;
flex-wrap: wrap;
margin:0.8em auto;
max-width: 340px;
}
h1 {
font-size: 35px;
}
}
</style>

@ -0,0 +1,174 @@
<template>
<div class="anime">
<div class="anime_poster" >
<div class="anime_score_div">
<span class="anime_title anime-line" @click="intoAnime()">{{fitem.subject.name_cn||fitem.subject.name}}</span>
<span class="anime-line">{{fitem.subject.date}}</span>
<span class="anime-line">番剧评分{{fitem.subject.score+' / 10'}}</span>
<span class="anime-line">我的评分{{fitem.rate+' / 10'}}</span>
</div>
<img :src="fitem.subject.images.common">
</div>
<div class="anime_progress">
<font class="anime_p_font">{{`进度:${fitem.type==2?fitem.subject.eps:fitem.ep_status} / ${fitem.subject.eps}`}}</font>
<div class="anime_p_value" :style="fitem.type==2?'width:100%':'width:'+(fitem.ep_status/fitem.subject.eps)*100+'%'"></div>
</div>
<!-- <div class="anime_time">{{fitem.subject.air_date}}</div> -->
<!-- <div class="anime_context" v-html="fitem.prectx"></div> -->
</div>
</template>
<script>
import {formatDate} from '../../utils/tools.js'
export default {
props:['fitem'],
name: 'Anime',
data () {
return {
isHover:false,
time:123,
}
},
created(){
this.time = formatDate(this.fitem.time)
},
methods:{
getEventBus(){
},
intoAnime(){
window.open("https://bgm.tv/subject/"+this.fitem.subject.id);
}
},
}
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
.anime{
position: relative;
display: block;
box-sizing: border-box;
width: 160px;
overflow: hidden;
text-align: center;
border-radius: .4em;
animation: zoomIn 0.8s ease-in-out;
box-shadow: 0 0 6px rgb(0 0 0 / 20%);
transition: .5s;
}
.anime:hover{
transform: translateY(-10px);
transition: .5s;
box-shadow: 0 8px 10px rgb(0 0 0 / 50%);
}
.anime_title{
width: 100%;
font-size: 1rem;
font-weight: 550;
cursor: pointer;
max-height:40px;
line-height: 20px;
overflow: hidden;
letter-spacing: 1px;
transition: .5s;
}
.anime-line{
text-shadow: 1px 1px 4px #000;
}
.anime_poster{
width:160px;
height:200px;
object-fit: cover;
overflow: hidden;
position: relative;
}
.anime_poster img{
width:100%;
height:100%;
transition: .5s;
}
.anime_score_div{
position: absolute;
width: 100%;
color: #FFF;
padding: 5px;
background: #00000000;
box-sizing: border-box;
text-align: left;
display: flex;
flex-direction: column;
bottom: -60px;
transition: .5s;
z-index: 1;
}
.anime_poster:hover img{
transform: scale(1.25);
transition: .5s;
}
.anime_poster:hover > .anime_score_div{
bottom: 0;
background: #00000099;
backdrop-filter: saturate(5) blur(2px);
border-radius: 5px 5px 0 0;
transition: .5s;
}
.anime_time{
color:#037125;
font-size: 0.85em;
}
.anime_progress{
position: relative;
width: 100%;
height:20px;
background:#ccc;
}
.anime_p_font{
position: absolute;
top:0;
width:100%;
left:0;
color:#222;
}
.anime_p_value{
height:100%;
background: lightpink;
}
.anime_click{
color:#095186f5;
font-size: 0.8em;
}
.anime_context{
overflow:hidden;
width:100%;
color:#666;
font-size:15px;
font-weight:500;
letter-spacing: 0.4px;
line-height:25px;
flex:1;
}
.anime_keywords{
display: flex;
flex-wrap: wrap;
list-style: none;
}
.anime_keywords li{
color: #FFF;
height: 1.8rem;
line-height: 1.8rem;
padding: 0 .4rem;
border-radius: .4rem;
cursor: pointer;
display: block;
font-size: .85rem;
background: rgb(53, 88, 0);
transition: .5s ease;
margin:.2rem .3rem;
}
.anime_keywords li:hover{
transition: .5s ease;
background: lightgreen;
}
</style>

@ -1,13 +1,25 @@
<template>
<div>
<transition name="body">
<div v-show="showEmoji">
<span class="emoji-item"
v-for="(value, key, index) in emojiListURL"
:key="index"
@click="addEmoji(key)">
<img class="emoji" :src="value" :title="key" width="24px" height="24px"/>
<transition name="body" >
<div v-show="showEmoji" class="emoji-container">
<div class="emoji-item-container">
<span class="emoji-item"
v-for="(item, index) in EMOJI[emojiIndex].emote"
:key="index"
@click="addEmoji(item.text)">
<div v-if="item.url.indexOf('http')==-1" class="emoji">{{item.text}}</div>
<img v-if="item.url.indexOf('http')!=-1" class="emoji" :src="item.url" :title="item.text" width="24px" height="24px"/>
</span>
</div>
<div class="emoji-list-container">
<span class="emoji-item"
v-for="(item, index) in EMOJI"
:key="item.url"
@click="(emojiIndex=index)">
<img class="emoji" :src="item.url" :title="item.text" width="24px" height="24px"/>
</span>
</div>
</div>
</transition>
</div>
@ -22,40 +34,43 @@
},
data() {
return {
emojiList: this.$constant.emojiList,
emojiListURL: {}
emojiIndex:0,
};
},
created() {
this.emojiListURL = this.getEmojiList(this.emojiList);
},
methods: {
addEmoji(key) {
this.$emit("addEmoji", key);
},
getEmojiList(emojiList) {
let emojiName;
let url;
let result = {}
for (let i = 0; i < emojiList.length; i++) {
emojiName = "[" + emojiList[i] + "]";
let j = i + 1;
url = "https://pzh-blog-photo.oss-cn-shenzhen.aliyuncs.com/emoji/q" + j + ".gif";
result[emojiName] = url;
}
return result;
changeEmoji(index){
}
}
}
</script>
<style scoped>
.emoji-container{
user-select: none;
width: 280px;
position: absolute;
background: var(--background);
border: 1px solid var(--maxLightRed);
}
.emoji-item-container{
width: 100%;
max-height: 160px;
overflow-y: scroll;
}
.emoji-item {
cursor: pointer;
display: inline-block;
}
.emoji-list-container{
background: var(--maxLightGray);
}
.emoji-item:hover {
transition: all 0.2s;
border-radius: 0.25rem;
@ -67,13 +82,16 @@
/* 把此元素放置在父元素的中部 */
vertical-align: middle;
}
div.emoji{
font-size: 10px;
font-weight: 100;
margin: 8px;
}
.body-enter-active, .body-leave-active {
transition: all 0.3s;
}
.body-enter, .body-leave-to {
opacity: 0;
transform: scale(0.5);
}
</style>

@ -0,0 +1,670 @@
<template>
<div id="viewMusicBar" class="viewMusicBar" ref="viewMusicBar" :class="[(attr.bottom)?'bottomStyle':'']">
<div id="viewMusic" ref="viewMusic">
<div id="JMusic" ref="JMusic" class="showclass">
<audio id="JAudio" crossorigin="anonymous" ref="audio" :src="nowplay.song.url" :autoplay="isplay"></audio>
<img class="jpicture" :src="nowplay.song.poster"/>
<div class="jshow">
<div class="jpart1">
<p class="p1Title">{{nowplay.song.title}}</p>
<p class="p1Author"><font :key="aindex" v-for="(author,aindex) of nowplay.song.author">{{author.name}}/</font></p>
</div>
<div class="jpart2">
<div class="p2Gun"></div>
<div class="p2Stick" ref="p2Stick">
<div class="stick_cover" ref="stick_cover"></div>
<div class="stick_point" ref="stick_point"></div>
</div>
<a class="p2Time" ref="p2Time" @click="download()" title="点击可下载">{{showObject.curr}}</a>
<div class="jpart3">
<div class="p3Before" @click="corrct('left')">
<svg class="icon" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 32 32"><path d="M25.468 6.947c-0.326-0.172-0.724-0.151-1.030 0.057l-6.438 4.38v-3.553c0-0.371-0.205-0.71-0.532-0.884-0.326-0.172-0.724-0.151-1.030 0.057l-12 8.164c-0.274 0.186-0.438 0.496-0.438 0.827s0.164 0.641 0.438 0.827l12 8.168c0.169 0.115 0.365 0.174 0.562 0.174 0.16 0 0.321-0.038 0.468-0.116 0.327-0.173 0.532-0.514 0.532-0.884v-3.556l6.438 4.382c0.169 0.115 0.365 0.174 0.562 0.174 0.16 0 0.321-0.038 0.468-0.116 0.327-0.173 0.532-0.514 0.532-0.884v-16.333c0-0.371-0.205-0.71-0.532-0.884z"/></svg>
</div>
<div class="p3Play" @click="play()" ref="p3Play">
<svg t="1557033482333" class="icon" style="width: 1em; height: 1em;vertical-align: middle;fill: currentColor;overflow: hidden;" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1095"><path d="M256 832c-11.712 0-23.36-3.2-33.664-9.536A64.170667 64.170667 0 0 1 192 768V256c0-22.208 11.52-42.816 30.336-54.464a64.298667 64.298667 0 0 1 62.272-2.816l512 256a64.064 64.064 0 0 1 0 114.56l-512 256c-8.96 4.48-18.88 6.72-28.608 6.72z" fill p-id="1096" data-spm-anchor-id="a313x.7781069.0.i0" class="selected"/></svg>
</div>
<div class="p3Next" @click="corrct('right')">
<svg class="icon" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 32 32"><path d="M25.468 6.947c-0.326-0.172-0.724-0.151-1.030 0.057l-6.438 4.38v-3.553c0-0.371-0.205-0.71-0.532-0.884-0.326-0.172-0.724-0.151-1.030 0.057l-12 8.164c-0.274 0.186-0.438 0.496-0.438 0.827s0.164 0.641 0.438 0.827l12 8.168c0.169 0.115 0.365 0.174 0.562 0.174 0.16 0 0.321-0.038 0.468-0.116 0.327-0.173 0.532-0.514 0.532-0.884v-3.556l6.438 4.382c0.169 0.115 0.365 0.174 0.562 0.174 0.16 0 0.321-0.038 0.468-0.116 0.327-0.173 0.532-0.514 0.532-0.884v-16.333c0-0.371-0.205-0.71-0.532-0.884z"/></svg>
</div>
<div class="jvolume" ref="jvolume">
<svg @click="JMusicObject.audio.muted = false;vif.muted=false" v-if="vif.muted" t="1626430140328" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="9051"><path d="M512 691.2c6.4-99.2 89.6-179.2 192-179.2h6.4V134.4l-246.4 246.4H249.6v265.6h214.4l48 44.8z" fill="#707070" p-id="9052"></path><path d="M627.2 585.6l-22.4 22.4-22.4 22.4 73.6 73.6-73.6 73.6 22.4 22.4 22.4 22.4 73.6-73.6 76.8 73.6 22.4-22.4 22.4-22.4-73.6-73.6 73.6-73.6-22.4-22.4-22.4-22.4-76.8 73.6z" fill="#707070" p-id="9053"></path></svg>
<svg @click="JMusicObject.audio.muted = true;vif.muted=true" v-if="!vif.muted" t="1626427775189" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2885" ><path d="M537.6 145.066667L554.666667 128v768l-85.333334-85.333333-298.666666-298.666667 64-64 302.933333-302.933333zM469.333333 341.333333l-166.4 170.666667 166.4 170.666667V341.333333z m170.666667-123.733333c145.066667 21.333333 256 145.066667 256 294.4s-110.933333 273.066667-256 294.4v-85.333333c98.133333-21.333333 170.666667-106.666667 170.666667-209.066667s-72.533333-187.733333-170.666667-209.066667v-85.333333z m0 128c72.533333 17.066667 128 85.333333 128 166.4s-55.466667 145.066667-128 166.4v-89.6c25.6-12.8 42.666667-42.666667 42.666667-72.533333s-17.066667-59.733333-42.666667-72.533334V345.6z" fill="#444444" p-id="2886"></path></svg>
<input type="range" value=1 min=0 max=1 step=0.1 v-model="JMusicObject.audio.volume" class="input_volume" />
</div>
<div class="p3List" @click="selectList()" @click.right.prevent="vif.cplaylist=true">
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 22 32"><path d="M20.8 14.4q0.704 0 1.152 0.48t0.448 1.12-0.48 1.12-1.12 0.48h-19.2q-0.64 0-1.12-0.48t-0.48-1.12 0.448-1.12 1.152-0.48h19.2zM1.6 11.2q-0.64 0-1.12-0.48t-0.48-1.12 0.448-1.12 1.152-0.48h19.2q0.704 0 1.152 0.48t0.448 1.12-0.48 1.12-1.12 0.48h-19.2zM20.8 20.8q0.704 0 1.152 0.48t0.448 1.12-0.48 1.12-1.12 0.48h-19.2q-0.64 0-1.12-0.48t-0.48-1.12 0.448-1.12 1.152-0.48h19.2z" /></svg>
</div>
</div>
</div>
</div>
<div class="jhide" ref="jhide" @click.right.prevent="vif.vsetAttr=true">
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 32 32"><path d="M22 16l-10.105-10.6-1.895 1.987 8.211 8.613-8.211 8.612 1.895 1.988 8.211-8.613z" /></svg>
</div>
<div class="jdialog dialog-clist" v-if="vif.cplaylist" @click="vif.cplaylist=false">
<input type="text" class="dialog-line" placeholder="更换歌单" v-model="attr.playlist" @click.stop="" @keydown.enter="replayList()"/>
</div>
<div class="jdialog dialog-slist" v-if="vif.vsetAttr" @click="vif.vsetAttr=false">
<input type="checkbox" class="dialog-line" v-model="attr.bottom" @click.stop="" /> 底部
<input type="checkbox" class="dialog-line" v-model="attr.shake" @click.stop="" /> 音乐可视化
</div>
</div>
<div class="jlists" ref="JLists">
<div :class="[(song==nowplay.song)?'jlists-playing':'','jlists_item']" :key="song.id" v-for="(song,index) in list.songs" @click="corrct(index);">
<font>{{song.title}}</font>-
<font :key="aindex" v-for="(author,aindex) of song.author">{{author.name}}/</font>
</div>
</div>
<canvas id="CANVAS" ref="canvas" v-show="attr.shake" :style="[{'height':attr.shakeheight}]"></canvas>
<div class="jlyric" ref="JLyric"><div><font :style="[{'height':attr.lyricheight+'px','line-height':attr.lyricheight+'px'}]" :key="index" v-for="(item,index) of showObject.Lyrics" :class="item.classname">{{item.text}}</font></div></div>
</div>
<div class="JBg" ref="JBg"></div>
</div>
</template>
<script type="text/ecmascript-6">
import { timeout } from 'q';
export default {
components: {},
data() {
return {
JMusicObject:{audio:{volume:{},muted:false},JMshake:null},
showObject:{curr:"00:00 / 00:00",Lyrics:new Array()},
nowplay:{song:{},currentTime:0,duration:0},
list:{songs:[],lyrics:[]},
vif:{cplaylist:false,ischange:false,muted:false,vsetAttr:false},
isplay:false,
attr:{playlist:this.$store.state.playlist,bottom:false,shakeheigh:"200px",shake:false,lyricheight:21},
attr_init:{playlist:this.$store.state.playlist,bottom:false,shakeheigh:"200px",shake:false,lyricheight:21},
};
},
beforeRouteEnter(to, from, next) {
next(vm => {});
},
mounted() {
let that = this;
this.JMusicObject.canvas = this.$refs.canvas;
this.JMusicObject.audio = this.$refs.audio;
this.setAttr();
this.replayList();
if(this.attr.shake){this.creCanvas();}
this.creInterval();
this.creEvent();
this.$nextTick(()=>{
setTimeout(() => {
$(that.$refs.JMusic).toggleClass("showclass")
$(that.$refs.JMusic).toggleClass("hideclass")
}, 3000);
})
},
watch: {
"$store.state.playlist": {
immediate: true,
handler() {
this.attr.playlist = this.$store.state.playlist
this.replayList()
},
},
'nowplay.song.lyrics'(to,from){
this.standardLyric(this.nowplay.song.lyrics);
},
'list.songs'(to,from){
this.corrct(0);
},
'attr.shake'(to,from){
if(this.attr.shake&&!this.JMusicObject.JMshake){
this.creCanvas();
}
},
'isplay'(to,from){
if(this.isplay){
this.$refs.p3Play.innerHTML = '<svg t="1557034022257" class="icon" style="width: 1em; height: 1em;vertical-align: middle;fill: currentColor;overflow: hidden;" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1932" data-spm-anchor-id="a313x.7781069.0.i5"><path d="M597.333333 816.64 768 816.64 768 219.306667 597.333333 219.306667M256 816.64 426.666667 816.64 426.666667 219.306667 256 219.306667 256 816.64Z" p-id="1933" data-spm-anchor-id="a313x.7781069.0.i3"></path></svg>';
} else {
this.$refs.p3Play.innerHTML = '<svg t="1557033482333" class="icon" style="width: 1em; height: 1em;vertical-align: middle;fill: currentColor;overflow: hidden;" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1095"><path d="M256 832c-11.712 0-23.36-3.2-33.664-9.536A64.170667 64.170667 0 0 1 192 768V256c0-22.208 11.52-42.816 30.336-54.464a64.298667 64.298667 0 0 1 62.272-2.816l512 256a64.064 64.064 0 0 1 0 114.56l-512 256c-8.96 4.48-18.88 6.72-28.608 6.72z" fill="" p-id="1096" data-spm-anchor-id="a313x.7781069.0.i0" class="selected"></path></svg>';
}
}
},
methods: {
setJMusic(){
$(this.$refs.viewMusic).css(css);
},
//load
setAttrByEle(){
if(!window.top.document){return false;} //
let father = $(window.top.document).find("[name='MUSIC']");
if(father.attr("bottom")=="true"){this.attr.bottom=true;}
if(father.attr("playlist")){this.attr.playlist=$(father).attr("playlist")}
return true;
},
setAttr(){
if(this.setAttrByEle()){return};//name=MUSIC
for(let key in top.JMusicAttr){ //()
this.attr[key] = top.JMusicObject[key];
console.log(`配置 ${key} 成功"`);
}
},
creCanvas(){
try{
this.JMusicObject.JMshake = new JMshake(this.JMusicObject.canvas,this.JMusicObject.audio);
this.JMusicObject.JMshake.loadMusic();
} catch(e){console.log(e,"音乐可视化加载失败!");}
},
creInterval(){
let that = this;
this.gunVal = setInterval(function(){//
if(!that.vif.ischange){
that.nowplay.duration = that.JMusicObject.audio.duration || 59;
that.nowplay.currentTime = that.JMusicObject.audio.currentTime || 0;
let width = parseFloat($(that.$refs.p2Stick).eq(0).css("width"));
let left = (that.nowplay.currentTime / that.nowplay.duration) *width;
$(that.$refs.stick_point).css({"left":left+"px"});
$(that.$refs.stick_cover).css({"width":left+"px"});
$(that.$refs.p2Time).text(that.getTimeText(that.nowplay.currentTime) +" / "+ that.getTimeText(that.nowplay.duration));
}
},500);
this.gunLyric = setInterval(function(){
let now = $(".lyricgun"+Math.round(that.nowplay.currentTime));
if(now.length==0){} else {
$(that.$refs.JLyric).find("div font").removeClass("lyricshow");
now.addClass("lyricshow");
let index = $(that.$refs.JLyric).find("div font").toArray().indexOf(now[0]);
$(that.$refs.JLyric).find("div").css("margin-top",-((index-1) * that.attr.lyricheight)+"px");
}
},500);
},
creEvent(){
let that = this;
this.JMusicObject.audio.onended = function(){
that.corrct("right");
}
this.$refs.p2Stick.onmousedown = function(e){
that.vif.ischange = true;
let sp = this;
let jbg = that.$refs.JBg;
jbg.style.display = "block";
let l;
let move = jbg.onmousemove = function(e){
let offset = $(sp).offset();
l = e.offsetX - offset.left;
if(l<0) l = 0;
if(l>sp.offsetWidth) return;
that.$refs.stick_point.style.left = l+"px";
that.$refs.stick_cover.style.width = l+"px";
}
let up = jbg.onmouseup = function(e){
that.vif.ischange = false;
jbg.style.display = "none";
l = e.offsetX - $(sp).offset().left;
that.$refs.stick_point.style.left = l+"px";
that.$refs.stick_cover.style.width = l+"px";
that.JMusicObject.audio.currentTime = that.JMusicObject.audio.duration*(l/sp.offsetWidth);
}
}
this.$refs.jhide.onclick = function(e){
$(that.$refs.JMusic).toggleClass("showclass")
$(that.$refs.JMusic).toggleClass("hideclass")
that.$refs.JLists.classList.remove("jlists_show");
}
},
getTimeText(time){
let hours = parseInt(time/3600)
var minutes = parseInt((time-hours*3600)/60);
let seconds = Math.round(time-(hours*3600+minutes*60));
return minutes+":"+seconds;
},
corrct(command){
let index = this.list.songs.indexOf(this.nowplay.song);
switch (command) {
case "right":
this.nowplay.song = (index==this.list.songs.length-1)?this.list.songs[0]:this.list.songs[index+1];
break;
case "left":
this.nowplay.song = (index==0)?this.list.songs[this.list.songs.length-1]:this.list.songs[index-1];
break;
default:
this.nowplay.song = this.list.songs[command];
break;
}
if(this.nowplay.song.url=="NULL"){JMusicjsoup.getMp3Url(this.nowplay.song.id,this.nowplay.song);}
if(this.nowplay.song.lyrics=="NULL"){JMusicjsoup.getLyric(this.nowplay.song.id,this.nowplay.song);}
},
play(){
if(this.JMusicObject.audio.paused){
this.JMusicObject.audio.play();
this.isplay=true;
}else{
this.JMusicObject.audio.pause();
this.isplay=false;
}
},
selectList(){
$(this.$refs.JLists).toggleClass("jlists_show");
},
replayList(){
let that = this;
JMusicjsoup.getPlayList(this.attr.playlist,this);
this._setPlayList = function(data){
let res = data.playlist.tracks;
let songs = new Array();
for(let d=0;d<res.length;d++){
let song = new Object();
song.title=res[d].name;
song.id=res[d].id;
song.author = res[d].ar;
song.poster = res[d].al.picUrl;
song.url="NULL";
song.lyrics="NULL";
song._setMp3Url = function(id,data){
this.url = data.data[0].url;
}
song._setLyric = function(id,data){
data.lrc?this.lyrics = data.lrc.lyric:this.lyrics="[00:00.000] nothing..."
}
songs.push(song);
}
that.list.songs = songs;
};
},
standardLyric(lyric){//
let lyrics = lyric.split("\n");
let timeReg = /\[\d*:\d*((\.|\:)\d*)*\]/;
let ended = new Array();
let arrLyric = new Array();
for(let i=0;i<lyrics.length;i++){
let timeRegExpArr = lyrics[i].match(timeReg);
if(!timeRegExpArr)continue;
let clause = lyrics[i].replace(timeReg,'');
let time = 0;
let t = timeRegExpArr[0];
let min = Number(String(t.match(/\[\d*/)).slice(1));
let sec = Number(String(t.match(/\:\d*/)).slice(1));
time = min * 60 + sec; //
if(clause==""){clause=" "}
ended[time] = clause;
let li = {};
li.text = clause;
li.classname = "lyricgun"+time;
arrLyric.push(li);
}
this.showObject.Lyrics = arrLyric;
return ended;
},
download(){
let that = this;
let xhr = new XMLHttpRequest();
xhr.open('GET', that.nowplay.song.url, true);
xhr.responseType = 'blob';
xhr.onload = function() {
if (xhr.status === 200) {
if (window.navigator.msSaveOrOpenBlob) {
navigator.msSaveBlob(xhr.response, that.nowplay.song.title);
} else {
let link = document.createElement('a');
let body = document.querySelector('body');
link.href = window.URL.createObjectURL(xhr.response);
link.download = that.nowplay.song.title+"-"+that.nowplay.song.author[0].name;
// fix Firefox
link.style.display = 'none';
body.appendChild(link);
link.click();
body.removeChild(link);
window.URL.revokeObjectURL(link.href);
};
}
};
xhr.send();
}
}
};
</script>
<style>
.viewMusicBar{
height:100%;
width:100%;
min-height:64px;
cursor:default;
}
#viewMusic{
position : absolute;
width:100%;
top:0;left:0;
min-height:64px;
}
#viewMusic p{
margin: 0;
}
#JMusic{
z-index:2;
position : absolute;
display : flex;
width : 100%;
height:100%;
overflow:hidden;
background:#fff;
pointer-events: auto;
}
#JAudio{
display:none;
}
.JBg{
display: none;
position:absolute;
pointer-events: auto;
z-index:999;
left:0;
top:0;
height:100%;
width:100%;
}
.jpicture{
min-width: 64px;
height:100%;
}
.jshow{
padding: 0px 10px 0 10px;
display:flex;
flex:1;
flex-direction:column;
}
.jpart1{
flex-direction:column;
flex:1;
width:100%;
}
.p1Title{
font-size:13px;
color:#444;
}
.p1Author{
font-size:12px;
color:#666;
}
.p1Title,.p1Author{
text-indent:.2rem;
line-height: 1.5em;
overflow: hidden;
max-width: 60%;
white-space: nowrap;
text-overflow: ellipsis;
transition: .4s ease-in-out;
}
.jpart1 font:hover,.p1Title:hover,.p2Time:hover{
color:#ff4777;
transition: .4s ease-in-out;
}
.jpart2{
position:relative;
display:flex;
flex-wrap: nowrap;
justify-content:space-around;
flex:1;
width:100%;
align-items:center;
}
.jpart3{
display:flex;
}
.p2Time{
overflow:hidden;
font-size:12px;
text-align: center;
min-width:80px;
color:#666;
cursor: pointer;
}
.p2Stick{
width:100%;
height:5px;
background-color:#666;
position:relative;
}
.stick_point{
border: 1px solid #ccc;
position:absolute;
border-radius:50%;
height:12px;
width:12px;
background:#eee;
top:50%;
transform:translate(0, -50%);
}
.stick_point:hover{
border: 1px solid #fe8e8e;
transition:all 0.4s ease-in-out ;
cursor: pointer;
}
.stick_cover{
position:absolute;
height:100%;
background:#eee;
}
.p3Next, .p3Play, .p3Before, .p3List, .jvolume {
display: flex;
margin:auto;
height:20px;
width:20px;
text-align:center;
}
.p3Next svg,.p3Play svg,.p3Before svg,.jhide svg,.p3List svg{
height:100% !important;
width:100% !important;
}
.p3Next{
transform-origin: 50% 50% 0px;
transform:rotateY(180deg);
}
.viewMusicBar .icon{
width:20px !important;
}
.viewMusicBar svg {
cursor:pointer;
}
.viewMusicBar svg path{
transition:0.4s ease-in-out ;
fill:#888;
}
.p3Before:hover svg path{
fill:#db5a6b;
}
.p3Play:hover svg path{
fill:#a1afc9;
}
.p3Next:hover svg path{
fill:#60281e;
}
.p3List:hover svg path{
fill:#425066;
}
.jhide:hover svg path{
fill:#2e4e7e;
}
.jvolume:hover svg path{
fill:#2e7e71;
}
.jvolume:hover .input_volume{
display: inline-block;
height:10px;
}
.jvolume{
position: relative;
}
.viewMusicBar .input_volume{
position: absolute;
display: none;
height: 0;
left: 50%;
transform: translate(-50%, 0);
width: 80px;
bottom: 100%;
transform-origin: center center;
}
.jhide{
display:inline-block;
width:20px;
line-height:50px;
height:100%;
text-align:center;
background:rgba(255,255,255,0.5);
}
.hideclass{
left:20px;
transform: translate(-100%,0);
transition:all 0.4s ease-in-out ;
}
.showclass{
left:0;
transform: translate(0,0);
transition:all 0.4s ease-in-out ;
}
.showclass .jhide svg{
transform-origin: 50% 50% 0px;
transform:rotateY(180deg);
transition:all 0.4s ease-in-out ;
}
.jlyric{
position: absolute;
z-index: 1;
top:0;
left: 0;
width: 100%;
height: 100%;
overflow: hidden;
pointer-events:none;
}
.lyricshow{
font-size:1rem !important;
opacity:1 !important;
}
.jlyric > div{
text-align: center;
transition: all 0.4s ease-in-out;
display: flex;
flex-direction: column;
align-items: center;
width: 100%;
margin-top:0px;
}
.jlyric font{
width:100%;
color:#fff;
text-shadow: 0 1px 5px #4c8dae;
overflow:hidden;
font-size:.9em;
opacity:.5;
}
.jlists{
z-index:1;
opacity:0;
width:100%;
position:absolute;
left:0px;top:100%;
background:#fff;
max-height: 0px;
overflow:hidden;
overflow-y:scroll;
transition: .4s ease-in-out ;
}
.jlists_item{
height:20px;
width:100%;
font-size:12px;
line-height:20px;
text-indent:1em;
color:#444;
cursor:pointer;
transition:all 0.4s ease-in-out ;
overflow: hidden;
text-overflow:ellipsis;
white-space: nowrap;
}
.jlists_item:hover{
background:rgb(214, 214, 214);
transition:all 0.4s ease-in-out ;
}
.jlists-playing::before{
width:6px;
height:100%;
position: absolute;
content:"";
left:0;
transition: .4s ease-in-out;
background: #8ea9a7;
}
.jlists-playing{
position: relative;
background:rgb(214, 214, 214);
transition:all 0.4s ease-in-out ;
}
.jlists_show{
opacity:1;
max-height:200px;
pointer-events: auto;
}
.viewMusicBar.bottomStyle #viewMusic{
bottom:0;top:unset;
}
.viewMusicBar.bottomStyle .jlists{
top:0 !important;
transform: translate(0,100%);
transition: .4s ease-in-out;
}
.viewMusicBar.bottomStyle .jlists.jlists_show{
transform: translate(0,-100%) !important;
transition: .4s ease-in-out;
}
.viewMusicBar.bottomStyle #CANVAS{
bottom:0;left:0;top:unset;
transform: none !important;
}
.jlists::-webkit-scrollbar{
width: 4px;
}
.jlists::-webkit-scrollbar-thumb{
border-radius: 10px;
box-shadow: inset 0 0 5px rgba(0,0,0,0.2);
background: rgba(0,0,0,0.2);
}
.jlists::-webkit-scrollbar-track {
border-radius: 0;
background: rgba(0,0,0,0.0);
}
#CANVAS{
z-index: 0;
position: absolute;
top:0;left:0;
width:100%;
height:200%;
transform: rotate(180deg);
pointer-events: none;
}
.jdialog input{
outline: none;
border: none;
}
.dialog-clist,.dialog-slist{
position: absolute;
display: flex;
align-items: center;
justify-content: center;
width:100%;
height:100%;
z-index: 50;
color:#FFF;
background: rgba(0, 0, 0, 0.3);;
}
.dialog-clist .dialog-line{
width:300px;
height:28px;
line-height: 28px;
text-indent: 1.2rem;
}
.dialog-slist{
}
@media screen and (max-width: 600px) {
}
</style>

@ -2,7 +2,10 @@
<div class="myFooter-wrap" v-show="showFooter">
<div class="myFooter">
<div class="footer-title">{{$store.state.webInfo.footer}}</div>
<div class="icp">本网站由 <a href="https://poetize.cn" target="_blank">寻国记</a> 强力支持</div>
<div class="icp">
<a href="http://beian.miit.gov.cn" target="_blank">桂ICP备2023000307号-1</a>
</div>
</div>
</div>
</template>
@ -44,7 +47,7 @@
}
.icp, .icp a {
color: var(--maxGreyFont);
color: var(--white);
font-size: 13px;
}

@ -0,0 +1,409 @@
<template>
<div class="shuoshuo-card">
<div class="shuoshuo-topper">
<img src="https://q1.qlogo.cn/g?b=qq&s=100&nk=983341575" alt="" class="shuoshuo-avatar">
<div class="shuoshuo-toptitle">
<span style="font-size:1.2em;color:var(--fontColor)">Janx</span>
<div class="shuoshuo-meta">
<span style="font-size:0.9em">{{source.createTime}}</span>
<span>
<svg viewBox="0 0 1024 1024" width="14" height="14" >
<path d="M14.656 512a497.344 497.344 0 1 0 994.688 0 497.344 497.344 0 1 0-994.688 0z"
fill="#FF0000"></path>
<path
d="M374.976 872.64c-48.299-100.032-22.592-157.44 14.421-211.37 40.448-58.966 51.115-117.611 51.115-117.611s31.659 41.386 19.115 106.005c56.149-62.72 66.816-162.133 58.325-200.405 127.317 88.746 181.59 281.002 108.181 423.381C1016 652.501 723.093 323.2 672.277 285.867c16.939 37.333 20.054 100.032-14.101 130.474-58.027-219.84-201.664-265.002-201.664-265.002 16.96 113.536-61.781 237.397-137.344 330.24-2.816-45.163-5.632-76.544-29.483-119.808-5.333 82.176-68.373 149.269-85.29 231.445-22.912 111.637 17.237 193.173 170.581 279.424z"
fill="#FFFFFF"></path>
</svg> {{source.articleEmotion}}
</span>
<span>
<svg viewBox="0 0 1024 1024" width="14" height="14" >
<path
d="M113.834667 291.84v449.194667a29.013333 29.013333 0 0 0 28.842666 29.013333h252.928v90.453333l160.597334-90.453333h252.928a29.013333 29.013333 0 0 0 29.013333-29.013333V291.84a29.013333 29.013333 0 0 0-29.013333-29.013333h-665.6a29.013333 29.013333 0 0 0-29.696 29.013333z"
fill="#FFDEAD"></path>
<path
d="M809.130667 262.826667h-665.6a29.013333 29.013333 0 0 0-28.842667 29.013333v40.106667a29.013333 29.013333 0 0 1 28.842667-29.013334h665.6a29.013333 29.013333 0 0 1 29.013333 29.013334V291.84a29.013333 29.013333 0 0 0-29.013333-29.013333z"
fill="#FFF3DB"></path>
<path
d="M556.202667 770.048h252.928a29.013333 29.013333 0 0 0 29.013333-29.013333V362.837333s-59.733333 392.533333-724.309333 314.709334v63.488a29.013333 29.013333 0 0 0 28.842666 29.013333h253.098667v90.453333z"
fill="#F2C182"></path>
<path
d="M619.008 632.32l101.888-35.157333-131.754667-76.117334 29.866667 111.274667zM891.904 148.992a61.44 61.44 0 0 0-84.138667 22.528l-19.968 34.133333 106.666667 61.610667 19.968-34.133333a61.781333 61.781333 0 0 0-22.528-84.138667z"
fill="#69BAF9"></path>
<path d="M775.338667 198.775467l131.669333 76.032-186.026667 322.218666-131.6864-76.032z"
fill="#F7FBFF"></path>
<path
d="M775.168 198.826667l-5.290667 9.216 59.221334 34.133333a34.133333 34.133333 0 0 1 12.458666 46.592l-139.946666 242.346667a34.133333 34.133333 0 0 1-46.762667 12.629333l-59.050667-34.133333-6.656 11.434666 88.746667 51.2L720.896 597.333333l186.026667-322.56z"
fill="#D8E3F0"></path>
<path
d="M616.448 622.592l2.56 9.728 101.888-35.157333-44.885333-25.941334-59.562667 51.370667zM891.904 148.992c-1.024 0-2.218667-0.853333-3.242667-1.536A61.610667 61.610667 0 0 1 887.466667 204.8l-19.968 34.133333-73.728-42.496-5.12 8.704 106.666666 61.610667 19.968-34.133333a61.781333 61.781333 0 0 0-23.381333-83.626667z"
fill="#599ED4"></path>
<path
d="M265.898667 417.621333H494.933333a17.066667 17.066667 0 1 0 0-34.133333H265.898667a17.066667 17.066667 0 1 0 0 34.133333zM265.898667 533.504H494.933333a17.066667 17.066667 0 0 0 0-34.133333H265.898667a17.066667 17.066667 0 0 0 0 34.133333z"
fill="#3D3D63"></path>
<path
d="M959.488 354.645333a99.84 99.84 0 0 0-23.722667-127.488 78.677333 78.677333 0 0 0-142.848-64.170666l-11.605333 20.138666a17.066667 17.066667 0 0 0-20.821333 7.168l-32.085334 55.466667H142.677333a46.250667 46.250667 0 0 0-45.909333 46.08v449.194667a46.08 46.08 0 0 0 45.909333 46.08h236.032v73.386666a17.066667 17.066667 0 0 0 8.362667 14.848 17.066667 17.066667 0 0 0 8.704 2.218667 17.066667 17.066667 0 0 0 8.362667-2.218667l156.672-88.234666h248.32a46.08 46.08 0 0 0 46.08-46.08V398.677333L921.6 283.306667a17.066667 17.066667 0 0 0-4.266667-21.504l1.877334-3.413334a65.365333 65.365333 0 0 1 10.410666 79.189334l-53.077333 91.989333a56.832 56.832 0 0 0 20.821333 77.653333 17.066667 17.066667 0 0 0 24.234667-6.314666 17.066667 17.066667 0 0 0-6.997333-23.04 23.04 23.04 0 0 1-8.362667-31.061334z m-138.410667 386.389334a11.946667 11.946667 0 0 1-11.946666 11.946666H556.202667a17.066667 17.066667 0 0 0-8.362667 2.218667l-134.997333 76.117333v-61.269333a17.066667 17.066667 0 0 0-17.066667-17.066667H142.677333a11.946667 11.946667 0 0 1-11.776-11.946666V291.84a11.946667 11.946667 0 0 1 11.776-11.946667h565.930667L574.464 512a17.066667 17.066667 0 0 0-1.706667 12.970667L597.333333 615.253333H265.898667a17.066667 17.066667 0 1 0 0 34.133334h352.938666a17.066667 17.066667 0 0 0 5.802667 0l102.4-35.328a17.066667 17.066667 0 0 0 9.216-7.509334l85.333333-147.968z m-204.8-184.661334l63.829334 36.864-49.322667 17.066667z m206.848-170.666666v1.365333l-108.373333 186.709333-102.4-59.050666L781.482667 221.866667l102.4 59.050666z m76.458667-161.28L887.466667 244.224l-76.970667-44.373333 11.264-19.797334a44.544 44.544 0 1 1 77.141333 44.544z"
fill="#3D3D63"></path>
</svg> {{source.likeCount}} 条评论
</span>
</div>
</div>
</div>
<div class="shuoshuo-container" v-html="source.articleContent">
</div>
<div class="shuoshuo-piclist" ref="imgList" :class="picClassname">
<!-- v-viewer.rebuild="{inline: false,'url': 'data-source',images:picList[0]}" -->
<a :href="item" v-for="item,index in picList[0]" v-show="(index<9)?true:false" :key="item"
:overtip="`+ ${picList[0].length-9}`"
:data-sub-html="picList[1][index]||'Have a good life!'"
data-fb-html='这里可以写些东西呢'
>
<div class="imgbox">
<img :click="clickPicture" :title="picList[1][index]" class="lazyload_images" :data-source="item" :src="item+'-poster'" alt="">
</div>
</a>
</div>
<div class="shuoshuo-tailer">
<span style="font-size:0.9em;line-height: 1.5em;">{{source.articleAddress}}</span>
<span style="font-size:0.9em;line-height: 1.5em;">{{source.articleDevice}}</span>
</div>
</div>
</template>
<script>
// const graffiti = () => import( "./graffiti");
const proPage = () => import( "../common/proPage");
import MarkdownIt from 'markdown-it';
// import 'lightgallery.js'
// import 'lg-thumbnail.js'
export default {
components: {
},
props: {
source: {
type: Number
},
userId: {
type: Number
}
},
data() {
return {
isGraffiti: false,
total: 0,
replyDialogVisible: false,
floorComment: {},
replyComment: {},
comments: [],
picList:[],
picClassname:"",
pagination: {
current: 1,
size: 10,
total: 0,
source: this.source,
floorCommentId: null
}
};
},
computed: {},
created() {
// this.getComments(this.pagination);
// this.getTotal();
this.checkPicList();
},
mounted() {
new lightGallery(this.$refs.imgList,{
plugins: [lgThumbnail,lgHash,lgRotate,lgVideo,lgZoom,lgFullscreen,lgAutoplay,lgComment],
mode: 'lg-slide',
cssEasing: 'ease',
commentBox: true,
fbComments: true,
galleryId:this.source.id,
speed: 300
});
},
methods: {
toPage(page) {
this.pagination.current = page;
window.scrollTo({
top: document.getElementById('comment-content').offsetTop
});
// this.getComments(this.pagination);
},
getTotal() {
this.$http.get(this.$constant.baseURL + "/comment/getCommentCount", {source: this.source})
.then((res) => {
if (!this.$common.isEmpty(res.data)) {
this.total = res.data;
}
})
.catch((error) => {
this.$message({
message: error.message,
type: "error"
});
});
},
toChildPage(floorComment) {
floorComment.childComments.current += 1;
let pagination = {
current: floorComment.childComments.current,
size: 5,
total: 0,
source: this.source,
floorCommentId: floorComment.id
}
// this.getComments(pagination, floorComment, true);
},
emoji(comments, flag) {
comments.forEach(c => {
c.commentContent = c.commentContent.replace(/\n/g, '<br/>');
c.commentContent = this.$common.faceReg(c.commentContent);
c.commentContent = this.$common.pictureReg(c.commentContent);
if (flag) {
if (!this.$common.isEmpty(c.childComments) && !this.$common.isEmpty(c.childComments.records)) {
c.childComments.records.forEach(cc => {
c.commentContent = c.commentContent.replace(/\n/g, '<br/>');
cc.commentContent = this.$common.faceReg(cc.commentContent);
cc.commentContent = this.$common.pictureReg(cc.commentContent);
});
}
}
});
},
// getComments(pagination, floorComment = {}, isToPage = false) {
// this.$http.post(this.$constant.baseURL + "/comment/listComment", pagination)
// .then((res) => {
// if (!this.$common.isEmpty(res.data) && !this.$common.isEmpty(res.data.records)) {
// if (this.$common.isEmpty(floorComment)) {
// this.comments = res.data.records;
// pagination.total = res.data.total;
// this.emoji(this.comments, true);
// } else {
// if (isToPage === false) {
// floorComment.childComments = res.data;
// } else {
// floorComment.childComments.total = res.data.total;
// floorComment.childComments.records = floorComment.childComments.records.concat(res.data.records);
// }
// this.emoji(floorComment.childComments.records, false);
// }
// }
// })
// .catch((error) => {
// this.$message({
// message: error.message,
// type: "error"
// });
// });
// },
addGraffitiComment(graffitiComment) {
this.submitComment(graffitiComment);
},
submitComment(commentContent) {
let comment = {
source: this.source,
commentContent: commentContent
};
this.$http.post(this.$constant.baseURL + "/comment/saveComment", comment)
.then((res) => {
this.$message({
type: 'success',
message: '保存成功!'
});
this.pagination = {
current: 1,
size: 10,
total: 0,
source: this.source,
floorCommentId: null
}
// this.getComments(this.pagination);
this.getTotal();
})
.catch((error) => {
this.$message({
message: error.message,
type: "error"
});
});
},
submitReply(commentContent) {
let comment = {
source: this.source,
floorCommentId: this.floorComment.id,
commentContent: commentContent,
parentCommentId: this.replyComment.id,
parentUserId: this.replyComment.userId
};
let floorComment = this.floorComment;
this.$http.post(this.$constant.baseURL + "/comment/saveComment", comment)
.then((res) => {
let pagination = {
current: 1,
size: 5,
total: 0,
source: this.source,
floorCommentId: floorComment.id
}
// this.getComments(pagination, floorComment);
this.getTotal();
})
.catch((error) => {
this.$message({
message: error.message,
type: "error"
});
});
this.handleClose();
},
replyDialog(comment, floorComment) {
this.replyComment = comment;
this.floorComment = floorComment;
this.replyDialogVisible = true;
},
handleClose() {
this.replyDialogVisible = false;
this.floorComment = {};
this.replyComment = {};
},
checkPicList(){
this.picList = JSON.parse(this.source.articleItems);
let classname = ["","pic1","pic2","pic3"];
if(this.picList[0].length<3)
this.picClassname = classname[this.picList[0].length]
else
this.picClassname = classname[3]
if(this.picList[0].length>9){ this.picClassname = classname[3] + " pic-overload"}
},
clickPicture(e){
//viewer
const viewer = this.$el.querySelector('.images').$viewer
//show
viewer.show()
}
}
}
</script>
<style scoped>
.shuoshuo-card{
display: flex;
flex-direction: column;
padding: 15px;
box-sizing: border-box;
box-shadow: 1px 1px 5px #66666655;
max-width: 720px;
animation-name: zoomIn;
margin:20px auto 20px auto;
border-radius: .5em;
}
.shuoshuo-topper{
display: flex;
flex-direction: row;
}
.shuoshuo-topper .shuoshuo-avatar{
width:64px;
height:64px;
}
.shuoshuo-container{
margin-top: .6em;
margin-bottom: .2em;
}
.shuoshuo-toptitle{
margin-left: 10px;
display: flex;
flex-direction: column;
justify-content: flex-end;
}
.shuoshuo-piclist{
width: 100%;
position: relative;
user-select: none;
margin:5px 0 5px 0;
}
.shuoshuo-piclist a {
list-style: none;
cursor: zoom-in;
}
.shuoshuo-piclist img{
width:100%;
margin: auto;
}
.pic1 a img{
max-height: 520px;
max-width: 100%;
width: unset;
}
.pic2 {
display: flex;
flex-direction: row;
flex-wrap: wrap;
width: 100%;
}
.pic2 a{
flex:1;
margin: 2px;
}
.pic3{
display: flex;
flex-direction: row;
flex-wrap: wrap;
width: 100%;
}
.pic3 a{
width:33.33%;
padding: 1px;
position: relative;
}
.pic3 .imgbox{
position: relative;
overflow: hidden;
padding-bottom: 56.25%;/*重要属性*/
}
.pic3 .imgbox img{
width: 100%;
position: absolute;
height: 100%;
object-fit: cover;
}
.pic3.pic-overload a:nth-child(9)::after {
content: attr(overtip);
display: flex;
font-size: 2.5em;
position: absolute;
justify-content: center;
align-items: center;
width: 100%;
color: #FFF;
height: 100%;
top: 0;
pointer-events: none;
background: #00000088;
}
.shuoshuo-meta{
display: flex;
flex-direction: row;
}
.shuoshuo-meta span{
margin-right: .8em;
}
.shuoshuo-topper span,.shuoshuo-tailer span{
display:block;
color:var(--greyFont);
}
@media screen and (max-width: 768px) {
.pic3 .imgbox{
position: relative;
overflow: hidden;
padding-bottom: 100%;/*重要属性*/
}
}
</style>

@ -0,0 +1,62 @@
<template>
<div class="summary-card" data-table="SUMMARY">
<div>{{fitem.subject.short_summary||"无简介内容"}}</div>
<hr />
<div>{{fitem.comment||"无个人点评"}}</div>
</div>
</template>
<script>
import {formatDate} from '../../utils/tools.js'
export default {
props:['fitem'],
name: 'summary_card',
data () {
return {
time:123,
}
},
created(){
this.time = formatDate(this.fitem.time)
},
methods:{
getEventBus(){
},
intoAnime(){
window.open("https://bgm.tv/subject/"+this.fitem.subject.id);
}
},
}
</script>
<style scoped>
.summary-card{
width:240px;
position:fixed;
opacity: 0;
z-index:-1;
font-size: 14px;
line-height: 20px;;
box-sizing: border-box;
padding: 8px;
box-shadow: #00000055 5px 0px 10px;
background-color: var(--background);
color: var(--fontColor);
backdrop-filter: saturate(2) blur(10px);
border-radius: 10px;
text-align: left;
transition: .5s;
}
.summary-card.show{
opacity: 1;
z-index: 5;
transition: .5s;
}
.summary-card:hover{
opacity: 1 !important;
z-index: 5 !important;
transition: .5s;
}
</style>

@ -2,10 +2,10 @@
<div class="poem-container myCenter my-animation-hideToShow"
v-if="!$common.isEmpty(guShi.origin) || !$common.isEmpty(hitokoto.hitokoto)">
<!-- 背景图片 -->
<el-image class="my-el-image poem-image"
<el-image class="my-el-image poem-image "
style="position: absolute;margin-top: -50px"
v-once
:src="$constant.two_poem_image[Math.floor(Math.random() * $constant.two_poem_image.length)]"
:src="$constant.random_backImage_miaomc+Math.floor(Math.random()*100)"
fit="cover">
<div slot="error" class="image-slot"></div>
</el-image>

@ -3,7 +3,7 @@
<el-image style="animation: header-effect 2s"
class="background-image"
v-once
:src="$constant.friendBG"
:src="$constant.random_backImage_miaomc+Math.floor(Math.random()*100)"
fit="cover">
<div slot="error" class="image-slot background-image-error"></div>
</el-image>

@ -71,15 +71,8 @@
<!-- 聊天室 -->
<li @click="goIm()">
<div class="my-menu">
<svg viewBox="0 0 1024 1024" width="18" height="18" style="vertical-align: -3px;">
<path
d="M544.54784 628.16768a173.7216 173.7216 0 0 1 0-245.1712l158.6432-159.104a172.50816 172.50816 0 0 1 244.46464 0 173.7216 173.7216 0 0 1 0 245.17632L788.992 628.16768a172.50816 172.50816 0 0 1-244.44416 0z m-325.49888 324.608a173.71648 173.71648 0 0 1 0-245.1712l158.6432-159.104a172.50816 172.50816 0 0 1 244.46464 0 173.71648 173.71648 0 0 1 0 245.1712l-158.63808 159.09376a172.51328 172.51328 0 0 1-244.46976 0z"
fill="#F4CA1C"></path>
<path
d="M415.6416 567.72096a36.58752 36.58752 0 0 1-25.99936-10.80832 215.58272 215.58272 0 0 1-63.52896-149.15072A203.80672 203.80672 0 0 1 385.536 259.072l163.1744-163.7376c80.70656-80.9728 213.86752-79.104 296.82688 4.13696a215.61856 215.61856 0 0 1 63.53408 149.15072 203.776 203.776 0 0 1-59.392 148.67968l-105.2928 101.83168a36.8384 36.8384 0 0 1-51.03616-53.13024l104.79104-101.376a130.12992 130.12992 0 0 0 37.376-94.78144 142.06976 142.06976 0 0 0-41.984-98.21184c-54.30272-54.48192-140.8-56.32-192.82944-4.13696L437.51936 311.26016a130.50368 130.50368 0 0 0-37.888 95.26272 142.08512 142.08512 0 0 0 41.984 98.21184 36.97664 36.97664 0 0 1 0 52.18304 36.58752 36.58752 0 0 1-25.97376 10.8032z m-169.30816 346.34752a214.74304 214.74304 0 0 1-152.20736-63.67232c-82.85184-83.13856-84.81792-216.48384-4.46976-297.472l104.96-110.80704a36.82816 36.82816 0 1 1 53.30432 50.83648l-105.91232 111.79008c-52.0192 52.1984-50.176 138.99264 4.1216 193.47456s140.8 56.32 192.82432 4.13184l163.18976-163.74784a130.47808 130.47808 0 0 0 37.888-95.232 142.09536 142.09536 0 0 0-41.984-98.21696 36.83328 36.83328 0 0 1 51.9936-52.18304 215.6288 215.6288 0 0 1 63.53408 149.15584 203.81184 203.81184 0 0 1-59.392 148.67968L390.95296 854.528a203.08992 203.08992 0 0 1-144.61952 59.54048z"
fill="#595BB3"></path>
</svg>
<span>&nbsp;社交</span>
<span>🎠生活</span>
</div>
</li>
<!-- 微言 -->
@ -158,7 +151,12 @@
<span>💃&nbsp;友人帐</span>
</div>
</li>
<!-- 追番 -->
<li @click="$router.push({path: '/bangumi'})">
<div class="my-menu">
<span>🔮&nbsp;追番</span>
</div>
</li>
<!-- 关于 -->
<li @click="$router.push({path: '/about'})">
<div class="my-menu">
@ -190,7 +188,7 @@
<el-dropdown placement="bottom">
<el-avatar class="user-avatar" :size="36"
style="margin-top: 12px"
:src="!$common.isEmpty($store.state.currentUser)?$store.state.currentUser.avatar:$store.state.webInfo.avatar">
:src="!$common.isEmpty($store.state.currentUser)?$store.state.currentUser.avatar:$constant.random_avatar(Date.now()-Date.now()% (60 * 1000))">
</el-avatar>
<el-dropdown-menu slot="dropdown">
@ -216,7 +214,9 @@
<div id="main-container">
<router-view></router-view>
</div>
<div id="music-platform">
<MusicBar id="appMusic" v-if="isMusic" ref="appMusic" :attrs="{shake:true}" name="MUSIC" bottom="true" frameborder="no" scrolling="no" border="0" marginwidth="0" marginheight="0"></MusicBar>
</div>
<!-- 回到顶部按钮 -->
<div href="#" class="cd-top" v-if="!$common.mobile()" @click="toTop()"></div>
@ -240,14 +240,18 @@
<i class="fa fa-cog iconRotate" aria-hidden="true"></i>
</div>
<div class="my-setting">
<div>
<!-- 音乐按钮 -->
<i class="fa fa-music" title="关闭音乐节省资源" @click="changeAppMusic()" :class="isMusic?'choosed':''"></i>
</div>
<div>
<!-- 太阳按钮 -->
<i v-if="isDark" class="el-icon-sunny iconRotate" @click="changeColor()"></i>
<i v-if="isDark" class="fa fa-sun-o iconRotate" @click="changeColor()"></i>
<!-- 月亮按钮 -->
<i v-else class="fa fa-moon-o" aria-hidden="true" @click="changeColor()"></i>
</div>
<div>
<i class="fa fa-snowflake-o" aria-hidden="true" @click="changeMouseAnimation()"></i>
<i class="fa fa-snowflake-o" :class="mouseAnimation?'iconRotate choosed':''" aria-hidden="true" @click="changeMouseAnimation()"></i>
</div>
</div>
</el-popover>
@ -313,15 +317,7 @@
<!-- 聊天室 -->
<li @click="goIm()">
<div>
<svg viewBox="0 0 1024 1024" width="20" height="20" style="vertical-align: -3px;">
<path
d="M544.54784 628.16768a173.7216 173.7216 0 0 1 0-245.1712l158.6432-159.104a172.50816 172.50816 0 0 1 244.46464 0 173.7216 173.7216 0 0 1 0 245.17632L788.992 628.16768a172.50816 172.50816 0 0 1-244.44416 0z m-325.49888 324.608a173.71648 173.71648 0 0 1 0-245.1712l158.6432-159.104a172.50816 172.50816 0 0 1 244.46464 0 173.71648 173.71648 0 0 1 0 245.1712l-158.63808 159.09376a172.51328 172.51328 0 0 1-244.46976 0z"
fill="#F4CA1C"></path>
<path
d="M415.6416 567.72096a36.58752 36.58752 0 0 1-25.99936-10.80832 215.58272 215.58272 0 0 1-63.52896-149.15072A203.80672 203.80672 0 0 1 385.536 259.072l163.1744-163.7376c80.70656-80.9728 213.86752-79.104 296.82688 4.13696a215.61856 215.61856 0 0 1 63.53408 149.15072 203.776 203.776 0 0 1-59.392 148.67968l-105.2928 101.83168a36.8384 36.8384 0 0 1-51.03616-53.13024l104.79104-101.376a130.12992 130.12992 0 0 0 37.376-94.78144 142.06976 142.06976 0 0 0-41.984-98.21184c-54.30272-54.48192-140.8-56.32-192.82944-4.13696L437.51936 311.26016a130.50368 130.50368 0 0 0-37.888 95.26272 142.08512 142.08512 0 0 0 41.984 98.21184 36.97664 36.97664 0 0 1 0 52.18304 36.58752 36.58752 0 0 1-25.97376 10.8032z m-169.30816 346.34752a214.74304 214.74304 0 0 1-152.20736-63.67232c-82.85184-83.13856-84.81792-216.48384-4.46976-297.472l104.96-110.80704a36.82816 36.82816 0 1 1 53.30432 50.83648l-105.91232 111.79008c-52.0192 52.1984-50.176 138.99264 4.1216 193.47456s140.8 56.32 192.82432 4.13184l163.18976-163.74784a130.47808 130.47808 0 0 0 37.888-95.232 142.09536 142.09536 0 0 0-41.984-98.21696 36.83328 36.83328 0 0 1 51.9936-52.18304 215.6288 215.6288 0 0 1 63.53408 149.15584 203.81184 203.81184 0 0 1-59.392 148.67968L390.95296 854.528a203.08992 203.08992 0 0 1-144.61952 59.54048z"
fill="#595BB3"></path>
</svg>
<span>&nbsp;社交</span>
<span>🎠生活</span>
</div>
</li>
<!-- 微言 -->
@ -394,6 +390,11 @@
<span>&nbsp;留言</span>
</div>
</li>
<li @click="smallMenu({path: '/bangumi'})">
<div>
<span>🔮&nbsp;追番</span>
</div>
</li>
<!-- 友人帐 -->
<li @click="smallMenu({path: '/friend'})">
<div>
@ -458,206 +459,227 @@
<script>
import mousedown from '../utils/mousedown';
import MusicBar from './common/musicBar.vue';
export default {
data() {
return {
toolButton: false,
hoverEnter: false,
mouseAnimation: false,
isDark: false,
scrollTop: 0,
toolbarDrawer: false,
mobile: false
}
return {
toolButton: false,
hoverEnter: false,
mouseAnimation: false,
isDark: false,
isMusic: true,
scrollTop: 0,
toolbarDrawer: false,
mobile: false
};
},
mounted() {
if (this.mouseAnimation) {
mousedown();
}
window.addEventListener("scroll", this.onScrollPage);
if (this.isDaylight()) {
this.isDark = true;
let root = document.querySelector(":root");
root.style.setProperty("--background", "#272727");
root.style.setProperty("--fontColor", "white");
root.style.setProperty("--borderColor", "#4F4F4F");
root.style.setProperty("--borderHoverColor", "black");
root.style.setProperty("--articleFontColor", "#E4E4E4");
root.style.setProperty("--articleGreyFontColor", "#D4D4D4");
root.style.setProperty("--commentContent", "#D4D4D4");
}
if (this.mouseAnimation) {
mousedown();
}
window.addEventListener("scroll", this.onScrollPage);
if (this.isDaylight()) {
this.isDark = true;
let root = document.querySelector(":root");
root.style.setProperty("--background", "#272727");
root.style.setProperty("--fontColor", "white");
root.style.setProperty("--borderColor", "#4F4F4F");
root.style.setProperty("--borderHoverColor", "black");
root.style.setProperty("--articleFontColor", "#E4E4E4");
root.style.setProperty("--articleGreyFontColor", "#D4D4D4");
root.style.setProperty("--commentContent", "#D4D4D4");
}
},
destroyed() {
window.removeEventListener("scroll", this.onScrollPage);
window.removeEventListener("scroll", this.onScrollPage);
},
watch: {
scrollTop(scrollTop, oldScrollTop) {
//
let enter = scrollTop > window.innerHeight / 2;
const top = scrollTop - oldScrollTop < 0;
let isShow = scrollTop - window.innerHeight > 30;
this.toolButton = isShow;
if (isShow && !this.$common.mobile()) {
if (window.innerHeight > 950) {
$(".cd-top").css("top", "0");
} else {
$(".cd-top").css("top", window.innerHeight - 950 + "px");
}
} else if (!isShow && !this.$common.mobile()) {
$(".cd-top").css("top", "-900px");
}
//
scrollTop(scrollTop, oldScrollTop) {
//
let enter = scrollTop > window.innerHeight / 2;
const top = scrollTop - oldScrollTop < 0;
let isShow = scrollTop - window.innerHeight > 30;
this.toolButton = isShow;
if (isShow && !this.$common.mobile()) {
if (window.innerHeight > 950) {
$(".cd-top").css("top", "0");
}
else {
$(".cd-top").css("top", window.innerHeight - 950 + "px");
}
}
else if (!isShow && !this.$common.mobile()) {
$(".cd-top").css("top", "-900px");
}
//
let toolbarStatus = {
enter: enter,
visible: top,
};
this.$store.commit("changeToolbarStatus", toolbarStatus);
},
},
created() {
let toolbarStatus = {
enter: enter,
visible: top,
enter: false,
visible: true,
};
this.$store.commit("changeToolbarStatus", toolbarStatus);
},
},
created() {
let toolbarStatus = {
enter: false,
visible: true,
};
this.$store.commit("changeToolbarStatus", toolbarStatus);
this.getWebInfo();
this.getSortInfo();
this.mobile = document.body.clientWidth < 920;
window.addEventListener('resize', () => {
let docWidth = document.body.clientWidth;
if (docWidth < 920) {
this.mobile = true;
} else {
this.mobile = false;
}
});
this.getWebInfo();
this.getSortInfo();
this.mobile = document.body.clientWidth < 920;
window.addEventListener("resize", () => {
let docWidth = document.body.clientWidth;
if (docWidth < 920) {
this.mobile = true;
}
else {
this.mobile = false;
}
});
},
computed: {
toolbar() {
return this.$store.state.toolbar;
}
toolbar() {
return this.$store.state.toolbar;
}
},
methods: {
smallMenu(data) {
this.$router.push(data)
this.toolbarDrawer = false;
},
smallMenuLogout() {
this.logout();
this.toolbarDrawer = false;
},
goIm() {
if (this.$common.isEmpty(this.$store.state.currentUser)) {
this.$message({
message: "请先登录!",
type: "error"
});
} else {
let userToken = this.$common.encrypt(localStorage.getItem("userToken"));
window.open(this.$constant.imBaseURL + "?userToken=" + userToken);
}
},
logout() {
this.$http.get(this.$constant.baseURL + "/user/logout")
.then((res) => {
})
.catch((error) => {
this.$message({
message: error.message,
type: "error"
});
});
this.$store.commit("loadCurrentUser", {});
localStorage.removeItem("userToken");
this.$router.push({path: '/'});
},
getWebInfo() {
this.$http.get(this.$constant.baseURL + "/webInfo/getWebInfo")
.then((res) => {
if (!this.$common.isEmpty(res.data)) {
this.$store.commit("loadWebInfo", res.data);
smallMenu(data) {
this.$router.push(data);
this.toolbarDrawer = false;
},
smallMenuLogout() {
this.logout();
this.toolbarDrawer = false;
},
goIm() {
if (this.$common.isEmpty(this.$store.state.currentUser)) {
this.$message({
message: "请先登录!",
type: "error"
});
}
else {
this.$router.push({ path: "/izone" });
// let userToken = this.$common.encrypt(localStorage.getItem("userToken"));
// window.open(this.$constant.imBaseURL + "?userToken=" + userToken);
}
})
.catch((error) => {
this.$message({
message: error.message,
type: "error"
},
logout() {
this.$http.get(this.$constant.baseURL + "/user/logout")
.then((res) => {
})
.catch((error) => {
this.$message({
message: error.message,
type: "error"
});
});
});
},
getSortInfo() {
this.$http.get(this.$constant.baseURL + "/webInfo/getSortInfo")
.then((res) => {
if (!this.$common.isEmpty(res.data)) {
this.$store.commit("loadSortInfo", res.data);
this.$store.commit("loadCurrentUser", {});
localStorage.removeItem("userToken");
this.$router.push({ path: "/" });
},
getWebInfo() {
this.$http.get(this.$constant.baseURL + "/webInfo/getWebInfo")
.then((res) => {
if (!this.$common.isEmpty(res.data)) {
this.$store.commit("loadWebInfo", res.data);
}
})
.catch((error) => {
this.$message({
message: error.message,
type: "error"
});
});
},
getSortInfo() {
this.$http.get(this.$constant.baseURL + "/webInfo/getSortInfo")
.then((res) => {
if (!this.$common.isEmpty(res.data)) {
this.$store.commit("loadSortInfo", res.data);
}
})
.catch((error) => {
this.$message({
message: error.message,
type: "error"
});
});
},
changeAppMusic() {
this.isMusic = !this.isMusic;
if (this.isMusic) {
$(this.$refs.appMusic).load("/v/JMusic/#/?bottom=true&playlist=3226523716&height=64px&shakeheight=200px");
}
else {
}
},
changeColor() {
this.isDark = !this.isDark;
let root = document.querySelector(":root");
if (this.isDark) {
root.style.setProperty("--background", "#272727");
root.style.setProperty("--fontColor", "white");
root.style.setProperty("--borderColor", "#4F4F4F");
root.style.setProperty("--borderHoverColor", "black");
root.style.setProperty("--articleFontColor", "#E4E4E4");
root.style.setProperty("--articleGreyFontColor", "#D4D4D4");
root.style.setProperty("--commentContent", "#D4D4D4");
}
})
.catch((error) => {
this.$message({
message: error.message,
type: "error"
else {
root.style.setProperty("--background", "white");
root.style.setProperty("--fontColor", "black");
root.style.setProperty("--borderColor", "rgba(0, 0, 0, 0.5)");
root.style.setProperty("--borderHoverColor", "rgba(110, 110, 110, 0.4)");
root.style.setProperty("--articleFontColor", "#1F1F1F");
root.style.setProperty("--articleGreyFontColor", "#616161");
root.style.setProperty("--commentContent", "#F7F9FE");
}
},
toTop() {
window.scrollTo({
top: 0,
behavior: "smooth"
});
});
},
changeColor() {
this.isDark = !this.isDark;
let root = document.querySelector(":root");
if (this.isDark) {
root.style.setProperty("--background", "#272727");
root.style.setProperty("--fontColor", "white");
root.style.setProperty("--borderColor", "#4F4F4F");
root.style.setProperty("--borderHoverColor", "black");
root.style.setProperty("--articleFontColor", "#E4E4E4");
root.style.setProperty("--articleGreyFontColor", "#D4D4D4");
root.style.setProperty("--commentContent", "#D4D4D4");
} else {
root.style.setProperty("--background", "white");
root.style.setProperty("--fontColor", "black");
root.style.setProperty("--borderColor", "rgba(0, 0, 0, 0.5)");
root.style.setProperty("--borderHoverColor", "rgba(110, 110, 110, 0.4)");
root.style.setProperty("--articleFontColor", "#1F1F1F");
root.style.setProperty("--articleGreyFontColor", "#616161");
root.style.setProperty("--commentContent", "#F7F9FE");
}
},
toTop() {
window.scrollTo({
top: 0,
behavior: "smooth"
});
},
onScrollPage() {
this.scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
},
isDaylight() {
let currDate = new Date();
if (currDate.getHours() > 22 || currDate.getHours() < 7) {
return true;
} else {
return false;
}
},
changeMouseAnimation() {
this.mouseAnimation = !this.mouseAnimation;
if (this.mouseAnimation) {
this.$nextTick(() => {
mousedown();
});
},
onScrollPage() {
this.scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
},
isDaylight() {
let currDate = new Date();
if (currDate.getHours() > 22 || currDate.getHours() < 7) {
return true;
}
else {
return false;
}
},
changeMouseAnimation() {
this.mouseAnimation = !this.mouseAnimation;
if (this.mouseAnimation) {
this.$nextTick(() => {
mousedown();
});
}
}
}
}
}
},
components: { MusicBar }
}
</script>
<style scoped>
#appMusic{
width: 100%;
max-width: 400px;
height: 400px;
position: fixed;
pointer-events: none;
animation: hideToShow 0.6s ease-in-out;
bottom: 0;
z-index: 2;
}
.toolbar-content {
width: 100%;
height: 60px;
@ -671,8 +693,8 @@
}
.toolbar-content.enter {
background: var(--toolbarBackground);
color: var(--toolbarFont);
background: var(--background);
color: var(--font);
box-shadow: 0 1px 3px 0 rgba(0, 34, 77, 0.05);
}
@ -781,7 +803,9 @@
.my-setting i:hover {
color: var(--themeBackground);
}
.my-setting i.choosed{
color: var(--themeBackground);
}
.cd-top {
background: var(--toTop) no-repeat center;
position: fixed;

@ -39,7 +39,7 @@
<div class="page-container-wrap">
<div class="page-container">
<div class="aside-content" v-if="showAside">
<myAside></myAside>
<myAside class="aside-content-myAside"></myAside>
</div>
<div class="recent-posts">
<div class="announcement background-opacity">
@ -97,7 +97,7 @@
current: 1,
size: 10,
total: 0,
searchKey: ""
searchKey: "玩客云"
},
guShi: {
"content": "",
@ -109,16 +109,27 @@
};
},
watch: {},
created() {
this.getGuShi();
this.getArticles();
// this.getArticles();
},
mounted() {
// this.$store.commit("changePlaylist", 7463646845)
},
watch: {
//
"$route.query.searchKey": {
immediate: true,
handler() {
this.articles = [];
this.pagination.searchKey = this.$route.query.searchKey;
this.getArticles();
},
},
},
methods: {
pageArticles() {
this.pagination.current = this.pagination.current + 1;
@ -292,12 +303,14 @@
.page-container-wrap {
background: var(--background);
position: relative;
transition: .5s;
}
.page-container {
display: flex;
justify-content: center;
width: 90%;
max-width: 1280px;
padding: 0 20px 40px 20px;
margin: 0 auto;
flex-direction: row;
@ -354,7 +367,10 @@
cursor: pointer;
text-align: center;
}
.aside-content-myAside{
position: sticky;
top: 10px;
}
.pagination:hover {
border: 1px solid var(--themeBackground);
color: var(--themeBackground);

@ -0,0 +1,406 @@
<template>
<div>
<loader :loading="loading">
<!-- 加载页面 -->
<template slot="loader">
<div>
<zombie></zombie>
</div>
</template>
<!-- 内容页面 -->
<template slot="body">
<!-- 首页图片 -->
<el-image style="animation: header-effect 2s"
class="background-image"
v-once
:src="$constant.background.view_random"
fit="cover">
<div slot="error" class="image-slot background-image-error"></div>
</el-image>
<!-- 首页文字 -->
<div class="signature-wall myCenter my-animation-hideToShow">
<h1 class="playful">
<span v-for="(a, index) in '💎我的空间💎'" :key="index">{{a}}</span>
</h1>
<div class="printer" @click="getGuShi()">
<printer :printerInfo="printerInfo">
<template slot="paper" slot-scope="scope">
<h3>
{{ scope.content }}<span class="cursor">|</span>
</h3>
</template>
</printer>
</div>
<div id="bannerWave1"></div>
<div id="bannerWave2"></div>
<i class="el-icon-arrow-down" @click="navigation('.page-container-wrap')"></i>
</div>
<!-- 首页内容 -->
<div class="page-container-wrap">
<div class="page-container">
<div class="aside-content" v-if="showAside">
<myAside class="aside-content-myAside"></myAside>
</div>
<div class="recent-posts" >
<div class="announcement background-opacity">
<i class="fa fa-volume-up" aria-hidden="true"></i>
<div>
<div v-for="(notice, index) in $store.state.webInfo.notices" :key="index">
{{ notice }}
</div>
</div>
</div>
<div ref="pictureList">
<shuoshuo v-for="item in articles" :key="item" :source = "item"></shuoshuo>
</div>
<!-- -->
<div class="pagination-wrap">
<div @click="pageArticles()" class="pagination" v-if="pagination.total !== articles.length">
下一页
</div>
<div v-else style="user-select: none">
~~到底啦~~
</div>
</div>
</div>
</div>
</div>
<!-- 页脚 -->
<div style="background: var(--background)">
<myFooter></myFooter>
</div>
</template>
</loader>
</div>
</template>
<script>
const loader = () => import( "./common/loader");
const zombie = () => import( "./common/zombie");
const printer = () => import( "./common/printer");
const shuoshuo = () => import( "./common/shuoshuo");
const myFooter = () => import( "./common/myFooter");
const myAside = () => import( "./myAside");
export default {
components: {
loader,
zombie,
printer,
myFooter,
shuoshuo,
myAside
},
data() {
return {
loading: false,
showAside: true,
printerInfo: "你看对面的青山多漂亮",
pagination: {
current: 1,
size: 10,
total: 0,
searchKey: ""
},
guShi: {
"content": "",
"origin": "",
"author": "",
"category": ""
},
articles: []
};
},
watch: {},
created() {
this.getGuShi();
this.getArticles();
},
mounted() {
this.$store.commit("changePlaylist", 370417370);
},
methods: {
pageArticles() {
this.pagination.current = this.pagination.current + 1;
this.getArticles();
},
getArticles() {
this.$http.post(this.$constant.baseURL + "/diary/listArticle", this.pagination)
.then((res) => {
if (!this.$common.isEmpty(res.data)) {
this.articles = this.articles.concat(res.data.records);
this.pagination.total = res.data.total;
}
})
.catch((error) => {
this.$message({
message: error.message,
type: "error"
});
});
},
navigation(selector) {
let pageId = document.querySelector(selector);
window.scrollTo({
top: pageId.offsetTop,
behavior: "smooth"
});
},
getGuShi() {
let that = this;
let xhr = new XMLHttpRequest();
xhr.open('get', this.$constant.jinrishici);
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
that.guShi = JSON.parse(xhr.responseText);
that.printerInfo = that.guShi.content;
}
};
xhr.send();
}
}
}
</script>
<style scoped>
.signature-wall {
/* 向下排列 */
display: flex;
flex-direction: column;
position: relative;
user-select: none;
height: 100vh;
overflow: hidden;
}
.playful {
color: var(--white);
font-size: 40px;
}
/*.playful span {*/
/* position: relative;*/
/* color: #5362f6;*/
/* text-shadow: 0.25px 0.25px #e485f8, 0.5px 0.5px #e485f8, 0.75px 0.75px #e485f8,*/
/* 1px 1px #e485f8, 1.25px 1.25px #e485f8, 1.5px 1.5px #e485f8, 1.75px 1.75px #e485f8,*/
/* 2px 2px #e485f8, 2.25px 2.25px #e485f8, 2.5px 2.5px #e485f8, 2.75px 2.75px #e485f8,*/
/* 3px 3px #e485f8, 3.25px 3.25px #e485f8, 3.5px 3.5px #e485f8, 3.75px 3.75px #e485f8,*/
/* 4px 4px #e485f8, 4.25px 4.25px #e485f8, 4.5px 4.5px #e485f8, 4.75px 4.75px #e485f8,*/
/* 5px 5px #e485f8, 5.25px 5.25px #e485f8, 5.5px 5.5px #e485f8, 5.75px 5.75px #e485f8,*/
/* 6px 6px #e485f8;*/
/* animation: scatter 1.75s infinite;*/
/* font-weight: normal;*/
/*}*/
/*.playful span:nth-child(2n) {*/
/* color: #ed625c;*/
/* text-shadow: 0.25px 0.25px #f2a063, 0.5px 0.5px #f2a063, 0.75px 0.75px #f2a063,*/
/* 1px 1px #f2a063, 1.25px 1.25px #f2a063, 1.5px 1.5px #f2a063, 1.75px 1.75px #f2a063,*/
/* 2px 2px #f2a063, 2.25px 2.25px #f2a063, 2.5px 2.5px #f2a063, 2.75px 2.75px #f2a063,*/
/* 3px 3px #f2a063, 3.25px 3.25px #f2a063, 3.5px 3.5px #f2a063, 3.75px 3.75px #f2a063,*/
/* 4px 4px #f2a063, 4.25px 4.25px #f2a063, 4.5px 4.5px #f2a063, 4.75px 4.75px #f2a063,*/
/* 5px 5px #f2a063, 5.25px 5.25px #f2a063, 5.5px 5.5px #f2a063, 5.75px 5.75px #f2a063,*/
/* 6px 6px #f2a063;*/
/* animation-delay: 0.3s;*/
/*}*/
/*.playful span:nth-child(3n) {*/
/* color: #ffd913;*/
/* text-shadow: 0.25px 0.25px #6ec0a9, 0.5px 0.5px #6ec0a9, 0.75px 0.75px #6ec0a9,*/
/* 1px 1px #6ec0a9, 1.25px 1.25px #6ec0a9, 1.5px 1.5px #6ec0a9, 1.75px 1.75px #6ec0a9,*/
/* 2px 2px #6ec0a9, 2.25px 2.25px #6ec0a9, 2.5px 2.5px #6ec0a9, 2.75px 2.75px #6ec0a9,*/
/* 3px 3px #6ec0a9, 3.25px 3.25px #6ec0a9, 3.5px 3.5px #6ec0a9, 3.75px 3.75px #6ec0a9,*/
/* 4px 4px #6ec0a9, 4.25px 4.25px #6ec0a9, 4.5px 4.5px #6ec0a9, 4.75px 4.75px #6ec0a9,*/
/* 5px 5px #6ec0a9, 5.25px 5.25px #6ec0a9, 5.5px 5.5px #6ec0a9, 5.75px 5.75px #6ec0a9,*/
/* 6px 6px #6ec0a9;*/
/* animation-delay: 0.15s;*/
/*}*/
/*.playful span:nth-child(5n) {*/
/* color: #555bff;*/
/* text-shadow: 0.25px 0.25px #e485f8, 0.5px 0.5px #e485f8, 0.75px 0.75px #e485f8,*/
/* 1px 1px #e485f8, 1.25px 1.25px #e485f8, 1.5px 1.5px #e485f8, 1.75px 1.75px #e485f8,*/
/* 2px 2px #e485f8, 2.25px 2.25px #e485f8, 2.5px 2.5px #e485f8, 2.75px 2.75px #e485f8,*/
/* 3px 3px #e485f8, 3.25px 3.25px #e485f8, 3.5px 3.5px #e485f8, 3.75px 3.75px #e485f8,*/
/* 4px 4px #e485f8, 4.25px 4.25px #e485f8, 4.5px 4.5px #e485f8, 4.75px 4.75px #e485f8,*/
/* 5px 5px #e485f8, 5.25px 5.25px #e485f8, 5.5px 5.5px #e485f8, 5.75px 5.75px #e485f8,*/
/* 6px 6px #e485f8;*/
/* animation-delay: 0.4s;*/
/*}*/
/*.playful span:nth-child(7n) {*/
/* color: #ff9c55;*/
/* text-shadow: 0.25px 0.25px #ff5555, 0.5px 0.5px #ff5555, 0.75px 0.75px #ff5555,*/
/* 1px 1px #ff5555, 1.25px 1.25px #ff5555, 1.5px 1.5px #ff5555, 1.75px 1.75px #ff5555,*/
/* 2px 2px #ff5555, 2.25px 2.25px #ff5555, 2.5px 2.5px #ff5555, 2.75px 2.75px #ff5555,*/
/* 3px 3px #ff5555, 3.25px 3.25px #ff5555, 3.5px 3.5px #ff5555, 3.75px 3.75px #ff5555,*/
/* 4px 4px #ff5555, 4.25px 4.25px #ff5555, 4.5px 4.5px #ff5555, 4.75px 4.75px #ff5555,*/
/* 5px 5px #ff5555, 5.25px 5.25px #ff5555, 5.5px 5.5px #ff5555, 5.75px 5.75px #ff5555,*/
/* 6px 6px #ff5555;*/
/* animation-delay: 0.25s;*/
/*}*/
.printer {
cursor: pointer;
color: var(--white);
background: var(--translucent);
border-radius: 10px;
padding-left: 10px;
padding-right: 10px;
}
#bannerWave1 {
height: 84px;
background: var(--bannerWave1);
position: absolute;
width: 200%;
bottom: 0;
z-index: 10;
animation: gradientBG 120s linear infinite;
}
#bannerWave2 {
height: 100px;
background: var(--bannerWave2);
position: absolute;
width: 400%;
bottom: 0;
z-index: 5;
animation: gradientBG 120s linear infinite;
}
/* 光标 */
.cursor {
margin-left: 1px;
animation: hideToShow 0.7s infinite;
font-weight: 200;
}
.el-icon-arrow-down {
font-size: 40px;
font-weight: bold;
color: var(--white);
position: absolute;
bottom: 60px;
animation: my-shake 1.5s ease-out infinite;
z-index: 15;
cursor: pointer;
}
.page-container-wrap {
background: var(--background);
position: relative;
transition: .5s;
}
.page-container {
display: flex;
justify-content: center;
width: 90%;
max-width: 1280px;
padding: 0 20px 40px 20px;
margin: 0 auto;
flex-direction: row;
}
.recent-posts {
width: 70%;
}
.announcement {
padding: 22px;
border: 1px dashed var(--lightGray);
color: var(--greyFont);
border-radius: 10px;
display: flex;
max-width: 780px;
margin: 40px auto 40px;
}
.announcement i {
color: var(--themeBackground);
font-size: 22px;
margin: auto 0;
animation: scale 0.8s ease-in-out infinite;
}
.announcement div div {
margin-left: 20px;
line-height: 30px;
}
.aside-content {
width: calc(30% - 40px);
user-select: none;
margin-top: 40px;
margin-right: 40px;
max-width: 300px;
float: right;
}
.pagination-wrap {
display: flex;
justify-content: center;
margin-top: 40px;
}
.pagination {
padding: 13px 15px;
border: 1px solid var(--lightGray);
border-radius: 3rem;
color: var(--greyFont);
width: 100px;
user-select: none;
cursor: pointer;
text-align: center;
}
.aside-content-myAside{
position: sticky;
top: 10px;
}
.pagination:hover {
border: 1px solid var(--themeBackground);
color: var(--themeBackground);
box-shadow: 0 0 5px var(--themeBackground);
}
@media screen and (max-width: 1100px) {
.recent-posts {
width: 100%;
}
.page-container {
width: 100%;
}
}
@media screen and (max-width: 1000px) {
.page-container {
/* 文章栏与侧标栏垂直排列 */
flex-direction: column;
}
.aside-content {
width: 100%;
max-width: unset;
float: unset;
margin: 40px auto 0;
}
}
@media screen and (max-width: 768px) {
h1 {
font-size: 35px;
}
}
</style>

@ -3,8 +3,7 @@
<div>
<el-image style="animation: header-effect 2s"
class="background-image"
v-once
:src="$constant.random_image+new Date()+Math.floor(Math.random()*10)"
:src="$constant.random_image"
fit="cover">
<div slot="error" class="image-slot background-image-error"></div>
</el-image>

@ -1,5 +1,12 @@
<template>
<div>
<!-- 搜索框 -->
<div class="card-content0">
<form @submit.prevent="goSearch()">
<input type="text" v-model="searchKey" placeholder="搜索从这里开始...">
<button type="submit"></button>
</form>
</div>
<!-- 网站信息 -->
<div class="card-content1 shadow-box background-opacity">
<el-avatar style="margin-top: 20px" class="user-avatar" :size="120" :src="webInfo.avatar"></el-avatar>
@ -14,9 +21,18 @@
<span class="blog-info-num">{{ sortInfo.length }}</span>
</div>
</div>
<div class="more-cannal">
<a ks-text="Github" ks-tag="top" href="https://github.com/janxland" target="_blank" ><i class="fa fa-github" style="background-color: #000;" aria-hidden="true"></i></a>
<a ks-text="Twitter" ks-tag="top" href="" target="_blank"><i class="fa fa-twitter" style="background-color: #1d9bf0;" aria-hidden="true"></i></a>
<a ks-text="" ks-tag="top" href="" target="_blank"><i class="fa fa-wechat" style="background-color: #1aad19;" aria-hidden="true"></i></a>
<a ks-text="Bilibili" ks-tag="top" href="https://space.bilibili.com/11363292" target="_blank"><svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" style="background-color: #f25d8e"><path d="M777.514667 131.669333a53.333333 53.333333 0 0 1 0 75.434667L728.746667 255.829333h49.92A160 160 0 0 1 938.666667 415.872v320a160 160 0 0 1-160 160H245.333333A160 160 0 0 1 85.333333 735.872v-320a160 160 0 0 1 160-160h49.749334L246.4 207.146667a53.333333 53.333333 0 1 1 75.392-75.434667l113.152 113.152c3.370667 3.370667 6.186667 7.04 8.448 10.965333h137.088c2.261333-3.925333 5.12-7.68 8.490667-11.008l113.109333-113.152a53.333333 53.333333 0 0 1 75.434667 0z m1.152 231.253334H245.333333a53.333333 53.333333 0 0 0-53.205333 49.365333l-0.128 4.010667v320c0 28.117333 21.76 51.157333 49.365333 53.162666l3.968 0.170667h533.333334a53.333333 53.333333 0 0 0 53.205333-49.365333l0.128-3.968v-320c0-29.44-23.893333-53.333333-53.333333-53.333334z m-426.666667 106.666666c29.44 0 53.333333 23.893333 53.333333 53.333334v53.333333a53.333333 53.333333 0 1 1-106.666666 0v-53.333333c0-29.44 23.893333-53.333333 53.333333-53.333334z m320 0c29.44 0 53.333333 23.893333 53.333333 53.333334v53.333333a53.333333 53.333333 0 1 1-106.666666 0v-53.333333c0-29.44 23.893333-53.333333 53.333333-53.333334z" fill="#fff"></path></svg></a>
<a ks-text="QQ🐧" ks-tag="top" href="" target="_blank"><i class="fa fa-qq" style="background-color: #12b7f5;"></i></a>
<a ks-text="RSS" ks-tag="top" href="" target="_blank"><i class="fa fa-rss" style="background-color: #ff9800"></i></a>
</div>
<a class="collection-btn" @click="showTip()">
<i class="el-icon-star-off" style="margin-right: 2px"></i>朋友圈
</a>
</div>
<!-- 分类 -->
<div class="shadow-box background-opacity wow"
@ -68,6 +84,7 @@
</template>
<script>
import {navigation} from '../utils/tools.js'
export default {
data() {
return {
@ -76,6 +93,7 @@
size: 5,
recommendStatus: true
},
searchKey:"",
recommendArticles: []
}
},
@ -107,12 +125,60 @@
},
showTip() {
this.$router.push({path: '/weiYan'});
}
},
goSearch(){
this.$router.push({query: {searchKey:this.searchKey}})
this.$nextTick(()=>{
this.navigation('.page-container-wrap');
})
},
navigation(selector) {
let pageId = document.querySelector(selector);
window.scrollTo({
top: pageId.offsetTop,
behavior: "smooth"
});
},
}
}
</script>
<style scoped>
.card-content0{
}
.card-content0 {
transition: .3s;
background-color: var(--background);
}
.card-content0 input {
transition: .3s;
width: 100%;
height: 42px;
padding-left: 10px;
background-color: var(--background);
border: 2px solid #7BA7AB;
border-radius: 5px;
outline: none;
color: var(--fontColor);
}
.card-content0 button {
position: absolute;
top: 0;
right: 0px;
width: 42px;
height: 42px;
border: none;
background: #7BA7AB;
border-radius: 0 5px 5px 0;
cursor: pointer;
}
.card-content0 button:before {
transition: .3s;
content: "\f002";
font-family: FontAwesome;
font-size: 16px;
color: var(--fontColor);
}
.card-content1 {
background: linear-gradient(-45deg, #e8d8b9, #eccec5, #a3e9eb, #bdbdf0, #eec1ea);
background-size: 400% 400%;
@ -120,7 +186,7 @@
display: flex;
flex-direction: column;
align-items: center;
margin-bottom: 40px;
margin: 10px 0;
border-radius: 10px;
position: relative;
/*color: var(--white);*/
@ -154,7 +220,19 @@
.blog-info-num {
margin-top: 12px;
}
.more-cannal {
justify-content: space-around;
display: flex;
width: 80%;
margin-top:12px ;
}
.more-cannal svg, .more-cannal i{
text-align: center;
color: #FFF;
width: 2em;
padding: .5em;
border-radius: 1em;
}
.collection-btn {
position: relative;
margin-top: 12px;

@ -4,7 +4,6 @@
<div class="my-animation-slide-top">
<twoPoem></twoPoem>
</div>
<div style="background: var(--background);padding-top: 40px;" class="my-animation-slide-bottom">
<!-- 标签 -->
<div class="sort-warp shadow-box" v-if="!$common.isEmpty(sort) && !$common.isEmpty(sort.labels)">

@ -82,7 +82,7 @@
},
mounted() {
this.$store.commit("changePlaylist", 2540031947);
},
methods: {

@ -7,6 +7,8 @@ import http from './utils/request'
import common from './utils/common'
import constant from './utils/constant'
import mavonEditor from 'mavon-editor'
//引入json配置
import EMOJI from './assets/json/emoji.json'
//引入js
//import './utils/live2d'
import './utils/title'
@ -28,15 +30,35 @@ Vue.directive("ripple", Ripple)
Vue.use(ElementUI)
Vue.use(vueBaberrage)
Vue.use(mavonEditor)
Vue.use(store)
Vue.prototype.EMOJI = EMOJI
Vue.prototype.$http = http
Vue.prototype.$common = common
Vue.prototype.$constant = constant
Vue.config.productionTip = false
top.faceReg = common.faceReg;
// import 'viewerjs/dist/viewer.css'
// import VueViewer from 'v-viewer'
// Vue.use(VueViewer)
new Vue({
const app = new Vue({
router,
store,
render: h => h(App)
}).$mount('#app')
Vue.prototype.ipData = {}
fetch("//ip-api.com/json/?lang=zh-CN").then((e=>e.json())).then((e=>{
let a = JSON.stringify(e);
localStorage.setItem("ipData", a);
Vue.prototype.ipData = e;
Vue.prototype.$message({
type: 'success',
message: `欢迎IP:${e.query},来自${e.country}${e.regionName}${e.city}的朋友!`
});
}))
console.log('%c hello world! \n Print by Roginshin. ',
'background: #ed556a;line-height:50px;font-size:24px; color: #f6cec1');

@ -36,6 +36,14 @@ const routes = [
path: "/friend",
name: "friend",
component: () => import('../components/friend')
},{
path: "/bangumi",
name: "bangumi",
component: () => import('../components/bangumi')
},{
path: "/izone",
name: "izone",
component: () => import('../components/izone')
}, {
path: "/about",
name: "about",
@ -71,6 +79,10 @@ const routes = [
path: '/postList',
name: 'postList',
component: () => import('../components/admin/postList')
}, {
path: '/postShuoshuo',
name: 'postShuoshuo',
component: () => import('../components/admin/postShuoshuo')
}, {
path: '/postEdit',
name: 'postEdit',

@ -20,7 +20,8 @@ export default new Vuex.Store({
footer: "",
backgroundImage: "",
avatar: ""
}
},
playlist:3226523716
},
getters: {
articleTotal: state => {
@ -53,6 +54,9 @@ export default new Vuex.Store({
}
},
mutations: {
changePlaylist(state, playlist){
state.playlist = playlist
},
changeToolbarStatus(state, toolbarState) {
state.toolbar = toolbarState;
},

@ -0,0 +1,200 @@
export const getShowByIds = function (data, callback) {
$.ajax({
url: `/ablaze/get/works/ids/${data.point}`,
type: "get",
data: data,
async: true,
success: function (data) {
callback(data);
}
});
}
export const getShow = function (data, callback) {
$.ajax({
url: '/ablaze/get/works/'+data.point,
type: "get",
data: data,
async: true,
success: function (data) {
callback(data);
}
});
}
export const getComments = function (data, callback){
$.ajax({
url : `/ablaze/get/comments/${data.type}/${data.wid}/${data.fid}/${data.start}/${data.num}`,
type : "get",
async : true,
success : function(data) {
callback(data);
}
});
}
export const addComment = function(data, callback){
$.ajax({
url : `/ablaze/insert/comment`,
type : "post",
headers: {
Authorization: window.localStorage.getItem("token")
},
data:data,
async : true,
success : function(data) {
callback(data);
}
});
}
export const getWork = function(data, callback){
$.ajax({
url : `/ablaze/get/work/${data.point}/${data.id}`,
type : "get",
data:data,
async : true,
success : function(data) {
callback(data);
}
});
}
/**
*
* @param {*} data
* @param {*} callback
*/
export const actWork = function(data, callback){
$.ajax({
url : `/ablaze/act/work/${data.point}/${data.wid}/${data.act}`,
type : "post",
headers: {
Authorization: window.localStorage.getItem("token")
},
async : true,
success : function(data) {
callback(data);
}
});
}
/**
*
* @param {point,start,num,keys} data
* @param {*} callback
*/
export const searchWork = function(data, callback){
$.ajax({
url : `/ablaze/search/works/${data.point}`,
type : "get",
data:data,
async : true,
success : function(data) {
callback(data);
}
});
}
export const getHotKeys = function(data, callback){
$.ajax({
url : `/ablaze/get/keywords/${data.start}/${data.num}/${data.key}`,
type : "get",
async : true,
success : function(data) {
callback(data);
}
});
}
export const getUser = function(data,callback){
$.ajax({
url:`/ablaze/get/user/${data.id}`,
type:"get",
async: true,
success: function (data) {
callback(data);
}
})
}
export const setUserPassword = function(data,callback){
$.ajax({
url : `/ablaze/set/userpassword`,
type : "post",
headers: {
Authorization: window.localStorage.getItem("token")
},
data:data,
async : true,
success : function(data) {
callback(data);
}
});
}
export const updateUser = function(data,callback){
$.ajax({
url : `/ablaze/set/user`,
type : "post",
headers: {
Authorization: window.localStorage.getItem("token")
},
data:data,
async : true,
success : function(data) {
callback(data);
}
});
}
export const updateUserSafe = function(data,callback){
$.ajax({
url : `/ablaze/set/safe/user`,
type : "post",
headers: {
Authorization: window.localStorage.getItem("token")
},
data:data,
async : true,
success : function(data) {
callback(data);
}
});
}
export const followUser = function(data,callback){
$.ajax({
url:`/ablaze/act/user/${data.tid}/${data.act}`,
type:"post",
headers: {
Authorization: window.localStorage.getItem("token")
},
async: true,
success: function (data) {
callback(data);
}
})
}
export let bangu_getCollection = function(data,callback){
let arr = [];
for(var p in data){
if(data.hasOwnProperty(p)){
arr.push(encodeURIComponent(p)+"="+encodeURIComponent(data[p]))
}
};
$.ajax({
url:`/api/common/gethtml?url=${encodeURIComponent("https://api.bgm.tv/v0/users/607071/collections?"+arr.join("&"))}`,
type:"get",
dataType:'json',
async: true,
success: function (data) {
callback(data);
}
})
}
export let bangu_getCollections = function(data,callback){
$.ajax({
url:`/ablaze/gethtml?url=https://api.bgm.tv/user/607071/collections/${data.type}?app_id=bgm191760e15e1785468`,
type:"get",
async: true,
dataType:'json',
success: function (data) {
callback(data);
}
})
}

@ -1,4 +1,5 @@
import constant from "./constant";
import EMOJI from "../assets/json/emoji.json"
import CryptoJS from 'crypto-js';
export default {
@ -50,9 +51,15 @@ export default {
*/
faceReg(content) {
content = content.replace(/\[[^\[^\]]+\]/g, (word) => {
let index = constant.emojiList.indexOf(word.replace("[", "").replace("]", ""));
let arr = [];
EMOJI.forEach(element => {
arr = arr.concat(element.emote);
});
let index = arr.findIndex(function(item) {
return item.text === word;
});
if (index > -1) {
let url = "https://pzh-blog-photo.oss-cn-shenzhen.aliyuncs.com/emoji/q" + (index + 1) + ".gif";
let url = arr[index].url
return '<img style="vertical-align: middle;width: 32px;height: 32px" src="' + url + '" title="' + word + '"/>';
} else {
return word;

@ -1,9 +1,9 @@
export default {
baseURL: "http://localhost:8081",
baseURL: `//${window.location.host}/api`,
imBaseURL: "http://localhost:81",
webURL: "http://localhost",
webURL: `//${window.location.host}/api`,
// baseURL: "https://poetize.cn/api",
// baseURL: "//127.0.0.1:8080/",
// imBaseURL: "https://poetize.cn/im",
// webURL: "https://poetize.cn",
@ -13,13 +13,17 @@ export default {
hitokoto: "https://v1.hitokoto.cn",
tocbot: "https://cdnjs.cloudflare.com/ajax/libs/tocbot/4.11.1/tocbot.min.js",
jinrishici: "https://v1.jinrishici.com/all.json",
random_image: "https://s1.ax1x.com/2022/12/04/zsKgDs.jpg?",
random_backImage_miaomc:"//api.miaomc.cn/image/get?",
random_image: "//img.xjh.me/random_img.php?return=302",
random_avatar:function(name){
return `https://api.multiavatar.com/${name}.svg`
},
//前后端定义的密钥AES使用16位
cryptojs_key: "aoligeimeimaobin",
qiniuUrl: "https://upload.qiniup.com",
qiniuDownload: "$$$$七牛云下载地址",
qiniuUrl: "//upload-z2.qiniup.com",
qiniuDownload: "//qiniu.roginx.ink/",
friendBG: "https://s1.ax1x.com/2022/12/04/zsKgDs.jpg",
friendBG: "//api.ixiaowai.cn/api/api.php",
friendLetterTop: "https://cdn.cbd.int/hexo-butterfly-envelope/lib/before.png",
friendLetterBottom: "https://cdn.cbd.int/hexo-butterfly-envelope/lib/after.png",
friendLetterBiLi: "https://cdn.cbd.int/hexo-butterfly-envelope/lib/line.png",
@ -29,7 +33,7 @@ export default {
tree_hole_color: ["#ee7752", "#e73c7e", "#23a6d5", "#23d5ab", "rgb(131, 123, 199)", "#23d5ab"],
two_poem_image: ["https://s1.ax1x.com/2022/12/04/zsKgDs.jpg",
two_poem_image: ["https://kanokano.cn/wp-content/uploads/topimg/banner.webp",
"https://s1.ax1x.com/2022/12/04/zsKh5V.jpg"],
before_color_1: "black",
@ -38,10 +42,15 @@ export default {
before_color_2: "rgb(131, 123, 199)",
after_color_2: "linear-gradient(45deg, #f43f3b, #ec008c)",
background:{
bangumi:"//mybox-1257251314.cos.ap-chengdu.myqcloud.com/upload/2022/8/29/166176340045213.jpg",
izone:"//mybox-1257251314.cos.ap-chengdu.myqcloud.com/blog/3c5356cb1303.jpg",
day_random:"//api.dujin.org/bing/1920.php",
view_random:"//api.ixiaowai.cn/gqapi/gqapi.php"
},
pageColor: "#ee7752",
commentPageColor: "#23d5ab",
userId: 1,
source: 0,
emojiList: ['衰', '鄙视', '再见', '捂嘴', '皱眉', '奋斗', '白眼', '可怜', '皱眉', '鼓掌', '烦恼', '吐舌', '挖鼻', '委屈', '滑稽', '啊这', '生气', '害羞', '晕', '好色', '流泪', '吐血', '微笑', '酷', '坏笑', '吓', '大兵', '哭笑', '困', '呲牙']
}
}

@ -0,0 +1,42 @@
export const isMobile = function(){
var ua = navigator.userAgent;
var ipad = ua.match(/(iPad).*OS\s([\d_]+)/),
isIphone = /(mobile|mobi|wap|iphone)/i.test(ua),
isAndroid = ua.match(/(Android)\s+([\d.]+)/),
isMobile = isIphone || isAndroid;
if(isMobile) {
return true;
}else{
return false;
}
}
export const navigation = function(selector) {
let pageId = document.querySelector(selector);
window.scrollTo({
top: pageId.offsetTop,
behavior: "smooth"
});
}
export const formatDate = function(date) {
var date = new Date(date);
var YY = date.getFullYear() + '-';
var MM = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-';
var DD = (date.getDate() < 10 ? '0' + (date.getDate()) : date.getDate());
var hh = (date.getHours() < 10 ? '0' + date.getHours() : date.getHours()) + ':';
var mm = (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()) + ':';
var ss = (date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds());
return YY + MM + DD +" "+hh + mm + ss;
}
export const dataURItoBlob = function(dataURI) {//图片转成Buffer
var byteString = atob(dataURI.split(',')[1]);
var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];
var ab = new ArrayBuffer(byteString.length);
var ia = new Uint8Array(ab);
for (var i = 0; i < byteString.length; i++) {
ia[i] = byteString.charCodeAt(i);
}
return new Blob([ab], {type: mimeString});
}

@ -1,5 +1,37 @@
module.exports = {
devServer: {
port: 80
// 代理配置
proxy: {
'/v': {
target: 'http://janxland.xyz/v/',
changeOrigin: true,
headers: {
Host: 'www.janxland.xyz'
},
pathRewrite: {
'/v': ''
}
},
'/api': {
target: 'http://janxland.xyz/ablaze/',
changeOrigin: true,
headers: {
Host: 'www.janxland.xyz'
},
pathRewrite: {
'/api': '/'
}
},
'/mapi163/weapi': {
target: 'http://janxland.xyz/',
changeOrigin: true,
headers: {
Host: 'www.janxland.xyz'
},
pathRewrite: {
'/mapi163/weapi': '/mapi163/weapi'
}
},
}
}
}
}

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save