25 私有链接
网络游戏排行榜2025前十名.好玩的网络游戏,好玩的网游.2025好玩的网游排行榜.网游排行榜
1.从【chrome.noki.eu.org】下载Chrome离线安装包。
2.用7z解压并进入【Chrome-bin】目录。
3.最精简文件清单。
Chrome:
│ 102.0.5005.115.manifest
│ chrome.dll
│ chrome.exe
│ chrome_100_percent.pak
│ chrome_elf.dll
│ icudtl.dat
│ libEGL.dll
│ libGLESv2.dll
│ resources.pak
│ v8_context_snapshot.bin
│ vk_swiftshader.dll
│ vk_swiftshader_icd.json
│ vulkan-1.dll
│
└─Locales
│
└─zh-CN.pak
4.最上层【chrome.exe】启动
1. 更新系统包
首先,确保你的系统包是最新的:
sudo apt update
sudo apt upgrade -y
2. 安装 Nginx
安装 Nginx 包:
sudo apt install nginx -y
安装完成后,启用并启动 Nginx 服务:
sudo systemctl enable nginx
sudo systemctl start nginx
你可以通过访问你的服务器 IP 地址,检查 Nginx 是否已成功运行。默认情况下,Nginx 会显示欢迎页面。
3.导入 PHP 官方仓库(packages.sury.org)的 GPG 签名密钥
sudo apt install -y ca-certificates apt-transport-https lsb-release wget
wget -O /usr/share/keyrings/sury.gpg https://packages.sury.org/php/apt.gpg
echo "deb [signed-by=/usr/share/keyrings/sury.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" | \
sudo tee /etc/apt/sources.list.d/sury-php.list
sudo apt update
重新更新 apt 缓存,安装PHP及其扩展
sudo apt update
sudo apt install php8.1 php8.1-fpm php8.1-sqlite3 php8.1-common -y
创建目录及用户和组
mkdir -p /service/wwwroot/share
grep www-data /etc/passwd
grep www-data /etc/group
chown -R www-data:www-data /service/wwwroot/
4.配置PHP及Nginx
nano /etc/nginx/sites-available/share
server {
listen 17080;
server_name _;
client_max_body_size 60M;
root /service/wwwroot/share/;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock; # 确保与实际的 socket 地址匹配
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
ln -s /etc/nginx/sites-available/share /etc/nginx/sites-enabled/share
rm -rf /etc/nginx/sites-enabled/default
nano /etc/php/8.1/fpm/php.ini
找到并修改以下参数:
upload_max_filesize = 60M
post_max_size = 60M
5.测试、重启PHP及Nginx
sudo nginx -t
sudo systemctl restart nginx
sudo systemctl restart php8.1-fpm
安装
apk update
apk add nginx
# 最小扩展安装PHP
apk add php81 php81-fpm php81-session php81-tokenizer php81-sqlite3 php81-pdo_sqlite
#可选其他扩展
apk add php81-mysqli php81-opcache php81-zlib php81-curl php81-xml php81-ctype php81-mbstring php81-soap php81-gd
查看系统是否存在Nginx用户和组
# 查看Nginx用户:
grep nginx /etc/passwd
# 如果输出
nginx:x:...:...:Nginx User:/var/cache/nginx:/sbin/nologin
# 说明系统中有 nginx 用户
# 查看Nginx组:
grep nginx /etc/group
# 如果输出
nginx:x:999:
# 说明系统中有 nginx 组
# 否则创建Nginx用户和组:
groupadd nginx
useradd -g nginx -s /sbin/nologin -M nginx
# 设置fpm目录权限
chown -R nginx:nginx /run/php-fpm81/
chmod 660 /run/php-fpm81/php8.1-fpm.sock
chown nginx:nginx /run/php-fpm81/php8.1-fpm.sock
配置 PHP-FPM 8.1
在 Alpine 上,PHP-FPM 的配置文件通常位于 /etc/php8.1/php-fpm.conf 和 /etc/php8.1/php-fpm.d/www.conf。你可以编辑配置文件,确保 PHP-FPM 正常工作。
vi /etc/php81/php-fpm.d/www.conf
确保以下配置是正确的:
user 和 group 设置为 nginx(因为 Nginx 会以 nginx 用户运行):
user = nginx
group = nginx
listen 设置为适当的 Unix socket 或 IP 地址端口:
listen = /run/php-fpm81/php8.1-fpm.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
配置 Nginx
Nginx 的默认配置文件位于 /etc/nginx/nginx.conf
站点的配置文件通常位于 /etc/nginx/http.d/ 目录。
vi /etc/nginx/http.d/default.conf
确保 fastcgi_pass 指向 PHP-FPM 使用的 socket 文件路径。
server {
listen 80;
server_name localhost;
root /service/wwwroot/default;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/run/php-fpm81/php8.1-fpm.sock; # 使用 PHP-FPM 的 Unix Socket
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location ~ /\.ht {
deny all;
}
}
启动并启用 Nginx 和 PHP-FPM
rc-service php-fpm81 start
rc-service nginx start
使服务在系统启动时自动启动,可以使用以下命令:
rc-update add php-fpm81
rc-update add nginx
测试 PHP
在 /var/www/localhost/htdocs/ 目录下创建一个 info.php 文件:
echo "<?php phpinfo(); ?>" | sudo tee /service/wwwroot/default/info.php
然后,打开浏览器,访问 http://127.0.0.1/info.php,如果你看到 PHP 信息页面,说明 PHP-FPM 配置成功。
如果不成功:
查看Nginx错误信息
tail -n 100 /var/log/nginx/error.log
chmod 660 /run/php-fpm81/php8.1-fpm.sock
chown nginx:nginx /run/php-fpm81/php8.1-fpm.sock
rc-service php-fpm81 restart
rc-service nginx reload下面这份“小抄”按常见需求→该用哪个容器来选,外加要点/坑位提醒(Rust fltk 名称在括号里):
选哪个?
| 需求 | 首选容器 | 为什么 | 关键要点 / 易踩点 |
|---|---|---|---|
| 普通窗口 | Fl_Window (window::Window) | 基本窗口 | 需要防闪烁/重绘多→用 Fl_Double_Window |
| 重绘频繁、动画、自绘画布 | Fl_Double_Window (WindowType::Double 或 window::DoubleWindow) | 双缓冲,减少闪烁 | 会多占一块离屏缓冲(内存↑) |
| OpenGL 内容 | Fl_Gl_Window (window::GlWindow) | 独立 GL 上下文 | 在 draw 里做 GL 绘制;注意与 UI 线程/重绘时机 |
| 内容需要滚动 | Fl_Scroll (group::Scroll) | 提供滚动条 | 通常在 Scroll 里再放一个内部 Group 承载内容;大内容要 resizable |
| 页签切换 | Fl_Tabs (group::Tabs) | 多页签 | 每个 Tab 是一个子 Group;调整 resizable 让内容随窗缩放 |
| 向导/一步一步 | Fl_Wizard (group::Wizard) | 同时只显示一个页面 | 用 next()/prev() 切换;每页是一个子 Group |
| 左右/上下线性自适应布局 | Fl_Flex (group::Flex) | 现代化线性布局(行/列),支持权重 | 用 flex.set_size(&child, px) 固定某子项尺寸;其余自动分配 |
| 栅格(表单/面板) | Fl_Grid (group::Grid) | 行×列网格,自动布局 | 适合复杂对齐;比 Pack 更可控;避免与其它“自伸缩容器”深度嵌套 |
| 简单“依次排队” | Fl_Pack (group::Pack) | 顺序排列(横/竖) | 轻量但不如 Flex/Grid 灵活;不建议做复杂自适应 |
| 可拖拽分隔的“分栏” | Fl_Tile (group::Tile) | 平铺区块,可拖动边界 | 类似“分割面板”;子项自己绘制边界/把手感稍原始 |
| 只是把一批控件当作整体管理/隐藏/禁用 | Fl_Group (group::Group) | 基类容器,纯“打包” | 用来分组、统一 deactivate()/hide()、抓事件;坐标仍靠你手摆 |
实战建议(精简版)
- 新项目优先:
Flex(线性)/Grid(表格) 做主布局,里面再放普通Group+控件。 - 滚动内容:
Scroll -> Group -> 内容三级结构更稳;给内部 group 做resizable。 - 分隔面板:
Tile;如果只是简单两栏,也可“Flex + 固定一侧尺寸”。 - 重绘多:窗口设
WindowType::Double,自绘控件也尽量在双缓冲里。 - 避免把多个“自伸缩容器”(
Flex / Grid / Pack / Tile)层层套娃;层次深了容易出现尺寸争用或奇怪的重排。 - 缩放跟随:为顶层窗口
window.resizable(&some_child)指定“跟随缩放”的基准控件(常是主内容区)。 - Tabs/Wizard:每页用子
Group;只让每页的主内容resizable,避免整个页上所有控件乱拉伸。
迷你模板(Rust)
Flex(列布局):
use fltk::{prelude::*, group::Flex, enums::Align};
let mut flex = Flex::default_fill().column(); // 占满父容器,竖向排
flex.set_margin(8);
flex.set_pad(8);
// ... add children here ...
// flex.set_size(&child_fixed, 120); // 固定某子项高度(列布局时=高度)
flex.end();
Scroll with inner group:
use fltk::{prelude::*, group::{Scroll, Group}};
let mut scroll = Scroll::default_fill();
let mut inner = Group::default().with_size(800, 1200); // 内容实际大小
// ... 放很多子控件 ...
inner.end();
scroll.end();
// 让滚动区域以 inner 为基准自适应
scroll.set_scrollbar_size(14);
双缓冲窗口:
use fltk::{prelude::*, window::Window, enums::WindowType};
let mut win = Window::new(100, 100, 900, 600, None);
win.set_type(WindowType::Double);
// win.resizable(&main_area);
win.end();
win.show();
https://www.fltk.org/doc-1.5/index.html
https://www.fltk.org/
FLTK
fltk = { version = "^1.5", features = ["fltk-bundled"] }
CMAKE
https://cmake.org/download/
https://github.com/Kitware/CMake/releases/download/v4.1.2/cmake-4.1.2-windows-x86_64.msi
FLTK-FLUID
cargo install fltk-fluid
cargo uninstall fltk-fluid
fluid &
FL2RUST
cargo install fl2rust
fl2rust <fl file>.fl > <output file>.rs
fltk-fluid 只负责“画界面(布局/控件)”;
程序逻辑要在你自己的 Rust 代码里写。fl2rust ui.fl > src/ui.rs 只把界面蓝图翻译成 Rust 结构体和一个构造函数,不要在生成的 ui.rs 里写业务逻辑(下次重新生成会被覆盖)。
下面给你一套常用做法 + 可运行示例 👇
推荐做法(总结)
- 用 FLUID 画界面,给重要控件起名字(如
btn_inc,lbl_count)。 - 用 fl2rust 生成
ui.rs(包含UserInterface等结构和make_window())。 - 在
main.rs(或你自己的模块)里:
- 创建
App和ui; - 给控件绑定回调(
set_callback); - 更新控件状态(
set_label、set_value…); - 用
app::channel做更复杂的消息/状态管理。
- 不要改
ui.rs,只把它当“视图层”。逻辑放main.rs或其他模块,必要时给UserInterface写扩展impl(单独文件即可)。
最小示例:按钮计数器
1) 在 FLUID 里
- 新建窗口类名(Class)设为:
UserInterface(默认就行)。 - 放一个
Button,名字(Name)设为:btn_inc,标签(Label)设为:点击 +1。 - 放一个
Box(或Frame),名字设为:lbl_count,初始文本设为:0。 - 保存为
ui.fl。
2) 生成 Rust 界面代码
fl2rust ui.fl > src/ui.rs
src/ui.rs 会导出一个类似:
pub struct UserInterface {
pub window: fltk::window::Window,
pub btn_inc: fltk::button::Button,
pub lbl_count: fltk::frame::Frame,
// ...
}
impl UserInterface {
pub fn make_window() -> Self { /* ... */ }
}
3) 在 Cargo.toml 加依赖
[dependencies]
fltk = "1.5"
4) 在 src/main.rs 写逻辑
方案 A:用闭包直接改 UI(最直观)
use fltk::{prelude::*, *};
mod ui; // 就是生成的 src/ui.rs
fn main() {
let app = app::App::default();
let mut ui = ui::UserInterface::make_window();
ui.window.make_resizable(true);
// 计数状态放在闭包里;要更新标签,需要 clone 一份引用
let mut count = 0;
let mut lbl = ui.lbl_count.clone();
ui.btn_inc.set_callback(move |_| {
count += 1;
lbl.set_label(&count.to_string());
});
app.run().unwrap();
}
方案 B:用 channel 做解耦(适合复杂逻辑)
use fltk::{prelude::*, *};
mod ui;
#[derive(Clone, Copy)]
enum Msg { Inc }
fn main() {
let app = app::App::default();
let (s, r) = app::channel::();
let mut ui = ui::UserInterface::make_window();
ui.window.make_resizable(true);
// UI → 发送消息
ui.btn_inc.set_callback(move |_| s.send(Msg::Inc));
// 应用状态
let mut count = 0;
// 事件循环:接收消息并更新 UI
while app.wait() {
if let Some(msg) = r.recv() {
match msg {
Msg::Inc => {
count += 1;
ui.lbl_count.set_label(&count.to_string());
}
}
}
}
}
为什么不建议改 ui.rs?
- 这是生成文件,你每次改图再生成都会覆盖;
- 把逻辑放到
main.rs或单独模块,界面变了也不影响业务逻辑; - 如需给
UserInterface增加方法,可在另一个文件写扩展impl:
// src/ui_ext.rs
use crate::ui::UserInterface;
impl UserInterface {
pub fn init_logic(&mut self) {
// 绑回调、初始化状态…
}
}
然后在 main.rs:
mod ui;
mod ui_ext;
// ...
let mut ui = ui::UserInterface::make_window();
ui.init_logic();
小技巧
- 在 FLUID 里给控件起 Name(不是 Label),
fl2rust才会把它们作为pub字段导出,便于在 Rust 里访问。 - 业务状态尽量放在你自己的 struct 或闭包/通道里,不放生成文件里。
- 需要跨回调共享控件就
clone()(FLTK 控件是轻量句柄,可安全克隆)。 - 如果你不想每次手动运行
fl2rust,可以用我之前给你的 build.rs 集成 或 proc-macro 宏方案,编译时自动生成。
如果你愿意,我可以根据你现在的 ui.fl 帮你把 main.rs 的逻辑搭好(比如输入框 + 按钮 + 校验 + 弹窗),你只要贴一下界面里控件的名字(Name)即可。
后面弹出控制台的解决办法
// main.rs 最开头插入:
// 发布版隐藏控制台,调试版保留控制台
#![cfg_attr(all(target_os = "windows", not(debug_assertions)), windows_subsystem = "windows")]
// 无论调试还是发布都隐藏控制台
// #![cfg_attr(target_os = "windows", windows_subsystem = "windows")]
eg.:
// main.rs
// 发布版隐藏控制台,调试版保留控制台
#![cfg_attr(all(target_os = "windows", not(debug_assertions)), windows_subsystem = "windows")]
// 无论调试还是发布都隐藏控制台
// #![cfg_attr(target_os = "windows", windows_subsystem = "windows")]
use fltk::{prelude::*, *};
mod ui;
fn main() {
let app = app::App::default();
// 现在会有 struct UserInterface 和 make_window()
let mut ui = ui::UserInterface::make_window();
// 给 Text_editor 绑定一个 TextBuffer(关键!)
let buf = text::TextBuffer::default();
ui.text_editor.set_buffer(Some(buf)); // 先把所有权交给 editor
// 之后通过 editor 拿 buffer 来改内容,避免 clone 带来的困惑
if let Some(mut b) = ui.text_editor.buffer() {
b.set_text("在这里编辑…");
}
// 如果生成代码里没 show,这里补一下:
ui.window.show();
app.run().unwrap();
}
// ui.rs
// Automatically generated by fl2rust
#![allow(unused_variables)]
#![allow(unused_mut)]
#![allow(unused_imports)]
#![allow(dead_code)]
#![allow(clippy::needless_update)]
use fltk::browser::*;
use fltk::button::*;
use fltk::dialog::*;
use fltk::enums::*;
use fltk::frame::*;
use fltk::group::*;
use fltk::image::*;
use fltk::input::*;
use fltk::menu::*;
use fltk::misc::*;
use fltk::output::*;
use fltk::prelude::*;
use fltk::table::*;
use fltk::text::*;
use fltk::tree::*;
use fltk::valuator::*;
use fltk::widget::*;
use fltk::window::*;
#[derive(Debug, Clone)]
pub struct UserInterface {
pub window: Window,
pub text_editor: TextEditor,
}
impl UserInterface {
pub fn make_window() -> Self {
let mut window = Window::new(397, 259, 969, 573, None);
window.set_label(r#"TEST"#);
window.set_type(WindowType::Double);
window.make_resizable(true);
window.hide();
let mut fl2rust_widget_0 = MenuBar::new(0, 0, 969, 22, None);
fl2rust_widget_0.set_label(r#"mb1"#);
let idx = fl2rust_widget_0.add_choice(r#"submenu1/item1"#);
let idx = fl2rust_widget_0.add_choice(r#"submenu1/item2"#);
let idx = fl2rust_widget_0.add_choice(r#"submenu1/item3"#);
let idx = fl2rust_widget_0.add_choice(r#"submenu1/item4"#);
let idx = fl2rust_widget_0.add_choice(r#"submenu2/item1"#);
let idx = fl2rust_widget_0.add_choice(r#"submenu2/item2"#);
let idx = fl2rust_widget_0.add_choice(r#"submenu2/item3"#);
let idx = fl2rust_widget_0.add_choice(r#"submenu2/item4"#);
let idx = fl2rust_widget_0.add_choice(r#"submenu3/item1"#);
let idx = fl2rust_widget_0.add_choice(r#"submenu3/item2"#);
let idx = fl2rust_widget_0.add_choice(r#"submenu3/item3"#);
let idx = fl2rust_widget_0.add_choice(r#"submenu3/item4"#);
fl2rust_widget_0.end();
let mut fl2rust_widget_1 = CheckBrowser::new(10, 30, 144, 517, None);
fl2rust_widget_1.set_label(r#"cb1"#);
let mut text_editor = TextEditor::new(157, 48, 801, 353, None);
text_editor.set_label(r#"TE1"#);
window.resizable(&text_editor);
text_editor.set_tooltip(r#"Please Input"#);
window.end();
Self {
window,
text_editor,
}
}
}
// cargo.toml
[package]
name = "fltk_widgets_showcase"
version = "0.1.0"
edition = "2024"
[dependencies]
fltk = { version = "^1.5", features = ["fltk-bundled"] }
一款强大的基于Web的KVM,HYPER-V虚拟化控制面板(云主机管理系统)。 管理员可以通过点击按钮即时创建主机,用户可以使用非常高级的基于Web的GUI来启动,停止,重新启动和管理他们的主机。 用户和管理员可以看到各种图表,以便更好地管理其资源。支持管理IIS FTP MYSQL MSSQL虚拟主机 DCIM机房自动化系统批量安装服务器系统,hyper-v可控制下行带宽限制,hyper-v下行带宽限速
ZJF_PERSONAL_FILE
[{临时文件, 分享的数据/{000_文档, 001_图片, 002_音乐, 003_视频, 004_程序, 005_压缩文件}, 我的数据/{000_个人文档/{000_电子书/{其他, 知识产权, 计算机, 音乐}, 001_收藏/{书籍类, 密码类, 文章收藏, 证件文件}, 002_爱好/{旅行, 美食, 运动}, 003_专业技术/{计算机相关, 设计相关}, 004_写作/{小说, 文章, 诗歌}}, 001_公司文档/{000_工作文件/{一般工作, 合同, 报告, 方案}, 001_项目文档/{设计文档, 需求文档, 项目总结}, 002_会议记录/{会议PPT, 会议纪要, 会议音频}}, 002_移动U盘/{临时文件, 下载文件, 备份文件}, 003_我的图片/{000_2K图片/{人像, 夜景, 建筑, 风景, 城市, 抽象}, 001_4K图片/{人像, 夜景, 建筑, 风景, 城市, 抽象}, 002_图片收藏/{经典图像, 网络素材, 艺术创作}, 003_我的照片/{家庭照片, 旅行照片, 活动照片}, 004_网络链接用图片/{广告素材, 社交媒体图, 网站图}}, 004_我的音乐/{000_我喜欢的音乐/{ILIKE01, ILIKE02, ILIKE03, ILIKE04, ILIKE05, ILIKE06, ILIKE07, ILIKE08}, 001_唱片专辑, 002_单曲, 003_独立制作, 004_网络链接用音乐/{版权音乐, 网络广播, 自制音乐}}, 005_我的视频/{000_录制视频/{演讲视频, 课程录制}, 001_短片/{个人短片, 创意短片}, 002_教学视频/{乐器教程, 摄影教程, 编程教程}, 003_电影收藏}, 006_应用程序/{000_破解优化/{系统相关, 程序相关}, 001_桌面应用/{常用软件, 编程软件, 设计软件, 办公软件, 媒体软件, 其他}, 002_桌面工具/{屏幕工具, 文件管理, 系统优化}, 003_服务器应用/{通用脚本, 通用服务, Alpine/{脚本, 服务}, CentOS/{脚本, 服务}, Debian/{脚本, 服务}, WindowsServer/{脚本, 服务}}, 004_开发应用/{IDE, 数据库管理}, 005_安卓应用/{娱乐, 手机工具, 游戏}, 006_应用配置/{工具配置, 环境配置}, 007_收藏游戏, 008_浏览器插件}, 007_系统相关/{000_系统镜像/{Alpine, CentOS, Debian, Windows, 群晖, PVE}, 001_GHO镜像, 002_DD镜像/{Linux镜像, Windows镜像}, 003_驱动程序}, 999_压缩文件仓库/{000_7z格式压缩文档, 001_RAR格式压缩文档, 002_ZIP格式压缩文档, 003_文件拆分, 004_文件合并, 005_密码保护压缩文件}}, 未整理的数据/{待归档, 需要处理}}]知名软件达人|423DOWN.COM,更新快、专注去广告类软件输出10年、个人IP品牌软件分享站
一品威客网,数智化创意设计交易服务平台,聚集设计、开发、策划、营销等多品类千万级威客服务商,在线为中小微企业提供专业企业服务解决方案,是威客和雇主值得信赖的威客网站。
大眼仔旭网站是个人非盈利性网站,主要以分享日常工作生活办公技术资源为主,大眼仔热衷于分享互联网上一切所有美好事物,希望和您一起成长。