diff --git a/app.py b/app.py
index 7d0cd92..ca8b8f5 100644
--- a/app.py
+++ b/app.py
@@ -57,6 +57,15 @@ def get_auto_stop_time():
except (ValueError, TypeError):
return 15
+def get_demo_mode():
+ """
+ 从 data/.env 文件中读取演示模式配置
+ 如果未设置,返回默认值False
+ """
+ config = dotenv_values(ENV_FILE_PATH)
+ demo_mode = config.get('DEMO_MODE', 'False')
+ return demo_mode.lower() in ('true')
+
def save_devices(devices):
"""
将所有已连接的设备 ADB 地址保存到 data/.env 文件中
@@ -198,6 +207,9 @@ def handle_connect():
# 发送自动停止时间
auto_stop_time = get_auto_stop_time()
emit('auto_stop_time', {'minutes': auto_stop_time})
+ # 发送演示模式状态
+ demo_mode = get_demo_mode()
+ emit('demo_mode', {'enabled': demo_mode})
return True
def get_current_mirroring_device_id():
@@ -220,6 +232,15 @@ def handle_device_connect(data):
emit('connection_error', f'设备 {device_id} 已连接')
return
+ # 演示模式验证
+ if get_demo_mode():
+ # 获取保存的设备列表(包含预设IP)
+ saved_devices = get_saved_devices()
+ # 检查设备ID是否在预设列表中
+ if not any(device['address'] == device_id for device in saved_devices):
+ emit('connection_error', '演示模式下只允许连接预设的设备')
+ return
+
# 尝试连接设备
print(f'Trying to connect to device: {device_id}')
success, output = device_manager.adb_manager.connect_to_device(ip, port)
@@ -287,6 +308,11 @@ def handle_delete_saved_device(data):
"""
处理删除保存设备的请求
"""
+ # 演示模式验证
+ if get_demo_mode():
+ emit('error', {'message': '演示模式下不允许删除设备'})
+ return
+
device_address = data.get('device_id')
try:
# 从保存的设备列表中移除该设备(通过address字段)
diff --git a/templates/index.html b/templates/index.html
index 8ce2d40..62bc852 100644
--- a/templates/index.html
+++ b/templates/index.html
@@ -816,6 +816,45 @@
已保存的设备
}
let currentDeviceId = null;
+ let demoMode = false; // 演示模式状态
+
+ // 接收演示模式状态
+ socket.on('demo_mode', (data) => {
+ demoMode = data.enabled;
+ updateUIForDemoMode();
+ });
+
+ function updateUIForDemoMode() {
+ const deviceIpInput = document.getElementById('device-ip');
+ const devicePortInput = document.getElementById('device-port');
+ const connectBtn = document.getElementById('connect-btn');
+
+ if (demoMode) {
+ // 禁止"链接新设备"框的输入
+ deviceIpInput.disabled = true;
+ devicePortInput.disabled = true;
+ // 连接按钮在演示模式下也保持启用,以便通过已保存的设备进行链接
+ connectBtn.disabled = false;
+ } else {
+ // 启用"链接新设备"框的输入
+ deviceIpInput.disabled = false;
+ devicePortInput.disabled = false;
+ connectBtn.disabled = false;
+ }
+
+ // 更新设备列表,隐藏或显示相关按钮
+ const savedDevices = document.querySelectorAll('#saved-devices-container .list-group-item');
+ savedDevices.forEach(item => {
+ const deleteBtn = item.querySelector('.delete-saved-device-btn');
+ if (demoMode) {
+ // 前端不显示"已保存的设备"的"删除选项"
+ if (deleteBtn) deleteBtn.style.display = 'none';
+ } else {
+ // 显示"已保存的设备"的"删除选项"
+ if (deleteBtn) deleteBtn.style.display = 'inline-block';
+ }
+ });
+ }
function updateDeviceList(devices) {
if (!devices || devices.length === 0) {
@@ -832,6 +871,9 @@ 已保存的设备
? ``
: ``;
+ // 始终显示重命名选项
+ const renameButton = ``;
+
return `
@@ -842,7 +884,7 @@
已保存的设备
${actionButtons}
-
+ ${renameButton}
`;
@@ -913,6 +955,14 @@
已保存的设备
savedDevicesContainer.innerHTML = devices.map(device => {
const [ip, port] = device.address.split(':');
+
+ // 始终显示重命名选项,演示模式下不显示删除选项
+ const renameButton = `
`;
+
+ const deleteButton = demoMode
+ ? ''
+ : `
`;
+
return `
@@ -921,8 +971,8 @@
已保存的设备
地址:${device.address}
-
-
+ ${renameButton}
+ ${deleteButton}
`;