202 lines
10 KiB
HTML
Executable File
202 lines
10 KiB
HTML
Executable File
{% extends "base.html" %}
|
|
|
|
{% block content %}
|
|
{% include 'admin_nav.html' %}
|
|
|
|
<div class="admin-container">
|
|
<div class="admin-content">
|
|
<!-- 添加应用部分 -->
|
|
<div class="admin-grid" id="add-app">
|
|
<div class="admin-card">
|
|
<div class="card-header">
|
|
<div class="header-left">
|
|
<i class="fas fa-plus-circle"></i>
|
|
<h3>添加新应用</h3>
|
|
</div>
|
|
</div>
|
|
<form onsubmit="submitAddAppForm(event, this)" enctype="multipart/form-data" class="admin-form">
|
|
<div class="form-group">
|
|
<label for="app-name">应用名称</label>
|
|
<input type="text" id="app-name" name="name" placeholder="请输入应用名称" required>
|
|
</div>
|
|
{% if is_superadmin() %}
|
|
<div class="form-group">
|
|
<label for="app-icon">应用图标</label>
|
|
<div class="file-input-wrapper">
|
|
<input type="file" id="app-icon" name="icon">
|
|
<label for="app-icon" class="file-input-label">
|
|
<i class="fas fa-cloud-upload-alt"></i>
|
|
<span>选择文件</span>
|
|
</label>
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="icon-url">或输入图标URL</label>
|
|
<input type="url" id="icon-url" name="icon_url" placeholder="http://example.com/icon.png">
|
|
</div>
|
|
</div>
|
|
{% else %}
|
|
<div class="form-group">
|
|
<label for="icon-url">图标URL</label>
|
|
<input type="url" id="icon-url" name="icon_url" placeholder="http://example.com/icon.png" required>
|
|
</div>
|
|
{% endif %}
|
|
<div class="form-group">
|
|
<label for="category">分类</label>
|
|
<select id="category" name="category_id" required>
|
|
{% for category in categories %}
|
|
<option value="{{ category.id }}">{{ category.name }}</option>
|
|
{% endfor %}
|
|
</select>
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="download-url">下载链接(可选)</label>
|
|
<input type="url" id="download-url" name="download_url" placeholder="http://example.com/download">
|
|
</div>
|
|
<button type="submit" class="btn-primary">
|
|
<i class="fas fa-plus"></i> 添加应用
|
|
</button>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- 分类管理部分 -->
|
|
<div class="admin-grid" id="categories">
|
|
<div class="admin-card">
|
|
<div class="card-header">
|
|
<i class="fas fa-folder-plus"></i>
|
|
<h3>添加新分类</h3>
|
|
</div>
|
|
<form onsubmit="submitAddCategoryForm(event, this)" class="admin-form">
|
|
<div class="form-group">
|
|
<label for="category-name">分类名称</label>
|
|
<input type="text" id="category-name" name="name" placeholder="请输入分类名称" required>
|
|
</div>
|
|
<button type="submit" class="btn-primary">
|
|
<i class="fas fa-plus"></i> 添加分类
|
|
</button>
|
|
</form>
|
|
|
|
<!-- 分类磁贴区域 -->
|
|
<div class="category-tiles">
|
|
{% for category in categories %}
|
|
{% if is_superadmin() %}
|
|
<div class="category-tile" ondblclick="enableEdit(this, '{{ category.id }}')">
|
|
<span class="category-name" data-id="{{ category.id }}">{{ category.name }}</span>
|
|
<form action="{{ url_for('edit_category', category_id=category.id) }}"
|
|
method="POST"
|
|
class="edit-category-form"
|
|
style="display: none;">
|
|
<input type="text" name="name" value="{{ category.name }}"
|
|
class="edit-category-input"
|
|
onblur="submitForm(this.form)"
|
|
onkeydown="handleKeyPress(event, this.form)">
|
|
</form>
|
|
<a href="{{ url_for('delete_category', category_id=category.id) }}"
|
|
class="delete-category"
|
|
onclick="return confirm('确定要删除这个分类吗?')">
|
|
<i class="fas fa-times"></i>
|
|
</a>
|
|
</div>
|
|
{% else %}
|
|
<div class="category-tile">
|
|
<span class="category-name">{{ category.name }}</span>
|
|
</div>
|
|
{% endif %}
|
|
{% endfor %}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- 应用管理部分 -->
|
|
<div class="admin-card full-width" id="apps">
|
|
<div class="card-header">
|
|
<div class="header-left">
|
|
<i class="fas fa-th-large"></i>
|
|
<h3>应用管理 {% if search %}(搜索结果){% else %}(共{{ apps|length }}个){% endif %}</h3>
|
|
</div>
|
|
<form class="search-form header-search" method="GET" action="{{ url_for('admin') }}">
|
|
<div class="search-wrapper">
|
|
<i class="fas fa-search"></i>
|
|
<input type="text" name="search" placeholder="搜索应用..." value="{{ search }}">
|
|
</div>
|
|
</form>
|
|
</div>
|
|
|
|
<!-- 批量操作按钮 -->
|
|
{% if is_superadmin() %}
|
|
<div class="batch-operations">
|
|
<button onclick="deleteSelected()" class="btn-delete" id="delete-selected" style="display: none;">
|
|
<i class="fas fa-trash"></i> 批量删除
|
|
</button>
|
|
</div>
|
|
{% endif %}
|
|
|
|
<div class="table-responsive">
|
|
<table class="admin-table">
|
|
<thead>
|
|
<tr>
|
|
<th><input type="checkbox" id="select-all" onclick="toggleSelectAll()"></th>
|
|
<th>图标</th>
|
|
<th>名称</th>
|
|
<th>分类</th>
|
|
<th>添加时间</th>
|
|
<th>操作</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for app in apps %}
|
|
<tr>
|
|
<td><input type="checkbox" class="app-checkbox" value="{{ app.id }}"></td>
|
|
<td>
|
|
<div class="app-icon-small">
|
|
{% if 'http' in app.icon_path %}
|
|
<img src="{{ app.icon_path }}" alt="{{ app.name }}">
|
|
{% else %}
|
|
<img src="{{ url_for('static', filename='uploads/' + app.icon_path) }}" alt="{{ app.name }}">
|
|
{% endif %}
|
|
</div>
|
|
</td>
|
|
<td>
|
|
<form onsubmit="submitEditForm(event, this)" class="edit-form">
|
|
<input type="hidden" name="app_id" value="{{ app.id }}">
|
|
<div class="edit-group">
|
|
<input type="text" name="name" value="{{ app.name }}" required placeholder="应用名称">
|
|
<select name="category_id" required>
|
|
{% for category in categories %}
|
|
<option value="{{ category.id }}" {% if category.id == app.category_id %}selected{% endif %}>
|
|
{{ category.name }}
|
|
</option>
|
|
{% endfor %}
|
|
</select>
|
|
<button type="submit" class="btn-edit" title="保存">
|
|
<i class="fas fa-save"></i> 保存
|
|
</button>
|
|
</div>
|
|
</form>
|
|
</td>
|
|
<td>
|
|
{% for category in categories %}
|
|
{% if category.id == app.category_id %}
|
|
{{ category.name }}
|
|
{% endif %}
|
|
{% endfor %}
|
|
</td>
|
|
<td>{{ app.created_at }}</td>
|
|
<td>
|
|
<div class="action-buttons">
|
|
{% if is_superadmin() %}
|
|
<a href="#" class="btn-delete" onclick="deleteApp('{{ app.id }}'); return false;">
|
|
<i class="fas fa-trash"></i>
|
|
</a>
|
|
{% endif %}
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endblock %} |