Compare commits
66 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
022dfd4709 | ||
|
|
71e08aacc3 | ||
|
|
337eca87f2 | ||
|
|
074aceff8f | ||
|
|
cdc6cf229a | ||
|
|
1f33513dc9 | ||
|
|
b095b91ff2 | ||
|
|
454a62dbb9 | ||
|
|
5f7cc12157 | ||
|
|
97ef1ee201 | ||
|
|
a318568b72 | ||
|
|
5bb9949440 | ||
|
|
c33e91d5d0 | ||
|
|
ca65ef3cb7 | ||
|
|
9ebdbc81d0 | ||
|
|
b64985349e | ||
|
|
625fd9d1a4 | ||
|
|
eac5fdcec0 | ||
|
|
970b4d5d97 | ||
|
|
f741bc818d | ||
|
|
5f04c24187 | ||
|
|
a382bef336 | ||
|
|
4ddf28f344 | ||
|
|
0dc650305a | ||
|
|
697093d1c9 | ||
|
|
622f7a4479 | ||
|
|
c4b607804b | ||
|
|
864f008679 | ||
|
|
25f309bcb0 | ||
|
|
1354361ad9 | ||
|
|
8136c7b072 | ||
|
|
c9243e7249 | ||
|
|
1a487da3d9 | ||
|
|
b52395751c | ||
|
|
cfa6cc9a83 | ||
|
|
f203384b00 | ||
|
|
9ac3be455c | ||
|
|
20b74a9dcd | ||
|
|
3b848a5a86 | ||
|
|
a9b5e865a5 | ||
|
|
ab46a1b99d | ||
|
|
4a08465f5b | ||
|
|
a7960d6cd6 | ||
|
|
3caea77dde | ||
|
|
fdaa3b7f93 | ||
|
|
4f433b4456 | ||
|
|
309a9ad4fb | ||
|
|
b0e7431e72 | ||
|
|
158118d183 | ||
|
|
382e37fc5a | ||
|
|
3390676847 | ||
|
|
544a995312 | ||
|
|
f209d49bb5 | ||
|
|
42ed691fdc | ||
|
|
98d2e9d266 | ||
|
|
6111158896 | ||
|
|
3267fc653c | ||
|
|
7250608767 | ||
|
|
e82063e435 | ||
|
|
6d4c44bc25 | ||
|
|
2bc94d8792 | ||
|
|
4ca3edd789 | ||
|
|
d6859efde2 | ||
|
|
3f8cbfa259 | ||
|
|
5d18c9371d | ||
|
|
631990e3bb |
@@ -37,7 +37,9 @@
|
|||||||
<div class="part bottom">
|
<div class="part bottom">
|
||||||
<span class="bottom-span clickable" @click="openHelp">Справка</span>
|
<span class="bottom-span clickable" @click="openHelp">Справка</span>
|
||||||
<span class="bottom-span clickable" @click="openDonate">Помочь проекту</span>
|
<span class="bottom-span clickable" @click="openDonate">Помочь проекту</span>
|
||||||
<span class="bottom-span">{{ version }}</span>
|
|
||||||
|
<span v-if="version == clientVersion" class="bottom-span">v{{ version }}</span>
|
||||||
|
<span v-else class="bottom-span">Версия сервера {{ version }}, версия клиента {{ clientVersion }}, необходимо обновить страницу</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<PasteTextPage v-if="pasteTextActive" ref="pasteTextPage" @paste-text-toggle="pasteTextToggle" @load-buffer="loadBuffer"></PasteTextPage>
|
<PasteTextPage v-if="pasteTextActive" ref="pasteTextPage" @paste-text-toggle="pasteTextToggle" @load-buffer="loadBuffer"></PasteTextPage>
|
||||||
@@ -49,6 +51,7 @@
|
|||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import Component from 'vue-class-component';
|
import Component from 'vue-class-component';
|
||||||
import PasteTextPage from './PasteTextPage/PasteTextPage.vue';
|
import PasteTextPage from './PasteTextPage/PasteTextPage.vue';
|
||||||
|
import {versionHistory} from '../versionHistory';
|
||||||
|
|
||||||
export default @Component({
|
export default @Component({
|
||||||
components: {
|
components: {
|
||||||
@@ -86,13 +89,19 @@ class LoaderPage extends Vue {
|
|||||||
}
|
}
|
||||||
|
|
||||||
get version() {
|
get version() {
|
||||||
return `v${this.$store.state.config.version}`;
|
return this.$store.state.config.version;
|
||||||
}
|
}
|
||||||
|
|
||||||
get isExternalConverter() {
|
get isExternalConverter() {
|
||||||
return this.$store.state.config.useExternalBookConverter;
|
return this.$store.state.config.useExternalBookConverter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get clientVersion() {
|
||||||
|
let v = versionHistory[0].header;
|
||||||
|
v = v.split(' ')[0];
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
submitUrl() {
|
submitUrl() {
|
||||||
if (this.bookUrl) {
|
if (this.bookUrl) {
|
||||||
this.$emit('load-book', {url: this.bookUrl});
|
this.$emit('load-book', {url: this.bookUrl});
|
||||||
|
|||||||
@@ -220,14 +220,19 @@ export default @Component({
|
|||||||
bookPos: function(newValue) {
|
bookPos: function(newValue) {
|
||||||
if (newValue !== undefined && this.activePage == 'TextPage') {
|
if (newValue !== undefined && this.activePage == 'TextPage') {
|
||||||
const textPage = this.$refs.page;
|
const textPage = this.$refs.page;
|
||||||
|
|
||||||
if (textPage.bookPos != newValue) {
|
if (textPage.bookPos != newValue) {
|
||||||
textPage.bookPos = newValue;
|
textPage.bookPos = newValue;
|
||||||
}
|
}
|
||||||
this.debouncedSetRecentBook(newValue);
|
|
||||||
|
if (!this.scrollingActive)
|
||||||
|
this.debouncedSetRecentBook(newValue);
|
||||||
|
else
|
||||||
|
this.scrollingSetRecentBook(newValue);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
routeParamPos: function(newValue) {
|
routeParamPos: function(newValue) {
|
||||||
if (newValue !== undefined && newValue != this.bookPos) {
|
if (!this.paramPosIgnore && newValue !== undefined && newValue != this.bookPos) {
|
||||||
this.bookPos = newValue;
|
this.bookPos = newValue;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -291,10 +296,6 @@ class Reader extends Vue {
|
|||||||
|
|
||||||
this.lastActivePage = false;
|
this.lastActivePage = false;
|
||||||
|
|
||||||
this.debouncedUpdateRoute = _.debounce(() => {
|
|
||||||
this.updateRoute();
|
|
||||||
}, 1000);
|
|
||||||
|
|
||||||
this.debouncedSetRecentBook = _.debounce(async(newValue) => {
|
this.debouncedSetRecentBook = _.debounce(async(newValue) => {
|
||||||
const recent = this.mostRecentBook();
|
const recent = this.mostRecentBook();
|
||||||
if (recent && (recent.bookPos != newValue || recent.bookPosSeen !== this.bookPosSeen)) {
|
if (recent && (recent.bookPos != newValue || recent.bookPosSeen !== this.bookPosSeen)) {
|
||||||
@@ -302,8 +303,17 @@ class Reader extends Vue {
|
|||||||
|
|
||||||
if (this.actionCur < 0 || (this.actionCur >= 0 && this.actionList[this.actionCur] != newValue))
|
if (this.actionCur < 0 || (this.actionCur >= 0 && this.actionList[this.actionCur] != newValue))
|
||||||
this.addAction(newValue);
|
this.addAction(newValue);
|
||||||
|
|
||||||
|
this.paramPosIgnore = true;
|
||||||
|
this.updateRoute();
|
||||||
|
await this.$nextTick();
|
||||||
|
this.paramPosIgnore = false;
|
||||||
}
|
}
|
||||||
}, 500);
|
}, 500, {'maxWait':5000});
|
||||||
|
|
||||||
|
this.scrollingSetRecentBook = _.debounce((newValue) => {
|
||||||
|
this.debouncedSetRecentBook(newValue);
|
||||||
|
}, 15000, {'maxWait':20000});
|
||||||
|
|
||||||
document.addEventListener('fullscreenchange', () => {
|
document.addEventListener('fullscreenchange', () => {
|
||||||
this.fullScreenActive = (document.fullscreenElement !== null);
|
this.fullScreenActive = (document.fullscreenElement !== null);
|
||||||
@@ -327,7 +337,7 @@ class Reader extends Vue {
|
|||||||
(async() => {
|
(async() => {
|
||||||
await bookManager.init(this.settings);
|
await bookManager.init(this.settings);
|
||||||
bookManager.addEventListener(this.bookManagerEvent);
|
bookManager.addEventListener(this.bookManagerEvent);
|
||||||
|
|
||||||
if (this.$root.rootRoute == '/reader') {
|
if (this.$root.rootRoute == '/reader') {
|
||||||
if (this.routeParamUrl) {
|
if (this.routeParamUrl) {
|
||||||
await this.loadBook({url: this.routeParamUrl, bookPos: this.routeParamPos, force: this.routeParamRefresh});
|
await this.loadBook({url: this.routeParamUrl, bookPos: this.routeParamPos, force: this.routeParamRefresh});
|
||||||
@@ -336,13 +346,15 @@ class Reader extends Vue {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
await this.$refs.serverStorage.init();
|
||||||
this.checkSetStorageAccessKey();
|
this.checkSetStorageAccessKey();
|
||||||
this.checkActivateDonateHelpPage();
|
this.checkActivateDonateHelpPage();
|
||||||
this.loading = false;
|
this.loading = false;
|
||||||
|
|
||||||
await this.$refs.serverStorage.init();
|
|
||||||
await this.showWhatsNew();
|
await this.showWhatsNew();
|
||||||
await this.showMigration();
|
await this.showMigration();
|
||||||
|
|
||||||
|
this.updateRoute();
|
||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -507,10 +519,9 @@ class Reader extends Vue {
|
|||||||
if (event.bookPosSeen !== undefined)
|
if (event.bookPosSeen !== undefined)
|
||||||
this.bookPosSeen = event.bookPosSeen;
|
this.bookPosSeen = event.bookPosSeen;
|
||||||
this.bookPos = event.bookPos;
|
this.bookPos = event.bookPos;
|
||||||
this.debouncedUpdateRoute();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async bookManagerEvent(eventName) {
|
async bookManagerEvent(eventName, value) {
|
||||||
if (eventName == 'set-recent' || eventName == 'recent-deleted') {
|
if (eventName == 'set-recent' || eventName == 'recent-deleted') {
|
||||||
const oldBook = (this.textPage ? this.textPage.lastBook : null);
|
const oldBook = (this.textPage ? this.textPage.lastBook : null);
|
||||||
const oldPos = (this.textPage ? this.textPage.bookPos : null);
|
const oldPos = (this.textPage ? this.textPage.bookPos : null);
|
||||||
@@ -539,6 +550,12 @@ class Reader extends Vue {
|
|||||||
if (this.recentBooksActive) {
|
if (this.recentBooksActive) {
|
||||||
await this.$refs.recentBooksPage.updateTableData();
|
await this.$refs.recentBooksPage.updateTableData();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//сохранение в serverStorage
|
||||||
|
if (value) {
|
||||||
|
await utils.sleep(500);
|
||||||
|
await this.$refs.serverStorage.saveRecent(value);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -648,6 +665,10 @@ class Reader extends Vue {
|
|||||||
page.stopTextScrolling();
|
page.stopTextScrolling();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!this.scrollingActive) {
|
||||||
|
this.scrollingSetRecentBook.flush();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
stopSearch() {
|
stopSearch() {
|
||||||
|
|||||||
@@ -201,6 +201,7 @@ class SearchPage extends Vue {
|
|||||||
|
|
||||||
.el-button {
|
.el-button {
|
||||||
padding: 9px 17px 9px 17px;
|
padding: 9px 17px 9px 17px;
|
||||||
|
width: 55px;
|
||||||
}
|
}
|
||||||
|
|
||||||
i {
|
i {
|
||||||
|
|||||||
@@ -49,10 +49,6 @@ class ServerStorage extends Vue {
|
|||||||
this.saveSettings();
|
this.saveSettings();
|
||||||
}, 500);
|
}, 500);
|
||||||
|
|
||||||
this.debouncedSaveRecent = _.debounce((itemKey) => {
|
|
||||||
this.saveRecent(itemKey);
|
|
||||||
}, 1000);
|
|
||||||
|
|
||||||
this.debouncedNotifySuccess = _.debounce(() => {
|
this.debouncedNotifySuccess = _.debounce(() => {
|
||||||
this.success('Данные синхронизированы с сервером');
|
this.success('Данные синхронизированы с сервером');
|
||||||
}, 1000);
|
}, 1000);
|
||||||
@@ -81,8 +77,6 @@ class ServerStorage extends Vue {
|
|||||||
} else {
|
} else {
|
||||||
await this.serverStorageKeyChanged();
|
await this.serverStorageKeyChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
bookManager.addEventListener(this.bookManagerEvent);
|
|
||||||
} finally {
|
} finally {
|
||||||
this.inited = true;
|
this.inited = true;
|
||||||
}
|
}
|
||||||
@@ -103,17 +97,6 @@ class ServerStorage extends Vue {
|
|||||||
this.cachedRecentMod = value;
|
this.cachedRecentMod = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
async bookManagerEvent(eventName, itemKey) {
|
|
||||||
if (!this.serverSyncEnabled)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (eventName == 'recent-changed') {
|
|
||||||
if (itemKey) {
|
|
||||||
this.debouncedSaveRecent(itemKey);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async generateNewServerStorageKey() {
|
async generateNewServerStorageKey() {
|
||||||
const key = utils.toBase58(utils.randomArray(32));
|
const key = utils.toBase58(utils.randomArray(32));
|
||||||
this.commit('reader/setServerStorageKey', key);
|
this.commit('reader/setServerStorageKey', key);
|
||||||
@@ -420,7 +403,12 @@ class ServerStorage extends Vue {
|
|||||||
|
|
||||||
const md = newRecentMod.data;
|
const md = newRecentMod.data;
|
||||||
if (md.key && result[md.key])
|
if (md.key && result[md.key])
|
||||||
result[md.key] = utils.applyObjDiff(result[md.key], md.mod);
|
result[md.key] = utils.applyObjDiff(result[md.key], md.mod, true);
|
||||||
|
|
||||||
|
if (!bookManager.loaded) {
|
||||||
|
this.warning('Ожидание загрузки списка книг перед синхронизацией');
|
||||||
|
while (!bookManager.loaded) await utils.sleep(100);
|
||||||
|
}
|
||||||
|
|
||||||
if (newRecent.rev != this.cachedRecent.rev)
|
if (newRecent.rev != this.cachedRecent.rev)
|
||||||
await this.setCachedRecent(newRecent);
|
await this.setCachedRecent(newRecent);
|
||||||
@@ -429,11 +417,6 @@ class ServerStorage extends Vue {
|
|||||||
if (newRecentMod.rev != this.cachedRecentMod.rev)
|
if (newRecentMod.rev != this.cachedRecentMod.rev)
|
||||||
await this.setCachedRecentMod(newRecentMod);
|
await this.setCachedRecentMod(newRecentMod);
|
||||||
|
|
||||||
if (!bookManager.loaded) {
|
|
||||||
this.warning('Ожидание загрузки списка книг перед синхронизацией');
|
|
||||||
while (!bookManager.loaded) await utils.sleep(100);
|
|
||||||
}
|
|
||||||
|
|
||||||
await bookManager.setRecent(result);
|
await bookManager.setRecent(result);
|
||||||
} else {
|
} else {
|
||||||
this.warning(`Неверный ответ сервера: ${recent.state}`);
|
this.warning(`Неверный ответ сервера: ${recent.state}`);
|
||||||
@@ -449,67 +432,74 @@ class ServerStorage extends Vue {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async saveRecent(itemKey, recurse) {
|
async saveRecent(itemKey, recurse) {
|
||||||
|
while (!this.inited || this.savingRecent)
|
||||||
|
await utils.sleep(100);
|
||||||
|
|
||||||
if (!this.keyInited || !this.serverSyncEnabled || this.savingRecent)
|
if (!this.keyInited || !this.serverSyncEnabled || this.savingRecent)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
const bm = bookManager;
|
this.savingRecent = true;
|
||||||
|
try {
|
||||||
|
const bm = bookManager;
|
||||||
|
|
||||||
let needSaveRecent = false;
|
let needSaveRecent = false;
|
||||||
let needSaveRecentPatch = false;
|
let needSaveRecentPatch = false;
|
||||||
let needSaveRecentMod = false;
|
let needSaveRecentMod = false;
|
||||||
|
|
||||||
//newRecentMod
|
//newRecentMod
|
||||||
let newRecentMod = {};
|
let newRecentMod = {};
|
||||||
if (itemKey && this.cachedRecentPatch.data[itemKey] && this.prevItemKey == itemKey) {
|
if (itemKey && this.cachedRecentPatch.data[itemKey] && this.prevItemKey == itemKey) {
|
||||||
newRecentMod = _.cloneDeep(this.cachedRecentMod);
|
newRecentMod = _.cloneDeep(this.cachedRecentMod);
|
||||||
newRecentMod.rev++;
|
newRecentMod.rev++;
|
||||||
|
|
||||||
newRecentMod.data.key = itemKey;
|
newRecentMod.data.key = itemKey;
|
||||||
newRecentMod.data.mod = utils.getObjDiff(this.cachedRecentPatch.data[itemKey], bm.recent[itemKey]);
|
newRecentMod.data.mod = utils.getObjDiff(this.cachedRecentPatch.data[itemKey], bm.recent[itemKey]);
|
||||||
needSaveRecentMod = true;
|
needSaveRecentMod = true;
|
||||||
}
|
}
|
||||||
this.prevItemKey = itemKey;
|
this.prevItemKey = itemKey;
|
||||||
|
|
||||||
//newRecentPatch
|
//newRecentPatch
|
||||||
let newRecentPatch = {};
|
let newRecentPatch = {};
|
||||||
if (itemKey && !needSaveRecentMod) {
|
if (itemKey && !needSaveRecentMod) {
|
||||||
newRecentPatch = _.cloneDeep(this.cachedRecentPatch);
|
newRecentPatch = _.cloneDeep(this.cachedRecentPatch);
|
||||||
newRecentPatch.rev++;
|
newRecentPatch.rev++;
|
||||||
newRecentPatch.data[itemKey] = bm.recent[itemKey];
|
newRecentPatch.data[itemKey] = _.cloneDeep(bm.recent[itemKey]);
|
||||||
|
|
||||||
let applyMod = this.cachedRecentMod.data;
|
let applyMod = this.cachedRecentMod.data;
|
||||||
if (applyMod && applyMod.key && newRecentPatch.data[applyMod.key])
|
if (applyMod && applyMod.key && newRecentPatch.data[applyMod.key])
|
||||||
newRecentPatch.data[applyMod.key] = utils.applyObjDiff(newRecentPatch.data[applyMod.key], applyMod.mod);
|
newRecentPatch.data[applyMod.key] = utils.applyObjDiff(newRecentPatch.data[applyMod.key], applyMod.mod, true);
|
||||||
|
|
||||||
newRecentMod = {rev: this.cachedRecentMod.rev + 1, data: {}};
|
newRecentMod = {rev: this.cachedRecentMod.rev + 1, data: {}};
|
||||||
needSaveRecentPatch = true;
|
needSaveRecentPatch = true;
|
||||||
needSaveRecentMod = true;
|
needSaveRecentMod = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
//newRecent
|
//newRecent
|
||||||
let newRecent = {};
|
let newRecent = {};
|
||||||
if (!itemKey || (needSaveRecentPatch && Object.keys(newRecentPatch.data).length > 10)) {
|
if (!itemKey || (needSaveRecentPatch && Object.keys(newRecentPatch.data).length > 10)) {
|
||||||
newRecent = {rev: this.cachedRecent.rev + 1, data: bm.recent};
|
//ждем весь bm.recent
|
||||||
newRecentPatch = {rev: this.cachedRecentPatch.rev + 1, data: {}};
|
while (!bookManager.loaded)
|
||||||
newRecentMod = {rev: this.cachedRecentMod.rev + 1, data: {}};
|
await utils.sleep(100);
|
||||||
needSaveRecent = true;
|
|
||||||
needSaveRecentPatch = true;
|
|
||||||
needSaveRecentMod = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
//query
|
newRecent = {rev: this.cachedRecent.rev + 1, data: _.cloneDeep(bm.recent)};
|
||||||
let query = {};
|
newRecentPatch = {rev: this.cachedRecentPatch.rev + 1, data: {}};
|
||||||
if (needSaveRecent) {
|
newRecentMod = {rev: this.cachedRecentMod.rev + 1, data: {}};
|
||||||
query = {recent: newRecent, recentPatch: newRecentPatch, recentMod: newRecentMod};
|
needSaveRecent = true;
|
||||||
} else if (needSaveRecentPatch) {
|
needSaveRecentPatch = true;
|
||||||
query = {recentPatch: newRecentPatch, recentMod: newRecentMod};
|
needSaveRecentMod = true;
|
||||||
} else {
|
}
|
||||||
query = {recentMod: newRecentMod};
|
|
||||||
}
|
|
||||||
|
|
||||||
//сохранение
|
//query
|
||||||
this.savingRecent = true;
|
let query = {};
|
||||||
try {
|
if (needSaveRecent) {
|
||||||
|
query = {recent: newRecent, recentPatch: newRecentPatch, recentMod: newRecentMod};
|
||||||
|
} else if (needSaveRecentPatch) {
|
||||||
|
query = {recentPatch: newRecentPatch, recentMod: newRecentMod};
|
||||||
|
} else {
|
||||||
|
query = {recentMod: newRecentMod};
|
||||||
|
}
|
||||||
|
|
||||||
|
//сохранение
|
||||||
let result = {state: ''};
|
let result = {state: ''};
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -520,9 +510,10 @@ class ServerStorage extends Vue {
|
|||||||
|
|
||||||
if (result.state == 'reject') {
|
if (result.state == 'reject') {
|
||||||
|
|
||||||
await this.loadRecent(false, false);
|
const res = await this.loadRecent(false, false);
|
||||||
|
|
||||||
this.warning(`Последние изменения отменены. Данные синхронизированы с сервером.`);
|
if (res)
|
||||||
|
this.warning(`Последние изменения отменены. Данные синхронизированы с сервером.`);
|
||||||
if (!recurse && itemKey) {
|
if (!recurse && itemKey) {
|
||||||
this.savingRecent = false;
|
this.savingRecent = false;
|
||||||
this.saveRecent(itemKey, true);
|
this.saveRecent(itemKey, true);
|
||||||
|
|||||||
@@ -477,7 +477,7 @@ class TextPage extends Vue {
|
|||||||
|
|
||||||
generateWaitingFunc(waitingHandlerName, stopPropertyName) {
|
generateWaitingFunc(waitingHandlerName, stopPropertyName) {
|
||||||
const func = (timeout) => {
|
const func = (timeout) => {
|
||||||
return new Promise(async(resolve) => {
|
return new Promise((resolve, reject) => { (async() => {
|
||||||
this[waitingHandlerName] = resolve;
|
this[waitingHandlerName] = resolve;
|
||||||
let wait = (timeout + 201)/100;
|
let wait = (timeout + 201)/100;
|
||||||
while (wait > 0 && !this[stopPropertyName]) {
|
while (wait > 0 && !this[stopPropertyName]) {
|
||||||
@@ -485,7 +485,7 @@ class TextPage extends Vue {
|
|||||||
await sleep(100);
|
await sleep(100);
|
||||||
}
|
}
|
||||||
resolve();
|
resolve();
|
||||||
});
|
})().catch(reject); });
|
||||||
};
|
};
|
||||||
return func;
|
return func;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import he from 'he';
|
import he from 'he';
|
||||||
import sax from '../../../../server/core/BookConverter/sax';
|
import sax from '../../../../server/core/sax';
|
||||||
import {sleep} from '../../../share/utils';
|
import {sleep} from '../../../share/utils';
|
||||||
|
|
||||||
const maxImageLineCount = 100;
|
const maxImageLineCount = 100;
|
||||||
@@ -67,7 +67,7 @@ export default class BookParser {
|
|||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
const getImageDimensions = (binaryId, binaryType, data) => {
|
const getImageDimensions = (binaryId, binaryType, data) => {
|
||||||
return new Promise (async(resolve, reject) => {
|
return new Promise ((resolve, reject) => { (async() => {
|
||||||
const i = new Image();
|
const i = new Image();
|
||||||
let resolved = false;
|
let resolved = false;
|
||||||
i.onload = () => {
|
i.onload = () => {
|
||||||
@@ -81,19 +81,17 @@ export default class BookParser {
|
|||||||
resolve();
|
resolve();
|
||||||
};
|
};
|
||||||
|
|
||||||
i.onerror = (e) => {
|
i.onerror = reject;
|
||||||
reject(e);
|
|
||||||
};
|
|
||||||
|
|
||||||
i.src = `data:${binaryType};base64,${data}`;
|
i.src = `data:${binaryType};base64,${data}`;
|
||||||
await sleep(30*1000);
|
await sleep(30*1000);
|
||||||
if (!resolved)
|
if (!resolved)
|
||||||
reject('Не удалось получить размер изображения');
|
reject('Не удалось получить размер изображения');
|
||||||
});
|
})().catch(reject); });
|
||||||
};
|
};
|
||||||
|
|
||||||
const getExternalImageDimensions = (src) => {
|
const getExternalImageDimensions = (src) => {
|
||||||
return new Promise (async(resolve, reject) => {
|
return new Promise ((resolve, reject) => { (async() => {
|
||||||
const i = new Image();
|
const i = new Image();
|
||||||
let resolved = false;
|
let resolved = false;
|
||||||
i.onload = () => {
|
i.onload = () => {
|
||||||
@@ -105,15 +103,13 @@ export default class BookParser {
|
|||||||
resolve();
|
resolve();
|
||||||
};
|
};
|
||||||
|
|
||||||
i.onerror = (e) => {
|
i.onerror = reject;
|
||||||
reject(e);
|
|
||||||
};
|
|
||||||
|
|
||||||
i.src = src;
|
i.src = src;
|
||||||
await sleep(30*1000);
|
await sleep(30*1000);
|
||||||
if (!resolved)
|
if (!resolved)
|
||||||
reject('Не удалось получить размер изображения');
|
reject('Не удалось получить размер изображения');
|
||||||
});
|
})().catch(reject); });
|
||||||
};
|
};
|
||||||
|
|
||||||
const newParagraph = (text, len, addIndex) => {
|
const newParagraph = (text, len, addIndex) => {
|
||||||
|
|||||||
@@ -1,4 +1,26 @@
|
|||||||
export const versionHistory = [
|
export const versionHistory = [
|
||||||
|
{
|
||||||
|
showUntil: '2019-10-29',
|
||||||
|
header: '0.7.6 (2019-10-30)',
|
||||||
|
content:
|
||||||
|
`
|
||||||
|
<ul>
|
||||||
|
<li>исправления багов</li>
|
||||||
|
</ul>
|
||||||
|
`
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
showUntil: '2019-10-21',
|
||||||
|
header: '0.7.5 (2019-10-22)',
|
||||||
|
content:
|
||||||
|
`
|
||||||
|
<ul>
|
||||||
|
<li>исправления багов</li>
|
||||||
|
</ul>
|
||||||
|
`
|
||||||
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
showUntil: '2019-10-17',
|
showUntil: '2019-10-17',
|
||||||
header: '0.7.3 (2019-10-18)',
|
header: '0.7.3 (2019-10-18)',
|
||||||
|
|||||||
@@ -9,97 +9,37 @@ Vue.use(ElementUI, { locale });
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
//------------------------------------------------------
|
//------------------------------------------------------
|
||||||
//import './theme/index.css';
|
import './theme/index.css';
|
||||||
|
|
||||||
import './theme/icon.css';
|
|
||||||
import './theme/tooltip.css';
|
|
||||||
|
|
||||||
import ElMenu from 'element-ui/lib/menu';
|
import ElMenu from 'element-ui/lib/menu';
|
||||||
import './theme/menu.css';
|
|
||||||
|
|
||||||
import ElMenuItem from 'element-ui/lib/menu-item';
|
import ElMenuItem from 'element-ui/lib/menu-item';
|
||||||
import './theme/menu-item.css';
|
|
||||||
|
|
||||||
import ElButton from 'element-ui/lib/button';
|
import ElButton from 'element-ui/lib/button';
|
||||||
import './theme/button.css';
|
|
||||||
|
|
||||||
import ElButtonGroup from 'element-ui/lib/button-group';
|
import ElButtonGroup from 'element-ui/lib/button-group';
|
||||||
import './theme/button-group.css';
|
|
||||||
|
|
||||||
import ElCheckbox from 'element-ui/lib/checkbox';
|
import ElCheckbox from 'element-ui/lib/checkbox';
|
||||||
import './theme/checkbox.css';
|
|
||||||
|
|
||||||
import ElTabs from 'element-ui/lib/tabs';
|
import ElTabs from 'element-ui/lib/tabs';
|
||||||
import './theme/tabs.css';
|
|
||||||
|
|
||||||
import ElTabPane from 'element-ui/lib/tab-pane';
|
import ElTabPane from 'element-ui/lib/tab-pane';
|
||||||
import './theme/tab-pane.css';
|
|
||||||
|
|
||||||
import ElTooltip from 'element-ui/lib/tooltip';
|
import ElTooltip from 'element-ui/lib/tooltip';
|
||||||
import './theme/tooltip.css';
|
|
||||||
|
|
||||||
import ElCol from 'element-ui/lib/col';
|
import ElCol from 'element-ui/lib/col';
|
||||||
import './theme/col.css';
|
|
||||||
|
|
||||||
import ElContainer from 'element-ui/lib/container';
|
import ElContainer from 'element-ui/lib/container';
|
||||||
import './theme/container.css';
|
|
||||||
|
|
||||||
import ElAside from 'element-ui/lib/aside';
|
import ElAside from 'element-ui/lib/aside';
|
||||||
import './theme/aside.css';
|
|
||||||
|
|
||||||
import ElHeader from 'element-ui/lib/header';
|
import ElHeader from 'element-ui/lib/header';
|
||||||
import './theme/header.css';
|
|
||||||
|
|
||||||
import ElMain from 'element-ui/lib/main';
|
import ElMain from 'element-ui/lib/main';
|
||||||
import './theme/main.css';
|
|
||||||
|
|
||||||
import ElInput from 'element-ui/lib/input';
|
import ElInput from 'element-ui/lib/input';
|
||||||
import './theme/input.css';
|
|
||||||
|
|
||||||
import ElInputNumber from 'element-ui/lib/input-number';
|
import ElInputNumber from 'element-ui/lib/input-number';
|
||||||
import './theme/input-number.css';
|
|
||||||
|
|
||||||
import ElSelect from 'element-ui/lib/select';
|
import ElSelect from 'element-ui/lib/select';
|
||||||
import './theme/select.css';
|
|
||||||
|
|
||||||
import ElOption from 'element-ui/lib/option';
|
import ElOption from 'element-ui/lib/option';
|
||||||
import './theme/option.css';
|
|
||||||
|
|
||||||
import ElTable from 'element-ui/lib/table';
|
import ElTable from 'element-ui/lib/table';
|
||||||
import './theme/table.css';
|
|
||||||
|
|
||||||
import ElTableColumn from 'element-ui/lib/table-column';
|
import ElTableColumn from 'element-ui/lib/table-column';
|
||||||
import './theme/table-column.css';
|
|
||||||
|
|
||||||
import ElProgress from 'element-ui/lib/progress';
|
import ElProgress from 'element-ui/lib/progress';
|
||||||
import './theme/progress.css';
|
|
||||||
|
|
||||||
import ElSlider from 'element-ui/lib/slider';
|
import ElSlider from 'element-ui/lib/slider';
|
||||||
import './theme/slider.css';
|
|
||||||
|
|
||||||
import ElForm from 'element-ui/lib/form';
|
import ElForm from 'element-ui/lib/form';
|
||||||
import './theme/form.css';
|
|
||||||
|
|
||||||
import ElFormItem from 'element-ui/lib/form-item';
|
import ElFormItem from 'element-ui/lib/form-item';
|
||||||
import './theme/form-item.css';
|
|
||||||
|
|
||||||
import ElColorPicker from 'element-ui/lib/color-picker';
|
import ElColorPicker from 'element-ui/lib/color-picker';
|
||||||
import './theme/color-picker.css';
|
|
||||||
|
|
||||||
import ElDialog from 'element-ui/lib/dialog';
|
import ElDialog from 'element-ui/lib/dialog';
|
||||||
import './theme/dialog.css';
|
|
||||||
|
|
||||||
import Notification from 'element-ui/lib/notification';
|
import Notification from 'element-ui/lib/notification';
|
||||||
import './theme/notification.css';
|
|
||||||
|
|
||||||
import Loading from 'element-ui/lib/loading';
|
import Loading from 'element-ui/lib/loading';
|
||||||
import './theme/loading.css';
|
|
||||||
|
|
||||||
import MessageBox from 'element-ui/lib/message-box';
|
import MessageBox from 'element-ui/lib/message-box';
|
||||||
import './theme/message-box.css';
|
|
||||||
|
|
||||||
//import Message from 'element-ui/lib/message';
|
|
||||||
//import './theme/message.css';
|
|
||||||
|
|
||||||
const components = {
|
const components = {
|
||||||
ElMenu, ElMenuItem, ElButton, ElButtonGroup, ElCheckbox, ElTabs, ElTabPane, ElTooltip,
|
ElMenu, ElMenuItem, ElButton, ElButtonGroup, ElCheckbox, ElTabs, ElTabPane, ElTooltip,
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
.el-alert{width:100%;padding:8px 16px;margin:0;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:4px;position:relative;background-color:#fff;overflow:hidden;opacity:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-transition:opacity .2s;transition:opacity .2s}.el-alert.is-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.el-alert--success{background-color:#f0f9eb;color:#67c23a}.el-alert--success .el-alert__description{color:#67c23a}.el-alert--info{background-color:#f4f4f5;color:#909399}.el-alert--info .el-alert__description{color:#909399}.el-alert--warning{background-color:#fdf6ec;color:#e6a23c}.el-alert--warning .el-alert__description{color:#e6a23c}.el-alert--error{background-color:#fef0f0;color:#f56c6c}.el-alert--error .el-alert__description{color:#f56c6c}.el-alert__content{display:table-cell;padding:0 8px}.el-alert__icon{font-size:16px;width:16px}.el-alert__icon.is-big{font-size:28px;width:28px}.el-alert__title{font-size:13px;line-height:18px}.el-alert__title.is-bold{font-weight:700}.el-alert .el-alert__description{font-size:12px;margin:5px 0 0}.el-alert__closebtn{font-size:12px;color:#c0c4cc;opacity:1;position:absolute;top:12px;right:15px;cursor:pointer}.el-alert__closebtn.is-customed{font-style:normal;font-size:13px;top:9px}.el-alert-fade-enter,.el-alert-fade-leave-active{opacity:0}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
.el-aside{overflow:auto;-webkit-box-sizing:border-box;box-sizing:border-box;-ms-flex-negative:0;flex-shrink:0}
|
|
||||||
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
|||||||
.el-badge{position:relative;vertical-align:middle;display:inline-block}.el-badge__content{background-color:#f56c6c;border-radius:10px;color:#fff;display:inline-block;font-size:12px;height:18px;line-height:18px;padding:0 6px;text-align:center;white-space:nowrap;border:1px solid #fff}.el-badge__content.is-fixed{position:absolute;top:0;right:10px;-webkit-transform:translateY(-50%) translateX(100%);transform:translateY(-50%) translateX(100%)}.el-badge__content.is-fixed.is-dot{right:5px}.el-badge__content.is-dot{height:8px;width:8px;padding:0;right:0;border-radius:50%}.el-badge__content--primary{background-color:#00468F}.el-badge__content--success{background-color:#67c23a}.el-badge__content--warning{background-color:#e6a23c}.el-badge__content--info{background-color:#909399}.el-badge__content--danger{background-color:#f56c6c}
|
|
||||||
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
|||||||
.el-breadcrumb{font-size:14px;line-height:1}.el-breadcrumb::after,.el-breadcrumb::before{display:table;content:""}.el-breadcrumb::after{clear:both}.el-breadcrumb__separator{margin:0 9px;font-weight:700;color:#c0c4cc}.el-breadcrumb__separator[class*=icon]{margin:0 6px;font-weight:400}.el-breadcrumb__item{float:left}.el-breadcrumb__inner{color:#606266}.el-breadcrumb__inner a,.el-breadcrumb__inner.is-link{font-weight:700;text-decoration:none;-webkit-transition:color .2s cubic-bezier(.645,.045,.355,1);transition:color .2s cubic-bezier(.645,.045,.355,1);color:#303133}.el-breadcrumb__inner a:hover,.el-breadcrumb__inner.is-link:hover{color:#00468F;cursor:pointer}.el-breadcrumb__item:last-child .el-breadcrumb__inner,.el-breadcrumb__item:last-child .el-breadcrumb__inner a,.el-breadcrumb__item:last-child .el-breadcrumb__inner a:hover,.el-breadcrumb__item:last-child .el-breadcrumb__inner:hover{font-weight:400;color:#606266;cursor:text}.el-breadcrumb__item:last-child .el-breadcrumb__separator{display:none}
|
|
||||||
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
|||||||
.el-card{border-radius:4px;border:1px solid #ebeef5;background-color:#fff;overflow:hidden;color:#303133;-webkit-transition:.3s;transition:.3s}.el-card.is-always-shadow,.el-card.is-hover-shadow:focus,.el-card.is-hover-shadow:hover{-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-card__header{padding:18px 20px;border-bottom:1px solid #ebeef5;-webkit-box-sizing:border-box;box-sizing:border-box}.el-card__body{padding:20px}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
.el-carousel__item,.el-carousel__mask{position:absolute;height:100%;top:0;left:0}.el-carousel__item{width:100%;display:inline-block;overflow:hidden;z-index:0}.el-carousel__item.is-active{z-index:2}.el-carousel__item.is-animating{-webkit-transition:-webkit-transform .4s ease-in-out;transition:-webkit-transform .4s ease-in-out;transition:transform .4s ease-in-out;transition:transform .4s ease-in-out,-webkit-transform .4s ease-in-out}.el-carousel__item--card{width:50%;-webkit-transition:-webkit-transform .4s ease-in-out;transition:-webkit-transform .4s ease-in-out;transition:transform .4s ease-in-out;transition:transform .4s ease-in-out,-webkit-transform .4s ease-in-out}.el-carousel__item--card.is-in-stage{cursor:pointer;z-index:1}.el-carousel__item--card.is-in-stage.is-hover .el-carousel__mask,.el-carousel__item--card.is-in-stage:hover .el-carousel__mask{opacity:.12}.el-carousel__item--card.is-active{z-index:2}.el-carousel__mask{width:100%;background-color:#fff;opacity:.24;-webkit-transition:.2s;transition:.2s}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
.el-carousel{overflow-x:hidden;position:relative}.el-carousel__container{position:relative;height:300px}.el-carousel__arrow{border:none;outline:0;padding:0;margin:0;height:36px;width:36px;cursor:pointer;-webkit-transition:.3s;transition:.3s;border-radius:50%;background-color:rgba(31,45,61,.11);color:#fff;position:absolute;top:50%;z-index:10;-webkit-transform:translateY(-50%);transform:translateY(-50%);text-align:center;font-size:12px}.el-carousel__arrow--left{left:16px}.el-carousel__arrow--right{right:16px}.el-carousel__arrow:hover{background-color:rgba(31,45,61,.23)}.el-carousel__arrow i{cursor:pointer}.el-carousel__indicators{position:absolute;list-style:none;bottom:0;left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%);margin:0;padding:0;z-index:2}.el-carousel__indicators--outside{bottom:26px;text-align:center;position:static;-webkit-transform:none;transform:none}.el-carousel__indicators--outside .el-carousel__indicator:hover button{opacity:.64}.el-carousel__indicators--outside button{background-color:#c0c4cc;opacity:.24}.el-carousel__indicators--labels{left:0;right:0;-webkit-transform:none;transform:none;text-align:center}.el-carousel__indicators--labels .el-carousel__button{height:auto;width:auto;padding:2px 18px;font-size:12px}.el-carousel__indicators--labels .el-carousel__indicator{padding:6px 4px}.el-carousel__indicator{display:inline-block;background-color:transparent;padding:12px 4px;cursor:pointer}.el-carousel__indicator:hover button{opacity:.72}.el-carousel__indicator.is-active button{opacity:1}.el-carousel__button{display:block;opacity:.48;width:30px;height:2px;background-color:#fff;border:none;outline:0;padding:0;margin:0;cursor:pointer;-webkit-transition:.3s;transition:.3s}.carousel-arrow-left-enter,.carousel-arrow-left-leave-active{-webkit-transform:translateY(-50%) translateX(-10px);transform:translateY(-50%) translateX(-10px);opacity:0}.carousel-arrow-right-enter,.carousel-arrow-right-leave-active{-webkit-transform:translateY(-50%) translateX(10px);transform:translateY(-50%) translateX(10px);opacity:0}
|
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
|||||||
.el-container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-flex:1;-ms-flex:1;flex:1;-ms-flex-preferred-size:auto;flex-basis:auto;-webkit-box-sizing:border-box;box-sizing:border-box;min-width:0}.el-container.is-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}
|
|
||||||
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
|||||||
.v-modal-enter{-webkit-animation:v-modal-in .2s ease;animation:v-modal-in .2s ease}.v-modal-leave{-webkit-animation:v-modal-out .2s ease forwards;animation:v-modal-out .2s ease forwards}@-webkit-keyframes v-modal-in{0%{opacity:0}}@keyframes v-modal-in{0%{opacity:0}}@-webkit-keyframes v-modal-out{100%{opacity:0}}@keyframes v-modal-out{100%{opacity:0}}.v-modal{position:fixed;left:0;top:0;width:100%;height:100%;opacity:.5;background:#000}.el-popup-parent--hidden{overflow:hidden}.el-dialog{position:relative;margin:0 auto 50px;background:#fff;border-radius:2px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,.3);box-shadow:0 1px 3px rgba(0,0,0,.3);-webkit-box-sizing:border-box;box-sizing:border-box;width:50%}.el-dialog.is-fullscreen{width:100%;margin-top:0;margin-bottom:0;height:100%;overflow:auto}.el-dialog__wrapper{position:fixed;top:0;right:0;bottom:0;left:0;overflow:auto;margin:0}.el-dialog__header{padding:20px 20px 10px}.el-dialog__headerbtn{position:absolute;top:20px;right:20px;padding:0;background:0 0;border:none;outline:0;cursor:pointer;font-size:16px}.el-dialog__headerbtn .el-dialog__close{color:#909399}.el-dialog__headerbtn:focus .el-dialog__close,.el-dialog__headerbtn:hover .el-dialog__close{color:#00468F}.el-dialog__title{line-height:24px;font-size:18px;color:#303133}.el-dialog__body{padding:30px 20px;color:#606266;font-size:14px}.el-dialog__footer{padding:10px 20px 20px;text-align:right;-webkit-box-sizing:border-box;box-sizing:border-box}.el-dialog--center{text-align:center}.el-dialog--center .el-dialog__body{text-align:initial;padding:25px 25px 30px}.el-dialog--center .el-dialog__footer{text-align:inherit}.dialog-fade-enter-active{-webkit-animation:dialog-fade-in .3s;animation:dialog-fade-in .3s}.dialog-fade-leave-active{-webkit-animation:dialog-fade-out .3s;animation:dialog-fade-out .3s}@-webkit-keyframes dialog-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@keyframes dialog-fade-in{0%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@-webkit-keyframes dialog-fade-out{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}@keyframes dialog-fade-out{0%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0);opacity:0}}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
@media only screen and (max-width:767px){.hidden-xs-only{display:none!important}}@media only screen and (min-width:768px){.hidden-sm-and-up{display:none!important}}@media only screen and (min-width:768px) and (max-width:991px){.hidden-sm-only{display:none!important}}@media only screen and (max-width:991px){.hidden-sm-and-down{display:none!important}}@media only screen and (min-width:992px){.hidden-md-and-up{display:none!important}}@media only screen and (min-width:992px) and (max-width:1199px){.hidden-md-only{display:none!important}}@media only screen and (max-width:1199px){.hidden-md-and-down{display:none!important}}@media only screen and (min-width:1200px){.hidden-lg-and-up{display:none!important}}@media only screen and (min-width:1200px) and (max-width:1919px){.hidden-lg-only{display:none!important}}@media only screen and (max-width:1919px){.hidden-lg-and-down{display:none!important}}@media only screen and (min-width:1920px){.hidden-xl-only{display:none!important}}
|
|
||||||
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
|||||||
.el-footer{padding:0 20px;-webkit-box-sizing:border-box;box-sizing:border-box;-ms-flex-negative:0;flex-shrink:0}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
.el-form--inline .el-form-item,.el-form--inline .el-form-item__content{display:inline-block;vertical-align:top}.el-form-item::after,.el-form-item__content::after{clear:both}.el-form--label-left .el-form-item__label{text-align:left}.el-form--label-top .el-form-item__label{float:none;display:inline-block;text-align:left;padding:0 0 10px}.el-form--inline .el-form-item{margin-right:10px}.el-form--inline .el-form-item__label{float:none;display:inline-block}.el-form-item__content .el-input-group,.el-form-item__label{vertical-align:middle}.el-form--inline.el-form--label-top .el-form-item__content{display:block}.el-form-item{margin-bottom:22px}.el-form-item::after,.el-form-item::before{display:table;content:""}.el-form-item .el-form-item{margin-bottom:0}.el-form-item--mini.el-form-item,.el-form-item--small.el-form-item{margin-bottom:18px}.el-form-item .el-input__validateIcon{display:none}.el-form-item--medium .el-form-item__content,.el-form-item--medium .el-form-item__label{line-height:36px}.el-form-item--small .el-form-item__content,.el-form-item--small .el-form-item__label{line-height:32px}.el-form-item--small .el-form-item__error{padding-top:2px}.el-form-item--mini .el-form-item__content,.el-form-item--mini .el-form-item__label{line-height:28px}.el-form-item--mini .el-form-item__error{padding-top:1px}.el-form-item__label{text-align:right;float:left;font-size:14px;color:#606266;line-height:40px;padding:0 12px 0 0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-form-item__content{line-height:40px;position:relative;font-size:14px}.el-form-item__content::after,.el-form-item__content::before{display:table;content:""}.el-form-item__error{color:#f56c6c;font-size:12px;line-height:1;padding-top:4px;position:absolute;top:100%;left:0}.el-form-item__error--inline{position:relative;top:auto;left:auto;display:inline-block;margin-left:10px}.el-form-item.is-required:not(.is-no-asterisk)>.el-form-item__label:before{content:'*';color:#f56c6c;margin-right:4px}.el-form-item.is-error .el-input__inner,.el-form-item.is-error .el-input__inner:focus,.el-form-item.is-error .el-textarea__inner,.el-form-item.is-error .el-textarea__inner:focus{border-color:#f56c6c}.el-form-item.is-error .el-input-group__append .el-input__inner,.el-form-item.is-error .el-input-group__prepend .el-input__inner{border-color:transparent}.el-form-item.is-error .el-input__validateIcon{color:#f56c6c}.el-form-item.is-success .el-input__inner,.el-form-item.is-success .el-input__inner:focus,.el-form-item.is-success .el-textarea__inner,.el-form-item.is-success .el-textarea__inner:focus{border-color:#67c23a}.el-form-item.is-success .el-input-group__append .el-input__inner,.el-form-item.is-success .el-input-group__prepend .el-input__inner{border-color:transparent}.el-form-item.is-success .el-input__validateIcon{color:#67c23a}.el-form-item--feedback .el-input__validateIcon{display:inline-block}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
.el-header{padding:0 20px;-webkit-box-sizing:border-box;box-sizing:border-box;-ms-flex-negative:0;flex-shrink:0}
|
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
|||||||
.el-loading-parent--relative{position:relative!important}.el-loading-parent--hidden{overflow:hidden!important}.el-loading-mask{position:absolute;z-index:2000;background-color:rgba(255,255,255,.9);margin:0;top:0;right:0;bottom:0;left:0;-webkit-transition:opacity .3s;transition:opacity .3s}.el-loading-mask.is-fullscreen{position:fixed}.el-loading-mask.is-fullscreen .el-loading-spinner{margin-top:-25px}.el-loading-mask.is-fullscreen .el-loading-spinner .circular{height:50px;width:50px}.el-loading-spinner{top:50%;margin-top:-21px;width:100%;text-align:center;position:absolute}.el-loading-spinner .el-loading-text{color:#00468F;margin:3px 0;font-size:14px}.el-loading-spinner .circular{height:42px;width:42px;-webkit-animation:loading-rotate 2s linear infinite;animation:loading-rotate 2s linear infinite}.el-loading-spinner .path{-webkit-animation:loading-dash 1.5s ease-in-out infinite;animation:loading-dash 1.5s ease-in-out infinite;stroke-dasharray:90,150;stroke-dashoffset:0;stroke-width:2;stroke:#00468F;stroke-linecap:round}.el-loading-spinner i{color:#00468F}.el-loading-fade-enter,.el-loading-fade-leave-active{opacity:0}@-webkit-keyframes loading-rotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes loading-rotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes loading-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-40px}100%{stroke-dasharray:90,150;stroke-dashoffset:-120px}}@keyframes loading-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-40px}100%{stroke-dasharray:90,150;stroke-dashoffset:-120px}}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
.el-main{display:block;-webkit-box-flex:1;-ms-flex:1;flex:1;-ms-flex-preferred-size:auto;flex-basis:auto;overflow:auto;-webkit-box-sizing:border-box;box-sizing:border-box;padding:20px}
|
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
|||||||
.el-message__closeBtn:focus,.el-message__content:focus{outline-width:0}.el-message{min-width:380px;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:4px;border-width:1px;border-style:solid;border-color:#ebeef5;position:fixed;left:50%;top:20px;-webkit-transform:translateX(-50%);transform:translateX(-50%);background-color:#edf2fc;-webkit-transition:opacity .3s,-webkit-transform .4s;transition:opacity .3s,-webkit-transform .4s;transition:opacity .3s,transform .4s;transition:opacity .3s,transform .4s,-webkit-transform .4s;overflow:hidden;padding:15px 15px 15px 20px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-message.is-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.el-message.is-closable .el-message__content{padding-right:16px}.el-message p{margin:0}.el-message--info .el-message__content{color:#909399}.el-message--success{background-color:#f0f9eb;border-color:#e1f3d8}.el-message--success .el-message__content{color:#67c23a}.el-message--warning{background-color:#fdf6ec;border-color:#faecd8}.el-message--warning .el-message__content{color:#e6a23c}.el-message--error{background-color:#fef0f0;border-color:#fde2e2}.el-message--error .el-message__content{color:#f56c6c}.el-message__icon{margin-right:10px}.el-message__content{padding:0;font-size:14px;line-height:1}.el-message__closeBtn{position:absolute;top:50%;right:15px;-webkit-transform:translateY(-50%);transform:translateY(-50%);cursor:pointer;color:#c0c4cc;font-size:16px}.el-message__closeBtn:hover{color:#909399}.el-message .el-icon-success{color:#67c23a}.el-message .el-icon-error{color:#f56c6c}.el-message .el-icon-info{color:#909399}.el-message .el-icon-warning{color:#e6a23c}.el-message-fade-enter,.el-message-fade-leave-active{opacity:0;-webkit-transform:translate(-50%,-100%);transform:translate(-50%,-100%)}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
.el-notification{display:-webkit-box;display:-ms-flexbox;display:flex;width:330px;padding:14px 26px 14px 13px;border-radius:8px;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #ebeef5;position:fixed;background-color:#fff;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);-webkit-transition:opacity .3s,left .3s,right .3s,top .4s,bottom .3s,-webkit-transform .3s;transition:opacity .3s,left .3s,right .3s,top .4s,bottom .3s,-webkit-transform .3s;transition:opacity .3s,transform .3s,left .3s,right .3s,top .4s,bottom .3s;transition:opacity .3s,transform .3s,left .3s,right .3s,top .4s,bottom .3s,-webkit-transform .3s;overflow:hidden}.el-notification.right{right:16px}.el-notification.left{left:16px}.el-notification__group{margin-left:13px}.el-notification__title{font-weight:700;font-size:16px;color:#303133;margin:0}.el-notification__content{font-size:14px;line-height:21px;margin:6px 0 0;color:#606266;text-align:justify}.el-notification__content p{margin:0}.el-notification__icon{height:24px;width:24px;font-size:24px}.el-notification__closeBtn{position:absolute;top:18px;right:15px;cursor:pointer;color:#909399;font-size:16px}.el-notification__closeBtn:hover{color:#606266}.el-notification .el-icon-success{color:#67c23a}.el-notification .el-icon-error{color:#f56c6c}.el-notification .el-icon-info{color:#909399}.el-notification .el-icon-warning{color:#e6a23c}.el-notification-fade-enter.right{right:0;-webkit-transform:translateX(100%);transform:translateX(100%)}.el-notification-fade-enter.left{left:0;-webkit-transform:translateX(-100%);transform:translateX(-100%)}.el-notification-fade-leave-active{opacity:0}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
.el-select-group{margin:0;padding:0}.el-select-group__wrap{position:relative;list-style:none;margin:0;padding:0}.el-select-group__wrap:not(:last-of-type){padding-bottom:24px}.el-select-group__wrap:not(:last-of-type)::after{content:'';position:absolute;display:block;left:20px;right:20px;bottom:12px;height:1px;background:#e4e7ed}.el-select-group__title{padding-left:20px;font-size:12px;color:#909399;line-height:30px}.el-select-group .el-select-dropdown__item{padding-left:20px}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
.el-select-dropdown__item{font-size:14px;padding:0 20px;position:relative;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#606266;height:34px;line-height:34px;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:pointer}.el-select-dropdown__item.is-disabled{color:#c0c4cc;cursor:not-allowed}.el-select-dropdown__item.is-disabled:hover{background-color:#fff}.el-select-dropdown__item.hover,.el-select-dropdown__item:hover{background-color:#f5f7fa}.el-select-dropdown__item.selected{color:#00468F;font-weight:700}
|
|
||||||
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
|||||||
.el-popper .popper__arrow,.el-popper .popper__arrow::after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.el-popper .popper__arrow{border-width:6px;-webkit-filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03));filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03))}.el-popper .popper__arrow::after{content:" ";border-width:6px}.el-popper[x-placement^=top]{margin-bottom:12px}.el-popper[x-placement^=top] .popper__arrow{bottom:-6px;left:50%;margin-right:3px;border-top-color:#ebeef5;border-bottom-width:0}.el-popper[x-placement^=top] .popper__arrow::after{bottom:1px;margin-left:-6px;border-top-color:#fff;border-bottom-width:0}.el-popper[x-placement^=bottom]{margin-top:12px}.el-popper[x-placement^=bottom] .popper__arrow{top:-6px;left:50%;margin-right:3px;border-top-width:0;border-bottom-color:#ebeef5}.el-popper[x-placement^=bottom] .popper__arrow::after{top:1px;margin-left:-6px;border-top-width:0;border-bottom-color:#fff}.el-popper[x-placement^=right]{margin-left:12px}.el-popper[x-placement^=right] .popper__arrow{top:50%;left:-6px;margin-bottom:3px;border-right-color:#ebeef5;border-left-width:0}.el-popper[x-placement^=right] .popper__arrow::after{bottom:-6px;left:1px;border-right-color:#fff;border-left-width:0}.el-popper[x-placement^=left]{margin-right:12px}.el-popper[x-placement^=left] .popper__arrow{top:50%;right:-6px;margin-bottom:3px;border-right-width:0;border-left-color:#ebeef5}.el-popper[x-placement^=left] .popper__arrow::after{right:1px;bottom:-6px;margin-left:-6px;border-right-width:0;border-left-color:#fff}.el-popover{position:absolute;background:#fff;min-width:150px;border-radius:4px;border:1px solid #ebeef5;padding:12px;z-index:2000;color:#606266;line-height:1.4;text-align:justify;font-size:14px;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-popover--plain{padding:18px 20px}.el-popover__title{color:#303133;font-size:16px;line-height:1;margin-bottom:12px}.el-popover:focus,.el-popover:focus:active,.el-popover__reference:focus:hover,.el-popover__reference:focus:not(.focusing){outline-width:0}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
.el-popper .popper__arrow,.el-popper .popper__arrow::after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.el-popper .popper__arrow{border-width:6px;-webkit-filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03));filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03))}.el-popper .popper__arrow::after{content:" ";border-width:6px}.el-popper[x-placement^=top]{margin-bottom:12px}.el-popper[x-placement^=top] .popper__arrow{bottom:-6px;left:50%;margin-right:3px;border-top-color:#ebeef5;border-bottom-width:0}.el-popper[x-placement^=top] .popper__arrow::after{bottom:1px;margin-left:-6px;border-top-color:#fff;border-bottom-width:0}.el-popper[x-placement^=bottom]{margin-top:12px}.el-popper[x-placement^=bottom] .popper__arrow{top:-6px;left:50%;margin-right:3px;border-top-width:0;border-bottom-color:#ebeef5}.el-popper[x-placement^=bottom] .popper__arrow::after{top:1px;margin-left:-6px;border-top-width:0;border-bottom-color:#fff}.el-popper[x-placement^=right]{margin-left:12px}.el-popper[x-placement^=right] .popper__arrow{top:50%;left:-6px;margin-bottom:3px;border-right-color:#ebeef5;border-left-width:0}.el-popper[x-placement^=right] .popper__arrow::after{bottom:-6px;left:1px;border-right-color:#fff;border-left-width:0}.el-popper[x-placement^=left]{margin-right:12px}.el-popper[x-placement^=left] .popper__arrow{top:50%;right:-6px;margin-bottom:3px;border-right-width:0;border-left-color:#ebeef5}.el-popper[x-placement^=left] .popper__arrow::after{right:1px;bottom:-6px;margin-left:-6px;border-right-width:0;border-left-color:#fff}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
.el-progress{position:relative;line-height:1}.el-progress__text{font-size:14px;color:#606266;display:inline-block;vertical-align:middle;margin-left:10px;line-height:1}.el-progress__text i{vertical-align:middle;display:block}.el-progress--circle{display:inline-block}.el-progress--circle .el-progress__text{position:absolute;top:50%;left:0;width:100%;text-align:center;margin:0;-webkit-transform:translate(0,-50%);transform:translate(0,-50%)}.el-progress--circle .el-progress__text i{vertical-align:middle;display:inline-block}.el-progress--without-text .el-progress__text{display:none}.el-progress--without-text .el-progress-bar{padding-right:0;margin-right:0;display:block}.el-progress-bar,.el-progress-bar__inner::after,.el-progress-bar__innerText{display:inline-block;vertical-align:middle}.el-progress--text-inside .el-progress-bar{padding-right:0;margin-right:0}.el-progress.is-success .el-progress-bar__inner{background-color:#67c23a}.el-progress.is-success .el-progress__text{color:#67c23a}.el-progress.is-exception .el-progress-bar__inner{background-color:#f56c6c}.el-progress.is-exception .el-progress__text{color:#f56c6c}.el-progress-bar{padding-right:50px;width:100%;margin-right:-55px;-webkit-box-sizing:border-box;box-sizing:border-box}.el-progress-bar__outer{height:6px;border-radius:100px;background-color:#ebeef5;overflow:hidden;position:relative;vertical-align:middle}.el-progress-bar__inner{position:absolute;left:0;top:0;height:100%;background-color:#00468F;text-align:right;border-radius:100px;line-height:1;white-space:nowrap;-webkit-transition:width .6s ease;transition:width .6s ease}.el-progress-bar__inner::after{content:"";height:100%}.el-progress-bar__innerText{color:#fff;font-size:12px;margin:0 5px}@-webkit-keyframes progress{0%{background-position:0 0}100%{background-position:32px 0}}@keyframes progress{0%{background-position:0 0}100%{background-position:32px 0}}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
@charset "UTF-8";.el-radio-button,.el-radio-button__inner{display:inline-block;position:relative;outline:0}.el-radio-button__inner{line-height:1;white-space:nowrap;vertical-align:middle;background:#fff;border:1px solid #dcdfe6;font-weight:500;border-left:0;color:#606266;-webkit-appearance:none;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;cursor:pointer;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);padding:12px 20px;font-size:14px;border-radius:0}.el-radio-button__inner.is-round{padding:12px 20px}.el-radio-button__inner:hover{color:#00468F}.el-radio-button__inner [class*=el-icon-]{line-height:.9}.el-radio-button__inner [class*=el-icon-]+span{margin-left:5px}.el-radio-button:first-child .el-radio-button__inner{border-left:1px solid #dcdfe6;border-radius:4px 0 0 4px;-webkit-box-shadow:none!important;box-shadow:none!important}.el-radio-button__orig-radio{opacity:0;outline:0;position:absolute;z-index:-1}.el-radio-button__orig-radio:checked+.el-radio-button__inner{color:#fff;background-color:#00468F;border-color:#00468F;-webkit-box-shadow:-1px 0 0 0 #00468F;box-shadow:-1px 0 0 0 #00468F}.el-radio-button__orig-radio:disabled+.el-radio-button__inner{color:#c0c4cc;cursor:not-allowed;background-image:none;background-color:#fff;border-color:#ebeef5;-webkit-box-shadow:none;box-shadow:none}.el-radio-button__orig-radio:disabled:checked+.el-radio-button__inner{background-color:#f2f6fc}.el-radio-button:last-child .el-radio-button__inner{border-radius:0 4px 4px 0}.el-radio-button:first-child:last-child .el-radio-button__inner{border-radius:4px}.el-radio-button--medium .el-radio-button__inner{padding:10px 20px;font-size:14px;border-radius:0}.el-radio-button--medium .el-radio-button__inner.is-round{padding:10px 20px}.el-radio-button--small .el-radio-button__inner{padding:9px 15px;font-size:12px;border-radius:0}.el-radio-button--small .el-radio-button__inner.is-round{padding:9px 15px}.el-radio-button--mini .el-radio-button__inner{padding:7px 15px;font-size:12px;border-radius:0}.el-radio-button--mini .el-radio-button__inner.is-round{padding:7px 15px}.el-radio-button:focus:not(.is-focus):not(:active):not(.is-disabled){-webkit-box-shadow:0 0 2px 2px #00468F;box-shadow:0 0 2px 2px #00468F}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
.el-radio-group{display:inline-block;line-height:1;vertical-align:middle;font-size:0}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
@charset "UTF-8";.el-radio,.el-radio--medium.is-bordered .el-radio__label{font-size:14px}.el-radio,.el-radio__input{white-space:nowrap;line-height:1;outline:0}.el-radio,.el-radio__inner,.el-radio__input{position:relative;display:inline-block}.el-radio{color:#606266;font-weight:500;cursor:pointer;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.el-radio.is-bordered{padding:12px 20px 0 10px;border-radius:4px;border:1px solid #dcdfe6;-webkit-box-sizing:border-box;box-sizing:border-box;height:40px}.el-radio.is-bordered.is-checked{border-color:#00468F}.el-radio.is-bordered.is-disabled{cursor:not-allowed;border-color:#ebeef5}.el-radio__input.is-disabled .el-radio__inner,.el-radio__input.is-disabled.is-checked .el-radio__inner{background-color:#f5f7fa;border-color:#e4e7ed}.el-radio.is-bordered+.el-radio.is-bordered{margin-left:10px}.el-radio--medium.is-bordered{padding:10px 20px 0 10px;border-radius:4px;height:36px}.el-radio--mini.is-bordered .el-radio__label,.el-radio--small.is-bordered .el-radio__label{font-size:12px}.el-radio--medium.is-bordered .el-radio__inner{height:14px;width:14px}.el-radio--small.is-bordered{padding:8px 15px 0 10px;border-radius:3px;height:32px}.el-radio--small.is-bordered .el-radio__inner{height:12px;width:12px}.el-radio--mini.is-bordered{padding:6px 15px 0 10px;border-radius:3px;height:28px}.el-radio--mini.is-bordered .el-radio__inner{height:12px;width:12px}.el-radio+.el-radio{margin-left:30px}.el-radio__input{cursor:pointer;vertical-align:middle}.el-radio__input.is-disabled .el-radio__inner{cursor:not-allowed}.el-radio__input.is-disabled .el-radio__inner::after{cursor:not-allowed;background-color:#f5f7fa}.el-radio__input.is-disabled .el-radio__inner+.el-radio__label{cursor:not-allowed}.el-radio__input.is-disabled.is-checked .el-radio__inner::after{background-color:#c0c4cc}.el-radio__input.is-disabled+span.el-radio__label{color:#c0c4cc;cursor:not-allowed}.el-radio__input.is-checked .el-radio__inner{border-color:#00468F;background:#00468F}.el-radio__input.is-checked .el-radio__inner::after{-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1)}.el-radio__input.is-checked+.el-radio__label{color:#00468F}.el-radio__input.is-focus .el-radio__inner{border-color:#00468F}.el-radio__inner{border:1px solid #dcdfe6;border-radius:100%;width:14px;height:14px;background-color:#fff;cursor:pointer;-webkit-box-sizing:border-box;box-sizing:border-box}.el-radio__inner:hover{border-color:#00468F}.el-radio__inner::after{width:4px;height:4px;border-radius:100%;background-color:#fff;content:"";position:absolute;left:50%;top:50%;-webkit-transform:translate(-50%,-50%) scale(0);transform:translate(-50%,-50%) scale(0);-webkit-transition:-webkit-transform .15s ease-in;transition:-webkit-transform .15s ease-in;transition:transform .15s ease-in;transition:transform .15s ease-in,-webkit-transform .15s ease-in}.el-radio__original{opacity:0;outline:0;position:absolute;z-index:-1;top:0;left:0;right:0;bottom:0;margin:0}.el-radio:focus:not(.is-focus):not(:active):not(.is-disabled) .el-radio__inner{-webkit-box-shadow:0 0 2px 2px #00468F;box-shadow:0 0 2px 2px #00468F}.el-radio__label{font-size:14px;padding-left:10px}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
.el-rate__icon,.el-rate__item{position:relative;display:inline-block}.el-rate{height:20px;line-height:1}.el-rate:active,.el-rate:focus{outline-width:0}.el-rate__item{font-size:0;vertical-align:middle}.el-rate__icon{font-size:18px;margin-right:6px;color:#c0c4cc;-webkit-transition:.3s;transition:.3s}.el-rate__decimal,.el-rate__icon .path2{position:absolute;top:0;left:0}.el-rate__icon.hover{-webkit-transform:scale(1.15);transform:scale(1.15)}.el-rate__decimal{display:inline-block;overflow:hidden}.el-rate__text{font-size:14px;vertical-align:middle}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
@charset "UTF-8";body{font-family:"Helvetica Neue",Helvetica,"PingFang SC","Hiragino Sans GB","Microsoft YaHei","微软雅黑",Arial,sans-serif;font-weight:400;font-size:14px;color:#000;-webkit-font-smoothing:antialiased}a{color:#00468F;text-decoration:none}a:focus,a:hover{color:rgb(51, 107, 165)}a:active{color:rgb(0, 63, 129)}h1,h2,h3,h4,h5,h6{color:#606266;font-weight:inherit}h1:first-child,h2:first-child,h3:first-child,h4:first-child,h5:first-child,h6:first-child,p:first-child{margin-top:0}h1:last-child,h2:last-child,h3:last-child,h4:last-child,h5:last-child,h6:last-child,p:last-child{margin-bottom:0}h1{font-size:20px}h2{font-size:18px}h3{font-size:16px}h4,h5,h6,p{font-size:inherit}p{line-height:1.8}sub,sup{font-size:13px}small{font-size:12px}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
.el-row{position:relative;-webkit-box-sizing:border-box;box-sizing:border-box}.el-row::after,.el-row::before{display:table;content:""}.el-row::after{clear:both}.el-row--flex{display:-webkit-box;display:-ms-flexbox;display:flex}.el-row--flex:after,.el-row--flex:before{display:none}.el-row--flex.is-justify-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.el-row--flex.is-justify-end{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.el-row--flex.is-justify-space-between{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.el-row--flex.is-justify-space-around{-ms-flex-pack:distribute;justify-content:space-around}.el-row--flex.is-align-middle{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-row--flex.is-align-bottom{-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
.el-scrollbar{overflow:hidden;position:relative}.el-scrollbar:active>.el-scrollbar__bar,.el-scrollbar:focus>.el-scrollbar__bar,.el-scrollbar:hover>.el-scrollbar__bar{opacity:1;-webkit-transition:opacity 340ms ease-out;transition:opacity 340ms ease-out}.el-scrollbar__wrap{overflow:scroll;height:100%}.el-scrollbar__wrap--hidden-default::-webkit-scrollbar{width:0;height:0}.el-scrollbar__thumb{position:relative;display:block;width:0;height:0;cursor:pointer;border-radius:inherit;background-color:rgba(144,147,153,.3);-webkit-transition:.3s background-color;transition:.3s background-color}.el-scrollbar__thumb:hover{background-color:rgba(144,147,153,.5)}.el-scrollbar__bar{position:absolute;right:2px;bottom:2px;z-index:1;border-radius:4px;opacity:0;-webkit-transition:opacity 120ms ease-out;transition:opacity 120ms ease-out}.el-scrollbar__bar.is-vertical{width:6px;top:2px}.el-scrollbar__bar.is-vertical>div{width:100%}.el-scrollbar__bar.is-horizontal{height:6px;left:2px}.el-scrollbar__bar.is-horizontal>div{height:100%}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
.el-popper .popper__arrow,.el-popper .popper__arrow::after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.el-popper .popper__arrow{border-width:6px;-webkit-filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03));filter:drop-shadow(0 2px 12px rgba(0, 0, 0, .03))}.el-popper .popper__arrow::after{content:" ";border-width:6px}.el-popper[x-placement^=top]{margin-bottom:12px}.el-popper[x-placement^=top] .popper__arrow{bottom:-6px;left:50%;margin-right:3px;border-top-color:#ebeef5;border-bottom-width:0}.el-popper[x-placement^=top] .popper__arrow::after{bottom:1px;margin-left:-6px;border-top-color:#fff;border-bottom-width:0}.el-popper[x-placement^=bottom]{margin-top:12px}.el-popper[x-placement^=bottom] .popper__arrow{top:-6px;left:50%;margin-right:3px;border-top-width:0;border-bottom-color:#ebeef5}.el-popper[x-placement^=bottom] .popper__arrow::after{top:1px;margin-left:-6px;border-top-width:0;border-bottom-color:#fff}.el-popper[x-placement^=right]{margin-left:12px}.el-popper[x-placement^=right] .popper__arrow{top:50%;left:-6px;margin-bottom:3px;border-right-color:#ebeef5;border-left-width:0}.el-popper[x-placement^=right] .popper__arrow::after{bottom:-6px;left:1px;border-right-color:#fff;border-left-width:0}.el-popper[x-placement^=left]{margin-right:12px}.el-popper[x-placement^=left] .popper__arrow{top:50%;right:-6px;margin-bottom:3px;border-right-width:0;border-left-color:#ebeef5}.el-popper[x-placement^=left] .popper__arrow::after{right:1px;bottom:-6px;margin-left:-6px;border-right-width:0;border-left-color:#fff}.el-select-dropdown{position:absolute;z-index:1001;border:1px solid #e4e7ed;border-radius:4px;background-color:#fff;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);-webkit-box-sizing:border-box;box-sizing:border-box;margin:5px 0}.el-select-dropdown.is-multiple .el-select-dropdown__item.selected{color:#00468F;background-color:#fff}.el-select-dropdown.is-multiple .el-select-dropdown__item.selected.hover{background-color:#f5f7fa}.el-select-dropdown.is-multiple .el-select-dropdown__item.selected::after{position:absolute;right:20px;font-family:element-icons;content:"\E611";font-size:12px;font-weight:700;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.el-select-dropdown .el-scrollbar.is-empty .el-select-dropdown__list{padding:0}.el-select-dropdown__empty{padding:10px 0;margin:0;text-align:center;color:#999;font-size:14px}.el-select-dropdown__wrap{max-height:274px}.el-select-dropdown__list{list-style:none;padding:6px 0;margin:0;-webkit-box-sizing:border-box;box-sizing:border-box}
|
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
|||||||
.el-time-spinner{width:100%;white-space:nowrap}.el-spinner{display:inline-block;vertical-align:middle}.el-spinner-inner{-webkit-animation:rotate 2s linear infinite;animation:rotate 2s linear infinite;width:50px;height:50px}.el-spinner-inner .path{stroke:#ececec;stroke-linecap:round;-webkit-animation:dash 1.5s ease-in-out infinite;animation:dash 1.5s ease-in-out infinite}@-webkit-keyframes rotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes rotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes dash{0%{stroke-dasharray:1,150;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-35}100%{stroke-dasharray:90,150;stroke-dashoffset:-124}}@keyframes dash{0%{stroke-dasharray:1,150;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-35}100%{stroke-dasharray:90,150;stroke-dashoffset:-124}}
|
|
||||||
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
|||||||
.el-steps{display:-webkit-box;display:-ms-flexbox;display:flex}.el-steps--simple{padding:13px 8%;border-radius:4px;background:#f5f7fa}.el-steps--horizontal{white-space:nowrap}.el-steps--vertical{height:100%;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-flow:column;flex-flow:column}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
.el-switch{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:relative;font-size:14px;line-height:20px;height:20px;vertical-align:middle}.el-switch.is-disabled .el-switch__core,.el-switch.is-disabled .el-switch__label{cursor:not-allowed}.el-switch__core,.el-switch__label{display:inline-block;cursor:pointer;vertical-align:middle}.el-switch__label{-webkit-transition:.2s;transition:.2s;height:20px;font-size:14px;font-weight:500;color:#303133}.el-switch__label.is-active{color:#00468F}.el-switch__label--left{margin-right:10px}.el-switch__label--right{margin-left:10px}.el-switch__label *{line-height:1;font-size:14px;display:inline-block}.el-switch__input{position:absolute;width:0;height:0;opacity:0;margin:0}.el-switch__core{margin:0;position:relative;width:40px;height:20px;border:1px solid #dcdfe6;outline:0;border-radius:10px;-webkit-box-sizing:border-box;box-sizing:border-box;background:#dcdfe6;-webkit-transition:border-color .3s,background-color .3s;transition:border-color .3s,background-color .3s}.el-switch__core:after{content:"";position:absolute;top:1px;left:1px;border-radius:100%;-webkit-transition:all .3s;transition:all .3s;width:16px;height:16px;background-color:#fff}.el-switch.is-checked .el-switch__core{border-color:#00468F;background-color:#00468F}.el-switch.is-checked .el-switch__core::after{left:100%;margin-left:-17px}.el-switch.is-disabled{opacity:.6}.el-switch--wide .el-switch__label.el-switch__label--left span{left:10px}.el-switch--wide .el-switch__label.el-switch__label--right span{right:10px}.el-switch .label-fade-enter,.el-switch .label-fade-leave-active{opacity:0}
|
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
|||||||
.el-tag{background-color:rgba(64,158,255,.1);display:inline-block;padding:0 10px;height:32px;line-height:30px;font-size:12px;color:#00468F;border-radius:4px;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid rgba(64,158,255,.2);white-space:nowrap}.el-tag .el-icon-close{border-radius:50%;text-align:center;position:relative;cursor:pointer;font-size:12px;height:16px;width:16px;line-height:16px;vertical-align:middle;top:-1px;right:-5px;color:#00468F}.el-tag .el-icon-close::before{display:block}.el-tag .el-icon-close:hover{background-color:#00468F;color:#fff}.el-tag--info,.el-tag--info .el-tag__close{color:#909399}.el-tag--info{background-color:rgba(144,147,153,.1);border-color:rgba(144,147,153,.2)}.el-tag--info.is-hit{border-color:#909399}.el-tag--info .el-tag__close:hover{background-color:#909399;color:#fff}.el-tag--success{background-color:rgba(103,194,58,.1);border-color:rgba(103,194,58,.2);color:#67c23a}.el-tag--success.is-hit{border-color:#67c23a}.el-tag--success .el-tag__close{color:#67c23a}.el-tag--success .el-tag__close:hover{background-color:#67c23a;color:#fff}.el-tag--warning{background-color:rgba(230,162,60,.1);border-color:rgba(230,162,60,.2);color:#e6a23c}.el-tag--warning.is-hit{border-color:#e6a23c}.el-tag--warning .el-tag__close{color:#e6a23c}.el-tag--warning .el-tag__close:hover{background-color:#e6a23c;color:#fff}.el-tag--danger{background-color:rgba(245,108,108,.1);border-color:rgba(245,108,108,.2);color:#f56c6c}.el-tag--danger.is-hit{border-color:#f56c6c}.el-tag--danger .el-tag__close{color:#f56c6c}.el-tag--danger .el-tag__close:hover{background-color:#f56c6c;color:#fff}.el-tag--medium{height:28px;line-height:26px}.el-tag--medium .el-icon-close{-webkit-transform:scale(.8);transform:scale(.8)}.el-tag--small{height:24px;padding:0 8px;line-height:22px}.el-tag--small .el-icon-close{-webkit-transform:scale(.8);transform:scale(.8)}.el-tag--mini{height:20px;padding:0 5px;line-height:19px}.el-tag--mini .el-icon-close{margin-left:-3px;-webkit-transform:scale(.7);transform:scale(.7)}
|
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
|||||||
.el-tooltip:focus:hover,.el-tooltip:focus:not(.focusing){outline-width:0}.el-tooltip__popper{position:absolute;border-radius:4px;padding:10px;z-index:2000;font-size:12px;line-height:1.2;min-width:10px;word-wrap:break-word}.el-tooltip__popper .popper__arrow,.el-tooltip__popper .popper__arrow::after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.el-tooltip__popper .popper__arrow{border-width:6px}.el-tooltip__popper .popper__arrow::after{content:" ";border-width:5px}.el-tooltip__popper[x-placement^=top]{margin-bottom:12px}.el-tooltip__popper[x-placement^=top] .popper__arrow{bottom:-6px;border-top-color:#303133;border-bottom-width:0}.el-tooltip__popper[x-placement^=top] .popper__arrow::after{bottom:1px;margin-left:-5px;border-top-color:#303133;border-bottom-width:0}.el-tooltip__popper[x-placement^=bottom]{margin-top:12px}.el-tooltip__popper[x-placement^=bottom] .popper__arrow{top:-6px;border-top-width:0;border-bottom-color:#303133}.el-tooltip__popper[x-placement^=bottom] .popper__arrow::after{top:1px;margin-left:-5px;border-top-width:0;border-bottom-color:#303133}.el-tooltip__popper[x-placement^=right]{margin-left:12px}.el-tooltip__popper[x-placement^=right] .popper__arrow{left:-6px;border-right-color:#303133;border-left-width:0}.el-tooltip__popper[x-placement^=right] .popper__arrow::after{bottom:-5px;left:1px;border-right-color:#303133;border-left-width:0}.el-tooltip__popper[x-placement^=left]{margin-right:12px}.el-tooltip__popper[x-placement^=left] .popper__arrow{right:-6px;border-right-width:0;border-left-color:#303133}.el-tooltip__popper[x-placement^=left] .popper__arrow::after{right:1px;bottom:-5px;margin-left:-5px;border-right-width:0;border-left-color:#303133}.el-tooltip__popper.is-dark{background:#303133;color:#fff}.el-tooltip__popper.is-light{background:#fff;border:1px solid #303133}.el-tooltip__popper.is-light[x-placement^=top] .popper__arrow{border-top-color:#303133}.el-tooltip__popper.is-light[x-placement^=top] .popper__arrow::after{border-top-color:#fff}.el-tooltip__popper.is-light[x-placement^=bottom] .popper__arrow{border-bottom-color:#303133}.el-tooltip__popper.is-light[x-placement^=bottom] .popper__arrow::after{border-bottom-color:#fff}.el-tooltip__popper.is-light[x-placement^=left] .popper__arrow{border-left-color:#303133}.el-tooltip__popper.is-light[x-placement^=left] .popper__arrow::after{border-left-color:#fff}.el-tooltip__popper.is-light[x-placement^=right] .popper__arrow{border-right-color:#303133}.el-tooltip__popper.is-light[x-placement^=right] .popper__arrow::after{border-right-color:#fff}
|
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -309,6 +309,42 @@
|
|||||||
while($code);
|
while($code);
|
||||||
return $curlResult;
|
return $curlResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function tryNewApi($curlOptions, $url) {
|
||||||
|
try {
|
||||||
|
$api = 'http://127.0.0.1:44081/api/';
|
||||||
|
$host = 'http://127.0.0.1';
|
||||||
|
|
||||||
|
$curlOptions[CURLOPT_URL] = $api . 'reader/load-book';
|
||||||
|
$out = curlExec($curlOptions, array('Content-type: application/json'), "{\"url\": \"$url\"}");
|
||||||
|
|
||||||
|
$out = json_decode($out, true);
|
||||||
|
if (!$out)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
$workerId = $out['workerId'];
|
||||||
|
$i = 0;
|
||||||
|
while ($out['state'] != 'finish') {
|
||||||
|
usleep(500*1000);
|
||||||
|
$curlOptions[CURLOPT_URL] = $api . 'worker/get-state';
|
||||||
|
$out = curlExec($curlOptions, array('Content-type: application/json'), "{\"workerId\": \"$workerId\"}");
|
||||||
|
$out = json_decode($out, true);
|
||||||
|
if (!$out || $i > 250)
|
||||||
|
return false;
|
||||||
|
$i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
$path = $out['path'];
|
||||||
|
|
||||||
|
$curlOptions[CURLOPT_URL] = $host . $path;
|
||||||
|
$out = curlExec($curlOptions);
|
||||||
|
$out = gzdecode($out);
|
||||||
|
|
||||||
|
return $out;
|
||||||
|
} catch (Exception $e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
{
|
{
|
||||||
set_error_handler("myErrorHandler");
|
set_error_handler("myErrorHandler");
|
||||||
// set_time_limit(300);
|
// set_time_limit(300);
|
||||||
@@ -335,7 +371,6 @@
|
|||||||
$options = array(
|
$options = array(
|
||||||
CURLOPT_RETURNTRANSFER => TRUE,
|
CURLOPT_RETURNTRANSFER => TRUE,
|
||||||
CURLOPT_TIMEOUT => 300,
|
CURLOPT_TIMEOUT => 300,
|
||||||
CURLOPT_URL => $url,
|
|
||||||
CURLOPT_BUFFERSIZE => 1024*128,
|
CURLOPT_BUFFERSIZE => 1024*128,
|
||||||
CURLOPT_NOPROGRESS => FALSE,
|
CURLOPT_NOPROGRESS => FALSE,
|
||||||
CURLOPT_USERAGENT => "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6",
|
CURLOPT_USERAGENT => "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6",
|
||||||
@@ -347,7 +382,11 @@
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
$out = curlExec($options);
|
$out = tryNewApi($options, $url);
|
||||||
|
if (!$out) {
|
||||||
|
$options[CURLOPT_URL] = $url;
|
||||||
|
$out = curlExec($options);
|
||||||
|
}
|
||||||
|
|
||||||
$meta_info['time_curl'] = microtime_float() - $time;
|
$meta_info['time_curl'] = microtime_float() - $time;
|
||||||
$time = microtime_float();
|
$time = microtime_float();
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
<link rel="shortcut icon" type="image/gif" href="js/bpricon.gif">
|
<link rel="shortcut icon" type="image/gif" href="js/bpricon.gif">
|
||||||
<link rel="stylesheet" type="text/css" media="screen" href="js/stylex.css">
|
<link rel="stylesheet" type="text/css" media="screen" href="js/stylex.css">
|
||||||
<script src="config/config.js" type="text/javascript"></script>
|
<script src="config/config.js" type="text/javascript"></script>
|
||||||
<script src="js/bpr318.js" type="text/javascript"></script>
|
<script src="js/bpr319.js" type="text/javascript"></script>
|
||||||
<meta name="yandex-verification" content="be58752dfe93d304" />
|
<meta name="yandex-verification" content="be58752dfe93d304" />
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
@@ -153,7 +153,7 @@
|
|||||||
<p>- ðåãèñòðàöèÿ íå òðåáóåòñÿ
|
<p>- ðåãèñòðàöèÿ íå òðåáóåòñÿ
|
||||||
|
|
||||||
<br><br> êà÷åñòâå URL ìîæíî çàäàâàòü html-ñòðàíè÷êó ñ êíèãîé, ëèáî ïðÿìóþ ññûëêó íà ôàéë èç îíëàéí-áèáëèîòåêè (íàïðèìåð, ñêîïèðîâàâ àäðåñ ññûëêè èëè êíîïêè "ñêà÷àòü fb2").
|
<br><br> êà÷åñòâå URL ìîæíî çàäàâàòü html-ñòðàíè÷êó ñ êíèãîé, ëèáî ïðÿìóþ ññûëêó íà ôàéë èç îíëàéí-áèáëèîòåêè (íàïðèìåð, ñêîïèðîâàâ àäðåñ ññûëêè èëè êíîïêè "ñêà÷àòü fb2").
|
||||||
Ïîääåðæèâàåìûå ôîðìàòû: <strong>html, txt, fb2, fb2.zip</strong>
|
Ïîääåðæèâàåìûå ôîðìàòû: <b>fb2, html, txt, rtf, doc, docx, pdf, epub, mobi</b> è ñæàòèå: <b>zip, bz2, gz</b>
|
||||||
|
|
||||||
<br><br>Âû ìîæåòå äîáàâèòü â ñâîé áðàóçåð çàêëàäêó, óêàçàâ â åå ñâîéñòâàõ âìåñòî àäðåñà ñëåäóþùèé êîä:
|
<br><br>Âû ìîæåòå äîáàâèòü â ñâîé áðàóçåð çàêëàäêó, óêàçàâ â åå ñâîéñòâàõ âìåñòî àäðåñà ñëåäóþùèé êîä:
|
||||||
<br><p><strong>javascript:location.href='http://old.omnireader.ru/?url='+location.href;</strong>
|
<br><p><strong>javascript:location.href='http://old.omnireader.ru/?url='+location.href;</strong>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
version = 'v3.1.8';
|
version = 'v3.1.9';
|
||||||
|
|
||||||
function splitRGB(color) //îáðàáîòêà öâåòà
|
function splitRGB(color) //îáðàáîòêà öâåòà
|
||||||
{
|
{
|
||||||
@@ -15,17 +15,20 @@ server {
|
|||||||
gzip_types *;
|
gzip_types *;
|
||||||
|
|
||||||
location /api {
|
location /api {
|
||||||
proxy_pass http://localhost:44081;
|
proxy_pass http://127.0.0.1:44081;
|
||||||
}
|
|
||||||
|
|
||||||
location /tmp {
|
|
||||||
root /home/liberama/public;
|
|
||||||
add_header Content-Type text/xml;
|
|
||||||
add_header Content-Encoding gzip;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
location / {
|
location / {
|
||||||
root /home/liberama/public;
|
root /home/liberama/public;
|
||||||
|
|
||||||
|
location /tmp {
|
||||||
|
add_header Content-Type text/xml;
|
||||||
|
add_header Content-Encoding gzip;
|
||||||
|
}
|
||||||
|
|
||||||
|
location ~* \.(?:manifest|appcache|html)$ {
|
||||||
|
expires -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -41,7 +44,7 @@ server {
|
|||||||
gzip_types *;
|
gzip_types *;
|
||||||
|
|
||||||
location /api {
|
location /api {
|
||||||
proxy_pass http://localhost:44081;
|
proxy_pass http://127.0.0.1:44081;
|
||||||
}
|
}
|
||||||
|
|
||||||
location /tmp {
|
location /tmp {
|
||||||
|
|||||||
255
package-lock.json
generated
255
package-lock.json
generated
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "Liberama",
|
"name": "Liberama",
|
||||||
"version": "0.7.1",
|
"version": "0.7.5",
|
||||||
"lockfileVersion": 1,
|
"lockfileVersion": 1,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -541,11 +541,6 @@
|
|||||||
"integrity": "sha512-tiNTrP1MP0QrChmD2DdupCr6HWSFeKVw5d/dHTu4Y7rkAkRhU/Dt7dphAfIUyxtHpl/eBVip5uTNSpQJHylpAw==",
|
"integrity": "sha512-tiNTrP1MP0QrChmD2DdupCr6HWSFeKVw5d/dHTu4Y7rkAkRhU/Dt7dphAfIUyxtHpl/eBVip5uTNSpQJHylpAw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"adm-zip": {
|
|
||||||
"version": "0.4.13",
|
|
||||||
"resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.13.tgz",
|
|
||||||
"integrity": "sha512-fERNJX8sOXfel6qCBCMPvZLzENBEhZTzKqg6vrOW5pvoEaQuJhRU4ndTAh6lHOxn1I6jnz2NHra56ZODM751uw=="
|
|
||||||
},
|
|
||||||
"ajv": {
|
"ajv": {
|
||||||
"version": "6.10.2",
|
"version": "6.10.2",
|
||||||
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz",
|
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz",
|
||||||
@@ -640,6 +635,57 @@
|
|||||||
"resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
|
||||||
"integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="
|
"integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="
|
||||||
},
|
},
|
||||||
|
"archiver-utils": {
|
||||||
|
"version": "2.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz",
|
||||||
|
"integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==",
|
||||||
|
"requires": {
|
||||||
|
"glob": "^7.1.4",
|
||||||
|
"graceful-fs": "^4.2.0",
|
||||||
|
"lazystream": "^1.0.0",
|
||||||
|
"lodash.defaults": "^4.2.0",
|
||||||
|
"lodash.difference": "^4.5.0",
|
||||||
|
"lodash.flatten": "^4.4.0",
|
||||||
|
"lodash.isplainobject": "^4.0.6",
|
||||||
|
"lodash.union": "^4.6.0",
|
||||||
|
"normalize-path": "^3.0.0",
|
||||||
|
"readable-stream": "^2.0.0"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"isarray": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
|
||||||
|
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
|
||||||
|
},
|
||||||
|
"readable-stream": {
|
||||||
|
"version": "2.3.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
|
||||||
|
"integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
|
||||||
|
"requires": {
|
||||||
|
"core-util-is": "~1.0.0",
|
||||||
|
"inherits": "~2.0.3",
|
||||||
|
"isarray": "~1.0.0",
|
||||||
|
"process-nextick-args": "~2.0.0",
|
||||||
|
"safe-buffer": "~5.1.1",
|
||||||
|
"string_decoder": "~1.1.1",
|
||||||
|
"util-deprecate": "~1.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"safe-buffer": {
|
||||||
|
"version": "5.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
|
||||||
|
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
|
||||||
|
},
|
||||||
|
"string_decoder": {
|
||||||
|
"version": "1.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
|
||||||
|
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
|
||||||
|
"requires": {
|
||||||
|
"safe-buffer": "~5.1.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"are-we-there-yet": {
|
"are-we-there-yet": {
|
||||||
"version": "1.1.5",
|
"version": "1.1.5",
|
||||||
"resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz",
|
"resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz",
|
||||||
@@ -1868,6 +1914,11 @@
|
|||||||
"ieee754": "^1.1.4"
|
"ieee754": "^1.1.4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"buffer-crc32": {
|
||||||
|
"version": "0.2.13",
|
||||||
|
"resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
|
||||||
|
"integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI="
|
||||||
|
},
|
||||||
"buffer-from": {
|
"buffer-from": {
|
||||||
"version": "1.1.1",
|
"version": "1.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
|
||||||
@@ -2359,6 +2410,51 @@
|
|||||||
"integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
|
"integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"compress-commons": {
|
||||||
|
"version": "2.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-2.1.1.tgz",
|
||||||
|
"integrity": "sha512-eVw6n7CnEMFzc3duyFVrQEuY1BlHR3rYsSztyG32ibGMW722i3C6IizEGMFmfMU+A+fALvBIwxN3czffTcdA+Q==",
|
||||||
|
"requires": {
|
||||||
|
"buffer-crc32": "^0.2.13",
|
||||||
|
"crc32-stream": "^3.0.1",
|
||||||
|
"normalize-path": "^3.0.0",
|
||||||
|
"readable-stream": "^2.3.6"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"isarray": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
|
||||||
|
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
|
||||||
|
},
|
||||||
|
"readable-stream": {
|
||||||
|
"version": "2.3.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
|
||||||
|
"integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
|
||||||
|
"requires": {
|
||||||
|
"core-util-is": "~1.0.0",
|
||||||
|
"inherits": "~2.0.3",
|
||||||
|
"isarray": "~1.0.0",
|
||||||
|
"process-nextick-args": "~2.0.0",
|
||||||
|
"safe-buffer": "~5.1.1",
|
||||||
|
"string_decoder": "~1.1.1",
|
||||||
|
"util-deprecate": "~1.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"safe-buffer": {
|
||||||
|
"version": "5.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
|
||||||
|
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
|
||||||
|
},
|
||||||
|
"string_decoder": {
|
||||||
|
"version": "1.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
|
||||||
|
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
|
||||||
|
"requires": {
|
||||||
|
"safe-buffer": "~5.1.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"compressible": {
|
"compressible": {
|
||||||
"version": "2.0.17",
|
"version": "2.0.17",
|
||||||
"resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.17.tgz",
|
"resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.17.tgz",
|
||||||
@@ -2598,6 +2694,43 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"crc": {
|
||||||
|
"version": "3.8.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz",
|
||||||
|
"integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==",
|
||||||
|
"requires": {
|
||||||
|
"buffer": "^5.1.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"crc32-stream": {
|
||||||
|
"version": "3.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-3.0.1.tgz",
|
||||||
|
"integrity": "sha512-mctvpXlbzsvK+6z8kJwSJ5crm7yBwrQMTybJzMw1O4lLGJqjlDCXY2Zw7KheiA6XBEcBmfLx1D88mjRGVJtY9w==",
|
||||||
|
"requires": {
|
||||||
|
"crc": "^3.4.4",
|
||||||
|
"readable-stream": "^3.4.0"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"readable-stream": {
|
||||||
|
"version": "3.4.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz",
|
||||||
|
"integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==",
|
||||||
|
"requires": {
|
||||||
|
"inherits": "^2.0.3",
|
||||||
|
"string_decoder": "^1.1.1",
|
||||||
|
"util-deprecate": "^1.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"string_decoder": {
|
||||||
|
"version": "1.3.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
|
||||||
|
"integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
|
||||||
|
"requires": {
|
||||||
|
"safe-buffer": "~5.2.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"create-ecdh": {
|
"create-ecdh": {
|
||||||
"version": "4.0.3",
|
"version": "4.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz",
|
||||||
@@ -6252,6 +6385,48 @@
|
|||||||
"webpack-sources": "^1.1.0"
|
"webpack-sources": "^1.1.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"lazystream": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz",
|
||||||
|
"integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=",
|
||||||
|
"requires": {
|
||||||
|
"readable-stream": "^2.0.5"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"isarray": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
|
||||||
|
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
|
||||||
|
},
|
||||||
|
"readable-stream": {
|
||||||
|
"version": "2.3.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
|
||||||
|
"integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
|
||||||
|
"requires": {
|
||||||
|
"core-util-is": "~1.0.0",
|
||||||
|
"inherits": "~2.0.3",
|
||||||
|
"isarray": "~1.0.0",
|
||||||
|
"process-nextick-args": "~2.0.0",
|
||||||
|
"safe-buffer": "~5.1.1",
|
||||||
|
"string_decoder": "~1.1.1",
|
||||||
|
"util-deprecate": "~1.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"safe-buffer": {
|
||||||
|
"version": "5.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
|
||||||
|
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
|
||||||
|
},
|
||||||
|
"string_decoder": {
|
||||||
|
"version": "1.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
|
||||||
|
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
|
||||||
|
"requires": {
|
||||||
|
"safe-buffer": "~5.1.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"lcid": {
|
"lcid": {
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz",
|
||||||
@@ -6330,12 +6505,37 @@
|
|||||||
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
|
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
|
||||||
"integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
|
"integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
|
||||||
},
|
},
|
||||||
|
"lodash.defaults": {
|
||||||
|
"version": "4.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz",
|
||||||
|
"integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw="
|
||||||
|
},
|
||||||
|
"lodash.difference": {
|
||||||
|
"version": "4.5.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz",
|
||||||
|
"integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw="
|
||||||
|
},
|
||||||
|
"lodash.flatten": {
|
||||||
|
"version": "4.4.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz",
|
||||||
|
"integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8="
|
||||||
|
},
|
||||||
|
"lodash.isplainobject": {
|
||||||
|
"version": "4.0.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
|
||||||
|
"integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs="
|
||||||
|
},
|
||||||
"lodash.memoize": {
|
"lodash.memoize": {
|
||||||
"version": "4.1.2",
|
"version": "4.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
|
||||||
"integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=",
|
"integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"lodash.union": {
|
||||||
|
"version": "4.6.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz",
|
||||||
|
"integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg="
|
||||||
|
},
|
||||||
"lodash.uniq": {
|
"lodash.uniq": {
|
||||||
"version": "4.5.0",
|
"version": "4.5.0",
|
||||||
"resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
|
"resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
|
||||||
@@ -7011,11 +7211,15 @@
|
|||||||
"semver": "^5.3.0"
|
"semver": "^5.3.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node-stream-zip": {
|
||||||
|
"version": "1.8.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.8.2.tgz",
|
||||||
|
"integrity": "sha512-zwP2F/R28Oqtl0gOLItk5QjJ6jEU8XO4kaUMgeqvCyXPgdCZlm8T/5qLMiNy+moJCBCiMQAaX7aVMRhT0t2vkQ=="
|
||||||
|
},
|
||||||
"normalize-path": {
|
"normalize-path": {
|
||||||
"version": "3.0.0",
|
"version": "3.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
|
||||||
"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
|
"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"normalize-url": {
|
"normalize-url": {
|
||||||
"version": "4.4.0",
|
"version": "4.4.0",
|
||||||
@@ -12125,9 +12329,8 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"vue": {
|
"vue": {
|
||||||
"version": "2.6.10",
|
"version": "github:paulkamer/vue#ab046be361b499cc53e75dc85bd329405eadf006",
|
||||||
"resolved": "https://registry.npmjs.org/vue/-/vue-2.6.10.tgz",
|
"from": "github:paulkamer/vue#fix_palemoon_clickhandlers_dist"
|
||||||
"integrity": "sha512-ImThpeNU9HbdZL3utgMCq0oiMzAkt1mcgy3/E6zWC/G6AaQoeuFdsl9nDhTDU3X1R6FK7nsIUuRACVcjI+A2GQ=="
|
|
||||||
},
|
},
|
||||||
"vue-class-component": {
|
"vue-class-component": {
|
||||||
"version": "6.3.2",
|
"version": "6.3.2",
|
||||||
@@ -12648,6 +12851,36 @@
|
|||||||
"camelcase": "^5.0.0",
|
"camelcase": "^5.0.0",
|
||||||
"decamelize": "^1.2.0"
|
"decamelize": "^1.2.0"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"zip-stream": {
|
||||||
|
"version": "2.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-2.1.2.tgz",
|
||||||
|
"integrity": "sha512-ykebHGa2+uzth/R4HZLkZh3XFJzivhVsjJt8bN3GvBzLaqqrUdRacu+c4QtnUgjkkQfsOuNE1JgLKMCPNmkKgg==",
|
||||||
|
"requires": {
|
||||||
|
"archiver-utils": "^2.1.0",
|
||||||
|
"compress-commons": "^2.1.1",
|
||||||
|
"readable-stream": "^3.4.0"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"readable-stream": {
|
||||||
|
"version": "3.4.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz",
|
||||||
|
"integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==",
|
||||||
|
"requires": {
|
||||||
|
"inherits": "^2.0.3",
|
||||||
|
"string_decoder": "^1.1.1",
|
||||||
|
"util-deprecate": "^1.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"string_decoder": {
|
||||||
|
"version": "1.3.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
|
||||||
|
"integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
|
||||||
|
"requires": {
|
||||||
|
"safe-buffer": "~5.2.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "Liberama",
|
"name": "Liberama",
|
||||||
"version": "0.7.3",
|
"version": "0.7.6",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=10.0.0"
|
"node": ">=10.0.0"
|
||||||
},
|
},
|
||||||
@@ -55,7 +55,6 @@
|
|||||||
"webpack-merge": "^4.2.2"
|
"webpack-merge": "^4.2.2"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"adm-zip": "^0.4.13",
|
|
||||||
"appcache-webpack-plugin": "^1.4.0",
|
"appcache-webpack-plugin": "^1.4.0",
|
||||||
"axios": "^0.18.1",
|
"axios": "^0.18.1",
|
||||||
"base-x": "^3.0.6",
|
"base-x": "^3.0.6",
|
||||||
@@ -72,6 +71,7 @@
|
|||||||
"lodash": "^4.17.15",
|
"lodash": "^4.17.15",
|
||||||
"minimist": "^1.2.0",
|
"minimist": "^1.2.0",
|
||||||
"multer": "^1.4.2",
|
"multer": "^1.4.2",
|
||||||
|
"node-stream-zip": "^1.8.2",
|
||||||
"pako": "^1.0.10",
|
"pako": "^1.0.10",
|
||||||
"path-browserify": "^1.0.0",
|
"path-browserify": "^1.0.0",
|
||||||
"safe-buffer": "^5.2.0",
|
"safe-buffer": "^5.2.0",
|
||||||
@@ -80,9 +80,10 @@
|
|||||||
"sqlite": "3.0.0",
|
"sqlite": "3.0.0",
|
||||||
"tar-fs": "^2.0.0",
|
"tar-fs": "^2.0.0",
|
||||||
"unbzip2-stream": "^1.3.3",
|
"unbzip2-stream": "^1.3.3",
|
||||||
"vue": "^2.6.10",
|
"vue": "github:paulkamer/vue#fix_palemoon_clickhandlers_dist",
|
||||||
"vue-router": "^3.1.3",
|
"vue-router": "^3.1.3",
|
||||||
"vuex": "^3.1.1",
|
"vuex": "^3.1.1",
|
||||||
"vuex-persistedstate": "^2.5.4"
|
"vuex-persistedstate": "^2.5.4",
|
||||||
|
"zip-stream": "^2.1.2"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ module.exports = {
|
|||||||
logDir: `${dataDir}/log`,
|
logDir: `${dataDir}/log`,
|
||||||
publicDir: `${execDir}/public`,
|
publicDir: `${execDir}/public`,
|
||||||
uploadDir: `${execDir}/public/upload`,
|
uploadDir: `${execDir}/public/upload`,
|
||||||
|
sharedDir: `${execDir}/public/shared`,
|
||||||
loggingEnabled: true,
|
loggingEnabled: true,
|
||||||
|
|
||||||
maxUploadFileSize: 50*1024*1024,//50Мб
|
maxUploadFileSize: 50*1024*1024,//50Мб
|
||||||
|
|||||||
@@ -1,37 +0,0 @@
|
|||||||
const fs = require('fs-extra');
|
|
||||||
const _ = require('lodash');
|
|
||||||
|
|
||||||
const propsToSave = [
|
|
||||||
'maxUploadFileSize',
|
|
||||||
'maxTempPublicDirSize',
|
|
||||||
'maxUploadPublicDirSize',
|
|
||||||
'useExternalBookConverter',
|
|
||||||
|
|
||||||
'servers',
|
|
||||||
];
|
|
||||||
|
|
||||||
async function load(config, configFilename) {
|
|
||||||
if (!configFilename) {
|
|
||||||
configFilename = `${config.dataDir}/config.json`;
|
|
||||||
|
|
||||||
if (!await fs.pathExists(configFilename)) {
|
|
||||||
save(config);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const data = await fs.readFile(configFilename, 'utf8');
|
|
||||||
Object.assign(config, JSON.parse(data));
|
|
||||||
}
|
|
||||||
|
|
||||||
async function save(config) {
|
|
||||||
const configFilename = `${config.dataDir}/config.json`;
|
|
||||||
const dataToSave = _.pick(config, propsToSave);
|
|
||||||
|
|
||||||
await fs.writeFile(configFilename, JSON.stringify(dataToSave, null, 4));
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
load,
|
|
||||||
save
|
|
||||||
};
|
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
const base = require('./base');
|
const base = require('./base');
|
||||||
|
|
||||||
module.exports = Object.assign({}, base, {
|
module.exports = Object.assign({}, base, {
|
||||||
branch: 'development',
|
branch: 'development',
|
||||||
}
|
});
|
||||||
);
|
|
||||||
|
|||||||
@@ -1,23 +1,91 @@
|
|||||||
|
const _ = require('lodash');
|
||||||
const fs = require('fs-extra');
|
const fs = require('fs-extra');
|
||||||
const utils = require('../core/utils');
|
|
||||||
|
|
||||||
const branchFilename = __dirname + '/application_env';
|
const branchFilename = __dirname + '/application_env';
|
||||||
|
|
||||||
let branch = 'production';
|
const propsToSave = [
|
||||||
try {
|
'maxUploadFileSize',
|
||||||
fs.accessSync(branchFilename);
|
'maxTempPublicDirSize',
|
||||||
branch = fs.readFileSync(branchFilename, 'utf8').trim();
|
'maxUploadPublicDirSize',
|
||||||
} catch (err) {
|
'useExternalBookConverter',
|
||||||
|
|
||||||
|
'servers',
|
||||||
|
];
|
||||||
|
|
||||||
|
let instance = null;
|
||||||
|
|
||||||
|
//singleton
|
||||||
|
class ConfigManager {
|
||||||
|
constructor() {
|
||||||
|
if (!instance) {
|
||||||
|
this.inited = false;
|
||||||
|
|
||||||
|
instance = this;
|
||||||
|
}
|
||||||
|
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
async init() {
|
||||||
|
if (this.inited)
|
||||||
|
throw new Error('already inited');
|
||||||
|
|
||||||
|
this.branch = 'production';
|
||||||
|
try {
|
||||||
|
await fs.access(branchFilename);
|
||||||
|
this.branch = (await fs.readFile(branchFilename, 'utf8')).trim();
|
||||||
|
} catch (err) {
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
process.env.NODE_ENV = this.branch;
|
||||||
|
|
||||||
|
this.branchConfigFile = __dirname + `/${this.branch}.js`;
|
||||||
|
await fs.access(this.branchConfigFile);
|
||||||
|
this._config = require(this.branchConfigFile);
|
||||||
|
|
||||||
|
this._userConfigFile = `${this._config.dataDir}/config.json`;
|
||||||
|
|
||||||
|
this.inited = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
get config() {
|
||||||
|
if (!this.inited)
|
||||||
|
throw new Error('not inited');
|
||||||
|
return _.cloneDeep(this._config);
|
||||||
|
}
|
||||||
|
|
||||||
|
set config(value) {
|
||||||
|
Object.assign(this._config, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
get userConfigFile() {
|
||||||
|
return this._userConfigFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
set userConfigFile(value) {
|
||||||
|
if (value)
|
||||||
|
this._userConfigFile = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
async load() {
|
||||||
|
if (!this.inited)
|
||||||
|
throw new Error('not inited');
|
||||||
|
if (!await fs.pathExists(this.userConfigFile)) {
|
||||||
|
await this.save();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const data = await fs.readFile(this.userConfigFile, 'utf8');
|
||||||
|
this.config = JSON.parse(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
async save() {
|
||||||
|
if (!this.inited)
|
||||||
|
throw new Error('not inited');
|
||||||
|
const dataToSave = _.pick(this._config, propsToSave);
|
||||||
|
await fs.writeFile(this.userConfigFile, JSON.stringify(dataToSave, null, 4));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
process.env.NODE_ENV = branch;
|
module.exports = ConfigManager;
|
||||||
|
|
||||||
const confFilename = __dirname + `/${branch}.js`;
|
|
||||||
|
|
||||||
fs.accessSync(confFilename);
|
|
||||||
|
|
||||||
const config = require(confFilename);
|
|
||||||
|
|
||||||
//fs.ensureDirSync(config.dataDir);
|
|
||||||
|
|
||||||
module.exports = config;
|
|
||||||
@@ -5,21 +5,21 @@ const execDir = path.dirname(process.execPath);
|
|||||||
const dataDir = `${execDir}/data`;
|
const dataDir = `${execDir}/data`;
|
||||||
|
|
||||||
module.exports = Object.assign({}, base, {
|
module.exports = Object.assign({}, base, {
|
||||||
branch: 'production',
|
branch: 'production',
|
||||||
dataDir: dataDir,
|
dataDir: dataDir,
|
||||||
tempDir: `${dataDir}/tmp`,
|
tempDir: `${dataDir}/tmp`,
|
||||||
logDir: `${dataDir}/log`,
|
logDir: `${dataDir}/log`,
|
||||||
publicDir: `${execDir}/public`,
|
publicDir: `${execDir}/public`,
|
||||||
uploadDir: `${execDir}/public/upload`,
|
uploadDir: `${execDir}/public/upload`,
|
||||||
|
sharedDir: `${execDir}/public/shared`,
|
||||||
|
|
||||||
servers: [
|
servers: [
|
||||||
{
|
{
|
||||||
serverName: '1',
|
serverName: '1',
|
||||||
mode: 'normal', //'none', 'normal', 'site', 'reader', 'omnireader'
|
mode: 'normal', //'none', 'normal', 'site', 'reader', 'omnireader'
|
||||||
ip: '0.0.0.0',
|
ip: '0.0.0.0',
|
||||||
port: '44080',
|
port: '44080',
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
|
||||||
}
|
});
|
||||||
);
|
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
const BaseController = require('./BaseController');
|
const BaseController = require('./BaseController');
|
||||||
const log = require('../core/getLogger').getLog();
|
|
||||||
const _ = require('lodash');
|
const _ = require('lodash');
|
||||||
|
|
||||||
class MiscController extends BaseController {
|
class MiscController extends BaseController {
|
||||||
|
|||||||
@@ -1,12 +1,14 @@
|
|||||||
const BaseController = require('./BaseController');
|
const BaseController = require('./BaseController');
|
||||||
const ReaderWorker = require('../core/ReaderWorker');
|
const ReaderWorker = require('../core/Reader/ReaderWorker');//singleton
|
||||||
const readerStorage = require('../core/readerStorage');
|
const ReaderStorage = require('../core/Reader/ReaderStorage');//singleton
|
||||||
const workerState = require('../core/workerState');
|
const WorkerState = require('../core/WorkerState');//singleton
|
||||||
|
|
||||||
class ReaderController extends BaseController {
|
class ReaderController extends BaseController {
|
||||||
constructor(config) {
|
constructor(config) {
|
||||||
super(config);
|
super(config);
|
||||||
|
this.readerStorage = new ReaderStorage();
|
||||||
this.readerWorker = new ReaderWorker(config);
|
this.readerWorker = new ReaderWorker(config);
|
||||||
|
this.workerState = new WorkerState();
|
||||||
}
|
}
|
||||||
|
|
||||||
async loadBook(req, res) {
|
async loadBook(req, res) {
|
||||||
@@ -19,7 +21,7 @@ class ReaderController extends BaseController {
|
|||||||
url: request.url,
|
url: request.url,
|
||||||
enableSitesFilter: (request.hasOwnProperty('enableSitesFilter') ? request.enableSitesFilter : true)
|
enableSitesFilter: (request.hasOwnProperty('enableSitesFilter') ? request.enableSitesFilter : true)
|
||||||
});
|
});
|
||||||
const state = workerState.getState(workerId);
|
const state = this.workerState.getState(workerId);
|
||||||
return (state ? state : {});
|
return (state ? state : {});
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
error = e.message;
|
error = e.message;
|
||||||
@@ -38,7 +40,7 @@ class ReaderController extends BaseController {
|
|||||||
if (!request.items || Array.isArray(request.data))
|
if (!request.items || Array.isArray(request.data))
|
||||||
throw new Error(`key 'items' is empty`);
|
throw new Error(`key 'items' is empty`);
|
||||||
|
|
||||||
return await readerStorage.doAction(request);
|
return await this.readerStorage.doAction(request);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
error = e.message;
|
error = e.message;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,12 @@
|
|||||||
const BaseController = require('./BaseController');
|
const BaseController = require('./BaseController');
|
||||||
const workerState = require('../core/workerState');
|
const WorkerState = require('../core/WorkerState');//singleton
|
||||||
|
|
||||||
class WorkerController extends BaseController {
|
class WorkerController extends BaseController {
|
||||||
|
constructor(config) {
|
||||||
|
super(config);
|
||||||
|
this.workerState = new WorkerState();
|
||||||
|
}
|
||||||
|
|
||||||
async getState(req, res) {
|
async getState(req, res) {
|
||||||
const request = req.body;
|
const request = req.body;
|
||||||
let error = '';
|
let error = '';
|
||||||
@@ -9,7 +14,7 @@ class WorkerController extends BaseController {
|
|||||||
if (!request.workerId)
|
if (!request.workerId)
|
||||||
throw new Error(`key 'workerId' is wrong`);
|
throw new Error(`key 'workerId' is wrong`);
|
||||||
|
|
||||||
const state = workerState.getState(request.workerId);
|
const state = this.workerState.getState(request.workerId);
|
||||||
return (state ? state : {});
|
return (state ? state : {});
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
error = e.message;
|
error = e.message;
|
||||||
|
|||||||
49
server/core/AppLogger.js
Normal file
49
server/core/AppLogger.js
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
const fs = require('fs-extra');
|
||||||
|
const Logger = require('./Logger');
|
||||||
|
|
||||||
|
let instance = null;
|
||||||
|
|
||||||
|
//singleton
|
||||||
|
class AppLogger {
|
||||||
|
constructor() {
|
||||||
|
if (!instance) {
|
||||||
|
instance = this;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.inited = false;
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
async init(config) {
|
||||||
|
if (this.inited)
|
||||||
|
throw new Error('already inited');
|
||||||
|
|
||||||
|
let loggerParams = null;
|
||||||
|
|
||||||
|
if (config.loggingEnabled) {
|
||||||
|
await fs.ensureDir(config.logDir);
|
||||||
|
loggerParams = [
|
||||||
|
{log: 'ConsoleLog'},
|
||||||
|
{log: 'FileLog', fileName: `${config.logDir}/${config.name}.log`},
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
this._logger = new Logger(loggerParams);
|
||||||
|
|
||||||
|
this.inited = true;
|
||||||
|
return this.logger;
|
||||||
|
}
|
||||||
|
|
||||||
|
get logger() {
|
||||||
|
if (!this.inited)
|
||||||
|
throw new Error('not inited');
|
||||||
|
return this._logger;
|
||||||
|
}
|
||||||
|
|
||||||
|
get log() {
|
||||||
|
const l = this.logger;
|
||||||
|
return l.log.bind(l);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = AppLogger;
|
||||||
@@ -1,10 +1,9 @@
|
|||||||
const fs = require('fs-extra');
|
const fs = require('fs-extra');
|
||||||
const zlib = require('zlib');
|
const zlib = require('zlib');
|
||||||
const crypto = require('crypto');
|
|
||||||
const path = require('path');
|
const path = require('path');
|
||||||
const unbzip2Stream = require('unbzip2-stream');
|
const unbzip2Stream = require('unbzip2-stream');
|
||||||
const tar = require('tar-fs');
|
const tar = require('tar-fs');
|
||||||
const AdmZip = require('adm-zip');
|
const ZipStreamer = require('./ZipStreamer');
|
||||||
|
|
||||||
const utils = require('./utils');
|
const utils = require('./utils');
|
||||||
const FileDetector = require('./FileDetector');
|
const FileDetector = require('./FileDetector');
|
||||||
@@ -112,18 +111,8 @@ class FileDecompressor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async unZip(filename, outputDir) {
|
async unZip(filename, outputDir) {
|
||||||
return new Promise((resolve) => {
|
const zip = new ZipStreamer();
|
||||||
const files = [];
|
return await zip.unpack(filename, outputDir);
|
||||||
const zip = new AdmZip(filename);
|
|
||||||
|
|
||||||
zip.getEntries().forEach(function(zipEntry) {
|
|
||||||
files.push({path: zipEntry.entryName, size: zipEntry.header.size});
|
|
||||||
});
|
|
||||||
|
|
||||||
zip.extractAllTo(outputDir, true);
|
|
||||||
|
|
||||||
resolve(files);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
unBz2(filename, outputDir) {
|
unBz2(filename, outputDir) {
|
||||||
@@ -163,7 +152,7 @@ class FileDecompressor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
decompressByStream(stream, filename, outputDir) {
|
decompressByStream(stream, filename, outputDir) {
|
||||||
return new Promise(async(resolve, reject) => {
|
return new Promise((resolve, reject) => { (async() => {
|
||||||
const file = {path: path.parse(filename).name};
|
const file = {path: path.parse(filename).name};
|
||||||
let outFilename = `${outputDir}/${file.path}`;
|
let outFilename = `${outputDir}/${file.path}`;
|
||||||
if (await fs.pathExists(outFilename)) {
|
if (await fs.pathExists(outFilename)) {
|
||||||
@@ -183,20 +172,12 @@ class FileDecompressor {
|
|||||||
resolve([file]);
|
resolve([file]);
|
||||||
});
|
});
|
||||||
|
|
||||||
stream.on('error', (err) => {
|
stream.on('error', reject);
|
||||||
reject(err);
|
inputStream.on('error', reject);
|
||||||
});
|
outputStream.on('error', reject);
|
||||||
|
|
||||||
inputStream.on('error', (err) => {
|
|
||||||
reject(err);
|
|
||||||
});
|
|
||||||
|
|
||||||
outputStream.on('error', (err) => {
|
|
||||||
reject(err);
|
|
||||||
});
|
|
||||||
|
|
||||||
inputStream.pipe(stream).pipe(outputStream);
|
inputStream.pipe(stream).pipe(outputStream);
|
||||||
});
|
})().catch(reject); });
|
||||||
}
|
}
|
||||||
|
|
||||||
async gzipBuffer(buf) {
|
async gzipBuffer(buf) {
|
||||||
@@ -208,15 +189,26 @@ class FileDecompressor {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async gzipFileIfNotExists(filename, outDir) {
|
async gzipFile(inputFile, outputFile) {
|
||||||
const buf = await fs.readFile(filename);
|
return new Promise((resolve, reject) => {
|
||||||
|
const gzip = zlib.createGzip({level: 1});
|
||||||
|
const input = fs.createReadStream(inputFile);
|
||||||
|
const output = fs.createWriteStream(outputFile);
|
||||||
|
|
||||||
const hash = crypto.createHash('sha256').update(buf).digest('hex');
|
input.pipe(gzip).pipe(output).on('finish', (err) => {
|
||||||
|
if (err) reject(err);
|
||||||
|
else resolve();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async gzipFileIfNotExists(filename, outDir) {
|
||||||
|
const hash = await utils.getFileHash(filename, 'sha256', 'hex');
|
||||||
|
|
||||||
const outFilename = `${outDir}/${hash}`;
|
const outFilename = `${outDir}/${hash}`;
|
||||||
|
|
||||||
if (!await fs.pathExists(outFilename)) {
|
if (!await fs.pathExists(outFilename)) {
|
||||||
await fs.writeFile(outFilename, await this.gzipBuffer(buf))
|
await this.gzipFile(filename, outFilename);
|
||||||
} else {
|
} else {
|
||||||
await utils.touchFile(outFilename);
|
await utils.touchFile(outFilename);
|
||||||
}
|
}
|
||||||
|
|||||||
209
server/core/LibSharedStorage/MegaStorage.js
Normal file
209
server/core/LibSharedStorage/MegaStorage.js
Normal file
@@ -0,0 +1,209 @@
|
|||||||
|
const _ = require('lodash');
|
||||||
|
const fs = require('fs-extra');
|
||||||
|
const path = require('path');
|
||||||
|
|
||||||
|
const log = new (require('../AppLogger'))().log;//singleton
|
||||||
|
const ZipStreamer = require('../ZipStreamer');
|
||||||
|
|
||||||
|
const utils = require('../utils');
|
||||||
|
|
||||||
|
const zeroStats = {
|
||||||
|
zipFilesCount: 0,
|
||||||
|
descFilesCount: 0,
|
||||||
|
zipFilesSize: 0,
|
||||||
|
descFilesSize: 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
let instance = null;
|
||||||
|
|
||||||
|
//singleton
|
||||||
|
class MegaStorage {
|
||||||
|
constructor() {
|
||||||
|
if (!instance) {
|
||||||
|
this.inited = false;
|
||||||
|
|
||||||
|
this.debouncedSaveStats = _.debounce(() => {
|
||||||
|
this.saveStats().catch((e) => {
|
||||||
|
log(LM_ERR, `MegaStorage::saveStats ${e.message}`);
|
||||||
|
//process.exit(1);
|
||||||
|
});
|
||||||
|
}, 5000, {'maxWait':6000});
|
||||||
|
|
||||||
|
process.on('exit', () => {
|
||||||
|
this.saveStatsSync();
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
instance = this;
|
||||||
|
}
|
||||||
|
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
async init(config) {
|
||||||
|
this.config = config;
|
||||||
|
this.megaStorageDir = config.megaStorageDir;
|
||||||
|
this.statsPath = `${this.megaStorageDir}/stats.json`;
|
||||||
|
this.compressLevel = (config.compressLevel ? config.compressLevel : 4);
|
||||||
|
await fs.ensureDir(this.megaStorageDir);
|
||||||
|
|
||||||
|
this.readingFiles = false;
|
||||||
|
this.stats = _.cloneDeep(zeroStats);
|
||||||
|
|
||||||
|
if (await fs.pathExists(this.statsPath)) {
|
||||||
|
this.stats = Object.assign({},
|
||||||
|
this.stats,
|
||||||
|
JSON.parse(await fs.readFile(this.statsPath, 'utf8'))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.inited = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
async nameHash(filename) {
|
||||||
|
if (!this.inited)
|
||||||
|
throw new Error('not inited');
|
||||||
|
const hash = utils.toBase36(await utils.getFileHash(filename, 'sha1'));
|
||||||
|
const hashPath = `${hash.substr(0, 2)}/${hash.substr(2, 2)}/${hash}`;
|
||||||
|
const fullHashPath = `${this.megaStorageDir}/${hashPath}`;
|
||||||
|
return {
|
||||||
|
filename,
|
||||||
|
hash,
|
||||||
|
hashPath,
|
||||||
|
fullHashPath,
|
||||||
|
zipPath: `${fullHashPath}.zip`,
|
||||||
|
descPath: `${fullHashPath}.desc`,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
async checkFileExists(nameHash) {
|
||||||
|
return await fs.pathExists(nameHash.zipPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
async addFile(nameHash, desc = null, force = false) {
|
||||||
|
if (!this.inited)
|
||||||
|
throw new Error('not inited');
|
||||||
|
if (await this.checkFileExists(nameHash) && !force)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
await fs.ensureDir(path.dirname(nameHash.zipPath));
|
||||||
|
let oldZipSize = 0;
|
||||||
|
let newZipCount = 1;
|
||||||
|
if (await fs.pathExists(nameHash.zipPath)) {
|
||||||
|
oldZipSize = (await fs.stat(nameHash.zipPath)).size;
|
||||||
|
newZipCount = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
const zip = new ZipStreamer();
|
||||||
|
let entry = {};
|
||||||
|
let resultFile = await zip.pack(nameHash.zipPath, [nameHash.filename], {zlib: {level: this.compressLevel}}, (ent) => {
|
||||||
|
entry = ent;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (desc) {
|
||||||
|
desc = Object.assign({}, desc, {fileSize: entry.size, zipFileSize: resultFile.size});
|
||||||
|
await this.updateDesc(nameHash, desc);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.stats.zipFilesSize += -oldZipSize + resultFile.size;
|
||||||
|
this.stats.zipFilesCount += newZipCount;
|
||||||
|
this.needSaveStats = true;
|
||||||
|
|
||||||
|
this.debouncedSaveStats();
|
||||||
|
return desc;
|
||||||
|
}
|
||||||
|
|
||||||
|
async updateDesc(nameHash, desc) {
|
||||||
|
let oldDescSize = 0;
|
||||||
|
let newDescCount = 1;
|
||||||
|
if (await fs.pathExists(nameHash.descPath)) {
|
||||||
|
oldDescSize = (await fs.stat(nameHash.descPath)).size;
|
||||||
|
newDescCount = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
const data = JSON.stringify(desc, null, 2);
|
||||||
|
await fs.writeFile(nameHash.descPath, data);
|
||||||
|
|
||||||
|
this.stats.descFilesSize += -oldDescSize + data.length;
|
||||||
|
this.stats.descFilesCount += newDescCount;
|
||||||
|
this.needSaveStats = true;
|
||||||
|
|
||||||
|
this.debouncedSaveStats();
|
||||||
|
}
|
||||||
|
|
||||||
|
async _findFiles(callback, dir) {
|
||||||
|
if (!callback || !this.readingFiles)
|
||||||
|
return;
|
||||||
|
|
||||||
|
let result = true;
|
||||||
|
const files = await fs.readdir(dir, { withFileTypes: true });
|
||||||
|
for (const file of files) {
|
||||||
|
if (!this.readingFiles)
|
||||||
|
return;
|
||||||
|
const found = path.resolve(dir, file.name);
|
||||||
|
if (file.isDirectory())
|
||||||
|
result = await this._findFiles(callback, found);
|
||||||
|
else
|
||||||
|
await callback(found);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
async startFindFiles(callback) {
|
||||||
|
if (!this.inited)
|
||||||
|
throw new Error('not inited');
|
||||||
|
this.readingFiles = true;
|
||||||
|
try {
|
||||||
|
return await this._findFiles(callback, this.megaStorageDir);
|
||||||
|
} finally {
|
||||||
|
this.readingFiles = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async stopFindFiles() {
|
||||||
|
this.readingFiles = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
async saveStats() {
|
||||||
|
if (this.needSaveStats) {
|
||||||
|
await fs.writeFile(this.statsPath, JSON.stringify(this.stats, null, 2));
|
||||||
|
this.needSaveStats = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
saveStatsSync() {
|
||||||
|
if (this.needSaveStats) {
|
||||||
|
fs.writeFileSync(this.statsPath, JSON.stringify(this.stats, null, 2));
|
||||||
|
this.needSaveStats = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async getStats(gather = false) {
|
||||||
|
if (!this.inited)
|
||||||
|
throw new Error('MegaStorage::not inited');
|
||||||
|
if (!gather || this.readingFiles)
|
||||||
|
return this.stats;
|
||||||
|
|
||||||
|
let stats = _.cloneDeep(zeroStats);
|
||||||
|
const result = await this.startFindFiles(async(entry) => {
|
||||||
|
if (path.extname(entry) == '.zip') {
|
||||||
|
stats.zipFilesSize += (await fs.stat(entry)).size;
|
||||||
|
stats.zipFilesCount++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (path.extname(entry) == '.desc') {
|
||||||
|
stats.descFilesSize += (await fs.stat(entry)).size;
|
||||||
|
stats.descFilesCount++;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (result) {
|
||||||
|
this.stats = stats;
|
||||||
|
this.needSaveStats = true;
|
||||||
|
this.debouncedSaveStats();
|
||||||
|
}
|
||||||
|
return this.stats;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = MegaStorage;
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user