This commit is contained in:
众产-王坤 2025-07-29 14:28:01 +08:00
parent c1f94c8461
commit da592b5c8d
114 changed files with 3136 additions and 653 deletions

7
.gitignore vendored
View File

@ -8,6 +8,12 @@
*.pem
*.log
*.glb
*.zip
*.rar
*.pdf
*.docx
*.xls
*.doc
*.gltf
*.mp3
*.mp4
@ -20,5 +26,6 @@ web/ud/2026/*
web/ud/2027/*
web/ud/2028/*
**/unpackage/
**/tmp/
web.ini

185
fork/fork_apinotify.php Normal file
View File

@ -0,0 +1,185 @@
<?php
/*
php /data/ciyon/fork/fork_apinotify.php
/etc/systemd/system/ciyapinotify.service
[Unit]
Description=ciy apinotify
After=network.target
[Service]
WorkingDirectory=/data/ciyon/fork/
ExecStart=/usr/bin/php /data/ciyon/fork/fork_apinotify.php
Restart=always
RestartSec=5s
[Install]
WantedBy=multi-user.target
systemctl enable ciyapinotify.service
systemctl start ciyapinotify.service
*/
$path = __DIR__;
$path = str_replace('\\', '/', $path);
$path = dirname($path);
chdir($path);
require $path . '/zciyphp/comm.php';
require $path . '/web/admin/common.php';
set_time_limit(0);
$shouldStop = false;
$currentProcesses = 0;
pcntl_signal(SIGTERM, function ($signo) use (&$shouldStop, &$currentProcesses) {
outlog('优雅关闭中:' . $currentProcesses);
$shouldStop = true;
});
pcntl_signal(SIGCHLD, function ($signo) use (&$currentProcesses) {
echo "pcntl_signal: $signo\n";
while (pcntl_waitpid(-1, $status, WNOHANG) > 0) {
//echo "pcntl_wexitstatus: $status\n";
//$exitCode = pcntl_wexitstatus($status);
//echo "子进程退出,状态码: $exitCode\n";
$currentProcesses--;
if ($currentProcesses < 0)
$currentProcesses = 0;
}
});
function outlog($msg) {
savelogfile('fork_apinotify', $msg);
}
function mainProcess() {
global $shouldStop, $currentProcesses, $logpath;
$db = new \ciy\db();
$maxProcesses = 30; //1GB=15-20个进程
$batchSize = 20; // 每次批量获取的记录数
$spawnInterval = 100; // 子进程启动间隔(毫秒)
// 安装SIGCHLD信号处理器避免僵尸进程
outlog('主进程启动PID: ' . getmypid());
$isbusy = false;
while (true) {
pcntl_signal_dispatch();
if ($shouldStop) {
$time = time();
while ($currentProcesses > 0 && $time > time() - 60) {
pcntl_signal_dispatch();
sleep(1);
}
outlog('已关闭:' . $currentProcesses);
exit(0);
}
if ($currentProcesses >= $maxProcesses) {
//echo "达到最大子进程数限制 ($maxProcesses),等待子进程退出...\n";
sleep(1);
continue;
}
file_put_contents($logpath . 'fork_apinotify.tak', 'curr=' . $currentProcesses . ',max=' . $maxProcesses . ',batch=' . $batchSize . ',spawn=' . $spawnInterval . ',time=' . time());
$csql = new \ciy\sql('ap_transfer');
//默认nexttimes=9999999999999有90/100通知后nexttimes=0等待推送。
//推成功nexttimes=9999999999998
//没成功首次retimes=nownexttimes=now+retimesspan+10s直至24小时后=9999999999997
//retimes>0判断是否有二次推送判断商户api质量
//nexttimes=9999999999997判断是否始终推送失败判断商户api接入能力
//nexttimes=9999999999996fork执行脚本非法跳出bug或强制关闭导致
$csql->where('nexttimes<', time());
$csql->limit(1, $batchSize);
$orderrows = $db->get($csql);
if ($orderrows === false || count($orderrows) == 0) {
//echo "没有待处理任务等待3秒...\n";
sleep(3);
continue;
}
//outlog('发现待处理任务: ' . count($notifyrows) . '个');
foreach ($orderrows as $orderrow) {
if (empty($orderrow['notifyurl']))
continue;
if ($currentProcesses >= $maxProcesses) {
if (!$isbusy)
outlog('任务拥堵:' . $currentProcesses . '/' . $maxProcesses);
$isbusy = true;
sleep(3);
break;
}
if ($currentProcesses < $maxProcesses / 2) {
if ($isbusy)
outlog('拥堵暂缓:' . $currentProcesses . '/' . $maxProcesses);
$isbusy = false;
}
$pid = pcntl_fork();
if ($pid == -1) {
outlog('创建子进程失败:' . pcntl_strerror(posix_get_last_error()));
} elseif ($pid) {
//echo "创建子进程成功PID: $pid, 处理任务 ID: $id\n";
$currentProcesses++;
usleep($spawnInterval * 1000);
} else {
//echo "子进程开始执行任务PID: " . getmypid() . ", 任务 ID: $id\n";
fork_apinotify($orderrow);
exit;
}
}
usleep(500 * 1000);
}
}
if (!extension_loaded('pcntl')) {
die("PCNTL扩展未加载无法使用多进程功能\n");
}
mainProcess();
function fork_apinotify($orderrow, $debug = false) {
$db = new \ciy\db();
$id = $orderrow['id'];
$updata = array();
$updata['nexttimes'] = 9999999999996;
$csql = new \ciy\sql('ap_transfer');
$csql->where('id', $id);
$db->update($csql, $updata);
//orderrow就是数据集再加上时间戳、sign、pairsign
$retapi = $orderrow;
unset($retapi['signature']);
$signstr = '';
ksort($retapi);
foreach ($retapi as $key => $value) {
$signstr .= $key . '=' . $value . '&';
}
$signstr = substr($signstr, 0, -1);
$sign = sha256($signstr);
$retapi['hash'] = $sign;
$http = new \ciy\http();
$http->set_timeout(10);
$http->request($orderrow['notifyurl'], json_encode($retapi));
$result = $http->get_data();
if (strpos($result, 'success') !== false) {
$updata = array();
$updata['nexttimes'] = 9999999999998;
$csql = new \ciy\sql('ap_transfer');
$csql->where('id', $id);
if ($db->update($csql, $updata) === false) {
if ($debug) clog('操作notify失败succ:' . $db->error);
savelogfile('err_db', '操作notify失败succ:' . $db->error);
}
} else {
$updata = array();
$retimes = $orderrow['retimes'];
$time = time();
if ($retimes == 0) {
$updata['retimes'] = $time;
$updata['nexttimes'] = $time + 10;
} else {
$time = $time + ($time - $retimes) + 10;
if ($time - $retimes < 136400)
$updata['nexttimes'] = $time + ($time - $retimes) + 10;
else
$updata['nexttimes'] = 9999999999997;
}
$csql = new \ciy\sql('ap_transfer');
$csql->where('id', $id);
if ($db->update($csql, $updata) === false) {
if ($debug) clog('操作notify失败fail:' . $db->error);
savelogfile('err_db', '操作notify失败fail:' . $db->error);
}
}
exit(1);
}

206
fork/fork_order.php Normal file
View File

@ -0,0 +1,206 @@
<?php
/*
php /data/ciyon/fork/fork_order.php
/etc/systemd/system/ciyorder.service
[Unit]
Description=ciy order
After=network.target
[Service]
WorkingDirectory=/data/ciyon/fork/
ExecStart=/usr/bin/php /data/ciyon/fork/fork_order.php
Restart=always
RestartSec=5s
[Install]
WantedBy=multi-user.target
systemctl enable ciyorder.service
systemctl start ciyorder.service
*/
$path = __DIR__;
$path = str_replace('\\', '/', $path);
$path = dirname($path);
chdir($path);
require $path . '/zciyphp/comm.php';
require $path . '/web/admin/common.php';
set_time_limit(0);
$shouldStop = false;
$currentProcesses = 0;
pcntl_signal(SIGTERM, function ($signo) use (&$shouldStop, &$currentProcesses) {
outlog('优雅关闭中:' . $currentProcesses);
$shouldStop = true;
});
pcntl_signal(SIGCHLD, function ($signo) use (&$currentProcesses) {
echo "pcntl_signal: $signo\n";
while (pcntl_waitpid(-1, $status, WNOHANG) > 0) {
//echo "pcntl_wexitstatus: $status\n";
//$exitCode = pcntl_wexitstatus($status);
//echo "子进程退出,状态码: $exitCode\n";
$currentProcesses--;
if ($currentProcesses < 0)
$currentProcesses = 0;
}
});
function outlog($msg) {
savelogfile('fork_order', $msg);
}
function mainProcess() {
global $shouldStop, $currentProcesses, $logpath;
$db = new \ciy\db();
$maxProcesses = 30; //1GB=15-20个进程
$batchSize = 20; // 每次批量获取的记录数
$spawnInterval = 100; // 子进程启动间隔(毫秒)
// 安装SIGCHLD信号处理器避免僵尸进程
outlog('主进程启动PID: ' . getmypid());
$isbusy = false;
while (true) {
pcntl_signal_dispatch();
if ($shouldStop) {
$time = time();
while ($currentProcesses > 0 && $time > time() - 60) {
pcntl_signal_dispatch();
sleep(1);
}
outlog('已关闭:' . $currentProcesses);
exit(0);
}
if ($currentProcesses >= $maxProcesses) {
//echo "达到最大子进程数限制 ($maxProcesses),等待子进程退出...\n";
sleep(1);
continue;
}
file_put_contents($logpath . 'fork_order.tak', 'curr=' . $currentProcesses . ',max=' . $maxProcesses . ',batch=' . $batchSize . ',spawn=' . $spawnInterval . ',time=' . time());
$csql = new \ciy\sql('ap_transfer');
$csql->where('orderstatus=20');
$csql->limit(1, $batchSize);
$orderrows = $db->get($csql);
if ($orderrows === false || count($orderrows) == 0) {
//echo "没有待处理任务等待3秒...\n";
sleep(3);
continue;
}
//outlog('发现待处理任务: ' . count($orderrows) . '个');
foreach ($orderrows as $orderrow) {
if ($currentProcesses >= $maxProcesses) {
if (!$isbusy)
outlog('任务拥堵:' . $currentProcesses . '/' . $maxProcesses);
$isbusy = true;
sleep(3);
break;
}
if ($currentProcesses < $maxProcesses / 2) {
if ($isbusy)
outlog('拥堵暂缓:' . $currentProcesses . '/' . $maxProcesses);
$isbusy = false;
}
$pid = pcntl_fork();
if ($pid == -1) {
outlog('创建子进程失败:' . pcntl_strerror(posix_get_last_error()));
} elseif ($pid) {
//echo "创建子进程成功PID: $pid, 处理任务 ID: $id\n";
$currentProcesses++;
usleep($spawnInterval * 1000);
} else {
//echo "子进程开始执行任务PID: " . getmypid() . ", 任务 ID: $id\n";
fork_order($orderrow);
exit;
}
}
usleep(500 * 1000);
}
}
if (!extension_loaded('pcntl')) {
die("PCNTL扩展未加载无法使用多进程功能\n");
}
mainProcess();
function fork_order($orderrow, $debug = false) {
$db = new \ciy\db();
$id = $orderrow['id'];
$updata = array();
$updata['orderstatus'] = 30;
$csql = new \ciy\sql('ap_transfer');
$csql->where('id', $id);
if ($db->update($csql, $updata) === false) {
if ($debug) clog('操作status=30:' . $db->error);
savelogfile('err_db', '操作status=30:' . $db->error);
exit(1);
}
//验签一次验签失败则90错误
$fail = null;
if (!empty($orderrow['signature'])) {
$csql = new \ciy\sql('ap_api');
$csql->where('id', $orderrow['apiid']);
$apirow = $db->getone($csql);
if (!is_array($apirow))
$fail = array('errmsg' => 'API未找到', 'status' => 90);
else {
if (empty($apirow['pubkey'])) {
$fail = array('errmsg' => '数字证书无公钥', 'status' => 90);
} else {
$waitsignstr = 'amount=' . $orderrow['amount'] . ',addtimes=' . $orderrow['addtimes'];
$retsign = verifysign_api($apirow['pubkey'], $orderrow['signature'], $waitsignstr);
if (is_string($retsign))
$fail = array('errmsg' => $retsign, 'status' => 90);
}
}
}
//$fail = array('errmsg' => $ret, 'status' => 90); //处理具体业务,失败赋值
if ($fail) {
try {
$db->begin();
$updata = array();
$updata['uptimes'] = tostamp();
$updata['orderstatus'] = $fail['status'];
if ($fail['status'] == 90)
$updata['nexttimes'] = 0;
$csql = new \ciy\sql('ap_transfer');
$csql->where('id', $id);
if ($db->update($csql, $updata) === false)
throw new \Exception('操作order fail失败:' . $db->error);
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
}
exit(4);
}else{
try {
$db->begin();
$updata = array();
$updata['uptimes'] = tostamp();
$updata['orderstatus'] = 100;
$updata['nexttimes'] = 0;
$csql = new \ciy\sql('ap_transfer');
$csql->where('id', $id);
if ($db->update($csql, $updata) === false)
throw new \Exception('操作order succ失败:' . $db->error);
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
}
exit(0);
}
}
function verifysign_api($signKey, $signature, $waitsignstr) {
if (strpos($signKey, '-----BEGIN RSA PUBLIC KEY-----') === false && strpos($signKey, '-----BEGIN PUBLIC KEY-----') === false)
$signKey = "-----BEGIN PUBLIC KEY-----\n" . wordwrap($signKey, 64, "\n") . "\n-----END PUBLIC KEY-----";
$signbin = hex2bin($signature);
if ($signbin === false)
return errjson('签名格式错误');
$hashbin = hex2bin(hash('sha256', $waitsignstr));
$result = openssl_verify($hashbin, $signbin, $signKey, OPENSSL_ALGO_SHA256);
if ($result === 0)
return '数字证书验签失败';
else if ($result !== 1)
return '数字证书验签错误:' . openssl_error_string();
return true;
}

View File

