chore(jcef): 更新缓存数据库日志文件
- 更新 shared_proto_db/metadata/000003.log 文件内容 - 更新 Site Characteristics Database/00003.log 文件内容 - 添加新的数据库条目和元数据记录 - 保持数据库文件格式的一致性 - 删除Vivid2D的内容 - 重写启动加载界面
This commit is contained in:
117
javascript/LinuxTerminal.html
Normal file
117
javascript/LinuxTerminal.html
Normal file
@@ -0,0 +1,117 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Real Linux Terminal</title>
|
||||
<!-- 引入 Xterm.js 的样式 -->
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/xterm@5.3.0/css/xterm.css" />
|
||||
<style>
|
||||
body, html {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
background-color: #000;
|
||||
overflow: hidden;
|
||||
height: 100%; /* 确保 html 和 body 占满全屏 */
|
||||
}
|
||||
#terminal-container {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div id="terminal-container"></div>
|
||||
|
||||
<!-- 引入 Xterm.js 核心库 -->
|
||||
<script src="https://cdn.jsdelivr.net/npm/xterm@5.3.0/lib/xterm.js"></script>
|
||||
<!-- 引入自适应插件,让终端随窗口缩放 -->
|
||||
<script src="https://cdn.jsdelivr.net/npm/xterm-addon-fit@0.8.0/lib/xterm-addon-fit.js"></script>
|
||||
|
||||
<script>
|
||||
// 1. 初始化终端
|
||||
const term = new Terminal({
|
||||
cursorBlink: true,
|
||||
fontSize: 14,
|
||||
fontFamily: 'Consolas, "Ubuntu Mono", monospace',
|
||||
theme: {
|
||||
background: '#1e1e1e',
|
||||
foreground: '#ffffff'
|
||||
},
|
||||
// 增加右键菜单功能:粘贴
|
||||
allowProposedApi: true
|
||||
});
|
||||
|
||||
const fitAddon = new FitAddon.FitAddon();
|
||||
term.loadAddon(fitAddon);
|
||||
term.open(document.getElementById('terminal-container'));
|
||||
|
||||
// --- 修复点 1: 自动获取焦点 ---
|
||||
// 确保用户打开窗口后可以直接输入
|
||||
term.focus();
|
||||
|
||||
// --- 修复点 2: 延迟并可靠地适应窗口大小 ---
|
||||
// 使用 setTimeout 将 fit() 推迟到下一个事件循环
|
||||
// 这可以确保在DOM元素完全渲染并获得其最终尺寸后才进行计算
|
||||
function fitTerminal() {
|
||||
try {
|
||||
fitAddon.fit();
|
||||
// 你还可以在这里将新的尺寸发送给后端 PTY
|
||||
// term.cols 和 term.rows 包含了新的行列数
|
||||
} catch (e) {
|
||||
console.error("Fit addon failed:", e);
|
||||
}
|
||||
}
|
||||
setTimeout(fitTerminal, 1); // 1ms 延迟足以确保渲染完成
|
||||
|
||||
// 窗口大小改变时自动调整
|
||||
window.addEventListener('resize', fitTerminal);
|
||||
|
||||
// 2. 监听用户输入 (键盘按键)
|
||||
term.onData(data => {
|
||||
if (window.cefQuery) {
|
||||
window.cefQuery({
|
||||
request: JSON.stringify({
|
||||
type: 'terminalInput',
|
||||
data: data
|
||||
}),
|
||||
onSuccess: function() {},
|
||||
onFailure: function(errorCode, errorMessage) {
|
||||
console.error("CEF query failed:", errorCode, errorMessage);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
console.warn("cefQuery is not available. Input ignored.");
|
||||
}
|
||||
});
|
||||
|
||||
// --- 修复点 3: 使用 TextDecoder 优化解码逻辑 ---
|
||||
// 这是更现代、更可靠的将字节流解码为UTF-8字符串的方法
|
||||
const decoder = new TextDecoder('utf-8');
|
||||
|
||||
/**
|
||||
* 供 Java 调用的接口:写入数据到终端
|
||||
* @param {string} base64Data - Base64 编码的原始字节流字符串
|
||||
*/
|
||||
function writeToTerminal(base64Data) {
|
||||
try {
|
||||
// 将 Base64 字符串转换为 Uint8Array 字节数组
|
||||
const binaryString = window.atob(base64Data);
|
||||
const len = binaryString.length;
|
||||
const bytes = new Uint8Array(len);
|
||||
for (let i = 0; i < len; i++) {
|
||||
bytes[i] = binaryString.charCodeAt(i);
|
||||
}
|
||||
// 使用 TextDecoder 解码为字符串并写入终端
|
||||
term.write(decoder.decode(bytes));
|
||||
} catch (e) {
|
||||
console.error("Failed to decode or write Base64 data:", e);
|
||||
// 可以在终端显示错误信息
|
||||
term.write("\r\n[Front-end Error: Failed to process data from back-end]\r\n");
|
||||
}
|
||||
}
|
||||
|
||||
// 初始化通知
|
||||
term.write('\x1B[1;3;32mConnected to Local Shell via PTY4J...\x1B[0m\r\n');
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user