Excel规划求解演示
这个演示,是在新项目进场前的筹备期,HR需要对人工成本进行测算,根据员工实发反推工资标准的示例。
光锥之内皆命运
示例页面:全国社平、最低工资标准及社保比例 – null (blog.guohao.asia/)
extensions
并解压;MediaWiki:Common.css
,将以下CSS填入页面: .responsive-iframe {
width: 100%; /* 宽度自适应 */
height: 100vh; /* 高度设置为视窗高度 */
border: none;
}
LocalSettings.php
中加入以下代码启用扩展:wfLoadExtension('CosPreview');
<cospreview id="cdn-1253443493" path="picgo/202411201059195.xlsx" region="ap-beijing" />
extensions
directory and unzip;MediaWiki:Common.css
in your local MediaWiki, and add the following CSS to the page: .responsive-iframe {
width: 100%; /* Full width responsiveness */
height: 100vh; /* Height set to viewport height */
border: none;
}
LocalSettings.php
to enable the extension:wfLoadExtension('CosPreview');
<cospreview id="cdn-1253443493" path="picgo/202411201059195.xlsx" region="ap-beijing" />
示例页面:全国社平、最低工资标准及社保比例 – null (blog.guohao.asia/)
extensions
并解压;MediaWiki:Common.css
,将以下CSS填入页面: .responsive-iframe {
width: 100%; /* 宽度自适应 */
height: 100vh; /* 高度设置为视窗高度 */
border: none;
}
LocalSettings.php
中加入以下代码启用扩展:wfLoadExtension('CosPreview');
<cospreview id="cdn-1253443493" path="picgo/202411201059195.xlsx" region="ap-beijing" />
extensions
directory and unzip;MediaWiki:Common.css
in your local MediaWiki, and add the following CSS to the page: .responsive-iframe {
width: 100%; /* Full width responsiveness */
height: 100vh; /* Height set to viewport height */
border: none;
}
LocalSettings.php
to enable the extension:wfLoadExtension('CosPreview');
<cospreview id="cdn-1253443493" path="picgo/202411201059195.xlsx" region="ap-beijing" />
MediaWiki的配置文件位于/path/mediawiki/LocalSettings.php
以下是https://docs.guohao.asia/ 经脱敏的配置文件内容(修改配置前请务必做好备份)
<?php
# 防止直接通过网页访问
if ( !defined( 'MEDIAWIKI' ) ) {
exit;
}
## 基本设置
$wgSitename = "null"; # 站点名称
$wgMetaNamespace = "Null"; # 站点命名空间
$wgScriptPath = ""; # 脚本路径
$wgServer = "https://docs.guohao.asia"; # 服务器地址
$wgResourceBasePath = $wgScriptPath; # 静态资源路径
$wgLogos = [
'1x' => "$wgResourceBasePath/resources/assets/logo.png", # 站点logo
'icon' => "$wgResourceBasePath/resources/assets/logo.png",
];
## 用户和邮件设置
$wgEnableEmail = true; # 启用邮件功能
$wgEnableUserEmail = true; # 用户邮件通知
$wgEmergencyContact = ""; # 紧急联系邮箱
$wgPasswordSender = "x@xx.xxx"; # 密码发送者邮箱
$wgEnotifUserTalk = false; # 用户对话通知
$wgEnotifWatchlist = false; # 观察列表通知
$wgEmailAuthentication = true; # 启用邮件认证
## 数据库设置
$wgDBtype = "mysql"; # 数据库类型
$wgDBserver = "localhost"; # 数据库服务器
$wgDBname = "xxxx"; # 数据库名称
$wgDBuser = "xxxx"; # 数据库用户名
$wgDBpassword = "xxxx"; # 数据库密码
$wgDBprefix = "xxxx"; # 数据库表前缀
$wgDBssl = false; # 是否使用SSL
$wgDBTableOptions = "ENGINE=InnoDB, DEFAULT CHARSET=binary"; # 数据库表选项
$wgSharedTables[] = "actor"; # 共享数据库表
## 缓存设置
$wgMainCacheType = CACHE_MEMCACHED; # 主缓存类型
$wgParserCacheType = CACHE_MEMCACHED; # 解析器缓存类型
$wgMessageCacheType = CACHE_MEMCACHED; # 消息缓存类型
$wgMemCachedServers = array("127.0.0.1:11211"); # Memcached服务器地址
## 文件和上传设置
$wgEnableUploads = true; # 启用文件上传
$wgUseImageMagick = true; # 使用ImageMagick处理图片
$wgImageMagickConvertCommand = "/usr/bin/convert"; # ImageMagick命令路径
$wgUseInstantCommons = false; # 是否使用即时共享图片
## 语言和时区设置
$wgLanguageCode = "zh-cn"; # 语言代码
$wgLocaltimezone = "PRC"; # 时区设置
## 安全和性能设置
$wgSecretKey = "26abb9898bb4cb347aa8cc71bcxxxxxxxxxxxxxxxx9824f6078771c5d40b0cb44765cf8bbf"; # 安全密钥
$wgAuthenticationTokenVersion = "1"; # 认证令牌版本
$wgUpgradeKey = "d0ddxxxx07b2xxxx"; # 升级密钥
## 版权和皮肤设置
$wgRightsPage = ""; # 版权页面
$wgRightsUrl = ""; # 版权链接
$wgRightsText = ""; # 版权文本
$wgRightsIcon = ""; # 版权图标
$wgDefaultSkin = "vector-2022"; # 默认皮肤
wfLoadSkin( 'MinervaNeue' ); # 加载皮肤
wfLoadSkin( 'MonoBook' );
wfLoadSkin( 'Timeless' );
wfLoadSkin( 'Vector' );
## 页脚和工具栏设置
unset($wgFooterIcons['poweredby']); # 去掉底部的Powered by
$wgDefaultUserOptions['usebetatoolbar'] = 1; # 启用测试工具栏
## 访问和内容设置
$wgShowIPinHeader = false; # 不在头部显示IP
$wgAllowHttpsExternalImages = true; # 允许外链HTTPS图片
$wgAllowCopyUploads = true; # 允许通过URL上传图片
$wgAllowExternalImages = true; # 允许外链图片
$wgFileExtensions = array('png','gif','jpg','jpeg','doc','ppt','pptx','pdf','docx','xls','xlsx','webp','svg','mp4','mp3'); # 允许的文件扩展名
$wgVerifyMimeType = false; # 不验证MIME类型
## 钩子和脚本设置
$wgHooks['BeforePageDisplay'][] = function( OutputPage &$out, Skin &$skin ) {
// 添加Mermaid.js脚本
$out->addScript( '<script src="https://cdnjs.cloudflare.com/ajax/libs/mermaid/10.9.1/mermaid.min.js" integrity="sha512-6a80OTZVmEJhqYJUmYd5z8yHUCDlYnj6q9XwB/gKOEyNQV/Q8u+XeSG59a2ZKFEHGTYzgfOQKYEBtrZV7vBr+Q==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>' );
// 添加Google AdSense脚本
$out->addScript( '<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-36xxxx78343xxxx0" crossorigin="anonymous"></script>' );
// 添加统计代码
$out->addScript( '<script type="text/javascript" src="//api.tongjiniao.com/c?_=7xxxx772xxxx819968" async></script>' );
};
## 编辑和页面创建权限设置
$wgGroupPermissions['*']['edit'] = false; # 禁止未登录用户编辑
$wgGroupPermissions['*']['createpage'] = false; # 禁止未登录用户创建页面
$wgGroupPermissions['sysop']['edit'] = true; # 允许管理员编辑
$wgGroupPermissions['sysop']['createpage'] = true; # 允许管理员创建页面
## 移动和默认皮肤设置
wfLoadSkin( 'Citizen' ); # 加载移动皮肤
$wgDefaultMobileSkin = 'citizen'; # 默认移动皮肤
## HTML和内容安全策略设置
$wgContentSecurityPolicy = "
default-src 'self';
img-src 'self' https://*;
media-src 'self' https://www.guohao.asia https://blog.guohao.asia/ https://docs.guohao.asia;
script-src 'self';
style-src 'self';
";
$wgAllowIframeTag = true; # 允许iframe标签
$wgHTML5Video = true; # 启用HTML5视频
$wgRawHtml = true; # 允许解析HTML
## 管理员权限设置
$wgGroupPermissions['sysop']['deleterevision'] = true; # 允许管理员删除修订记录
$wgGroupPermissions['sysop']['deletelogentry'] = true; # 允许管理员删除日志条目
## 邮件服务器设置
$wgSMTP = [
'host' => 'smtp-relay.brevo.com', # SMTP服务器地址
'IDHost' => 'smtp-relay.brevo.com', # 通常是网站域名
'localhost' => 'smtp-relay.brevo.com', # 某些邮件服务器需要此参数
'port' => 587, # 连接到SMTP服务器的端口
'auth' => true, # 是否使用SMTP认证
'username' => 'xxxx8xxxx@smtp-brevo.com', # SMTP认证用户名
'password' => 'xxxxMxxxxsxxxxpO' # SMTP认证密码
];
## 未登录用户的缓存设置
$wgUseFileCache = true; # 启用文件缓存
$wgFileCacheDirectory = "$IP/images/cache"; # 文件缓存目录
$wgMainCacheType = CACHE_MEMCACHED; # 主缓存类型
$wgParserCacheType = CACHE_MEMCACHED; # 解析器缓存类型
$wgMessageCacheType = CACHE_MEMCACHED; # 消息缓存类型
$wgMemCachedServers = [ '127.0.0.1:11211' ]; # Memcached服务器地址
$wgSessionsInObjectCache = true; # 启用对象缓存会话
$wgSessionCacheType = CACHE_MEMCACHED; # 会话缓存类型
## 扩展设置
wfLoadExtension( 'SyntaxHighlight_GeSHi' ); # 语法高亮扩展
wfLoadExtension( 'ImageMap' ); # 图片地图扩展
wfLoadExtension( 'HeaderFooter' ); # 页眉页脚扩展
wfLoadExtension( 'EmbedVideo' ); # 视频嵌入扩展
wfLoadExtension( 'VisualEditor' ); # 可视化编辑器扩展
wfLoadExtension( 'AdminLinks' ); # 管理链接扩展
wfLoadExtension( 'Widgets' ); # 小部件扩展
wfLoadExtension( 'Cite' ); # 引用扩展
wfLoadExtension( 'ParserFunctions' ); # 解析器函数扩展
wfLoadExtension( 'PageImages' ); # 页面图片扩展
wfLoadExtension( 'Math' ); # 数学公式扩展
wfLoadExtension( 'PdfHandler' ); # PDF处理扩展
wfLoadExtension( 'ImportOfficeFiles' ); # 导入办公文件扩展
wfLoadExtension( 'MultimediaViewer' ); # 多媒体查看器扩展
wfLoadExtension( 'OATHAuth' ); # OATH认证扩展
?>
当Nextcloud数据库丢失索引时,可以通过命令行手动修复。请在Nextcloud安装根目录执行以下命令:
sudo -u www php occ db:add-missing-indices
例如,修复丢失的索引“mail_messages_msgid_idx”:
sudo -u www php occ db:add-missing-indices
修复后可以显著提高查询速度。
<?php
$CONFIG = array(
'objectstore' => array(
'class' => '\\OC\\Files\\ObjectStore\\S3',
'arguments' => array(
'bucket' => 'nextcloud-*******', // 存储桶名称(空间名称)
'autocreate' => false,
'key' => 'AKID***********', // 替换为用户的 SecretId
'secret' => '**********', // 替换为用户的 SecretKey
'hostname' => 'cos.<Region>.myqcloud.com', // 将 <Region> 修改为所属地域,如 ap-shanghai
'use_ssl' => true,
),
),
'instanceid' => 'oc82tpo2f',
'passwordsalt' => '2GdQCVNsIVYF1KLP3fT3woH69X',
'secret' => 'VSy0Y+/2wV7g4kvbiKSE0dSa2Yp1ajtvvZpgdV14Lsc',
'trusted_domains' => array(
0 => 'nextcloud.***.***',
), // nextcloud域名
'datadirectory' => '/www/nextcloud/data', // data路径,请根据实际情况修改
'dbtype' => 'mysql',
'version' => '27.1.5.1',
'overwrite.cli.url' => 'https://nextcloud.***.***/nextcloud',
'dbname' => 'nextcloud',
'dbhost' => 'localhost',
'dbport' => '',
'dbtableprefix' => 'oc_',
'mysql.utf8mb4' => true,
'dbuser' => 'nextcloud', // 数据库用户名
'dbpassword' => '******', // 数据库密码
'installed' => true,
'maintenance' => false,
'updater.secret' => '\$2y\$10\$0eTb6aJ4u3NAWwlQk2qkUOTlI3.0O6TGLwAQOCyUtH/wmCpC',
'theme' => '',
'loglevel' => 2,
'filelocking.enabled' => true,
'memcache.local' => '\\OC\\Memcache\\Redis',
'memcache.locking' => '\\OC\\Memcache\\Redis',
'redis' => array(
'host' => '127.0.0.1',
'port' => 6379,
'timeout' => 0.0,
'password' => '', // redis密码
),
'mail_smtpmode' => 'smtp',
'mail_sendmailmode' => 'smtp',
'mail_from_address' => '****', // 请根据实际情况修改
'mail_domain' => 'outlook.com', // 请根据实际情况修改
'mail_smtpauth' => 1,
'mail_smtphost' => 'smtp-mail.outlook.com', // 请根据实际情况修改
'mail_smtpport' => '587', // 请根据实际情况修改
'mail_smtpname' => '*****', // 请根据实际情况修改
'mail_smtppassword' => '****', // 请根据实际情况修改
'enabledPreviewProviders' => [
'OC\Preview\MP3',
'OC\Preview\TXT',
'OC\Preview\MarkDown',
'OC\Preview\OpenDocument',
'OC\Preview\Krita',
'OC\Preview\Imaginary',
],
'preview_imaginary_url' => 'http://<url of imaginary>',
);
设置cron.php每5分钟运行一次,cron.php的具体路径在nextcloud安装的根目录下。
crontab -u www -e
*/5 * * * * php -f /PathToNextcloud/cron.php
output_buffering
设置: ; output_buffering = 4096
opcache.enable=1
opcache.enable_cli=1
opcache.interned_strings_buffer=32
opcache.max_accelerated_files=80000
opcache.memory_consumption=128
opcache.save_comments=1
opcache.revalidate_freq=3
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains"
</IfModule>
如果Nextcloud文件完整性检查发现问题,可以根据文档中的指导进行修复。例如,.user.ini
文件缺失可以创建该文件并设置适当的open_basedir
,或者在宝塔面板中开启放跨站。
<?php
$CONFIG = array(
'instanceid' => 'xxxxxxxxxxx',
'passwordsalt' => 'xxxxxxxxxxxxxxxxxx',
'secret' => 'TNFR/+xxxxxxxxxxxxxxxxxxx/',
'trusted_domains' =>
array (
0 => 'nextcloud.guohao.asia',
),
'datadirectory' => '/www/wwwroot/nextcloud/data',
'dbtype' => 'mysql',
'version' => '24.0.5.1',
'overwrite.cli.url' => 'https://nextcloud.guohao.asia',
'dbname' => 'xxxxxxxxxxxx',
'dbhost' => 'localhost',
'dbport' => '',
'dbtableprefix' => 'oc_',
'mysql.utf8mb4' => true,
'dbuser' => 'xxxxxxxxxx',
'dbpassword' => 'xxxxxxxxx',
'installed' => true,
'app_install_overwrite' =>
array (
0 => 'tencentcloudcosconfig',
1 => 'files_external_onedrive',
),
// 缓存设置
'memcache.local' => 'OC\\Memcache\\Redis',
'memcache.distributed' => 'OC\\Memcache\\Memcached',
'redis' => [ #Redis
'host' => 'localhost', #Redis 服务器
'port' => 6379, #Redis 端口
'timeout' => 0.0, #Redis 超时设定
'password' => 'XXXXXXXXXXX', #Redis 密码
'dbindex' => 1, #Redis 数据库选择
],
'memcached_servers' => array( #Memcached 服务器
array('localhost', 11211),
),
'memcached_options' => array( #Memcached 选项
\Memcached::OPT_CONNECT_TIMEOUT => 50,
\Memcached::OPT_RETRY_TIMEOUT => 50,
\Memcached::OPT_SEND_TIMEOUT => 50,
\Memcached::OPT_RECV_TIMEOUT => 50,
\Memcached::OPT_POLL_TIMEOUT => 50,
\Memcached::OPT_COMPRESSION => true,
\Memcached::OPT_LIBKETAMA_COMPATIBLE => true,
\Memcached::OPT_BINARY_PROTOCOL => true,
),
'cache_path' => '/www/wwwroot/nextcloud/cache', #缓存目录
'cache_chunk_gc_ttl' => 60*60*24, #缓存删除时间
// 腾讯云COS
'objectstore' =>
array (
'class' => '\\OC\\Files\\ObjectStore\\S3',
'arguments' =>
array (
'key' => 'XXXXXXXXXXXXXXXXXXXXXXXX',
'secret' => 'XXXXXXXXXXXXXXXXXXXXXXXX',
'bucket' => 'nextcloud-000000000',
'hostname' => 'cos.ap-beijing.myqcloud.com',
'use_ssl' => true,
'autocreate' => false,
),
),
// 电话区号
'default_phone_region' => 'CN',
);
在config.php
中添加以下内容以启用应用商店:
'appstoreenabled' => true,
'appstoreurl' => 'https://www.orcy.net/ncapps/v1/',
更换为国内源(更新进度较官方略慢)。
在PHP8.2的配置文件中搜索APCu
,找到如下内容:
extension = /www/server/php/82/lib/php/extensions/no-debug-non-zts-20220829/apcu.so
在其下方添加:
; APCu Extension Configuration
; 加载APCu扩展
extension = /www/server/php/82/lib/php/extensions/no-debug-non-zts-20220829/apcu.so
; 设置共享内存大小,单位为字节,这里设置为64MB
apc.shm_size = "64M"
; 设置缓存条目的默认生存时间,单位为秒,这里设置为7200秒(2小时)
apc.ttl = 7200
; 设置垃圾回收的最大生存时间,单位为秒,这里设置为3600秒(1小时)
apc.gc_ttl = 3600
; 禁用文件存储缓存,减少磁盘I/O
apc.enable_file_store = 0
; 允许在CLI模式下使用APCu
apc.enable_cli = 1
; 设置缓存压缩比率,只有当压缩后的数据大小是原始大小的20%时,数据才会被压缩
apc.compress_rratio = 0.2
; 提供关于预期缓存文件和用户缓存数量的提示,以帮助APCu更好地分配内存
apc.num_files_hint = 1000
apc.user_entries_hint = 1000
; 禁用文件锁,可能会提高性能,但在某些情况下可能会导致数据不一致
apc.file_update_protection = 0
; 在APCu扩展导致核心转储时,帮助调试
;apc.coredump_unmap = 1
然后重启PHP服务。
php maintenance/deleteOldRevisions.php --delete
下载文件并将文件放入你的extensions/文件夹中名为
EmbedVideo
的目录下。
在你的LocalSettings.php
文件底部添加以下代码:wfLoadExtension( 'EmbedVideo' );
完成——转到你的维基的
Special:Version
页面,以验证扩展是否已成功安装。
https://www.bilibili.com/video/BV1bJUVY7EBi/
连接中的BV1bJUVY7EBi
即为视频ID.{{#ev:bilibili|BV1bJUVY7EBi|width=800|autoresize=true}}
即可插入来自B站的对应视频,并将视频的宽度设置为800px
MediaWiki:Common.css
页面加入以下代码:@media only screen and (max-width: 600px) {
/* 针对手机的样式 */
.ev-video {
width: 100%;
height: auto;
}
}
启用MediaWiki缓存:
# 以下为未登陆用户启用缓存-2024年11月18日
$wgUseFileCache = true; // default: false
$wgFileCacheDirectory = "$IP/images/cache"; // default: "{$wgUploadDirectory}/cache" which equals to "$IP/images/cache"
# 启用EMCACHED缓存-2024年11月18日
$wgMainCacheType = CACHE_MEMCACHED;
$wgParserCacheType = CACHE_MEMCACHED; // optional
$wgMessageCacheType = CACHE_MEMCACHED; // optional
$wgMemCachedServers = [ '127.0.0.1:11211' ];
$wgSessionsInObjectCache = true; // optional -- removed in 1.33+
$wgSessionCacheType = CACHE_MEMCACHED; // optional
MediaWiKi出于安全考虑是禁止插入外链媒体的,外链图片尚可通过css配置解决,但视频反复尝试都无法实现。
在腾讯云的对象存储中,发现了一段视频播放器的代码,想到一个曲线救国的方式。也就是将视频上传到COS中,然后在服务器上建一个HTML文件,将以下播放器代码复制进去。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta
name="viewport"
content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no,shrink-to-fit=no"
>
<title>播放器</title>
<link
href="https://web.sdk.qcloud.com/player/tcplayer/release/v4.2.1/tcplayer.min.css"
rel="stylesheet"
>
<script src="https://web.sdk.qcloud.com/player/tcplayer/release/v4.5.2/libs/flv.min.1.6.2.js">
</script>
<script src="https://web.sdk.qcloud.com/player/tcplayer/release/v4.2.1/libs/hls.min.0.13.2m.js">
</script>
<script src="https://video-public-1259789488.cos.ap-guangzhou.myqcloud.com/lib/dash.all.min.js">
</script>
<script src="https://web.sdk.qcloud.com/player/tcplayer/release/v4.5.0/tcplayer.v4.5.0.min.js">
</script>
<style>
html,body{
margin: 0;
padding: 0;
overflow: hidden;
height: 100%;
}
.tcplayer {
margin: 0 auto;
width: 100%;
height: 100%;
}
</style>
</head>
<body>
<video
id="player-container-id"
preload="auto" width="100%"
height="100%"
playsinline
webkit-playsinline
></video>
<script>
var tcplayer = TCPlayer("player-container-id", {
reportable: false,
});
tcplayer.src('https://www.guohao.asia/picgo/202411121424692.mp4')
</script>
</body>
</html>
在MediaWiKi编辑过程中,插入以下代码,以<iframe>方式插入外链视频。
<html>
<head>
<title>播放器</title>
<style>
.responsive-iframe {
width: 100%; /* 宽度自适应 */
height: 100vh; /* 高度自适应 */
border: none;
}
</style>
</head>
<body>
<iframe class="responsive-iframe" src="https://docs.guohao.asia/video/shr/1.html" frameborder="0" allowfullscreen></iframe>
</body>
</html>