Compare commits

...

2 Commits

Author SHA1 Message Date
commie 0a45a8fbb9 15 2026-03-01 00:24:34 +08:00
commie 873c7cf9c2 14 2026-02-28 19:24:05 +08:00
6 changed files with 257 additions and 53 deletions
+206 -1
View File
@@ -55,6 +55,9 @@ class MetricsController extends Base
// Redis指标 // Redis指标
$metrics[] = $this->getRedisMetrics(); $metrics[] = $this->getRedisMetrics();
// MongoDB指标
$metrics[] = $this->getMongoDBMetrics();
// HTTP请求指标 // HTTP请求指标
$metrics[] = $this->getHttpMetrics(); $metrics[] = $this->getHttpMetrics();
@@ -183,7 +186,9 @@ class MetricsController extends Base
// 尝试获取数据库状态 // 尝试获取数据库状态
$db = \think\facade\Db::connect(); $db = \think\facade\Db::connect();
$status = $db->query('SHOW STATUS');
// 1. 全局状态指标
$status = $db->query('SHOW GLOBAL STATUS');
$statusMap = []; $statusMap = [];
foreach ($status as $item) { foreach ($status as $item) {
$statusMap[$item['Variable_name']] = $item['Value']; $statusMap[$item['Variable_name']] = $item['Value'];
@@ -205,6 +210,60 @@ class MetricsController extends Base
if (isset($statusMap['Uptime'])) { if (isset($statusMap['Uptime'])) {
$metrics[] = $this->formatCounter('webman_db_uptime_seconds', 'Database uptime in seconds', [], (int)$statusMap['Uptime']); $metrics[] = $this->formatCounter('webman_db_uptime_seconds', 'Database uptime in seconds', [], (int)$statusMap['Uptime']);
} }
if (isset($statusMap['Innodb_buffer_pool_pages_data'])) {
$metrics[] = $this->formatGauge('webman_db_innodb_buffer_pool_pages_data', 'Number of pages containing data', [], (int)$statusMap['Innodb_buffer_pool_pages_data']);
}
if (isset($statusMap['Innodb_buffer_pool_pages_free'])) {
$metrics[] = $this->formatGauge('webman_db_innodb_buffer_pool_pages_free', 'Number of free pages', [], (int)$statusMap['Innodb_buffer_pool_pages_free']);
}
if (isset($statusMap['Innodb_buffer_pool_pages_total'])) {
$metrics[] = $this->formatGauge('webman_db_innodb_buffer_pool_pages_total', 'Total number of pages', [], (int)$statusMap['Innodb_buffer_pool_pages_total']);
}
if (isset($statusMap['Innodb_row_reads'])) {
$metrics[] = $this->formatCounter('webman_db_innodb_row_reads_total', 'Number of rows read', [], (int)$statusMap['Innodb_row_reads']);
}
if (isset($statusMap['Innodb_row_writes'])) {
$metrics[] = $this->formatCounter('webman_db_innodb_row_writes_total', 'Number of rows written', [], (int)$statusMap['Innodb_row_writes']);
}
if (isset($statusMap['Com_select'])) {
$metrics[] = $this->formatCounter('webman_db_com_select_total', 'Number of SELECT statements', [], (int)$statusMap['Com_select']);
}
if (isset($statusMap['Com_insert'])) {
$metrics[] = $this->formatCounter('webman_db_com_insert_total', 'Number of INSERT statements', [], (int)$statusMap['Com_insert']);
}
if (isset($statusMap['Com_update'])) {
$metrics[] = $this->formatCounter('webman_db_com_update_total', 'Number of UPDATE statements', [], (int)$statusMap['Com_update']);
}
if (isset($statusMap['Com_delete'])) {
$metrics[] = $this->formatCounter('webman_db_com_delete_total', 'Number of DELETE statements', [], (int)$statusMap['Com_delete']);
}
// 2. 数据库大小
$databases = $db->query('SHOW DATABASES WHERE `Database` NOT IN ("information_schema", "mysql", "performance_schema", "sys")');
foreach ($databases as $dbInfo) {
$dbName = $dbInfo['Database'];
$sizeResult = $db->query("SELECT table_schema AS 'database', SUM(data_length + index_length) AS 'size_bytes' FROM information_schema.tables WHERE table_schema = '{$dbName}' GROUP BY table_schema");
if (isset($sizeResult[0]['size_bytes'])) {
$metrics[] = $this->formatGauge('webman_db_database_size_bytes', 'Database size in bytes', [
'database' => $dbName
], (int)$sizeResult[0]['size_bytes']);
}
}
// 3. 表状态
$tables = $db->query('SHOW TABLE STATUS FROM `' . ($dbConfig['database'] ?? 'test') . '`');
foreach ($tables as $table) {
$tableName = $table['Name'];
$metrics[] = $this->formatGauge('webman_db_table_rows', 'Number of rows in table', [
'table' => $tableName
], (int)$table['Rows']);
$metrics[] = $this->formatGauge('webman_db_table_data_length_bytes', 'Data length of table', [
'table' => $tableName
], (int)$table['Data_length']);
$metrics[] = $this->formatGauge('webman_db_table_index_length_bytes', 'Index length of table', [
'table' => $tableName
], (int)$table['Index_length']);
}
} catch (\Exception $e) { } catch (\Exception $e) {
// 数据库连接失败,记录错误 // 数据库连接失败,记录错误
@@ -242,16 +301,31 @@ class MetricsController extends Base
if (isset($info['used_memory_peak'])) { if (isset($info['used_memory_peak'])) {
$metrics[] = $this->formatGauge('webman_redis_memory_peak_bytes', 'Redis peak memory used in bytes', [], (int)$info['used_memory_peak']); $metrics[] = $this->formatGauge('webman_redis_memory_peak_bytes', 'Redis peak memory used in bytes', [], (int)$info['used_memory_peak']);
} }
if (isset($info['used_memory_rss'])) {
$metrics[] = $this->formatGauge('webman_redis_memory_rss_bytes', 'Redis RSS memory used in bytes', [], (int)$info['used_memory_rss']);
}
if (isset($info['mem_fragmentation_ratio'])) {
$metrics[] = $this->formatGauge('webman_redis_memory_fragmentation_ratio', 'Redis memory fragmentation ratio', [], (float)$info['mem_fragmentation_ratio']);
}
// 连接数 // 连接数
if (isset($info['connected_clients'])) { if (isset($info['connected_clients'])) {
$metrics[] = $this->formatGauge('webman_redis_connected_clients', 'Number of connected clients', [], (int)$info['connected_clients']); $metrics[] = $this->formatGauge('webman_redis_connected_clients', 'Number of connected clients', [], (int)$info['connected_clients']);
} }
if (isset($info['client_recent_max_input_buffer'])) {
$metrics[] = $this->formatGauge('webman_redis_client_max_input_buffer_bytes', 'Maximum input buffer size', [], (int)$info['client_recent_max_input_buffer']);
}
if (isset($info['client_recent_max_output_buffer'])) {
$metrics[] = $this->formatGauge('webman_redis_client_max_output_buffer_bytes', 'Maximum output buffer size', [], (int)$info['client_recent_max_output_buffer']);
}
// 命令统计 // 命令统计
if (isset($info['total_commands_processed'])) { if (isset($info['total_commands_processed'])) {
$metrics[] = $this->formatCounter('webman_redis_commands_processed_total', 'Total commands processed', [], (int)$info['total_commands_processed']); $metrics[] = $this->formatCounter('webman_redis_commands_processed_total', 'Total commands processed', [], (int)$info['total_commands_processed']);
} }
if (isset($info['instantaneous_ops_per_sec'])) {
$metrics[] = $this->formatGauge('webman_redis_instantaneous_ops_per_sec', 'Instantaneous operations per second', [], (int)$info['instantaneous_ops_per_sec']);
}
// 键数量 // 键数量
if (isset($info['db0'])) { if (isset($info['db0'])) {
@@ -266,6 +340,29 @@ class MetricsController extends Base
$metrics[] = $this->formatCounter('webman_redis_uptime_seconds', 'Redis uptime in seconds', [], (int)$info['uptime_in_seconds']); $metrics[] = $this->formatCounter('webman_redis_uptime_seconds', 'Redis uptime in seconds', [], (int)$info['uptime_in_seconds']);
} }
// 过期键
if (isset($info['expired_keys'])) {
$metrics[] = $this->formatCounter('webman_redis_expired_keys_total', 'Total number of expired keys', [], (int)$info['expired_keys']);
}
if (isset($info['evicted_keys'])) {
$metrics[] = $this->formatCounter('webman_redis_evicted_keys_total', 'Total number of evicted keys', [], (int)$info['evicted_keys']);
}
// 命中和未命中
if (isset($info['keyspace_hits'])) {
$metrics[] = $this->formatCounter('webman_redis_keyspace_hits_total', 'Total number of keyspace hits', [], (int)$info['keyspace_hits']);
}
if (isset($info['keyspace_misses'])) {
$metrics[] = $this->formatCounter('webman_redis_keyspace_misses_total', 'Total number of keyspace misses', [], (int)$info['keyspace_misses']);
}
// 复制状态
if (isset($info['role'])) {
$metrics[] = $this->formatGauge('webman_redis_role', 'Redis role (master=1, slave=2)', [
'role' => $info['role']
], $info['role'] === 'master' ? 1 : 2);
}
} catch (\Exception $e) { } catch (\Exception $e) {
$metrics[] = $this->formatGauge('webman_redis_up', 'Redis connection status', [], 0); $metrics[] = $this->formatGauge('webman_redis_up', 'Redis connection status', [], 0);
} }
@@ -273,6 +370,114 @@ class MetricsController extends Base
return implode("\n", $metrics); return implode("\n", $metrics);
} }
/**
* 获取MongoDB指标
*/
protected function getMongoDBMetrics(): string
{
$metrics = [];
try {
// 检查MongoDB扩展是否安装
if (!class_exists('MongoDB\\Client')) {
$metrics[] = $this->formatGauge('webman_mongodb_up', 'MongoDB connection status', [], 0);
$metrics[] = $this->formatGauge('webman_mongodb_error', 'MongoDB error', [
'error' => 'extension_not_installed'
], 1);
return implode("\n", $metrics);
}
// 尝试连接MongoDB
$mongoClient = new \MongoDB\Client('mongodb://localhost:27017');
// MongoDB连接状态
$metrics[] = $this->formatGauge('webman_mongodb_up', 'MongoDB connection status', [], 1);
// 获取服务器状态
$serverStatus = $mongoClient->selectDatabase('admin')->command(['serverStatus' => 1]);
$status = $serverStatus->toArray()[0];
// 版本信息
if (isset($status['version'])) {
$metrics[] = $this->formatGauge('webman_mongodb_version_info', 'MongoDB version information', [
'version' => $status['version']
], 1);
}
// 连接数
if (isset($status['connections'])) {
$metrics[] = $this->formatGauge('webman_mongodb_connections_current', 'Current number of connections', [], (int)$status['connections']['current']);
$metrics[] = $this->formatGauge('webman_mongodb_connections_available', 'Available number of connections', [], (int)$status['connections']['available']);
}
// 内存使用
if (isset($status['mem'])) {
if (isset($status['mem']['resident'])) {
$metrics[] = $this->formatGauge('webman_mongodb_memory_resident_bytes', 'Resident memory usage in bytes', [], (int)$status['mem']['resident'] * 1024 * 1024);
}
if (isset($status['mem']['virtual'])) {
$metrics[] = $this->formatGauge('webman_mongodb_memory_virtual_bytes', 'Virtual memory usage in bytes', [], (int)$status['mem']['virtual'] * 1024 * 1024);
}
}
// 操作统计
if (isset($status['opcounters'])) {
if (isset($status['opcounters']['insert'])) {
$metrics[] = $this->formatCounter('webman_mongodb_ops_insert_total', 'Total insert operations', [], (int)$status['opcounters']['insert']);
}
if (isset($status['opcounters']['query'])) {
$metrics[] = $this->formatCounter('webman_mongodb_ops_query_total', 'Total query operations', [], (int)$status['opcounters']['query']);
}
if (isset($status['opcounters']['update'])) {
$metrics[] = $this->formatCounter('webman_mongodb_ops_update_total', 'Total update operations', [], (int)$status['opcounters']['update']);
}
if (isset($status['opcounters']['delete'])) {
$metrics[] = $this->formatCounter('webman_mongodb_ops_delete_total', 'Total delete operations', [], (int)$status['opcounters']['delete']);
}
}
// 集合和数据库统计
$databases = $mongoClient->listDatabases();
foreach ($databases as $dbInfo) {
$dbName = $dbInfo->getName();
if (!in_array($dbName, ['admin', 'local', 'config'])) {
$db = $mongoClient->selectDatabase($dbName);
$collections = $db->listCollections();
$collectionCount = 0;
foreach ($collections as $collection) {
$collectionCount++;
$collectionName = $collection->getName();
$stats = $db->command(['collStats' => $collectionName]);
$collStats = $stats->toArray()[0];
if (isset($collStats['count'])) {
$metrics[] = $this->formatGauge('webman_mongodb_collection_documents', 'Number of documents in collection', [
'database' => $dbName,
'collection' => $collectionName
], (int)$collStats['count']);
}
if (isset($collStats['size'])) {
$metrics[] = $this->formatGauge('webman_mongodb_collection_size_bytes', 'Size of collection in bytes', [
'database' => $dbName,
'collection' => $collectionName
], (int)$collStats['size']);
}
}
$metrics[] = $this->formatGauge('webman_mongodb_database_collections', 'Number of collections in database', [
'database' => $dbName
], $collectionCount);
}
}
} catch (\Exception $e) {
$metrics[] = $this->formatGauge('webman_mongodb_up', 'MongoDB connection status', [], 0);
$metrics[] = $this->formatGauge('webman_mongodb_error', 'MongoDB error', [
'error' => 'connection_failed'
], 1);
}
return implode("\n", $metrics);
}
/** /**
* 获取HTTP请求指标 * 获取HTTP请求指标
*/ */
+1 -1
View File
@@ -4,7 +4,7 @@ namespace app\middleware;
use app\controller\MetricsController; use app\controller\MetricsController;
use support\Request; use support\Request;
use support\Response; use Webman\Http\Response;
/** /**
* 指标收集中间件 * 指标收集中间件
+1 -1
View File
@@ -117,7 +117,7 @@ class Crud extends Base
$vo = $this->model->whereIn('id',$request->get('ids'))->find(); $vo = $this->model->whereIn('id',$request->get('ids'))->find();
} }
return view('',[ return view(null,[
'row' => $vo 'row' => $vo
]); ]);
} }
+3 -3
View File
@@ -242,10 +242,10 @@
<script type="text/javascript" src="__JS__/../libs/jquery.min.js"></script> <script type="text/javascript" src="__JS__/../libs/jquery.min.js"></script>
<!-- <script type="text/javascript" src="__JS__/../libs/bootstrap.min.js"></script> --> <!-- <script type="text/javascript" src="__JS__/../libs/bootstrap.min.js"></script> -->
<script type="text/javascript" src="__JS__/../libs/perfect-scrollbar.min.js"></script> <script type="text/javascript" src="__JS__/../libs/perfect-scrollbar.min.js"></script>
{if Request()->header('host') === env_get('server.domain','')} {if Config('site.admin_debug') == '1'}
<script type="text/javascript" src="__JS__/../libs/require.js" data-main="__JS__/default.js?v=2"></script> <script type="text/javascript" src="__JS__/../libs/require.js" data-main="__JS__/default.js?v={:mt_rand()}"></script>
{else /} {else /}
<script type="text/javascript" src="__JS__/../libs/require.js" data-main="__JS__/default.js?v={:Config('site.admin_static_version')}"></script> <script type="text/javascript" src="__JS__/../libs/require.js" data-main="__JS__/default.js?v={:Config('site.version')}"></script>
{/if} {/if}
</body> </body>
+3 -3
View File
@@ -14,7 +14,7 @@
var _c = {$config| json_encode=JSON_UNESCAPED_UNICODE|raw}; var _c = {$config| json_encode=JSON_UNESCAPED_UNICODE|raw};
window.Config = _c; window.Config = _c;
_c['cdnurl']=""; _c['cdnurl']="";
_c['version'] = Math.random(); //_c['version'] = Math.random();
var require = { var require = {
config:_c config:_c
}; };
@@ -24,8 +24,8 @@
<div class="container-fluid p-t-15"> <div class="container-fluid p-t-15">
{__CONTENT__} {__CONTENT__}
</div> </div>
{if Request()->header('host') === env_get('server.domain','')} {if Config('site.admin_debug') == '1'}
<script type="text/javascript" src="__JS__/../libs/require.js" data-main="__JS__/default"></script> <script type="text/javascript" src="__JS__/../libs/require.js" data-main="__JS__/default.js?v={:mt_rand()}"></script>
{else /} {else /}
<script type="text/javascript" src="__JS__/../libs/require.js" data-main="__JS__/default.js?v={:Config('site.version')}"></script> <script type="text/javascript" src="__JS__/../libs/require.js" data-main="__JS__/default.js?v={:Config('site.version')}"></script>
{/if} {/if}
+43 -44
View File
@@ -1,54 +1,53 @@
requirejs.config({ requirejs.config({
//urlArgs: "v=" + (new Date()).getTime(), urlArgs: "v=" + (require.s.contexts._.config.config.admin_debug=='1' ? (new Date()).getTime() : window.Config.version),
urlArgs: "v=" + (location.host != window.Config.domain ? (new Date()).getTime() : window.Config.version),
baseUrl: window.Config.cdnurl+window.Config.admin_path+'/js/', baseUrl: window.Config.cdnurl+window.Config.admin_path+'/js/',
packages: [{ packages: [{
name: 'moment', name: 'moment',
location: window.Config.admin_path+'/libs/moment', location: 'https://shunliao.oss-accelerate.aliyuncs.com/app/admin/libs/moment',
main: 'moment' main: 'moment'
}], }],
paths: { paths: {
'fast': '../libs/fast', 'fast': 'https://shunliao.oss-accelerate.aliyuncs.com/app/admin/libs/fast',
'upload': '../libs/require-upload', 'upload': 'https://shunliao.oss-accelerate.aliyuncs.com/app/admin/libs/require-upload',
'form': '../libs/require-form', 'form': 'https://shunliao.oss-accelerate.aliyuncs.com/app/admin/libs/require-form',
'dropzone': '../libs/dropzone/dropzone.min', 'dropzone': 'https://shunliao.oss-accelerate.aliyuncs.com/app/admin/libs/dropzone/dropzone.min',
'table': '../libs/require-table', 'table': 'https://shunliao.oss-accelerate.aliyuncs.com/app/admin/libs/require-table',
'jquery': '../libs/jquery.min', 'jquery': 'https://shunliao.oss-accelerate.aliyuncs.com/app/admin/libs/jquery.min',
'bootstrap': '../libs/bootstrap.min', 'bootstrap': 'https://shunliao.oss-accelerate.aliyuncs.com/app/admin/libs/bootstrap.min',
'bootstrap-table': '../libs/bootstrap-table/bootstrap-table', 'bootstrap-table': 'https://shunliao.oss-accelerate.aliyuncs.com/app/admin/libs/bootstrap-table/bootstrap-table',
'bootstrap-table-export': '../libs/bootstrap-table/extensions/export/bootstrap-table-export.min', 'bootstrap-table-export': 'https://shunliao.oss-accelerate.aliyuncs.com/app/admin/libs/bootstrap-table/extensions/export/bootstrap-table-export.min',
'bootstrap-table-fixed-columns': '../libs/bootstrap-table/extensions/fixed-columns/bootstrap-table-fixed-columns.min', 'bootstrap-table-fixed-columns': 'https://shunliao.oss-accelerate.aliyuncs.com/app/admin/libs/bootstrap-table/extensions/fixed-columns/bootstrap-table-fixed-columns.min',
'bootstrap-table-mobile': '../libs/bootstrap-table/extensions/mobile/bootstrap-table-mobile', 'bootstrap-table-mobile': 'https://shunliao.oss-accelerate.aliyuncs.com/app/admin/libs/bootstrap-table/extensions/mobile/bootstrap-table-mobile',
'bootstrap-table-lang': '../libs/bootstrap-table/locale/bootstrap-table-zh-CN', 'bootstrap-table-lang': 'https://shunliao.oss-accelerate.aliyuncs.com/app/admin/libs/bootstrap-table/locale/bootstrap-table-zh-CN',
'bootstrap-table-jumpto': '../libs/bootstrap-table/extensions/page-jump-to/bootstrap-table-page-jump-to.min', 'bootstrap-table-jumpto': 'https://shunliao.oss-accelerate.aliyuncs.com/app/admin/libs/bootstrap-table/extensions/page-jump-to/bootstrap-table-page-jump-to.min',
'bootstrap-datepicker': '../libs/bootstrap-datepicker/bootstrap-datepicker', 'bootstrap-datepicker': 'https://shunliao.oss-accelerate.aliyuncs.com/app/admin/libs/bootstrap-datepicker/bootstrap-datepicker',
'bootstrap-datetimepicker': '../libs/bootstrap-datetimepicker/bootstrap-datetimepicker', 'bootstrap-datetimepicker': 'https://shunliao.oss-accelerate.aliyuncs.com/app/admin/libs/bootstrap-datetimepicker/bootstrap-datetimepicker',
'bootstrap-colorpicker': '../libs/bootstrap-colorpicker/bootstrap-colorpicker.min', 'bootstrap-colorpicker': 'https://shunliao.oss-accelerate.aliyuncs.com/app/admin/libs/bootstrap-colorpicker/bootstrap-colorpicker.min',
'bootstrap-table-template': '../libs/bootstrap-table-template', 'bootstrap-table-template': 'https://shunliao.oss-accelerate.aliyuncs.com/app/admin/libs/bootstrap-table-template',
'tableexport': '../libs/tableExport.jquery.plugin/tableExport.min', 'tableexport': 'https://shunliao.oss-accelerate.aliyuncs.com/app/admin/libs/tableExport.jquery.plugin/tableExport.min',
'validator': '../libs/nice-validator-1.1.5/jquery.validator', 'validator': 'https://shunliao.oss-accelerate.aliyuncs.com/app/admin/libs/nice-validator-1.1.5/jquery.validator',
'dragsort': '../libs/jquery.dragsort', 'dragsort': 'https://shunliao.oss-accelerate.aliyuncs.com/app/admin/libs/jquery.dragsort',
//'layer': '../libs/layer/dist/layer', //'layer': 'https://shunliao.oss-accelerate.aliyuncs.com/app/admin/libs/layer/dist/layer',
'layer': '../libs/layer.2.11.0/layer', 'layer': 'https://shunliao.oss-accelerate.aliyuncs.com/app/admin/libs/layer.2.11.0/layer',
'moment': '../libs/moment/dist/moment', 'moment': 'https://shunliao.oss-accelerate.aliyuncs.com/app/admin/libs/moment/dist/moment',
'template': '../libs/art-template/dist/template-native', 'template': 'https://shunliao.oss-accelerate.aliyuncs.com/app/admin/libs/art-template/dist/template-native',
'bootstrap-table-treegrid': '../libs/bootstrap-table/extensions/treegrid/bootstrap-table-treegrid.min', 'bootstrap-table-treegrid': 'https://shunliao.oss-accelerate.aliyuncs.com/app/admin/libs/bootstrap-table/extensions/treegrid/bootstrap-table-treegrid.min',
'treegrid': '../libs/jquery-treegrid/jquery.treegrid.min', 'treegrid': 'https://shunliao.oss-accelerate.aliyuncs.com/app/admin/libs/jquery-treegrid/jquery.treegrid.min',
'tagsinput': '../libs/jquery-tags-input/jquery.tagsinput.min', 'tagsinput': 'https://shunliao.oss-accelerate.aliyuncs.com/app/admin/libs/jquery-tags-input/jquery.tagsinput.min',
'froala_lang':'../libs/froala/js/languages', 'froala_lang':'https://shunliao.oss-accelerate.aliyuncs.com/app/admin/libs/froala/js/languages',
'froala-editor':'../libs/froala/js/froala_editor.pkgd.min', 'froala-editor':'https://shunliao.oss-accelerate.aliyuncs.com/app/admin/libs/froala/js/froala_editor.pkgd.min',
'cxselect': '../libs/cxselect/js/jquery.cxselect.min', 'cxselect': 'https://shunliao.oss-accelerate.aliyuncs.com/app/admin/libs/cxselect/js/jquery.cxselect.min',
'selectpage': '../libs/selectpage/selectpage', 'selectpage': 'https://shunliao.oss-accelerate.aliyuncs.com/app/admin/libs/selectpage/selectpage',
'bootstrap-select': '../libs/bootstrap-select/dist/js/bootstrap-select.min', 'bootstrap-select': 'https://shunliao.oss-accelerate.aliyuncs.com/app/admin/libs/bootstrap-select/dist/js/bootstrap-select.min',
'bootstrap-select-lang': '../libs/bootstrap-select/dist/js/i18n/defaults-zh_CN', 'bootstrap-select-lang': 'https://shunliao.oss-accelerate.aliyuncs.com/app/admin/libs/bootstrap-select/dist/js/i18n/defaults-zh_CN',
'yntree': '../libs/yntree/yntree', 'yntree': 'https://shunliao.oss-accelerate.aliyuncs.com/app/admin/libs/yntree/yntree',
'multitabs':'../libs/bootstrap-multitabs/multitabs', 'multitabs':'https://shunliao.oss-accelerate.aliyuncs.com/app/admin/libs/bootstrap-multitabs/multitabs',
'qrcode':'../libs/jquery.qrcode.min' 'qrcode':'https://shunliao.oss-accelerate.aliyuncs.com/app/admin/libs/jquery.qrcode.min'
}, },
map: { map: {
'*': { '*': {
'css': window.Config.admin_path+'/libs/require-css.min.js' // or whatever the path to require-css is 'css': 'https://shunliao.oss-accelerate.aliyuncs.com/app/admin/libs/require-css.min.js' // or whatever the path to require-css is
} }
}, },
shim: { shim: {
@@ -58,12 +57,12 @@ requirejs.config({
'tagsinput': { 'tagsinput': {
deps: [ deps: [
'jquery', 'jquery',
'css!'+window.Config.admin_path+'/libs/jquery-tags-input/jquery.tagsinput.min.css' 'css!'+'https://shunliao.oss-accelerate.aliyuncs.com/app/admin/libs/jquery-tags-input/jquery.tagsinput.min.css'
] ]
}, },
'yntree': { 'yntree': {
deps: [ deps: [
'css!../libs/yntree/yntree.css' 'css!https://shunliao.oss-accelerate.aliyuncs.com/app/admin/libs/yntree/yntree.css'
] ]
}, },
'bootstrap-select': { 'bootstrap-select': {
@@ -125,13 +124,13 @@ requirejs.config({
'froala-editor':{ 'froala-editor':{
deps: [ deps: [
'jquery', 'jquery',
'css!../libs/froala/css/froala_editor.pkgd.min.css' 'css!https://shunliao.oss-accelerate.aliyuncs.com/app/admin/libs/froala/css/froala_editor.pkgd.min.css'
] ]
}, },
'bootstrap-datetimepicker':{ 'bootstrap-datetimepicker':{
deps: [ deps: [
'jquery', 'jquery',
'css!'+window.Config.admin_path+'/libs/bootstrap-datetimepicker/style.css' 'css!'+'https://shunliao.oss-accelerate.aliyuncs.com/app/admin/libs/bootstrap-datetimepicker/style.css'
] ]
} }
}, },