init: Wardrobe 衣物管理系统 - 项目首页、OTA 升级、Android CI/CD
- 响应式项目首页 (Landing, 含 R2 APK 下载) + 路由 /home 调整 - OTA 升级: tauri-plugin-hotswap (lib.rs/main.rs 拆分, 客户端热替换) - OTA 服务端 (check/bundle/manifest-web) + build-ota/genkey/upload 脚本 - 密钥/凭据统一存配置中心 (signing + ota + cloudflare 分组) - Android CI (android-* 分支) + OTA CI (手动触发), 产物上传 R2 - 修复 tsc/构建阻塞问题
This commit is contained in:
Vendored
+121
@@ -0,0 +1,121 @@
|
||||
let currentPage = 'page-home';
|
||||
let currentView = 'grid';
|
||||
|
||||
function showPage(pageId) {
|
||||
document.querySelectorAll('.page').forEach(p => p.classList.remove('active'));
|
||||
document.getElementById(pageId).classList.add('active');
|
||||
currentPage = pageId;
|
||||
|
||||
// Update nav
|
||||
const navMap = {
|
||||
'page-home': 0,
|
||||
'page-outfit': 1,
|
||||
'page-add': 2,
|
||||
'page-closet': 3,
|
||||
'page-profile': 4,
|
||||
'page-detail': -1,
|
||||
'page-calendar': -1
|
||||
};
|
||||
const idx = navMap[pageId];
|
||||
if (idx >= 0) {
|
||||
document.querySelectorAll('.nav-item').forEach((n, i) => {
|
||||
n.classList.toggle('active', i === idx);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function navTo(el, pageId) {
|
||||
document.querySelectorAll('.nav-item').forEach(n => n.classList.remove('active'));
|
||||
el.classList.add('active');
|
||||
showPage(pageId);
|
||||
}
|
||||
|
||||
function setView(view) {
|
||||
currentView = view;
|
||||
const grid = document.getElementById('closet-grid');
|
||||
const list = document.getElementById('closet-list');
|
||||
const gridBtn = document.getElementById('grid-view-btn');
|
||||
const listBtn = document.getElementById('list-view-btn');
|
||||
|
||||
if (view === 'grid') {
|
||||
grid.style.display = 'grid';
|
||||
list.classList.add('hidden');
|
||||
gridBtn.classList.add('active');
|
||||
listBtn.classList.remove('active');
|
||||
} else {
|
||||
grid.style.display = 'none';
|
||||
list.classList.remove('hidden');
|
||||
gridBtn.classList.remove('active');
|
||||
listBtn.classList.add('active');
|
||||
}
|
||||
}
|
||||
|
||||
function filterCloset(btn, cat) {
|
||||
document.querySelectorAll('.filter-bar:first-of-type .filter-btn').forEach(b => b.classList.remove('active'));
|
||||
btn.classList.add('active');
|
||||
|
||||
const cards = document.querySelectorAll('.clothing-card');
|
||||
cards.forEach(card => {
|
||||
if (cat === 'all' || card.dataset.cat === cat) {
|
||||
card.style.display = '';
|
||||
} else {
|
||||
card.style.display = 'none';
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function selectColor(el) {
|
||||
document.querySelectorAll('.color-dot').forEach(d => d.classList.remove('active'));
|
||||
el.classList.add('active');
|
||||
}
|
||||
|
||||
function simulateUpload() {
|
||||
const placeholder = document.getElementById('upload-placeholder');
|
||||
const preview = document.getElementById('upload-preview');
|
||||
if (placeholder && preview) {
|
||||
placeholder.style.display = 'none';
|
||||
preview.classList.remove('hidden');
|
||||
}
|
||||
}
|
||||
|
||||
function resetUpload() {
|
||||
const placeholder = document.getElementById('upload-placeholder');
|
||||
const preview = document.getElementById('upload-preview');
|
||||
if (placeholder && preview) {
|
||||
placeholder.style.display = '';
|
||||
preview.classList.add('hidden');
|
||||
}
|
||||
}
|
||||
|
||||
function showToast(msg) {
|
||||
const toast = document.getElementById('toast');
|
||||
toast.textContent = msg;
|
||||
toast.classList.remove('hidden');
|
||||
setTimeout(() => toast.classList.add('hidden'), 1500);
|
||||
}
|
||||
|
||||
function confirmDelete() {
|
||||
document.getElementById('delete-modal').classList.remove('hidden');
|
||||
}
|
||||
|
||||
function hideModal() {
|
||||
document.getElementById('delete-modal').classList.add('hidden');
|
||||
}
|
||||
|
||||
function refreshOutfit() {
|
||||
showToast('已刷新推荐搭配');
|
||||
}
|
||||
|
||||
// Tag toggle
|
||||
document.addEventListener('click', function(e) {
|
||||
if (e.target.classList.contains('selectable-tag')) {
|
||||
e.target.classList.toggle('active');
|
||||
}
|
||||
if (e.target.classList.contains('filter-btn') && !e.target.closest('.filter-bar:first-of-type') && !e.target.closest('.filter-group')) {
|
||||
const group = e.target.closest('.filter-btns');
|
||||
if (group) {
|
||||
group.querySelectorAll('.filter-btn').forEach(b => b.classList.remove('active'));
|
||||
e.target.classList.add('active');
|
||||
}
|
||||
}
|
||||
});
|
||||
Reference in New Issue
Block a user