@ -106,7 +106,7 @@ class art_post {
return errjson('请填写排序位');
if (empty($name))
return errjson('请填写文章标题');
if (empty($content))
if ($content == '[MD]')
return errjson('请填写内容');
$datarow = null;
if ($id > 0) {
@ -161,6 +161,7 @@ class art_post {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['data'] = $updata;
@ -214,6 +215,7 @@ class art_post {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['ids'] = $vids;
@ -375,7 +377,7 @@ class art_post {
else {
$csqlchk = new \ciy\sql('ap_art_post');
$csqlchk->where('id', $id)->column('id');
$chkid = (int)$db->get1($csqlchk);
$chkid = toint($db->get1($csqlchk));
if ($chkid != $id)
$errmsg = $name . '在数据库中不存在';
$value = $id;
@ -389,7 +391,7 @@ class art_post {
if (!is_numeric($showdat))
$errmsg = $name . '不是数字';
else
$value = (int)$showdat;
$value = toint($showdat);
}
} else if ($name == '文章状态') {
if (empty($showdat)) {
@ -430,7 +432,7 @@ class art_post {
if (!is_numeric($showdat))
$errmsg = $name . '不是数字';
else
$value = (int)$showdat;
$value = toint($showdat);
}
} else if ($name == '阅读数') {
if (empty($showdat)) {
@ -440,7 +442,7 @@ class art_post {
if (!is_numeric($showdat))
$errmsg = $name . '不是数字';
else
$value = (int)$showdat;
$value = toint($showdat);
}
} else if ($name == '摘要') {
if (empty($showdat)) {
@ -483,7 +485,7 @@ class art_post {
else {
$uniques[] = $unq;
$csql->column('id');
$chkid = (int)$db->get1($csql);
$chkid = toint($db->get1($csql));
if ($chkid > 0 && (($id > 0 && $chkid != $id) || $id == 0))
$firsthtml = '<td style="background:#ffe8c5;" title="#' . $lineidx . ':该行与数据库数据有重复"><div class="lang">重复</div></td>';
}
@ -533,6 +535,7 @@ class art_post {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
return succjson();

View File

@ -93,6 +93,7 @@ class art_section {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['data'] = $updata;
@ -125,6 +126,7 @@ class art_section {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['ids'] = $vids;

View File

@ -111,6 +111,7 @@ class art_vent {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['ids'] = $vids;

View File

@ -87,6 +87,7 @@ class banner {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['data'] = $updata;
@ -119,6 +120,7 @@ class banner {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['ids'] = $vids;

View File

@ -121,6 +121,7 @@ class cash_ie {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['ids'] = $vids;

View File

@ -123,6 +123,7 @@ class cash_in {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['ids'] = $vids;

View File

@ -111,6 +111,7 @@ class cash_out_1 {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['data'] = $updata;
@ -146,6 +147,7 @@ class cash_out_1 {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['ids'] = $vids;

View File

@ -97,6 +97,7 @@ class cash_out_2 {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['data'] = $updata;

View File

@ -240,6 +240,7 @@ class demo {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['data'] = $updata;
@ -273,6 +274,7 @@ class demo {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['ids'] = $vids;
@ -317,6 +319,7 @@ class demo {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['data'] = $updata;
@ -595,7 +598,7 @@ class demo {
else {
$csqlchk = new \ciy\sql('ap_demo');
$csqlchk->where('id', $id)->column('id');
$chkid = (int)$db->get1($csqlchk);
$chkid = toint($db->get1($csqlchk));
if ($chkid != $id)
$errmsg = $name . '在数据库中不存在';
$value = $id;
@ -622,7 +625,7 @@ class demo {
if (!is_numeric($showdat))
$errmsg = $name . '不是数字';
else
$value = (int)((float)$showdat * 1024);
$value = toint((float)$showdat * 1024);
$showdat .= 'KB';
}
} else if ($name == '长度') {
@ -633,7 +636,7 @@ class demo {
if (!is_numeric($showdat))
$errmsg = $name . '不是数字';
else
$value = (int)((float)$showdat * 1000);
$value = toint((float)$showdat * 1000);
$showdat .= '米';
}
} else if ($name == '贷款金额') {
@ -644,7 +647,7 @@ class demo {
if (!is_numeric($showdat))
$errmsg = $name . '不是数字';
else
$value = (int)((float)$showdat * 1000000);
$value = toint((float)$showdat * 1000000);
$showdat .= '万元';
}
} else if ($name == '设置日期') {
@ -805,7 +808,7 @@ class demo {
$value = 0;
} else {
$last = substr($showdat, -3);
$dd = (int)substr($showdat, 0, -3);
$dd = toint(substr($showdat, 0, -3));
if ($dd == 0) {
$errmsg = $name . '周期数字错误';
} else if ($last == '天') {
@ -826,7 +829,7 @@ class demo {
if (!is_numeric($showdat))
$errmsg = $name . '不是数字';
else
$value = (int)$showdat;
$value = toint($showdat);
$showdat .= '秒';
}
} else if ($name == '活动期数') {
@ -837,7 +840,7 @@ class demo {
if (!is_numeric($showdat))
$errmsg = $name . '不是数字';
else
$value = (int)$showdat;
$value = toint($showdat);
}
} else if ($name == '吨位') {
if (empty($showdat)) {
@ -847,7 +850,7 @@ class demo {
if (!is_numeric($showdat))
$errmsg = $name . '不是数字';
else
$value = (int)((float)$showdat * 1000000);
$value = toint((float)$showdat * 1000000);
$showdat .= '吨';
}
} else if ($name == '单价') {
@ -858,7 +861,7 @@ class demo {
if (!is_numeric($showdat))
$errmsg = $name . '不是数字';
else
$value = (int)((float)$showdat * 100);
$value = toint((float)$showdat * 100);
}
} else if ($name == '位置') {
if (empty($showdat)) {
@ -888,7 +891,7 @@ class demo {
if (!is_numeric($showdat))
$errmsg = $name . '不是数字';
else
$value = (int)((float)$showdat * 100);
$value = toint((float)$showdat * 100);
$showdat .= '%';
}
} else if ($name == '链接') {
@ -904,7 +907,7 @@ class demo {
if (!is_numeric($showdat))
$errmsg = $name . '不是数字';
else
$value = (int)((float)$showdat * 1000);
$value = toint((float)$showdat * 1000);
$showdat .= 'KG';
}
} else if ($name == '耳温') {
@ -915,7 +918,7 @@ class demo {
if (!is_numeric($showdat))
$errmsg = $name . '不是数字';
else
$value = (int)((float)$showdat * 1000);
$value = toint((float)$showdat * 1000);
$showdat .= '℃';
}
} else if ($name == '中式钱') {
@ -926,7 +929,7 @@ class demo {
if (!is_numeric($showdat))
$errmsg = $name . '不是数字';
else
$value = (int)((float)$showdat * 100);
$value = toint((float)$showdat * 100);
$showdat .= '元';
}
} else if ($name == '美式钱') {
@ -937,7 +940,7 @@ class demo {
if (!is_numeric($showdat))
$errmsg = $name . '不是数字';
else
$value = (int)((float)$showdat * 100);
$value = toint((float)$showdat * 100);
$showdat .= '¤';
}
} else if ($name == '重量') {
@ -948,7 +951,7 @@ class demo {
if (!is_numeric($showdat))
$errmsg = $name . '不是数字';
else
$value = (int)((float)$showdat * 1000);
$value = toint((float)$showdat * 1000);
$showdat .= 'KG';
}
} else if ($name == '长度') {
@ -959,7 +962,7 @@ class demo {
if (!is_numeric($showdat))
$errmsg = $name . '不是数字';
else
$value = (int)((float)$showdat * 1000);
$value = toint((float)$showdat * 1000);
$showdat .= '米';
}
} else if ($name == '科学数') {
@ -970,7 +973,7 @@ class demo {
if (!is_numeric($showdat))
$errmsg = $name . '不是数字';
else
$value = (int)((float)$showdat * 1000);
$value = toint((float)$showdat * 1000);
$showdat .= 'SKT';
}
} else if ($name == '身份证号') {
@ -1000,7 +1003,7 @@ class demo {
else {
$uniques[] = $unq;
$csql->column('id');
$chkid = (int)$db->get1($csql);
$chkid = toint($db->get1($csql));
if ($chkid > 0 && (($id > 0 && $chkid != $id) || $id == 0))
$firsthtml = '<td style="background:#ffe8c5;" title="#' . $lineidx . ':该行与数据库数据有重复"><div class="lang">重复</div></td>';
}
@ -1076,6 +1079,7 @@ class demo {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
return succjson();

View File

@ -96,8 +96,8 @@ func Paper_update(w http.ResponseWriter, r *http.Request) bool {
if name == "" {
return c.ErrJSON(w, "请填写文档标题")
}
content := post.Get("content", c.CIYPOST_ALLOW_HTML)
if content == "" {
content := post.Get("content")
if content == "[MD]" {
return c.ErrJSON(w, "请填写内容")
}
var err error

View File

@ -85,8 +85,8 @@ class paper {
$title = $post->get('title');
if (empty($name))
return errjson('请填写文档标题');
$content = $post->get('content', '', 'html');
if (empty($content))
$content = $post->get('content');
if ($content == '[MD]')
return errjson('请填写内容');
$datarow = null;
if ($id > 0) {
@ -102,9 +102,9 @@ class paper {
$csql = new \ciy\sql('ap_paper');
$csql->where('name', $name);
$csql->column('id');
$chkid = (int)$db->get1($csql);
$chkid = toint($db->get1($csql));
if ($chkid > 0 && (($id > 0 && $chkid != $id) || $id == 0))
throw new \Exception('数据已存在');
throw new \Exception('CIYIGN数据已存在');
$updata = array();
$updata['name'] = $name;
@ -127,6 +127,7 @@ class paper {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['data'] = $updata;
@ -174,6 +175,7 @@ class paper {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['ids'] = $vids;

View File

@ -88,6 +88,7 @@ class pnt_bundle {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['data'] = $updata;
@ -120,6 +121,7 @@ class pnt_bundle {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['ids'] = $vids;
@ -242,7 +244,7 @@ class pnt_bundle {
else {
$csqlchk = new \ciy\sql('ap_pnt_bundle');
$csqlchk->where('id', $id)->column('id');
$chkid = (int)$db->get1($csqlchk);
$chkid = toint($db->get1($csqlchk));
if ($chkid != $id)
$errmsg = $name . '在数据库中不存在';
$value = $id;
@ -256,7 +258,7 @@ class pnt_bundle {
if (!is_numeric($showdat))
$errmsg = $name . '不是数字';
else
$value = (int)$showdat;
$value = toint($showdat);
}
} else if ($name == '金额') {
if (empty($showdat)) {
@ -266,7 +268,7 @@ class pnt_bundle {
if (!is_numeric($showdat))
$errmsg = $name . '不是数字';
else
$value = (int)((float)$showdat * 100);
$value = toint((float)$showdat * 100);
}
}
if (!empty($showdat))
@ -285,7 +287,7 @@ class pnt_bundle {
else {
$uniques[] = $unq;
$csql->column('id');
$chkid = (int)$db->get1($csql);
$chkid = toint($db->get1($csql));
if ($chkid > 0 && (($id > 0 && $chkid != $id) || $id == 0))
$firsthtml = '<td style="background:#ffe8c5;" title="#' . $lineidx . ':该行与数据库数据有重复"><div class="lang">重复</div></td>';
}
@ -326,6 +328,7 @@ class pnt_bundle {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
return succjson();

View File

@ -123,6 +123,7 @@ class pnt_buy {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['ids'] = $vids;

View File

@ -94,6 +94,7 @@ class pnt_record {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['ids'] = $vids;

View File

@ -91,6 +91,7 @@ class pnt_track {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['data'] = $updata;
@ -123,6 +124,7 @@ class pnt_track {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['ids'] = $vids;

View File

@ -101,7 +101,7 @@ class user {
public static function json_update() {
global $db;
global $tokensalt;
global $_token;
$rsuser = verifyfast();
//if (nopower($db, $rsuser['id'], 'p u'))
// return errjson('您未被授权操作');
@ -128,7 +128,7 @@ class user {
$updata['mobile'] = $mobile;
$updata['stpstatus'] = $stpstatus;
if(!empty($repass))
$updata['password'] = md5($repass . $tokensalt);
$updata['password'] = md5($repass . $_token['salt']);
$updata['addtimes'] = tostamp();
$updata['memo'] = $memo;
$csql = new \ciy\sql('ap_user');
@ -140,6 +140,7 @@ class user {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
if ($post->get('_pf') == 'PC')
@ -189,6 +190,7 @@ class user {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
return succjson();

View File

@ -136,6 +136,7 @@ class user_service {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
if ($post->get('_pf') == 'PC')
@ -185,6 +186,7 @@ class user_service {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
return succjson();

View File

@ -100,6 +100,7 @@ class usr_buy_bundle {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['data'] = $updata;
@ -132,6 +133,7 @@ class usr_buy_bundle {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['ids'] = $vids;
@ -262,7 +264,7 @@ class usr_buy_bundle {
else {
$csqlchk = new \ciy\sql('ap_usr_buy_bundle');
$csqlchk->where('id', $id)->column('id');
$chkid = (int)$db->get1($csqlchk);
$chkid = toint($db->get1($csqlchk));
if ($chkid != $id)
$errmsg = $name . '在数据库中不存在';
$value = $id;
@ -289,7 +291,7 @@ class usr_buy_bundle {
if (!is_numeric($showdat))
$errmsg = $name . '不是数字';
else
$value = (int)$showdat;
$value = toint($showdat);
}
} else if ($name == '金额') {
if (empty($showdat)) {
@ -299,7 +301,7 @@ class usr_buy_bundle {
if (!is_numeric($showdat))
$errmsg = $name . '不是数字';
else
$value = (int)((float)$showdat * 100);
$value = toint((float)$showdat * 100);
}
}
if (!empty($showdat))
@ -318,7 +320,7 @@ class usr_buy_bundle {
else {
$uniques[] = $unq;
$csql->column('id');
$chkid = (int)$db->get1($csql);
$chkid = toint($db->get1($csql));
if ($chkid > 0 && (($id > 0 && $chkid != $id) || $id == 0))
$firsthtml = '<td style="background:#ffe8c5;" title="#' . $lineidx . ':该行与数据库数据有重复"><div class="lang">重复</div></td>';
}
@ -361,6 +363,7 @@ class usr_buy_bundle {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
return succjson();

View File

@ -144,6 +144,7 @@ class usr_buy_user {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['ids'] = $vids;

View File

@ -116,6 +116,7 @@ class usr_capcode {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['ids'] = $vids;

View File

@ -104,6 +104,7 @@ class usr_invoicetitle {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['data'] = $updata;
@ -137,6 +138,7 @@ class usr_invoicetitle {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['ids'] = $vids;

View File

@ -117,6 +117,7 @@ class usr_invoicing {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['data'] = $updata;
@ -151,6 +152,7 @@ class usr_invoicing {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['ids'] = $vids;

View File

@ -164,6 +164,7 @@ class usr_problem {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['ids'] = $vids;

View File

@ -111,6 +111,7 @@ class usr_real_apply {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['ids'] = $vids;
@ -155,6 +156,7 @@ class usr_real_apply {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['data'] = $updata;

View File

@ -98,6 +98,7 @@ class usr_shipaddr {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['data'] = $updata;
@ -131,6 +132,7 @@ class usr_shipaddr {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['ids'] = $vids;

View File

@ -98,6 +98,7 @@ class usr_suggest {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['data'] = $updata;
@ -131,6 +132,7 @@ class usr_suggest {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['ids'] = $vids;

View File

@ -2,41 +2,45 @@
function base_dayclean($systemrow) {
global $db;
$msg = '';
$msg .= _base_deldb($db, (new \ciy\sql('zc_autotsk_run'))->where('addtimes<', time() - 86400 * 90));
$msg .= _base_deldb($db, (new \ciy\sql('zc_autotsk_log'))->where('addtimes<', time() - 86400 * 90));
$msg .= _base_deldb($db, (new \ciy\sql('zc_funcslow'))->where('addtimes<', time() - 86400 * 60));
$msg .= _base_deldb($db, (new \ciy\sql('zc_stats'))->where('addtimes<', time() - 86400 * 60));
$msg .= _base_deldb($db, (new \ciy\sql('zc_log'))->where('addtimes<', time() - 86400 * 100));
$msg .= _base_deldb($db, (new \ciy\sql('zc_online'))->where('exptimes<', time() - 86400 * 7));
$execute = $db->execute('delete from zc_autotsk_run where addtimes<' . (time() - 86400 * 30));
$cnt = 0;$msg .= _base_delfile(PATH_WEB . 'ud/tmp', 86400 * 3, $cnt);
$cnt = 0;$msg .= _base_delfile(PATH_WEB . 'ud/rep', 86400 * 1, $cnt);
return $msg;
}
function _base_deldb($db, $csql) {
$execute = $db->delete($csql);
if ($execute === false)
$msg .= 'clean zc_autotsk_run: ' . $db->error . '<br/>';
return 'clean ' . $csql->table . ': ' . $db->error . '<br/>';
else if ($execute > 0)
$msg .= 'clean zc_autotsk_run: ' . $execute . '<br/>';
$execute = $db->execute('delete from zc_autotsk_run where msg=\'\' and addtimes<' . (time() - 86400 * 3));
if ($execute === false)
$msg .= 'clean zc_autotsk_run B: ' . $db->error . '<br/>';
$execute = $db->execute('delete from ap_usr_capcode where exptimes<' . time());
if ($execute === false)
$msg .= 'clean ap_usr_capcode: ' . $db->error . '<br/>';
else if ($execute > 0)
$msg .= 'clean ap_usr_capcode: ' . $execute . '<br/>';
$cnt = 0;
$errcnt = 0;
$files = scandir(PATH_WEB . 'ud/tmp/');
foreach ($files as $file) {
if ($file[0] == '.')
continue;
$mtime = filemtime(PATH_WEB . 'ud/tmp/' . $file);
if ($mtime === false)
continue;
if (tostamp() - $mtime > 86400 * 3) {
$ret = _base_delall(PATH_WEB . 'ud/tmp/' . $file);
$cnt++;
if ($ret !== true) {
$errcnt++;
savelog($db, 0, 'CRON', '清理tmp文件失败【' . PATH_WEB . 'ud/tmp/' . $file . '】' . $ret);
return 'clean ' . $csql->table . ': ' . $execute . '<br/>';
return '';
}
function _base_delfile($pathfile, $timespan, &$cnt, $deep = 0) {
if (!is_dir($pathfile)) {
$mtime = filemtime($pathfile);
if ($mtime !== false) {
if (tostamp() - $mtime > $timespan) {
$cnt++;
filedel($pathfile);
}
}
return;
}
if ($cnt > 0 || $errcnt > 0)
$msg .= 'clean file: ' . $cnt . ($errcnt > 0 ? ', err: ' . $errcnt : '') . '<br/>';
return $msg;
$files = scandir($pathfile);
foreach ($files as $file) {
if ($file == '.' || $file == '..')
continue;
_base_delfile($pathfile . '/' . $file, $timespan, $cnt, 1);
}
if ($deep == 0 && $cnt > 0)
return 'clean file: ' . $cnt . ' ' . substr($pathfile, strlen(PATH_WEB)) . '<br/>';
return '';
}
function base_srvstats($systemrow) {
global $db;
@ -49,15 +53,15 @@ function base_srvstats($systemrow) {
$memrows = $db->get($csql);
foreach ($memrows as $memrow) {
if ($memrow['types'] == 'func_succ')
$func_succ = (int)$memrow['params'];
$func_succ = toint($memrow['params']);
else if ($memrow['types'] == 'func_fail')
$func_fail = (int)$memrow['params'];
$func_fail = toint($memrow['params']);
else if ($memrow['types'] == 'func_commit')
$func_commit = (int)$memrow['params'];
$func_commit = toint($memrow['params']);
else if ($memrow['types'] == 'func_rollback')
$func_rollback = (int)$memrow['params'];
$func_rollback = toint($memrow['params']);
else if ($memrow['types'] == 'func_runms') {
$func_runms = (int)$memrow['params'];
$func_runms = toint($memrow['params']);
} else
continue;
$updata = array();
@ -146,7 +150,7 @@ function base_srvstats($systemrow) {
$ls = explode(" ", $line);
if ($ls[0] == 'LISTEN')
continue;
$net_tcp += (int)$ls[1];
$net_tcp += toint($ls[1]);
}
$starttime = timems();
@ -162,9 +166,9 @@ function base_srvstats($systemrow) {
$val = $dbrows[$i]['Value'];
$dbstat[$name] = $val;
}
$db_keyhit = (int)$dbstat['Handler_read_key'] / ((int)$dbstat['Com_select'] + 1) * 100;
$db_dbhit = (int)$dbstat['Innodb_buffer_pool_reads'] / ((int)$dbstat['Innodb_buffer_pool_read_requests'] + 1) * 100;
$db_tmptable = (int)$dbstat['Created_tmp_disk_tables'] / ((int)$dbstat['Created_tmp_tables'] + 1) * 100;
$db_keyhit = toint($dbstat['Handler_read_key']) / (toint($dbstat['Com_select']) + 1) * 100;
$db_dbhit = toint($dbstat['Innodb_buffer_pool_reads']) / (toint($dbstat['Innodb_buffer_pool_read_requests']) + 1) * 100;
$db_tmptable = toint($dbstat['Created_tmp_disk_tables']) / (toint($dbstat['Created_tmp_tables']) + 1) * 100;
$updata = array();
$updata['func_succ'] = $func_succ;
@ -199,30 +203,6 @@ function base_srvstats($systemrow) {
return '';
return 'succ: ' . $func_succ . ($func_rollback > 0 ? ', rollback: ' . $func_rollback : '');
}
function _base_delall($path) {
try {
if (is_dir($path)) {
$p = scandir($path);
foreach ($p as $val) {
if ($val[0] == '.')
continue;
if (is_dir($path . '/' . $val)) {
_base_delall($path . '/' . $val);
} else {
unlink($path . '/' . $val);
}
}
rmdir($path);
} else {
unlink($path);
}
} catch (\Exception $ex) {
return $ex->getMessage();
}
return true;
}
function _base_nextspace(&$line) {
$ind = strpos($line, " ");
if ($ind === false) {

View File

@ -61,6 +61,8 @@ class task {
$csql = new \ciy\sql('zc_autotsk_run');
$csql->where('id', $runtaskid);
$tskrunrow = $db->getone($csql);
if(!is_array($tskrunrow))
return clog('任务运行记录不存在:' . $runtaskid);
$csql = new \ciy\sql('zc_autotsk_log');
$csql->where('runtaskid', $runtaskid);
$csql->column('addtimes,msg');
@ -93,7 +95,7 @@ class task {
return;
$sysid = $taskrow['id'];
$nexttimes = $taskrow['nexttimes'];
$runcycle = (int)$taskrow['runcycle'];
$runcycle = toint($taskrow['runcycle']);
while (true) {
if ($nexttimes > tostamp())
break;
@ -126,14 +128,14 @@ class task {
$updata['msg'] = $runningmsg;
$csql = new \ciy\sql('zc_autotsk_run');
$db->insert($csql, $updata);
return;
return $db->insert_id();
}
$runlogstart = tostamp();
$updata = array();
$updata['autotaskid'] = $sysid;
$updata['addtimes'] = $runlogstart;
$csql = new \ciy\sql('zc_autotsk_run');
$execute = $db->insert($csql, $updata);
$db->insert($csql, $updata);
$runtaskid = $db->insert_id();
$taskrow['runtaskid'] = $runtaskid;
$taskrow['runtimes'] = tostamp();
@ -186,7 +188,6 @@ class task {
$csql = new \ciy\sql('zc_autotsk_run');
$csql->where('id', $runtaskid);
$db->update($csql, $updata);
return $runtaskid;
}
}

View File

@ -109,6 +109,7 @@ class bill {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['data'] = $updata;
@ -141,6 +142,7 @@ class bill {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['ids'] = $vids;

View File

@ -44,23 +44,31 @@ class ceeditor {
$post = new \ciy\post();
$set = $post->get('set');
$updata = array();
$updata['tabname'] = $tabname;
$updata['tabid'] = $id;
$updata['mapjson'] = json_encode($set, JSON_PARTIAL_OUTPUT_ON_ERROR);
$updata['uptimes'] = tostamp();
$csql = new \ciy\sql('zc_cemap_data');
$csql->where('tabname', $tabname);
$csql->where('tabid', $id);
$datarow = $db->getone($csql);
if (is_array($datarow)){
try {
$db->begin();
$updata = array();
$updata['tabname'] = $tabname;
$updata['tabid'] = $id;
$updata['mapjson'] = json_encode($set, JSON_PARTIAL_OUTPUT_ON_ERROR);
$updata['uptimes'] = tostamp();
$csql = new \ciy\sql('zc_cemap_data');
$csql->where('id', $datarow['id']);
if ($db->update($csql, $updata) === false)
throw new \Exception('更新失败:' . $db->error);
} else {
if ($db->insert($csql, $updata) === false)
throw new \Exception('新增失败:' . $db->error);
$csql->where('tabname', $tabname);
$csql->where('tabid', $id);
$datarow = $db->getone($csql);
if (is_array($datarow)) {
$csql = new \ciy\sql('zc_cemap_data');
$csql->where('id', $datarow['id']);
if ($db->update($csql, $updata) === false)
throw new \Exception('更新失败:' . $db->error);
} else {
if ($db->insert($csql, $updata) === false)
throw new \Exception('新增失败:' . $db->error);
}
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
return succjson();
}

View File

@ -86,9 +86,9 @@ class glb {
$csql = new \ciy\sql('zc_cemap_glb');
$csql->where('name', $name);
$csql->column('id');
$chkid = (int)$db->get1($csql);
$chkid = toint($db->get1($csql));
if ($chkid > 0 && (($id > 0 && $chkid != $id) || $id == 0))
throw new \Exception('数据已存在');
throw new \Exception('CIYIGN数据已存在');
$updata = array();
$updata['cpath'] = $cpath;
$updata['name'] = $name;
@ -108,6 +108,7 @@ class glb {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['data'] = $updata;
@ -140,6 +141,7 @@ class glb {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['ids'] = $vids;

View File

@ -60,6 +60,7 @@ class pathbill {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
return succjson();
@ -86,6 +87,7 @@ class pathbill {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['ids'] = $vids;
@ -113,6 +115,7 @@ class pathbill {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
return succjson();
@ -143,6 +146,7 @@ class pathbill {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
if ($cnt == 0)

View File

@ -60,6 +60,7 @@ class pathglb {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
return succjson();
@ -86,6 +87,7 @@ class pathglb {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['ids'] = $vids;
@ -113,6 +115,7 @@ class pathglb {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
return succjson();
@ -143,6 +146,7 @@ class pathglb {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
if ($cnt == 0)

View File

@ -1,6 +1,6 @@
var ciy_vars = {
"tokenfield": "ciyadm"
, "tokensalt": "ast34h$2"
, "tokensalt": "ast34h$3"
, "uploadurl": "admin/upload"
, "loginurl": "admin/login.html"
, "dupsec": 60

View File

@ -96,7 +96,7 @@ function nopower($db, $userid, $chkpower) {
return true;
if (strlen($chkpower) < 3)
return true;
if ($userid == 10)
if ($mepower == '.*.') //超级管理员
return false;
$pows = explode('.', $mepower);
foreach ($pows as $p) {
@ -155,13 +155,13 @@ function setconfig($db, $types, $value) {
}
function getcatas($db, $cbid, $table = 'zc_cata') {
if (is_numeric($cbid)) {
$cbid = (int)$cbid;
$cbid = toint($cbid);
} else {
$csql = new \ciy\sql($table);
$csql->where('codeid', $cbid);
$csql->where('cbid=0');
$csql->column('id');
$cbid = (int)$db->get1($csql);
$cbid = toint($db->get1($csql));
if ($cbid == 0)
return array();
}
@ -215,7 +215,7 @@ function setmemvar($db, $types, $value) {
if ($ind === false) {
$updata['params'] = 1;
} else {
$updata['params'] = (int)substr($value[0], $ind + 1);
$updata['params'] = toint(substr($value[0], $ind + 1));
}
}
if ($db->insert($csql, $updata) === false)

View File

@ -66,6 +66,7 @@
first: 顶部添加...first
limit: a~b 只包含[a,b]。a,b,c 包含a,b,c
filter: field=value 只包含field=value的数据。
rename: 10=新名称 将id=10的name改为新名称。
ciyfn.ccode 字典id转name
ciyfn.multicode 多级字典id转数组

View File

@ -0,0 +1,164 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1">
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
<link href="/jscss/style.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" charset="utf-8" src="/jscss/theme.js"></script>
<style>
.container>div {
padding: 1em;
background: var(--bg1);
margin-bottom: 1em;
border: 1px solid var(--bg5);
}
</style>
</head>
<body>
<div class="container">
<blockquote>按钮样式</blockquote>
<div>
<button class='btn'>按钮</button>
<button class='btn dag'>dag按钮</button>
<button class='btn def'>def按钮</button>
<button class='btn warn'>warn/imp按钮</button>
<button class='btn succ'>succ按钮</button>
<button class='btn loading'>按钮loading</button>
<button class='btn' disabled onclick="alert('aaa')">按钮disabled</button>
</div>
<blockquote>自定尺寸按钮</blockquote>
<div>
<button class='btn xs'>按钮 xs</button>
<button class='btn smmm'>按钮 smmm</button>
<button class='btn smm'>按钮 smm</button>
<button class='btn sm'>按钮 sm</button>
<button class='btn'>按钮</button>
<button class='btn lg'>按钮 lg</button>
<button class='btn lgg'>按钮 lgg</button>
</div>
<blockquote>图标按钮</blockquote>
<div>
<button class='btn svg'><svg t="1752338490069" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1325" width="200" height="200">
<path d="M513.3824 515.328m-445.4912 0a445.4912 445.4912 0 1 0 890.9824 0 445.4912 445.4912 0 1 0-890.9824 0Z" fill="#EBF3FF" p-id="1326"></path>
<path d="M649.6256 608.1536L558.08 686.8992a67.3792 67.3792 0 0 1-88.1152-0.3072c-27.648-24.1152-63.0784-55.0912-89.856-78.7456-94.4128 14.2848-166.7584 43.2128-166.7584 76.8 0 47.5136 138.8032 105.3696 300.544 105.3696s300.5952-57.856 300.5952-105.3696c-0.1536-33.3312-71.5264-62.1056-164.864-76.4928z" fill="#5097FF" p-id="1327"></path>
<path d="M720.7936 389.12a207.2064 207.2064 0 0 0-414.2592 9.0112c0 92.16 75.5712 165.7344 151.9616 233.8304a84.8896 84.8896 0 0 0 112.2304 0.5632C653.9776 559.9744 725.4528 486.4 720.7936 389.12z m-207.0528 131.3792a124.3136 124.3136 0 1 1 124.3648-124.3136 124.4672 124.4672 0 0 1-124.3648 124.16z" fill="#5E9FFF" p-id="1328"></path>
<path d="M513.7408 310.3232a85.7088 85.7088 0 1 0 85.7088 85.7088 85.8112 85.8112 0 0 0-85.7088-85.7088z" fill="#73AAFF" p-id="1329"></path>
<path d="M687.872 615.1168c-12.2368-2.56-24.9856-5.12-38.2464-6.9632L583.68 664.7808a106.5472 106.5472 0 0 1-139.52-0.6144c-21.8624-19.0976-45.2096-39.5264-64.2048-56.32-94.4128 14.2848-166.7584 43.2128-166.7584 76.8 0 32.0512 63.1808 68.8128 153.9584 89.344a430.7456 430.7456 0 0 0 320.7168-158.8736z" fill="#5E9FFF" p-id="1330"></path>
<path d="M693.248 295.2704a206.8992 206.8992 0 0 0-386.7136 102.7072c0 73.5232 48.2816 135.3728 106.7008 192.0512a493.2608 493.2608 0 0 0 122.1632-71.68 124.3136 124.3136 0 1 1 102.7072-122.4192c0 3.84 0 7.5776-0.5632 11.3152a487.3216 487.3216 0 0 0 55.7056-111.9744z" fill="#73AAFF" p-id="1331"></path>
<path d="M502.1184 311.2448a85.7088 85.7088 0 0 0-71.2192 63.3344 488.5504 488.5504 0 0 0 71.2192-63.3344z" fill="#86B4FF" p-id="1332"></path>
<path d="M389.4272 396.032a124.4672 124.4672 0 0 1 124.3136-124.3136 122.88 122.88 0 0 1 20.0192 1.6384A489.984 489.984 0 0 0 578.56 201.2672a201.1648 201.1648 0 0 0-56.32-10.24 207.2576 207.2576 0 0 0-215.7056 206.9504 168.96 168.96 0 0 0 5.12 40.5504 488.0896 488.0896 0 0 0 78.08-36.9152 40.3456 40.3456 0 0 1-0.3072-5.5808z" fill="#86B4FF" p-id="1333"></path>
</svg></button>
</div>
<blockquote>span标签</blockquote>
<div>
普通文字
<span class="def">def</span>
<span class="dag">dag</span>
<span class="imp">imp</span>
<span class="warn">warn</span>
<span class="man">man</span>
普通文字
</div>
<br /><br /><br /><br />
<br /><br /><br /><br />
<br /><br /><br /><br />
<br /><br /><br /><br />
<br /><br /><br /><br />
<br /><br /><br /><br />
<blockquote>下拉按钮</blockquote>
<div class="flex" style="justify-content: space-between;">
<div>
<button class="btn btn-menu" direction="lr">左右弹出
<span class="caret"></span>
<ul class="ciy-popmenu">
<li><a href="#">菜单1</a></li>
<li><a href="#">菜单2</a></li>
<li><a href="#">菜单3</a></li>
<li><a href="#">菜单4</a></li>
<li><a href="#">菜单5</a></li>
<li><a href="#">菜单6</a></li>
<li><a href="#">菜单7</a></li>
<li><a href="#">菜单8</a></li>
<li><a href="#">菜单9菜单9菜单9菜单9</a></li>
</ul>
</button>
<br/>
<button class="btn btn-menu">上下弹出
<span class="caret"></span>
<ul class="ciy-popmenu">
<li><a href="#">菜单1</a></li>
<li><a href="#">菜单2</a></li>
<li><a href="#">菜单3</a></li>
<li><a href="#">菜单4</a></li>
<li><a href="#">菜单5</a></li>
<li><a href="#">菜单6</a></li>
<li><a href="#">菜单7</a></li>
<li><a href="#">菜单8</a></li>
<li><a href="#">菜单9菜单9菜单9菜单9</a></li>
</ul>
</button>
</div>
<div>
<button class="btn btn-menu" direction="lr">左右弹出
<span class="caret"></span>
<ul class="ciy-popmenu">
<li><a href="#">菜单1</a></li>
<li><a href="#">菜单2</a></li>
<li><a href="#">菜单3</a></li>
<li><a href="#">菜单4</a></li>
<li><a href="#">菜单5</a></li>
<li><a href="#">菜单6</a></li>
<li><a href="#">菜单7</a></li>
<li><a href="#">菜单8</a></li>
<li><a href="#">菜单9菜单9菜单9菜单9</a></li>
</ul>
</button>
<br/>
<button class="btn btn-menu">上下弹出
<span class="caret"></span>
<ul class="ciy-popmenu">
<li><a href="#">菜单1</a></li>
<li><a href="#">菜单2</a></li>
<li><a href="#">菜单3</a></li>
<li><a href="#">菜单4</a></li>
<li><a href="#">菜单5</a></li>
<li><a href="#">菜单6</a></li>
<li><a href="#">菜单7</a></li>
<li><a href="#">菜单8</a></li>
<li><a href="#">菜单9菜单9菜单9菜单9</a></li>
</ul>
</button>
</div>
</div>
<br /><br /><br /><br />
<br /><br /><br /><br />
<br /><br /><br /><br />
<br /><br /><br /><br />
<br /><br /><br /><br />
<br /><br /><br /><br />
<br /><br /><br /><br />
<br /><br /><br /><br />
<br /><br /><br /><br />
<br /><br /><br /><br />
<br /><br /><br /><br />
<br /><br /><br /><br />
</div>
<script type="text/javascript" src="/jscss/ciy.js"></script>
<script type="text/javascript" src="../common.js"></script>
<script type="text/javascript">
'use strict';
ciyfn.dropmenu('.btn-menu');
</script>
</body>
</html>

View File

@ -0,0 +1,280 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1">
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
<link href="/jscss/style.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" charset="utf-8" src="/jscss/theme.js"></script>
<style>
.main>div {
padding: 1em;
background: var(--bg1);
margin-bottom: 1em;
border: 1px solid var(--bg5);
}
</style>
</head>
<body>
<div class="px4 py4 main">
<blockquote>识别号</blockquote>
<div>
用于标识UKey设备唯一编号<br />
<button class='btn' onclick="getsn()">全球识别号</button>
<div id="id_sn"></div>
</div>
<blockquote>登录用户</blockquote>
<div>
无感自动登录时设置的默认用户名<br />
<button class='btn' onclick="readuser()">读用户名</button>
<button class='btn' onclick="writeuser()">写用户名</button>
<br /><input id="id_user" type="text" style="width: 100%;" />
</div>
<blockquote>ECC签名</blockquote>
<div>
现将不限制长度的明文数据用hash256等算法计算固定长度hash摘要再用私钥签名<br />
<textarea id="mdata" style="width: 100%; height: 5em;">待签名数据123455</textarea>
<br /><button class='btn' onclick="hashData()">数据hash</button>
<br />hash:<input id="mhash" type="text" style="width: 100%;" />
<br /><button class='btn' onclick="eccsign()">ECC签名</button>
<br />签名:
<br /><textarea id="msignature" style="width: 100%; height: 5em;"></textarea>
</div>
<blockquote>ECC验签</blockquote>
<div>
将导出的公钥公开(服务端)服务端将用hash值、sign签名、公钥做签名验证。<br />
服务端保存好原始明文数据、sign签名、公钥可作为司法证据防抵赖。<br />
最佳实践用户收到Ukey后应自行生成新密钥对再与平台方关联。<br />
<button class='btn' onclick="exppubkey()">导出公钥</button>
<br /><textarea id="pubkey" style="width: 100%; height: 5em;"></textarea>
<br /><button class='btn' onclick="checksignjs()">ECC 前端验签</button>
<br /><button class='btn' onclick="checksignback()">ECC 后端验签</button>
<div id="check_result"></div>
</div>
<blockquote>PIN码</blockquote>
<div>
<input id="pin" type="text" style="width: 10em;" />
<button class='btn' onclick="pin()">验证</button>
<br /><input id="newpin" type="text" style="width: 10em;" />
<button class='btn' onclick="changepin()">改PIN</button>
</div>
<blockquote>重置PIN码</blockquote>
<div>
<button class='btn' onclick="genpin()">挑战码</button><br />
<input id="gentxt" type="text" style="width: 100%;" />
<input id="anstxt" type="text" style="width: 100%;" />
<br /><button class='btn' onclick="resetpin()">重置PIN</button>
</div>
<blockquote>读写标记</blockquote>
<div>
<button class='btn' onclick="getkey('ciy')">读标记</button><br />
<input id="kv" type="text" style="width: 100%;" />
<br /><button class='btn' onclick="setkey('ciy')">写标记</button>
</div>
<blockquote>初始化</blockquote>
<div>
<button class='btn' onclick="initkey()">初始化重置密钥对</button> 执行时间较长
</div>
<div style="height:2em;"></div>
</div>
<script type="text/javascript" src="/jscss/ciy.js"></script>
<script type="text/javascript" src="../common.js"></script>
<script type="text/javascript">
'use strict';
var Glob = { url: 'http://127.0.0.1:2300/api/' };
function getsn() {
var res = ciyfn.ajaxsync({
url: Glob.url + "GetSerialNumber"
});
if (res.code != 1)
return ciyfn.alert(res.errmsg);
$5("#id_sn").html(res.data.sn);
}
function readuser() {
var res = ciyfn.ajaxsync({
url: Glob.url + "GetUserName"
});
console.log(res);
if (res.code != 1)
return ciyfn.alert(res.errmsg);
$5("#id_user").val(res.data.UserName);
}
function writeuser() {
var user = $5("#id_user").val();
var res = ciyfn.ajaxsync({
url: Glob.url + "WriteUserName"
, data: {
UserName: user
}
});
console.log(res);
if (res.code != 1)
return ciyfn.alert(res.errmsg);
}
function hashData() {
const data = document.getElementById("mdata").value;
ciyfn.sha256(data).then(hash => document.getElementById("mhash").value = hash);
}
function eccsign() {
var data = document.getElementById("mhash").value;
var res = ciyfn.ajaxsync({
url: Glob.url + "GetECCSignData"
, data: {
pbData: data
}
});
console.log(res);
if (res.code != 1)
return ciyfn.alert(res.errmsg);
document.getElementById("msignature").value = res.data.HashData;
}
function exppubkey() {
var res = ciyfn.ajaxsync({
url: Glob.url + "ExportECCPublicKey"
});
console.log(res);
if (res.code != 1)
return ciyfn.alert(res.errmsg);
document.getElementById("pubkey").value = res.data.pub;
}
function checksignjs() {
const pbData = document.getElementById("mhash").value;
const pbSignature = document.getElementById("msignature").value;
var res = ciyfn.ajaxsync({
url: Glob.url + "GetECCVerify"
, data: {
"pbData": pbData,
"pbSignature": pbSignature
}
});
console.log(res);
if (res.code != 1)
return ciyfn.alert(res.errmsg);
document.getElementById("check_result").innerHTML = `js验签结果: 成功`;
}
function checksignback() {
var postparam = {};
postparam.sign = document.getElementById("msignature").value;
postparam.pubkey = document.getElementById("pubkey").value;
postparam.hash = document.getElementById("mhash").value;
ciyfn.callfunc("checkecc", postparam, function (json) {
document.getElementById("check_result").innerHTML = json.msg;
});
}
function pin() {
const pin = document.getElementById("pin").value;
var res = ciyfn.ajaxsync({
url: Glob.url + "VerifyUserPIN"
, data: {
"UserPIN": pin
}
});
console.log(res);
if (res.code != 1)
return ciyfn.alert(res.errmsg);
ciyfn.alert('PIN密码校验成功');
}
function changepin() {
const pin = document.getElementById("pin").value;
const newpin = document.getElementById("newpin").value;
var res = ciyfn.ajaxsync({
url: Glob.url + "ChangeUserPIN"
, data: {
"UserPIN": pin,
"UserNewPIN": newpin
}
});
console.log(res);
if (res.code != 1)
return ciyfn.alert(res.errmsg);
ciyfn.alert('PIN密码修改成功');
}
function genpin() {
var res = ciyfn.ajaxsync({
url: Glob.url + "GenerateUserCode"
});
console.log(res);
if (res.code != 1)
return ciyfn.alert(res.errmsg);
document.getElementById("gentxt").value = res.data.ChallengeCode;
}
function resetpin() {
const gentxt = document.getElementById("gentxt").value;
const anstxt = document.getElementById("anstxt").value;
var res = ciyfn.ajaxsync({
url: Glob.url + "RemoteUnblockPIN"
, data: {
"ChallengeCode": gentxt,
"AnswerData": anstxt
}
});
console.log(res);
if (res.code != 1)
return ciyfn.alert(res.errmsg);
ciyfn.alert('PIN重置成功:12345678');
}
function getkey(key) {
var res = ciyfn.ajaxsync({
url: Glob.url + "GetKeyValue"
, data: {
"Key": key,
}
});
console.log(res);
if (res.code != 1)
return ciyfn.alert(res.errmsg);
document.getElementById("kv").value = res.data.Value;
}
function setkey(key) {
var res = ciyfn.ajaxsync({
url: Glob.url + "DeleteKey"
, data: {
"Key": key,
}
});
const kv = document.getElementById("kv").value;
if (kv) {
var res = ciyfn.ajaxsync({
url: Glob.url + "WriteKeyValue"
, data: {
"Key": key,
"Value": kv,
}
});
console.log(res);
if (res.code != 1)
return ciyfn.alert(res.errmsg);
}
ciyfn.alert('写成功');
}
function initkey() {
var res = ciyfn.ajaxsync({
url: Glob.url + "InitDev"
});
console.log(res);
console.log(res.data.appliation_name);
console.log(res.data.container_list);
console.log(res.data.user_pin);
console.log(res.data.user_pin_retry_count);
if (res.code != 1)
return ciyfn.alert(res.errmsg);
}
</script>
</body>
</html>

View File

@ -0,0 +1,26 @@
<?php
namespace web\admin\demo;
class demo_ecc_ukey_ad {
public static function json_checkecc() {
$post = new \ciy\post();
$pubkey = $post->get('pubkey');
if (empty($pubkey))
return errjson('请填写公钥');
$sign = $post->get('sign');
if (empty($sign))
return errjson('请填写签名');
$hash = $post->get('hash');
if (empty($hash))
return errjson('请填写hash');
require_once PATH_ROOT . '../libs/sm/autoload.php';
$der = base64_decode($pubkey);
$pubkeyBytes = substr($der, 27);
$publicKey = '04' . bin2hex($pubkeyBytes);
$sm2Object = new \Rtgm\sm\RtSm2('base64', true);
$verifyResult = $sm2Object->verifySign($hash, $sign, $publicKey);
$ret['msg'] = $verifyResult ? "php验签结果: 验签成功" : "php验签结果: 验签失败";
return succjson($ret);
}
}

View File

@ -0,0 +1,181 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1">
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
<link href="/jscss/style.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" charset="utf-8" src="/jscss/theme.js"></script>
<style>
.container>div {
padding: 1em;
background: var(--bg1);
margin-bottom: 1em;
border: 1px solid var(--bg5);
}
</style>
</head>
<body>
<div class="container">
<blockquote>生成RSA密钥对</blockquote>
<div>
需在https协议下使用原理是调用现代浏览器的Web Crypto API。
<br /><button class='btn' onclick="gen()">生成密钥对</button>
<br />-----BEGIN PRIVATE KEY-----
<br /><textarea id="rsa_prikey" style="width: 100%; height: 5em;"></textarea>
-----END PRIVATE KEY-----
<br />
<br />-----BEGIN PUBLIC KEY-----
<br /><textarea id="rsa_pubkey" style="width: 100%; height: 5em;"></textarea>
-----END PUBLIC KEY-----
</div>
<blockquote>RSA签名</blockquote>
<div>
<textarea id="rsa_data" style="width: 100%; height: 5em;">待签名数据</textarea>
<br /><button class='btn' onclick="hashData()">数据hash</button>
<br />hash:<input id="rsa_hash" type="text" style="width: 100%;" />
<br /><button class='btn' onclick="rsasignjs()">RSA 前端签名</button>
<button class='btn' onclick="rsasignback()">RSA 后端签名</button>
<br /><span id="sign_from"></span>签名:
<br /><textarea id="rsa_signature" style="width: 100%; height: 5em;"></textarea>
</div>
<blockquote>RSA验签</blockquote>
<div>
<br /><button class='btn' onclick="checksignjs()">RSA 前端验签</button>
<button class='btn' onclick="checksignback()">RSA 后端验签</button>
<div id="check_result"></div>
</div>
</div>
<script type="text/javascript" src="/jscss/ciy.js"></script>
<script type="text/javascript" src="../common.js"></script>
<script type="text/javascript">
'use strict';
function rsasignback() {
var postparam = {};
postparam.prikey = document.getElementById("rsa_prikey").value;
postparam.hash = document.getElementById("rsa_hash").value;
ciyfn.callfunc("signrsa", postparam, function (json) {
document.getElementById("rsa_signature").value = json.sign;
$5('#sign_from').html(json.from);
});
}
function checksignback() {
var postparam = {};
postparam.sign = document.getElementById("rsa_signature").value;
postparam.pubkey = document.getElementById("rsa_pubkey").value;
postparam.hash = document.getElementById("rsa_hash").value;
ciyfn.callfunc("checkrsa", postparam, function (json) {
document.getElementById("check_result").innerHTML = `php验签结果: ${json.msg}`;
});
}
async function checksignjs() {
const signature = document.getElementById("rsa_signature").value;
var publicKeyPem = document.getElementById("rsa_pubkey").value;
const hash = document.getElementById("rsa_hash").value;
publicKeyPem = publicKeyPem.replace(/(-----(BEGIN|END) PUBLIC KEY-----|-----(BEGIN|END) RSA PUBLIC KEY-----|\r|\n)/g, '');
const binaryDerString = atob(publicKeyPem);
const binaryDer = new Uint8Array(binaryDerString.length);
for (let i = 0; i < binaryDerString.length; i++) {
binaryDer[i] = binaryDerString.charCodeAt(i);
}
const publicKey = await window.crypto.subtle.importKey(
"spki",
binaryDer,
{
name: "RSASSA-PKCS1-v1_5",
hash: { name: "SHA-256" }
},
true,
["verify"]
);
const dataBuffer = hexToArrayBuffer(hash);
const signatureBuffer = hexToArrayBuffer(signature);
const result = await window.crypto.subtle.verify(
"RSASSA-PKCS1-v1_5",
publicKey,
signatureBuffer,
dataBuffer
);
document.getElementById("check_result").innerHTML = `js验签结果: ${result ? '成功' : '失败'}`;
}
async function rsasignjs() {
var privateKeyPem = document.getElementById("rsa_prikey").value;
var data = document.getElementById("rsa_hash").value;
privateKeyPem = privateKeyPem.replace(/(-----(BEGIN|END) PRIVATE KEY-----|-----(BEGIN|END) RSA PRIVATE KEY-----|\r|\n)/g, '');
const binaryDerString = atob(privateKeyPem);
const binaryDer = new Uint8Array(binaryDerString.length);
for (let i = 0; i < binaryDerString.length; i++) {
binaryDer[i] = binaryDerString.charCodeAt(i);
}
const privateKey = await window.crypto.subtle.importKey(
"pkcs8",
binaryDer,
{
name: "RSASSA-PKCS1-v1_5",
hash: { name: "SHA-256" }
},
true,
["sign"]
);
const encoder = new TextEncoder();
const dataBuffer = hexToArrayBuffer(data);
const signature = await window.crypto.subtle.sign(
"RSASSA-PKCS1-v1_5",
privateKey,
dataBuffer
);
document.getElementById("rsa_signature").value = arrayBufferToHex(signature);
$5('#sign_from').html('js');
}
function hashData() {
const data = document.getElementById("rsa_data").value;
sha256(data).then(hash => document.getElementById("rsa_hash").value = hash);
}
async function gen() {
const keyPair = await window.crypto.subtle.generateKey({
name: "RSASSA-PKCS1-v1_5",
modulusLength: 2048, // RSA-2048
publicExponent: new Uint8Array([0x01, 0x00, 0x01]), // 65537
hash: { name: "SHA-256" }
},
true,
["sign", "verify"]
);
const exportedpub = await window.crypto.subtle.exportKey("spki", keyPair.publicKey);
document.getElementById("rsa_pubkey").value = btoa(String.fromCharCode.apply(null, new Uint8Array(exportedpub)));
const exportedpri = await window.crypto.subtle.exportKey("pkcs8", keyPair.privateKey);
document.getElementById("rsa_prikey").value = btoa(String.fromCharCode.apply(null, new Uint8Array(exportedpri)));
}
async function sha256(message) {
const msgBuffer = new TextEncoder().encode(message);
const hashBuffer = await crypto.subtle.digest('SHA-256', msgBuffer);
const hashArray = Array.from(new Uint8Array(hashBuffer));
const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
return hashHex;
}
function hexToArrayBuffer(hexString) {
const bytes = new Uint8Array(hexString.length / 2);
for (let i = 0; i < hexString.length; i += 2) {
bytes[i / 2] = parseInt(hexString.substr(i, 2), 16);
}
return bytes.buffer;
}
function arrayBufferToHex(buffer) {
return Array.from(new Uint8Array(buffer)).map(b => b.toString(16).padStart(2, '0')).join('');
}
</script>
</body>
</html>

View File

@ -0,0 +1,56 @@
<?php
namespace web\admin\demo;
class demo_rsa {
public static function json_checkrsa() {
$post = new \ciy\post();
$pubkey = $post->get('pubkey');
if (empty($pubkey))
return errjson('请填写公钥');
$sign = $post->get('sign');
if (empty($sign))
return errjson('请填写签名');
$hash = $post->get('hash');
if (empty($hash))
return errjson('请填写hash');
$signbin = hex2bin($sign);
if ($signbin === false)
return errjson('签名格式错误');
$hashbin = hex2bin($hash);
if ($hashbin === false)
return errjson('hash格式错误');
$signKey = $pubkey;
if (strpos($signKey, '-----BEGIN RSA PUBLIC KEY-----') === false && strpos($signKey, '-----BEGIN PUBLIC KEY-----') === false)
$signKey = "-----BEGIN PUBLIC KEY-----\n" . wordwrap($signKey, 64, "\n") . "\n-----END PUBLIC KEY-----";
$result = openssl_verify($hashbin, $signbin, $signKey, OPENSSL_ALGO_SHA256);
if ($result === 0)
$ret['msg'] = '验签失败';
else if ($result === 1)
$ret['msg'] = '验签成功';
else
return errjson('验签错误:' . openssl_error_string());
return succjson($ret);
}
public static function json_signrsa() {
$post = new \ciy\post();
$prikey = $post->get('prikey');
if (empty($prikey))
return errjson('请填写私钥');
$hash = $post->get('hash');
if (empty($hash))
return errjson('请填写hash');
$hashbin = hex2bin($hash);
if ($hashbin === false)
return errjson('hash格式错误');
$privateKey = $prikey;
if (strpos($privateKey, '-----BEGIN RSA PRIVATE KEY-----') === false && strpos($privateKey, '-----BEGIN PRIVATE KEY-----') === false)
$privateKey = "-----BEGIN PRIVATE KEY-----\n" . wordwrap($privateKey, 64, "\n", true) . "\n-----END PRIVATE KEY-----";
$result = openssl_sign($hashbin, $signbin, $privateKey, OPENSSL_ALGO_SHA256);
if ($result !== true)
return errjson('签名错误:' . openssl_error_string());
$ret['sign'] = bin2hex($signbin);
$ret['from'] = 'php';
return succjson($ret);
}
}

View File

@ -0,0 +1,120 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1">
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
<link href="/jscss/style.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" charset="utf-8" src="/jscss/theme.js"></script>
<style>
.container>div {
padding: 1em;
background: var(--bg1);
margin-bottom: 1em;
border: 1px solid var(--bg5);
}
</style>
</head>
<body>
<div class="container">
<blockquote>钱包登录</blockquote>
<div>
<br /><button class='btn' onclick="connect()">连接钱包</button>
<div id="id_connect"></div>
</div>
<blockquote>钱包签名</blockquote>
<div>
<textarea id="mdata" style="width: 100%; height: 5em;">待签名数据</textarea>
<br /><button class='btn' onclick="hashData()">数据hash</button>
<br />hash:<input id="mhash" type="text" style="width: 100%;" />
<br /><button class='btn' onclick="web3sign()">签名</button>
<br />签名:
<br /><textarea id="msignature" style="width: 100%; height: 5em;"></textarea>
</div>
<blockquote>钱包验签</blockquote>
<div>
<br /><button class='btn' onclick="web3verifyjs()">前端验签</button>
<br /><button class='btn' onclick="web3verifyback()">后端验签</button>
<div id="check_result"></div>
</div>
</div>
<script type="text/javascript" src="/jscss/ciy.js"></script>
<script type="text/javascript" src="/jscss/web3.min.js"></script>
<script type="text/javascript" src="../common.js"></script>
<script type="text/javascript">
'use strict';
var account = null;
async function connect() {
if (!window.ethereum) {
document.getElementById('id_connect').innerText = 'MetaMask 没有安装';
return;
}
try {
await window.ethereum.request({ method: 'eth_requestAccounts' });
const web3 = new Web3(window.ethereum);
const accounts = await web3.eth.getAccounts();
if (accounts.length > 0) {
account = accounts[0];
document.getElementById('id_connect').innerText = `Connected to address: ${account}`;
} else {
document.getElementById('id_connect').innerText = 'No accounts found';
}
} catch (error) {
console.error('User denied account access', error);
document.getElementById('id_connect').innerText = 'User denied account access:' + error;
}
}
function hashData() {
const data = document.getElementById("mdata").value;
ciyfn.sha256(data).then(hash => document.getElementById("mhash").value = hash);
}
async function web3sign() {
if (!account)
return;
const message = document.getElementById("mhash").value;
try {
const web3 = new Web3(window.ethereum);
const signature = await window.ethereum.request({
method: 'personal_sign',
params: ['CIY' + message, account],
});
document.getElementById('msignature').value = signature;
} catch (error) {
console.error("签名失败:", error);
}
}
async function web3verifyjs() {
if (!account)
return;
const message = document.getElementById("mhash").value;
const signature = document.getElementById("msignature").value;
try {
const web3 = new Web3(window.ethereum);
const recoveredAddress = await web3.eth.personal.ecRecover('CIY' + message, signature);
if (account.toLowerCase() === recoveredAddress.toLowerCase())
document.getElementById("check_result").innerHTML = `js验签结果: 验签成功`;
else
document.getElementById("check_result").innerHTML = `js验签结果: 验签失败`;
} catch (error) {
document.getElementById("check_result").innerHTML = `js验签结果: 验签失败 ` + error;
}
}
function web3verifyback() {
var postparam = {};
postparam.sign = document.getElementById("msignature").value;
postparam.addr = account;
postparam.hash = 'CIY' + document.getElementById("mhash").value;
ciyfn.callfunc("checkweb3", postparam, function (json) {
document.getElementById("check_result").innerHTML = `php验签结果: ${json.msg}`;
});
}
</script>
</body>
</html>

View File

@ -0,0 +1,42 @@
<?php
namespace web\admin\demo;
class demo_web3 {
public static function json_checkweb3() {
$post = new \ciy\post();
$addr = $post->get('addr');
if (empty($addr))
return errjson('请填写钱包地址');
$signature = $post->get('sign');
if (empty($signature))
return errjson('请填写签名');
$message = $post->get('hash');
if (empty($message))
return errjson('请填写hash');
//composer require simplito/elliptic-php kornrunner/keccak
require_once PATH_ROOT . '../libs/ethereum/autoload.php';
$prefix = "\x19Ethereum Signed Message:\n" . strlen($message);
$hash = \kornrunner\Keccak::hash($prefix . $message, 256);
$signature = substr($signature, 2);
if (strlen($signature) !== 130)
return '签名数据长度错误';
$r = substr($signature, 0, 64);
$s = substr($signature, 64, 64);
$v = substr($signature, 128, 2);
$v = hexdec($v);
if ($v == 27 || $v == 28)
$v -= 27;
$ec = new \Elliptic\EC('secp256k1');
$publicKey = $ec->recoverPubKey($hash, [
'r' => $r,
's' => $s
], $v);
$publicKeyHex = $publicKey->encode('hex');
$publicKeyBytes = substr(hex2bin($publicKeyHex), 1);
$addressFromKey = '0x' . substr(\kornrunner\Keccak::hash($publicKeyBytes, 256), 24);
$addressFromKey = strtolower($addressFromKey);
$ret['msg'] = strtolower($addr) === $addressFromKey ? "签名验证成功" : "签名验证失败";
return succjson($ret);
}
}

View File

@ -30,6 +30,14 @@
<label>字母</label>
<div><ciy-checkbox hasmore com="d" hasline /></div>
</div>
<div class="ciy-form col-24 col-sm-24">
<label>同意</label>
<div><ciy-checkbox com="e" text="同意协议" /></div>
</div>
<div class="ciy-form col-24 col-sm-24">
<label>文字range</label>
<div><ciy-checkbox com="f" range="10:通过.20:待定" /></div>
</div>
</div>
<button type="submit" class="btn lg">提交</button>
<a class="btn" onclick="chg()">改变值</a>
@ -55,6 +63,8 @@
ciycmp({ dom: '[com=b]', range: rg });
ciycmp({ dom: '[com=c]', range: rg, value: '1,3' });
ciycmp({ dom: '[com=d]', range: [{ id: 'aa', name: 'AAA' }, { id: 'bb', name: 'BBB' }], value: 'bb' });
ciycmp({ dom: '[com=e]' });
ciycmp({ dom: '[com=f]' });
});
function formsubmit(event) {
event.preventDefault();

View File

@ -110,6 +110,10 @@
<a class="btn sm" href="demo_tabcard.html" target="_blank">tabcard</a>
选项卡。
</div>
<div>
<a class="btn sm" href="demo_button.html" target="_blank">button</a>
按钮。
</div>
</div>
<div style="height:1em;"> </div>
@ -159,6 +163,18 @@
<a class="btn sm" href="demo_proxy.html" target="_blank">proxy prop</a>
Proxy响应式示例。
</div>
<div>
<a class="btn sm" href="demo_rsa.html" target="_blank">rsa sign</a>
RSA私钥签名
</div>
<div>
<a class="btn sm" href="demo_ecc_ukey_ad.html" target="_blank">ecc sign</a>
ECC UKey签名(VN)
</div>
<div>
<a class="btn sm" href="demo_web3.html" target="_blank">web3</a>
web3登录、签名、验签
</div>
<div>
<a class="btn sm" href="dyn/mail.html" target="_blank">mail</a>
Mail收发邮件。
@ -171,6 +187,14 @@
<a class="btn sm" href="lab/tesseract.html" target="_blank">tesseract</a>
文字OCR识别。
</div>
<div>
<a class="btn sm" href="tool_alipaycb.html" target="_blank">alipaycb</a>
阿里API回调数据分析
</div>
<div>
<a class="btn sm" href="tool_realip.html" target="_blank">realip</a>
复杂网络环境下获取真实ip
</div>
</div>
<div class="ciy-form inline"><label>滑动选择</label>

View File

@ -0,0 +1,113 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1">
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
<link href="/jscss/style.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" charset="utf-8" src="/jscss/theme.js"></script>
</head>
<body>
<div class="row" style="background:#eeeeee;">
<div class="ciy-form col-24 col-sm-24">
<label>回调LOG</label>
<div><ciy-textarea com="a" /></div>
</div>
<div class="ciy-form col-24 col-sm-24">
<div style="flex:none;padding-right:1em;">
<button type="button" class="btn lg" onclick="formsubmit(this);">分析</button>
</div>
<div>
<ciy-radio com="b" />
</div>
</div>
</div>
<div id="id_result"></div>
<script type="text/javascript" src="/jscss/ciy.js"></script>
<script type="text/javascript" src="/jscss/ciycmp.js"></script>
<script type="text/javascript" src="/ud/dict/ciy_arearpc.js"></script>
<script type="text/javascript" src="../common.js"></script>
<script type="text/javascript">
'use strict';
ciyfn.pageload(function () {
ciycmp({ dom: '[com=a]' });
ciycmp({ dom: '[com=b]', range: [{ id: '10', name: '原始' }, { id: '20', name: '重点' }], value: '20' });
});
function formsubmit(dom) {
var params = ciyfn.getform(dom);
var lines = params.a.split('\n');
var html = '';
//line 2025-07-15 16:14:58\t GET:func=ambhf/alipay.aqf& POST:charset=UTF-8&notify_time=2025-07-15+16%3A14%3A57&unsign_time=2025-07-15+16%3A14%3A57&sign=FScISZZPIUX0SOJbT7dXOeoaAbdbmFvZmX7csF1%2FOxnGDST30SFuE%2FhWLL%2FrMOl7t7gOYgYuixdwz5uvWuVK2BD1bcWLXcrsa0btRsvQxCIQk8w4nOXkb2T7e5pzR5lZrMCL4aGUYZ%2FVTCzkKYWhjWP2HjYRhmGyJjbCUFMYBNr%2BM%2B96knUwQqo4zava%2BwvW9oCzOC1WTVqOunjQQqeMKFaI2uhwbxHmJtaR4NaJUGbL0Fq3c41ZD%2F83EYBCt7lydd%2B91OVKBJcy%2Fmzab1%2Fy6WSGW6HT6MNJcvSx7u%2F4eUsSJkBpzgXdQUoSY6caWefe9A5pDnR3oZ8MdfGQz6RJ2Q%3D%3D&merchant_app_id=2021005173683965&external_agreement_no=1I1&version=1.0&notify_id=2025071501222161457021501405959732&notify_type=dut_user_unsign&agreement_no=20255515198814819334&alipay_open_id=0349EGGiMJAohwXMGO-pS-2YRJXprFEj_08A5a7PDkwXzA4&auth_app_id=2021005173683965&personal_product_code=FUND_SAFT_SIGN_WITHHOLDING_P&app_id=2021005173683965&sign_type=RSA2&alipay_logon_id=hr***%40ciy.cn&status=UNSIGN&sign_scene=INDUSTRY%7CSATF_ACC
for (var i = 0; i < lines.length; i++) {
var line = lines[i];
var ind = line.indexOf('POST:');
if (ind > -1)
line = line.substring(ind + 5);
line = decodeURIComponent(line);
var arrs = line.split('&');
var arrobj = {};
for (var j = 0; j < arrs.length; j++) {
var arr = arrs[j].split('=');
if (arr.length == 2) {
arrobj[arr[0]] = arr[1];
}
}
if (params.b == '10') {
html += '<div style="line-height:1.5em;margin: 1em;">';
for (var j in arrobj) {
if (j == 'biz_content') {
var biz = JSON.parse(arrobj[j]);
html += '<div><pre>' + JSON.stringify(biz, null, 2) + '</pre></div>';
} else {
html += '<div><kbd>' + j + '</kbd><span>' + arrobj[j] + '</span></div>';
}
}
html += '</div><hr/>';
}
if (params.b == '20') {
var subhtml = '';
if (arrobj['notify_type'] == 'dut_user_sign') {
subhtml = '<div><span style="color:green;">用户签约: ' + arrobj['external_agreement_no'] + '</span></div>';
}
else if (arrobj['notify_type'] == 'dut_user_unsign')
subhtml = '<div><span style="color:darkred;">用户解约: ' + arrobj['external_agreement_no'] + '</span></div>';
else if (arrobj['msg_method'] == 'alipay.fund.trans.order.changed') {
var biz = JSON.parse(arrobj['biz_content']);
if (biz['status'] != 'SUCCESS'
&& biz['status'] != 'DEALING'
&& biz['status'] != 'CLOSED'
&& biz['status'] != 'WAIT_PAY')
subhtml = 'more';
if(biz['fail_reason'])
subhtml = '<div><span>转账失败原因: ' + biz['fail_reason'] + '</span></div>';
//subhtml = '<div><span style="color:blue;">转账: ' + biz['out_biz_no'] + '' + biz['status'] + '' + biz['trans_amount'] + '</span></div>';
}
if (subhtml == 'more') {
subhtml = '';
for (var j in arrobj) {
if (j == 'biz_content') {
var biz = JSON.parse(arrobj[j]);
subhtml += '<div><pre>' + JSON.stringify(biz, null, 2) + '</pre></div>';
} else {
subhtml += '<div><kbd>' + j + '</kbd><span>' + arrobj[j] + '</span></div>';
}
}
}
if (subhtml) {
html += '<div style="line-height:1.5em;margin: 1em;">';
html += subhtml;
html += '</div><hr/>';
}
}
}
$5('#id_result').html(html);
}
</script>
</body>
</html>

View File

@ -0,0 +1,64 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1">
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
<link href="/jscss/style.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" charset="utf-8" src="/jscss/theme.js"></script>
</head>
<body>
<div class="row" style="background:#eeeeee;">
<div class="ciy-form col-24 col-sm-24">
<label>HTTP头</label>
<div><textarea name="header" style="height:25em;">
HTTP_CF_CONNECTING_IP=2d61:0db8:85a3:0000:0000:8a2e:0370:7334
HTTP_TRUE_CLIENT_IP=200.89.13.45
HTTP_X_FORWARDED_FOR=203.0.113.45:345, 70.41.3.18, 150.172.238.178
HTTP_FORWARDED=for="[2531:db8::1]:443";proto=https
HTTP_FORWARDED=for="2531:db8::2";proto=https
HTTP_FORWARDED=for=[2531:db8::3];proto=https
HTTP_FORWARDED=for=2531:db8::4;proto=https
HTTP_FORWARDED=for=200.89.13.43:443;proto=https
HTTP_FORWARDED=for=200.89.13.44,234.54.6.43
HTTP_FORWARDED=for=200.89.13.45:235,234.54.6.43
HTTP_FORWARDED_FOR=192.0.2.146, 203.0.113.67
HTTP_X_FORWARDED=192.0.2.147, 203.0.113.67
HTTP_X_REAL_IP=192.168.2.148</textarea>
</div>
</div>
<div class="ciy-form col-24 col-sm-24">
<label></label>
<div style="flex:none;padding-right:1em;">
<button type="button" class="btn" onclick="formsubmit(this);">模拟</button>
<button type="button" class="btn" onclick="getip();">实际IP</button>
</div>
</div>
</div>
<div id="id_result" style="font-size: 2em;padding: 1em;"></div>
<script type="text/javascript" src="/jscss/ciy.js"></script>
<script type="text/javascript" src="/jscss/ciycmp.js"></script>
<script type="text/javascript" src="/ud/dict/ciy_arearpc.js"></script>
<script type="text/javascript" src="../common.js"></script>
<script type="text/javascript">
'use strict';
function formsubmit(dom) {
var params = ciyfn.getform(dom);
ciyfn.callfunc("realip", params, function (json) {
$5('#id_result').html(json.ip);
});
}
function getip(dom) {
ciyfn.callfunc("getip", {}, function (json) {
$5('#id_result').html(json.ip);
});
}
</script>
</body>
</html>

View File

@ -0,0 +1,79 @@
<?php
namespace web\admin\demo;
class tool_realip {
public static function json_realip() {
$post = new \ciy\post();
$headers = explode("\n", $post->get('header'));
$server = array();
foreach ($headers as $header) {
$ind = strpos($header, '=');
if ($ind === false)
continue;
$server[strtoupper(substr($header, 0, $ind))] = substr($header, $ind + 1);
}
$ret['ip'] = self::simip($server);
return succjson($ret);
}
public static function json_getip() {
$ret['ip'] = getip();
return succjson($ret);
}
static function simip($server) {
$headers = [
'HTTP_CF_CONNECTING_IP', // Cloudflare
'HTTP_TRUE_CLIENT_IP', // Akamai/Cloudflare
'HTTP_X_FORWARDED_FOR', // 最常用的代理头
'HTTP_FORWARDED', // RFC 7239 标准
'HTTP_X_REAL_IP', // Nginx
'HTTP_FORWARDED_FOR', // 变体
'HTTP_X_FORWARDED', // 旧格式
];
$ips = array();
foreach ($headers as $header) {
if (!empty($server[$header])) //$_SERVER
$ips[] = strtolower($server[$header]);
}
foreach ($ips as $ip) {
$ind = strpos($ip, ',');
if ($ind !== false)
$ip = substr($ip, 0, $ind);
$ind = strpos($ip, 'for=');
if ($ind !== false) {
//for=192.0.2.43:47011,for="[2001:db8:cafe::17]:47011",for=unknown
//for=_hidden, for=_SEVKISEK
$ip = substr($ip, $ind + 4);
if ($ip[0] == '"') {
$ip = substr($ip, 1, strpos($ip, '"', 1) - 1);
$ind = strpos($ip, ']');
if ($ind !== false)
$ip = substr($ip, 1, $ind - 1);
} else if ($ip[0] == '[') {
$ip = substr($ip, 1, strpos($ip, ']') - 1);
} else {
$ind = strpos($ip, ';');
if ($ind !== false)
$ip = substr($ip, 0, $ind);
if (strpos($ip, '.') !== false) {
$ind = strpos($ip, ':');
if ($ind !== false)
$ip = substr($ip, 0, $ind);
}
}
} else {
if (strpos($ip, '.') !== false) {
$ind = strpos($ip, ':');
if ($ind !== false)
$ip = substr($ip, 0, $ind);
}
}
if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE))
return $ip;
}
if (isset($_SERVER['REMOTE_ADDR']))
return $_SERVER['REMOTE_ADDR'];
return '0.0.0.0';
}
}

View File

@ -34,9 +34,6 @@
<body>
<div class="container">
<div style="display:flex;position:fixed;top:0.5em;right:1em;z-index:1;">
<div>
<ciy-switch com="owpc" y="覆盖" n="查验"></ciy-switch>
</div>
<div>
<button class="btn" type="button" onclick="savepc(this);">写入文件</button>
</div>
@ -44,6 +41,9 @@
<button class="btn" type="button" onclick="save(this);" id="id_submit">保存设置(Ctrl+S)</button>
</div>
</div>
<div style="display:flex;position:fixed;bottom:0;right:0;z-index:1;">
<button class="btn dag smm" onclick="del(this);">删除</button>
</div>
<form>
<div>
<div class="ciy-form">
@ -206,8 +206,6 @@
cc.bcod.proglang = ciyfn.getstorage('_ccode_proglang', 'php');
if (!cc.bcod.saascode)
cc.bcod.saascode = ciyfn.getstorage('_ccode_saascode', '');
if (!cc.bcod.savepc)
cc.bcod.savepc = ciyfn.getstorage('_ccode_savepc', 'web\\*\\') + cc.bcod.tabname.substring(cc.bcod.tabname.indexOf('_') + 1);
$5('[name=_bcod_verifyfunc]').val(cc.bcod.verifyfunc);
$5('[name=_bcod_titname]').val(cc.bcod.titname);
@ -221,7 +219,6 @@
$5('[name=_bcod_tabdict]').val(cc.bcod.tabdict);
$5('[name=_bcod_saascode]').val(cc.bcod.saascode);
ciycmp({ dom: '[com=owpc]' });
// ciycmp({
// dom: '[com=_bcod_chk]', value: cc.bcod.bcod_chk, range: [
// //如果有固定的几个字段,则开启审核
@ -451,7 +448,7 @@
chkvalue = chkvalue.replace(',bmin', '').replace(',bout', '');
}
if (colcomment.cate == 'BR' || colcomment.cate == 'MD') {
if(!colcomment.show)
if (!colcomment.show)
spset.nocmn = 'no';
}
if (data.COLUMN_NAME == 'auditstatus'
@ -465,7 +462,8 @@
|| data.COLUMN_NAME == 'ip') {
spset.noup = 'no';
}
if (data.COLUMN_NAME.substring(0, 4) == 'saas' && data.COLUMN_NAME.substring(5) == 'id') {
var saascode = ciyfn.getstorage('_ccode_saascode', '').split('=');
if (data.COLUMN_NAME == saascode[0]) {
spset.noup = 'saas';
}
if (data.COLUMN_NAME == 'lat') {
@ -499,7 +497,7 @@
html += '</div>';
html += '<div style="margin:0.5em;">';
html += '<input name="col_' + i + '" value="' + data.COLUMN_NAME + '" type="hidden" />';
html += '<input name="show_' + i + '" value="' + (colcomment.show?1:2) + '" type="hidden" />';
html += '<input name="show_' + i + '" value="' + (colcomment.show ? 1 : 2) + '" type="hidden" />';
html += '<input name="name_' + i + '" value="' + colcomment.name + '" type="hidden" />';
html += '<input name="cate_' + i + '" value="' + colcomment.cate + '" type="hidden" />';
html += '<input name="type_' + i + '" value="' + data.DATA_TYPE + '" type="hidden" />';
@ -675,10 +673,16 @@
ciyfn.setstorage('_ccode_tabdict', postparam._bcod_tabdict);
ciyfn.setstorage('_ccode_htmllang', postparam._bcod_htmllang);
ciyfn.setstorage('_ccode_proglang', postparam._bcod_proglang);
ciyfn.setstorage('_ccode_saascode', postparam._bcod_saascode);
ciyfn.setstorage('_ccode_savepc', postparam._bcod_savepc.substring(0, postparam._bcod_savepc.lastIndexOf('\\') + 1)); //记忆一部分,默认一部分+表名
ciyfn.toast('保存成功');
});
}
function del(dom) {
ciyfn.callfunc('del', {}, function (json) {
window.close();
});
}
function createhtml(dom) {
var postparam = checkformdata(dom);
if (typeof (postparam) == 'string')
@ -741,9 +745,11 @@
function checkformdata(dom) {
var postparam = ciyfn.getform(dom);
postparam.total = table.json.list.length;
postparam.schema = table.json.dbsaas.schem;
postparam.table = table.json.table;
postparam.subpath = table.json.dbsaas.subpath;
if (!postparam._bcod_proglang)
return '请选择后端语言';
console.log(postparam);
for (var i = 0; i < postparam.total; i++) {
if (postparam['none_' + i] === 'true')
continue;

View File

@ -8,8 +8,14 @@ class code_create {
$rsuser = verifyfast();
$post = new \ciy\post();
$query = $post->get('query');
$schema = objstr($query, 'schema');
$dbcid = objint($query, 'dbcid');
$tabname = objstr($query, 'table');
$csql = new \ciy\sql('zc_dev_dbsaas');
$csql->where('id', $dbcid);
$dbsaasrow = $db->getone($csql);
if (!is_array($dbsaasrow))
return errjson('dbsaas不存在');
$schema = $dbsaasrow['schem'];
$csql = new \ciy\sql('INFORMATION_SCHEMA.COLUMNS');
$csql->where('TABLE_SCHEMA', $schema);
$csql->where('TABLE_NAME', $tabname);
@ -17,6 +23,8 @@ class code_create {
for ($i = 0; $i < count($rows); $i++)
$rows[$i]['id'] = $i;
$ret = array('list' => $rows);
$ret['dbsaas'] = $dbsaasrow;
$ret['table'] = $tabname;
$field = array();
$field['_btn'] = array('c' => '操作');
$field['TABLE_COMMENT'] = array('c' => '表名');
@ -26,7 +34,7 @@ class code_create {
$ret['field'] = $field;
$csql = new \ciy\sql('zc_dev_dbcode');
$csql->where('schem', $schema);
$csql->where('dbcid', $dbcid);
$csql->where('tabl', $tabname);
$csql->column('pcjson');
$jnstr = $db->get1($csql);
@ -43,7 +51,9 @@ class code_create {
$ret['code_create'] = array('bcod' => array(), 'col' => array());
$ret['code_create']['bcod']['tabname'] = $tabname;
$ret['code_create']['bcod']['titname'] = str_replace('表', '', $tabrow['TABLE_COMMENT']);
$ret['code_create']['bcod']['uploadpat'] = substr($tabname, strpos($tabname, '_') + 1);
$maintab = substr($tabname, strpos($tabname, '_') + 1);
$ret['code_create']['bcod']['uploadpat'] = $maintab;
$ret['code_create']['bcod']['savepc'] = 'web\\' . $dbsaasrow['subpath'] . '\\' . $maintab;
if ($chk_audit) {
$ret['code_create']['bcod']['newline'] = '导出';
$ret['code_create']['bcod']['multibtn'] = '批量删除,审核通过,驳回';
@ -67,7 +77,7 @@ class code_create {
}
public static function save($post) {
global $db;
$schema = get('schema');
$dbcid = getint('dbcid');
$tabname = get('table');
$json = array();
$json['bcod'] = array();
@ -76,8 +86,9 @@ class code_create {
$json['bcod']['titname'] = $post->get('_bcod_titname', '', 'all');
//$json['bcod']['logtype'] = $post->get('_bcod_logtype', '', 'all');
$json['bcod']['uploadpat'] = $post->get('_bcod_uploadpat', '', 'all');
$json['bcod']['liiddict'] = $post->get('_bcod_liiddict', '', 'all');
$json['bcod']['uptabcard'] = $post->get('_bcod_uptabcard', '', 'all');
$json['bcod']['liiddict'] = str_replace('', ',', $post->get('_bcod_liiddict', '', 'all'));
$json['bcod']['uptabcard'] = str_replace('', ',', $post->get('_bcod_uptabcard', '', 'all'));
$json['bcod']['viewtabcard'] = str_replace('', ',', $post->get('_bcod_viewtabcard', '', 'all'));
$json['bcod']['tabdict'] = $post->get('_bcod_tabdict', '', 'all');
$json['bcod']['saascode'] = $post->get('_bcod_saascode', '', 'all');
//$json['bcod']['uniquedata'] = $post->get('_bcod_uniquedata', '', 'all');
@ -105,11 +116,11 @@ class code_create {
try {
$db->begin();
$updata = array();
$updata['schem'] = $schema;
$updata['dbcid'] = $dbcid;
$updata['tabl'] = $tabname;
$updata['pcjson'] = json_encode($json, JSON_PARTIAL_OUTPUT_ON_ERROR);
$csql = new \ciy\sql('zc_dev_dbcode');
$csql->where('schem', $schema);
$csql->where('dbcid', $dbcid);
$csql->where('tabl', $tabname);
$row = $db->getone($csql);
$csql = new \ciy\sql('zc_dev_dbcode');
@ -126,10 +137,22 @@ class code_create {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
return succjson();
}
public static function json_del() {
global $db;
$dbcid = getint('dbcid');
$tabname = get('table');
$csql = new \ciy\sql('zc_dev_dbcode');
$csql->where('dbcid', $dbcid);
$csql->where('tabl', $tabname);
if ($db->delete($csql) === false)
return errjson('删除失败:' . $db->error);
return succjson();
}
public static function json_createhtml() {
$post = new \ciy\post();
require_once 'code_common.php';
@ -167,13 +190,6 @@ class code_create {
$tpath = dirname($savepc);
if (!is_dir($tpath))
return errjson('目录不存在' . $tpath);
$ow = $post->getbool('owpc');
if (!$ow) {
if (file_exists($savepc . '.html'))
return errjson($savepc . '.html文件已存在');
if (file_exists($savepc . '.php'))
return errjson($savepc . '.php文件已存在');
}
$ret = self::save($post);
if (is_string($ret))
return errjson($ret);

View File

@ -17,7 +17,7 @@
<div class="sinps"></div>
<div class="sbtns">
<button class="lang btn" type="submit">查询</button>
<a class="lang btn" onclick="getschema()">选库</a>
<span id="id_dbc"></span>
</div>
</div>
</form>
@ -25,16 +25,6 @@
<div class="list"></div>
</div>
</div>
<div id="alert_edit" style="display:none;">
<div class="char3 row">
<div class="ciy-form col-24 col-sm-24">
<label class="lang imp">表名</label>
<div>
<input type="text" name="name" style="width:100%;" />
</div>
</div>
</div>
</div>
<script type="text/javascript" src="/jscss/ciy.js"></script>
<script type="text/javascript" src="/jscss/ciycmp.js"></script>
<script type="text/javascript" src="/jscss/ciytable.js"></script>
@ -44,42 +34,41 @@
var table;
var Glob = {};
ciyfn.pageload(function () {
var urlp = ciyfn.urlparam();
if (urlp.schema)
return gettab({ schema: urlp.schema });
var schema = ciyfn.getstorage('schema');
if (schema)
return gettab({ schema: schema });
getschema();
});
function getschema() {
ciyfn.callfunc("getschema", {}, function (json) {
for (var i = 0; i < json.schema.length; i++) {
json.schema[i].id = json.schema[i].name;
table = new ciyclass.table({
dom: '.table'
, url: 'init'
, pagecount: 10
, fn_beforedata: function (json) {
ciyfn.fillsearch({
searchdom: '.search'
, data: json
});
Glob.tabls = {};
for (var i in json.once.dbcode)
Glob.tabls[json.once.dbcode[i].tabl] = 1;
document.title = '🔆' + json.once.dbsaas.name + ' - ' + json.once.dbsaas.subpath;
$5('#id_dbc').html('<kbd>' + json.once.dbsaas.name + '</kbd><kbd>' + json.once.dbsaas.schem + '</kbd><kbd>' + json.once.dbsaas.subpath + '</kbd>');
return json;
}
, fn_tdcontent: function (key, datashow, field, data) {
if (key == 'TABLE_COMMENT') {//内部编辑,立即更新
return '<input type="text" value="' + datashow + '" style="width:100%;" onblur="upcomment(this, ' + data.id + ')"/>';
}
if (key == '_btn') {
var html = '';
if (Glob.tabls[data.TABLE_NAME])
html += '<a class="lang btn imp" onclick="menubtn(this, \'create\')">生成</a>';
else
html += '<a class="lang btn" onclick="menubtn(this, \'create\')">生成</a>';
return html;
}
}
ciyfn.alert({
contentstyle: 'width:27em;',
content: '<div class="form-group"><label>选择</label><div><ciy-select com="schema" style="width:auto;" /></div></div>',
nomaskclose: true,
noparent: true,
fn_showed: function (doc, dom) {
ciycmp({ dom: $5('[com=schema]', dom), range: json.schema });
},
cb: function (opn) {
if (opn.btn == "取消")
return opn.close();
if (!opn.inputs.schema)
return opn.close();
ciyfn.setstorage('schema', opn.inputs.schema);
gettab({ schema: opn.inputs.schema });
opn.close();
},
btns: ["提交", "*取消"]
});
});
}
table.callpage(1);
});
function search(dom) {
Glob.key = ciyfn.getform(dom);
delete Glob.key.memo;
$5('[data-id]').each(function (rdom) {
var bshow = true;
for (var k in Glob.key) {
@ -94,78 +83,20 @@
rdom.style.display = bshow ? '' : 'none';
});
}
function gettab(post) {
if (table)
table.dom.attr('_field', 0);
table = new ciyclass.table({
dom: '.table'
, url: 'init'
, query: post
, pagecount: 10
, fn_beforedata: function (json) {
ciyfn.fillsearch({
searchdom: '.search'
, data: json
});
return json;
}
, fn_tdcontent: function (key, datashow, field, data) {
if (key == 'TABLE_COMMENT') {//内部编辑,立即更新
return '<input type="text" value="' + datashow + '" style="width:100%;" onblur="upcomment(this, ' + data.id + ')"/>';
}
if (key == '_btn') {
var html = '';
html += '<a class="lang btn imp" onclick="menubtn(this, \'create\')">生成</a>';
//html += '<a class="lang btn" onclick="menubtn(this, \'edit\')">更名</a>';
return html;
}
}
function upcomment(dom, id) {
var val = $5(dom).val();
if (val == table.data[id].TABLE_COMMENT)
return;
ciyfn.callfunc('update', { id: id, tabname: table.data[id].TABLE_NAME, name: val }, function (json) {
table.data[id].TABLE_COMMENT = val;
$5(dom).css({ border: '1px solid var(--succ5)' });
setTimeout(function () { $5(dom).css({ border: '' }); }, 1000);
});
table.callpage(1);
}
function upcomment(dom, id) {
var val = $5(dom).val();
if (val == table.data[id].TABLE_COMMENT)
return;
ciyfn.callfunc('update', { id: id, tabname: table.data[id].TABLE_NAME, name: val }, function (json) {
table.data[id].TABLE_COMMENT = val;
$5(dom).css({ border: '1px solid var(--succ5)' });
setTimeout(function () { $5(dom).css({ border: '' }); }, 1000);
});
}
function menubtn(dom, btn) {
var id = $5(dom).parent('tr').attr('data-id');
if (btn == 'create') {
window.open('code_create.html?schema=' + table.data[id].TABLE_SCHEMA + '&table=' + table.data[id].TABLE_NAME);
return;
ciyfn.sendsignal(window.top, 'manage_ifropen', {
url: 'develop/code_create.html?schema=' + table.data[id].TABLE_SCHEMA + '&table=' + table.data[id].TABLE_NAME
, name: '代码生成<code>' + table.data[id].TABLE_COMMENT + '</code>'
});
}
if (btn == 'edit') {
ciyfn.alert({
title: '更名'
, content: document.getElementById("alert_edit").innerHTML
//, noparent:true
, fn_showed: function (doc, dom) {
var dat = table.data[id];
$5('[name=name]', dom).val(dat.TABLE_COMMENT);
}
, cb: function (opn) {
if (opn.btn == "关闭")
return opn.close();
opn.inputs.id = id;
opn.inputs.tabname = table.data[id].TABLE_NAME;
if (ciyfn.throttle(opn.dombtn)) return;
ciyfn.callfunc('update', opn.inputs, function (json) {
table.updateline(json);
opn.close();
ciyfn.toast('更新成功');
});
},
btns: ["提交", "*关闭"]
});
window.open('code_create.html?dbcid=' + table.once.dbsaas.id + '&table=' + table.data[id].TABLE_NAME);
}
}
</script>

View File

@ -6,14 +6,17 @@ class code_list {
static function setwhere($db, $post) {
$query = $post->get('query');
$csql = new \ciy\sql('INFORMATION_SCHEMA.TABLES');
$csql->where('TABLE_SCHEMA', objstr($query, 'schema'));
return [$query, $csql];
}
public static function json_init() {
global $db;
$rsuser = verifyfast();
$post = new \ciy\post();
$csql = new \ciy\sql('zc_dev_dbsaas');
$csql->where('id', getint('dbcid'));
$dbsaasrow = $db->getone($csql);
list($where, $csql) = self::setwhere($db, $post);
$csql->where('TABLE_SCHEMA', $dbsaasrow['schem']);
$rows = $db->get($csql);
for ($i = 0; $i < count($rows); $i++)
$rows[$i]['id'] = $i + 1;
@ -31,6 +34,11 @@ class code_list {
if ($post->getbool('once')) {
$ret['once'] = array();
$ret['once']['dbsaas'] = $dbsaasrow;
$csql = new \ciy\sql('zc_dev_dbcode');
$csql->where('dbcid', getint('dbcid'));
$csql->column('tabl');
$ret['once']['dbcode'] = $db->get($csql);
$input = array();
$input[] = array(
'type' => 'input',

View File

@ -8,7 +8,7 @@ function code_mbvue3($post) {
$titname = $post->get('_bcod_titname', '', 'all');
$logtype = $post->get('_bcod_logtype', '', 'all');
$uploadpat = $post->get('_bcod_uploadpat', '', 'all');
$liiddict = $post->get('_bcod_liiddict', '', 'all');
$liiddict = str_replace('',',', $post->get('_bcod_liiddict', '', 'all'));
$tabdict = $post->get('_bcod_tabdict', '', 'all');
$uniquedata = $post->get('_bcod_uniquedata', '', 'all');
$chk_in = $post->get('_bcod_chk_in') == 'yes';

View File

@ -1,19 +1,25 @@
<?php
function code_pc_html($post) {
$schema = get('schema');
$tabname = get('table');
$schema = $post->get('schema', '', 'all');
$tabname = $post->get('table', '', 'all');
$subpath = $post->get('subpath', '', 'all');
$maindb = $post->get('_bcod_maindb', '', 'all');
$verifyfunc = $post->get('_bcod_verifyfunc', '', 'all');
$titname = $post->get('_bcod_titname', '', 'all');
$saascode = $post->get('_bcod_saascode', '', 'all');
if ($saascode) {
$saascode = explode('=', $saascode);
if (count($saascode) == 1)
$saascode[1] = $saascode[0];
}
$uploadpat = $post->get('_bcod_uploadpat', '', 'all');
$liiddict = $post->get('_bcod_liiddict', '', 'all');
$uptabcard = $post->get('_bcod_uptabcard', '', 'all');
$liiddict = str_replace('',',', $post->get('_bcod_liiddict', '', 'all'));
$uptabcard = str_replace('',',', $post->get('_bcod_uptabcard', '', 'all'));
$uptabcards = array();
if (!empty($uptabcard))
$uptabcards = explode(',', $uptabcard);
$viewtabcard = $post->get('_bcod_viewtabcard', '', 'all');
$viewtabcard = str_replace('',',', $post->get('_bcod_viewtabcard', '', 'all'));
$viewtabcards = array();
if (!empty($viewtabcard))
$viewtabcards = explode(',', $viewtabcard);
@ -107,7 +113,9 @@ function code_pc_html($post) {
$topbtns[] = '<a class="lang btn" onclick="">' . $str . '</a>';
} else {
$subs = explode('|', $str); //操作|成果|方法|-修改|删除
$btnhtml = "<a class=\"btn btn-menu btn-menu-caret\">{$subs[0]}<ul class=\"ciy-popmenu\" style=\"position: fixed;\">\n";
$btnhtml = "<a class=\"btn btn-menu\" direction=\"lr\"><span class=\"lang\">{$subs[0]}</span>\n";
$btnhtml .= " <span class=\"caret\"></span>\n";
$btnhtml .= " <ul class=\"ciy-popmenu\">\n";
for ($j = 1; $j < count($subs); $j++) {
$ext = '';
$name = $subs[$j];
@ -115,9 +123,10 @@ function code_pc_html($post) {
$name = substr($name, 1);
$ext = ' class="upline"';
}
$btnhtml .= " <li{$ext} onclick=\"\">{$name}</li>\n";
$btnhtml .= " <li{$ext} onclick=\"\">{$name}</li>\n";
}
$btnhtml .= " </ul></a>";
$btnhtml .= " </ul>\n";
$btnhtml .= " </a>";
$topbtns[] = $btnhtml;
}
}
@ -144,7 +153,7 @@ function code_pc_html($post) {
data;
if (($querycount < 5 && count($topbtns) < 4) || count($topbtns) < 2) {
if (($querycount < 5 && count($topbtns) < 4) || count($topbtns) < 3) {
foreach ($topbtns as $topbtn) {
$codex .= ' ' . $topbtn . "\n";
}
@ -156,7 +165,7 @@ data;
data;
if (!(($querycount < 5 && count($topbtns) < 4) || count($topbtns) < 2)) {
if (!(($querycount < 5 && count($topbtns) < 4) || count($topbtns) < 3)) {
$codex .= " <div class=\"topbtn\">\n";
foreach ($topbtns as $topbtn) {
$codex .= ' ' . $topbtn . "\n";
@ -272,11 +281,11 @@ if($hasedit){
} else if ($cate == 'METRE') {
$codex .= "\n{$pspec} <ciy-inputbet com=\"{$col}\" unit=\"\" bet=\"1000\" />";
} else if ($cate == 'DATE') {
if (strpos('H', $fld['data']) !== false)
if (strpos($fld['data'], 'H') !== false)
$ext = ' type="datetime"';
$codex .= "\n{$pspec} <ciy-datetime com=\"{$col}\"{$ext} />";
} else if ($cate == 'TIME') {
if (strpos(':s', $fld['data']) !== false)
if (strpos($fld['data'], ':s') !== false)
$ext = ' type="second"';
$codex .= "\n{$pspec} <ciy-timepoint com=\"{$col}\"{$ext} />";
} else if ($cate == 'WCNY') {
@ -459,10 +468,10 @@ if($hasedit){
$savepc = str_replace('\\', '/', $savepc);
$savepc = substr($savepc, strpos($savepc, 'web/') + 4);
$count = substr_count($savepc, '/');
$subpath = './';
$subpathn = './';
if($count > 0)
$subpath = str_repeat('../', $count - 1);
$codex .= "\n <script type=\"text/javascript\" src=\"{$subpath}common.js\"></script>";
$subpathn = str_repeat('../', $count - 1);
$codex .= "\n <script type=\"text/javascript\" src=\"{$subpathn}common.js\"></script>";
$liid = '';
if (!empty($liiddict)) {
@ -491,7 +500,9 @@ if($hasedit){
$editbtn = '';
$menubtn = '';
$bmenubtn = false;
$strs = explode(',', $btnlist_line); //添加,导入,导出,其他,操作|成果|方法|-修改|删除
$subgomenus = array();
foreach ($strs as $str) {
$ind = strpos($str, '|');
if ($ind === false) {
@ -526,16 +537,25 @@ if($hasedit){
$menubtn .= "\n }";
}
else {
$btnstrs = explode('.', $str);
$str = $btnstrs[0];
$extcls = '';
$extkey = '';
$menubtn .= "\n if (btn == '') {";
if(count($btnstrs) > 1){
$subgomenus[] = $btnstrs;
$extkey = $btnstrs[1];
}
$menubtn .= "\n if (btn == '{$extkey}') {";
$menubtn .= "\n ciyfn.callfastfunc(dom, '是否{$str}?', 'status', { ids: id }, function (json) { table.updateline(json) });";
$menubtn .= "\n }";
}
$editbtn .= "\n html += `<a class=\"lang btn{$extcls}\" onclick=\"menubtn(this, '{$extkey}')\">{$str}</a>`;";
} else {
$bmenubtn = true;
$subs = explode('|', $str); //操作|成果|方法|-修改|删除
$editbtn .= "\n html += `<a class=\"btn btn-menu btn-menu-caret\">{$subs[0]}<ul class=\"ciy-popmenu\" style=\"position: fixed;\">";
$editbtn .= "\n html += `<a class=\"btn btn-menu\" direction=\"lr\"><span class=\"lang\">{$subs[0]}</span>";
$editbtn .= "\n <span class=\"caret\"></span>";
$editbtn .= "\n <ul class=\"ciy-popmenu\">";
for ($j = 1; $j < count($subs); $j++) {
$ext = '';
$name = $subs[$j];
@ -543,9 +563,14 @@ if($hasedit){
$name = substr($name, 1);
$ext = ' class="upline"';
}
$editbtn .= " <li{$ext} onclick=\"\">{$name}</li>";
$btnstrs = explode('.', $name);
if(!isset($btnstrs[1]))
$btnstrs[1] = '';
else
$subgomenus[] = $btnstrs;
$editbtn .= "\n <li{$ext} onclick=\"menubtn(this, '{$btnstrs[1]}')\">{$btnstrs[0]}</li>";
}
$editbtn .= " </ul></a>`;";
$editbtn .= "\n </ul></a>`;";
}
}
$pcaddtit = '';
@ -578,18 +603,37 @@ if($hasedit){
$codex .= "\n // table.mergecol('auditstatus');";
$codex .= "\n // table.mergefix('总计', 'center', 6, 0, 8, 1);";
$codex .= "\n // table.footertotal();";
if($bmenubtn)
$codex .= "\n ciyfn.dropmenu('.btn-menu');";
$codex .= "\n }";
$codex .= "\n });";
$codex .= "\n table.callpage(1);";
$codex .= "\n });";
$codex .= "\n function menubtn(dom, btn) {";
$codex .= "\n var id = $5(dom).parent('tr').attr('data-id');{$menubtn}";
$codex .= "\n if (btn == 'sub') {";
$codex .= "\n ciyfn.sendsignal(window.top, 'manage_ifropen', {";
$codex .= "\n url: 'xxx.html?_xxxid=' + id";
$codex .= "\n , name: '{$titname}<code>' + table.data[id].name + '</code>'";
$codex .= "\n });";
$codex .= "\n }";
$subpathn = '';
$ind = strpos($subpath, '\\');
if($ind > 0)
$subpathn = str_replace('\\','/', substr($subpath, $ind+1)) . '/';
foreach ($subgomenus as $subgomenu) {
$xid = 'xxxid';
if(isset($subgomenu[2]))
$xid = $subgomenu[2];
$codex .= "\n if (btn == '{$subgomenu[1]}') {";
$codex .= "\n ciyfn.sendsignal(window.top, 'manage_ifropen', {";
$codex .= "\n url: '{$subpathn}{$subgomenu[1]}.html?_{$xid}=' + id";
$codex .= "\n , name: '{$subgomenu[0]}<code>' + table.data[id].name + '</code>'";
$codex .= "\n });";
$codex .= "\n }";
}
if (count($subgomenus) == 0) {
$codex .= "\n if (btn == 'sub') {";
$codex .= "\n ciyfn.sendsignal(window.top, 'manage_ifropen', {";
$codex .= "\n url: 'xxx.html?_xxxid=' + id";
$codex .= "\n , name: '{$titname}<code>' + table.data[id].name + '</code>'";
$codex .= "\n });";
$codex .= "\n }";
}
$codex .= "\n }";
$codex .= "\n";
$codex .= "\n function getdata(id, act, cb) {";
@ -753,6 +797,8 @@ if($hasedit){
continue;
if ($col == 'auditstatus' || $col == 'audittimes' || $col == 'audituser' || $col == 'auditmsg')
continue;
if ($saascode && $saascode[0] == $fld['col'])
continue;
$sgcol = (isset($fld['set']['colview']) ? $fld['set']['colview'] : '24');
$codex .= "\n html += '<div class=\"ciy-form col-24 col-sm-{$sgcol}\">';";
$codex .= "\n html += '<label>{$fld['name']}</label><div>';";

View File

@ -1,7 +1,8 @@
<?php
function code_pc_php($post) {
$schema = get('schema');
$tabname = get('table');
$schema = $post->get('schema', '', 'all');
$tabname = $post->get('table', '', 'all');
$subpath = $post->get('subpath', '', 'all');
$maindb = $post->get('_bcod_maindb', '', 'all');
$verifyfunc = $post->get('_bcod_verifyfunc', '', 'all');
$titname = $post->get('_bcod_titname', '', 'all');
@ -9,10 +10,10 @@ function code_pc_php($post) {
if ($saascode) {
$saascode = explode('=', $saascode);
if (count($saascode) == 1)
$saascode[1] = $saascode[0];
$saascode[1] = '';
}
$uploadpat = $post->get('_bcod_uploadpat', '', 'all');
$liiddict = $post->get('_bcod_liiddict', '', 'all');
$liiddict = str_replace('',',', $post->get('_bcod_liiddict', '', 'all'));
$tabdict = $post->get('_bcod_tabdict', '', 'all');
$selectorder = $post->get('_bcod_select_order', '', 'all');
$btntop_newline = $post->get('_bcod_btntop_newline', '', 'all');
@ -75,7 +76,7 @@ function code_pc_php($post) {
$codex .= "\nnamespace {$namespace};";
$codex .= "\n";
$codex .= "\nclass {$classname} {";
$codex .= "\n static function setwhere(\$db, \$post) {";
$codex .= "\n static function setwhere(\$db, \$post, \$rsuser) {";
$codex .= "\n \$query = \$post->get('query');";
$codex .= "\n \$csql = new \ciy\sql('{$tabname}');";
if (!empty($liiddict)) {
@ -187,9 +188,11 @@ function code_pc_php($post) {
if ($verifyfunc)
$codex .= "\n \$rsuser = {$verifyfunc}();";
$codex .= "\n \$post = new \ciy\post();";
$codex .= "\n list(\$where, \$csql) = self::setwhere(\$db, \$post);";
if ($saascode)
$codex .= "\n \$csql->where('{$saascode[0]}', \$rsuser['{$saascode[1]}']);";
$codex .= "\n list(\$where, \$csql) = self::setwhere(\$db, \$post, \$rsuser);";
if ($saascode){
if(!empty($saascode[1]))
$codex .= "\n \$csql->where('{$saascode[0]}', \$rsuser['{$saascode[1]}']);";
}
if (count($nocolumn) > 0) {
$codex .= "\n \$csql->column('!" . implode(',', $nocolumn) . "', \$db->getraw('show full fields from {$tabname}'));";
}
@ -207,6 +210,10 @@ function code_pc_php($post) {
$codex .= "\n foreach (\$field as \$fr => \$v) {";
$codex .= "\n if (get('_' . \$fr))";
$codex .= "\n \$field[\$fr]['c'] = ',' . \$field[\$fr]['c'];";
if ($saascode) {
$codex .= "\n if (\$fr == '{$saascode[0]}')";
$codex .= "\n \$field[\$fr]['c'] = ',' . \$field[\$fr]['c'];";
}
$codex .= "\n }";
if ($btnlist_line)
$codex .= "\n \$fshow = fieldadd(\$fshow, \$field, 0, '_btn', '操作');";
@ -230,7 +237,7 @@ function code_pc_php($post) {
$dbquery = isset($fld['set']['dbquery']) ? $fld['set']['dbquery'] : '';
$pspec = '';
if ($fld['breq']) {
$codex .= "\n if(!get('_' . '{$col}'))";
$codex .= "\n if(!get('_{$col}'))";
$pspec = ' ';
}
if ($dbquery == 'window') {
@ -309,6 +316,8 @@ function code_pc_php($post) {
foreach ($flds as $fld) {
if (!$fld['show'])
continue;
if ($saascode && $saascode[0] == $fld['col'])
continue;
$cate = $fld['cate'];
if ($cate == 'DB' || $cate == 'CATU' || $cate == 'CATS' || $cate == 'CATM') {
if (isset($fld['set']['listload']) && $fld['set']['listload'] == 'rel') {
@ -333,8 +342,10 @@ function code_pc_php($post) {
$codex .= "\n \$act = \$post->get('act');";
$codex .= "\n if (\$id > 0) {";
$codex .= "\n \$csql = new \ciy\sql('{$tabname}');";
if ($saascode)
$codex .= "\n \$csql->where('{$saascode[0]}', \$rsuser['{$saascode[1]}']);";
if ($saascode){
if(!empty($saascode[1]))
$codex .= "\n \$csql->where('{$saascode[0]}', \$rsuser['{$saascode[1]}']);";
}
$codex .= "\n \$csql->where('id', \$id);";
$codex .= "\n \$row = \$db->getone(\$csql);";
$codex .= "\n if (!is_array(\$row))";
@ -410,10 +421,13 @@ function code_pc_php($post) {
if (!empty($fld['set']['noup']))
continue;
$col = $fld['col'];
$cate = $fld['cate'];
$name = $fld['name'];
$type = $fld['type'];
if ($type == 'bigint' || $type == 'int' || $type == 'double' || $type == 'float')
$codex .= "\n if (\${$col} == 0)";
else if ($cate == 'MD')
$codex .= "\n if (\${$col} == '[MD]')";
else
$codex .= "\n if (empty(\${$col}))";
$codex .= "\n return errjson('请填写{$name}');";
@ -422,8 +436,10 @@ function code_pc_php($post) {
$codex .= "\n \$datarow = null;";
$codex .= "\n if (\$id > 0) {";
$codex .= "\n \$csql = new \ciy\sql('{$tabname}');";
if ($saascode)
$codex .= "\n \$csql->where('{$saascode[0]}', \$rsuser['{$saascode[1]}']);";
if ($saascode) {
if(!empty($saascode[1]))
$codex .= "\n \$csql->where('{$saascode[0]}', \$rsuser['{$saascode[1]}']);";
}
$codex .= "\n \$csql->where('id', \$id);";
$codex .= "\n \$datarow = \$db->getone(\$csql);";
$codex .= "\n if (!is_array(\$datarow))";
@ -431,8 +447,10 @@ function code_pc_php($post) {
$codex .= "\n }";
} else {
$codex .= "\n \$csql = new \ciy\sql('{$tabname}');";
if ($saascode)
$codex .= "\n \$csql->where('{$saascode[0]}', \$rsuser[{$saascode[1]}']);";
if ($saascode) {
if(!empty($saascode[1]))
$codex .= "\n \$csql->where('{$saascode[0]}', \$rsuser['{$saascode[1]}']);";
}
$codex .= "\n \$csql->where('id', \$id);";
$codex .= "\n \$datarow = \$db->getone(\$csql);";
$codex .= "\n if (!is_array(\$datarow))";
@ -448,21 +466,23 @@ function code_pc_php($post) {
}
if (count($dups) > 0) {
$codex .= "\n \$csql = new \ciy\sql('{$tabname}');";
if ($saascode)
$codex .= "\n \$csql->where('{$saascode[0]}', \$rsuser['{$saascode[1]}']);";
if ($saascode){
if(!empty($saascode[1]))
$codex .= "\n \$csql->where('{$saascode[0]}', \$rsuser['{$saascode[1]}']);";
}
foreach ($dups as $dup) {
$codex .= "\n \$csql->where('{$dup}', \${$dup});";
}
$codex .= "\n \$csql->column('id');";
$codex .= "\n \$chkid = (int)\$db->get1(\$csql);";
$codex .= "\n \$chkid = toint(\$db->get1(\$csql));";
$codex .= "\n if (\$chkid > 0 && ((\$id > 0 && \$chkid != \$id) || \$id == 0))";
$codex .= "\n throw new \Exception('数据已存在');";
$codex .= "\n throw new \Exception('CIYIGN数据已存在');";
}
$codex .= "\n \$updata = array();";
foreach ($flds as $fld) {
$col = $fld['col'];
// if($col == 'id' || $col == $saascode || $col == 'addtimes')
// continue;
if($col == 'id' || $col == 'addtimes')
continue;
// if($col == 'auditstatus' || $col == 'audittimes' || $col == 'audituser' || $col == 'auditmsg')
// continue;
// if($col == 'matterstatus' || $col == 'matternextuser' || $col == 'mattertimes')
@ -492,14 +512,17 @@ function code_pc_php($post) {
$codex .= "\n } else {";
foreach ($flds as $fld) {
$col = $fld['col'];
if ($fld['set']['noup'] == 'no') {
if ($col == 'id'){
}else if ($fld['set']['noup'] == 'no') {
if($fld['type'] == 'int' || $fld['type'] == 'bigint')
$codex .= "\n \$updata['{$col}'] = 0;";
else
$codex .= "\n \$updata['{$col}'] = '';";
} else if ($saascode && $col == $saascode[0])
$codex .= "\n \$updata['{$col}'] = \$rsuser['{$saascode[1]}'];";
} else if ($saascode && $col == $saascode[0]){
if(!empty($saascode[1]))
$codex .= "\n \$updata['{$col}'] = \$rsuser['{$saascode[1]}'];";
}
else if ($col == 'addtimes')
$codex .= "\n \$updata['{$col}'] = tostamp();";
else if ($col == 'auditstatus')
@ -522,10 +545,13 @@ function code_pc_php($post) {
$codex .= "\n \$db->commit();";
$codex .= "\n } catch (\Exception \$ex) {";
$codex .= "\n \$db->rollback();";
$codex .= "\n savelogfile('err_db', \$ex->getMessage());";
$codex .= "\n return errjson(\$ex->getMessage());";
$codex .= "\n }";
$codex .= "\n \$ret['data'] = \$updata;";
foreach ($flds as $fld) {
if ($saascode && $saascode[0] == $fld['col'])
continue;
$cate = $fld['cate'];
if ($cate == 'DB' || $cate == 'CATU' || $cate == 'CATS' || $cate == 'CATM') {
if (isset($fld['set']['listload']) && $fld['set']['listload'] == 'rel') {
@ -558,8 +584,10 @@ function code_pc_php($post) {
$codex .= "\n if (empty(\$ids))";
$codex .= "\n return errjson('请选择至少一条');";
$codex .= "\n \$csql = new \ciy\sql('{$tabname}');";
if ($saascode)
$codex .= "\n \$csql->where('{$saascode[0]}', \$rsuser['{$saascode[1]}']);";
if ($saascode){
if(!empty($saascode[1]))
$codex .= "\n \$csql->where('{$saascode[0]}', \$rsuser['{$saascode[1]}']);";
}
$codex .= "\n \$csql->where('id in', \$ids);";
$codex .= "\n \$rows = \$db->get(\$csql);";
$codex .= "\n \$vids = array();";
@ -581,6 +609,7 @@ function code_pc_php($post) {
$codex .= "\n \$db->commit();";
$codex .= "\n } catch (\Exception \$ex) {";
$codex .= "\n \$db->rollback();";
$codex .= "\n savelogfile('err_db', \$ex->getMessage());";
$codex .= "\n return errjson(\$ex->getMessage());";
$codex .= "\n }";
$codex .= "\n \$ret['ids'] = \$vids;";
@ -610,8 +639,10 @@ function code_pc_php($post) {
}
}
$codex .= "\n \$csql = new \ciy\sql('{$tabname}');";
if ($saascode)
$codex .= "\n \$csql->where('{$saascode[0]}', \$rsuser['{$saascode[1]}']);";
if ($saascode){
if(!empty($saascode[1]))
$codex .= "\n \$csql->where('{$saascode[0]}', \$rsuser['{$saascode[1]}']);";
}
$codex .= "\n \$csql->where('id in', \$ids);";
$codex .= "\n \$rows = \$db->get(\$csql);";
$codex .= "\n \$ids = array();";
@ -643,6 +674,7 @@ function code_pc_php($post) {
$codex .= "\n \$db->commit();";
$codex .= "\n } catch (\Exception \$ex) {";
$codex .= "\n \$db->rollback();";
$codex .= "\n savelogfile('err_db', \$ex->getMessage());";
$codex .= "\n return errjson(\$ex->getMessage());";
$codex .= "\n }";
$codex .= "\n \$ret['data'] = \$updata;";
@ -666,8 +698,10 @@ function code_pc_php($post) {
$codex .= "\n if (empty(\$ids))";
$codex .= "\n return errjson('请选择至少一条');";
$codex .= "\n \$csql = new \ciy\sql('{$tabname}');";
if ($saascode)
$codex .= "\n \$csql->where('{$saascode[0]}', \$rsuser['{$saascode[1]}']);";
if ($saascode){
if(!empty($saascode[1]))
$codex .= "\n \$csql->where('{$saascode[0]}', \$rsuser['{$saascode[1]}']);";
}
$codex .= "\n \$csql->where('id in', \$ids);";
$codex .= "\n \$rows = \$db->get(\$csql);";
$codex .= "\n \$ids = array();";
@ -687,6 +721,7 @@ function code_pc_php($post) {
$codex .= "\n \$db->commit();";
$codex .= "\n } catch (\Exception \$ex) {";
$codex .= "\n \$db->rollback();";
$codex .= "\n savelogfile('err_db', \$ex->getMessage());";
$codex .= "\n return errjson(\$ex->getMessage());";
$codex .= "\n }";
$codex .= "\n \$ret['data'] = \$updata;";
@ -704,7 +739,7 @@ function code_pc_php($post) {
$codex .= "\n // return errjson('您未被授权操作');";
$codex .= "\n \$post = new \\ciy\\post();";
$codex .= "\n list(\$where, \$csql) = self::setwhere(\$db, \$post);";
$codex .= "\n list(\$where, \$csql) = self::setwhere(\$db, \$post, \$rsuser);";
$codex .= "\n \$rows = \$db->get(\$csql);";
$codex .= "\n if (count(\$rows) > 10000)";
$codex .= "\n return errjson('将导出' . count(\$rows) . '条不建议超过1万条请筛选缩小范围');";
@ -712,6 +747,8 @@ function code_pc_php($post) {
foreach ($flds as $fld) {
if (!$fld['bout'])
continue;
if ($saascode && $saascode[0] == $fld['col'])
continue;
$col = $fld['col'];
$name = $fld['name'];
$cate = $fld['cate'];
@ -730,6 +767,8 @@ function code_pc_php($post) {
foreach ($flds as $fld) {
if (!$fld['bout'])
continue;
if ($saascode && $saascode[0] == $fld['col'])
continue;
$col = $fld['col'];
$cate = $fld['cate'];
if ($cate == 'BOOL') {
@ -763,6 +802,8 @@ function code_pc_php($post) {
foreach ($flds as $fld) {
if ($fld['col'] != 'id' && !$fld['bout'])
continue;
if ($saascode && $saascode[0] == $fld['col'])
continue;
$col = $fld['col'];
$cate = $fld['cate'];
$ext = '';
@ -952,6 +993,15 @@ function code_pc_php($post) {
$codex .= "\n \$uniques = array();";
$codex .= "\n \$id = 0;";
$codex .= "\n for (\$rowidx = \$xlsidx; \$rowidx < \$datacnt; \$rowidx++) {";
$codex .= "\n \$bfull = false;";
$codex .= "\n foreach (\$datas[\$rowidx] as \$dat) {";
$codex .= "\n if (empty(\$dat))";
$codex .= "\n continue;";
$codex .= "\n \$bfull = true;";
$codex .= "\n break;";
$codex .= "\n }";
$codex .= "\n if (!\$bfull)";
$codex .= "\n continue;";
$codex .= "\n \$lineidx = \$rowidx - \$xlsidx + 1;";
$codex .= "\n \$hrhtml = '';";
$codex .= "\n \$firsthtml = '<td><div>' . \$lineidx . '</div></td>';";
@ -979,7 +1029,7 @@ function code_pc_php($post) {
$codex .= "\n else {";
$codex .= "\n \$csqlchk = new \ciy\sql('{$tabname}');";
$codex .= "\n \$csqlchk->where('id', \$id)->column('id');";
$codex .= "\n \$chkid = (int)\$db->get1(\$csqlchk);";
$codex .= "\n \$chkid = toint(\$db->get1(\$csqlchk));";
$codex .= "\n if (\$chkid != \$id)";
$codex .= "\n \$errmsg = \$name . '在数据库中不存在';";
$codex .= "\n \$value = \$id;";
@ -1096,7 +1146,7 @@ function code_pc_php($post) {
$codex .= "\n \$errmsg = \$name . '文字与系统数据不匹配';";
} else if ($cate == 'CYC') {
$codex .= "\n \$last = substr(\$showdat, -3);";
$codex .= "\n \$dd = (int)substr(\$showdat, 0, -3);";
$codex .= "\n \$dd = toint(substr(\$showdat, 0, -3));";
$codex .= "\n if (\$dd == 0) {";
$codex .= "\n \$errmsg = \$name . '周期数字错误';";
$codex .= "\n } else if (\$last == '天') {";
@ -1160,11 +1210,11 @@ function code_pc_php($post) {
$codex .= "\n \$errmsg = \$name . '不是数字';";
$codex .= "\n else";
if ($bet > 1)
$codex .= "\n \$value = (int)((float)\$showdat * {$bet});";
$codex .= "\n \$value = toint((float)\$showdat * {$bet});";
else if ($type == 'double' || $type == 'float')
$codex .= "\n \$value = (float)\$showdat;";
else
$codex .= "\n \$value = (int)\$showdat;";
$codex .= "\n \$value = toint(\$showdat);";
if (!empty($unit))
$codex .= "\n \$showdat .= '{$unit}';";
}
@ -1190,7 +1240,7 @@ function code_pc_php($post) {
$codex .= "\n else {";
$codex .= "\n \$uniques[] = \$unq;";
$codex .= "\n \$csql->column('id');";
$codex .= "\n \$chkid = (int)\$db->get1(\$csql);";
$codex .= "\n \$chkid = toint(\$db->get1(\$csql));";
$codex .= "\n if (\$chkid > 0 && ((\$id > 0 && \$chkid != \$id) || \$id == 0))";
$codex .= "\n \$firsthtml = '<td style=\"background:#ffe8c5;\" title=\"#' . \$lineidx . ':该行与数据库数据有重复\"><div class=\"lang\">重复</div></td>';";
$codex .= "\n }";
@ -1226,15 +1276,17 @@ function code_pc_php($post) {
}
if (count($dups) > 0) {
$codex .= "\n \$csql = new \ciy\sql('{$tabname}');";
if ($saascode)
$codex .= "\n \$csql->where('{$saascode[0]}', \$rsuser['{$saascode[1]}']);";
if ($saascode){
if(!empty($saascode[1]))
$codex .= "\n \$csql->where('{$saascode[0]}', \$rsuser['{$saascode[1]}']);";
}
foreach ($dups as $dup) {
$codex .= "\n \$csql->where('{$dup}', \${$dup});";
}
$codex .= "\n \$csql->column('id');";
$codex .= "\n \$chkid = (int)\$db->get1(\$csql);";
$codex .= "\n \$chkid = toint(\$db->get1(\$csql));";
$codex .= "\n if (\$chkid > 0 && ((\$id > 0 && \$chkid != \$id) || \$id == 0))";
$codex .= "\n throw new \Exception('发现数据有重复');";
$codex .= "\n throw new \Exception('CIYIGN发现数据有重复');";
}
$codex .= "\n \$updata = array();";
foreach ($flds as $fld) {
@ -1249,8 +1301,10 @@ function code_pc_php($post) {
$codex .= "\n if (\$id == 0) {";
foreach ($flds as $fld) {
$col = $fld['col'];
if ($saascode && $col == $saascode[0])
$codex .= "\n \$updata['{$col}'] = \$rsuser['{$saascode[1]}'];";
if ($saascode && $col == $saascode[0]){
if(!empty($saascode[1]))
$codex .= "\n \$updata['{$col}'] = \$rsuser['{$saascode[1]}'];";
}
if ($col == 'addtimes')
$codex .= "\n \$updata['{$col}'] = tostamp();";
if ($col == 'auditstatus')
@ -1269,6 +1323,7 @@ function code_pc_php($post) {
$codex .= "\n \$db->commit();";
$codex .= "\n } catch (\Exception \$ex) {";
$codex .= "\n \$db->rollback();";
$codex .= "\n savelogfile('err_db', \$ex->getMessage());";
$codex .= "\n return errjson(\$ex->getMessage());";
$codex .= "\n }";
$codex .= "\n return succjson();";

View File

@ -0,0 +1,143 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1">
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
<link href="/jscss/style.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" charset="utf-8" src="/jscss/theme.js"></script>
</head>
<body>
<div class="container">
<form class="search" onsubmit="table.search(this,'btn');return false;">
<ul></ul>
<div>
<div class="sinps"></div>
<div class="sbtns">
<a class="lang btn" onclick="edit(0)">添加</a>
</div>
</div>
</form>
<div class="table">
<div class="loading col-24">Loading...</div>
<div class="list"></div>
<div>
<div class="btmbtn">
<a class="lang btn def" onclick="ciyfn.select_all(table)">全选</a>
<a class="lang btn def" onclick="ciyfn.select_diff(table)">反选</a>
|
<a class="lang btn dag" onclick="ciyfn.select_callfunc(table, this, 'del','已选{n}条,是否批量删除?', {},function(json){table.delline(json)})">批量删除</a>
</div>
<div class="page"></div>
</div>
</div>
</div>
<div id="alert_edit" style="display:none;">
<div class="char4 row">
<div class="ciy-form col-24 col-sm-24">
<label class="lang">名称</label>
<div>
<input type="text" name="name" style="width:100%;" />
</div>
</div>
<div class="ciy-form col-24 col-sm-24">
<label class="lang">数据库</label>
<div>
<ciy-select com="schem" />
</div>
</div>
<div class="ciy-form col-24 col-sm-24">
<label class="lang">相对路径</label>
<div>
<input type="text" name="subpath" style="width:100%;" />
</div>
</div>
</div>
</div>
<script type="text/javascript" src="/jscss/ciy.js"></script>
<script type="text/javascript" src="/jscss/ciycmp.js"></script>
<script type="text/javascript" src="/jscss/ciytable.js"></script>
<script type="text/javascript" src="../common.js"></script>
<script type="text/javascript">
'use strict';
var table;
var Glob = {};
ciyfn.pageload(function () {
//Glob.urlp = ciyfn.urlparam();
table = new ciyclass.table({
dom: '.table'
, url: 'list'
, pagecount: 10
, fn_beforedata: function (json) {
ciyfn.fillsearch({
searchdom: '.search'
, data: json
});
return json;
}
, fn_tdcontent: function (key, datashow, field, data) {
if (key == '_btn') {
var html = '';
html += `<a class="lang btn" onclick="menubtn(this, 'edit')">修改</a>`;
html += `<a class="lang btn succ" onclick="menubtn(this, 'table')">数据表</a>`;
return html;
}
}
, fn_done: function (json) {
// table.mergecol('auditstatus');
// table.mergefix('总计', 'center', 6, 0, 8, 1);
// table.footertotal();
}
});
table.callpage(1);
});
function menubtn(dom, btn) {
var id = $5(dom).parent('tr').attr('data-id');
if (btn == 'edit') {
edit(id);
}
if (btn == 'table') {
window.open('code_list.html?dbcid=' + id);
}
}
function getdata(id, act, cb) {
ciyfn.callfunc('getdata', { id: id, act: act }, function (json) {
cb(json);
});
}
function edit(id) {
getdata(id, 'edit', function (jsndat) {
ciyfn.alert({
title: id == 0 ? '新建' : '修改'
, width: 'mb'
, content: document.getElementById("alert_edit").innerHTML
//, noparent:true
, fn_showed: function (doc, dom) {
var dat = jsndat.data;
$5('[name=name]', dom).val(dat.name);
ciycmp({ dom: $5('[com=schem]', dom), value: dat.schem, range: jsndat.schema });
$5('[name=subpath]', dom).val(dat.subpath);
}
, cb: function (opn) {
if (opn.btn == "关闭")
return opn.close();
opn.inputs.id = id;
if (ciyfn.throttle(opn.dombtn)) return;
ciyfn.callfunc('update', opn.inputs, function (json) {
table.updateline(json);
opn.close();
ciyfn.toast('提交成功');
});
},
btns: id > 0 ? ["提交", "*关闭"] : ["新建", "*关闭"],
});
});
}
</script>
</body>
</html>

View File

@ -0,0 +1,150 @@
<?php
namespace web\admin\develop;
class code_saas {
static function setwhere($db, $post) {
$query = $post->get('query');
$csql = new \ciy\sql('zc_dev_dbsaas');
$order = objstr($query, 'order', 'id desc');
$csql->order($order);
$query['order'] = $order;
return [$query, $csql];
}
public static function json_list() {
global $db;
$rsuser = verifyfast();
$post = new \ciy\post();
list($where, $csql) = self::setwhere($db, $post);
$pageno = $post->getint('pageno', 1);
$pagecount = $post->getint('pagecount', 10);
$csql->limit($pageno, $pagecount);
$mainrowcount = $post->getint('count');
$rows = $db->get($csql, $mainrowcount);
if($rows === false)
return errjson($db->error);
$ret = array('where' => $where, 'pageno' => $pageno, 'pagecount' => $pagecount, 'count' => $mainrowcount, 'list' => $rows);
if ($post->getbool('field')) {
$field = array();
$fshow = $db->getfield($field, 'zc_dev_dbsaas');
foreach ($field as $fr => $v) {
if (get('_' . $fr))
$field[$fr]['c'] = ',' . $field[$fr]['c'];
}
$fshow = fieldadd($fshow, $field, 0, '_btn', '操作');
$ret['field'] = $field;
$ret['fshow'] = $fshow;
}
if ($post->getbool('once')) {
$ret['once'] = array();
}
return succjson($ret);
}
public static function json_getdata() {
global $db;
$rsuser = verifyfast();
$post = new \ciy\post();
$id = $post->getint('id');
$act = $post->get('act');
if ($id > 0) {
$csql = new \ciy\sql('zc_dev_dbsaas');
$csql->where('id', $id);
$row = $db->getone($csql);
if (!is_array($row))
return errjson('数据不存在');
} else {
$row = array();
}
$ret['data'] = $row;
if ($act == 'edit') {
$csql = new \ciy\sql('INFORMATION_SCHEMA.SCHEMATA');
$csql->column('SCHEMA_NAME as id,SCHEMA_NAME as name');
$sehrows = $db->get($csql);
$ret['schema'] = $sehrows;
}
return succjson($ret);
}
public static function json_update() {
global $db;
$rsuser = verifyfast();
//if (nopower($db, $rsuser['id'], 'p u'))
// return errjson('您未被授权操作');
$post = new \ciy\post();
$id = $post->getint('id');
$name = $post->get('name');
$schem = $post->get('schem');
$subpath = $post->get('subpath');
$datarow = null;
if ($id > 0) {
$csql = new \ciy\sql('zc_dev_dbsaas');
$csql->where('id', $id);
$datarow = $db->getone($csql);
if (!is_array($datarow))
return errjson('数据不存在');
}
try {
$db->begin();
$updata = array();
$updata['name'] = $name;
$updata['schem'] = $schem;
$updata['subpath'] = $subpath;
$csql = new \ciy\sql('zc_dev_dbsaas');
if ($id > 0) {
$csql->where('id', $id);
if ($db->update($csql, $updata) === false)
throw new \Exception('更新失败:' . $db->error);
} else {
$updata['id'] = 0;
if ($db->insert($csql, $updata) === false)
throw new \Exception('新增失败:' . $db->error);
$id = $db->insert_id();
}
$updata['id'] = $id;
//savelogdb($db, $rsuser['id'], 'zc_dev_dbsaas', $datarow, $updata);
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['data'] = $updata;
$ret['hf_providerbase'] = getrelation($db, [$updata], 'hf_providerbase', 'providerid');
return succjson($ret);
}
public static function json_del() {
global $db;
$rsuser = verifyfast();
//if (nopower($db, $rsuser['id'], 'p d'))
// return errjson('您未被授权操作');
$post = new \ciy\post();
$ids = $post->get('ids');
if (empty($ids))
return errjson('请选择至少一条');
$csql = new \ciy\sql('zc_dev_dbsaas');
$csql->where('id in', $ids);
$rows = $db->get($csql);
$vids = array();
try {
$db->begin();
foreach ($rows as $row) {
$delid = $row['id'];
//delcheck($db, $delid, 'tablexx', 'xxid', '管理员');
//delall($db, $delid, 'tablexx', 'xxid', '运动员'); //deltimeall
delme($db, $delid, 'zc_dev_dbsaas');
savelogdb($db, $rsuser['id'], 'zc_dev_dbsaas', $row, null);
$vids[] = $delid;
}
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['ids'] = $vids;
return succjson($ret);
}
}

View File

@ -67,6 +67,7 @@ class note {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
if ($id > 0)

View File

@ -37,7 +37,7 @@ func Index_init(w http.ResponseWriter, r *http.Request) bool {
menurows = append(menurows, menu)
}
csql = c.NewCiySQL("zc_mnufav")
csql.Where("user", userid).Column("menuid")
csql.Where("favtarget", 10).Where("user", userid).Column("menuid")
mnufavrows, _, err := c.CiyDB.Get(csql)
if err != nil {
return c.ErrJSON(w, "遇到mnufav读取错误", err)
@ -62,13 +62,14 @@ func Index_favadd(w http.ResponseWriter, r *http.Request) bool {
}
menuid := post.Getint("id")
csql := c.NewCiySQL("zc_mnufav")
csql.Where("user", userid).Where("menuid", menuid)
csql.Where("favtarget", 10).Where("user", userid).Where("menuid", menuid)
favrow, err := c.CiyDB.Getone(csql)
if err != nil {
return c.ErrJSON(w, "遇到fav读取错误", err)
}
if favrow == nil {
updata := map[string]any{}
updata["favtarget"] = 10
updata["user"] = userid
updata["menuid"] = menuid
updata["addtimes"] = c.Tostamp()
@ -88,7 +89,7 @@ func Index_favdel(w http.ResponseWriter, r *http.Request) bool {
}
menuid := post.Getint("id")
csql := c.NewCiySQL("zc_mnufav")
csql.Where("user", userid).Where("menuid", menuid)
csql.Where("favtarget", 10).Where("user", userid).Where("menuid", menuid)
_, err := c.CiyDB.Delete(csql)
if err != nil {
return c.ErrJSON(w, "删除fav失败", err)

View File

@ -652,16 +652,6 @@
else
return 'data-href="' + url + '"';
}
function ciy_ifrclose(domtab) {
var txt = domtab.attr('data-tit');
var domifm = $5("#id_ifms>iframe[data-tit='" + txt + "']");
domifm[0].src = 'about:blank';
domifm[0].contentWindow.close();
setTimeout(function () {
domifm.remove();
}, 100);
domtab.remove();
}
$5('#nav_menu').html(html);
var lmenuact = opn.act;
var tabsdom = $5('#id_headertabs');
@ -696,7 +686,7 @@
thos.page_refresh();
});
tabsuldom.on('click', "i", function (e) {
ciy_ifrclose($5(e.currentTarget).parent('li'));
thos.page_ifrclose($5(e.currentTarget).parent('li'));
});
ciyclass.dragdom({
dom: tabsuldom
@ -904,6 +894,16 @@
if (domifm.length == 1)
domifm[0].contentWindow.location.reload(); //domifm.attr('src', domifm.attr('src'));
}
this.page_ifrclose = function (domtab) {
var txt = domtab.attr('data-tit');
var domifm = $5("#id_ifms>iframe[data-tit='" + txt + "']");
domifm[0].src = 'about:blank';
domifm[0].contentWindow.close();
setTimeout(function () {
domifm.remove();
}, 100);
domtab.remove();
}
this.headertabscroll = function (act) {
var width = tabsdom.width() * 2 / 3;
var sl = tabsdom[0].scrollLeft;
@ -963,6 +963,18 @@
if (event.data.func == 'manage_ifropen') {
Glob.manage.page_ifropen(event.data.url, event.data.name, event.data.ableclose, event.source);
}
if (event.data.func == 'manage_ifrclose') {
var domli;
if (event.data.name)
domli = $5('#id_headertabs_ul>li[data-tit="' + event.data.name + '"]');
else
domli = $5("#id_headertabs_ul>li.active");
if (domli.length == 0)
return;
Glob.manage.page_ifrclose(domli);
var domltab = $5('#id_headertabs_ul').children(-1);
Glob.manage.page_ifropen('', domltab.attr('data-tit'));
}
if (event.data.func == 'manage_fulldiv') {
if (event.data.full) {
$5('.ciy-body-main').css({ zIndex: null });

View File

@ -19,6 +19,7 @@ class index {
$ret['menu'][] = array('id' => 2, 'upid' => 0, 'name' => '您无任何菜单权限', 'url' => '', 'pow' => '', 'csort' => 0);
$csql = new \ciy\sql('zc_mnufav');
$csql->where('favtarget', 10);
$csql->where('user', $rsuser['id']);
$csql->column('menuid');
$ret['mnufav'] = $db->get($csql);
@ -32,11 +33,13 @@ class index {
$post = new \ciy\post();
$menuid = $post->getint('id');
$csql = new \ciy\sql('zc_mnufav');
$csql->where('favtarget', 10);
$csql->where('user', $rsuser['id']);
$csql->where('menuid', $menuid);
$favrow = $db->getone($csql);
if (!is_array($favrow)) {
$updata = array();
$updata['favtarget'] = 10;
$updata['user'] = $rsuser['id'];
$updata['menuid'] = $menuid;
$updata['addtimes'] = tostamp();
@ -51,6 +54,7 @@ class index {
$post = new \ciy\post();
$menuid = $post->getint('id');
$csql = new \ciy\sql('zc_mnufav');
$csql->where('favtarget', 10);
$csql->where('user', $rsuser['id']);
$csql->where('menuid', $menuid);
$db->delete($csql);

View File

@ -145,7 +145,6 @@
<div class="chr"></div>
<div class="ccopy">© 2024 众产<sup>®</sup></div>
<script type="text/javascript" src="/jscss/ciy.js"></script>
<script type="text/javascript" src="/jscss/md5.js"></script>
<script type="text/javascript" src="./common.js"></script>
<script type="text/javascript">
'use strict';
@ -162,14 +161,14 @@
});
}
});
function formsubmit(dom) {
async function formsubmit(dom) {
var postparam = ciyfn.getform(dom);
if (postparam.user == '')
return ciyfn.alert('请输入手机号');
if (postparam.pass == '')
return ciyfn.alert('请输入密码');
postparam.auth = (new Date()).getTime();
postparam.pass = hex_md5(hex_md5(postparam.pass + ciy_vars.tokensalt) + postparam.auth);
postparam.pass = await ciyfn.sha256(await ciyfn.sha256(postparam.pass + ciy_vars.tokensalt) + postparam.auth);
if (ciyfn.throttle(dom)) return;
ciyfn.callfunc("login", postparam, function (json) {
if (json.me)

View File

@ -31,16 +31,16 @@ class login {
}
$authtime = $post->getint('auth');
if (abs($authtime / 1000 - tostamp()) > 300)
return errjson('您的本地时间与服务器时间相差超过5分钟请调整本机时间。<br/>服务器时间: ' . date('Y-m-d H:i:s') . '<br/>您本机时间: ' . date('Y-m-d H:i:s', (int)($authtime / 1000)));
return errjson('您的本地时间与服务器时间相差超过5分钟请调整本机时间。<br/>服务器时间: ' . date('Y-m-d H:i:s') . '<br/>您本机时间: ' . date('Y-m-d H:i:s', $authtime / 1000));
if ($post->get('pass') != md5($rsuser['password'] . $authtime)) {
if ($post->get('pass') != sha256($rsuser['password'] . $authtime)) {
$updata = array();
$updata['trytime'] = array('trytime+1');
$updata['logintimes'] = tostamp();
$csql = new \ciy\sql('zc_admin');
$csql->where('id', $rsuser['id']);
$db->update($csql, $updata);
savelog($db, $rsuser['id'], 'LOGINERR', '用户[' . $user . ']登录密码错误 密码1:[' . md5('1' . $_token['salt']) . ']');
savelog($db, $rsuser['id'], 'LOGINERR', '用户[' . $user . ']登录密码错误 密码1:[' . sha256('1' . $_token['salt']) . ']');
return errjson('用户名或密码错误.');
}
$id = $rsuser['id'];
@ -120,8 +120,6 @@ class login {
$ret['me']['sex'] = $userrow['sex'];
$ret['me']['name'] = $userrow['name'];
$power = $userrow['power'];
if ($userrow['id'] == 10)
$power = '.*.';
$ret['me']['power'] = $power;
$ret['me']['needpass'] = empty($userrow['password']);
return succjson($ret);
@ -134,7 +132,7 @@ class login {
$csql->where('id', $rsuser['_o']);
$db->delete($csql);
}
savelog($db, (int)@$rsuser['id'], 'LOGIN', '退出登录');
savelog($db, toint(@$rsuser['id']), 'LOGIN', '退出登录');
return succjson();
}
}

View File

@ -89,8 +89,6 @@ class admin {
$rsuser = verifyfast();
$post = new \ciy\post();
$id = $post->getint('id');
if($id == 10)
return errjson('演示账号不能操作');
$name = $post->get('name');
if (empty($name))
return errjson('请填写姓名');
@ -140,9 +138,9 @@ class admin {
$csql = new \ciy\sql('zc_admin');
$csql->where('mobile', $mobile);
$csql->column('id');
$chkid = (int)$db->get1($csql);
$chkid = toint($db->get1($csql));
if ($chkid > 0 && (($id > 0 && $chkid != $id) || $id == 0))
throw new \Exception('数据已存在');
throw new \Exception('CIYIGN数据已存在');
$updata = array();
$updata['icon'] = $icon;
@ -183,6 +181,7 @@ class admin {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['data'] = $updata;
@ -206,12 +205,10 @@ class admin {
$db->begin();
foreach ($rows as $row) {
$delid = $row['id'];
if($delid == 10)
return errjson('演示账号不能操作');
if ($rsuser['id'] == $delid)
throw new \Exception('不能删除本人');
throw new \Exception('CIYIGN不能删除本人');
if ($row['id'] == 10)
throw new \Exception('不能删除超级管理员');
throw new \Exception('CIYIGN不能删除超级管理员');
delme($db, $delid, 'zc_admin');
$db->execute('delte from zc_online where user=?', array($delid));
savelogdb($db, $rsuser['id'], 'zc_admin', $row, null);
@ -220,6 +217,7 @@ class admin {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$db->execute('update zc_online set usrchg=2');
@ -229,19 +227,17 @@ class admin {
public static function json_repass() {
global $db;
$rsuser = verifyfast();
global $tokensalt;
global $_token;
if (nopower($db, $rsuser['id'], 'p500p'))
return errjson('您未被授权操作');
$post = new \ciy\post();
$id = $post->getint('id');
if($id == 10)
return errjson('演示账号不能操作');
$newpass = rand(1000, 9999);
$newpass = rand(100000, 999999);
try {
$db->begin();
$updata = array();
$updata['trytime'] = 0;
$updata['password'] = md5($newpass . $tokensalt);
$updata['password'] = sha256($newpass . $_token['salt']);
$csql = new \ciy\sql('zc_admin');
$csql->where('id', $id);
if ($db->update($csql, $updata) === false)
@ -251,6 +247,7 @@ class admin {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['msg'] = '重置后密码: ' . $newpass;
@ -410,7 +407,7 @@ class admin {
else {
$csqlchk = new \ciy\sql('zc_admin');
$csqlchk->where('id', $id)->column('id');
$chkid = (int)$db->get1($csqlchk);
$chkid = toint($db->get1($csqlchk));
if ($chkid != $id)
$errmsg = $name . '在数据库中不存在';
$value = $id;
@ -462,7 +459,7 @@ class admin {
else {
$uniques[] = $unq;
$csql->column('id');
$chkid = (int)$db->get1($csql);
$chkid = toint($db->get1($csql));
if ($chkid > 0 && (($id > 0 && $chkid != $id) || $id == 0))
$firsthtml = '<td style="background:#ffe8c5;" title="#' . $lineidx . ':该行与数据库数据有重复"><div class="lang">重复</div></td>';
}
@ -493,9 +490,9 @@ class admin {
$csql = new \ciy\sql('zc_admin');
$csql->where('mobile', $mobile);
$csql->column('id');
$chkid = (int)$db->get1($csql);
$chkid = toint($db->get1($csql));
if ($chkid > 0 && (($id > 0 && $chkid != $id) || $id == 0))
throw new \Exception('发现数据有重复');
throw new \Exception('CIYIGN发现数据有重复');
$updata = array();
$updata['name'] = $name;
@ -517,6 +514,7 @@ class admin {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$db->execute('update zc_online set usrchg=2');

View File

@ -91,9 +91,9 @@ class autotask {
$csql = new \ciy\sql('zc_autotask');
$csql->where('name', $name);
$csql->column('id');
$chkid = (int)$db->get1($csql);
$chkid = toint($db->get1($csql));
if ($chkid > 0 && (($id > 0 && $chkid != $id) || $id == 0))
throw new \Exception('数据已存在');
throw new \Exception('CIYIGN数据已存在');
$updata = array();
$updata['name'] = $name;
@ -119,6 +119,7 @@ class autotask {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['data'] = $updata;
@ -150,6 +151,7 @@ class autotask {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['ids'] = $vids;
@ -182,6 +184,7 @@ class autotask {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['data'] = $updata;

View File

@ -87,6 +87,7 @@ class autotskrun {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['ids'] = $vids;

View File

@ -145,7 +145,7 @@
if (data['id'] == 0) {
var html = '';
if (table.once.issub)
html += '<ciy-checkbox com="upcheck" range="' + ciyfn.lang('子码') + '" style="margin-right: 0.3em;"></ciy-checkbox>';
html += '<ciy-checkbox com="upcheck" text="' + ciyfn.lang('子码') + '" style="margin-right: 0.3em;"></ciy-checkbox>';
html += '<input style="width:100%;" onclick="event.stopPropagation();" onkeydown="btnset(this)" type="text" name="' + key + '" value="' + data['name'] + '"/>';
return { divprop: ' style="display: flex;"', datashow: html };
}

View File

@ -118,9 +118,9 @@ class cata {
$csql = new \ciy\sql('zc_cata');
$csql->where('cbid', $cbid)->where('codeid', $codeid);
$csql->column('id');
$chkid = (int)$db->get1($csql);
$chkid = toint($db->get1($csql));
if ($chkid > 0 && (($id > 0 && $chkid != $id) || $id == 0))
throw new \Exception('代码值重复');
throw new \Exception('CIYIGN代码值重复');
$updata = array();
$updata['name'] = $name;
@ -146,6 +146,7 @@ class cata {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$db->execute('update zc_online set usrchg=2');
@ -182,9 +183,9 @@ class cata {
$csql = new \ciy\sql('zc_cata');
$csql->where('cbid', $row['cbid']);
$csql->where('upid', $delid);
$downcnt = (int)$db->get1($csql);
$downcnt = toint($db->get1($csql));
if ($downcnt > 0)
throw new \Exception('[' . $row['name'] . ']有' . $downcnt . '个子码,请先删除子码');
throw new \Exception('CIYIGN[' . $row['name'] . ']有' . $downcnt . '个子码,请先删除子码');
foreach ($exs as $exn) {
if (empty($exn))
continue;
@ -200,6 +201,7 @@ class cata {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$db->execute('update zc_online set usrchg=2');
@ -304,6 +306,7 @@ class cata {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
if ($cnt > 0) {

View File

@ -82,11 +82,9 @@ class cataindex {
$csql = new \ciy\sql('zc_cata');
$csql->where('cbid=0')->where('codeid', $codeid);
$csql->column('id');
$chkid = (int)$db->get1($csql);
$chkid = toint($db->get1($csql));
if ($chkid > 0 && (($id > 0 && $chkid != $id) || $id == 0))
throw new \Exception('该库代码重复');
throw new \Exception('CIYIGN该库代码重复');
$updata = array();
$updata['upid'] = $upid;
$updata['csort'] = $csort;
@ -109,6 +107,7 @@ class cataindex {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['data'] = $updata;
@ -148,6 +147,7 @@ class cataindex {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['ids'] = $vids;
@ -165,7 +165,7 @@ class cataindex {
$csql->order('id desc');
$csql->column('id');
$valid = $db->get1($csql);
$ret['valid'] = (int)($valid / 50) * 50 + 50;
$ret['valid'] = toint($valid / 50) * 50 + 50;
return succjson($ret);
}
@ -244,6 +244,7 @@ class cataindex {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['data'] = $updata;

View File

@ -52,8 +52,9 @@
<script type="text/javascript" src="../common.js"></script>
<script type="text/javascript">
'use strict';
function update(dom) {
async function update(dom) {
var postparam = ciyfn.getform(dom);
console.log(postparam);
if (postparam.oldpass == "")
return ciyfn.alert("请填写原密码");
if (postparam.newpass == "")
@ -62,8 +63,25 @@
return ciyfn.alert("新旧密码不要相同");
if (postparam.newpass != postparam.pass2)
return ciyfn.alert("两次填写的密码要相同");
if (postparam.newpass.length < 6)
return errjson('新密码应至少6位');
if (!/[@#$%^&*()_+!]/.test(postparam.newpass))
return ciyfn.alert('新密码应包含特殊符号@#$%^&*()_+!');
if (!/[a-z]/.test(postparam.newpass))
return ciyfn.alert('新密码应包含小写字母');
if (!/[A-Z]/.test(postparam.newpass))
return ciyfn.alert('新密码应包含大写字母');
if (!/[0-9]/.test(postparam.newpass))
return ciyfn.alert('新密码应包含数字');
postparam.oldpass = await ciyfn.sha256(postparam.oldpass + ciy_vars.tokensalt);
postparam.newpass = await ciyfn.sha256(postparam.newpass + ciy_vars.tokensalt);
delete postparam.pass2;
ciyfn.callfunc("update", postparam, function (json) {
ciyfn.alert('密码修改成功');
var me = ciyfn.getstorage(ciy_vars.tokenfield);
me.needpass = false;
ciyfn.setstorage(ciy_vars.tokenfield, me);
ciyfn.sendsignal(window.top, 'manage_ifrclose');
});
}
function storagesize() {

View File

@ -5,7 +5,6 @@ class chgpass {
public static function json_update() {
global $db;
$rsuser = verifyfast();
global $tokensalt;
$post = new \ciy\post();
if($rsuser['id'] == 10)
return errjson('演示账号不能操作');
@ -15,35 +14,26 @@ class chgpass {
$newpass = $post->get('newpass');
if (empty($newpass))
return errjson('请输入新密码.');
if (strlen($newpass) < 6)
return errjson('密码应至少6位');
// if (!preg_match('/[@#$%^&*()_+!]/', $newpass))
// return errjson('密码应包含特殊符号@#$%^&*()_+!等');
// if (!preg_match('/[a-z]/', $newpass))
// return errjson('密码应包含小写字母');
// if (!preg_match('/[A-Z]/', $newpass))
// return errjson('密码应包含大写字母');
// if (!preg_match('/[0-9]/', $newpass))
// return errjson('密码应包含数字');
$csql = new \ciy\sql('zc_admin');
$csql->where('id', $rsuser['id']);
$userrow = $db->getone($csql);
if (!is_array($userrow))
return errjson('用户不存在');
if ($userrow['password'] != md5($oldpass . $tokensalt))
if ($userrow['password'] != $oldpass)
return errjson('原密码错误.');
try {
$db->begin();
$updata = array();
$updata['password'] = md5($newpass . $tokensalt);
$updata['password'] = $newpass;
$csql = new \ciy\sql('zc_admin');
$csql->where('id', $rsuser['id']);
if ($db->update($csql, $updata) === false)
throw new \Exception('更新失败:' . $db->error);
savelog($db, $rsuser['id'], 'PASSWORD', '修改密码:' . $updata['password']);
savelog($db, $rsuser['id'], 'PASSWORD', '修改密码');
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
return succjson();

View File

@ -75,9 +75,9 @@ class config {
$csql = new \ciy\sql('zc_config');
$csql->where('types', $types);
$csql->column('id');
$chkid = (int)$db->get1($csql);
$chkid = toint($db->get1($csql));
if ($chkid > 0 && (($id > 0 && $chkid != $id) || $id == 0))
throw new \Exception('代码重复');
throw new \Exception('CIYIGN代码重复');
$updata = array();
$updata['types'] = $types;
@ -97,6 +97,7 @@ class config {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['data'] = $updata;
@ -128,6 +129,7 @@ class config {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['ids'] = $vids;

View File

@ -95,9 +95,9 @@ class debug_user {
$csql->where('targettype', $targettype);
$csql->where('user', $user);
$csql->column('id');
$chkid = (int)$db->get1($csql);
$chkid = toint($db->get1($csql));
if ($chkid > 0 && (($id > 0 && $chkid != $id) || $id == 0))
throw new \Exception('数据已存在');
throw new \Exception('CIYIGN数据已存在');
$updata = array();
$updata['targettype'] = $targettype;
@ -120,6 +120,7 @@ class debug_user {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['data'] = $updata;
@ -152,6 +153,7 @@ class debug_user {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['ids'] = $vids;

View File

@ -70,6 +70,7 @@ class depart {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
return succjson();
@ -101,6 +102,7 @@ class depart {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['ids'] = $vids;
@ -133,6 +135,7 @@ class depart {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
return succjson();
@ -169,6 +172,7 @@ class depart {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
if ($cnt == 0)

View File

@ -84,6 +84,7 @@ class funcslow {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['ids'] = $vids;

View File

@ -105,6 +105,7 @@ class logdb {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['ids'] = $vids;
@ -142,6 +143,7 @@ class logdb {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['ids'] = $vids;

View File

@ -70,9 +70,10 @@ class menu {
$url = '';
$urldb = '';
$pow = '';
$demo = '';
$csql = new \ciy\sql('zc_menu');
$csql->where('upid', $id);
$downcnt = (int)$db->get1($csql);
$downcnt = toint($db->get1($csql));
if ($downcnt == 0) {
$url = $post->get('url', '', 'all');
$urldb = $url;
@ -103,6 +104,7 @@ class menu {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret = array();
@ -139,6 +141,7 @@ class menu {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['ids'] = $vids;
@ -178,6 +181,7 @@ class menu {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
return succjson();
@ -221,6 +225,7 @@ class menu {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
if ($cnt == 0)
@ -279,6 +284,7 @@ class menu {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
return succjson();

View File

@ -92,9 +92,9 @@ class mock {
$csql->where('upath', $upath);
$csql->where('ufunc', $ufunc);
$csql->column('id');
$chkid = (int)$db->get1($csql);
$chkid = toint($db->get1($csql));
if ($chkid > 0 && (($id > 0 && $chkid != $id) || $id == 0))
throw new \Exception('类函数重复');
throw new \Exception('CIYIGN类函数重复');
$updata = array();
$updata['name'] = $name;
@ -116,6 +116,7 @@ class mock {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['data'] = $updata;
@ -146,6 +147,7 @@ class mock {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['ids'] = $vids;

View File

@ -83,6 +83,7 @@ class online {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['ids'] = $vids;

View File

@ -95,9 +95,9 @@ class power {
$csql = new \ciy\sql('zc_power');
$csql->where('scope', $scope);
$csql->column('id');
$chkid = (int)$db->get1($csql);
$chkid = toint($db->get1($csql));
if ($chkid > 0 && (($id > 0 && $chkid != $id) || $id == 0))
throw new \Exception('模块代码重复');
throw new \Exception('CIYIGN模块代码重复');
$updata = array();
$updata['groupname'] = $groupname;
@ -120,6 +120,7 @@ class power {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['data'] = $updata;
@ -151,6 +152,7 @@ class power {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['ids'] = $vids;

View File

@ -75,6 +75,7 @@ class role {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['ids'] = $vids;

View File

@ -87,6 +87,7 @@ class role_u {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['data'] = $updata;

View File

@ -271,10 +271,10 @@ class statsdb {
$status[$name] = array('value' => $val, 'help' => $help);
}
}
$uptime = (int)$status['Uptime']['value'];
$uptime = toint($status['Uptime']['value']);
if ($uptime > 0) {
$ret['qps'] = (float)$status['Questions']['value'] / $uptime;
$ret['tps'] = ((int)$status['Com_commit']['value'] + (int)$status['Com_rollback']['value']) / $uptime;
$ret['tps'] = (toint($status['Com_commit']['value']) + toint($status['Com_rollback']['value'])) / $uptime;
}
$ret['stats'] = $status;
return succjson($ret);

View File

@ -83,6 +83,7 @@ class statsfunc {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['ids'] = $vids;

View File

@ -87,10 +87,11 @@
<script type="text/javascript" src="/jscss/ciy.js"></script>
<script type="text/javascript" src="./common.js"></script>
<script type="text/javascript">
//众产区块链前端框架。源码透明可审计,建立无条件信任秩序。
'use strict';
ciyfn.pageload(function () {
ciyfn.callfunc("init", {}, function (json) {
var me = ciyfn.getstorage(ciy_vars.tokenfield)
var me = ciyfn.getstorage(ciy_vars.tokenfield);
$5('#id_name').html(ciyfn.lang(me.name));
$5('#id_depart').html(ciyfn.lang(me.depart));
$5('#id_addtimes').html(ciyfn.todatetime(me.addtimes, 'Y年m月d日'));
@ -119,7 +120,10 @@
var html = '';
for (var i in json.works) {
html += '<div><a onclick="ciyfn.sendsignal(window.top, \'manage_ifropen\', {url: \'' + json.works[i].url + '\', name: \'' + (json.works[i].tab ? json.works[i].tab : '待办任务') + '\'});">' + ciyfn.lang(json.works[i].title) + '</a></div>';
if(json.works[i].url)
html += '<div><a onclick="ciyfn.sendsignal(window.top, \'manage_ifropen\', {url: \'' + json.works[i].url + '\', name: \'' + (json.works[i].tab ? json.works[i].tab : '待办任务') + '\'});">' + ciyfn.lang(json.works[i].title) + '</a></div>';
else
html += '<div>' + ciyfn.lang(json.works[i].title) + '</div>';
}
if (html == '')
html = ciyfn.lang('暂无');

View File

@ -7,63 +7,23 @@ class welcome {
global $db;
$rsuser = verifyfast();
$works = array();
$csql = new \ciy\sql('ap_usr_real_apply');
$csql->where("auditstatus=20");
$cnt = (int)$db->get1($csql);
if ($cnt > 0)
$works[] = array('title' => '用户实名审核 待审批' . $cnt . '条', 'url' => 'expo/usr_real_apply.html?liid=20', 'tab' => '实名审核');
$csql = new \ciy\sql('ap_usr_collect_apply');
$csql->where("auditstatus=20");
$cnt = (int)$db->get1($csql);
$csql = new \ciy\sql('hf_adminrisk');
$csql->where("bread=2");
$cnt = toint($db->get1($csql));
if ($cnt > 0)
$works[] = array('title' => '采集员申请 待审批' . $cnt . '条', 'url' => 'expo/usr_collect_apply.html?liid=20', 'tab' => '采集员审核');
$works[] = array('title' => '风险待处置 ' . $cnt . '条', 'url' => 'hf/adminrisk.html?liid=1', 'tab' => '风险处置');
$csql = new \ciy\sql('ap_usr_opwork_apply');
$csql->where("auditstatus=20");
$cnt = (int)$db->get1($csql);
if ($cnt > 0)
$works[] = array('title' => '运营官申请 待审批' . $cnt . '条', 'url' => 'expo/usr_opwork_apply.html?liid=20', 'tab' => '运营官审核');
$takarr = getstrparam(file_get_contents(PATH_ROOT . 'log/fork_apinotify.tak'), ',');
if ($takarr['curr'] > $takarr['max'] / 2)
$works[] = array('title' => 'apinotify任务排队过长。' . $takarr['curr'] . '/max' . $takarr['max'] . '' . (time() - $takarr['time']) . '秒前');
$csql = new \ciy\sql('ap_expo_collect');
$csql->where("collectstatus=10");
$cnt = (int)$db->get1($csql);
if ($cnt > 0)
$works[] = array('title' => '展会采集工作申请 待审批' . $cnt . '条', 'url' => 'expo/expo_collect.html?liid=10', 'tab' => '采集申请审核');
$csql = new \ciy\sql('ap_expositioz_apply');
$csql->where("collectstatus=10");
$cnt = (int)$db->get1($csql);
if ($cnt > 0)
$works[] = array('title' => '展会运营官申请 待审批' . $cnt . '条', 'url' => 'expo/expositioz_apply.html?liid=20', 'tab' => '展会运营官审核');
$csql = new \ciy\sql('ap_expo_service');
$csql->where("ctuser=0");
$cnt = (int)$db->get1($csql);
if ($cnt > 0)
$works[] = array('title' => '逛展客户预约 待联系' . $cnt . '条', 'url' => 'expo/expo_service.html?liid=1', 'tab' => '逛展预约单');
$csql = new \ciy\sql('ap_exposition');
$csql->where("inducateid=0");
$cnt = (int)$db->get1($csql);
if ($cnt > 0)
$works[] = array('title' => '逛展客户预约 未分类' . $cnt . '条', 'url' => 'expo/ai_expo_cate.html', 'tab' => 'AI展会分类');
$csql = new \ciy\sql('c_fair_juzhan_pavi');
$csql->where('status=0');
$csql->where('diqu like ', '中国-');
$cnt = (int)$db->get1($csql);
if ($cnt > 0)
$works[] = array('title' => '新国内展馆 发现' . $cnt . '条', 'url' => 'expo/sdby_pavi.html', 'tab' => '补充展馆');
$csql = new \ciy\sql('ap_socgrouz_apply');
$csql->where("auditstatus=20");
$cnt = (int)$db->get1($csql);
if ($cnt > 0)
$works[] = array('title' => '社群更新 待审批' . $cnt . '条', 'url' => 'expo/socgrouz_apply.html?liid=20', 'tab' => '社群更新审核');
$errlog = file_get_contents(PATH_ROOT . 'log/err_db.log');
if (!empty($errlog))
$works[] = array('title' => '发现异常db数据 ' . count(explode("\n", $errlog)) . ' 条');
$ret['works'] = $works;
return succjson($ret);
}
}

View File

@ -196,7 +196,7 @@ class aiapi {
$openai->setparam($decisionrow['aicalprange']);
$openai->newsystem();
$retcalai = $openai->completion($calprompt, true);
$decci = (int)$retcalai['confidence'];
$decci = toint($retcalai['confidence']);
} else if ($decisionrow['aicalkey'] == 0 && !empty($decisionrow['aicalfunc'])) {
$funcname = $decisionrow['aicalfunc'];
if ($funcname[0] != '\\')

View File

@ -147,13 +147,13 @@ function setconfig($db, $types, $value) {
}
function getcatas($db, $cbid) {
if (is_numeric($cbid)) {
$cbid = (int)$cbid;
$cbid = toint($cbid);
} else {
$csql = new \ciy\sql('zc_cata');
$csql->where('codeid', $cbid);
$csql->where('cbid=0');
$csql->column('id');
$cbid = (int)$db->get1($csql);
$cbid = toint($db->get1($csql));
if ($cbid == 0)
return array();
}
@ -191,7 +191,7 @@ function setmemvar($db, $types, $value) {
if ($ind === false) {
$updata['params'] = 1;
} else {
$updata['params'] = (int)substr($value[0], $ind + 1);
$updata['params'] = toint(substr($value[0], $ind + 1));
}
}
if ($db->insert($csql, $updata) === false)

View File

@ -230,9 +230,9 @@ class demo {
$csql = new \ciy\sql('ap_demo');
$csql->where('name', $name);
$csql->column('id');
$chkid = (int)$db->get1($csql);
$chkid = toint($db->get1($csql));
if ($chkid > 0 && (($id > 0 && $chkid != $id) || $id == 0))
throw new \Exception('数据已存在');
throw new \Exception('CIYIGN数据已存在');
$updata = array();
$updata['name'] = $name;
@ -287,6 +287,7 @@ class demo {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$csql = new \ciy\sql('ap_demo');
@ -326,6 +327,7 @@ class demo {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['data'] = $updata;
@ -354,6 +356,7 @@ class demo {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
return succjson();
@ -447,9 +450,9 @@ class demo {
$val = implode(',', scode($code_mauditstatus, $val));
if ($field == 'renzheng') {
$strs = array();
$val = (int)$val;
$val = toint($val);
foreach ($code_renzheng as $cod) {
if (($val & (1 << ((int)$cod['id'] - 1))) != 0) {
if (($val & (1 << (toint($cod['id']) - 1))) != 0) {
$strs[] = $cod['name'];
}
}
@ -459,7 +462,7 @@ class demo {
if ($val < 0)
$val = -$val . '月';
else if ($val >= 86400)
$val = (int)($val / 86400) . '天';
$val = toint($val / 86400) . '天';
else
$val = $val . '秒';
}
@ -622,7 +625,7 @@ class demo {
else {
$csqlchk = new \ciy\sql('ap_demo');
$csqlchk->where('id', $id)->column('id');
$chkid = (int)$db->get1($csqlchk);
$chkid = toint($db->get1($csqlchk));
if ($chkid != $id)
$errmsg = $name . '在数据库中不存在';
$value = $id;
@ -677,7 +680,7 @@ class demo {
if (!is_numeric($showdat))
$errmsg = $name . '不是数字';
else
$value = (int)$showdat;
$value = toint($showdat);
}
} else if ($name == '长度') {
if (empty($showdat)) {
@ -686,7 +689,7 @@ class demo {
if (!is_numeric($showdat))
$errmsg = $name . '不是数字';
else {
$value = (int)((float)$showdat * 1000);
$value = toint((float)$showdat * 1000);
$showdat .= '米';
}
}
@ -697,7 +700,7 @@ class demo {
if (!is_numeric($showdat))
$errmsg = $name . '不是数字';
else {
$value = (int)((float)$showdat * 1000000);
$value = toint((float)$showdat * 1000000);
$showdat .= '万元';
}
}
@ -825,7 +828,7 @@ class demo {
$value = 0;
} else {
$last = substr($showdat, -3);
$dd = (int)substr($showdat, 0, -3);
$dd = toint(substr($showdat, 0, -3));
if ($dd == 0) {
$errmsg = $name . '周期数字错误';
} else if ($last == '天') {
@ -845,7 +848,7 @@ class demo {
if (!is_numeric($showdat))
$errmsg = $name . '不是数字';
else
$value = (int)$showdat;
$value = toint($showdat);
}
} else if ($name == '活动期数') {
if (empty($showdat)) {
@ -854,7 +857,7 @@ class demo {
if (!is_numeric($showdat))
$errmsg = $name . '不是数字';
else
$value = (int)$showdat;
$value = toint($showdat);
}
} else if ($name == '吨位') {
if (empty($showdat)) {
@ -863,7 +866,7 @@ class demo {
if (!is_numeric($showdat))
$errmsg = $name . '不是数字';
else {
$value = (int)((float)$showdat * 1000000);
$value = toint((float)$showdat * 1000000);
$showdat .= '吨';
}
}
@ -874,7 +877,7 @@ class demo {
if (!is_numeric($showdat))
$errmsg = $name . '不是数字';
else {
$value = (int)((float)$showdat * 100);
$value = toint((float)$showdat * 100);
$showdat .= '';
}
}
@ -917,7 +920,7 @@ class demo {
if (!is_numeric($showdat))
$errmsg = $name . '不是数字';
else {
$value = (int)((float)$showdat * 1000);
$value = toint((float)$showdat * 1000);
$showdat .= 'KG';
}
}
@ -928,7 +931,7 @@ class demo {
if (!is_numeric($showdat))
$errmsg = $name . '不是数字';
else {
$value = (int)((float)$showdat * 1000);
$value = toint((float)$showdat * 1000);
$showdat .= '℃';
}
}
@ -952,7 +955,7 @@ class demo {
else {
$uniques[] = $unq;
$csql->column('id');
$chkid = (int)$db->get1($csql);
$chkid = toint($db->get1($csql));
if ($chkid > 0 && (($id > 0 && $chkid != $id) || $id == 0))
$firsthtml = '<td style="background:#ffe8c5;" title="#' . $lineidx . ':该行与数据库数据有重复"><div class="lang">重复</div></td>';
}
@ -1009,9 +1012,9 @@ class demo {
$csql = new \ciy\sql('ap_demo');
$csql->where('name', $name);
$csql->column('id');
$chkid = (int)$db->get1($csql);
$chkid = toint($db->get1($csql));
if ($chkid > 0 && (($id > 0 && $chkid != $id) || $id == 0))
throw new \Exception('发现数据有重复');
throw new \Exception('CIYIGN发现数据有重复');
$updata = array();
$updata['auditstatus'] = $auditstatus;
$updata['audituser'] = $audituser;
@ -1057,6 +1060,7 @@ class demo {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
return succjson();

View File

@ -41,7 +41,7 @@ class login {
}
$authtime = $post->getint('auth');
if (abs($authtime / 1000 - tostamp()) > 300)
return errjson('您的本地时间与服务器时间相差超过5分钟请调整本机时间。<br/>服务器时间: ' . date('Y-m-d H:i:s') . '<br/>您本机时间: ' . date('Y-m-d H:i:s', (int)($authtime / 1000)));
return errjson('您的本地时间与服务器时间相差超过5分钟请调整本机时间。<br/>服务器时间: ' . date('Y-m-d H:i:s') . '<br/>您本机时间: ' . date('Y-m-d H:i:s', $authtime / 1000));
// if($user == '1')
// clog(md5('1' . $tokensalt)); //开发生成默认密码
if ($post->get('pass') != md5($rsuser['password'] . $authtime)) {

View File

@ -58,6 +58,7 @@ class me {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['data'] = $updata;
@ -128,6 +129,7 @@ class me {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['data'] = $updata;
@ -509,6 +511,7 @@ class me {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
return succjson();
@ -550,6 +553,7 @@ class me {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
return succjson();
@ -619,7 +623,7 @@ class me {
$param['out_trade_no'] = 'PT' . date('ymd') . '9' . $orderid;
$param['notify_url'] = 'https://ciyon.ciy.cn/ajax/ambap/wxpay.pay_pnt';
$param['amount'] = array();
$param['amount']['total'] = (int)$payprice;
$param['amount']['total'] = toint($payprice);
$param['payer'] = array();
$param['payer']['openid'] = $rsuser['wxminaid'];
$wxcfg = gettoken($db, 1);
@ -707,7 +711,7 @@ class me {
$param['out_trade_no'] = 'UB' . date('ymd') . '9' . $orderid;
$param['notify_url'] = 'https://ciyon.ciy.cn/ajax/ambap/wxpay.pay_user';
$param['amount'] = array();
$param['amount']['total'] = (int)$money;
$param['amount']['total'] = toint($money);
$param['payer'] = array();
$param['payer']['openid'] = $rsuser['wxminaid'];
$wxcfg = gettoken($db, 1);
@ -817,7 +821,7 @@ class me {
$param['out_trade_no'] = 'IN' . date('ymd') . '2' . $orderid;
$param['notify_url'] = 'https://ciyon.ciy.cn/ajax/ambap/wxpay.charge';
$param['amount'] = array();
$param['amount']['total'] = (int)$money;
$param['amount']['total'] = toint($money);
$param['payer'] = array();
$param['payer']['openid'] = $rsuser['wxminaid'];
$wxcfg = gettoken($db, 1);

View File

@ -31,14 +31,14 @@ class wxpay {
return self::errlog('解析密文JSON出错:' . $dat);
if (@$json['trade_state'] != 'SUCCESS')
return self::errlog('支付失败:' . $dat);
$noid = (int)substr($json['out_trade_no'], 9);
$noid = toint(substr($json['out_trade_no'], 9));
$csql = new \ciy\sql('ap_cash_in');
$csql->where('id', $noid);
$orderrow = $db->getone($csql);
if (!is_array($orderrow))
return self::errlog('订单不存在:' . $noid);
$userid = $orderrow['vuser'];
$inmoney = (int)$orderrow['inmoney'];
$inmoney = toint($orderrow['inmoney']);
if ($inmoney != $json['amount']['total'])
return self::errlog('订单金额错误[' . $inmoney . '!=' . $json['amount']['total'] . ']:' . $noid, $userid);
if ($orderrow['paytimes'] > 0) {
@ -66,6 +66,7 @@ class wxpay {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return self::errlog($ex->getMessage(), $userid);
}
savelogfile('wxpay_charge', '成功充值[' . $noid . ']');
@ -99,7 +100,7 @@ class wxpay {
if (@$json['state'] != 'SUCCESS')
return self::errlog('付款失败:' . $dat);
$noid = (int)substr($json['out_bill_no'], 9);
$noid = toint(substr($json['out_bill_no'], 9));
$csql = new \ciy\sql('ap_fina_cash');
$csql->where('id', $noid);
@ -107,7 +108,7 @@ class wxpay {
if (!is_array($orderrow))
return self::errlog('订单不存在:' . $noid);
$userid = $orderrow['vuser'];
$cashmoney = (int)($orderrow['cashmoney']/100);
$cashmoney = toint($orderrow['cashmoney']/100);
if ($cashmoney != $json['transfer_amount'])
return self::errlog('订单金额错误[' . $cashmoney . '!=' . $json['transfer_amount'] . ']:' . $noid, $userid);
if ($orderrow['cashstatus'] == 100) {
@ -130,6 +131,7 @@ class wxpay {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return self::errlog($ex->getMessage(), $userid);
}
savelogfile('wxpay_pnt', '成功提现[' . $noid . ']');
@ -162,7 +164,7 @@ class wxpay {
return self::errlog('解析密文JSON出错:' . $dat);
if (@$json['trade_state'] != 'SUCCESS')
return self::errlog('支付失败:' . $dat);
$noid = (int)substr($json['out_trade_no'], 9);
$noid = toint(substr($json['out_trade_no'], 9));
$csql = new \ciy\sql('ap_pnt_buy');
$csql->where('id', $noid);
@ -170,7 +172,7 @@ class wxpay {
if (!is_array($orderrow))
return self::errlog('订单不存在:' . $noid);
$userid = $orderrow['vuser'];
$buypntmoney = (int)$orderrow['buypntmoney'];
$buypntmoney = toint($orderrow['buypntmoney']);
if ($buypntmoney != $json['amount']['total'])
return self::errlog('订单金额错误[' . $buypntmoney . '!=' . $json['amount']['total'] . ']:' . $noid, $userid);
if ($orderrow['paytimes'] > 0) {
@ -188,7 +190,7 @@ class wxpay {
throw new \Exception('更新ap_pnt_buy失败:' . $db->error);
//sendusermsg($db, $orderrow['userid'], '集市通知', '买家已付款,请及时处理', '/work/ec/order_detail?id=' . $noid);
$pnt = (int)$orderrow['pnt'];
$pnt = toint($orderrow['pnt']);
$updata = array();
$updata['mypnt'] = array('mypnt+' . $pnt);
$csql = new \ciy\sql('ap_user');
@ -198,6 +200,7 @@ class wxpay {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return self::errlog($ex->getMessage(), $userid);
}
savelogfile('wxpay_pnt', '成功支付[' . $noid . ']');
@ -230,7 +233,7 @@ class wxpay {
return self::errlog('解析密文JSON出错:' . $dat);
if (@$json['trade_state'] != 'SUCCESS')
return self::errlog('支付失败:' . $dat);
$noid = (int)substr($json['out_trade_no'], 9);
$noid = toint(substr($json['out_trade_no'], 9));
$csql = new \ciy\sql('ap_usr_buy_user');
$csql->where('id', $noid);
@ -243,7 +246,7 @@ class wxpay {
$userrow = $db->getone($csql);
if (!is_array($userrow))
return self::errlog('用户不存在:' . $userid);
$money = (int)$orderrow['buydaymoney'];
$money = toint($orderrow['buydaymoney']);
if ($money != $json['amount']['total'])
return self::errlog('订单金额错误[' . $money . '!=' . $json['amount']['total'] . ']:' . $noid, $userid);
if ($orderrow['paytimes'] > 0) {
@ -260,7 +263,7 @@ class wxpay {
if ($db->update($csql, $updata) === false)
throw new \Exception('更新ap_usr_buy_user失败:' . $db->error);
$days = (int)$orderrow['days'];
$days = toint($orderrow['days']);
if($userrow['accounttimes'] < tostamp())
$userrow['accounttimes'] = tostamp();
$updata = array();
@ -273,6 +276,7 @@ class wxpay {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return self::errlog($ex->getMessage(), $userid);
}
savelogfile('wxpay_user', '成功支付[' . $noid . ']');

View File

@ -1,5 +1,7 @@
<?php
namespace web\api;
class craw {
public static function json_getmaxid() {
global $db;
@ -8,7 +10,7 @@ class craw {
$csql = new \ciy\sql($table);
$csql->order('id desc');
$csql->column('id');
$ret['maxid'] = (int)$db->get1($csql);
$ret['maxid'] = toint($db->get1($csql));
return succjson($ret);
}
public static function json_filldata() {
@ -16,22 +18,26 @@ class craw {
$post = new \ciy\post();
$lists = $post->get('list');
$table = $post->get('table');
if(is_string($lists))
$lists = json_decode($lists,true);
if (is_string($lists))
$lists = json_decode($lists, true);
$ret['dataid'] = 0;
foreach($lists as $list){
foreach ($lists as $list) {
$csql = new \ciy\sql($table);
$csql->where('id', $list['id']);
$row = $db->getone($csql);
if (is_array($row)) {
if ($db->update($csql, $list) === false)
throw new \Exception('更新失败:' . $db->error);
if ($db->update($csql, $list) === false) {
savelogfile('err_db', '更新filldata失败:' . $db->error, true);
break;
}
} else {
if ($db->insert($csql, $list) === false)
throw new \Exception('新增失败:' . $db->error);
if ($db->insert($csql, $list) === false) {
savelogfile('err_db', '新增filldata失败:' . $db->error, true);
break;
}
}
$ret['dataid'] = $list['id'];
if($table == 'c_*'){
if ($table == 'c_*') {
}
}
return succjson($ret);

145
web/api/v1.php Normal file
View File

@ -0,0 +1,145 @@
<?php
//https://ciyon.local.ciy.cn/ajax/api/v1.transfer
//https://ciyon.local.ciy.cn/ajax/api/v1.query
namespace web\api;
class v1 {
public static function json_transfer() {
global $db;
$post = new \ciy\post();
$api = self::verifyapi($db, $post);
if (is_string($api))
return errjson($api);
$thirdno = $post->get('thirdno');
$notifyurl = $post->get('notifyurl');
$amount = $post->getint('amount');
$csql = new \ciy\sql('ap_transfer');
$csql->where('thirdno', $thirdno);
$chkrow = $db->getone($csql);
if (is_array($chkrow))
return errjson('单号已存在');
//检查thirdno是否存在等幂下单
$updata = array();
$updata['amount'] = $amount;
$updata['thirdno'] = $thirdno;
$updata['notifyurl'] = $notifyurl;
$updata['retimes'] = 0;
$updata['uptimes'] = 0;
$updata['nexttimes'] = 9999999999999;
$updata['addtimes'] = time();
$updata['signature'] = '';
$updata['orderstatus'] = 10;
$updata['apiid'] = $api['id'];
if (isset($api['sign'])) {
//验证签名
$addtimes = $post->getint('timestamp');
if (abs(time() - $addtimes) > 300) {
return errjson('签名已过期请检查timestamp时间戳是否与北京时间一致');
}
$updata['addtimes'] = $addtimes;
$waitsignstr = 'amount=' . $updata['amount'] . ',addtimes=' . $addtimes;
$retsign = self::verifysign($api['pubkey'], $waitsignstr, $api['sign']);
if (is_string($retsign))
return errjson($retsign);
$updata['signature'] = $api['sign'];
$updata['orderstatus'] = 20;
}
try {
$db->begin();
$csql = new \ciy\sql('ap_transfer');
if ($db->insert($csql, $updata) === false)
throw new \Exception('新增失败:' . $db->error);
$id = $db->insert_id();
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['newid'] = $id;
return succjson($ret);
}
public static function json_query() {
global $db;
$post = new \ciy\post();
$api = self::verifyapi($db, $post);
if (is_string($api))
return errjson($api);
$thirdno = $post->get('thirdno');
$csql = new \ciy\sql('ap_transfer');
$csql->where('thirdno', $thirdno);
$row = $db->getone($csql);
if (!is_array($row))
return errjson('单号不存在');
$ret = array();
$ret['data'] = $row;
return succjson($ret);
}
static function verifyapi($db, &$post) {
global $db;
$hash = $post->get('hash');
if (empty($hash))
return 'hash不存在';
unset($post->post['hash']);
$sign = $post->get('sign');
if (!empty($sign))
unset($post->post['sign']);
$appid = $post->getint('appid');
if ($appid <= 0)
return 'appid不合法';
$timestamp = $post->getdate('timestamp');
if (abs(time() - $timestamp) > 600) {
return 'timestamp与服务器相差超过10分钟服务器时间:' . date('Y-m-d H:i:s');
}
$csql = new \ciy\sql('ap_api');
$csql->where('id', $appid);
$apirow = $db->getone($csql);
if (!is_array($apirow)) {
return 'appid不存在';
}
if (empty($apirow['apisecret']))
return '经检测您的api接入不符合要求已经暂停接入请调整代码后重置ApiKey';
$hashstr = '';
ksort($post->post);
foreach ($post->post as $key => $value) {
$hashstr .= $key . '=' . $value . '&';
}
$hashstr = substr($hashstr, 0, -1) . $apirow['apisecret'];
if ($hash != md5($hashstr)) {
return 'hash验证错误';
}
$ip = getip();
if (!empty($apirow['ips'])) {
$ips = explode("\n", $apirow['ips']);
if (!in_array($ip, $ips)) {
return 'ip不在白名单内';
}
}
if (!empty($sign)) {
if (empty($apirow['pubkey']))
return '未安装数字证书';
$apirow['sign'] = $sign;
}
return $apirow;
}
static function verifysign($pubkey, $data, $sign) {
$signbin = hex2bin($sign);
if ($signbin === false) {
return '签名格式错误';
}
$hashbin = hex2bin(hash('sha256', $data));
if (strpos($pubkey, '-----BEGIN RSA PUBLIC KEY-----') === false && strpos($pubkey, '-----BEGIN PUBLIC KEY-----') === false)
$pubkey = "-----BEGIN PUBLIC KEY-----\n" . wordwrap($pubkey, 64, "\n") . "\n-----END PUBLIC KEY-----";
$result = openssl_verify($hashbin, $signbin, $pubkey, OPENSSL_ALGO_SHA256);
if ($result === 0) {
return '数字证书验签失败';
} else if ($result !== 1) {
return '数字证书验签错误:' . openssl_error_string();
}
return true;
}
}

93
web/api/v1_test.php Normal file
View File

@ -0,0 +1,93 @@
<?php
//https://ciyon.local.ciy.cn/ajax/api/v1_test.transfer
//https://ciyon.local.ciy.cn/ajax/api/v1_test.query
namespace web\api;
class v1_test {
public static function json_transfer() {
$param = array();
$param['thirdno'] = '34538';
$param['amount'] = 100;
$param['notify_url'] = 'https://ciyon.ciy.cn/api/recv.transfer';
$param['timestamp'] = time();
$waitsignstr = 'amount=100,addtimes=' . $param['timestamp'];
clog($waitsignstr);
$param['sign'] = self::sign($waitsignstr);
$param = self::send($param, 'transfer');
}
public static function json_query() {
$param = array();
$param['thirdno'] = '34538';
$param['timestamp'] = time();
$param = self::send($param, 'query');
}
static function send($param, $func) {
global $db;
$appid = 215695;
$csql = new \ciy\sql('ap_api');
$csql->where('id', $appid);
$apirow = $db->getone($csql);
$apisecret = $apirow['apisecret'];
$param['appid'] = $appid;
$signstr = '';
ksort($param);
foreach ($param as $key => $value) {
if ($key == 'sign')
continue;
$signstr .= $key . '=' . $value . '&';
}
$signstr = substr($signstr, 0, -1);
$signstr .= $apisecret;
$hash = md5($signstr);
$param['hash'] = $hash;
$urlget = 'https://ciyon.local.ciy.cn/ajax/api/v1.' . $func;
$http = new \ciy\http();
$http->request($urlget, json_encode($param));
$statcode = $http->get_statcode();
clog('test http status code: ' . $statcode);
$result = $http->get_data();
clog($result);
exit();
}
static function sign($data) {
$hashbin = hex2bin(sha256($data));
$prikey = <<<EOD
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDI1V1v9Gf7lJRW
lbVoYUg6I/nwHNnysCmAn5ImkMQ9tGNLb4BzHhaBPrxOArEMvXHz8cadH7DcmVkr
khpaF9I4jLTW1w5o/U5YMn0dshwF8XA1izS67D6GtUO/JSubczbL0TrCNZeqSiuK
UrSmlqpM7nYpQdSa6URyXo4x32c0mbX6+42cfsOE4Ye3hW1vDZKZOQA4buVoYO0b
3uVbysQUtbQ5s+OjNTJYQ0ijlGwUIGMnlFaKVsip4OBv52gfXFDmsPkob9qTtCZO
Aw9slJChftCZevO1MHiWVBed+h7vIRE1oZHf8b0AB45R3OxOAFMRp3H49mYBvE02
BQ51m943AgMBAAECggEAEePf1O9CrAiKRkRDyq6Pzo4R36/SQmoq6EhOrpzKvmxp
Q/kEyjxt6Ml74L8gom/lzMNG3AxMpvoKFXWIX2or0dnG6jRyFiwqZHTq7FBHasgd
JMfnxJby4vEWvdpDzi8vPGzA/Tfk8Mh2pHXFnelh9kRvxjEVDU+mR0HhDNRHz0mR
mBdDKA/WSzkijUfp8C1aq/qj4Qjx1vnCIlaogXg/CfnUN1Mbj8Wr+egFEmmVb5Vd
NmpBeBQgnidMZJRUdbBrum7NQOsz6ixNk9x9jUi2JEAS9H7BeG1bNgbPddeWNhZl
0QzfaeMi523WwOKK9pVmqBw5mjzc/+TeGDOzqGl7kQKBgQDuPLkRnKefeEZfYSfb
QYXqw9Bf2FtlYPn+8ZYxRkUJGHyCSl0dsCD+EN7qz766Q4nEQdPleehpy0qIgoxI
Y91s12ZY4+uQSJ3KppIeSe5VHvWCnHSBGKEYEggWGnlxxUv+0133qQ4diah7y2/z
Un6QKlGu0Eei8FLz99l26Vup/QKBgQDXzrXBwGOI8miQVTR5LdL0KbhD89ESZ+Qe
e/yhIo6Q4P96rSd2oQYu3CIyZXpRB3RLamEdjtOMHGub5qixqp5QPuPamerzq/zZ
D0bIiiATIAnSZHAKojlyFYd9aC5/fD6rGJCVcfnG0MJBJoLnkXXHksCYVyTXYan8
JRi+CzE1QwKBgCgIsjzga1aj+odqpyz0HNHvp+ODUxB9NGWAKXIMUeuOXtXyMyWb
BGBNa3hgArgAQ3VkbnxAeSrWC6dW8MX1ai8xHzTO0DYFzeZRCXrnh5JsSmtxaS6M
ef22gf9c4Y2ZzwR6dm74zLNv/40WCbEE6tnFEsbinzclVXtD6hpOaqXtAoGBAIo0
7Lv3rQcAT6zXlHJiwW3y5fpGxEdoV3SabPD5A5qPLa5wBAz6FM6f1hq2WH5aKsU9
jJJ0bNCXRuch8jlODnNPw3a1Cf4h0B1mpis6Ik59Py0Je6OjvuxsE0hiFx04AZ5r
bfT3eEI2YaF9u2n4AxjbyBIIBSUWe9lqHI1g95OnAoGATtwi1tKfQ8qKPveBexMd
AoHAJW8CxnCQEC/2mqydiKiLQZTCTXqJqZLa4SvuHojMnDlnbslA5C69d6mBDWA+
mZ8Y/QE6M+LieH7UXGe5IhGdB4aympiOA1Ig/uDdpbjy0/OKi7UH4ZbDAtJ6jORn
N/r/sMhXDVJBjxNf3nJijDU=
-----END PRIVATE KEY-----
EOD;
$privateKey = $prikey;
if (strpos($privateKey, '-----BEGIN RSA PRIVATE KEY-----') === false && strpos($privateKey, '-----BEGIN PRIVATE KEY-----') === false)
$privateKey = "-----BEGIN PRIVATE KEY-----\n" . wordwrap($privateKey, 64, "\n", true) . "\n-----END PRIVATE KEY-----";
$result = openssl_sign($hashbin, $signature, $privateKey, OPENSSL_ALGO_SHA256);
if ($result !== true)
return errjson('签名错误:' . openssl_error_string());
return bin2hex($signature);
}
}

View File

@ -74,6 +74,7 @@ class manage {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
return succjson();
@ -107,6 +108,7 @@ class manage {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['ids'] = $vids;
@ -138,6 +140,7 @@ class manage {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
return succjson();
@ -179,6 +182,7 @@ class manage {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
if ($cnt == 0)
@ -217,6 +221,7 @@ class manage {
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
file_put_contents(PATH_WEB . 'ud/docs/' . $id . '_' . $uptimes . '.txt', $content);

View File

@ -341,11 +341,13 @@ _ciydomclas.prototype.outhtml = function (html) {
if (html === undefined) {
return this[0].outerHTML;
}
if (typeof (html) == 'string') {
this[0].outerHTML = html;
} else if (iselement(html)) {
this[0].parentElement.replaceChild(html, this[0]);
}
this.each(function (dom) {
if (typeof (html) == 'string') {
dom.outerHTML = html;
} else if (iselement(html)) {
dom.parentElement.replaceChild(html, dom);
}
});
return this;
};
_ciydomclas.prototype.text = function (text) {
@ -354,11 +356,13 @@ _ciydomclas.prototype.text = function (text) {
if (text === undefined) {
return this[0].textContent.trim();
}
if (typeof (text) == 'string' || typeof (text) == 'number') {
this[0].innerText = text;
} else if (iselement(text)) {
this[0].innerText = text.textContent;
}
this.each(function (dom) {
if (typeof (text) == 'string' || typeof (text) == 'number') {
dom.innerText = text;
} else if (iselement(text)) {
dom.innerText = text.textContent;
}
});
return this;
};
_ciydomclas.prototype._insdom = function (elehtml, pos) {
@ -828,7 +832,7 @@ ciyfn.getdictdata = function (datakey, once, reldata) {
return reldata[datakey];
if (isarray(window[datakey]))
return window[datakey];
if (datakey.indexOf('.') == -1)
if (datakey.indexOf('.') == -1 && datakey.indexOf(':') == -1)
return new Array();
var svs = ciyfn.split(datakey, '.');
datas = new Array();
@ -881,6 +885,8 @@ ciyfn.filterdictdata = function (data, opn) {
opn.filter = null;
}
}
if (!isarray(opn.rename))
opn.rename = null;
for (var i in data) {
if (limit == 1) {
if (limit_data[0] != '' && toint(data[i].id) < toint(limit_data[0]))
@ -891,8 +897,14 @@ ciyfn.filterdictdata = function (data, opn) {
if (limit_data.indexOf(data[i].id + '') == -1)
continue;
}
if (opn.filter && (vals[i][opn.filter.field] ? vals[i][opn.filter.field] : '') != opn.filter.value)
if (opn.filter && (data[i][opn.filter.field] ? data[i][opn.filter.field] : '') != opn.filter.value)
continue;
if (opn.rename) {
for (var j in opn.rename) {
if (data[i].id == opn.rename[j].id)
data[i].name = opn.rename[j].name;
}
}
retdata.push(data[i]);
}
return retdata;
@ -919,6 +931,18 @@ ciyfn.jsontostr = function (data, space) {
}
return ret;
}
ciyfn.sha256 = async function (str) {
const msgBuffer = new TextEncoder().encode(str);
const hashBuffer = await crypto.subtle.digest('SHA-256', msgBuffer);
const hashArray = Array.from(new Uint8Array(hashBuffer));
return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
}
ciyfn.sha512 = async function (str) {
const msgBuffer = new TextEncoder().encode(str);
const hashBuffer = await crypto.subtle.digest('SHA-512', msgBuffer);
const hashArray = Array.from(new Uint8Array(hashBuffer));
return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
}
ciyfn.loadjs = function (objname, jsurl, donefunc) {
if (window[objname])
return donefunc();
@ -1174,6 +1198,45 @@ ciyfn.ajax = function (opn) { //IE8 OK
request.abort("timeout");
}, timeout * 1000 + 3000);
}
ciyfn.ajaxsync = function (opn) {
var method = opn.method || 'POST';
var request;
if (window.XMLHttpRequest) {
request = new XMLHttpRequest();
} else {
request = new ActiveXObject("Microsoft.XMLHTTP");
}
try {
request.open(method.toUpperCase(), opn.url, false);
request.setRequestHeader("Content-type", "application/json");
if (opn.data) {
if (typeof (opn.data) == 'string')
request.send(opn.data);
else
request.send(JSON.stringify(opn.data));
} else {
request.send();
}
} catch (err) {
return {
"errmsg": "ConnectFail"
}
}
if (request.readyState == 4 && request.status == 200) {
let res = JSON.parse(request.responseText)
if (res.code == 0) {
res.code = 1;
return res;
}
res.errmsg = res.msg || res.message || '未知错误';
return res;
}
return {
"errmsg": "本地服务连接失败"
};
}
ciyfn._getform_dom = function (dom) {
var sep = ',';
var retdata = {};
@ -1819,47 +1882,59 @@ ciyclass.loading = function () {
ciyfn.dropmenu = function (dom) {
dom = $5(dom);
if ('ontouchend' in window) {
dom.on("click", function (ev) {
dom.on("click", function () {
if (dom.hasClass('show')) {
dom.removeClass('show');
ciygv.mask.hide();
return;
}
showmenu();
var menudom = $5(this);
showmenu(menudom);
});
} else {
dom.on("mouseenter", function () {
showmenu();
dom.one("mouseleave", function () {
dom.removeClass('show');
var menudom = $5(this);
showmenu(menudom);
menudom.one("mouseleave", function () {
menudom.removeClass('show');
menudom.css('zIndex', null);
ciygv.mask.hide();
});
});
}
function showmenu() {
function showmenu(menudom) {
ciygv.mask.show(function () {
dom.removeClass('show');
menudom.removeClass('show');
}, { zIndex: 10 });
dom.addClass('show');
var domrect = dom.rect();
menudom.css('zIndex', 30);
menudom.addClass('show');
var domrect = menudom.rect();
var top = domrect.top;
var left = domrect.left;
var uldom = $5('ul', dom);
var uldom = $5('ul', menudom);
var ulrect = uldom.rect();
uldom.css('inset', null);
var menuwidth = ulrect.width;
var menuheight = ulrect.height;
dom.css('zIndex', 30);
var direction = menudom.attr('direction');
if (direction == 'lr')
left += domrect.width;
if ($5(document).width() < left + menuwidth) {
left = $5(document).width() - menuwidth;
if (direction == 'lr')
left = domrect.left - menuwidth;
else
left = $5(document).width() - menuwidth - 20;
}
if (left < 0)
left = 0;
if (top + menuheight + 40 < document.documentElement.clientHeight) {
top += domrect.height;
if (direction != 'lr')
top += domrect.height;
uldom.css({ 'position': 'fixed', 'left': left + 'px', 'top': top + 'px', 'bottom': 'auto' });
} else {
if (direction == 'lr')
top += domrect.height;
if (top < menuheight) {
var meheight = domrect.height;
if (document.documentElement.clientHeight > menuheight + meheight)
@ -1885,7 +1960,15 @@ ciyclass.tabcard = function (opn) {
if (contentdoms.length > 0 && contentdoms.length != lidoms.length)
return console.error('tabcard: tabcontent.length != li.length');
contentdoms.css('display', 'none');
if ($5('ul>li.active', opn.dom).length == 0)
if (typeof (opn.value) !== 'undefined')
tocard(opn.value, 'init');
if (opn.liid > 0) {
lidoms.each(function (dom, i) {
if ($5(dom).attr('data-liid') == opn.liid)
tocard(i, 'init');
});
}
else if ($5('ul>li.active', opn.dom).length == 0)
tocard(0, 'init');
else {
lidoms.each(function (dom, i) {
@ -1903,11 +1986,17 @@ ciyclass.tabcard = function (opn) {
}
});
});
this.selectcard = function (index) {
this.setbyvalue = function (index) {
if (index < 0 || index >= lidoms.length)
return;
tocard(index, 'selectcard');
}
this.setbyliid = function (liid) {
lidoms.each(function (dom, i) {
if ($5(dom).attr('data-liid') == liid)
tocard(i, 'selectcard');
});
}
function tocard(i, from) {
lidoms.removeClass('active');
if (contentdoms.length > 0)

Some files were not shown because too many files have changed in this diff Show More