Implement Node.js backend rewrite with SQLite authentication, admin dashboard and One-Click docker update
This commit is contained in:
104
assets/js/admin.js
Normal file
104
assets/js/admin.js
Normal file
@@ -0,0 +1,104 @@
|
||||
$(document).ready(function() {
|
||||
// Check if admin
|
||||
$.get('/api/auth/me')
|
||||
.done(function(user) {
|
||||
console.log("Logged in:", user);
|
||||
if(user.role !== 'admin') {
|
||||
alert("Kein Zugriff!");
|
||||
window.location.href = '/';
|
||||
} else {
|
||||
loadUsers();
|
||||
loadAssignmentImages();
|
||||
$('body').removeClass('is-preload');
|
||||
}
|
||||
})
|
||||
.fail(function() {
|
||||
window.location.href = '/';
|
||||
});
|
||||
|
||||
$('#logout-btn').click(function(e) {
|
||||
e.preventDefault();
|
||||
$.post('/api/auth/logout').done(function() { window.location.href = '/'; });
|
||||
});
|
||||
|
||||
function loadUsers() {
|
||||
$.get('/api/admin/users').done(function(users) {
|
||||
$('#users-tbody').empty();
|
||||
$('#user-select').html('<option value="">Nutzer wählen...</option>');
|
||||
users.forEach(u => {
|
||||
$('#users-tbody').append(`
|
||||
<tr>
|
||||
<td>${u.id}</td>
|
||||
<td>${u.username} ${u.role==='admin'?'(Admin)':''}</td>
|
||||
<td>${u.id !== 1 ? `<button onclick="deleteUser(${u.id})">Löschen</button>` : ''}</td>
|
||||
</tr>
|
||||
`);
|
||||
if(u.role !== 'admin') {
|
||||
$('#user-select').append(`<option value="${u.id}">${u.username}</option>`);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
window.deleteUser = function(id) {
|
||||
if(confirm("Nutzer löschen?")) {
|
||||
$.ajax({url: '/api/admin/users/'+id, type: 'DELETE'}).done(loadUsers);
|
||||
}
|
||||
};
|
||||
|
||||
$('#create-user-form').submit(function(e) {
|
||||
e.preventDefault();
|
||||
$.post('/api/admin/users', { username: $('#new-username').val(), password: $('#new-password').val(), role: 'user' })
|
||||
.done(function() {
|
||||
$('#new-username').val('');
|
||||
$('#new-password').val('');
|
||||
loadUsers();
|
||||
}).fail(function(err) { alert("Fehler: " + err.responseJSON.error); });
|
||||
});
|
||||
|
||||
let allImages = [];
|
||||
function loadAssignmentImages() {
|
||||
$.get('/images/fulls/').done(function(files) {
|
||||
allImages = files;
|
||||
$('#image-checkboxes').empty();
|
||||
files.forEach(f => {
|
||||
$('#image-checkboxes').append(`
|
||||
<label class="img-check">
|
||||
<img src="/images/thumbs/${encodeURIComponent(f.name)}" />
|
||||
<br/><input type="checkbox" value="${f.name}" class="img-cb"/>
|
||||
</label>
|
||||
`);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
$('#user-select').change(function() {
|
||||
const uid = $(this).val();
|
||||
$('.img-cb').prop('checked', false);
|
||||
if(!uid) return;
|
||||
$.get('/api/admin/assign').done(function(assignments) {
|
||||
assignments.filter(a => a.user_id == uid).forEach(a => {
|
||||
$(`.img-cb[value="${a.image_name}"]`).prop('checked', true);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
$('#save-assignments').click(function() {
|
||||
const uid = $('#user-select').val();
|
||||
if(!uid) return alert('Bitte Nutzer wählen');
|
||||
const selected = [];
|
||||
$('.img-cb:checked').each(function() { selected.push($(this).val()); });
|
||||
|
||||
$.post('/api/admin/assign', { user_id: uid, image_names: selected })
|
||||
.done(function() { alert("Zuweisung gespeichert!"); });
|
||||
});
|
||||
|
||||
$('#update-btn').click(function() {
|
||||
if(!confirm("Achtung: Dies startet den Server neu. Fortfahren?")) return;
|
||||
$('#update-status').text('Update läuft...');
|
||||
$.post('/api/admin/update').done(function(res) {
|
||||
$('#update-status').text(res.message);
|
||||
setTimeout(() => { window.location.reload(); }, 5000);
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -160,6 +160,11 @@
|
||||
dataType: 'json',
|
||||
cache: false,
|
||||
success: function(files) {
|
||||
if(files.length === 0) {
|
||||
$main.html('<p style="text-align:center;color:#fff;padding:2em;width:100%">Bitte logge dich über den Login-Button unten links ein, um deine zugewiesenen Bilder zu sehen.</p>');
|
||||
return;
|
||||
}
|
||||
|
||||
var images = files.filter(function(f) {
|
||||
if (f.type !== 'file') return false;
|
||||
var ext = f.name.split('.').pop().toLowerCase();
|
||||
@@ -167,7 +172,7 @@
|
||||
});
|
||||
|
||||
if (images.length === 0) {
|
||||
$main.html('<p style="text-align:center;color:#fff;padding:2em;">JSON Array from Nginx was loaded, but 0 images matched!<br/>Raw files: ' + JSON.stringify(files) + '</p>');
|
||||
$main.html('<p style="text-align:center;color:#fff;padding:2em;width:100%">Es wurden noch keine passenden Bilder für diesen Account hochgeladen oder zugewiesen.</p>');
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -225,7 +230,8 @@
|
||||
data = exifDatas[$image_img.data('name')] = getExifDataMarkup(this);
|
||||
});
|
||||
}
|
||||
return data !== undefined ? '<p>' + data + '</p>' : ' ';
|
||||
var downBtn = '<br/><a href="' + $a.attr('href') + '" download="' + $image_img.data('name') + '" class="button small" style="margin-top:10px;">Bild Speichern <i class="fa fa-download"></i></a>';
|
||||
return data !== undefined ? '<p>' + data + downBtn + '</p>' : '<p>' + downBtn + '</p>';
|
||||
},
|
||||
fadeSpeed: 300,
|
||||
onPopupClose: function () {
|
||||
@@ -273,7 +279,26 @@
|
||||
return template;
|
||||
}
|
||||
|
||||
// Galerie laden
|
||||
loadGallery();
|
||||
// Login Handling
|
||||
$.get('/api/auth/me').done(function(u) {
|
||||
$('#login-username, #login-password, #login-submit').hide();
|
||||
$('#logout-btn').show().css('display', 'inline-block');
|
||||
if(u.role === 'admin') {
|
||||
$('#admin-link').html('<a href="/admin.html" class="button">Admin-Dashboard</a>');
|
||||
}
|
||||
$('#login-nav').html('Account <i class="fa fa-user"></i>');
|
||||
});
|
||||
|
||||
$('#login-form').submit(function(e) {
|
||||
e.preventDefault();
|
||||
$.post('/api/auth/login', { username: $('#login-username').val(), password: $('#login-password').val() })
|
||||
.done(function() { window.location.reload(); })
|
||||
.fail(function(err) { alert("Login fehlgeschlagen. Bitte Zugangsdaten ueberpruefen."); });
|
||||
});
|
||||
|
||||
$('#logout-btn').click(function(e) {
|
||||
e.preventDefault();
|
||||
$.post('/api/auth/logout').done(function() { window.location.reload(); });
|
||||
});
|
||||
|
||||
})(jQuery);
|
||||
|
||||
Reference in New Issue
Block a user