- ${isSafe ? '✅ 推荐投放' : '❌ 危险区域'}
+
+
${isSafe ? '✅' : '⚠️'}
+
+
${p.name}
+
安全系数: ${p.safety_score}% · 距离: ${p.distance}m
+
✓
`;
}).join('');
@@ -459,35 +478,54 @@ const App = (() => {
showToast('📍 已定位:' + p.name);
}
- // ===== 选择投放点(从列表) =====
- function selectDropPoint(index) {
- API.getDropPoints().then(async points => {
+ // ===== 从列表选择投放点 =====
+ async function selectDropPointFromList(index) {
+ try {
+ const points = await API.getDropPoints();
const p = points[index];
+ if (!p) return;
+
if (p.safety_score < 70) {
showToast('⚠️ 该区域危险,建议选择其他投放点');
return;
}
- selectedDropPoint = p;
-
- // 同时在地图上标记
+
+ // 在地图上标记
await LocationModule.setPickerPosition(p.lat, p.lng, p.name, p.address);
-
- // 更新选中显示
+
+ // 更新选中状态
mapSelectedPoint = {
lat: p.lat,
lng: p.lng,
name: p.name,
address: p.address || p.name
};
- const nameEl = document.getElementById('drop-selected-name');
- const addrEl = document.getElementById('drop-selected-address');
- const coordEl = document.getElementById('drop-selected-coords');
- if (nameEl) nameEl.textContent = p.name;
- if (addrEl) addrEl.textContent = p.address || '安全系数 ' + p.safety_score + '%';
- if (coordEl) coordEl.textContent = `${p.lat.toFixed(6)}, ${p.lng.toFixed(6)}`;
-
+
+ // 显示选中位置卡片
+ const selectedCard = document.getElementById('selected-location-card');
+ if (selectedCard) {
+ selectedCard.style.display = 'block';
+
+ const nameEl = document.getElementById('mini-selected-name');
+ const addrEl = document.getElementById('mini-selected-address');
+ if (nameEl) nameEl.textContent = p.name;
+ if (addrEl) addrEl.textContent = p.address || `安全系数 ${p.safety_score}%`;
+ }
+
showToast('已选择:' + p.name);
- });
+ } catch (e) {
+ showToast('选择失败');
+ }
+ }
+
+ // ===== 从地图选择投放点(点击选中的卡片) =====
+ function selectDropPointFromMap() {
+ if (!mapSelectedPoint) {
+ showToast('请先在地图上选择一个位置');
+ return;
+ }
+
+ showToast('📍 已确认:' + mapSelectedPoint.name);
}
function confirmDropPoint() {
@@ -495,18 +533,48 @@ const App = (() => {
if (mapSelectedPoint) {
selectedDropPoint = mapSelectedPoint;
router('demand');
- const display = document.getElementById('demand-drop-display');
- if (display) display.textContent = mapSelectedPoint.name;
+
+ // 更新填写物资信息页面的显示
+ const selectedCard = document.getElementById('selected-drop-card');
+ const dropDisplay = document.getElementById('demand-drop-display');
+
+ if (selectedCard && dropDisplay) {
+ // 隐藏默认显示,显示选中卡片
+ dropDisplay.style.display = 'none';
+ selectedCard.style.display = 'block';
+
+ // 更新卡片内容
+ const nameEl = document.getElementById('selected-drop-name');
+ const coordsEl = document.getElementById('selected-drop-coords');
+ if (nameEl) nameEl.textContent = mapSelectedPoint.name;
+ if (coordsEl) coordsEl.textContent = `${mapSelectedPoint.lat.toFixed(6)}, ${mapSelectedPoint.lng.toFixed(6)}`;
+ }
+
showToast('✅ 已确认投放点:' + mapSelectedPoint.name);
return;
}
+
// fallback到列表选中的点
if (selectedDropPoint) {
router('demand');
- const display = document.getElementById('demand-drop-display');
- if (display) display.textContent = selectedDropPoint.name;
+
+ const selectedCard = document.getElementById('selected-drop-card');
+ const dropDisplay = document.getElementById('demand-drop-display');
+
+ if (selectedCard && dropDisplay) {
+ dropDisplay.style.display = 'none';
+ selectedCard.style.display = 'block';
+
+ const nameEl = document.getElementById('selected-drop-name');
+ const coordsEl = document.getElementById('selected-drop-coords');
+ if (nameEl) nameEl.textContent = selectedDropPoint.name;
+ if (coordsEl) coordsEl.textContent = `${selectedDropPoint.lat.toFixed(6)}, ${selectedDropPoint.lng.toFixed(6)}`;
+ }
+
+ showToast('✅ 已确认投放点:' + selectedDropPoint.name);
return;
}
+
showToast('请先点击地图或列表选择一个投放点');
}
@@ -549,7 +617,11 @@ const App = (() => {
if (tstart) tstart.textContent = task.start_name || '后方阵地';
const ttarget = document.getElementById('task-target');
- if (ttarget) ttarget.textContent = task.target_name || '目标位置';
+ if (ttarget) {
+ // 优先使用选中的投放点名称,其次使用后端返回的 target_name
+ const targetName = selectedDropPoint ? selectedDropPoint.name : (task.target_name || '目标位置');
+ ttarget.textContent = targetName;
+ }
const trisk = document.getElementById('task-risk');
if (trisk) trisk.textContent = '安全系数: ' + (task.safety_score || 0) + '%';
@@ -692,9 +764,38 @@ const App = (() => {
}
}
- function updateDropPoint() {
- showToast('投放点已更新');
- setTimeout(() => router('task'), 500);
+ async function updateDropPoint() {
+ try {
+ showToast('正在获取当前位置...');
+
+ // 获取当前位置
+ const pos = await LocationModule.getCurrentPosition();
+
+ // 构建投放点对象
+ const newDropPoint = {
+ name: '当前位置 (' + pos.lat.toFixed(6) + ', ' + pos.lng.toFixed(6) + ')',
+ lat: pos.lat,
+ lng: pos.lng,
+ safety_score: 90, // 默认安全系数
+ address: 'GPS定位位置'
+ };
+
+ // 更新选中的投放点
+ selectedDropPoint = newDropPoint;
+ mapSelectedPoint = newDropPoint;
+
+ showToast('✅ 投放点已更新为当前位置');
+
+ // 跳转到任务页面
+ setTimeout(() => {
+ router('task');
+ // 强制刷新任务信息
+ loadTaskInfo();
+ }, 500);
+ } catch (e) {
+ showToast('❌ 获取位置失败:' + (e.message || '未知错误'));
+ console.error('updateDropPoint错误:', e);
+ }
}
// ===== 标注 =====
@@ -731,6 +832,446 @@ const App = (() => {
}
}
+ // ===== 主题切换 =====
+ function initTheme() {
+ const theme = CONFIG.theme || 'dark';
+ applyTheme(theme);
+ updateThemeDisplay();
+
+ // 如果是自动模式,监听系统主题变化
+ if (theme === 'auto') {
+ const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
+ mediaQuery.addEventListener('change', handleSystemThemeChange);
+ }
+ }
+
+ function applyTheme(theme) {
+ if (theme === 'auto') {
+ const isDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
+ document.documentElement.setAttribute('data-theme', isDark ? 'dark' : 'light');
+ } else {
+ document.documentElement.setAttribute('data-theme', theme);
+ }
+ }
+
+ function handleSystemThemeChange(e) {
+ if (CONFIG.theme === 'auto') {
+ applyTheme('auto');
+ const themeName = e.matches ? '深色' : '浅色';
+ showToast('系统主题已切换为:' + themeName + '模式');
+ }
+ }
+
+ function toggleTheme() {
+ // 创建自定义选择弹窗
+ const modal = document.createElement('div');
+ modal.style.cssText = `
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background: rgba(0,0,0,0.5);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ z-index: 10000;
+ `;
+
+ const content = document.createElement('div');
+ content.style.cssText = `
+ background: white;
+ border-radius: 12px;
+ padding: 20px;
+ min-width: 280px;
+ max-width: 90%;
+ `;
+
+ const title = document.createElement('div');
+ title.textContent = '选择主题模式';
+ title.style.cssText = `
+ font-size: 16px;
+ font-weight: 600;
+ color: #333;
+ margin-bottom: 16px;
+ text-align: center;
+ `;
+
+ const options = [
+ { value: 'dark', label: '🌙 深色模式', desc: '始终使用深色主题' },
+ { value: 'light', label: '☀️ 浅色模式', desc: '始终使用浅色主题' },
+ { value: 'auto', label: '🔄 跟随系统', desc: '自动跟随系统主题' }
+ ];
+
+ options.forEach((opt, index) => {
+ const optionDiv = document.createElement('div');
+ const isSelected = CONFIG.theme === opt.value;
+ optionDiv.style.cssText = `
+ padding: 12px 16px;
+ margin-bottom: ${index < options.length - 1 ? '8px' : '0'};
+ border-radius: 8px;
+ cursor: pointer;
+ background: ${isSelected ? '#E6F7FF' : '#f5f5f5'};
+ border: ${isSelected ? '2px solid #007AFF' : '2px solid transparent'};
+ transition: all 0.2s;
+ `;
+
+ optionDiv.innerHTML = `
+
+ ${opt.label}
+
+
+ ${opt.desc}
+
+ `;
+
+ optionDiv.addEventListener('click', () => {
+ // 应用选择的主题
+ CONFIG.theme = opt.value;
+ localStorage.setItem('app_theme', CONFIG.theme);
+ applyTheme(CONFIG.theme);
+ updateThemeDisplay();
+
+ // 关闭弹窗
+ document.body.removeChild(modal);
+
+ const themeNames = {
+ 'dark': '深色模式',
+ 'light': '浅色模式',
+ 'auto': '环境跟随'
+ };
+ showToast('已切换到:' + themeNames[CONFIG.theme]);
+
+ // 如果切换到自动模式,开始监听系统主题
+ if (CONFIG.theme === 'auto') {
+ const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
+ mediaQuery.addEventListener('change', handleSystemThemeChange);
+ }
+ });
+
+ content.appendChild(optionDiv);
+ });
+
+ // 添加取消按钮
+ const cancelBtn = document.createElement('div');
+ cancelBtn.textContent = '取消';
+ cancelBtn.style.cssText = `
+ margin-top: 16px;
+ padding: 12px;
+ text-align: center;
+ color: #007AFF;
+ font-size: 14px;
+ cursor: pointer;
+ border-top: 1px solid #e0e0e0;
+ `;
+ cancelBtn.addEventListener('click', () => {
+ document.body.removeChild(modal);
+ });
+
+ content.appendChild(cancelBtn);
+ modal.appendChild(content);
+ document.body.appendChild(modal);
+
+ // 点击背景关闭
+ modal.addEventListener('click', (e) => {
+ if (e.target === modal) {
+ document.body.removeChild(modal);
+ }
+ });
+ }
+
+ function updateThemeDisplay() {
+ const themeEl = document.getElementById('theme-value');
+ if (!themeEl) return;
+
+ const themeIcons = {
+ 'dark': '◉ 深色',
+ 'light': '○ 浅色',
+ 'auto': '◎ 跟随系统'
+ };
+ themeEl.textContent = themeIcons[CONFIG.theme] + ' →';
+ }
+
+ // ===== 修改密码 =====
+ function showChangePasswordModal() {
+ // 获取当前主题
+ const currentTheme = document.documentElement.getAttribute('data-theme') || 'dark';
+ const isDark = currentTheme === 'dark';
+
+ // 主题颜色配置
+ const themeColors = {
+ bg: isDark ? '#1a1a2e' : 'white',
+ text: isDark ? '#e0e0e0' : '#333',
+ border: isDark ? '#2a2a3e' : '#e0e0e0',
+ inputBg: isDark ? '#16213e' : 'white',
+ cancelBg: isDark ? '#2a2a3e' : '#f5f5f5',
+ cancelText: isDark ? '#e0e0e0' : '#333'
+ };
+
+ // 创建弹窗
+ const modal = document.createElement('div');
+ modal.style.cssText = `
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background: rgba(0,0,0,0.5);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ z-index: 10000;
+ `;
+
+ const content = document.createElement('div');
+ content.style.cssText = `
+ background: ${themeColors.bg};
+ border-radius: 12px;
+ padding: 24px;
+ min-width: 320px;
+ max-width: 90%;
+ `;
+
+ const title = document.createElement('div');
+ title.textContent = '修改登录密码';
+ title.style.cssText = `
+ font-size: 18px;
+ font-weight: 600;
+ color: ${themeColors.text};
+ margin-bottom: 20px;
+ text-align: center;
+ `;
+
+ // 输入框配置
+ const inputs = [
+ { id: 'old-pwd', label: '原密码', type: 'password', placeholder: '请输入原密码' },
+ { id: 'new-pwd', label: '新密码', type: 'password', placeholder: '请输入新密码' },
+ { id: 'confirm-pwd', label: '确认新密码', type: 'password', placeholder: '请再次输入新密码' }
+ ];
+
+ inputs.forEach((input, index) => {
+ const group = document.createElement('div');
+ group.style.cssText = 'margin-bottom: 16px;';
+
+ const label = document.createElement('label');
+ label.textContent = input.label;
+ label.style.cssText = `
+ display: block;
+ font-size: 14px;
+ color: ${themeColors.text};
+ margin-bottom: 6px;
+ font-weight: 500;
+ `;
+
+ const inputWrapper = document.createElement('div');
+ inputWrapper.style.cssText = 'position: relative;';
+
+ const inputEl = document.createElement('input');
+ inputEl.type = input.type;
+ inputEl.id = input.id;
+ inputEl.placeholder = input.placeholder;
+ inputEl.style.cssText = `
+ width: 100%;
+ padding: 12px 40px 12px 12px;
+ border: 1px solid ${themeColors.border};
+ border-radius: 8px;
+ font-size: 14px;
+ outline: none;
+ box-sizing: border-box;
+ background: ${themeColors.inputBg};
+ color: ${themeColors.text};
+ `;
+
+ // 眼睛图标(显示/隐藏密码)
+ const eyeIcon = document.createElement('span');
+ eyeIcon.innerHTML = '🙈'; // 默认隐藏密码,显示捂眼
+ eyeIcon.style.cssText = `
+ position: absolute;
+ right: 12px;
+ top: 50%;
+ transform: translateY(-50%);
+ cursor: pointer;
+ font-size: 18px;
+ user-select: none;
+ `;
+
+ let isPasswordVisible = false;
+ eyeIcon.addEventListener('click', () => {
+ isPasswordVisible = !isPasswordVisible;
+ inputEl.type = isPasswordVisible ? 'text' : 'password';
+ // 显示密码时用睁开的眼睛,隐藏时用捂眼
+ eyeIcon.innerHTML = isPasswordVisible ? '👁️' : '🙈';
+ });
+
+ inputWrapper.appendChild(inputEl);
+ inputWrapper.appendChild(eyeIcon);
+ group.appendChild(label);
+ group.appendChild(inputWrapper);
+ content.appendChild(group);
+ });
+
+ // 按钮区域
+ const btnGroup = document.createElement('div');
+ btnGroup.style.cssText = `
+ display: flex;
+ gap: 12px;
+ margin-top: 24px;
+ `;
+
+ // 取消按钮
+ const cancelBtn = document.createElement('button');
+ cancelBtn.textContent = '取消';
+ cancelBtn.style.cssText = `
+ flex: 1;
+ padding: 12px;
+ background: ${themeColors.cancelBg};
+ color: ${themeColors.cancelText};
+ border: none;
+ border-radius: 8px;
+ font-size: 14px;
+ cursor: pointer;
+ `;
+ cancelBtn.addEventListener('click', () => {
+ document.body.removeChild(modal);
+ });
+
+ // 确认按钮
+ const confirmBtn = document.createElement('button');
+ confirmBtn.textContent = '确认修改';
+ confirmBtn.style.cssText = `
+ flex: 1;
+ padding: 12px;
+ background: linear-gradient(135deg, #007AFF 0%, #0056b3 100%);
+ color: white;
+ border: none;
+ border-radius: 8px;
+ font-size: 14px;
+ font-weight: 600;
+ cursor: pointer;
+ `;
+
+ // 显示结果状态的函数
+ function showResult(success, message) {
+ content.innerHTML = '';
+ content.style.textAlign = 'center';
+ content.style.padding = '40px 24px';
+
+ const icon = document.createElement('div');
+ icon.textContent = success ? '✅' : '❌';
+ icon.style.cssText = `
+ font-size: 48px;
+ margin-bottom: 16px;
+ `;
+
+ const msg = document.createElement('div');
+ msg.textContent = message;
+ msg.style.cssText = `
+ font-size: 16px;
+ color: ${themeColors.text};
+ margin-bottom: 24px;
+ `;
+
+ const closeBtn = document.createElement('button');
+ closeBtn.textContent = '关闭';
+ closeBtn.style.cssText = `
+ padding: 12px 48px;
+ background: ${success ? 'linear-gradient(135deg, #28a745 0%, #1e7e34 100%)' : 'linear-gradient(135deg, #007AFF 0%, #0056b3 100%)'};
+ color: white;
+ border: none;
+ border-radius: 8px;
+ font-size: 14px;
+ font-weight: 600;
+ cursor: pointer;
+ `;
+ closeBtn.addEventListener('click', () => {
+ document.body.removeChild(modal);
+ });
+
+ content.appendChild(icon);
+ content.appendChild(msg);
+ content.appendChild(closeBtn);
+
+ // 成功时2秒后自动关闭
+ if (success) {
+ setTimeout(() => {
+ if (document.body.contains(modal)) {
+ document.body.removeChild(modal);
+ }
+ }, 2000);
+ }
+ }
+
+ confirmBtn.addEventListener('click', async () => {
+ // 防止重复点击
+ if (confirmBtn.disabled) return;
+
+ const oldPwd = document.getElementById('old-pwd').value.trim();
+ const newPwd = document.getElementById('new-pwd').value.trim();
+ const confirmPwd = document.getElementById('confirm-pwd').value.trim();
+
+ // 验证
+ if (!oldPwd || !newPwd || !confirmPwd) {
+ showToast('请填写所有字段');
+ return;
+ }
+
+ if (newPwd !== confirmPwd) {
+ showToast('两次输入的新密码不一致');
+ return;
+ }
+
+ if (newPwd.length < 6) {
+ showToast('新密码长度不能少于6位');
+ return;
+ }
+
+ // 立即禁用按钮并显示加载状态
+ confirmBtn.disabled = true;
+ confirmBtn.textContent = '处理中...';
+ confirmBtn.style.opacity = '0.7';
+ cancelBtn.disabled = true;
+
+ try {
+ const result = await API.changePassword(CONFIG.soldierId, oldPwd, newPwd);
+
+ if (result.ok) {
+ showResult(true, '密码修改成功');
+ } else {
+ showResult(false, result.error || '修改失败');
+ }
+ } catch (e) {
+ // 如果后端不可用,使用离线模式
+ const demoAccounts = {
+ 'soldier_001': '123456',
+ 'soldier_002': '123456',
+ 'soldier_003': '123456'
+ };
+
+ const currentPwd = demoAccounts[CONFIG.soldierId];
+ if (!currentPwd || oldPwd !== currentPwd) {
+ showResult(false, '原密码错误');
+ return;
+ }
+
+ showResult(true, '密码修改成功');
+ }
+ });
+
+ btnGroup.appendChild(cancelBtn);
+ btnGroup.appendChild(confirmBtn);
+ content.appendChild(btnGroup);
+
+ modal.appendChild(content);
+ document.body.appendChild(modal);
+
+ // 点击背景关闭
+ modal.addEventListener('click', (e) => {
+ if (e.target === modal) {
+ document.body.removeChild(modal);
+ }
+ });
+ }
+
// ===== 轮询 =====
function startPolling() {
if (pollTimer) clearInterval(pollTimer);
@@ -758,7 +1299,8 @@ const App = (() => {
router,
back,
submitDemand,
- selectDropPoint,
+ selectDropPointFromList,
+ selectDropPointFromMap,
confirmDropPoint,
searchDropPoint,
selectSearchResult,
@@ -770,6 +1312,8 @@ const App = (() => {
showToast,
showServerConfig,
toggleSwitch,
+ toggleTheme,
+ showChangePasswordModal,
doLogin,
doRegister,
fillLogin,
diff --git a/src/单兵终端APP/node_modules/@capacitor/android/capacitor/build/.transforms/cd6f5e2cb23a7915c09abd40da45a7b1/results.bin b/src/单兵终端APP/node_modules/@capacitor/android/capacitor/build/.transforms/cd6f5e2cb23a7915c09abd40da45a7b1/results.bin
new file mode 100644
index 0000000..0d259dd
--- /dev/null
+++ b/src/单兵终端APP/node_modules/@capacitor/android/capacitor/build/.transforms/cd6f5e2cb23a7915c09abd40da45a7b1/results.bin
@@ -0,0 +1 @@
+o/classes
diff --git a/src/单兵终端APP/node_modules/@capacitor/android/capacitor/build/.transforms/cd6f5e2cb23a7915c09abd40da45a7b1/transformed/classes/classes_dex/classes.dex b/src/单兵终端APP/node_modules/@capacitor/android/capacitor/build/.transforms/cd6f5e2cb23a7915c09abd40da45a7b1/transformed/classes/classes_dex/classes.dex
new file mode 100644
index 0000000..e62d64a
Binary files /dev/null and b/src/单兵终端APP/node_modules/@capacitor/android/capacitor/build/.transforms/cd6f5e2cb23a7915c09abd40da45a7b1/transformed/classes/classes_dex/classes.dex differ
diff --git a/src/单兵终端APP/node_modules/@capacitor/android/capacitor/build/intermediates/compiled_local_resources/debug/out/layout_bridge_layout_main.xml.flat b/src/单兵终端APP/node_modules/@capacitor/android/capacitor/build/intermediates/compiled_local_resources/debug/out/layout_bridge_layout_main.xml.flat
index 57184f7..38bfaa3 100644
Binary files a/src/单兵终端APP/node_modules/@capacitor/android/capacitor/build/intermediates/compiled_local_resources/debug/out/layout_bridge_layout_main.xml.flat and b/src/单兵终端APP/node_modules/@capacitor/android/capacitor/build/intermediates/compiled_local_resources/debug/out/layout_bridge_layout_main.xml.flat differ
diff --git a/src/单兵终端APP/node_modules/@capacitor/android/capacitor/build/intermediates/compiled_local_resources/debug/out/layout_fragment_bridge.xml.flat b/src/单兵终端APP/node_modules/@capacitor/android/capacitor/build/intermediates/compiled_local_resources/debug/out/layout_fragment_bridge.xml.flat
index 17de2a8..c318898 100644
Binary files a/src/单兵终端APP/node_modules/@capacitor/android/capacitor/build/intermediates/compiled_local_resources/debug/out/layout_fragment_bridge.xml.flat and b/src/单兵终端APP/node_modules/@capacitor/android/capacitor/build/intermediates/compiled_local_resources/debug/out/layout_fragment_bridge.xml.flat differ
diff --git a/src/单兵终端APP/node_modules/@capacitor/android/capacitor/build/intermediates/compiled_local_resources/debug/out/layout_no_webview.xml.flat b/src/单兵终端APP/node_modules/@capacitor/android/capacitor/build/intermediates/compiled_local_resources/debug/out/layout_no_webview.xml.flat
index 0dcddd5..9e45d3f 100644
Binary files a/src/单兵终端APP/node_modules/@capacitor/android/capacitor/build/intermediates/compiled_local_resources/debug/out/layout_no_webview.xml.flat and b/src/单兵终端APP/node_modules/@capacitor/android/capacitor/build/intermediates/compiled_local_resources/debug/out/layout_no_webview.xml.flat differ
diff --git a/src/单兵终端APP/node_modules/@capacitor/android/capacitor/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties b/src/单兵终端APP/node_modules/@capacitor/android/capacitor/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties
index 0b7a138..8b85957 100644
--- a/src/单兵终端APP/node_modules/@capacitor/android/capacitor/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties
+++ b/src/单兵终端APP/node_modules/@capacitor/android/capacitor/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties
@@ -1,4 +1,4 @@
-#Tue May 12 15:08:32 CST 2026
-com.getcapacitor.android.capacitor-android-main-6\:/layout/no_webview.xml=D\:\\智途投送软件系统\\software\\src\\单兵终端APP\\node_modules\\@capacitor\\android\\capacitor\\build\\intermediates\\packaged_res\\debug\\layout\\no_webview.xml
-com.getcapacitor.android.capacitor-android-main-6\:/layout/bridge_layout_main.xml=D\:\\智途投送软件系统\\software\\src\\单兵终端APP\\node_modules\\@capacitor\\android\\capacitor\\build\\intermediates\\packaged_res\\debug\\layout\\bridge_layout_main.xml
-com.getcapacitor.android.capacitor-android-main-6\:/layout/fragment_bridge.xml=D\:\\智途投送软件系统\\software\\src\\单兵终端APP\\node_modules\\@capacitor\\android\\capacitor\\build\\intermediates\\packaged_res\\debug\\layout\\fragment_bridge.xml
+#Sun May 17 10:13:13 CST 2026
+com.getcapacitor.android.capacitor-android-main-6\:/layout/no_webview.xml=D\:\\Android\\Projects\\zhitu\\node_modules\\@capacitor\\android\\capacitor\\build\\intermediates\\packaged_res\\debug\\layout\\no_webview.xml
+com.getcapacitor.android.capacitor-android-main-6\:/layout/bridge_layout_main.xml=D\:\\Android\\Projects\\zhitu\\node_modules\\@capacitor\\android\\capacitor\\build\\intermediates\\packaged_res\\debug\\layout\\bridge_layout_main.xml
+com.getcapacitor.android.capacitor-android-main-6\:/layout/fragment_bridge.xml=D\:\\Android\\Projects\\zhitu\\node_modules\\@capacitor\\android\\capacitor\\build\\intermediates\\packaged_res\\debug\\layout\\fragment_bridge.xml
diff --git a/src/单兵终端APP/node_modules/@capacitor/android/capacitor/build/intermediates/incremental/debug/packageDebugResources/merger.xml b/src/单兵终端APP/node_modules/@capacitor/android/capacitor/build/intermediates/incremental/debug/packageDebugResources/merger.xml
index 91286f6..dc17130 100644
--- a/src/单兵终端APP/node_modules/@capacitor/android/capacitor/build/intermediates/incremental/debug/packageDebugResources/merger.xml
+++ b/src/单兵终端APP/node_modules/@capacitor/android/capacitor/build/intermediates/incremental/debug/packageDebugResources/merger.xml
@@ -1,9 +1,9 @@
-
+
- #3F51B5 #303F9F #FF4081 This app requires a WebView to work
+
\ No newline at end of file
diff --git a/src/单兵终端APP/node_modules/@capacitor/android/capacitor/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml b/src/单兵终端APP/node_modules/@capacitor/android/capacitor/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml
index 9f84ac4..e49e3a4 100644
--- a/src/单兵终端APP/node_modules/@capacitor/android/capacitor/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml
+++ b/src/单兵终端APP/node_modules/@capacitor/android/capacitor/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml
@@ -1,2 +1,2 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/src/单兵终端APP/node_modules/@capacitor/android/capacitor/build/intermediates/incremental/mergeDebugShaders/merger.xml b/src/单兵终端APP/node_modules/@capacitor/android/capacitor/build/intermediates/incremental/mergeDebugShaders/merger.xml
index 08b04d4..d89363d 100644
--- a/src/单兵终端APP/node_modules/@capacitor/android/capacitor/build/intermediates/incremental/mergeDebugShaders/merger.xml
+++ b/src/单兵终端APP/node_modules/@capacitor/android/capacitor/build/intermediates/incremental/mergeDebugShaders/merger.xml
@@ -1,2 +1,2 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/src/单兵终端APP/node_modules/@capacitor/android/capacitor/build/intermediates/incremental/packageDebugAssets/merger.xml b/src/单兵终端APP/node_modules/@capacitor/android/capacitor/build/intermediates/incremental/packageDebugAssets/merger.xml
index 7cdaa94..8f3ef74 100644
--- a/src/单兵终端APP/node_modules/@capacitor/android/capacitor/build/intermediates/incremental/packageDebugAssets/merger.xml
+++ b/src/单兵终端APP/node_modules/@capacitor/android/capacitor/build/intermediates/incremental/packageDebugAssets/merger.xml
@@ -1,2 +1,2 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/src/单兵终端APP/node_modules/@capacitor/android/capacitor/build/outputs/aar/capacitor-android-debug.aar b/src/单兵终端APP/node_modules/@capacitor/android/capacitor/build/outputs/aar/capacitor-android-debug.aar
index f75a1c9..5a1b3c9 100644
Binary files a/src/单兵终端APP/node_modules/@capacitor/android/capacitor/build/outputs/aar/capacitor-android-debug.aar and b/src/单兵终端APP/node_modules/@capacitor/android/capacitor/build/outputs/aar/capacitor-android-debug.aar differ
diff --git a/src/单兵终端APP/node_modules/@capacitor/android/capacitor/build/outputs/logs/manifest-merger-debug-report.txt b/src/单兵终端APP/node_modules/@capacitor/android/capacitor/build/outputs/logs/manifest-merger-debug-report.txt
index 2c453df..7cc3c4d 100644
--- a/src/单兵终端APP/node_modules/@capacitor/android/capacitor/build/outputs/logs/manifest-merger-debug-report.txt
+++ b/src/单兵终端APP/node_modules/@capacitor/android/capacitor/build/outputs/logs/manifest-merger-debug-report.txt
@@ -1,16 +1,16 @@
-- Merging decision tree log ---
manifest
-ADDED from D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\android\capacitor\src\main\AndroidManifest.xml:2:1-3:12
-INJECTED from D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\android\capacitor\src\main\AndroidManifest.xml:2:1-3:12
+ADDED from D:\Android\Projects\zhitu\node_modules\@capacitor\android\capacitor\src\main\AndroidManifest.xml:2:1-3:12
+INJECTED from D:\Android\Projects\zhitu\node_modules\@capacitor\android\capacitor\src\main\AndroidManifest.xml:2:1-3:12
package
- INJECTED from D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\android\capacitor\src\main\AndroidManifest.xml
+ INJECTED from D:\Android\Projects\zhitu\node_modules\@capacitor\android\capacitor\src\main\AndroidManifest.xml
xmlns:android
- ADDED from D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\android\capacitor\src\main\AndroidManifest.xml:2:11-69
+ ADDED from D:\Android\Projects\zhitu\node_modules\@capacitor\android\capacitor\src\main\AndroidManifest.xml:2:11-69
uses-sdk
-INJECTED from D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\android\capacitor\src\main\AndroidManifest.xml reason: use-sdk injection requested
-INJECTED from D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\android\capacitor\src\main\AndroidManifest.xml
-INJECTED from D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\android\capacitor\src\main\AndroidManifest.xml
+INJECTED from D:\Android\Projects\zhitu\node_modules\@capacitor\android\capacitor\src\main\AndroidManifest.xml reason: use-sdk injection requested
+INJECTED from D:\Android\Projects\zhitu\node_modules\@capacitor\android\capacitor\src\main\AndroidManifest.xml
+INJECTED from D:\Android\Projects\zhitu\node_modules\@capacitor\android\capacitor\src\main\AndroidManifest.xml
android:targetSdkVersion
- INJECTED from D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\android\capacitor\src\main\AndroidManifest.xml
+ INJECTED from D:\Android\Projects\zhitu\node_modules\@capacitor\android\capacitor\src\main\AndroidManifest.xml
android:minSdkVersion
- INJECTED from D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\android\capacitor\src\main\AndroidManifest.xml
+ INJECTED from D:\Android\Projects\zhitu\node_modules\@capacitor\android\capacitor\src\main\AndroidManifest.xml
diff --git a/src/单兵终端APP/node_modules/@capacitor/android/capacitor/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin b/src/单兵终端APP/node_modules/@capacitor/android/capacitor/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin
index a9e4c18..1d8515e 100644
Binary files a/src/单兵终端APP/node_modules/@capacitor/android/capacitor/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin and b/src/单兵终端APP/node_modules/@capacitor/android/capacitor/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin differ
diff --git a/src/单兵终端APP/node_modules/@capacitor/geolocation/android/build/.transforms/1497667234ae46b51cfc828446be2cbc/results.bin b/src/单兵终端APP/node_modules/@capacitor/geolocation/android/build/.transforms/1497667234ae46b51cfc828446be2cbc/results.bin
new file mode 100644
index 0000000..0d259dd
--- /dev/null
+++ b/src/单兵终端APP/node_modules/@capacitor/geolocation/android/build/.transforms/1497667234ae46b51cfc828446be2cbc/results.bin
@@ -0,0 +1 @@
+o/classes
diff --git a/src/单兵终端APP/node_modules/@capacitor/geolocation/android/build/.transforms/1497667234ae46b51cfc828446be2cbc/transformed/classes/classes_dex/classes.dex b/src/单兵终端APP/node_modules/@capacitor/geolocation/android/build/.transforms/1497667234ae46b51cfc828446be2cbc/transformed/classes/classes_dex/classes.dex
new file mode 100644
index 0000000..c6cae7f
Binary files /dev/null and b/src/单兵终端APP/node_modules/@capacitor/geolocation/android/build/.transforms/1497667234ae46b51cfc828446be2cbc/transformed/classes/classes_dex/classes.dex differ
diff --git a/src/单兵终端APP/node_modules/@capacitor/geolocation/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties b/src/单兵终端APP/node_modules/@capacitor/geolocation/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties
index 40e16dd..3f83099 100644
--- a/src/单兵终端APP/node_modules/@capacitor/geolocation/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties
+++ b/src/单兵终端APP/node_modules/@capacitor/geolocation/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties
@@ -1 +1 @@
-#Tue May 12 15:08:31 CST 2026
+#Sun May 17 10:13:14 CST 2026
diff --git a/src/单兵终端APP/node_modules/@capacitor/geolocation/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml b/src/单兵终端APP/node_modules/@capacitor/geolocation/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml
index 8124516..b308064 100644
--- a/src/单兵终端APP/node_modules/@capacitor/geolocation/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml
+++ b/src/单兵终端APP/node_modules/@capacitor/geolocation/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml
@@ -1,2 +1,2 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/src/单兵终端APP/node_modules/@capacitor/geolocation/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml b/src/单兵终端APP/node_modules/@capacitor/geolocation/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml
index 6019337..98ee774 100644
--- a/src/单兵终端APP/node_modules/@capacitor/geolocation/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml
+++ b/src/单兵终端APP/node_modules/@capacitor/geolocation/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml
@@ -1,2 +1,2 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/src/单兵终端APP/node_modules/@capacitor/geolocation/android/build/intermediates/incremental/mergeDebugShaders/merger.xml b/src/单兵终端APP/node_modules/@capacitor/geolocation/android/build/intermediates/incremental/mergeDebugShaders/merger.xml
index 02f0c73..978acf7 100644
--- a/src/单兵终端APP/node_modules/@capacitor/geolocation/android/build/intermediates/incremental/mergeDebugShaders/merger.xml
+++ b/src/单兵终端APP/node_modules/@capacitor/geolocation/android/build/intermediates/incremental/mergeDebugShaders/merger.xml
@@ -1,2 +1,2 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/src/单兵终端APP/node_modules/@capacitor/geolocation/android/build/intermediates/incremental/packageDebugAssets/merger.xml b/src/单兵终端APP/node_modules/@capacitor/geolocation/android/build/intermediates/incremental/packageDebugAssets/merger.xml
index cff837e..b3957c6 100644
--- a/src/单兵终端APP/node_modules/@capacitor/geolocation/android/build/intermediates/incremental/packageDebugAssets/merger.xml
+++ b/src/单兵终端APP/node_modules/@capacitor/geolocation/android/build/intermediates/incremental/packageDebugAssets/merger.xml
@@ -1,2 +1,2 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/src/单兵终端APP/node_modules/@capacitor/geolocation/android/build/outputs/logs/manifest-merger-debug-report.txt b/src/单兵终端APP/node_modules/@capacitor/geolocation/android/build/outputs/logs/manifest-merger-debug-report.txt
index a2a686a..8899f6a 100644
--- a/src/单兵终端APP/node_modules/@capacitor/geolocation/android/build/outputs/logs/manifest-merger-debug-report.txt
+++ b/src/单兵终端APP/node_modules/@capacitor/geolocation/android/build/outputs/logs/manifest-merger-debug-report.txt
@@ -1,16 +1,16 @@
-- Merging decision tree log ---
manifest
-ADDED from D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\geolocation\android\src\main\AndroidManifest.xml:1:1-2:12
-INJECTED from D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\geolocation\android\src\main\AndroidManifest.xml:1:1-2:12
+ADDED from D:\Android\Projects\zhitu\node_modules\@capacitor\geolocation\android\src\main\AndroidManifest.xml:1:1-2:12
+INJECTED from D:\Android\Projects\zhitu\node_modules\@capacitor\geolocation\android\src\main\AndroidManifest.xml:1:1-2:12
package
- INJECTED from D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\geolocation\android\src\main\AndroidManifest.xml
+ INJECTED from D:\Android\Projects\zhitu\node_modules\@capacitor\geolocation\android\src\main\AndroidManifest.xml
xmlns:android
- ADDED from D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\geolocation\android\src\main\AndroidManifest.xml:1:11-69
+ ADDED from D:\Android\Projects\zhitu\node_modules\@capacitor\geolocation\android\src\main\AndroidManifest.xml:1:11-69
uses-sdk
-INJECTED from D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\geolocation\android\src\main\AndroidManifest.xml reason: use-sdk injection requested
-INJECTED from D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\geolocation\android\src\main\AndroidManifest.xml
-INJECTED from D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\geolocation\android\src\main\AndroidManifest.xml
+INJECTED from D:\Android\Projects\zhitu\node_modules\@capacitor\geolocation\android\src\main\AndroidManifest.xml reason: use-sdk injection requested
+INJECTED from D:\Android\Projects\zhitu\node_modules\@capacitor\geolocation\android\src\main\AndroidManifest.xml
+INJECTED from D:\Android\Projects\zhitu\node_modules\@capacitor\geolocation\android\src\main\AndroidManifest.xml
android:targetSdkVersion
- INJECTED from D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\geolocation\android\src\main\AndroidManifest.xml
+ INJECTED from D:\Android\Projects\zhitu\node_modules\@capacitor\geolocation\android\src\main\AndroidManifest.xml
android:minSdkVersion
- INJECTED from D:\智途投送软件系统\software\src\单兵终端APP\node_modules\@capacitor\geolocation\android\src\main\AndroidManifest.xml
+ INJECTED from D:\Android\Projects\zhitu\node_modules\@capacitor\geolocation\android\src\main\AndroidManifest.xml
diff --git a/src/单兵终端APP/node_modules/@capacitor/geolocation/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin b/src/单兵终端APP/node_modules/@capacitor/geolocation/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin
index 886be0f..e31ceca 100644
Binary files a/src/单兵终端APP/node_modules/@capacitor/geolocation/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin and b/src/单兵终端APP/node_modules/@capacitor/geolocation/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin differ
diff --git a/src/单兵终端APP/www/css/style.css b/src/单兵终端APP/www/css/style.css
index 95e1c2a..91f152f 100644
--- a/src/单兵终端APP/www/css/style.css
+++ b/src/单兵终端APP/www/css/style.css
@@ -1,13 +1,42 @@
+/* ===== 主题变量 ===== */
+:root {
+ /* 浅色主题(默认) */
+ --bg-primary: #f5f5f5;
+ --bg-secondary: #ffffff;
+ --bg-card: #ffffff;
+ --text-primary: #333333;
+ --text-secondary: #666666;
+ --text-muted: #999999;
+ --border-color: #e0e0e0;
+ --input-bg: #ffffff;
+ --menu-hover: #f5f5f5;
+}
+
+[data-theme="dark"] {
+ /* 深色主题 */
+ --bg-primary: #0f0f23;
+ --bg-secondary: #1a1a2e;
+ --bg-card: #16213e;
+ --text-primary: #e0e0e0;
+ --text-secondary: #b0b0b0;
+ --text-muted: #808080;
+ --border-color: #2a2a3e;
+ --input-bg: #1a1a2e;
+ --menu-hover: #1f2940;
+}
+
/* ===== 全局重置 ===== */
* { margin: 0; padding: 0; box-sizing: border-box; }
html, body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Microsoft YaHei', sans-serif;
- background: #f5f5f5;
+ font-size: 16px;
+ background: var(--bg-primary);
height: 100%;
overflow: hidden;
- color: #333;
+ color: var(--text-primary);
-webkit-tap-highlight-color: transparent;
+ transition: background 0.3s, color 0.3s;
}
#app {
@@ -51,8 +80,8 @@ html, body {
justify-content: space-between;
align-items: center;
padding: 12px 16px;
- background: #fff;
- border-bottom: 1px solid #f0f0f0;
+ background: var(--bg-secondary);
+ border-bottom: 1px solid var(--border-color);
flex-shrink: 0;
}
.page-header .back-btn {
@@ -63,7 +92,7 @@ html, body {
.page-header .page-title {
font-size: 15px;
font-weight: 600;
- color: #333;
+ color: var(--text-primary);
}
/* ===== 用户卡片 ===== */
@@ -165,7 +194,7 @@ html, body {
/* ===== 卡片 ===== */
.card {
- background: white;
+ background: var(--bg-card);
border-radius: 12px;
padding: 14px;
margin-bottom: 10px;
@@ -173,13 +202,13 @@ html, body {
}
.card-title {
font-size: 14px;
- color: #666;
+ color: var(--text-secondary);
margin-bottom: 10px;
}
/* ===== 库存进度条 ===== */
.inventory-item {
- background: white;
+ background: var(--bg-card);
border-radius: 12px;
padding: 12px 14px;
margin-bottom: 10px;
@@ -215,7 +244,7 @@ html, body {
}
.location-text {
font-size: 14px;
- color: #333;
+ color: var(--text-primary);
}
/* ===== 表单 ===== */
@@ -224,7 +253,7 @@ html, body {
}
.form-label {
font-size: 14px;
- color: #333;
+ color: var(--text-primary);
margin-bottom: 6px;
display: block;
font-weight: 500;
@@ -232,17 +261,20 @@ html, body {
.select-box {
width: 100%;
padding: 12px;
- border: 1px solid #e0e0e0;
+ border: 1px solid var(--border-color);
border-radius: 8px;
- background: white;
+ background: var(--input-bg);
+ color: var(--text-primary);
font-size: 14px;
outline: none;
}
.form-input {
width: 100%;
padding: 12px;
- border: 1px solid #e0e0e0;
+ border: 1px solid var(--border-color);
border-radius: 8px;
+ background: var(--input-bg);
+ color: var(--text-primary);
font-size: 14px;
outline: none;
}
@@ -256,7 +288,7 @@ html, body {
}
.input-unit {
font-size: 14px;
- color: #666;
+ color: var(--text-secondary);
}
/* ===== 单选组 ===== */
@@ -267,13 +299,14 @@ html, body {
.radio-label {
flex: 1;
padding: 10px;
- background: #f5f5f5;
+ background: var(--bg-primary);
border-radius: 8px;
text-align: center;
cursor: pointer;
border: 2px solid transparent;
font-size: 14px;
transition: all 0.2s;
+ color: var(--text-primary);
}
.radio-label.active {
background: #E6F7FF;
@@ -293,8 +326,9 @@ html, body {
display: flex;
align-items: center;
padding: 8px 0;
- border-bottom: 1px solid #f0f0f0;
+ border-bottom: 1px solid var(--border-color);
font-size: 13px;
+ color: var(--text-primary);
}
.annotate-item:last-child { border-bottom: none; }
.annotate-dot {
@@ -315,7 +349,7 @@ html, body {
.drop-card.danger { border-left: 4px solid #FF4D4F; background: #FFF3F3; }
.drop-info {
font-size: 12px;
- color: #666;
+ color: var(--text-secondary);
margin: 4px 0 10px;
}
.drop-info span { margin-right: 12px; }
@@ -342,7 +376,7 @@ html, body {
/* ===== 任务监控 ===== */
.task-card { text-align: center; padding: 18px; }
-.task-label { font-size: 13px; color: #666; margin-bottom: 5px; }
+.task-label { font-size: 13px; color: var(--text-secondary); margin-bottom: 5px; }
.task-id { font-size: 18px; font-weight: 600; margin-bottom: 10px; }
.task-status {
display: inline-block;
@@ -352,11 +386,11 @@ html, body {
font-weight: 600;
}
.task-status.running { background: #F6FFED; color: #52C41A; }
-.task-eta { font-size: 13px; color: #666; margin-top: 8px; }
+.task-eta { font-size: 13px; color: var(--text-secondary); margin-top: 8px; }
.progress-card { text-align: center; padding: 16px; }
.progress-text { font-size: 14px; color: #007AFF; font-weight: 600; margin-bottom: 6px; }
-.progress-sub { font-size: 12px; color: #666; }
+.progress-sub { font-size: 12px; color: var(--text-secondary); }
.path-card {
background: #E6F7FF;
@@ -365,7 +399,7 @@ html, body {
margin-bottom: 12px;
}
.path-label { font-size: 12px; color: #007AFF; margin-bottom: 4px; }
-.path-value { font-size: 15px; font-weight: 600; color: #333; margin-bottom: 12px; }
+.path-value { font-size: 15px; font-weight: 600; color: var(--text-primary); margin-bottom: 12px; }
.path-value:last-child { margin-bottom: 0; }
.drop-zone {
@@ -394,12 +428,12 @@ html, body {
display: flex;
justify-content: space-between;
padding: 10px 0;
- border-bottom: 1px solid #f0f0f0;
+ border-bottom: 1px solid var(--border-color);
font-size: 14px;
}
.stat-row:last-child { border-bottom: none; }
-.stat-label { color: #666; }
-.stat-value { font-weight: 600; color: #333; }
+.stat-label { color: var(--text-secondary); }
+.stat-value { font-weight: 600; color: var(--text-primary); }
.stat-value.danger { color: #FF4D4F; }
.tag {
@@ -415,16 +449,16 @@ html, body {
/* ===== 日志时间线 ===== */
.log-row {
font-size: 13px;
- color: #666;
+ color: var(--text-secondary);
padding: 8px 0;
- border-bottom: 1px solid #f0f0f0;
+ border-bottom: 1px solid var(--border-color);
}
.log-row:last-child { border-bottom: none; }
-.log-time { color: #999; margin-right: 8px; }
+.log-time { color: var(--text-muted); margin-right: 8px; }
/* ===== 地图占位 ===== */
.map-placeholder {
- background: #F0F0F0;
+ background: var(--bg-primary);
border: 2px dashed #007AFF;
height: 140px;
display: flex;
@@ -434,12 +468,12 @@ html, body {
text-align: center;
}
.map-icon { font-size: 30px; margin-bottom: 5px; }
-.map-text { color: #666; font-size: 14px; }
+.map-text { color: var(--text-secondary); font-size: 14px; }
/* ===== 警告卡片 ===== */
.warning-card { background: #FFF7E6; border: 1px solid #FFD591; }
.warning-title { font-size: 13px; color: #FA8C16; margin-bottom: 8px; }
-.warning-item { font-size: 12px; color: #666; margin-bottom: 4px; }
+.warning-item { font-size: 12px; color: var(--text-secondary); margin-bottom: 4px; }
/* ===== 按钮行 ===== */
.btn-row { display: flex; gap: 10px; margin-top: 16px; }
@@ -470,14 +504,15 @@ html, body {
justify-content: space-between;
align-items: center;
padding: 14px 16px;
- border-bottom: 1px solid #f0f0f0;
+ border-bottom: 1px solid var(--border-color);
cursor: pointer;
font-size: 14px;
transition: background 0.15s;
+ color: var(--text-primary);
}
-.menu-item:active { background: #f5f5f5; }
+.menu-item:active { background: var(--menu-hover); }
.menu-item:last-child { border-bottom: none; }
-.menu-value { color: #666; font-size: 13px; }
+.menu-value { color: var(--text-secondary); font-size: 13px; }
.menu-toggle {
width: 36px;
height: 20px;
@@ -507,8 +542,8 @@ html, body {
/* ===== 底部Tab导航 ===== */
.tab-bar {
display: flex;
- background: #fff;
- border-top: 1px solid #e8e8e8;
+ background: var(--bg-secondary);
+ border-top: 1px solid var(--border-color);
padding-bottom: env(safe-area-inset-bottom);
flex-shrink: 0;
z-index: 100;
@@ -524,7 +559,7 @@ html, body {
align-items: center;
padding: 6px 0;
cursor: pointer;
- color: #999;
+ color: var(--text-muted);
transition: color 0.2s;
}
.tab-item.active { color: #007AFF; }
@@ -549,89 +584,490 @@ html, body {
}
.toast.show { opacity: 1; }
-/* ===== 登录页 ===== */
+/* ===== 滚动条 ===== */
+::-webkit-scrollbar { width: 0; }
+
+/* ===== 登录/注册页面优化样式 ===== */
+
+/* 登录页面背景 - 渐变 + 动态光晕 */
+#page-login,
+#page-register {
+ background: linear-gradient(135deg, #0F2027 0%, #203A43 50%, #2C5364 100%);
+ position: relative;
+ overflow: hidden;
+}
+
+/* 动态光晕装饰 */
+#page-login::before,
+#page-login::after,
+#page-register::before,
+#page-register::after {
+ content: '';
+ position: fixed;
+ border-radius: 50%;
+ filter: blur(70px);
+ opacity: 0.35;
+ pointer-events: none;
+ z-index: 0;
+}
+
+#page-login::before,
+#page-register::before {
+ top: -15%;
+ right: -10%;
+ width: 350px;
+ height: 350px;
+ background: radial-gradient(circle, rgba(0,188,212,0.6) 0%, rgba(0,150,136,0.2) 100%);
+}
+
+#page-login::after,
+#page-register::after {
+ bottom: -10%;
+ left: -10%;
+ width: 320px;
+ height: 320px;
+ background: radial-gradient(circle, rgba(255,152,0,0.45) 0%, rgba(255,87,34,0.1) 100%);
+}
+
+/* 登录主体容器 */
.login-body {
+ padding: 2rem 1.5rem 2rem;
+ position: relative;
+ z-index: 1;
+ max-width: 460px;
+ margin: 0 auto;
+ min-height: 100vh;
display: flex;
flex-direction: column;
- align-items: center;
justify-content: center;
- min-height: 100vh;
- padding: 40px 24px;
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
}
+
+/* 品牌区域 */
.login-logo {
- font-size: 64px;
- margin-bottom: 16px;
+ font-size: 3.2rem;
+ margin-bottom: 0.5rem;
+ background: rgba(255,255,255,0.1);
+ width: 70px;
+ height: 70px;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ border-radius: 30px;
+ backdrop-filter: blur(4px);
+ box-shadow: 0 8px 20px rgba(0,0,0,0.2);
}
+
.login-title {
- font-size: 28px;
- font-weight: 700;
- color: #fff;
- margin-bottom: 4px;
+ font-size: 1.9rem;
+ font-weight: 600;
letter-spacing: 2px;
+ background: linear-gradient(135deg, #FFF, #B2EBF2);
+ -webkit-background-clip: text;
+ background-clip: text;
+ color: transparent;
+ margin-top: 0.5rem;
+ text-align: center;
}
+
.login-subtitle {
- font-size: 14px;
- color: rgba(255,255,255,0.8);
- margin-bottom: 32px;
+ font-size: 0.85rem;
+ color: rgba(255, 255, 255, 0.7);
+ margin-top: 0.2rem;
+ text-align: center;
}
-.login-form {
- width: 100%;
- max-width: 320px;
- background: rgba(255,255,255,0.95);
- border-radius: 16px;
- padding: 24px;
- margin-bottom: 20px;
+
+/* 表单样式优化 */
+.login-form .form-group,
+#page-register .form-group {
+ margin-bottom: 1.4rem;
}
-.login-form .form-group {
- margin-bottom: 16px;
+
+.login-form .form-label,
+#page-register .form-label {
+ display: block;
+ font-size: 0.85rem;
+ font-weight: 500;
+ margin-bottom: 0.4rem;
+ color: rgba(255, 255, 255, 0.7);
+ letter-spacing: 0.5px;
}
-.login-form .form-label {
- font-size: 13px;
- color: #666;
- margin-bottom: 6px;
+
+.login-form .form-input,
+#page-register .form-input {
+ width: 100%;
+ padding: 0.9rem 1rem;
+ background: rgba(255, 255, 255, 0.08);
+ border: 1px solid rgba(255, 255, 255, 0.12);
+ border-radius: 1.2rem;
+ font-size: 0.95rem;
+ color: #FFFFFF;
+ outline: none;
+ transition: all 0.3s ease;
+}
+
+.login-form .form-input:focus,
+#page-register .form-input:focus {
+ border-color: #00BCD4;
+ box-shadow: 0 0 0 3px rgba(0, 188, 212, 0.35);
+ background: rgba(255,255,255,0.12);
}
-.login-form .form-input {
- background: #f5f5f5;
- border: 1px solid #e0e0e0;
+
+.login-form .form-input::placeholder,
+#page-register .form-input::placeholder {
+ color: rgba(255, 255, 255, 0.45);
+ font-size: 0.85rem;
}
+
+/* 登录按钮优化 */
.login-form .button-large {
- margin-top: 8px;
- margin-bottom: 12px;
+ width: 100%;
+ padding: 0.9rem;
+ background: linear-gradient(105deg, #00BCD4 0%, #0097A7 100%);
+ border: none;
+ border-radius: 2rem;
+ font-size: 1rem;
+ font-weight: 600;
+ color: white;
+ cursor: pointer;
+ transition: all 0.2s ease;
+ margin-top: 0.8rem;
+ letter-spacing: 1px;
+ box-shadow: 0 6px 14px rgba(0,188,212,0.25);
+}
+
+.login-form .button-large:hover {
+ transform: translateY(-2px);
+ filter: brightness(1.05);
+ box-shadow: 0 10px 20px rgba(0,188,212,0.35);
}
+
+.login-form .button-large:active {
+ transform: translateY(1px);
+}
+
+/* 切换链接 */
.login-switch {
text-align: center;
- font-size: 13px;
- color: #666;
+ margin-top: 1.5rem;
+ color: rgba(255, 255, 255, 0.7);
+ font-size: 0.85rem;
cursor: pointer;
- padding: 8px;
+ transition: all 0.3s ease;
}
+
.login-switch:hover {
- color: #007AFF;
+ color: #00BCD4;
}
-.login-demo {
- width: 100%;
- max-width: 320px;
- background: rgba(255,255,255,0.15);
- border-radius: 12px;
- padding: 14px 18px;
- backdrop-filter: blur(4px);
+
+/* 演示账号卡片 */
+.login-demo,
+.demo-card {
+ margin-top: 2rem;
+ background: rgba(255,255,255,0.04);
+ border-radius: 1.2rem;
+ padding: 0.8rem 1rem;
+ border: 1px solid rgba(255,255,255,0.06);
}
+
.demo-title {
- font-size: 12px;
- color: rgba(255,255,255,0.7);
- margin-bottom: 8px;
+ font-size: 0.7rem;
+ text-transform: uppercase;
+ letter-spacing: 1px;
+ color: rgba(255, 255, 255, 0.7);
+ margin-bottom: 0.6rem;
+ text-align: center;
+}
+
+.demo-item,
+.demo-btn {
+ padding: 0.5rem;
+ font-size: 0.8rem;
+ color: rgba(255, 255, 255, 0.8);
+ cursor: pointer;
+ transition: all 0.2s;
+ border-radius: 0.5rem;
+ margin-bottom: 0.3rem;
+}
+
+.demo-item:hover,
+.demo-btn:hover {
+ background: rgba(0,188,212,0.18);
+ color: #00BCD4;
+}
+
+.demo-buttons {
+ display: flex;
+ gap: 0.8rem;
+ justify-content: center;
+}
+
+.demo-btn {
+ background: rgba(0,188,212,0.18);
+ border: 1px solid rgba(0,188,212,0.4);
+ border-radius: 2rem;
+ padding: 0.4rem 1rem;
+ font-size: 0.7rem;
+ color: #00BCD4;
+ font-weight: 500;
+}
+
+.brand {
text-align: center;
+ margin-bottom: 2rem;
+}
+
+.brand-icon {
+ font-size: 3.2rem;
+ margin-bottom: 0.5rem;
+ background: rgba(255,255,255,0.1);
+ width: 70px;
+ height: 70px;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ border-radius: 30px;
+ backdrop-filter: blur(4px);
+ box-shadow: 0 8px 20px rgba(0,0,0,0.2);
}
-.demo-item {
+
+.brand h1 {
+ font-size: 1.9rem;
+ font-weight: 600;
+ letter-spacing: 2px;
+ background: linear-gradient(135deg, #FFF, #B2EBF2);
+ -webkit-background-clip: text;
+ background-clip: text;
+ color: transparent;
+ margin-top: 0.5rem;
+}
+
+.brand-sub {
+ font-size: 0.85rem;
+ color: rgba(255, 255, 255, 0.7);
+ margin-top: 0.2rem;
+}
+
+/* 注册页面头部优化 */
+#page-register .page-header {
+ background: transparent;
+ border-bottom: 1px solid rgba(255, 255, 255, 0.12);
+ position: relative;
+ z-index: 1;
+}
+
+#page-register .back-btn {
+ color: #00BCD4;
+ background: rgba(0,188,212,0.15);
+ padding: 0.3rem 1rem;
+ border-radius: 2rem;
+ transition: all 0.3s ease;
+}
+
+#page-register .back-btn:hover {
+ background: rgba(0,188,212,0.35);
+}
+
+#page-register .page-title {
+ color: #FFFFFF;
+}
+
+#page-register .page-content {
+ position: relative;
+ z-index: 1;
+ padding: 1.5rem 1.5rem 2rem;
+ min-height: calc(100vh - 60px);
+ overflow-y: auto;
+}
+
+/* 注册按钮优化 */
+#page-register .button-large.success {
+ background: linear-gradient(105deg, #00BCD4 0%, #0097A7 100%);
+ border-radius: 2rem;
+ box-shadow: 0 6px 14px rgba(0,188,212,0.25);
+ transition: all 0.2s ease;
+}
+
+#page-register .button-large.success:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 10px 20px rgba(0,188,212,0.35);
+}
+
+/* 记住密码和忘记密码 */
+.form-footer {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin: 0.8rem 0 1.2rem;
+ font-size: 0.75rem;
+}
+
+.checkbox {
+ display: flex;
+ align-items: center;
+ gap: 0.4rem;
+ color: rgba(255, 255, 255, 0.7);
+ cursor: pointer;
+}
+
+.checkbox input[type="checkbox"] {
+ accent-color: #00BCD4;
+}
+
+.forgot-link {
+ color: #00BCD4;
+ text-decoration: none;
+ font-size: 0.75rem;
+ transition: all 0.3s ease;
+}
+
+.forgot-link:hover {
+ text-decoration: underline;
+ opacity: 0.85;
+}
+
+/* 页面切换动画 */
+.page.active {
+ animation: fadeIn 0.3s forwards;
+}
+
+@keyframes fadeIn {
+ from {
+ opacity: 0;
+ transform: translateY(6px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+/* 确保登录/注册页面全屏显示,无底部黑条 */
+#page-login .tab-bar,
+#page-register .tab-bar {
+ display: none !important;
+}
+
+#page-login,
+#page-register {
+ padding-bottom: 0 !important;
+ margin-bottom: 0 !important;
+}
+
+/* ===== 投放点选择相关样式 ===== */
+
+/* 选中的投放点卡片(在填写物资信息页面) */
+.selected-drop-card {
+ background: linear-gradient(135deg, #E6F7FF 0%, #BAE7FF 100%);
+ border: 2px solid #007AFF;
+ border-radius: 12px;
+ padding: 14px;
+ margin-bottom: 8px;
+ animation: slideIn 0.3s ease;
+}
+
+@keyframes slideIn {
+ from {
+ opacity: 0;
+ transform: translateY(-10px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+.selected-drop-info {
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+}
+
+.selected-drop-name {
+ font-size: 16px;
+ font-weight: 600;
+ color: #007AFF;
+}
+
+.selected-drop-coords {
font-size: 12px;
- color: rgba(255,255,255,0.9);
- padding: 6px 0;
- border-bottom: 1px solid rgba(255,255,255,0.1);
+ color: #666;
+}
+
+/* 小卡片(在地图选点页面) */
+.mini-drop-card {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ padding: 12px;
+ background: var(--bg-card);
+ border: 2px solid var(--border-color);
+ border-radius: 10px;
+ margin-bottom: 8px;
cursor: pointer;
+ transition: all 0.2s ease;
}
-.demo-item:last-child { border-bottom: none; }
-.demo-item:hover { color: #fff; }
-/* ===== 滚动条 ===== */
-::-webkit-scrollbar { width: 0; }
+.mini-drop-card:active {
+ transform: scale(0.98);
+}
+
+.mini-drop-card.selected {
+ background: linear-gradient(135deg, #E6F7FF 0%, #BAE7FF 100%);
+ border-color: #007AFF;
+ box-shadow: 0 2px 8px rgba(0, 122, 255, 0.2);
+}
+
+.mini-drop-icon {
+ font-size: 24px;
+ flex-shrink: 0;
+}
+
+.mini-drop-content {
+ flex: 1;
+ min-width: 0;
+}
+
+.mini-drop-name {
+ font-size: 14px;
+ font-weight: 600;
+ color: var(--text-primary);
+ margin-bottom: 2px;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+.mini-drop-address {
+ font-size: 12px;
+ color: var(--text-secondary);
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+.mini-drop-check {
+ font-size: 20px;
+ color: #007AFF;
+ font-weight: bold;
+ flex-shrink: 0;
+ opacity: 0;
+ transition: opacity 0.2s;
+}
+
+.mini-drop-card.selected .mini-drop-check {
+ opacity: 1;
+}
+
+/* 推荐投放点小卡片列表 */
+#drop-point-list .mini-drop-card {
+ margin-bottom: 8px;
+}
+
+#drop-point-list .mini-drop-card.safe {
+ border-left: 4px solid #52c41a;
+}
+
+#drop-point-list .mini-drop-card.danger {
+ border-left: 4px solid #ff4d4f;
+ opacity: 0.7;
+}
diff --git a/src/单兵终端APP/www/index.html b/src/单兵终端APP/www/index.html
index e3d81db..bef1fb9 100644
--- a/src/单兵终端APP/www/index.html
+++ b/src/单兵终端APP/www/index.html
@@ -8,37 +8,58 @@
+
+
+
+
+
-
-
+
+
-
📱
-
智途投送
-
单兵终端系统
-
-
-
+
@@ -159,7 +180,13 @@
@@ -172,7 +199,7 @@
-
✅ 确认上报
+
确认上报