This commit is contained in:
众产-王坤 2025-08-10 10:39:57 +08:00
parent 00790ad84e
commit feb780157f
102 changed files with 3997 additions and 569 deletions

View File

@ -7,6 +7,7 @@ import (
"ciyon/web/admin/ap"
"ciyon/web/admin/autotask"
"ciyon/web/admin/datasse"
"ciyon/web/admin/demo"
"ciyon/web/admin/rigger"
"ciyon/web/admin/wsdemo"
c "ciyon/zciyon"
@ -130,16 +131,6 @@ func setWebRoute_adm(web *c.CiyWebServer) {
},
})
web.RouterFunc("admin/ap", map[string]map[string]func(http.ResponseWriter, *http.Request) bool{
"demo": {
"list": ap.Demo_list,
"del": ap.Demo_del,
"getdata": ap.Demo_getdata,
"update": ap.Demo_update,
"audit": ap.Demo_audit,
"exportxls": ap.Demo_exportxls,
"importxls_in": ap.Demo_importxls_in,
"importxls_data": ap.Demo_importxls_data,
},
"paper": {
"init": ap.Paper_init,
"update": ap.Paper_update,
@ -147,6 +138,18 @@ func setWebRoute_adm(web *c.CiyWebServer) {
"del": ap.Paper_del,
},
})
web.RouterFunc("admin/demo", map[string]map[string]func(http.ResponseWriter, *http.Request) bool{
"normal": {
"list": demo.Normal_list,
"del": demo.Normal_del,
"getdata": demo.Normal_getdata,
"update": demo.Normal_update,
"audit": demo.Normal_audit,
"exportxls": demo.Normal_exportxls,
"importxls_in": demo.Normal_importxls_in,
"importxls_data": demo.Normal_importxls_data,
},
})
web.RouterFunc("admin/autotask", map[string]map[string]func(http.ResponseWriter, *http.Request) bool{
"task": {
"main": autotask.Task_main,
@ -166,7 +169,7 @@ func setWebRoute_adm(web *c.CiyWebServer) {
"logout": admin.Login_logout,
"restorage": admin.Login_restorage,
},
"manage": {
"index": {
"init": admin.Index_init,
"favadd": admin.Index_favadd,
"favdel": admin.Index_favdel,

View File

@ -22,7 +22,7 @@ func paper_setwhere(post *c.CiyPost) (map[string]any, *c.CiySQL) {
}
func Paper_init(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -79,11 +79,11 @@ func Paper_init(w http.ResponseWriter, r *http.Request) bool {
once["input"] = input
ret["once"] = once
}
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}
func Paper_update(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -142,11 +142,11 @@ func Paper_update(w http.ResponseWriter, r *http.Request) bool {
if err != nil {
return c.ErrJSON(w, "事务"+err.Error())
}
return c.SuccJSON(w)
return c.SuccJSON(w, r)
}
func Paper_getdata(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -162,11 +162,11 @@ func Paper_getdata(w http.ResponseWriter, r *http.Request) bool {
return c.ErrJSON(w, "读取失败:"+err.Error())
}
}
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}
func Paper_del(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -194,5 +194,5 @@ func Paper_del(w http.ResponseWriter, r *http.Request) bool {
if err != nil {
return c.ErrJSON(w, "事务"+err.Error())
}
return c.SuccJSON(w)
return c.SuccJSON(w, r)
}

View File

@ -38,7 +38,7 @@ func Main() bool {
}
func Task_main(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
rsuser, err := admin.Verifyuser(c.CiyDB, post)
rsuser, err := admin.Verifyuser(r, c.CiyDB, post)
if err != nil {
w.Write([]byte("您未登录"))
return false

View File

@ -2,21 +2,31 @@ package admin
import (
"fmt"
"net/http"
"strings"
"sync"
c "ciyon/zciyon"
)
var Gtokentype string //cookie(更安全只支持https) 、 localstorage(兼容性好)
var Gtokenfield string //header api field
var Gtokensalt string //登录盐值
var Gtokenswapsec int //更换JWT时间
var Gtokenexpsec int //过期退出时间
var Gdefpass string //默认密码
var Gusermap sync.Map //用户全局缓存
func init() {
Gtokentype = "localstorage"
Gtokenfield = "ciyadm"
Gtokensalt = "bka02$59gG"
Gtokenswapsec = 3600
Gtokenexpsec = 86400 * 7
Gdefpass = "1q2w"
}
func Verifyfast(db *c.CiyMysql, post *c.CiyPost) (map[string]any, int) {
rsuser, err := Verifyuser(c.CiyDB, post)
func Verifyfast(r *http.Request, db *c.CiyMysql, post *c.CiyPost) (map[string]any, int) {
rsuser, err := Verifyuser(r, c.CiyDB, post)
if err != nil {
c.ErrJSON(post.W, "请重新登录", 2)
return nil, 0
@ -24,13 +34,13 @@ func Verifyfast(db *c.CiyMysql, post *c.CiyPost) (map[string]any, int) {
return rsuser, c.Toint(rsuser["id"])
}
func Verifyuser(db *c.CiyMysql, post *c.CiyPost) (map[string]any, error) {
ciyauth := post.R.Header.Get(Gtokenfield)
func Verifyuser(r *http.Request, db *c.CiyMysql, post *c.CiyPost) (map[string]any, error) {
ciyauth := post.R.Header.Get("ciyauth")
if ciyauth == "" {
ciyauth = c.GetQuery("_"+Gtokenfield, post.R)
ciyauth = c.GetQuery("_ciyauth", post.R)
}
if ciyauth == "" {
return nil, fmt.Errorf("verify nofind %v in header or query", Gtokenfield)
return nil, fmt.Errorf("verify nofind ciyauth header or query")
}
auth := c.Str_JSON(c.Encrypt(ciyauth, "D", Gtokensalt))
if auth == nil {
@ -48,6 +58,9 @@ func Verifyuser(db *c.CiyMysql, post *c.CiyPost) (map[string]any, error) {
if c.Tostr(onlinerow["sid"]) != c.Tostr(auth["_s"]) {
return nil, fmt.Errorf("verify sid not match oid=%v", onlinerow["id"])
}
if c.Toint(onlinerow["exptimes"]) < c.Tostamp()-Gtokenexpsec {
return nil, fmt.Errorf("verify exptimes timeout oid=%v", onlinerow["id"])
}
if c.Toint(onlinerow["usrchg"]) == 9 {
csql := c.NewCiySQL("zc_admin")
csql.Where("id", auth["_o"])
@ -60,17 +73,24 @@ func Verifyuser(db *c.CiyMysql, post *c.CiyPost) (map[string]any, error) {
}
}
if c.Toint(onlinerow["usrchg"]) == 2 {
post.W.Header().Set(Gtokenfield+"re", "true")
post.W.Header().Set("_re", "true")
}
if c.Toint(onlinerow["exptimes"]) > c.Tostamp() {
return auth, nil
}
exptimes := c.Tostamp() + 86400
exptimes := c.Tostamp() + Gtokenswapsec
sid := c.Randstr(10)
auth["_s"] = sid
authstr := c.JSON_Str(auth)
newauth := c.Encrypt(authstr, "E", Gtokensalt)
post.W.Header().Set(Gtokenfield, newauth)
ctx := r.Context().Value(c.GhttpKey)
if ctx != nil {
reqCtx := ctx.(*c.RequestContext)
if reqCtx != nil {
reqCtx.CiyAuth = newauth
}
}
//post.W.Header().Set(Gtokenfield, newauth)
userid := c.Toint(auth["id"])
db.UserID = userid
updata := map[string]any{}

View File

@ -18,9 +18,9 @@
*/
$_token = array();
$_token['type'] = 'cookie'; //cookie(更安全) 、 localstorage(兼容性好)
$_token['swapsec'] = 3600; //更换JWT时间
$_token['expsec'] = 86400*7; //过期退出时间
$_token['type'] = 'localstorage'; //cookie(更安全只支持https) 、 localstorage(兼容性好)
$_token['swapsec'] = 6; //更换JWT时间
$_token['expsec'] = 86400 * 7; //过期退出时间
$_token['field'] = 'ciyadm';
$_token['salt'] = 'bka02$59gG'; //做数据加解密时的加密因子,每个项目都不要相同。
@ -33,11 +33,11 @@ function verifyfast() {
function verifyuser() {
global $db;
global $_token;
if (isset($_COOKIE[$_token['field']]))
if ($_token['type'] == 'cookie')
$ciyauth = $_COOKIE[$_token['field']];
else if (isset($_SERVER['HTTP_CIYAUTH']))
$ciyauth = $_SERVER['HTTP_CIYAUTH'];
else
$ciyauth = $_SERVER['HTTP_CIYAUTH'];
if (!$ciyauth)
$ciyauth = get('_ciyauth');
$auth = json_decode(encrypt($ciyauth, 'D', $_token['salt']), true);
if ($auth == null)
@ -76,12 +76,10 @@ function verifyuser() {
$enauth = encrypt($authstr, 'E', $_token['salt']);
if ($_token['type'] == 'cookie') {
$headercookie = 'Set-Cookie: ' . $_token['field'] . '=' . $enauth . '; expires=' . gmdate('D, d-M-Y H:i:s T', time() + $_token['swapsec'] + $_token['expsec']) . '; path=/; httponly';
if (ishttps())
$headercookie .= '; SameSite=None; Secure';
header($headercookie); //Cookie方式安全性好
$headercookie = 'Set-Cookie: ' . $_token['field'] . '=' . $enauth . '; expires=' . gmdate('D, d-M-Y H:i:s T', time() + $_token['swapsec'] + $_token['expsec']) . '; path=/; httponly; SameSite=None; Secure';
header($headercookie);
} else {
$_token['__ciyauth'] = $enauth; //Localstorage方式兼容性更好
$_token['__ciyauth'] = $enauth;
//header('_ciyauth: ' . $enauth);
}
return $auth;

View File

@ -13,7 +13,7 @@ func DataSSE_demo(w http.ResponseWriter, r *http.Request) bool {
return false
}
post := c.NewCiyPost(w, r)
rsuser, err := admin.Verifyuser(c.CiyDB, post)
rsuser, err := admin.Verifyuser(r, c.CiyDB, post)
if err != nil {
c.SSESend_event(w, "请重新登录")
return false
@ -43,7 +43,7 @@ func DataSSE_demo_ch(w http.ResponseWriter, r *http.Request) bool {
return false
}
post := c.NewCiyPost(w, r)
rsuser, err := admin.Verifyuser(c.CiyDB, post)
rsuser, err := admin.Verifyuser(r, c.CiyDB, post)
if err != nil {
c.SSESend_event(w, "请重新登录")
return false

251
web/admin/demo/catlist.html Normal file
View File

@ -0,0 +1,251 @@
<!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>
.tabledepart {
white-space: nowrap;
background: var(--bg1);
min-width: 10em;
padding: 0.5em 0;
border-radius: 0.5em;
line-height: 2em;
cursor: pointer;
}
.tabledepart>div {
padding: 0 0.5em;
transition: all 0.8s;
}
.tabledepart>div.selected {
color: var(--man5);
background: var(--bg2);
}
</style>
</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">
<button class="lang btn" type="submit">查询</button>
</div>
</div>
</form>
<div style="display:flex;flex:1;min-height: 0;">
<div class="hidden-dn-sm" style="margin-top:0.5em;overflow: overlay;margin-right: 0.5em;">
<div class="tabledepart"></div>
</div>
<div style="flex:1;display:flex;flex-direction:column;min-width: 0;">
<div class="topbtn">
<a class="lang btn" onclick="edit(0)">添加管理员</a>
<a class="lang btn" onclick="multiin()">导入</a>
<a class="lang btn" onclick="exportxls()">导出</a>
</div>
<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>
</div>
<div id="alert_multiin" style="display:none;">
<div style="display:flex;">
<div>
<ciy-upload com="file" />
</div>
<div style="margin-left:0.3em;">
<a class="lang btn btn-sm def" href="/ud/inpl/zc_admin.xlsx" target="_blank">下载导入模板</a><br />
<div class="lang">每次导入建议不超过1000条</div>
<div class="lang">导入更新,首列为导出的行码</div>
<div class="lang">请按模版列填写</div>
</div>
</div>
</div>
<div id="alert_edit" style="display:none;">
<div class="char4 row">
<div class="ciy-form col-24 col-sm-8">
<div>
<ciy-upload path="{Y}/{m}{d}/avar" showwh="13em" com="icon" num="1" type="jpg,png" zipjpg="0.7" imgwidth="400" imgheight="400" zipext="jpg" style="justify-content: center;" />
</div>
</div>
<div class="ciy-form col-24 col-sm-8">
<label class="lang imp">姓名</label>
<div>
<input type="text" name="name" style="width:100%;" />
</div>
</div>
<div class="ciy-form col-24 col-sm-8">
<label class="lang imp">状态</label>
<div>
<ciy-select com="stpstatus" />
</div>
</div>
<div class="ciy-form col-24 col-sm-8">
<label class="lang imp">手机号</label>
<div>
<input type="text" name="mobile" style="width:100%;" />
</div>
</div>
<div class="ciy-form col-24 col-sm-8">
<label class="lang imp">性别</label>
<div>
<ciy-select com="sex" />
</div>
</div>
<div class="ciy-form col-24 col-sm-16">
<label class="lang">所属组织</label>
<div>
<ciy-selcas com="departid" all="本级" />
</div>
</div>
<div class="ciy-form col-24 col-sm-16">
<label class="lang" id="id_role_label">岗位角色</label>
<div id="id_role">
<ciy-select com="roleid" minwidth="10em" />
</div>
</div>
</div>
</div>
<script type="text/javascript" src="/jscss/ciy.js"></script>
<script type="text/javascript" src="/jscss/ciytable.js"></script>
<script type="text/javascript" src="/jscss/ciycmp.js"></script>
<script type="text/javascript" src="/jscss/ciycmp2.js"></script>
<script type="text/javascript" src="../common.js"></script>
<script type="text/javascript">
'use strict';
var table;
var Glob = {};
ciyfn.pageload(function () {
table = new ciyclass.table({
dom: '.table'
, url: 'init'
, pagecount: 10
, fn_beforedata: function (json) {
if (json.once)
filldepart(json.once.zc_depart);
ciyfn.fillsearch({
searchdom: '.search'
, data: json
, liall: '全部'
, lidata: 'stpstatus'
, liclick: function (dom) {
table.search(dom, 'li');
}
});
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 warn" onclick="menubtn(this, 'repass')">重置密码</a>`;
return html;
}
}
});
table.callpage(1);
});
function filldepart(departs) {
departs = ciyfn.conv_treerow(departs, 0, 0);
var html = '<div data-id="" class="lang selected">全部</div>';
for (var i in departs) {
var deep = toint(departs[i]['_deep']);
html += '<div data-id="' + departs[i]['id'] + '" class="lang">' + ' '.repeat(deep) + departs[i]['name'] + '</div>';
}
$5('.tabledepart').html(html);
$5('.tabledepart').on('click', 'div', function (e) {
$5('.tabledepart .selected').removeClass('selected');
$5(e.currentTarget).addClass('selected');
var id = $5(e.currentTarget).attr('data-id');
table.post.departid = id;
table.callpage(1);
});
}
function chgdepart(departid) {
table.post.departid = departid;
table.callpage(1);
}
function menubtn(dom, btn) {
var id = $5(dom).parent('tr').attr('data-id');
if (btn == 'edit') {
edit(id);
}
if (btn == 'repass') {
ciyfn.callfastfunc(dom, '是否重置密码?', 'repass', { id: id }, function (json) { ciyfn.alert(json.msg) });
}
}
function edit(id) {
ciyfn.alert({
title: id == 0 ? '新建' : '修改'
, width: 'pc'
, content: document.getElementById("alert_edit").innerHTML
//, noparent:true
, fn_showed: function (doc, dom) {
Glob.edit = id;
if (id == 0 && !table.data[0])
table.data[0] = { stpstatus: 10, _urole: [] };
$5('[name=id]', dom).val(table.data[id].id);
$5('[name=name]', dom).val(table.data[id].name);
$5('[name=mobile]', dom).val(table.data[id].mobile);
ciycmp({ dom: $5('[com=icon]', dom), value: table.data[id].icon });
ciycmp({ dom: $5('[com=stpstatus]', dom), value: table.data[id].stpstatus, range: 'stpstatus' });
ciycmp({ dom: $5('[com=sex]', dom), value: table.data[id].sex, range: 'sex' });
ciycmp({ dom: $5('[com=departid]', dom), value: table.data[id].departid, range: table.once.zc_depart });
ciycmp({ dom: $5('[com=roleid]', dom), value: table.data[id].roleid, range: table.once.zc_role });
}
, btns: ["提交", "*关闭"]
, 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('提交成功');
});
}
});
}
function multiin() {
ciyfn.table_multiin('importxls', document.getElementById("alert_multiin").innerHTML, function (json) {
ciyfn.toast('导入成功');
table.cachecount = -1;
table.callpage();
});
}
function exportxls() {
ciyfn.table_exportxls('exportxls', table, function (json) {
ciyfn.alert({
content: '<div style="text-align:center;"><span class="lang">导出数据已生成</span><br/><br/><a class="lang btn lg" href="' + json.url + '" target="_blank">下载数据</a></div>'
, btns: null
});
});
}
</script>
</body>
</html>

523
web/admin/demo/catlist.php Normal file
View File

@ -0,0 +1,523 @@
<?php
namespace web\admin\demo;
class catlist {
static function setwhere($db, $post) {
$query = $post->get('query');
$csql = new \ciy\sql('zc_admin');
$csql->where('departid', $post->get('departid'));
$liid = objint($query, 'liid');
if ($liid > 0)
$csql->where('stpstatus', $liid);
$csql->where('name like', objstr($query, 'name'));
$csql->where('mobile like', objstr($query, 'mobile'));
$csql->where('sex', objstr($query, 'sex'));
$csql->wheredaterange('logintimes', objstr($query, 'logintimes'));
$csql->wheredaterange('addtimes', objstr($query, 'addtimes'));
$order = objstr($query, 'order', 'id desc');
$csql->order($order);
$query['order'] = $order;
return [$query, $csql];
}
public static function json_init() {
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);
$ret = array('where' => $where, 'pageno' => $pageno, 'pagecount' => $pagecount, 'count' => $mainrowcount, 'list' => $rows);
if ($post->getbool('field')) {
$field = array();
$fshow = $db->getfield($field, 'zc_admin');
foreach ($field as $fr => $v) {
if ($post->is('_' . $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();
$input = array();
$input[] = array(
'type' => 'input',
'form' => 'name',
'name' => '姓名',
'prop' => ' style="width:8em;"'
);
$input[] = array(
'type' => 'input',
'form' => 'mobile',
'name' => '手机号',
'prop' => ' style="width:8em;"'
);
$input[] = array(
'type' => 'select',
'form' => 'sex',
'name' => '性别',
'select' => 'sex',
'all' => '全部'
);
$input[] = array(
'type' => 'daterange',
'form' => 'logintimes',
'name' => '登录时间'
);
$input[] = array(
'type' => 'daterange',
'form' => 'addtimes',
'name' => '注册时间'
);
$ret['once']['input'] = $input;
$csql = (new \ciy\sql('zc_depart'))->column('id,upid,name,isuse');
$ret['once']['zc_depart'] = $db->get($csql);
$csql = new \ciy\sql('zc_role');
$csql->column('id,name');
$ret['once']['zc_role'] = $db->get($csql);
}
return succjson($ret);
}
public static function json_update() {
global $db;
$rsuser = verifyfast();
$post = new \ciy\post();
$id = $post->getint('id');
$name = $post->get('name');
if (empty($name))
return errjson('请填写姓名');
$stpstatus = $post->getint('stpstatus');
if ($stpstatus <= 0)
return errjson('请填写状态');
$mobile = $post->get('mobile');
if (empty($mobile))
return errjson('请填写手机号');
$sex = $post->getint('sex');
if ($sex <= 0)
return errjson('请填写性别');
$departid = $post->getint('departid');
if ($departid == 0)
return errjson('请选择组织/部门');
$roleid = $post->getint('roleid');
$icon = $post->get('icon');
$datarow = null;
if ($id > 0) {
if (nopower($db, $rsuser['id'], 'p500u'))
return errjson('您未被授权操作修改');
$csql = new \ciy\sql('zc_admin');
$csql->where('id', $id);
$datarow = $db->getone($csql);
if (!is_array($datarow))
return errjson('数据不存在');
if ($datarow['roleid'] != $roleid) {
if (nopower($db, $rsuser['id'], 'p500r'))
return errjson('您没有赋予角色的权限');
} else
$roleid = 0;
} else {
if (nopower($db, $rsuser['id'], 'p500a'))
return errjson('您未被授权操作新增');
if (nopower($db, $rsuser['id'], 'p500r'))
$roleid = 0;
}
if ($roleid > 0) {
$csql = new \ciy\sql('zc_role');
$csql->where('id', $roleid);
$rolerow = $db->getone($csql);
if (!is_array($rolerow))
return errjson('角色不存在');
}
try {
$db->begin();
$csql = new \ciy\sql('zc_admin');
$csql->where('mobile', $mobile);
$csql->column('id');
$chkid = toint($db->get1($csql));
if ($chkid > 0 && (($id > 0 && $chkid != $id) || $id == 0))
throw new \Exception('CIYIGN数据已存在');
$updata = array();
$updata['icon'] = $icon;
$updata['name'] = $name;
$updata['stpstatus'] = $stpstatus;
$updata['mobile'] = $mobile;
$updata['sex'] = $sex;
$updata['departid'] = $departid;
$updata['roleid'] = $roleid;
if ($roleid > 0) {
$updata['power'] = $rolerow['power'];
}
$csql = new \ciy\sql('zc_admin');
if ($id > 0) {
$csql->where('id', $id);
if ($db->update($csql, $updata) === false)
throw new \Exception('更新失败:' . $db->error);
if ($stpstatus == 10) {
if ($roleid > 0 || $datarow['name'] != $name || $datarow['icon'] != $icon)
if ($db->execute('update zc_online set usrchg=2 where user=?', array($id)) === false)
throw new \Exception('更新online失败:' . $db->error);
} else {
if ($db->execute('delete from zc_online where user=?', array($id)) === false)
throw new \Exception('删除online失败:' . $db->error);
}
if ($datarow['name'] != $name)
$db->execute('update zc_online set usrchg=2');
} else {
$updata['addtimes'] = tostamp();
if ($db->insert($csql, $updata) === false)
throw new \Exception('新增失败:' . $db->error);
$id = $db->insert_id();
if ($db->execute('update zc_online set usrchg=2') === false)
throw new \Exception('更新online失败:' . $db->error);
}
$updata['id'] = $id;
savelogdb($db, $rsuser['id'], 'zc_admin', $datarow, $updata);
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['data'] = $updata;
return succjson($ret);
}
public static function json_del() {
global $db;
$rsuser = verifyfast();
if (nopower($db, $rsuser['id'], 'p500d'))
return errjson('您未被授权操作');
$post = new \ciy\post();
$ids = $post->get('ids');
if (empty($ids))
return errjson('请选择至少一条');
$csql = new \ciy\sql('zc_admin');
$csql->where('id in', $ids);
$rows = $db->get($csql);
$vids = array();
try {
$db->begin();
foreach ($rows as $row) {
$delid = $row['id'];
if ($rsuser['id'] == $delid)
throw new \Exception('CIYIGN不能删除本人');
if ($row['id'] == 10)
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);
$vids[] = $delid;
}
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$db->execute('update zc_online set usrchg=2');
$ret['ids'] = $vids;
return succjson($ret);
}
public static function json_repass() {
global $db;
$rsuser = verifyfast();
global $_token;
if (nopower($db, $rsuser['id'], 'p500p'))
return errjson('您未被授权操作');
$post = new \ciy\post();
$id = $post->getint('id');
$newpass = rand(100000, 999999);
try {
$db->begin();
$updata = array();
$updata['trytime'] = 0;
$updata['password'] = sha256($newpass . $_token['salt']);
$csql = new \ciy\sql('zc_admin');
$csql->where('id', $id);
if ($db->update($csql, $updata) === false)
throw new \Exception('更新失败:' . $db->error);
if ($db->execute('delete from zc_online where user=?', array($id)) === false)
throw new \Exception('删除online失败:' . $db->error);
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['msg'] = '重置后密码: ' . $newpass;
return succjson($ret);
}
public static function json_exportxls() {
global $db;
$rsuser = verifyfast();
if (nopower($db, $rsuser['id'], 'p500e'))
return errjson('您未被授权操作');
$post = new \ciy\post();
$csql = new \ciy\sql('zc_admin');
list($where, $csql) = self::setwhere($db, $post);
$rows = $db->get($csql);
if (count($rows) > 10000)
return errjson('将导出' . count($rows) . '条不建议超过1万条请筛选缩小范围');
$fields = array();
$fields[] = array('width' => 60, 'style' => 'c', 'field' => 'id', 'name' => '行码');
$fields[] = array('width' => 100, 'style' => 'l', 'field' => 'name', 'name' => '姓名');
$fields[] = array('width' => 60, 'style' => 'c', 'field' => 'stpstatus', 'name' => '状态');
$fields[] = array('width' => 100, 'style' => 'l', 'field' => 'mobile', 'name' => '手机号');
$fields[] = array('width' => 60, 'style' => 'c', 'field' => 'sex', 'name' => '性别');
$fields[] = array('width' => 100, 'style' => 'l', 'field' => 'departid', 'name' => '所属组织');
$fields[] = array('width' => 100, 'style' => 'l', 'field' => 'logintimes', 'name' => '活跃时间');
$fields[] = array('width' => 100, 'style' => 'l', 'field' => 'addtimes', 'name' => '注册时间');
$code_stpstatus = getcatas($db, 'stpstatus', 'zc_cata');
$code_sex = getcatas($db, 'sex', 'zc_cata');
$csql = (new \ciy\sql('zc_depart'))->column('id,upid,name');
$code_departid = $db->get($csql);
$datas = array();
foreach ($rows as $row) {
$dat = array();
foreach ($fields as $field) {
$field = $field['field'];
$val = isset($row[$field]) ? $row[$field] : '';
if ($field == 'id')
$val = enid($val);
if ($field == 'stpstatus')
$val = ccode($code_stpstatus, $val);
if ($field == 'sex')
$val = ccode($code_sex, $val);
if ($field == 'departid')
$val = implode('-', mcode($code_departid, $val));
if ($field == 'logintimes')
$val = ($val == 0 ? '--' : date('Y-m-d H:i', $val));
if ($field == 'addtimes')
$val = ($val == 0 ? '--' : date('Y-m-d H:i', $val));
$dat[] = $val;
}
$datas[] = $dat;
}
$param = array();
$param['field'] = $fields;
$param['data'] = $datas;
$param['sheetname'] = '数据报表';
$param['titleheight'] = '25'; //列头高度
$param['landscape'] = true; //横向打印
$param['fixtopage'] = true; //打印整个工作表
$param['toptitle'] = '管理员数据报表';
// $param['total'] = array();
// $param['total'][] = array('name'=>'合计','merge'=>8,'style'=>'l');
// $param['total'][] = array('name'=>'=SUM(R[-'.count($datas).']C:R[-1]C)','style'=>'r');
// $param['total'][] = array('name'=>'=MAX(R[-'.count($datas).']C:R[-1]C)','style'=>'r');
// $param['total'][] = array('name'=>'','style'=>'l');
// $param['total'][] = array('name'=>'','style'=>'l');
//$param['rowstop'] = '<Row ss:Height="45"><Cell ss:MergeAcross="4" ss:StyleID="cap"><Data ss:Type="String">众产CIYPHP</Data></Cell></Row>';//顶部行
//$param['rowsfooter'] = '<Row><Cell ss:MergeAcross="1"><Data ss:Type="String" ss:StyleID="r">合计</Data></Cell><Cell ss:Formula="=SUM(R[-2]C:R[-1]C)"><Data ss:Type="Number"></Data></Cell></Row>';//底部行
$str = \ciy\excel::general_excel_xml($param);
$filename = '';
if (empty($filename))
$filename = date('Y-m-d_H-i-s') . rand(1000, 9999);
$filename .= '.xls';
file_put_contents(PATH_WEB . 'ud/tmp/' . $filename, $str);
return succjson(array('url' => '/ud/tmp/' . $filename));
}
public static function json_importxls_in() {
global $db;
$rsuser = verifyfast();
if (nopower($db, $rsuser['id'], 'p500a'))
return errjson('您未被授权操作新增');
$post = new \ciy\post();
$file = $post->get('file');
if (!file_exists(PATH_WEB . 'ud/' . $file))
return errjson('文件不存在');
require_once PATH_ROOT . '../libs/phpoffice/autoload.php';
$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load(PATH_WEB . 'ud/' . $file);
$sheet = $spreadsheet->getActiveSheet();
$datas = $sheet->toArray('', true, true, false);
$datacnt = count($datas);
if ($datacnt < 2)
return errjson('数据为空');
$html = '';
$headsn = array();
$headsn[] = '姓名.name';
$headsn[] = '手机号.mobile';
$headsn[] = '性别.sex';
$headsn[] = '所属组织.departid';
$xlsidx = 1;
if (empty($datas[0][count($headsn) - 1]))
$xlsidx = 2;
$heads = array();
foreach ($headsn as $_head) {
$hd = explode('.', $_head);
if (count($hd) < 2)
continue;
$heads[] = array(
'idx' => array_search($hd[0], $datas[$xlsidx - 1]),
'fld' => $hd[1],
'name' => $hd[0]
);
}
$code_sex = getcatas($db, 'sex', 'zc_cata');
$csql = (new \ciy\sql('zc_depart'))->column('id,upid,name');
$code_departid = $db->get($csql);
$html .= '<div class="table">';
$html .= '<table><tbody><tr>';
$html .= '<th>#</th>';
foreach ($heads as $arr) {
$html .= '<th>' . $arr['name'] . '</th>';
}
$html .= '</tr>';
$cnt = 0;
$uniques = array();
$id = 0;
for ($rowidx = $xlsidx; $rowidx < $datacnt; $rowidx++) {
$lineidx = $rowidx - $xlsidx + 1;
$hrhtml = '';
$firsthtml = '<td><div>' . $lineidx . '</div></td>';
$bempty = true;
$unqs = array();
$csql = new \ciy\sql('zc_admin');
foreach ($heads as $arr) {
$name = $arr['name'];
$errmsg = ''; //数据有误,显示红色说明
$showdat = ''; //显示在表格中的数据
if ($arr['idx'] > -1)
$showdat = trim($datas[$rowidx][$arr['idx']]);
if ($showdat == '--')
$showdat = '';
$value = $showdat; //在表单中的数据(转换后)
$ext = ''; //扩展表单
if ($name == '行码') {
if (empty($showdat)) {
$value = 0;
$showdat = '<kbd>新增</kbd>';
} else {
$id = deid($showdat);
if ($id == 0)
$errmsg = $name . '解析错误';
else {
$csqlchk = new \ciy\sql('zc_admin');
$csqlchk->where('id', $id)->column('id');
$chkid = toint($db->get1($csqlchk));
if ($chkid != $id)
$errmsg = $name . '在数据库中不存在';
$value = $id;
}
}
} else if ($name == '姓名') {
if (empty($showdat)) {
$errmsg = $name . '为必填项';
}
} else if ($name == '手机号') {
$csql->where('mobile', $showdat);
$unqs[] = $showdat;
if (empty($showdat)) {
$errmsg = $name . '为必填项';
}
} else if ($name == '性别') {
if (empty($showdat)) {
$errmsg = $name . '为必填项';
} else {
$value = dcode($code_sex, $showdat);
if ($value == -1)
$errmsg = $name . '文字与系统数据不匹配';
}
} else if ($name == '所属组织') {
if (empty($showdat)) {
$value = 0;
} else {
$dats = explode('-', $showdat);
$value = dcode($code_departid, $dats[count($dats) - 1]);
if ($value == -1)
$errmsg = $name . '文字与系统数据不匹配';
}
}
if (!empty($showdat))
$bempty = false;
if (empty($errmsg))
$hrhtml .= '<td><div>' . $showdat . '<input type="hidden" name="' . $arr['fld'] . '_' . $lineidx . '" value="' . $value . '"/>' . $ext . '</div></td>';
else
$hrhtml .= '<td style="background:#e09420;" title="#' . $lineidx . ':' . $errmsg . '"><div>' . $showdat . '</div></td>';
}
if ($bempty)
continue;
if (count($unqs) > 0) {
$unq = implode('|', $unqs);
if (in_array($unq, $uniques))
$firsthtml = '<td style="background:#ffe8c5;" title="#' . $lineidx . ':该行与待导入数据有重复"><div class="lang">重复</div></td>';
else {
$uniques[] = $unq;
$csql->column('id');
$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>';
}
}
$html .= '<tr>' . $firsthtml . $hrhtml . '</tr>';
$cnt++;
}
$html .= '</tbody></table></div>';
$html .= '<input type="hidden" name="total" value="' . $cnt . '"/>';
$html .= '<code>共' . $cnt . '条数据</code>';
return succjson(array('html' => $html, 'count' => $cnt));
}
public static function json_importxls_data() {
global $db;
$rsuser = verifyfast();
if (nopower($db, $rsuser['id'], 'p500a'))
return errjson('您未被授权操作新增');
$post = new \ciy\post();
$total = $post->getint('total');
try {
$db->begin();
for ($i = 1; $i <= $total; $i++) {
$id = $post->getint('id_' . $i);
$name = $post->get('name_' . $i);
$mobile = $post->get('mobile_' . $i);
$sex = $post->get('sex_' . $i);
$departid = $post->get('departid_' . $i);
$csql = new \ciy\sql('zc_admin');
$csql->where('mobile', $mobile);
$csql->column('id');
$chkid = toint($db->get1($csql));
if ($chkid > 0 && (($id > 0 && $chkid != $id) || $id == 0))
throw new \Exception('CIYIGN发现数据有重复');
$updata = array();
$updata['name'] = $name;
$updata['mobile'] = $mobile;
$updata['stpstatus'] = 10;
$updata['sex'] = $sex;
$updata['departid'] = $departid;
$updata['addtimes'] = tostamp();
$csql = new \ciy\sql('zc_admin');
if ($id == 0) {
if ($db->insert($csql, $updata) === false)
throw new \Exception('新增失败:' . $db->error);
} else {
$csql->where('id', $id);
if ($db->update($csql, $updata) === false)
throw new \Exception('更新失败:' . $db->error);
}
}
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$db->execute('update zc_online set usrchg=2');
return succjson();
}
}

View File

@ -1,8 +1,8 @@
<?php
namespace web\admin\demo;
namespace web\admin\demo\dyn;
class demo_ecc_ukey_ad {
class ecc_ukey_ad {
public static function json_checkecc() {
$post = new \ciy\post();
$pubkey = $post->get('pubkey');

View File

@ -22,41 +22,33 @@
websocket示例。
</div>
<div>
<a class="btn sm" href="dyn/sse.html" target="_blank">SSE</a>
<a class="btn sm" href="sse.html" target="_blank">SSE</a>
SSE示例。
</div>
<div>
<a class="btn sm" href="bs/" target="_blank">bigscreen</a>
数据大屏实现原理。
<a class="btn sm" href="realip.html" target="_blank">realip</a>
复杂网络环境下获取真实ip
</div>
<div>
<a class="btn sm" href="demo_rsa.html" target="_blank">rsa sign</a>
<a class="btn sm" href="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>
<a class="btn sm" href="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>
<a class="btn sm" href="web3.html" target="_blank">web3</a>
web3登录、签名、验签
</div>
<div>
<a class="btn sm" href="dyn/mail.html" target="_blank">mail</a>
<a class="btn sm" href="mail.html" target="_blank">mail</a>
Mail收发邮件。
</div>
<div>
<a class="btn sm" href="dyn/openai.html" target="_blank">deepseek</a>
<a class="btn sm" href="openai.html" target="_blank">deepseek</a>
DeepSeek接口。
</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>

View File

@ -1,8 +1,8 @@
<?php
namespace web\admin\demo;
namespace web\admin\demo\dyn;
class tool_realip {
class realip {
public static function json_realip() {
$post = new \ciy\post();
$headers = explode("\n", $post->get('header'));

View File

@ -1,8 +1,8 @@
<?php
namespace web\admin\demo;
namespace web\admin\demo\dyn;
class demo_rsa {
class rsa {
public static function json_checkrsa() {
$post = new \ciy\post();
$pubkey = $post->get('pubkey');

View File

@ -1,8 +1,8 @@
<?php
namespace web\admin\demo;
namespace web\admin\demo\dyn;
class demo_web3 {
class web3 {
public static function json_checkweb3() {
$post = new \ciy\post();
$addr = $post->get('addr');

View File

@ -0,0 +1,48 @@
<!DOCTYPE html>
<html>
<head>
<title>GamePad手柄示例</title>
<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" />
<style>
</style>
</head>
<body class="px4 py4">
<blockquote>getGamepads 0-3</blockquote>
<div class="flex">
<pre id="gamepad0"></pre>
<pre id="gamepad1"></pre>
<pre id="gamepad2"></pre>
<pre id="gamepad3"></pre>
</div>
<script type="text/javascript" src="/jscss/ciy.js"></script>
<script>
var Glob = {};
function checkGamepadsHandel() {
let gamepads = navigator.getGamepads();
for (let i = 0; i < gamepads.length; i++) {
let gamepad = gamepads[i];
if (!gamepad)
continue;
var pre = JSON.stringify(gamepad.axes, null, 2) + '\n';
for (var bi in gamepad.buttons) {
pre += bi + ':' + gamepad.buttons[bi].pressed + ',' + gamepad.buttons[bi].touched + ',' + gamepad.buttons[bi].value + '\n';
}
$5('#gamepad' + i).text(pre);
}
}
Glob._gametimer = null;
addEventListener("gamepadconnected", (event) => {
Glob._gametimer = setInterval(checkGamepadsHandel, 50);
});
addEventListener("gamepaddisconnected", (event) => {
clearInterval(Glob._gametimer);
});
</script>
</body>
</html>

View File

@ -42,6 +42,7 @@
<button type="submit" class="btn lg">提交</button>
<a class="btn" onclick="chg()">改变值</a>
<a class="btn" onclick="chgrange()">改选项</a>
<pre id="id_result"></pre>
<div style="height:30em;">占位</div>
<div style="height:30em;">占位</div>
<div style="height:30em;">占位</div>
@ -49,7 +50,7 @@
<script type="text/javascript" src="/jscss/ciy.js"></script>
<script type="text/javascript" src="/jscss/ciycmp.js"></script>
<script type="text/javascript" src="../common.js"></script>
<script type="text/javascript" src="../../common.js"></script>
<script type="text/javascript">
'use strict';
@ -59,7 +60,7 @@
for (var i = 1; i < 15; i++) {
rg.push({ id: i, name: '测试' + i });
}
c = ciycmp({ dom: '[com=a]', range: rg, onchange: function (d) { console.log(d) } });
c = ciycmp({ dom: '[com=a]', range: rg, onchange: function (d) { showlog(d) } });
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' });
@ -69,7 +70,12 @@
function formsubmit(event) {
event.preventDefault();
var postparam = ciyfn.getform(event.target);
console.log(postparam);
showlog(postparam);
}
function showlog(dat) {
console.log(dat);
delete dat.dom;
$5('#id_result').html(JSON.stringify(dat, null, 2));
}
function chg() {
c.setvalue('2,4,5');

View File

@ -31,6 +31,7 @@
</div>
<button type="submit" class="btn lg">提交</button>
<a class="btn" onclick="chg()">改变值</a>
<pre id="id_result"></pre>
<div style="height:30em;">占位</div>
<div style="height:30em;">占位</div>
<div style="height:30em;">占位</div>
@ -39,20 +40,25 @@
<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" src="../../common.js"></script>
<script type="text/javascript">
'use strict';
var c;
ciyfn.pageload(function () {
c = ciycmp({ dom: '[com=a]', onchange: function (d) { console.log(d) } });
ciycmp({ dom: '[com=b]', onchange: function (d) { console.log(d) } });
ciycmp({ dom: '[com=c]', value:'2023-1-2~2024-6-3', onchange: function (d) { console.log(d) } });
c = ciycmp({ dom: '[com=a]', onchange: function (d) { showlog(d) } });
ciycmp({ dom: '[com=b]', onchange: function (d) { showlog(d) } });
ciycmp({ dom: '[com=c]', value:'2023-1-2~2024-6-3', onchange: function (d) { showlog(d) } });
});
function formsubmit(event) {
event.preventDefault();
var postparam = ciyfn.getform(event.target);
console.log(postparam);
showlog(postparam);
}
function showlog(dat) {
console.log(dat);
delete dat.dom;
$5('#id_result').html(JSON.stringify(dat, null, 2));
}
function chg(){
console.log(c);

View File

@ -31,6 +31,7 @@
</div>
<button type="submit" class="btn lg">提交</button>
<a class="btn" onclick="chg()">改变值</a>
<pre id="id_result"></pre>
<div style="height:30em;">占位</div>
<div style="height:30em;">占位</div>
<div style="height:30em;">占位</div>
@ -39,20 +40,25 @@
<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" src="../../common.js"></script>
<script type="text/javascript">
'use strict';
var c;
ciyfn.pageload(function () {
c = ciycmp({ dom: '[com=a]', onchange: function (d) { console.log(d) } });
ciycmp({ dom: '[com=b]', onchange: function (d) { console.log(d) } });
ciycmp({ dom: '[com=c]', value:'1720717728', onchange: function (d) { console.log(d) } });
c = ciycmp({ dom: '[com=a]', onchange: function (d) { showlog(d) } });
ciycmp({ dom: '[com=b]', onchange: function (d) { showlog(d) } });
ciycmp({ dom: '[com=c]', value:'1720717728', onchange: function (d) { showlog(d) } });
});
function formsubmit(event) {
event.preventDefault();
var postparam = ciyfn.getform(event.target);
console.log(postparam);
showlog(postparam);
}
function showlog(dat) {
console.log(dat);
delete dat.dom;
$5('#id_result').html(JSON.stringify(dat, null, 2));
}
function chg(){
console.log(c);

View File

@ -37,6 +37,7 @@
</div>
<button type="submit" class="btn lg">提交</button>
<a class="btn" onclick="chg()">改变值</a>
<pre id="id_result"></pre>
<div style="height:30em;">占位</div>
<div style="height:30em;">占位</div>
<div style="height:30em;">占位</div>
@ -46,23 +47,28 @@
<script type="text/javascript" src="/jscss/ciycmp.js"></script>
<script type="text/javascript" src="/jscss/ciycmp2.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" src="../../common.js"></script>
<script type="text/javascript">
'use strict';
var c;
ciyfn.pageload(function () {
c = ciycmp({ dom: '[com=a]' });
c.onchange = function (d) { console.log(d) };
ciycmp({ dom: '[com=b]', onchange: function (d) { console.log(d) } });
ciycmp({ dom: '[com=c]', value: 100, onchange: function (d) { console.log(d) } });
ciycmp({ dom: '[com=d]', value: "0", onchange: function (d) { console.log(d) } });
ciycmp({ dom: '[com=e]', value: "023", onchange: function (d) { console.log(d) } });
c.onchange = function (d) { showlog(d) };
ciycmp({ dom: '[com=b]', onchange: function (d) { showlog(d) } });
ciycmp({ dom: '[com=c]', value: 100, onchange: function (d) { showlog(d) } });
ciycmp({ dom: '[com=d]', value: "0", onchange: function (d) { showlog(d) } });
ciycmp({ dom: '[com=e]', value: "023", onchange: function (d) { showlog(d) } });
});
function formsubmit(event) {
event.preventDefault();
var postparam = ciyfn.getform(event.target);
console.log(postparam);
showlog(postparam);
}
function showlog(dat) {
console.log(dat);
delete dat.dom;
$5('#id_result').html(JSON.stringify(dat, null, 2));
}
function chg() {
c.setvalue(220);

View File

@ -29,6 +29,7 @@
</div>
<button type="submit" class="btn lg">提交</button>
<a class="btn" onclick="chg()">改变值</a>
<pre id="id_result"></pre>
<div style="height:30em;">占位</div>
<div style="height:30em;">占位</div>
<div style="height:30em;">占位</div>
@ -37,20 +38,25 @@
<script type="text/javascript" src="/jscss/ciy.js"></script>
<script type="text/javascript" src="/jscss/ciycmp.js"></script>
<script type="text/javascript" src="/jscss/ciycmp2.js"></script>
<script type="text/javascript" src="../common.js"></script>
<script type="text/javascript" src="../../common.js"></script>
<script type="text/javascript">
'use strict';
var c;
ciyfn.pageload(function () {
c = ciycmp({ dom: '[com=a]', onchange: function (d) { console.log(d) } });
ciycmp({ dom: '[com=b]', onchange: function (d) { console.log(d) } });
ciycmp({ dom: '[com=c]', value:'-2', onchange: function (d) { console.log(d) } });
c = ciycmp({ dom: '[com=a]', onchange: function (d) { showlog(d) } });
ciycmp({ dom: '[com=b]', onchange: function (d) { showlog(d) } });
ciycmp({ dom: '[com=c]', value:'-2', onchange: function (d) { showlog(d) } });
});
function formsubmit(event) {
event.preventDefault();
var postparam = ciyfn.getform(event.target);
console.log(postparam);
showlog(postparam);
}
function showlog(dat) {
console.log(dat);
delete dat.dom;
$5('#id_result').html(JSON.stringify(dat, null, 2));
}
function chg(){
console.log(c);

View File

@ -29,6 +29,7 @@
</div>
<button type="submit" class="btn lg">提交</button>
<a class="btn" onclick="chg()">改变值</a>
<pre id="id_result"></pre>
<div style="height:30em;">占位</div>
<div style="height:30em;">占位</div>
<div style="height:30em;">占位</div>
@ -37,20 +38,25 @@
<script type="text/javascript" src="/jscss/ciy.js"></script>
<script type="text/javascript" src="/jscss/ciycmp.js"></script>
<script type="text/javascript" src="/jscss/ciycmp2.js"></script>
<script type="text/javascript" src="../common.js"></script>
<script type="text/javascript" src="../../common.js"></script>
<script type="text/javascript">
'use strict';
var c;
ciyfn.pageload(function () {
c = ciycmp({ dom: '[com=a]', onchange: function (d) { console.log(d) } });
ciycmp({ dom: '[com=b]', onchange: function (d) { console.log(d) } });
ciycmp({ dom: '[com=c]', value:'盒|20|箱', onchange: function (d) { console.log(d) } });
c = ciycmp({ dom: '[com=a]', onchange: function (d) { showlog(d) } });
ciycmp({ dom: '[com=b]', onchange: function (d) { showlog(d) } });
ciycmp({ dom: '[com=c]', value:'盒|20|箱', onchange: function (d) { showlog(d) } });
});
function formsubmit(event) {
event.preventDefault();
var postparam = ciyfn.getform(event.target);
console.log(postparam);
showlog(postparam);
}
function showlog(dat) {
console.log(dat);
delete dat.dom;
$5('#id_result').html(JSON.stringify(dat, null, 2));
}
function chg(){
console.log(c);

View File

@ -29,6 +29,7 @@
</div>
<button type="submit" class="btn lg">提交</button>
<a class="btn" onclick="chg()">改变值</a>
<pre id="id_result"></pre>
<div style="height:30em;">占位</div>
<div style="height:30em;">占位</div>
<div style="height:30em;">占位</div>
@ -37,20 +38,25 @@
<script type="text/javascript" src="/jscss/ciy.js"></script>
<script type="text/javascript" src="/jscss/ciycmp.js"></script>
<script type="text/javascript" src="/jscss/ciycmp2.js"></script>
<script type="text/javascript" src="../common.js"></script>
<script type="text/javascript" src="../../common.js"></script>
<script type="text/javascript">
'use strict';
var c;
ciyfn.pageload(function () {
c = ciycmp({ dom: '[com=a]', onchange: function (d) { console.log(d) } });
ciycmp({ dom: '[com=b]', onchange: function (d) { console.log(d) } });
ciycmp({ dom: '[com=loc]', value: { lat: 12, lng: 34 }, onchange: function (d) { console.log(d) } });
c = ciycmp({ dom: '[com=a]', onchange: function (d) { showlog(d) } });
ciycmp({ dom: '[com=b]', onchange: function (d) { showlog(d) } });
ciycmp({ dom: '[com=loc]', value: { lat: 12, lng: 34 }, onchange: function (d) { showlog(d) } });
});
function formsubmit(event) {
event.preventDefault();
var postparam = ciyfn.getform(event.target);
console.log(postparam);
showlog(postparam);
}
function showlog(dat) {
console.log(dat);
delete dat.dom;
$5('#id_result').html(JSON.stringify(dat, null, 2));
}
function chg() {
console.log(c);

View File

@ -21,6 +21,7 @@
</div>
<button type="submit" class="btn lg">提交</button>
<a class="btn" onclick="chg()">改变值</a>
<pre id="id_result"></pre>
<div style="height:30em;">占位</div>
<div style="height:30em;">占位</div>
<div style="height:30em;">占位</div>
@ -29,18 +30,23 @@
<script type="text/javascript" src="/jscss/ciy.js"></script>
<script type="text/javascript" src="/jscss/ciycmp.js"></script>
<script type="text/javascript" src="/jscss/ciycmp2.js"></script>
<script type="text/javascript" src="../common.js"></script>
<script type="text/javascript" src="../../common.js"></script>
<script type="text/javascript">
'use strict';
var c;
ciyfn.pageload(function () {
c = ciycmp({ dom: '[com=a]', path:'demo', onchange: function (d) { console.log(d) } });
c = ciycmp({ dom: '[com=a]', path:'demo', onchange: function (d) { showlog(d) } });
});
function formsubmit(event) {
event.preventDefault();
var postparam = ciyfn.getform(event.target);
console.log(postparam);
showlog(postparam);
}
function showlog(dat) {
console.log(dat);
delete dat.dom;
$5('#id_result').html(JSON.stringify(dat, null, 2));
}
function chg(){
c.setvalue('aaabbb\ncccddd');

View File

@ -33,6 +33,7 @@
</div>
<button type="submit" class="btn lg">提交</button>
<a class="btn" onclick="chg()">改变值</a>
<pre id="id_result"></pre>
<div style="height:30em;">占位</div>
<div style="height:30em;">占位</div>
<div style="height:30em;">占位</div>
@ -40,7 +41,7 @@
<script type="text/javascript" src="/jscss/ciy.js"></script>
<script type="text/javascript" src="/jscss/ciycmp.js"></script>
<script type="text/javascript" src="../common.js"></script>
<script type="text/javascript" src="../../common.js"></script>
<script type="text/javascript">
'use strict';
@ -50,7 +51,7 @@
for (var i = 1; i < 5; i++) {
rg.push({ id: i, name: '测试' + i });
}
c = ciycmp({ dom: '[com=a]', range: rg, onchange: function (d) { console.log(d) } });
c = ciycmp({ dom: '[com=a]', range: rg, onchange: function (d) { showlog(d) } });
ciycmp({ dom: '[com=b]', range: rg });
ciycmp({ dom: '[com=c]', range: rg, value: '1' });
ciycmp({ dom: '[com=d]', range: [{ id: 'aa', name: 'AAA' }, { id: 'bb', name: 'BBB' }], value: 'bb' });
@ -58,7 +59,12 @@
function formsubmit(event) {
event.preventDefault();
var postparam = ciyfn.getform(event.target);
console.log(postparam);
showlog(postparam);
}
function showlog(dat) {
console.log(dat);
delete dat.dom;
$5('#id_result').html(JSON.stringify(dat, null, 2));
}
function chg() {
c.setvalue(2);

View File

@ -36,6 +36,7 @@
<button type="submit" class="btn lg">提交</button>
<a class="btn" onclick="chg()">改变值</a>
<a class="btn" onclick="chgrange()">改选项</a>
<pre id="id_result"></pre>
<div style="height:30em;">占位</div>
<div style="height:30em;">占位</div>
</form>
@ -44,7 +45,7 @@
<script type="text/javascript" src="/jscss/ciycmp.js"></script>
<script type="text/javascript" src="/jscss/ciycmp2.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" src="../../common.js"></script>
<script type="text/javascript">
'use strict';
@ -54,7 +55,7 @@
for (var i = 1; i < 115; i++) {
rg.push({ id: i, name: '测试' + i });
}
c = ciycmp({ dom: '[com=a]', range: ciy_arearpc, onchange: function (d) { console.log(d) } });
c = ciycmp({ dom: '[com=a]', range: ciy_arearpc, onchange: function (d) { showlog(d) } });
ciycmp({ dom: '[com=b]', range: ciy_arearpc });
ciycmp({ dom: '[com=c]', range: 'prodcata', value: '11031' });//11036
ciycmp({ dom: '[com=d]', range: [{ id: 'aa', name: 'AAA' }, { id: 'bb', name: 'BBB' }], value: 'bb' });
@ -62,7 +63,12 @@
function formsubmit(event) {
event.preventDefault();
var postparam = ciyfn.getform(event.target);
console.log(postparam);
showlog(postparam);
}
function showlog(dat) {
console.log(dat);
delete dat.dom;
$5('#id_result').html(JSON.stringify(dat, null, 2));
}
function chg() {
c.setvalue('140215');

View File

@ -36,6 +36,7 @@
<button type="submit" class="btn lg">提交</button>
<a class="btn" onclick="chg()">改变值</a>
<a class="btn" onclick="chgrange()">改选项</a>
<pre id="id_result"></pre>
<div style="height:30em;">占位</div>
<div style="height:30em;">占位</div>
</form>
@ -43,7 +44,7 @@
<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" src="../../common.js"></script>
<script type="text/javascript">
'use strict';
@ -53,7 +54,7 @@
for (var i = 1; i < 115; i++) {
rg.push({ id: i, name: '测试' + i });
}
c = ciycmp({ dom: '[com=a]', range: rg, onchange: function (d) { console.log(d) } });
c = ciycmp({ dom: '[com=a]', range: rg, onchange: function (d) { showlog(d) } });
ciycmp({ dom: '[com=b]', range: ciy_arearpc, filter: { field: 'upid', value: '140700' } });
ciycmp({ dom: '[com=c]', range: rg });
ciycmp({ dom: '[com=d]', range: [{ id: 'aa', name: 'AAA' }, { id: 'bb', name: 'BBB' }], value: 'bb' });
@ -61,7 +62,12 @@
function formsubmit(event) {
event.preventDefault();
var postparam = ciyfn.getform(event.target);
console.log(postparam);
showlog(postparam);
}
function showlog(dat) {
console.log(dat);
delete dat.dom;
$5('#id_result').html(JSON.stringify(dat, null, 2));
}
function chg() {
c.setvalue('2');

View File

@ -36,6 +36,7 @@
<button type="submit" class="btn lg">提交</button>
<a class="btn" onclick="chg()">改变值</a>
<a class="btn" onclick="chgrange()">改选项</a>
<pre id="id_result"></pre>
<div style="height:30em;">占位</div>
<div style="height:30em;">占位</div>
</form>
@ -44,7 +45,7 @@
<script type="text/javascript" src="/jscss/ciycmp.js"></script>
<script type="text/javascript" src="/jscss/ciycmp2.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" src="../../common.js"></script>
<script type="text/javascript">
'use strict';
@ -54,7 +55,7 @@
for (var i = 1; i < 115; i++) {
rg.push({ id: i, name: '测试' + i });
}
c = ciycmp({ dom: '[com=a]', range: rg, onchange: function (d) { console.log(d) } });
c = ciycmp({ dom: '[com=a]', range: rg, onchange: function (d) { showlog(d) } });
ciycmp({ dom: '[com=b]', range: ciy_arearpc, filter: { field: 'upid', value: '140700' }, value: ',140721,140724,' });
ciycmp({ dom: '[com=c]', range: rg });
ciycmp({ dom: '[com=d]', range: [{ id: 'aa', name: 'AAA' }, { id: 'bb', name: 'BBB' }], value: 'bb' });
@ -62,7 +63,12 @@
function formsubmit(event) {
event.preventDefault();
var postparam = ciyfn.getform(event.target);
console.log(postparam);
showlog(postparam);
}
function showlog(dat) {
console.log(dat);
delete dat.dom;
$5('#id_result').html(JSON.stringify(dat, null, 2));
}
function chg() {
c.setvalue('2,4,5');

View File

@ -29,6 +29,7 @@
</div>
<button type="submit" class="btn lg">提交</button>
<a class="btn" onclick="chg()">改变值</a>
<pre id="id_result"></pre>
<div style="height:30em;">占位</div>
<div style="height:30em;">占位</div>
<div style="height:30em;">占位</div>
@ -37,7 +38,7 @@
<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" src="../../common.js"></script>
<script type="text/javascript">
'use strict';
@ -47,14 +48,19 @@
for (var i = 1; i < 114; i++) {
rg.push({ id: i, name: '测试测试测试测试测试' + i });
}
c = ciycmp({ dom: '[com=a]', onchange: function (d) { console.log(d) } });
c = ciycmp({ dom: '[com=a]', onchange: function (d) { showlog(d) } });
ciycmp({ dom: '[com=b]' });
ciycmp({ dom: '[com=c]', value: '1' });
});
function formsubmit(event) {
event.preventDefault();
var postparam = ciyfn.getform(event.target);
console.log(postparam);
showlog(postparam);
}
function showlog(dat) {
console.log(dat);
delete dat.dom;
$5('#id_result').html(JSON.stringify(dat, null, 2));
}
function chg(){
c.setvalue(2);

View File

@ -29,6 +29,7 @@
</div>
<button type="submit" class="btn lg">提交</button>
<a class="btn" onclick="chg()">改变值</a>
<pre id="id_result"></pre>
<div style="height:30em;">占位</div>
<div style="height:30em;">占位</div>
<div style="height:30em;">占位</div>
@ -37,20 +38,25 @@
<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" src="../../common.js"></script>
<script type="text/javascript">
'use strict';
var c;
ciyfn.pageload(function () {
c = ciycmp({ dom: '[com=a]', onchange: function (d) { console.log(d) } });
ciycmp({ dom: '[com=b]', onchange: function (d) { console.log(d) } });
ciycmp({ dom: '[com=c]', value: 'aaaa\nbbb\nccc\ndddd\neeee\nffffff\nggg', onchange: function (d) { console.log(d) } });
c = ciycmp({ dom: '[com=a]', onchange: function (d) { showlog(d) } });
ciycmp({ dom: '[com=b]', onchange: function (d) { showlog(d) } });
ciycmp({ dom: '[com=c]', value: 'aaaa\nbbb\nccc\ndddd\neeee\nffffff\nggg', onchange: function (d) { showlog(d) } });
});
function formsubmit(event) {
event.preventDefault();
var postparam = ciyfn.getform(event.target);
console.log(postparam);
showlog(postparam);
}
function showlog(dat) {
console.log(dat);
delete dat.dom;
$5('#id_result').html(JSON.stringify(dat, null, 2));
}
function chg(){
c.setvalue(2000);

View File

@ -31,6 +31,7 @@
</div>
<button type="submit" class="btn lg">提交</button>
<a class="btn" onclick="chg()">改变值</a>
<pre id="id_result"></pre>
<div style="height:30em;">占位</div>
<div style="height:30em;">占位</div>
<div style="height:30em;">占位</div>
@ -40,20 +41,25 @@
<script type="text/javascript" src="/jscss/ciycmp.js"></script>
<script type="text/javascript" src="/jscss/ciycmp2.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" src="../../common.js"></script>
<script type="text/javascript">
'use strict';
var c;
ciyfn.pageload(function () {
c = ciycmp({ dom: '[com=a]', onchange: function (d) { console.log(d) } });
ciycmp({ dom: '[com=b]', onchange: function (d) { console.log(d) } });
ciycmp({ dom: '[com=c]', value:'15916346', onchange: function (d) { console.log(d) } });
c = ciycmp({ dom: '[com=a]', onchange: function (d) { showlog(d) } });
ciycmp({ dom: '[com=b]', onchange: function (d) { showlog(d) } });
ciycmp({ dom: '[com=c]', value:'15916346', onchange: function (d) { showlog(d) } });
});
function formsubmit(event) {
event.preventDefault();
var postparam = ciyfn.getform(event.target);
console.log(postparam);
showlog(postparam);
}
function showlog(dat) {
console.log(dat);
delete dat.dom;
$5('#id_result').html(JSON.stringify(dat, null, 2));
}
function chg(){
console.log(c);

View File

@ -11,7 +11,7 @@
<body>
<form>
<form onsubmit="formsubmit(event);">
<div style="height:10em;">占位123</div>
<div class="row" style="background:#eeeeee;">
<div class="ciy-form col-24 col-sm-24">
@ -53,12 +53,13 @@
</div>
<button type="submit" class="btn lg">提交</button>
<a class="btn" onclick="chg()">改变值</a>
<pre id="id_result"></pre>
<div style="height:10em;">占位</div>
</form>
<script type="text/javascript" src="/jscss/ciy.js"></script>
<script type="text/javascript" src="/jscss/ciycmp.js"></script>
<script type="text/javascript" src="../common.js"></script>
<script type="text/javascript" src="../../common.js"></script>
<script type="text/javascript">
'use strict';
@ -66,27 +67,32 @@
ciyfn.pageload(function () {
var path = ciyfn.makeuploadpath('demo', ciyfn.getstorage(ciy_vars.tokenfield));
c = ciycmp({ dom: '[com=a]', path: path });
c.onchange = function (d) { console.log(d) };
ciycmp({ dom: '[com=b]', path: path, onchange: function (d) { console.log(d) } });
ciycmp({ dom: '[com=c]', path: path, onchange: function (d) { console.log(d) } });
ciycmp({ dom: '[com=d]', path: path, onchange: function (d) { console.log(d) } });
ciycmp({ dom: '[com=e]', path: path, onchange: function (d) { console.log(d) } });
c.onchange = function (d) { showlog(d) };
ciycmp({ dom: '[com=b]', path: path, onchange: function (d) { showlog(d) } });
ciycmp({ dom: '[com=c]', path: path, onchange: function (d) { showlog(d) } });
ciycmp({ dom: '[com=d]', path: path, onchange: function (d) { showlog(d) } });
ciycmp({ dom: '[com=e]', path: path, onchange: function (d) { showlog(d) } });
var f = ciycmp({
dom: '[com=f]', path: path, onchange: function (d) { console.log(d) }, fn_imgdraw: function (canvas, ctx, img) {
dom: '[com=f]', path: path, onchange: function (d) { showlog(d) }, fn_imgdraw: function (canvas, ctx, img) {
ctx.font = '40px Arial';
ctx.fillStyle = '#cc0000';
ctx.fillText('测试测试测试测试测试', 10, 60);
}
});
ciycmp({ dom: '[com=g]', path: path, onchange: function (d) { console.log(d) } });
ciycmp({ dom: '[com=h]', path: path, onchange: function (d) { console.log(d) } });
ciycmp({ dom: '[com=i]', path: path, onchange: function (d) { console.log(d) } });
ciycmp({ dom: '[com=g]', path: path, onchange: function (d) { showlog(d) } });
ciycmp({ dom: '[com=h]', path: path, onchange: function (d) { showlog(d) } });
ciycmp({ dom: '[com=i]', path: path, onchange: function (d) { showlog(d) } });
});
document.querySelector('form').addEventListener('submit', function (event) {
function formsubmit(event) {
event.preventDefault();
var postparam = ciyfn.getform(event.target);
console.log(postparam);
});
showlog(postparam);
}
function showlog(dat) {
console.log(dat);
delete dat.dom;
$5('#id_result').html(JSON.stringify(dat, null, 2));
}
function chg() {
console.log(c);
c.setvalue('/img/face.png');

View File

@ -91,27 +91,27 @@
</div>
<div class="bg2 px3 py3">
<div>
<a class="btn sm" href="demo_ajax.html" target="_blank">ajax</a>
<a class="btn sm" href="win_ajax.html" target="_blank">ajax</a>
通用函数。
</div>
<div>
<a class="btn sm" href="demo_toast.html" target="_blank">toast</a>
<a class="btn sm" href="win_toast.html" target="_blank">toast</a>
通用提示框。
</div>
<div>
<a class="btn sm" href="demo_showend.html" target="_blank">showend</a>
<a class="btn sm" href="win_showend.html" target="_blank">showend</a>
右下角叠加提示。
</div>
<div>
<a class="btn sm" href="demo_alert.html" target="_blank">alert</a>
<a class="btn sm" href="win_alert.html" target="_blank">alert</a>
通用对话框。
</div>
<div>
<a class="btn sm" href="demo_tabcard.html" target="_blank">tabcard</a>
<a class="btn sm" href="win_tabcard.html" target="_blank">tabcard</a>
选项卡。
</div>
<div>
<a class="btn sm" href="demo_button.html" target="_blank">button</a>
<a class="btn sm" href="win_button.html" target="_blank">button</a>
按钮。
</div>
</div>
@ -160,9 +160,13 @@
Proxy响应式示例。
</div>
<div>
<a class="btn sm" href="lab/tesseract.html" target="_blank">tesseract</a>
<a class="btn sm" href="../lab/tesseract.html" target="_blank">tesseract</a>
文字OCR识别。
</div>
<div>
<a class="btn sm" href="demo_gamepad.html" target="_blank">gamepad</a>
GamePad手柄控制。
</div>
</div>
<div class="ciy-form inline"><label>滑动选择</label>
@ -177,7 +181,7 @@
<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" src="../../common.js"></script>
<script type="text/javascript">
'use strict';
var table;

View File

@ -138,7 +138,7 @@
<script type="text/javascript" src="/jscss/ciy.js"></script>
<script type="text/javascript" src="/jscss/ciycmp.js"></script>
<script type="text/javascript" src="../common.js"></script>
<script type="text/javascript" src="../../common.js"></script>
<script type="text/javascript">
'use strict';
</script>

View File

@ -212,7 +212,7 @@
<script type="text/javascript" src="/jscss/ciy.js"></script>
<script type="text/javascript" src="/jscss/ciycmp.js"></script>
<script type="text/javascript" src="../common.js"></script>
<script type="text/javascript" src="../../common.js"></script>
<script type="text/javascript">
'use strict';
</script>

View File

@ -31,7 +31,7 @@
<script type="text/javascript" src="/jscss/ciy.js"></script>
<script type="text/javascript" src="/jscss/ciycmp.js"></script>
<script type="text/javascript" src="../common.js"></script>
<script type="text/javascript" src="../../common.js"></script>
<script type="text/javascript">
'use strict';
function formsubmit(event) {

View File

@ -154,7 +154,7 @@
</div>
<script type="text/javascript" src="/jscss/ciy.js"></script>
<script type="text/javascript" src="../common.js"></script>
<script type="text/javascript" src="../../common.js"></script>
<script type="text/javascript">
'use strict';
ciyfn.dropmenu('.btn-menu');

View File

@ -58,7 +58,7 @@
<script type="text/javascript" src="/jscss/ciy.js"></script>
<script type="text/javascript" src="/jscss/ciycmp.js"></script>
<script type="text/javascript" src="../common.js"></script>
<script type="text/javascript" src="../../common.js"></script>
<script type="text/javascript">
'use strict';
</script>

View File

@ -83,7 +83,7 @@
<script type="text/javascript" src="/jscss/ciy.js"></script>
<script type="text/javascript" src="/jscss/ciycmp.js"></script>
<script type="text/javascript" src="../common.js"></script>
<script type="text/javascript" src="../../common.js"></script>
<script type="text/javascript">
'use strict';
</script>

View File

@ -0,0 +1,116 @@
<!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;">
<div>
<div class="sinps"></div>
<div class="sbtns">
<button class="lang btn" type="submit">查询</button>
<a class="lang btn def" onclick="pagehelp()">帮助</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_pagehelp" style="display:none;">
<b>调用方法</b>
<div style="margin: 0 0 1em 1em;">
getconfig/setconfig函数调用。<br />
在admin/common.*中封装。<br />
</div>
</div>
<script type="text/javascript" src="/jscss/ciy.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;
ciyfn.pageload(function () {
$5(document).on('keydown', function (e) {
if (e.ctrlKey && e.keyCode == 83) {//Ctrl+S
e.preventDefault();
var upbtns = $5('.upbtn:not(.def)');
upbtns.each(function (dom) {
menubtn(dom, 'edit');
}, 0.5);
}
});
table = new ciyclass.table({
dom: '.table'
, url: 'init'
, pagecount: 10
, fn_beforedata: function (json) {
json.list = ciyfn.conv_treerow(json.list, 0, 0);
ciyfn.fillsearch({
searchdom: '.search'
, data: json
});
return json;
}
, fn_tdcontent: function (key, datashow, field, data) {
if (key == 'types' || key == 'params') {
return '<input style="width:100%;" onkeydown="btnset(this)" type="text" name="' + key + '" value="' + datashow + '"/>';
}
if (key == '_btn') {
var html = '';
if (data['id'] == 0)
html += '<a class="lang btn def upbtn" onclick="menubtn(this, \'edit\')">新增</a>';
else
html += '<a class="lang btn def upbtn" onclick="menubtn(this, \'edit\')">更新</a>';
return html;
}
}
});
table.callpage(1);
});
function btnset(dom) {
var domtr = $5(dom).parent('tr');
$5('.btn.upbtn', domtr).removeClass('def');
}
function pagehelp() {
ciyfn.alert({
title: '页面帮助'
, content: document.getElementById("alert_pagehelp").innerHTML
});
}
function menubtn(dom, btn) {
var trdom = $5(dom).parent('tr');
var id = trdom.attr('data-id');
if (btn == 'edit') {
var postparam = ciyfn.getform(dom, 'TR');
postparam.id = id;
ciyfn.callfunc('update', postparam, function (json) {
$5(dom).addClass('def');
if (id == 0) {
$5('input', trdom).val('');
table.updateline(json);
}
});
}
}
</script>
</body>
</html>

138
web/admin/demo/lineedit.php Normal file
View File

@ -0,0 +1,138 @@
<?php
namespace web\admin\demo;
class lineedit {
static function setwhere($db, $post) {
$query = $post->get('query');
$csql = new \ciy\sql('zc_config');
$csql->where('types like', objstr($query, 'types'));
$csql->where('params like', objstr($query, 'params'));
$order = objstr($query, 'order', 'id desc');
$csql->order($order);
$query['order'] = $order;
return [$query, $csql];
}
public static function json_init() {
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);
$rows[] = array('id' => 0, 'types' => '');
$ret = array('where' => $where, 'pageno' => $pageno, 'pagecount' => $pagecount, 'count' => $mainrowcount, 'list' => $rows);
if ($post->getbool('field')) {
$field = array();
$fshow = '';
$fshow = fieldadd($fshow, $field, -1, 'types', '参数代码');
$fshow = fieldadd($fshow, $field, -1, 'params', '参数值');
$fshow = fieldadd($fshow, $field, -1, '_btn', '操作');
$field['types']['thwidth'] = '12em';
$field['params']['thwidth'] = '21em';
$ret['fshow'] = $fshow;
$ret['field'] = $field;
}
if ($post->getbool('once')) {
$ret['once'] = array();
$input = array();
$input[] = array(
'type' => 'input', 'form' => 'types', 'name' => '参数代码', 'prop' => ' style="width:8em;"'
);
$input[] = array(
'type' => 'input', 'form' => 'params', 'name' => '参数值', 'prop' => ' style="width:8em;"'
);
$ret['once']['input'] = $input;
}
return succjson($ret);
}
public static function json_update() {
global $db;
$rsuser = verifyfast();
if (nopower($db, $rsuser['id'], 'p600u'))
return errjson('您未被授权操作');
$post = new \ciy\post();
$id = $post->getint('id');
$types = $post->get('types');
if ($types == '')
return errjson('请填写代码');
$params = $post->get('params');
$datarow = null;
if ($id > 0) {
$csql = new \ciy\sql('zc_config');
$csql->where('id', $id);
$datarow = $db->getone($csql);
if (!is_array($datarow))
return errjson('数据不存在');
}
try {
$db->begin();
$csql = new \ciy\sql('zc_config');
$csql->where('types', $types);
$csql->column('id');
$chkid = toint($db->get1($csql));
if ($chkid > 0 && (($id > 0 && $chkid != $id) || $id == 0))
throw new \Exception('CIYIGN代码重复');
$updata = array();
$updata['types'] = $types;
$updata['params'] = $params;
$csql = new \ciy\sql('zc_config');
if ($id > 0) {
$csql->where('id', $id);
if ($db->update($csql, $updata) === false)
throw new \Exception('更新失败:' . $db->error);
} else {
if ($db->insert($csql, $updata) === false)
throw new \Exception('新增失败:' . $db->error);
$id = $db->insert_id();
}
$updata['id'] = $id;
savelogdb($db, $rsuser['id'], 'zc_config', $datarow, $updata);
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['data'] = $updata;
return succjson($ret);
}
public static function json_del() {
global $db;
$rsuser = verifyfast();
if (nopower($db, $rsuser['id'], 'p600d'))
return errjson('您未被授权操作');
$post = new \ciy\post();
$ids = $post->get('ids');
if (empty($ids))
return errjson('请选择至少一条');
$csql = new \ciy\sql('zc_config');
$csql->where('id in', $ids);
$rows = $db->get($csql);
$vids = array();
try {
$db->begin();
foreach ($rows as $row) {
$delid = $row['id'];
delme($db, $delid, 'zc_config');
savelogdb($db, $rsuser['id'], 'zc_config', $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

@ -0,0 +1,341 @@
<!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="search(this);return false;">
<div>
<div class="sinps"></div>
<div class="sbtns">
<button class="lang btn" type="submit">查询</button>
<a class="lang btn" onclick="multiadd()">添加新部门</a>
<a class="lang btn" onclick="datatxt()">部门结构</a>
<a class="lang btn dag" onclick="deltree()">批量删除</a>
</div>
</div>
</form>
<div class='table'>
<div class="loading">Loading...</div>
<div class="list"></div>
</div>
</div>
<div id="alert_modifyupid" style="display:none;">
<div class="ciy-form">
<label style="min-width:3em;" class="lang">调整到</label>
<div>
<ciy-select com="newupid"></select>
</div>
</div>
</div>
<div id="alert_multiadd" style="display:none;">
<div class="ciy-form">
<label style="min-width:3em;" class="lang">添加到</label>
<div>
<ciy-select com="upid"></select>
</div>
</div>
<div class="ciy-form v">
<label style="min-width:3em;"><span class="lang">部门名称</span><code class="lang">(一行一个)</code></label>
<div>
<ciy-textarea com="multi" minheight="30em"></ciy-textarea>
</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 () {
$5(document).on('keydown', function (e) {
if (e.ctrlKey && e.keyCode == 83) {//Ctrl+S
e.preventDefault();
var upbtns = $5('.upbtn:not(.def)');
upbtns.each(function (dom) {
menubtn(dom, 'edit');
},0.5);
}
});
table = new ciyclass.table({
dom: '.table'
, url: 'init'
, thfield: function (name, key, field, json) {
if (key == 'name')
return '<a style="font-size: 1.5em;vertical-align: middle;padding-right: 0.5em;" onclick="exall()"></a> ' + ciyfn.lang(name);
}
, fn_beforedata: function (json) {
json.list = ciyfn.conv_treerow(json.list, 0, 0);
ciyfn.fillsearch({
searchdom: '.search'
, data: json
});
return json;
}
, fn_trprop: function (data, json) {
var rettxt = ' data-upid="' + data['upid'] + '"';
if (data['_count'] == '0')
rettxt += ' data-search="ok"';
// if (data['_deep'] > 0)
// rettxt += ' style="display:none;"';
return rettxt;
}
, fn_tdcontent: function (key, datashow, field, data) {
if (key == 'isuse') {
return '<ciy-switch com="' + key + '" value="' + data[key] + '" y="显示" n="隐藏" />';
}
if (key == 'leaderuser') {
return '<ciy-select com="' + key + '" value="' + data[key] + '"/>';
}
if (key == 'csort') {
return '<input spellcheck="false" style="width:100%;" onkeydown="btnset(this)" type="text" name="' + key + '" value="' + datashow + '"/>';
}
if (key == '_btn') {
var html = '<a class="lang btn def upbtn" onclick="menubtn(this, \'edit\')">' + (data['id'] == 0 ? '新增' : '更新') + '</a>';
html += '<a class="lang btn" onclick="menubtn(this, \'tz\')">调整</a>';
return html;
}
if (key == 'name') {
var deep = toint(data['_deep']);
var html = ' '.repeat(deep);
if (data['_count'] > 0) {
html += '<span class="ciy-tree-dot"></span> <input style="margin-left: 0.3em;width:100%;" onclick="event.stopPropagation();" onkeydown="btnset(this)" type="text" name="' + key + '" value="' + data['name'] + '"/>';
} else {
if (deep > 0)
html += '  ';
html += '<input style="width:100%;" onclick="event.stopPropagation();" onkeydown="btnset(this)" type="text" name="' + key + '" value="' + data['name'] + '"/>';
}
return {
divprop: (data['_count'] > 0 ? ' data-treeid="' + data['id'] + '"' : '') + ' data-deep="' + data['_deep'] + '" style="display: flex;" class="ciy-tree-spread"'// class="ciy-tree-spread"
, datashow: html
};
}
}
, fn_done: function () {
table.tree();
var doms = $5('[com=isuse]');
for (var i = 0; i < doms.length; i++) {
ciycmp({
dom: doms[i], onchange: function (e) {
if (e.from == 'init') return;
btnset(e.dom);
}
});
}
var doms = $5('ciy-select[com]');
for (var i = 0; i < doms.length; i++) {
ciycmp({
dom: doms[i], range:'adminuser', onchange: function (e) {
if (e.from == 'init') return;
btnset(e.dom);
}
});
}
}
});
table.callpage(1);
});
function exall() {
$5('div[data-deep="0"]').trigger('click');
}
function search(dom) {
Glob.key = ciyfn.getform(dom);
$5('[data-search]').each(function (rdom) {
var bshow = true;
for (var k in Glob.key) {
if (!Glob.key[k])
continue;
var val = $5('[name=' + k + ']', rdom).val();
if (val.indexOf(Glob.key[k]) == -1) {
bshow = false;
break;
}
}
rdom.style.display = bshow ? '' : 'none';
});
}
function btnset(dom) {
var domtr = $5(dom).parent('tr');
$5('.btn.upbtn', domtr).removeClass('def');
}
function multiadd() {
ciyfn.alert({
title: '添加新部门'
, width: 'mb'
, contentstyle: 'overflow:hidden;'
, content: document.getElementById("alert_multiadd").innerHTML
, fn_showed: function (doc, dom) {
ciycmp({ dom: $5('[com="upid"]', dom), range: fillrange(), value: 0 });
ciycmp({ dom: $5('[com="multi"]', dom) });
}
, btns: ["添加", "*关闭"]
, cb: function (opn) {
if (opn.btn == "关闭")
return opn.close();
if (ciyfn.throttle(opn.dombtn)) return;
ciyfn.callfunc('multiadd', opn.inputs, function (json) {
ciyfn.toast('操作成功', function () {
opn.close();
ciyfn.sendsignal(window.top, 'manage_refresh');
});
});
}
});
}
function datatxt() {
var tdata = new Array();
for (var i in table.data) {
if (table.data[i].isuse != 1)
continue;
tdata.push(table.data[i]);
}
tdata.sort((a, b) => toint(b.csort) - toint(a.csort));
function deeptxt(tdata, upid = 0, indent = '') {
var menutxt = '';
for (var i in tdata) {
if (tdata[i].upid != upid)
continue;
menutxt += indent + tdata[i].name + '\n';
if (tdata[i].upid === upid)
menutxt += deeptxt(tdata, tdata[i].id, indent + ' ');
}
return menutxt;
}
ciyfn.alert({
title: '部门结构'
, width: 'mb'
, height: 'pc'
, content: '<textarea style="height: 100%;">' + deeptxt(tdata) + '</textarea>'
});
}
function menubtn(dom, btn) {
var domtr = $5(dom).parent('tr');
var id = toint(domtr.attr('data-id'));
if (btn == 'edit') {
var postparam = ciyfn.getform(dom, 'TR');
postparam.id = id;
postparam.upid = table.data[id].upid;
postparam.cbid = table.once.cbid;
ciyfn.callfastfunc(dom, '', 'update', postparam, function (json) {
$5(dom).addClass('def');
});
}
if (btn == 'tz') {
ciyfn.alert({
title: '调整部门层级'
, content: document.getElementById("alert_modifyupid").innerHTML
, fn_showed: function (doc, dom) {
if (id == 0)
return;
ciycmp({ dom: $5('[com="newupid"]', dom), range: fillrange(), value: table.data[id].upid });
}
, btns: ["调整", "*关闭"]
, cb: function (opn) {
if (opn.btn == "关闭")
return opn.close();
opn.inputs.id = id;
if (ciyfn.throttle(opn.dombtn)) return;
ciyfn.callfunc('modifyupid', opn.inputs, function (json) {
opn.close();
ciyfn.sendsignal(window.top, 'manage_refresh');
});
}
});
}
}
function fillrange() {
var tdata = [];
for (var i in table.data)
tdata.push(table.data[i]);
tdata.sort((a, b) => toint(b.csort) - toint(a.csort));
var ranges = [];
ranges.push({ id: 0, name: '顶层' });
deephtml(tdata, 0, 1, 9);
function deephtml(tdata, upid, deep, maxdeep) {
if (deep > maxdeep)
return;
for (var i in tdata) {
if (tdata[i].upid != upid)
continue;
ranges.push({ id: tdata[i].id, name: ' '.repeat(deep) + ciyfn.lang(tdata[i].name) });
deephtml(tdata, tdata[i].id, deep + 1, maxdeep);
}
}
return ranges;
}
function fillhtmloption(selid) {
var html = '';
var tdata = new Array();
for (var i in table.data)
tdata.push(table.data[i]);
tdata.sort((a, b) => toint(b.csort) - toint(a.csort));
html += '<option value="0">【顶层】</option>';
html += deephtml(tdata, 0, selid, 1, 9);
function deephtml(tdata, upid, selid, deep, maxdeep) {
if (deep > maxdeep)
return '';
var htmld = '';
for (var i in tdata) {
if (tdata[i].upid != upid)
continue;
htmld += '<option value="' + tdata[i].id + '"';
if (tdata[i].id == selid)
htmld += ' selected="true"';
htmld += '>' + ' '.repeat(deep) + tdata[i].name + '</option>';
htmld += deephtml(tdata, tdata[i].id, selid, deep + 1, maxdeep);
}
return htmld;
}
return html;
}
function deltree() {
var array = [];
$5('[data-id]', '.table').each(function (dom) {
if (!$5(dom).hasClass("selected"))
return;
var deep = toint($5('[data-deep]', dom).attr("data-deep"));
array.push({ id: $5(dom).attr("data-id"), deep: deep });
});
if (array.length == 0)
return ciyfn.toast("请至少选择一条信息");
ciyfn.alert('已选<span class="txt-lggg px1">' + array.length + '</span>条,确认批量删除?', function (opn) {
opn.close();
if (opn.btn == "关闭")
return;
function deldeep(deep) {
if (deep < 0)
return;
var ids = [];
for (var j = 0; j < array.length; j++) {
if (array[j].deep == deep) {
ids.push(array[j].id);
}
}
if (ids.length == 0)
return deldeep(deep - 1);
var postparam = {};
postparam.ids = ids.join(",");
ciyfn.callfunc('del', postparam, function (json) {
table.delline(json);
deldeep(deep - 1);
});
}
deldeep(9);
}, { btns: ["删除", "*关闭"] });
}
</script>
</body>
</html>

182
web/admin/demo/multicat.php Normal file
View File

@ -0,0 +1,182 @@
<?php
namespace web\admin\demo;
class multicat {
public static function json_init() {
global $db;
$rsuser = verifyfast();
$post = new \ciy\post();
$csql = new \ciy\sql('zc_depart');
$csql->order('csort desc,id');
$rows = $db->get($csql);
$ret = array('list' => $rows);
if ($post->getbool('field')) {
$field = array();
$fshow = $db->getfield($field, 'zc_depart');
$fshow = fieldadd($fshow, $field, -1, '_btn', '操作');
$field['csort']['thwidth'] = '6em';
$field['leaderuser']['thwidth'] = '15em';
$ret['field'] = $field;
$ret['fshow'] = $fshow;
}
if ($post->getbool('once')) {
$ret['once'] = array();
$input = array();
$input[] = array(
'type' => 'input', 'form' => 'name', 'name' => '组织名称', 'prop' => ' style="width:8em;"'
);
$ret['once']['input'] = $input;
}
return succjson($ret);
}
public static function json_update() {
global $db;
$rsuser = verifyfast();
if (nopower($db, $rsuser['id'], 'p501u'))
return errjson('您未被授权操作');
$post = new \ciy\post();
$updata = array();
$id = $post->getint('id');
$name = $post->get('name');
if ($name == '')
return errjson('请填写部门名称');
$upid = $post->getint('upid');
$csort = $post->getint('csort');
$isuse = $post->getint('isuse');
$leaderuser = $post->getint('leaderuser');
$csql = new \ciy\sql('zc_depart');
$csql->where('id', $id);
$datarow = $db->getone($csql);
if (!is_array($datarow))
return errjson('数据不存在');
try {
$db->begin();
$updata = array();
$updata['name'] = $name;
$updata['isuse'] = $isuse;
$updata['upid'] = $upid;
$updata['csort'] = $csort;
$updata['leaderuser'] = $leaderuser;
$csql = new \ciy\sql('zc_depart');
$csql->where('id', $id);
if ($db->update($csql, $updata) === false)
throw new \Exception('更新失败:' . $db->error);
$updata['id'] = $id;
savelogdb($db, $rsuser['id'], 'zc_depart', $datarow, $updata);
$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;
$rsuser = verifyfast();
if (nopower($db, $rsuser['id'], 'p501d'))
return errjson('您未被授权操作');
$post = new \ciy\post();
$csql = new \ciy\sql('zc_depart');
$ids = $post->get('ids');
if (empty($ids))
return errjson('请选择至少一条');
$csql->where('id in', $ids);
$rows = $db->get($csql);
$vids = array();
try {
$db->begin();
foreach ($rows as $row) {
$delid = $row['id'];
delcheck($db, $delid, 'zc_admin', 'departid', '人员');
delcheck($db, $delid, 'zc_depart', 'upid', '下级部门');
delme($db, $delid, 'zc_depart');
savelogdb($db, $rsuser['id'], 'zc_depart', $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);
}
public static function json_modifyupid() {
global $db;
$rsuser = verifyfast();
if (nopower($db, $rsuser['id'], 'p501u'))
return errjson('您未被授权操作');
$post = new \ciy\post();
$id = $post->getint('id');
$newupid = $post->getint('newupid');
$csql = new \ciy\sql('zc_depart');
$csql->where('id', $id);
$datarow = $db->getone($csql);
if (!is_array($datarow))
return errjson('数据不存在');
try {
$db->begin();
$updata = array();
$updata['upid'] = $newupid;
$csql = new \ciy\sql('zc_depart');
$csql->where('id', $id);
if ($db->update($csql, $updata) === false)
throw new \Exception('操作数据库失败:' . $db->error);
$updata['id'] = $id;
savelogdb($db, $rsuser['id'], 'zc_depart', $datarow, $updata);
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
return succjson();
}
public static function json_multiadd() {
global $db;
$rsuser = verifyfast();
if (nopower($db, $rsuser['id'], 'p501u'))
return errjson('您未被授权操作');
$post = new \ciy\post();
$upid = $post->getint('upid');
$multi = explode("\n", $post->get('multi'));
$cnt = 0;
try {
$db->begin();
foreach ($multi as $m) {
$m = trim($m);
if (empty($m))
continue;
$updata = array();
$updata['name'] = $m;
$updata['isuse'] = 1;
$updata['upid'] = $upid;
$updata['csort'] = 10;
$csql = new \ciy\sql('zc_depart');
if ($db->insert($csql, $updata) === false)
throw new \Exception('新增失败:' . $db->error);
$updata['id'] = $db->insert_id();
$cnt++;
savelogdb($db, $rsuser['id'], 'zc_depart', null, $updata);
}
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
if ($cnt == 0)
return errjson('没有任何新增');
return succjson();
}
}

View File

@ -1,4 +1,4 @@
package ap
package demo
import (
"ciyon/web/admin"
@ -12,10 +12,10 @@ import (
"strings"
)
func demo_setwhere(post *c.CiyPost) (map[string]any, *c.CiySQL) {
func normal_setwhere(post *c.CiyPost) (map[string]any, *c.CiySQL) {
ret := map[string]any{}
query := post.Getobj("query")
csql := c.NewCiySQL("ap_demo")
csql := c.NewCiySQL("demo_normal")
liid := c.Getint(query, "liid")
if liid > 0 {
csql.Where("auditstatus", liid)
@ -47,13 +47,13 @@ func demo_setwhere(post *c.CiyPost) (map[string]any, *c.CiySQL) {
query["order"] = order
return query, csql
}
func Demo_list(w http.ResponseWriter, r *http.Request) bool {
func Normal_list(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
where, csql := demo_setwhere(post)
where, csql := normal_setwhere(post)
csql.Column("!content")
pageno := post.Getint("pageno", 1)
pagecount := post.Getint("pagecount", 10)
@ -111,7 +111,7 @@ func Demo_list(w http.ResponseWriter, r *http.Request) bool {
"form": "isopen",
"type": "select",
"name": "是否开启",
"select": c.CiyDB.Getdbcodes("ap_demo", "isopen"),
"select": c.CiyDB.Getdbcodes("demo_normal", "isopen"),
"all": "全部",
})
input = append(input, map[string]any{
@ -152,25 +152,24 @@ func Demo_list(w http.ResponseWriter, r *http.Request) bool {
"select": orders,
})
once["input"] = input
once["renzheng"] = c.CiyDB.Getdbcodes("ap_demo", "renzheng")
once["renzheng"] = c.CiyDB.Getdbcodes("demo_normal", "renzheng")
// csql = c.NewCiySQL("zc_menu")
// csql.Column("id,name")
// once["zc_menu"], _, _ = c.CiyDB.Get(csql)
ret["once"] = once
}
ret["zc_menu"] = c.Getrelation(c.CiyDB, rows, "zc_menu", "menuid", map[string]string{"column": "id,name"}, map[string]string{"queryid": "id"})
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}
func Demo_getdata(w http.ResponseWriter, r *http.Request) bool {
func Normal_getdata(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, _userid := admin.Verifyfast(c.CiyDB, post)
_, _userid := admin.Verifyfast(r, c.CiyDB, post)
if _userid == 0 {
return false
}
id := post.Getint("id")
ret := map[string]any{}
csql := c.NewCiySQL("ap_demo")
csql.Column("content,md")
csql := c.NewCiySQL("demo_normal")
csql.Where("id", id)
datarow, _ := c.CiyDB.Getone(csql)
if datarow == nil {
@ -183,11 +182,11 @@ func Demo_getdata(w http.ResponseWriter, r *http.Request) bool {
menurows, _, _ := c.CiyDB.Get(csql)
ret["zc_menu"] = menurows
}
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}
func Demo_update(w http.ResponseWriter, r *http.Request) bool {
func Normal_update(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, _userid := admin.Verifyfast(c.CiyDB, post)
_, _userid := admin.Verifyfast(r, c.CiyDB, post)
if _userid == 0 {
return false
}
@ -233,7 +232,7 @@ func Demo_update(w http.ResponseWriter, r *http.Request) bool {
}
var datarow map[string]any
if id > 0 {
csql := c.NewCiySQL("ap_demo")
csql := c.NewCiySQL("demo_normal")
csql.Where("id", id)
datarow, err = c.CiyDB.Getone(csql)
if err != nil {
@ -246,7 +245,7 @@ func Demo_update(w http.ResponseWriter, r *http.Request) bool {
var updata = map[string]any{}
err = c.CiyDB.Tran(func() error {
csql := c.NewCiySQL("ap_demo")
csql := c.NewCiySQL("demo_normal")
csql.Where("name", name)
csql.Column("id")
chkid := c.Toint(c.CiyDB.Get1(csql))
@ -285,7 +284,7 @@ func Demo_update(w http.ResponseWriter, r *http.Request) bool {
updata["eartmpr"] = eartmpr
updata["content"] = content
updata["md"] = md
csql = c.NewCiySQL("ap_demo")
csql = c.NewCiySQL("demo_normal")
if id > 0 {
csql.Where("id", id)
_, err = c.CiyDB.Update(csql, updata)
@ -298,7 +297,7 @@ func Demo_update(w http.ResponseWriter, r *http.Request) bool {
if err != nil {
return fmt.Errorf("更新失败:%v", err)
}
admin.SaveLogDB(c.CiyDB, "ap_demo", datarow, updata)
admin.SaveLogDB(c.CiyDB, "demo_normal", datarow, updata)
return nil
})
if err != nil {
@ -306,12 +305,12 @@ func Demo_update(w http.ResponseWriter, r *http.Request) bool {
}
ret := map[string]any{}
ret["data"] = updata
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}
func Demo_audit(w http.ResponseWriter, r *http.Request) bool {
func Normal_audit(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -319,11 +318,15 @@ func Demo_audit(w http.ResponseWriter, r *http.Request) bool {
// return c.ErrJSON(w, "您未被授权操作")
// }
ids := post.Get("ids")
status := post.Getint("status")
auditstatus := post.Getint("auditstatus")
auditmsg := post.Get("auditmsg")
if ids == "" {
return c.ErrJSON(w, "请选择至少一条")
}
csql := c.NewCiySQL("ap_demo")
if auditstatus == 90 && auditmsg == "" {
return c.ErrJSON(w, "请填写驳回原因")
}
csql := c.NewCiySQL("demo_normal")
csql.Where("id in", ids)
rows, _, err := c.CiyDB.Get(csql)
if err != nil {
@ -333,10 +336,11 @@ func Demo_audit(w http.ResponseWriter, r *http.Request) bool {
var updata = map[string]any{}
err = c.CiyDB.Tran(func() error {
for _, row := range rows {
updata["auditstatus"] = status
updata["auditstatus"] = auditstatus
updata["audituser"] = userid
updata["audittimes"] = c.Tostamp()
csql = c.NewCiySQL("ap_demo")
updata["auditmsg"] = auditmsg
csql = c.NewCiySQL("demo_normal")
csql.Where("id", row["id"])
_, err = c.CiyDB.Update(csql, updata)
if err != nil {
@ -352,11 +356,11 @@ func Demo_audit(w http.ResponseWriter, r *http.Request) bool {
ret := map[string]any{}
ret["data"] = updata
ret["ids"] = vids
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}
func Demo_del(w http.ResponseWriter, r *http.Request) bool {
func Normal_del(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -367,7 +371,7 @@ func Demo_del(w http.ResponseWriter, r *http.Request) bool {
if ids == "" {
return c.ErrJSON(w, "请选择至少一条")
}
csql := c.NewCiySQL("ap_demo")
csql := c.NewCiySQL("demo_normal")
csql.Where("id in", ids)
rows, _, err := c.CiyDB.Get(csql)
if err != nil {
@ -379,8 +383,8 @@ func Demo_del(w http.ResponseWriter, r *http.Request) bool {
delid := c.Toint(row["id"])
//c.Delcheck(c.CiyDB, delid, "tablexx", "xxid", "xxx");
//c.Delall(c.CiyDB, delid, "tablexx", "xxid", "xxx");
c.Delme(c.CiyDB, delid, "ap_demo")
admin.SaveLogDB(c.CiyDB, "ap_demo", row, nil)
c.Delme(c.CiyDB, delid, "demo_normal")
admin.SaveLogDB(c.CiyDB, "demo_normal", row, nil)
vids = append(vids, delid)
}
return nil
@ -390,19 +394,19 @@ func Demo_del(w http.ResponseWriter, r *http.Request) bool {
}
ret := map[string]any{}
ret["ids"] = vids
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}
func Demo_exportxls(w http.ResponseWriter, r *http.Request) bool {
func Normal_exportxls(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
// if admin.Nopower(c.CiyDB, userid, "p00e") {
// return c.ErrJSON(w, "您未被授权操作")
// }
_, csql := demo_setwhere(post)
_, csql := normal_setwhere(post)
rows, _, err := c.CiyDB.Get(csql)
if err != nil {
return c.ErrJSON(w, "读取错误", err)
@ -448,8 +452,8 @@ func Demo_exportxls(w http.ResponseWriter, r *http.Request) bool {
code_auditstatus := admin.Getcatas(c.CiyDB, "auditstatus")
code_audituser := c.Getrelation(c.CiyDB, rows, "xa_user", "audituser")
code_menuid, _, _ := c.CiyDB.Get(c.NewCiySQL("zc_menu").Column("id,name"))
code_isuse := c.CiyDB.Getdbcodes("ap_demo", "isuse")
code_isopen := c.CiyDB.Getdbcodes("ap_demo", "isopen")
code_isuse := c.CiyDB.Getdbcodes("demo_normal", "isuse")
code_isopen := c.CiyDB.Getdbcodes("demo_normal", "isopen")
code_mauditstatus := admin.Getcatas(c.CiyDB, "auditstatus")
code_prodcata := admin.Getcatas(c.CiyDB, "prodcata")
code_areacode, _, _ := c.CiyDB.Get(c.NewCiySQL("ciy_arearpc").Column("id,name,upid"))
@ -559,11 +563,11 @@ func Demo_exportxls(w http.ResponseWriter, r *http.Request) bool {
}
ret := map[string]any{}
ret["url"] = filename
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}
func Demo_importxls_in(w http.ResponseWriter, r *http.Request) bool {
func Normal_importxls_in(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -646,8 +650,8 @@ func Demo_importxls_in(w http.ResponseWriter, r *http.Request) bool {
code_auditstatus := admin.Getcatas(c.CiyDB, "auditstatus")
code_userid, _, _ := c.CiyDB.Get(c.NewCiySQL("xa_user").Column("id,name"))
code_menuid, _, _ := c.CiyDB.Get(c.NewCiySQL("zc_menu").Column("id,name"))
code_isuse := c.CiyDB.Getdbcodes("ap_demo", "isuse")
code_isopen := c.CiyDB.Getdbcodes("ap_demo", "isopen")
code_isuse := c.CiyDB.Getdbcodes("demo_normal", "isuse")
code_isopen := c.CiyDB.Getdbcodes("demo_normal", "isopen")
code_mauditstatus := admin.Getcatas(c.CiyDB, "auditstatus")
code_prodcata := admin.Getcatas(c.CiyDB, "prodcata")
code_areacode, _, _ := c.CiyDB.Get(c.NewCiySQL("ciy_arearpc").Column("id,name,upid"))
@ -669,7 +673,7 @@ func Demo_importxls_in(w http.ResponseWriter, r *http.Request) bool {
firsthtml := "<td><div>" + lineidx + "</div></td>"
bempty := true
unqs := make([]string, 0)
csql := c.NewCiySQL("ap_demo")
csql := c.NewCiySQL("demo_normal")
for _, arr := range heads {
name := arr["name"]
errmsg := "" //数据有误,显示红色说明
@ -692,7 +696,7 @@ func Demo_importxls_in(w http.ResponseWriter, r *http.Request) bool {
if id == 0 {
errmsg = name + "解析错误"
} else {
csqlchk := c.NewCiySQL("ap_demo")
csqlchk := c.NewCiySQL("demo_normal")
csqlchk.Where("id", id).Column("id")
chkid := c.Toint(c.CiyDB.Get1(csqlchk))
if chkid != id {
@ -1071,14 +1075,14 @@ func Demo_importxls_in(w http.ResponseWriter, r *http.Request) bool {
html += "</div>\n"
html += "<input type=\"hidden\" name=\"total\" value=\"" + c.Tostr(cnt) + "\"/>\n"
html += "<code>共" + c.Tostr(cnt) + "条数据</code>\n"
return c.SuccJSON(w, map[string]any{
return c.SuccJSON(w, r, map[string]any{
"html": html,
"count": cnt,
})
}
func Demo_importxls_data(w http.ResponseWriter, r *http.Request) bool {
func Normal_importxls_data(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -1117,7 +1121,7 @@ func Demo_importxls_data(w http.ResponseWriter, r *http.Request) bool {
weightg := post.Get("weightg_" + istr)
eartmpr := post.Get("eartmpr_" + istr)
content := post.Get("content_" + istr)
csql := c.NewCiySQL("ap_demo")
csql := c.NewCiySQL("demo_normal")
csql.Where("name", name)
csql.Column("id")
chkid := c.Toint(c.CiyDB.Get1(csql))
@ -1156,7 +1160,7 @@ func Demo_importxls_data(w http.ResponseWriter, r *http.Request) bool {
updata["eartmpr"] = eartmpr
updata["content"] = content
updata["addtimes"] = c.Tostamp()
csql = c.NewCiySQL("ap_demo")
csql = c.NewCiySQL("demo_normal")
var err error
if id == 0 {
_, err = c.CiyDB.Insert(csql, updata)
@ -1173,5 +1177,5 @@ func Demo_importxls_data(w http.ResponseWriter, r *http.Request) bool {
if err != nil {
return c.ErrJSON(w, err.Error())
}
return c.SuccJSON(w)
return c.SuccJSON(w, r)
}

View File

@ -1,11 +1,11 @@
<?php
namespace web\admin\ap;
namespace web\admin\demo;
class demo {
class normal {
static function setwhere($db, $post) {
$query = $post->get('query');
$csql = new \ciy\sql('ap_demo');
$csql = new \ciy\sql('demo_normal');
$liid = objint($query, 'liid');
if ($liid > 0)
$csql->where('auditstatus', $liid);
@ -51,7 +51,7 @@ class demo {
$rsuser = verifyfast();
$post = new \ciy\post();
list($where, $csql) = self::setwhere($db, $post);
$csql->column('!content,md', $db->getraw('show full fields from ap_demo'));
$csql->column('!content,md', $db->getraw('show full fields from demo_normal'));
$pageno = $post->getint('pageno', 1);
$pagecount = $post->getint('pagecount', 10);
$csql->limit($pageno, $pagecount);
@ -62,7 +62,7 @@ class demo {
$ret = array('where' => $where, 'pageno' => $pageno, 'pagecount' => $pagecount, 'count' => $mainrowcount, 'list' => $rows);
if ($post->getbool('field')) {
$field = array();
$fshow = $db->getfield($field, 'ap_demo');
$fshow = $db->getfield($field, 'demo_normal');
foreach ($field as $fr => $v) {
if (get('_' . $fr))
$field[$fr]['c'] = ',' . $field[$fr]['c'];
@ -97,7 +97,7 @@ class demo {
$id = $post->getint('id');
$act = $post->get('act');
if ($id > 0) {
$csql = new \ciy\sql('ap_demo');
$csql = new \ciy\sql('demo_normal');
$csql->where('id', $id);
$row = $db->getone($csql);
if (!is_array($row))
@ -169,7 +169,7 @@ class demo {
return errjson('请填写默认标题');
$datarow = null;
if ($id > 0) {
$csql = new \ciy\sql('ap_demo');
$csql = new \ciy\sql('demo_normal');
$csql->where('id', $id);
$datarow = $db->getone($csql);
if (!is_array($datarow))
@ -219,7 +219,7 @@ class demo {
$updata['addtimes'] = tostamp();
$updata['content'] = $content;
$updata['md'] = $md;
$csql = new \ciy\sql('ap_demo');
$csql = new \ciy\sql('demo_normal');
if ($id > 0) {
$csql->where('id', $id);
if ($db->update($csql, $updata) === false)
@ -236,7 +236,7 @@ class demo {
$id = $db->insert_id();
}
$updata['id'] = $id;
//savelogdb($db, $rsuser['id'], 'ap_demo', $datarow, $updata);
//savelogdb($db, $rsuser['id'], 'demo_normal', $datarow, $updata);
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
@ -257,7 +257,7 @@ class demo {
$ids = $post->get('ids');
if (empty($ids))
return errjson('请选择至少一条');
$csql = new \ciy\sql('ap_demo');
$csql = new \ciy\sql('demo_normal');
$csql->where('id in', $ids);
$rows = $db->get($csql);
$vids = array();
@ -267,8 +267,8 @@ class demo {
$delid = $row['id'];
//delcheck($db, $delid, 'tablexx', 'xxid', '管理员');
//delall($db, $delid, 'tablexx', 'xxid', '运动员'); //deltimeall
delme($db, $delid, 'ap_demo');
savelogdb($db, $rsuser['id'], 'ap_demo', $row, null);
delme($db, $delid, 'demo_normal');
savelogdb($db, $rsuser['id'], 'demo_normal', $row, null);
$vids[] = $delid;
}
$db->commit();
@ -294,21 +294,21 @@ class demo {
$auditmsg = $post->get('auditmsg');
if ($auditstatus == 90 && empty($auditmsg))
return errjson('请填写驳回原因');
$csql = new \ciy\sql('ap_demo');
$csql = new \ciy\sql('demo_normal');
$csql->where('id in', $ids);
$rows = $db->get($csql);
$ids = array();
try {
$db->begin();
foreach ($rows as $row) {
$csql = new \ciy\sql('ap_demo');
$csql = new \ciy\sql('demo_normal');
$csql->where('id', $row['id']);
$updata = array();
$updata['auditstatus'] = $auditstatus;
$updata['audituser'] = $rsuser['id'];
$updata['audittimes'] = tostamp();
$updata['auditmsg'] = $auditmsg;
$csql = new \ciy\sql('ap_demo');
$csql = new \ciy\sql('demo_normal');
$csql->where('id', $row['id']);
if ($db->update($csql, $updata) === false)
throw new \Exception('审核失败:' . $db->error);
@ -386,14 +386,14 @@ class demo {
$code_auditstatus = getcatas($db, 'auditstatus');
$code_audituser = getcatas($db, 'adminuser');
$code_menuid = getrelation($db, $rows, 'zc_menu', 'menuid', 'id,name');
$code_isuse = $db->getdbcodes('ap_demo', 'isuse');
$code_isopen = $db->getdbcodes('ap_demo', 'isopen');
$code_isuse = $db->getdbcodes('demo_normal', 'isuse');
$code_isopen = $db->getdbcodes('demo_normal', 'isopen');
$code_sigstatus = getcatas($db, 'auditstatus');
$code_mauditstatus = getcatas($db, 'auditstatus');
$code_prodcata = $db->get((new \ciy\sql('zc_depart'))->column('id,name,upid'));
$code_areacode = $db->get((new \ciy\sql('ciy_arearpc'))->column('id,name,upid'));
$code_renzheng = $db->getdbcodes('ap_demo', 'renzheng');
$code_ppint = $db->getdbcodes('ap_demo', 'ppint');
$code_renzheng = $db->getdbcodes('demo_normal', 'renzheng');
$code_ppint = $db->getdbcodes('demo_normal', 'ppint');
$datas = array();
foreach ($rows as $row) {
$dat = array();
@ -552,14 +552,14 @@ class demo {
);
}
$code_menuid = $db->get((new \ciy\sql('zc_menu'))->column('id,name'));
$code_isuse = $db->getdbcodes('ap_demo', 'isuse');
$code_isopen = $db->getdbcodes('ap_demo', 'isopen');
$code_isuse = $db->getdbcodes('demo_normal', 'isuse');
$code_isopen = $db->getdbcodes('demo_normal', 'isopen');
$code_sigstatus = getcatas($db, 'auditstatus');
$code_mauditstatus = getcatas($db, 'auditstatus');
$code_prodcata = $db->get((new \ciy\sql('zc_depart'))->column('id,name,upid'));
$code_areacode = $db->get((new \ciy\sql('ciy_arearpc'))->column('id,name,upid'));
$code_renzheng = $db->getdbcodes('ap_demo', 'renzheng');
$code_ppint = $db->getdbcodes('ap_demo', 'ppint');
$code_renzheng = $db->getdbcodes('demo_normal', 'renzheng');
$code_ppint = $db->getdbcodes('demo_normal', 'ppint');
$html .= '<div class="table" style="width: 100%;height: calc(100% - 2.2em);overflow: auto;">';
$html .= '<table><tbody><tr>';
$html .= '<th>#</th>';
@ -576,7 +576,7 @@ class demo {
$firsthtml = '<td><div>' . $lineidx . '</div></td>';
$bempty = true;
$unqs = array();
$csql = new \ciy\sql('ap_demo');
$csql = new \ciy\sql('demo_normal');
foreach ($heads as $arr) {
$name = $arr['name'];
$errmsg = ''; //数据有误,显示红色说明
@ -596,7 +596,7 @@ class demo {
if ($id == 0)
$errmsg = $name . '解析错误';
else {
$csqlchk = new \ciy\sql('ap_demo');
$csqlchk = new \ciy\sql('demo_normal');
$csqlchk->where('id', $id)->column('id');
$chkid = toint($db->get1($csqlchk));
if ($chkid != $id)
@ -1064,7 +1064,7 @@ class demo {
$updata['skt'] = $post->get('skt_' . $i);
$updata['idcard'] = $post->get('idcard_' . $i);
$updata['content'] = $post->get('content_' . $i);
$csql = new \ciy\sql('ap_demo');
$csql = new \ciy\sql('demo_normal');
if ($id == 0) {
$updata['auditstatus'] = 2;
$updata['addtimes'] = tostamp();

414
web/admin/demo/safeop.html Normal file
View File

@ -0,0 +1,414 @@
<!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">
<button class="lang btn" type="submit">查询</button>
</div>
</div>
</form>
<div class="topbtn">
<a class="lang btn" onclick="edit(0)">单笔转账</a>
<a class="lang btn" onclick="multiedit()">批量录入转账</a>
<a class="lang btn" onclick="multiin()">Excel导入转账</a>
<a class="lang btn succ" onclick="dopay()">开始转账操作</a>
</div>
<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_multiin" style="display:none;">
<div style="display:flex;">
<div>
<ciy-upload com="file" />
</div>
<div style="margin-left:0.3em;">
<a class="lang btn btn-sm def" href="/ud/inpl/hf_merchantalipayorder2.xlsx" target="_blank">下载导入模板</a><br />
<div class="lang">每次导入建议不超过1000条</div>
<div class="lang">导入更新,首列为导出的行码</div>
<div class="lang">请按模版列填写</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 imp">账号类型</label>
<div>
<ciy-radio com="accounttype" />
</div>
</div>
<div class="ciy-form col-24 col-sm-24">
<label class="lang imp">金额</label>
<div>
<ciy-inputbet com="amount" unit="元" bet="100" />
</div>
</div>
<div class="ciy-form col-24">
<label class="lang imp">账号</label>
<div>
<input type="text" name="tranaccount" style="width:13em;" />
</div>
</div>
<div class="ciy-form col-24">
<label class="lang imp">姓名</label>
<div>
<input type="text" name="tranname" style="width:8em;" />
</div>
</div>
<div class="ciy-form col-24">
<label class="lang">身份证号</label>
<div>
<input type="text" name="tranidid" style="width:12em;" />
</div>
</div>
<div class="ciy-form col-24">
<label class="lang">备注</label>
<div>
<input type="text" name="memo" style="width:100%;" />
</div>
</div>
</div>
</div>
<div id="alert_multiedit" style="display:none;">
<table class="edittab">
<tr>
<th>类型<span style="color:red;">*</span></th>
<th>金额<span style="color:red;">*</span></th>
<th>账户<span style="color:red;">*</span></th>
<th>姓名<span style="color:red;">*</span></th>
<th>身份证号</th>
<th>备注</th>
<th class="cursor-p" onclick="newline($5(this).parent('.edittab'));"></th>
</tr>
</table>
<style>
.edittab {
width: 100%;
}
.edittab th {
padding: 0.3em;
text-align: center;
font-weight: bold;
line-height: 1em;
}
.edittab td {
padding: 0.3em;
line-height: 1em;
}
</style>
</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="/jscss/web3.min.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
, liall: '全部'
, lidata: 'accounttype'
, liclick: function (dom) {
table.search(dom, 'li');
}
});
return json;
}
, fn_tdcontent: function (key, datashow, field, data) {
if (key == 'id') {
return 'P' + datashow;
}
if (key == 'apiuser') {
if (data['apiuser'] < 0)
return 'API:' + -data['apiuser'];
}
if (key == '_btn') {
var html = '';
html += `<a class="lang btn" onclick="menubtn(this, 'chksign')">验签</a>`;
html += `<a class="lang btn" onclick="menubtn(this, 'edit')">修改</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 == 'sub') {
ciyfn.sendsignal(window.top, 'manage_ifropen', {
url: 'xxx.html?_xxxid=' + id
, name: '转账单<code>' + table.data[id].name + '</code>'
});
}
}
function getdata(id, act, cb) {
cb({ data: id == 0 ? { accounttype: 20 } : table.data[id] });
}
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;
ciycmp({ dom: $5('[com=accounttype]', dom), value: dat.accounttype, range: 'accounttype' });
ciycmp({ dom: $5('[com=amount]', dom), value: dat.amount });
$5('[name=tranaccount]', dom).val(dat.tranaccount);
$5('[name=tranname]', dom).val(dat.tranname);
$5('[name=tranidid]', dom).val(dat.tranidid);
$5('[name=memo]', dom).val(dat.memo);
}
, 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 ? ["暂存转账", "*关闭"] : ["修改", "*关闭"],
});
});
}
function multiedit() {
var trhtml = `<tr data-idx="{idx}">
<td><ciy-switch com="accounttype_{idx}" y="支付宝" n="银行" /></td>
<td><ciy-inputbet com="amount_{idx}" unit="元" bet="100" /></td>
<td><input type="text" name="tranaccount_{idx}" style="width:13em;" /></td>
<td><input type="text" name="tranname_{idx}" style="width:8em;" /></td>
<td><input type="text" name="tranidid_{idx}" style="width:12em;" /></td>
<td><input type="text" name="memo_{idx}" style="width:5em;" /></td>
<td onclick="delline(this)" style="cursor: pointer;"></td>
</tr>`;
var trcount = 0;
ciyfn.alert({
title: '批量转账'
, width: 'pc'
, height: 'max'
, content: document.getElementById("alert_multiedit").innerHTML
//, noparent:true
, fn_showed: function (doc, dom) {
doc.newline = function (alertdom) {
var tr = $5('.edittab tr', alertdom);
$5(tr[tr.length - 1]).after(trhtml.replace(/\{idx\}/g, trcount));
ciycmp({ dom: $5('[com=accounttype_' + trcount + ']', alertdom), value: 1, range: 'accounttype' });
ciycmp({ dom: $5('[com=amount_' + trcount + ']', alertdom) });
trcount++;
}
doc.delline = function (alertdom) {
if ($5('tr[data-idx]', dom).length < 2)
return;
$5(alertdom).parent('tr').remove();
}
doc.newline(dom);
}
, cb: function (opn) {
if (opn.btn == "关闭")
return opn.close();
if (opn.btn == "新增一行") {
opn.doc.newline(opn.dom);
return;
}
if (ciyfn.throttle(opn.dombtn)) return;
opn.inputs.count = trcount;
ciyfn.callfunc('multiedit', opn.inputs, function (json) {
opn.close();
location.reload();
});
},
btns: ["*新增一行", "暂存转账", "*关闭"],
});
}
function dopay() {
ciyfn.callfunc("getdopay", {}, async function (json) {
var html = '';
if (json.total == 0)
return ciyfn.toast('请先录入待转账任务');
if (json.safecase == 10) {
html += '<div class="ciy-form">';
html += '<label class="lang" style="min-width:5em;">安全密码</label>';
html += '<div><input type="password" name="pass2" style="width:100%;" /></div>';
html += '</div>';
}
if (json.safecase == 20) {
var web3 = null;
if (!json.pubkey)
return ciyfn.alert('请先绑定用户钱包');
if (!window.ethereum)
return ciyfn.alert('MetaMask 没有安装');
try {
await window.ethereum.request({ method: 'eth_requestAccounts' });
web3 = new Web3(window.ethereum);
const accounts = await web3.eth.getAccounts();
if (accounts.length == 0)
return ciyfn.alert('MetaMask 请先建立钱包账户');
var account = accounts[0];
} catch (error) {
return ciyfn.alert('MetaMask 出现错误:' + error);
}
}
if (json.safecase == 30) {//安当
if (!json.pubkey)
return ciyfn.alert('请先绑定UKey设备');
var res = ciyfn.ajaxsync({
url: "http://127.0.0.1:2300/api/ExportECCPublicKey"
});
if (res.code != 1)
return ciyfn.alert('UKey设备未连接请确认是否插入Ukey。<br/>需安装驱动');
if (json.pubkey != res.data.PublicKey)
return ciyfn.alert('UKey公钥不一致请检查UKey设备是否插错');
var res = ciyfn.ajaxsync({
url: "http://127.0.0.1:2300/api/VerifyUserPIN"
, data: {
UserPIN: "12345678"
}
});
if (res.code != 1) {
html += '<div class="ciy-form">';
html += '<label class="lang" style="min-width:3em;">PIN码</label>';
html += '<div><input type="password" name="pin" style="width:100%;" /></div>';
html += '</div>';
}
}
html += '共计<span class="txt9 txt-lgg px2">' + json.total + '</span>笔转账,<span class="txt9 txt-lgg px1">' + (json.money / 100) + '</span>元';
html += '<br/>确认开始转账操作吗?';
ciyfn.alert({
content: html
, btns: ["开始转账", '*关闭']
, cb: async function (opn) {
if (opn.btn == '关闭')
return opn.close();
var post = {};
post.sign = [];
if (json.safecase == 10) {
post.auth = (new Date()).getTime();
post.pass = await ciyfn.sha512(await ciyfn.sha512(opn.inputs.pass2 + ciy_vars.tokensalt) + post.auth);
for (var i in json.datas)
post.sign.push({ id: json.datas[i].id });
}
if (json.safecase == 20) {
try {
for (var i in json.datas) {
//json.datas[i].hash = "H" + json.datas[i].hash;
const signature = await window.ethereum.request({
method: 'personal_sign',
params: ['CIY' + json.datas[i].hash, account],
});
post.sign.push({ id: json.datas[i].id, sign: signature, hash: json.datas[i].hash });
}
} catch (error) {
return ciyfn.alert('MetaMask 签名失败:' + error);
}
}
if (json.safecase == 30) {
if (opn.inputs.pin) {
var res = ciyfn.ajaxsync({
url: "http://127.0.0.1:2300/api/VerifyUserPIN"
, data: {
UserPIN: opn.inputs.pin
}
});
if (res.code != 1)
return ciyfn.alert('PIN码错误:' + res.errmsg);
}
for (var i in json.datas) {
var res = ciyfn.ajaxsync({
url: "http://127.0.0.1:2300/api/GetECCSignData"
, data: {
pbData: json.datas[i].hash
}
});
if (res.code != 1)
return ciyfn.alert('UKey签名失败:' + res.errmsg);
post.sign.push({ id: json.datas[i].id, sign: res.data.HashData, hash: json.datas[i].hash });
}
}
ciyfn.callfunc("dopay", post, function (json) {
opn.close();
ciyfn.alert({
content: '转账任务已提交,请前往转账记录中查看执行结果。'
, btns: ["打开转账记录", '*关闭']
, cb: async function (opn) {
opn.close();
if (opn.btn == '关闭') {
window.location.reload();
return;
}
setTimeout(function () {
window.location.reload();
}, 2000);
ciyfn.sendsignal(window.top, 'manage_ifropen', {
url: "mer/merchantalipayorder.html?_t=" + tostamp()
, name: "转账记录"
});
}
});
});
}
});
});
}
function multiin() {
ciyfn.table_multiin('importxls', document.getElementById("alert_multiin").innerHTML, function (json) {
ciyfn.toast('导入成功');
table.cachecount = -1;
table.callpage();
});
}
</script>
</body>
</html>

582
web/admin/demo/safeop.php Normal file
View File

@ -0,0 +1,582 @@
<?php
namespace web\admin\demo;
class safeop {
static function setwhere($db, $post) {
$query = $post->get('query');
$csql = new \ciy\sql('ap_transfer');
$liid = objint($query, 'liid');
if ($liid > 0)
$csql->where('accounttype', $liid);
$val = objstr($query, 'id');
if (!empty($val) && $val[0] == 'P')
$csql->where('id', substr($val, 1));
$csql->wherenumrange('amount', objstr($query, 'amount_1'), objstr($query, 'amount_2'), 100);
$csql->where('tranaccount like', objstr($query, 'tranaccount'));
$csql->where('tranname like', objstr($query, 'tranname'));
$csql->where('tranidid like', objstr($query, 'tranidid'));
$csql->where('memo like', objstr($query, 'memo'));
$csql->wheredaterange('addtimes', objstr($query, 'addtimes'));
$csql->where('apiuser', objstr($query, 'apiuser'));
$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);
$csql->where('orderstatus', 10);
$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, 'ap_transfer');
foreach ($field as $fr => $v) {
if (get('_' . $fr))
$field[$fr]['c'] = ',' . $field[$fr]['c'];
if ($fr == 'merchantid')
$field[$fr]['c'] = ',' . $field[$fr]['c'];
}
$field['orderstatus']['c'] = '';
$field['fee']['c'] = '';
$field['wano']['c'] = '';
$field['uptimes']['c'] = '';
$field['orderno']['c'] = '';
$field['pubkeyid']['c'] = '';
$field['signtimes']['c'] = '';
$field['tranreceipt']['c'] = '';
$field['errmsg']['c'] = '';
$ret['field'] = $field;
$ret['fshow'] = $fshow;
}
if ($post->getbool('once')) {
$ret['once'] = array();
$input = array();
$input[] = array('type' => 'input', 'form' => 'id', 'name' => '流水号', 'prop' => ' style="width:8em;"');
$input[] = array('type' => 'num', 'form' => 'amount', 'name' => '金额', 'prop' => ' style="width:4em;"');
$input[] = array('type' => 'input', 'form' => 'tranaccount', 'name' => '账号', 'prop' => ' style="width:8em;"');
$input[] = array('type' => 'input', 'form' => 'tranname', 'name' => '姓名', 'prop' => ' style="width:8em;"');
$input[] = array('type' => 'input', 'form' => 'tranidid', 'name' => '身份证号', 'prop' => ' style="width:8em;"');
$input[] = array('type' => 'input', 'form' => 'memo', 'name' => '备注', 'prop' => ' style="width:8em;"');
$input[] = array('type' => 'daterange', 'form' => 'addtimes', 'name' => '创建时间');
$input[] = array('type' => 'select', 'form' => 'apiuser', 'name' => '操作人', 'all' => '全部', 'select' => 'meruser');
$ret['once']['input'] = $input;
$csql = new \ciy\sql('hf_merchantbase');
$csql->where('id', $rsuser['s_b']);
$ret['once']['merchant'] = $db->getone($csql);
$csql = new \ciy\sql('hf_merchantpubkey');
$csql->where('merchantid', $rsuser['s_b']);
$ret['once']['hf_merchantpubkey'] = $db->get($csql);
// if($ret['once']['merchant']['safecase'] > 10){
// $csql = new \ciy\sql('hf_merchantuser');
// $csql->where('id', $ret['once']['merchant']['s_b']);
// $ret['once']['merchant'] = $db->getone($csql);
// }
}
return succjson($ret);
}
public static function json_update() {
global $db;
$rsuser = verifyfast();
//if (nopower($db, $rsuser['id'], 'p u'))
// return errjson('您未被授权操作');
$csql = new \ciy\sql('hf_merchantbase');
$csql->where('id', $rsuser['s_b']);
$merchantrow = $db->getone($csql);
$post = new \ciy\post();
$id = $post->getint('id');
$data = array();
$data['accounttype'] = $post->getint('accounttype');
$data['amount'] = $post->getint('amount');
$data['tranaccount'] = $post->get('tranaccount');
$data['tranname'] = $post->get('tranname');
$data['tranidid'] = $post->get('tranidid');
$data['memo'] = $post->get('memo');
$retchk = check_transtr($data['amount'], $data['accounttype'], $data['tranaccount'], $data['tranname'], $data['tranidid'], $data['memo'], $merchantrow['safecase']);
if (is_string($retchk))
return errjson($retchk);
if ($id > 0) {
$csql = new \ciy\sql('ap_transfer');
$csql->where('merchantid', $rsuser['s_b']);
$csql->where('id', $id);
$datarow = $db->getone($csql);
if (!is_array($datarow))
return errjson('数据不存在');
}
try {
$db->begin();
$updata = self::updatedata($db, $rsuser, $id, $data, $merchantrow);
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['data'] = $updata;
return succjson($ret);
}
public static function json_multiedit() {
global $db;
$rsuser = verifyfast();
//if (nopower($db, $rsuser['id'], 'p u'))
// return errjson('您未被授权操作');
$csql = new \ciy\sql('hf_merchantbase');
$csql->where('id', $rsuser['s_b']);
$merchantrow = $db->getone($csql);
$post = new \ciy\post();
$count = $post->getint('count');
$datas = array();
for ($i = 0; $i < $count; $i++) {
if ($post->get('accounttype_' . $i) == '')
continue;
$data = array();
$data['accounttype'] = $post->getint('accounttype_' . $i);
$data['accounttype'] = ($data['accounttype'] == 1 ? 20 : 10);
$data['amount'] = $post->getint('amount_' . $i);
$data['tranaccount'] = $post->get('tranaccount_' . $i);
$data['tranname'] = $post->get('tranname_' . $i);
$data['tranidid'] = $post->get('tranidid_' . $i);
$data['memo'] = $post->get('memo_' . $i);
$retchk = check_transtr($data['amount'], $data['accounttype'], $data['tranaccount'], $data['tranname'], $data['tranidid'], $data['memo'], $merchantrow['safecase']);
if (is_string($retchk))
return errjson('第' . ($i + 1) . '行,' . $retchk);
$datas[] = $data;
}
try {
$db->begin();
foreach ($datas as $data) {
self::updatedata($db, $rsuser, 0, $data, $merchantrow);
}
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
return succjson();
}
static function updatedata($db, $rsuser, $id, $data, $merchantrow) {
$updata = array();
$updata['amount'] = $data['amount'];
$updata['accounttype'] = $data['accounttype'];
$updata['tranaccount'] = $data['tranaccount'];
$updata['tranname'] = $data['tranname'];
$updata['tranidid'] = $data['tranidid'];
$updata['memo'] = $data['memo'];
$updata['apiuser'] = $rsuser['id'];
$csql = new \ciy\sql('ap_transfer');
if ($id > 0) {
$csql->where('id', $id);
if ($db->update($csql, $updata) === false)
throw new \Exception('更新失败:' . $db->error);
} else {
$updata['providerid'] = $rsuser['s_a'];
$updata['merchantid'] = $rsuser['s_b'];
$updata['thirdno'] = '';
$updata['orderstatus'] = 10;
$updata['iswa'] = $merchantrow['bwa'];
$updata['wano'] = '';
$updata['addtimes'] = tostamp();
$updata['signtimes'] = 0;
$updata['uptimes'] = 0;
$updata['orderno'] = '';
$updata['payfundno'] = '';
$updata['signature'] = '';
$updata['pubkeyid'] = 0;
$updata['fee'] = 0;
$updata['tranreceipt'] = 10;
$updata['errmsg'] = '';
if ($db->insert($csql, $updata) === false)
throw new \Exception('新增失败:' . $db->error);
$id = $db->insert_id();
}
$updata['id'] = $id;
return $updata;
}
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('ap_transfer');
$csql->where('merchantid', $rsuser['s_b']);
$csql->where('id in', $ids);
$rows = $db->get($csql);
$vids = array();
try {
$db->begin();
foreach ($rows as $row) {
if ($row['orderstatus'] != 10)
continue;
$delid = $row['id'];
//delcheck($db, $delid, 'tablexx', 'xxid', '管理员');
//delall($db, $delid, 'tablexx', 'xxid', '运动员'); //deltimeall
delme($db, $delid, 'ap_transfer');
$vids[] = $delid;
}
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['ids'] = $vids;
return succjson($ret);
}
public static function json_getdopay() {
global $db;
$rsuser = verifyfast();
$csql = new \ciy\sql('hf_merchantbase');
$csql->where('id', $rsuser['s_b']);
$merchantrow = $db->getone($csql);
$csql = new \ciy\sql('ap_transfer');
$csql->where('merchantid', $rsuser['s_b']);
$csql->where('orderstatus', 10);
$orderrows = $db->get($csql);
$ret['datas'] = array();
$money = 0;
foreach ($orderrows as $orderrow) {
$money += $orderrow['amount'];
$ret['datas'][] = array(
'id' => $orderrow['id'],
'hash' => hash('sha256', signorder($orderrow))
);
}
$ret['total'] = count($orderrows);
$ret['money'] = $money;
$ret['safecase'] = $merchantrow['safecase'];
if ($ret['safecase'] > 0) {
$csql = new \ciy\sql('hf_merchantuser');
$csql->where('id', $rsuser['id']);
$userrow = $db->getone($csql);
if ($userrow['pubkeyid'] > 0) {
$csql = new \ciy\sql('hf_merchantpubkey');
$csql->where('id', $userrow['pubkeyid']);
$csql->where('safecase', $merchantrow['safecase']);
$pubkeyrow = $db->getone($csql);
$ret['pubkey'] = $pubkeyrow['pubkey'];
}
}
return succjson($ret);
}
public static function json_dopay() {
global $db;
$rsuser = verifyfast();
$post = new \ciy\post();
//if (nopower($db, $rsuser['id'], 'p d'))
// return errjson('您未被授权操作');
$csql = new \ciy\sql('hf_merchantuser');
$csql->where('id', $rsuser['id']);
$userrow = $db->getone($csql);
if (empty($userrow['password']))
return errjson('请先设置初始登录密码');
$csql = new \ciy\sql('hf_merchantalipaycharge');
$csql->where('merchantid', $userrow['merchantid']);
$csql->where('addtimes<', time() - 60);
$csql->where('orderstatus<100');
if (toint($db->get1($csql)) > 0)//检查商户余额,结合本次下单金额与手续费欠费金额,是否低于,低于提示。
return errjson('有未结算的手续费,请稍后下单,请稍后下单或检查账户余额');
$csql = new \ciy\sql('hf_merchantbase');
$csql->where('id', $userrow['merchantid']);
$merchantrow = $db->getone($csql);
if (!is_array($merchantrow))
return errjson('商户不存在');
$tp = date('H') * 3600 + date('i') * 60 + date('s') + 1;
if ($merchantrow['stpt'] < $merchantrow['endpt']) {
if ($tp < $merchantrow['stpt'] || $tp > $merchantrow['endpt'])
return errjson('当前时间不在服务时间范围内');
} else {
if ($tp < $merchantrow['stpt'] && $tp > $merchantrow['endpt'])
return errjson('当前时间不在服务时间范围内');
}
if ($merchantrow['saasstatus'] != 10)
return errjson('商户已被暂停服务');
$csql = new \ciy\sql('hf_providerbase');
$csql->where('id', $merchantrow['providerid']);
$providerrow = $db->getone($csql);
if (!is_array($providerrow))
return errjson('服务商不存在');
if ($providerrow['providerstatus'] != 10)
return errjson('转账服务暂停,请联系服务商!');
if ($providerrow['depositmoney'] <= 0)
return errjson('转账服务暂停,请联系服务商');
$signs = $post->get('sign');
if ($merchantrow['safecase'] == 10) {
if (empty($userrow['password2']))
return errjson('请先在右上角下拉菜单中,设置安全密码');
$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', $authtime / 1000));
}
if ($post->get('pass') != sha512($userrow['password2'] . $authtime)) {
sleep(2);
return errjson('安全密码错误');
}
sleep(1);
} else {
$csql = new \ciy\sql('hf_merchantpubkey');
$csql->where('id', $userrow['pubkeyid']);
$pubkeyrow = $db->getone($csql);
if (!is_array($pubkeyrow))
return errjson('未找到数字证书');
if ($merchantrow['safecase'] == 20) {
$retsign = verifysign_web3($pubkeyrow['pubkey'], $signs);
if (is_string($retsign))
return errjson($retsign);
}
if ($merchantrow['safecase'] == 30) {
$retsign = verifysign_vn($pubkeyrow['pubkey'], $signs);
if (is_string($retsign))
return errjson($retsign);
}
}
try {
$db->begin();
foreach ($signs as $sign) {
$updata = array();
$updata['orderstatus'] = 20;
$updata['apiuser'] = $rsuser['id'];
if ($merchantrow['safecase'] > 10) {
$updata['signtimes'] = tostamp();
$updata['signature'] = $sign['sign'];
$updata['pubkeyid'] = $userrow['pubkeyid'];
}
$csql = new \ciy\sql('ap_transfer');
$csql->where('id', $sign['id']);
$csql->where('orderstatus', 10);
if ($db->update($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();
}
public static function json_importxls_in() {
global $db;
$rsuser = verifyfast();
//if (nopower($db, $rsuser['id'], 'p i'))
// return errjson('您未被授权操作');
$post = new \ciy\post();
$file = PATH_WEB . '/ud' . $post->get('file');
if (!file_exists($file))
return errjson('文件不存在');
require_once PATH_ROOT . '../libs/phpoffice/autoload.php';
$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($file);
$sheet = $spreadsheet->getActiveSheet();
$datas = $sheet->toArray('', true, true, false);
$datacnt = count($datas);
if ($datacnt < 2)
return errjson('数据为空');
$html = '';
$headsn = array();
$headsn[] = '行码.id';
$headsn[] = '账号类型.accounttype';
$headsn[] = '金额.amount';
$headsn[] = '账号.tranaccount';
$headsn[] = '姓名.tranname';
$headsn[] = '身份证号.tranidid';
$headsn[] = '备注.memo';
$xlsidx = 1;
if (empty($datas[0][count($headsn) - 1]))
$xlsidx = 2;
$heads = array();
foreach ($headsn as $_head) {
$hd = explode('.', $_head);
if (count($hd) < 2)
continue;
$heads[] = array(
'idx' => array_search($hd[0], $datas[$xlsidx - 1]),
'fld' => $hd[1],
'name' => $hd[0]
);
}
$code_accounttype = getcatas($db, 'accounttype');
$csql = new \ciy\sql('hf_merchantbase');
$csql->where('id', $rsuser['s_b']);
$merchantrow = $db->getone($csql);
$html .= '<div class="table" style="width: 100%;height: calc(100% - 2.2em);overflow: auto;">';
$html .= '<table><tbody><tr>';
$html .= '<th>#</th>';
foreach ($heads as $arr) {
$html .= '<th>' . $arr['name'] . '</th>';
}
$html .= '</tr>';
$cnt = 0;
$uniques = array();
$id = 0;
for ($rowidx = $xlsidx; $rowidx < $datacnt; $rowidx++) {
$bfull = false;
foreach ($datas[$rowidx] as $dat) {
if (empty($dat))
continue;
$bfull = true;
break;
}
if (!$bfull)
continue;
$lineidx = $rowidx - $xlsidx + 1;
$hrhtml = '';
$firsthtml = '<td><div>' . $lineidx . '</div></td>';
$bempty = true;
$unqs = array();
$csql = new \ciy\sql('ap_transfer');
$data = array();
foreach ($heads as $arr) {
$name = $arr['name'];
$errmsg = ''; //数据有误,显示红色说明
$showdat = ''; //显示在表格中的数据
if ($arr['idx'] > -1)
$showdat = trim($datas[$rowidx][$arr['idx']]);
if ($showdat == '--')
$showdat = '';
$value = $showdat; //在表单中的数据(转换后)
$ext = ''; //扩展表单
if ($name == '行码') {
if (empty($showdat)) {
$value = 0;
$showdat = '<kbd>新增</kbd>';
} else {
$id = deid($showdat);
if ($id == 0)
$errmsg = $name . '解析错误';
else {
$csqlchk = new \ciy\sql('ap_transfer');
$csqlchk->where('id', $id);
$chkrow = $db->getone($csqlchk);
if (!is_array($chkrow))
$errmsg = $name . '在数据库中不存在';
if ($chkrow['orderstatus'] != 10)
$errmsg = $name . '状态错误';
$value = $id;
}
}
} else if ($name == '账号类型') {
if (empty($showdat)) {
$errmsg = $name . '为必填项';
} else {
$value = dcode($code_accounttype, $showdat);
$data['accounttype'] = $data;
if ($value == -1)
$errmsg = $name . '文字与系统数据不匹配';
}
} else if ($name == '金额') {
$showdat = str_replace(',', '', $showdat);
if (!is_numeric($showdat))
$errmsg = $name . '不是数字';
else
$value = toint((float)$showdat * 100);
$data['amount'] = $value;
if ($value < 0.1)
$errmsg = $name . '不能小于0.1元';
} else if ($name == '账号') {
if (empty($showdat)) {
$errmsg = $name . '必填';
}
$data['tranaccount'] = $showdat;
} else if ($name == '姓名') {
if (empty($showdat)) {
$errmsg = $name . '必填';
}
$data['tranname'] = $showdat;
} else if ($name == '身份证号') {
if (empty($showdat)) {
$value = '';
}
$data['tranidid'] = $showdat;
} else if ($name == '备注') {
if (empty($showdat)) {
$value = '';
}
$data['memo'] = $showdat;
}
if (!empty($showdat))
$bempty = false;
if (empty($errmsg))
$hrhtml .= '<td><div>' . $showdat . '<input type="hidden" name="' . $arr['fld'] . '_' . $lineidx . '" value="' . $value . '"/>' . $ext . '</div></td>';
else
$hrhtml .= '<td style="background:#ffe8c5;" title="#' . $lineidx . ':' . $errmsg . '"><div>' . $showdat . '</div></td>';
}
if ($bempty)
continue;
$retchk = check_transtr($data['amount'], $data['accounttype'], $data['tranaccount'], $data['tranname'], $data['tranidid'], $data['memo'], $merchantrow['safecase']);
if (is_string($retchk))
$firsthtml = '<td style="background:#ffe8c5;" title="#' . $lineidx . ':' . $retchk . '"><div class="lang">重复</div></td>';
else if (count($unqs) > 0) {
$unq = implode('|', $unqs);
if (in_array($unq, $uniques))
$firsthtml = '<td style="background:#ffe8c5;" title="#' . $lineidx . ':该行与待导入数据有重复"><div class="lang">重复</div></td>';
else {
$uniques[] = $unq;
$csql->column('id');
$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>';
}
}
$html .= '<tr>' . $firsthtml . $hrhtml . '</tr>';
$cnt++;
}
$html .= '</tbody></table></div>';
$html .= '<input type="hidden" name="total" value="' . $cnt . '"/>';
$html .= '<code>共' . $cnt . '条数据</code>';
return succjson(array('html' => $html, 'count' => $cnt));
}
public static function json_importxls_data() {
global $db;
$rsuser = verifyfast();
//if (nopower($db, $rsuser['id'], 'p i'))
// return errjson('您未被授权操作');
$csql = new \ciy\sql('hf_merchantbase');
$csql->where('id', $rsuser['s_b']);
$merchantrow = $db->getone($csql);
$post = new \ciy\post();
$total = $post->getint('total');
try {
$db->begin();
for ($i = 1; $i <= $total; $i++) {
$id = $post->getint('id_' . $i);
$data = array();
$data['accounttype'] = $post->get('accounttype_' . $i);
$data['amount'] = $post->get('amount_' . $i);
$data['tranaccount'] = $post->get('tranaccount_' . $i);
$data['tranname'] = $post->get('tranname_' . $i);
$data['tranidid'] = $post->get('tranidid_' . $i);
$data['memo'] = $post->get('memo_' . $i);
self::updatedata($db, $rsuser, $id, $data, $merchantrow);
}
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
return succjson();
}
}

244
web/admin/demo/setpage.html Normal file
View File

@ -0,0 +1,244 @@
<!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">
<div class="row">
<div class="col-24 col-sm-12 col-md-8 px2 py2">
<fieldset class="tips">
<legend>服务图片设置</legend>
<div>
<form>
<div class="char6 row">
<div class="ciy-form col-24 col-sm-24 top">
<label class="lang">服务商客服码</label>
<div>
<ciy-upload com="serviceimg" num="1" type="jpg,png" />
</div>
</div>
<div class="ciy-form col-24 col-sm-24">
<div class="txt-center">
<button type="button" class="btn lg" onclick="editserv(this)">更新</button>
</div>
</div>
</div>
</form>
</div>
</fieldset>
</div>
<div class="col-24 col-sm-12 col-md-8 px2 py2">
<fieldset class="tips">
<legend>收款账号设置</legend>
<div>
<form>
<div class="char6 row">
<div class="ciy-form col-24 col-sm-24">
<label class="lang">收款账号类型</label>
<div>
<ciy-radio com="recvtype" />
</div>
</div>
<div class="ciy-form col-24 col-sm-24">
<label class="lang">收款账号</label>
<div>
<input type="text" name="recvaccount" style="width:100%;" />
</div>
</div>
<div class="ciy-form col-24 col-sm-24">
<label class="lang">收款账号名</label>
<div>
<input type="text" name="recvname" style="width:100%;" />
</div>
</div>
<div class="ciy-form col-24 col-sm-24">
<div class="txt-center">
<button type="button" class="btn lg" onclick="editrecv(this)">设置</button>
</div>
</div>
</div>
</form>
</div>
</fieldset>
</div>
<div class="col-24 col-sm-12 col-md-8 px2 py2">
<fieldset class="tips">
<legend>API接入设置</legend>
<div>
<form>
<div class="char6 row">
<div class="ciy-form col-24 col-sm-24">
<label class="lang">appid</label>
<div>
<input type="text" name="ali_appid" style="width:100%;" />
</div>
</div>
<div class="ciy-form col-24 col-sm-24">
<label class="lang">PubKey</label>
<div>
<input type="file" id="pubkey" />
<br />appCertPublicKey_[num].crt
</div>
</div>
<div class="ciy-form col-24 col-sm-24">
<label class="lang">RootCert</label>
<div>
<input type="file" id="rootkey" />
<br />alipayRootCert.crt
</div>
</div>
<div class="ciy-form col-24 col-sm-24">
<label class="lang">PubRSA2</label>
<div>
<input type="file" id="apppub" />
<br />alipayCertPublicKey_RSA2.crt
</div>
</div>
<div class="ciy-form col-24 col-sm-24">
<label class="lang">PriKey</label>
<div>
<input type="file" id="apppri" />
<br />应用私钥RSA2048*.txt
</div>
</div>
<div class="ciy-form col-24 col-sm-24">
<div class="txt-center">
<button type="button" class="btn lg" onclick="editapp(this)">设置</button>
<button type="button" class="btn sm warn abs b0 r0" onclick="testapp()">签约测试</button>
</div>
</div>
</div>
</form>
</div>
</fieldset>
</div>
</div>
<div class="ciy-hr my4"></div>
<div id="id_status"></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/ciycmp2.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();
Glob.certfile = {};
ciyfn.callfunc('init', {}, function (json) {
var path = ciyfn.makeuploadpath('providerbase', ciyfn.getstorage(ciy_vars.tokenfield));
ciycmp({ dom: $5('[com=recvtype]'), value: json.data.recvtype, range: 'accounttype' });
ciycmp({ dom: $5('[com=feerate]'), value: json.data.feerate });
ciycmp({ dom: $5('[com=feelow]'), value: json.data.feelow });
$5('[name=recvaccount]').val(json.data.recvaccount);
$5('[name=recvname]').val(json.data.recvname);
ciycmp({ dom: $5('[com=serviceimg]'), value: json.data.serviceimg, path: path });
ciycmp({ dom: $5('[com=pubkey]') });
$5('[name=ali_appid]').val(json.key.ali_appid);
var html = '';
if (json.data.providerstatus == 10) {
html += '<button class="btn dag" onclick="prov_stop()">暂停业务</button>';
html += ' 暂停后,所有商户无法下达新转账操作、不能提现,已下达的转账操作不影响。';
}
if (json.data.providerstatus == 20) {
html += '<button class="btn succ" onclick="prov_start()">恢复业务</button>';
}
if (json.data.providerstatus == 30) {
html += '服务商已被冻结,请联系平台';
}
$5('#id_status').html(html);
});
});
$5('[type=file]').on('change', function (ev) {
var id = ev.target.id;
var name = ev.target.value;
const file = ev.target.files[0];
if (!file)
return;
const reader = new FileReader();
reader.onload = function (e) {
const content = e.target.result;
Glob.certfile[id] = { name: name, content: content };
};
reader.readAsText(file);
});
function editserv(dom) {
var postparam = ciyfn.getform(dom);
if (ciyfn.throttle(dom)) return;
ciyfn.callfunc("editserv", postparam, function (json) {
ciyfn.toast('提交成功');
});
}
function editrecv(dom) {
var postparam = ciyfn.getform(dom);
if (ciyfn.throttle(dom)) return;
ciyfn.callfunc("editrecv", postparam, function (json) {
ciyfn.toast('提交成功');
});
}
function editapp(dom) {
var postparam = ciyfn.getform(dom);
if (!Glob.certfile.pubkey)
return ciyfn.toast('请上传PubKey');
if (!Glob.certfile.rootkey)
return ciyfn.toast('请上传RootCert');
if (!Glob.certfile.apppub)
return ciyfn.toast('请上传PubRSA2');
if (!Glob.certfile.apppri)
return ciyfn.toast('请上传私钥');
//Glob.certfile.apppri.name "C:\\fakepath\\应用私钥RSA2048-敏感数据,请妥善保管.txt"
postparam.pubkey = Glob.certfile.pubkey.content;
postparam.rootkey = Glob.certfile.rootkey.content;
postparam.apppub = Glob.certfile.apppub.content;
postparam.apppri = Glob.certfile.apppri.content;
if (ciyfn.throttle(dom)) return;
ciyfn.callfunc("editapp", postparam, function (json) {
ciyfn.toast('设置成功');
});
}
function testapp() {
ciyfn.callfunc("testapp", {}, function (json) {
window.open(json.url);
ciyfn.alert({
content: '是否出现二维码?'
, btns: ["*关闭"]
});
});
}
function prov_stop() {
ciyfn.alert({
content: '确定要暂停服务?'
, btns: ["暂停", '*关闭']
, cb: function (opn) {
if (opn.btn == '关闭')
return opn.close();
ciyfn.callfunc("prov_stop", {}, function (json) {
opn.close();
ciyfn.toast('已暂停服务');
location.reload();
});
}
});
}
function prov_start() {
ciyfn.callfunc("prov_start", {}, function (json) {
ciyfn.toast('已开启服务');
location.reload();
});
}
</script>
</body>
</html>

250
web/admin/demo/setpage.php Normal file
View File

@ -0,0 +1,250 @@
<?php
namespace web\admin\demo;
class setpage {
public static function json_init() {
global $db;
$rsuser = verifyfast();
$post = new \ciy\post();
$csql = new \ciy\sql('hf_providerbase');
$csql->where('id', $rsuser['s_a']);
$ret['data'] = $db->getone($csql);
$csql = new \ciy\sql('hf_providerkey');
$csql->where('id', $rsuser['s_a']);
$csql->column('ali_appid');
$ret['key'] = $db->getone($csql);
return succjson($ret);
}
public static function json_editserv() {
global $db;
$rsuser = verifyfast();
//if (nopower($db, $rsuser['id'], 'p u'))
// return errjson('您未被授权操作');
$post = new \ciy\post();
$serviceimg = $post->get('serviceimg');
try {
$db->begin();
$updata = array();
$updata['serviceimg'] = $serviceimg;
$csql = new \ciy\sql('hf_providerbase');
$csql->where('id', $rsuser['s_a']);
if ($db->update($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();
}
public static function json_editrecv() {
global $db;
$rsuser = verifyfast();
//if (nopower($db, $rsuser['id'], 'p u'))
// return errjson('您未被授权操作');
$post = new \ciy\post();
$recvtype = $post->getint('recvtype');
$recvaccount = $post->get('recvaccount');
$recvname = $post->get('recvname');
if ($recvtype == 0)
return errjson('请选择账号类型');
if (empty($recvaccount))
return errjson('请输入收款账号');
if (empty($recvname))
return errjson('请输入收款人姓名');
try {
$db->begin();
$updata = array();
$updata['recvtype'] = $recvtype;
$updata['recvaccount'] = $recvaccount;
$updata['recvname'] = $recvname;
$csql = new \ciy\sql('hf_providerbase');
$csql->where('id', $rsuser['s_a']);
if ($db->update($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();
}
static function hex2dec($hex) {
$dec = 0;
$len = strlen($hex);
for ($i = 1; $i <= $len; $i++) {
$dec = bcadd($dec, bcmul(strval(hexdec($hex[$i - 1])), bcpow('16', strval($len - $i))));
}
return $dec;
}
static function array2string($array) {
$string = [];
if ($array && is_array($array)) {
foreach ($array as $key => $value) {
$string[] = $key . '=' . $value;
}
}
return implode(',', $string);
}
public static function json_editapp() {
global $db;
$rsuser = verifyfast();
//if (nopower($db, $rsuser['id'], 'p u'))
// return errjson('您未被授权操作');
$post = new \ciy\post();
$ali_appid = $post->get('ali_appid');
$pubkey = $post->get('pubkey'); //appCertPublicKey_2021005173683965.crt
$rootkey = $post->get('rootkey'); //alipayRootCert.crt
$apppub = $post->get('apppub'); //alipayCertPublicKey_RSA2.crt
$apppri = $post->get('apppri'); //应用私钥RSA2048-敏感数据,请妥善保管
if (empty($ali_appid))
return errjson('请输入APPID');
if (empty($pubkey))
return errjson('请输入公钥');
if (empty($rootkey))
return errjson('请输入root证书');
if (empty($apppub))
return errjson('请输入APP公钥');
if (empty($apppri))
return errjson('请输入APP私钥');
$ssl = openssl_x509_parse($pubkey);
if ($ssl === false)
return errjson('公钥格式错误');
$ali_app_cert_sn = '';
if (is_array($ssl['issuer']))
$ali_app_cert_sn = md5(self::array2string(array_reverse($ssl['issuer'])) . $ssl['serialNumber']);
if (empty($ali_app_cert_sn))
return errjson('app证书格式错误');
$array = explode("-----END CERTIFICATE-----", $rootkey);
$ali_root_cert_sn = null;
for ($i = 0; $i < count($array) - 1; $i++) {
$ssl[$i] = openssl_x509_parse($array[$i] . "-----END CERTIFICATE-----");
if (strpos($ssl[$i]['serialNumber'], '0x') === 0) {
$ssl[$i]['serialNumber'] = self::hex2dec($ssl[$i]['serialNumberHex']);
}
if ($ssl[$i]['signatureTypeLN'] == "sha1WithRSAEncryption" || $ssl[$i]['signatureTypeLN'] == "sha256WithRSAEncryption") {
if ($ali_root_cert_sn == null) {
$ali_root_cert_sn = md5(self::array2string(array_reverse($ssl[$i]['issuer'])) . $ssl[$i]['serialNumber']);
} else {
$ali_root_cert_sn = $ali_root_cert_sn . "_" . md5(self::array2string(array_reverse($ssl[$i]['issuer'])) . $ssl[$i]['serialNumber']);
}
}
}
if (empty($ali_root_cert_sn))
return errjson('root证书格式错误');
if (strpos($apppri, '-----BEGIN RSA PRIVATE KEY-----') === false) {
$apppri = "-----BEGIN RSA PRIVATE KEY-----\n" . chunk_split($apppri, 64, "\n") . "-----END RSA PRIVATE KEY-----";
}
try {
$db->begin();
$updata = array();
$updata['ali_appid'] = $ali_appid;
$updata['ali_app_cert_sn'] = $ali_app_cert_sn;
$updata['ali_root_cert_sn'] = $ali_root_cert_sn;
$updata['ali_publickey'] = $apppub;
$updata['ali_privatekey'] = $apppri;
$csql = new \ciy\sql('hf_providerkey');
$csql->where('id', $rsuser['s_a']);
if ($db->update($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();
}
public static function json_testapp() {
global $db;
$rsuser = verifyfast();
$csql = new \ciy\sql('hf_providerkey');
$csql->where('id', $rsuser['s_a']);
$keyrow = $db->getone($csql);
$model = array();
$model['personal_product_code'] = 'FUND_SAFT_SIGN_WITHHOLDING_P';
$model['product_code'] = 'FUND_SAFT_SIGN_WITHHOLDING';
$model['external_agreement_no'] = 'AX' . rand(10000, 99999); //bizno
$model['sign_scene'] = 'INDUSTRY|SATF_ACC';
$model['third_party_type'] = 'PARTNER';
$accessParams = array();
$accessParams['channel'] = 'QRCODE'; // 1. ALIPAYAPP 钱包h5页面签约 2. QRCODE(扫码签约) 3. QRCODEORSMS(扫码签约或者短信签约)
$model['access_params'] = $accessParams;
return succjson();
}
public static function json_prov_stop() {
global $db;
$rsuser = verifyfast();
try {
$db->begin();
$updata = array();
$updata['providerstatus'] = 20;
$csql = new \ciy\sql('hf_providerbase');
$csql->where('id', $rsuser['s_a']);
if ($db->update($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();
}
public static function json_prov_start() {
global $db;
$rsuser = verifyfast();
$csql = new \ciy\sql('hf_providerbase');
$csql->where('id', $rsuser['s_a']);
$providerrow = $db->getone($csql);
if ($providerrow['recvtype'] == 0 || empty($providerrow['recvaccount']) || empty($providerrow['recvname']))
return errjson('请配置收款账号');
if ($providerrow['depositmoney'] < 1)
return errjson('您的保证金不足');
$csql = new \ciy\sql('hf_providerkey');
$csql->where('id', $rsuser['s_a']);
$keyrow = $db->getone($csql);
if (!is_array($keyrow)) {
$updata = array();
$updata['ali_appid'] = '';
$updata['ali_app_cert_sn'] = '';
$updata['ali_root_cert_sn'] = '';
$updata['ali_publickey'] = '';
$updata['ali_privatekey'] = '';
$csql = new \ciy\sql('hf_providerkey');
$csql->where('id', $rsuser['s_a']);
if ($db->insert($csql, $updata) === false)
return errjson('添加key失败:' . $db->error);
$keyrow = array();
}
if (empty($keyrow['ali_appid']))
return errjson('请配置APPID');
if (empty($keyrow['ali_app_cert_sn']))
return errjson('请配置APP证书SN');
if (empty($keyrow['ali_root_cert_sn']))
return errjson('请配置根证书SN');
if (empty($keyrow['ali_publickey']))
return errjson('请配置APP公钥');
if (empty($keyrow['ali_privatekey']))
return errjson('请配置APP私钥');
try {
$db->begin();
$updata = array();
$updata['providerstatus'] = 10;
$csql = new \ciy\sql('hf_providerbase');
$csql->where('id', $rsuser['s_a']);
if ($db->update($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

@ -1,113 +0,0 @@
<!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>

105
web/admin/demo/ultable.html Normal file
View File

@ -0,0 +1,105 @@
<!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;">
<div>
<div class="sinps"></div>
<div class="sbtns">
<button class="lang btn" type="submit">查询</button>
<a class="lang btn" onclick="edit(0)">添加</a>
</div>
</div>
</form>
<div class="table">
<div class="loading col-24">Loading...</div>
<ul class="list row"></ul>
<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>
<script type="text/javascript" src="/jscss/ciy.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 () {
table = new ciyclass.cardtable({
dom: '.table'
, url: 'init'
, pagecount: window.innerWidth > 992 ? 9 : 6
, fn_beforedata: function (json) {
ciyfn.fillsearch({
dom: '.search'
, data: json
});
return json;
}
, fn_lihtml: function (ldat) {
var ds = ldat['power'].split('.');
var p1 = 0;
var p2 = 0;
for (var d in ds) {
if (ds[d] == '')
continue;
if (isNaN(parseInt(ds[d].charAt(ds[d].length - 1))))
p2++;
else
p1++;
}
var powerhtml = '';
if (p1 > 0)
powerhtml += '<code>' + ciyfn.lang('主权限') + p1 + ciyfn.lang('项') + '</code>';
if (p2 > 0)
powerhtml += '<code>' + ciyfn.lang('子权限') + p2 + ciyfn.lang('项') + '</code>';
if (powerhtml == '')
powerhtml = '<kbd class="lang"></kbd>';
return `<li data-id="${ldat.id}" class="col-24 col-sm-12 col-md-8">
<div class="ciy-list" style="height:9em;">
<div class="l1">${ldat.name}</div>
<div class="rt">${powerhtml}</div>
<div class="l2">${ldat.memo}</div>
<div class="lb txt-smm"> 更新: ${ciyfn.todatetime(ldat.uptimes)}</div>
<div class="rb"><a class="lang btn" onclick="edit(${ldat.id})">修改</a></div>
</div>
</li>`;//测试es6真实普及率
}
});
table.callpage(1);
});
function edit(id) {
ciyfn.alert({
title: id == 0 ? '添加' : '修改'
, width: 'pc'
, height: 'pc'
, frame: 'rigger/role_u.html?id=' + id
, cb: function (opn) {
opn.close();
table.updateline(opn.inputs);
}
});
}
</script>
</body>
</html>

View File

@ -0,0 +1,84 @@
<?php
namespace web\admin\demo;
class ultable {
static function setwhere($db, $post) {
$query = $post->get('query');
$csql = new \ciy\sql('zc_role');
$csql->where('name like', objstr($query, 'name'));
$csql->where('memo like', objstr($query, 'memo'));
$order = objstr($query, 'order', 'id desc');
$csql->order($order);
$query['order'] = $order;
return [$query, $csql];
}
public static function json_init() {
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);
$ret = array('where' => $where, 'pageno' => $pageno, 'pagecount' => $pagecount, 'count' => $mainrowcount, 'list' => $rows);
if ($post->getbool('field')) {
$field = array();
$fshow = $db->getfield($field, 'zc_role');
foreach ($field as $fr => $v) {
if ($post->is('_' . $fr))
$field[$fr]['c'] = ',' . $field[$fr]['c'];
}
$fshow = fieldadd($fshow, $field, 0, '_btn', '操作');
$field['memo']['thwidth'] = '25em';
$ret['field'] = $field;
$ret['fshow'] = $fshow;
}
if ($post->getbool('once')) {
$ret['once'] = array();
$input = array();
$input[] = array(
'type' => 'input', 'form' => 'name', 'name' => '角色名称', 'prop' => ' style="width:8em;"'
);
$input[] = array(
'type' => 'input', 'form' => 'memo', 'name' => '角色说明', 'prop' => ' style="width:8em;"'
);
$ret['once']['input'] = $input;
}
return succjson($ret);
}
public static function json_del() {
global $db;
$rsuser = verifyfast();
if (nopower($db, $rsuser['id'], 'p502d'))
return errjson('您未被授权操作');
$post = new \ciy\post();
$ids = $post->get('ids');
if (empty($ids))
return errjson('请选择至少一条');
$csql = new \ciy\sql('zc_role');
$csql->where('id in', $ids);
$rows = $db->get($csql);
$vids = array();
try {
$db->begin();
foreach ($rows as $row) {
$delid = $row['id'];
delcheck($db, $delid, 'zc_admin', 'roleid', '用户');
delme($db, $delid, 'zc_role');
savelogdb($db, $rsuser['id'], 'zc_role', $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

@ -11,7 +11,7 @@ func Index_init(w http.ResponseWriter, r *http.Request) bool {
//menuurl: 普通链接~原型图 4378,key 普通链接~原型图 共存
//menupow: d=删除|e=修改 p[id]e 默认p[id]v 显示权限 角色权限menu url<>'' 可选择授权
post := c.NewCiyPost(w, r)
_, userid := Verifyfast(c.CiyDB, post)
_, userid := Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -51,12 +51,12 @@ func Index_init(w http.ResponseWriter, r *http.Request) bool {
"name": "控制台",
}
ret["title"] = "Ciyon SaaS总控台"
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}
func Index_favadd(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := Verifyfast(c.CiyDB, post)
_, userid := Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -79,11 +79,11 @@ func Index_favadd(w http.ResponseWriter, r *http.Request) bool {
return c.ErrJSON(w, "添加fav失败", err)
}
}
return c.SuccJSON(w)
return c.SuccJSON(w, r)
}
func Index_favdel(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := Verifyfast(c.CiyDB, post)
_, userid := Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -94,12 +94,12 @@ func Index_favdel(w http.ResponseWriter, r *http.Request) bool {
if err != nil {
return c.ErrJSON(w, "删除fav失败", err)
}
return c.SuccJSON(w)
return c.SuccJSON(w, r)
}
func Index_setssh(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := Verifyfast(c.CiyDB, post)
_, userid := Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -111,7 +111,7 @@ func Index_setssh(w http.ResponseWriter, r *http.Request) bool {
//开启后,需定时关闭防火墙
fmt.Println("开启SSH远程访问")
}
return c.SuccJSON(w)
return c.SuccJSON(w, r)
}
// if strings.HasPrefix(r.Header.Get("Content-Type"), "multipart/form-data") {

View File

@ -661,22 +661,15 @@
var tabsuldom = $5('#id_headertabs_ul');
$5(document).on('click', '[data-href]', function (e) {
var adom = $5(e.currentTarget);
var hrefstr = adom.attr('data-href');
hrefstr = hrefstr.replace('{domain}', location.origin);
if (!hrefstr)
return;
var href = adom.attr('data-href');
var txt = adom.attr('data-title') || adom.text();
var hrefs = hrefstr.split('~');
var href = hrefs[0];
if (href == '') {
if (hrefs.length > 1) {
if (hrefs[1][0] == ':')
ciyfn.alert(hrefs[1].substring(1).replace(/\|/g, '<br/>'));
else
thos.page_ifropen(getdemourl(hrefs[1]), txt);
}
} else if (href.substring(0, 4) == 'http') {
window.open(href);
} else if (href.substring(0, 4) == '!MSG') {
ciyfn.alert(href.substring(4).replace(/\|/g, '<br/>'));
} else if (href.substring(0, 4) == '!WIN') {
window.open(href.substring(4));
} else if (href.substring(0, 4) == '!PRD') {
thos.page_ifropen(getdemourl(href.substring(4)), txt);
} else if (href.substring(0, 4) == '!DAO') {
ciyfn.callfunc("godao", { url: href.substring(4) }, function (json) {
thos.page_ifropen(json.url, txt);
@ -684,8 +677,6 @@
thos.page_shrink();
});
} else {
if (href.substring(0, 5) == '$http')
href = href.substring(1);
thos.page_ifropen(href, txt);
if (window.innerWidth < 992)
thos.page_shrink();
@ -743,25 +734,18 @@
var bodydom = $5('#id_body');
navdom.on("contextmenu", "li", function (ev) {
var curra = $5(ev.currentTarget);
var hrefstr = curra.attr('data-href');
var href = curra.attr('data-href');
var menuid = curra.attr('data-id') || curra.attr('fav');
if (hrefstr == undefined)
if (href == undefined)
return false;
var pops = [];
var hrefs = hrefstr.split('~');
var txt = curra.attr('data-title') || curra.text();
txt = ciyfn.lang(txt);
if (hrefs[0]) {
if (href) {
if (curra.hasattr('fav'))
pops.push({ act: 'delfav', id: menuid, title: ciyfn.lang('移除该菜单'), name: txt, url: hrefs[0] });
pops.push({ act: 'delfav', id: menuid, title: ciyfn.lang('移除该菜单'), name: txt, url: href });
else
pops.push({ act: 'addfav', id: menuid, title: ciyfn.lang('加到常用菜单'), name: txt, url: hrefs[0] });
}
if (hrefs[1]) {
if (hrefs[1][0] == ':')
pops.push({ act: 'msg', title: ciyfn.lang('原型描述'), url: hrefs[1].substring(1) });
else
pops.push({ act: 'ifropen', title: ciyfn.lang('打开原型图'), name: txt + '-' + ciyfn.lang('原型图'), url: getdemourl(hrefs[1]) });
pops.push({ act: 'addfav', id: menuid, title: ciyfn.lang('加到常用菜单'), name: txt, url: href });
}
var popdom = ciyfn.popmenu(ev, pops);
popdom.on("click", "li", function (ev) {

View File

@ -39,14 +39,14 @@ func Login_login(w http.ResponseWriter, r *http.Request) bool {
if math.Abs(c.Tofloat(authtime/1000-c.Tostamp())) > 300 {
return c.ErrJSON(w, "您的本地时间与服务器时间相差超过5分钟请调整本机时间.<br/>服务器时间: "+c.Todate(-1, "Y-m-d H:i:s")+"<br/>您本机时间: "+c.Todate(authtime/1000, "Y-m-d H:i:s"))
}
if post.Get("pass") != c.MD5(c.Tostr(userrow["password"])+fmt.Sprintf("%d", authtime)) {
if post.Get("pass") != c.Sha256(c.Tostr(userrow["password"])+fmt.Sprintf("%d", authtime)) {
updata := map[string]any{}
updata["trytime"] = []string{"trytime+1"}
updata["logintimes"] = c.Tostamp()
csql = c.NewCiySQL("zc_admin")
csql.Where("id", userrow["id"])
c.CiyDB.Update(csql, updata)
SaveLog(c.CiyDB, "LOGINERR", "用户["+user+"]登录密码错误 "+Gdefpass+" ["+c.MD5(Gdefpass+Gtokensalt)+"]")
SaveLog(c.CiyDB, "LOGINERR", "用户["+user+"]登录密码错误 "+Gdefpass+" ["+c.Sha256(Gdefpass+Gtokensalt)+"]")
return c.ErrJSON(w, "用户["+user+"]登录密码错误")
}
syncdict, err := getsync(userrow)
@ -57,7 +57,7 @@ func Login_login(w http.ResponseWriter, r *http.Request) bool {
userid := c.Toint(userrow["id"])
c.CiyDB.Execute("delete from zc_online where exptimes<? and user=?", c.Tostamp(), userid)
sid := c.Randstr(10)
exptimes := c.Tostamp() + 86400
exptimes := c.Tostamp() + Gtokenswapsec
updata := map[string]any{}
updata["user"] = userid
updata["targettype"] = targettype
@ -86,14 +86,15 @@ func Login_login(w http.ResponseWriter, r *http.Request) bool {
authstr := c.JSON_Str(auth)
newauth := c.Encrypt(authstr, "E", Gtokensalt)
post.W.Header().Set(Gtokenfield, newauth)
syncdict["_ciyauth"] = newauth
//post.W.Header().Set(Gtokenfield, newauth)
SaveLog(c.CiyDB, "LOGIN", "登录成功")
return c.SuccJSON(w, syncdict)
return c.SuccJSON(w, r, syncdict)
}
func Login_restorage(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
rsuser, _ := Verifyfast(c.CiyDB, post)
rsuser, _ := Verifyfast(r, c.CiyDB, post)
csql := c.NewCiySQL("zc_admin")
csql.Where("id", rsuser["id"])
userrow, err := c.CiyDB.Getone(csql)
@ -105,7 +106,7 @@ func Login_restorage(w http.ResponseWriter, r *http.Request) bool {
return c.ErrJSON(w, "遇到同步错误", err)
}
c.CiyDB.Execute("update zc_online set usrchg=0 where id=?", rsuser["_o"])
return c.SuccJSON(w, syncdict)
return c.SuccJSON(w, r, syncdict)
}
func getsync(userrow map[string]any) (map[string]any, error) {
var err error
@ -139,11 +140,8 @@ func getsync(userrow map[string]any) (map[string]any, error) {
me["depart"] = departname
me["addtimes"] = userrow["addtimes"]
power := userrow["power"]
if c.Toint(userrow["id"]) == 10 {
power = ".*."
}
me["power"] = power
me["needpass"] = (userrow["password"] == c.MD5(Gdefpass+Gtokensalt))
me["needpass"] = (userrow["password"] == c.Sha256(Gdefpass+Gtokensalt))
syncdict := map[string]any{}
syncdict["storage"] = storage
syncdict["me"] = me
@ -152,12 +150,12 @@ func getsync(userrow map[string]any) (map[string]any, error) {
func Login_logout(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
rsuser, err := Verifyuser(c.CiyDB, post)
rsuser, err := Verifyuser(r, c.CiyDB, post)
if err == nil {
csql := c.NewCiySQL("zc_online")
csql.Where("id", rsuser["_o"])
c.CiyDB.Delete(csql)
}
SaveLog(c.CiyDB, "LOGIN", "退出登录")
return c.SuccJSON(w)
return c.SuccJSON(w, r)
}

View File

@ -89,9 +89,7 @@ class login {
$authstr = json_encode($auth, JSON_PARTIAL_OUTPUT_ON_ERROR);
$enauth = encrypt($authstr, 'E', $_token['salt']);
if ($_token['type'] == 'cookie') {
$headercookie = 'Set-Cookie: ' . $_token['field'] . '=' . $enauth . '; expires=' . gmdate('D, d-M-Y H:i:s T', time() + $_token['swapsec'] + $_token['expsec']) . '; path=/; httponly';
if(ishttps())
$headercookie.= '; SameSite=None; Secure';
$headercookie = 'Set-Cookie: ' . $_token['field'] . '=' . $enauth . '; expires=' . gmdate('D, d-M-Y H:i:s T', time() + $_token['swapsec'] + $_token['expsec']) . '; path=/; httponly; SameSite=None; Secure';
header($headercookie);
} else {
$ret['_ciyauth'] = $enauth;

View File

@ -30,7 +30,7 @@ func admin_setwhere(post *c.CiyPost) (map[string]any, *c.CiySQL) {
}
func Admin_init(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -96,12 +96,12 @@ func Admin_init(w http.ResponseWriter, r *http.Request) bool {
once["zc_role"], _, _ = c.CiyDB.Get(csql)
ret["once"] = once
}
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}
func Admin_update(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -212,12 +212,12 @@ func Admin_update(w http.ResponseWriter, r *http.Request) bool {
}
ret := map[string]any{}
ret["data"] = updata
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}
func Admin_del(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -257,12 +257,12 @@ func Admin_del(w http.ResponseWriter, r *http.Request) bool {
c.CiyDB.Execute("update zc_online set usrchg=2")
ret := map[string]any{}
ret["ids"] = vids
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}
func Admin_repass(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -273,7 +273,7 @@ func Admin_repass(w http.ResponseWriter, r *http.Request) bool {
err := c.CiyDB.Tran(func() error {
updata := map[string]any{}
updata["trytime"] = 0
updata["password"] = c.MD5(admin.Gdefpass + admin.Gtokensalt)
updata["password"] = c.Sha256(admin.Gdefpass + admin.Gtokensalt)
csql := c.NewCiySQL("zc_admin")
csql.Where("id", id)
_, err := c.CiyDB.Update(csql, updata)
@ -288,11 +288,11 @@ func Admin_repass(w http.ResponseWriter, r *http.Request) bool {
c.CiyDB.Execute("delete from zc_online where user=?", id)
ret := map[string]any{}
ret["msg"] = "默认密码: " + admin.Gdefpass
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}
func Admin_exportxls(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -385,11 +385,11 @@ func Admin_exportxls(w http.ResponseWriter, r *http.Request) bool {
}
ret := map[string]any{}
ret["url"] = filename
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}
func Admin_importxls_in(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -574,14 +574,14 @@ func Admin_importxls_in(w http.ResponseWriter, r *http.Request) bool {
html += "</div>\n"
html += "<input type=\"hidden\" name=\"total\" value=\"" + c.Tostr(cnt) + "\"/>\n"
html += "<code>共" + c.Tostr(cnt) + "条数据</code>\n"
return c.SuccJSON(w, map[string]any{
return c.SuccJSON(w, r, map[string]any{
"html": html,
"count": cnt,
})
}
func Admin_importxls_data(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -630,5 +630,5 @@ func Admin_importxls_data(w http.ResponseWriter, r *http.Request) bool {
return c.ErrJSON(w, "事务"+err.Error())
}
c.CiyDB.Execute("update zc_online set usrchg=2")
return c.SuccJSON(w)
return c.SuccJSON(w, r)
}

View File

@ -23,7 +23,7 @@ func autotask_setwhere(post *c.CiyPost) (map[string]any, *c.CiySQL) {
}
func Autotask_init(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -74,11 +74,11 @@ func Autotask_init(w http.ResponseWriter, r *http.Request) bool {
once["input"] = input
ret["once"] = once
}
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}
func Autotask_update(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -148,11 +148,11 @@ func Autotask_update(w http.ResponseWriter, r *http.Request) bool {
}
ret := map[string]any{}
ret["data"] = updata
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}
func Autotask_del(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -184,12 +184,12 @@ func Autotask_del(w http.ResponseWriter, r *http.Request) bool {
}
ret := map[string]any{}
ret["ids"] = vids
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}
func Autotask_status(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -222,5 +222,5 @@ func Autotask_status(w http.ResponseWriter, r *http.Request) bool {
}
ret := map[string]any{}
ret["data"] = updata
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}

View File

@ -23,7 +23,7 @@ func autotskrun_setwhere(post *c.CiyPost) (map[string]any, *c.CiySQL) {
}
func Autotskrun_init(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -79,11 +79,11 @@ func Autotskrun_init(w http.ResponseWriter, r *http.Request) bool {
once["zc_autotask"], _, _ = c.CiyDB.Get(csql)
ret["once"] = once
}
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}
func Autotskrun_del(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -116,12 +116,12 @@ func Autotskrun_del(w http.ResponseWriter, r *http.Request) bool {
}
ret := map[string]any{}
ret["ids"] = vids
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}
func Autotskrun_exportxls(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -199,11 +199,11 @@ func Autotskrun_exportxls(w http.ResponseWriter, r *http.Request) bool {
}
ret := map[string]any{}
ret["url"] = filename
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}
func Autotskrun_viewlog(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -218,5 +218,5 @@ func Autotskrun_viewlog(w http.ResponseWriter, r *http.Request) bool {
}
ret := map[string]any{}
ret["logs"] = rows
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}

View File

@ -11,7 +11,7 @@ import (
func Cata_init(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -107,11 +107,11 @@ func Cata_init(w http.ResponseWriter, r *http.Request) bool {
once["code"] = code
ret["once"] = once
}
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}
func Cata_update(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -179,11 +179,11 @@ func Cata_update(w http.ResponseWriter, r *http.Request) bool {
c.CiyDB.Execute("update zc_online set usrchg=2")
ret := map[string]any{}
ret["data"] = updata
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}
func Cata_del(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -240,5 +240,5 @@ func Cata_del(w http.ResponseWriter, r *http.Request) bool {
c.CiyDB.Execute("update zc_online set usrchg=2")
ret := map[string]any{}
ret["ids"] = vids
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}

View File

@ -11,7 +11,7 @@ import (
func Cataindex_init(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -62,11 +62,11 @@ func Cataindex_init(w http.ResponseWriter, r *http.Request) bool {
once["input"] = input
ret["once"] = once
}
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}
func Cataindex_update(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -131,11 +131,11 @@ func Cataindex_update(w http.ResponseWriter, r *http.Request) bool {
}
ret := map[string]any{}
ret["data"] = updata
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}
func Cataindex_del(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -173,5 +173,5 @@ func Cataindex_del(w http.ResponseWriter, r *http.Request) bool {
}
ret := map[string]any{}
ret["ids"] = vids
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}

View File

@ -10,7 +10,7 @@ import (
func Chgpass_update(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -22,12 +22,6 @@ func Chgpass_update(w http.ResponseWriter, r *http.Request) bool {
if newpass == "" {
return c.ErrJSON(w, "请输入新密码")
}
if newpass == admin.Gdefpass {
return c.ErrJSON(w, "新密码不要与默认密码相同")
}
if len(newpass) < 6 {
return c.ErrJSON(w, "密码应至少6位")
}
csql := c.NewCiySQL("zc_admin")
csql.Where("id", userid)
@ -35,24 +29,24 @@ func Chgpass_update(w http.ResponseWriter, r *http.Request) bool {
if userrow == nil {
return c.ErrJSON(w, "遇到读取错误", err)
}
if c.Tostr(userrow["password"]) != c.MD5(oldpass+admin.Gtokensalt) {
if c.Tostr(userrow["password"]) != oldpass {
return c.ErrJSON(w, "原密码错误")
}
err = c.CiyDB.Tran(func() error {
updata := map[string]any{}
updata["password"] = c.MD5(newpass + admin.Gtokensalt)
updata["password"] = newpass
csql = c.NewCiySQL("zc_admin")
csql.Where("id", userid)
_, err = c.CiyDB.Update(csql, updata)
if err != nil {
return fmt.Errorf("更新失败:%v", err)
}
admin.SaveLog(c.CiyDB, "PASSWORD", "修改密码:"+c.Tostr(updata["password"]))
admin.SaveLog(c.CiyDB, "PASSWORD", "修改密码")
return nil
})
if err != nil {
return c.ErrJSON(w, "事务"+err.Error())
}
return c.SuccJSON(w)
return c.SuccJSON(w, r)
}

View File

@ -29,7 +29,7 @@ class chgpass {
$csql->where('id', $rsuser['id']);
if ($db->update($csql, $updata) === false)
throw new \Exception('更新失败:' . $db->error);
savelog($db, $rsuser['id'], 'PASSWORD', '修改密码');
savelog($db, $rsuser['id'], 'PASSWORD', '修改密码');
$db->commit();
} catch (\Exception $ex) {
$db->rollback();

View File

@ -21,7 +21,7 @@ func config_setwhere(post *c.CiyPost) (map[string]any, *c.CiySQL) {
}
func Config_init(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -72,11 +72,11 @@ func Config_init(w http.ResponseWriter, r *http.Request) bool {
once["input"] = input
ret["once"] = once
}
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}
func Config_update(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -130,11 +130,11 @@ func Config_update(w http.ResponseWriter, r *http.Request) bool {
}
ret := map[string]any{}
ret["data"] = updata
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}
func Config_del(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -166,5 +166,5 @@ func Config_del(w http.ResponseWriter, r *http.Request) bool {
}
ret := map[string]any{}
ret["ids"] = vids
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}

View File

@ -21,7 +21,7 @@ func debug_user_setwhere(post *c.CiyPost) (map[string]any, *c.CiySQL) {
}
func Debug_user_init(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -84,11 +84,11 @@ func Debug_user_init(w http.ResponseWriter, r *http.Request) bool {
once["input"] = input
ret["once"] = once
}
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}
func Debug_user_update(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -158,12 +158,12 @@ func Debug_user_update(w http.ResponseWriter, r *http.Request) bool {
}
ret := map[string]any{}
ret["data"] = updata
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}
func Debug_user_del(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -195,12 +195,12 @@ func Debug_user_del(w http.ResponseWriter, r *http.Request) bool {
}
ret := map[string]any{}
ret["ids"] = vids
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}
func Debug_user_getlocal(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -221,5 +221,5 @@ func Debug_user_getlocal(w http.ResponseWriter, r *http.Request) bool {
}
ret := map[string]any{}
ret["list"] = rows
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}

View File

@ -11,7 +11,7 @@ import (
func Depart_init(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -42,11 +42,11 @@ func Depart_init(w http.ResponseWriter, r *http.Request) bool {
once["input"] = input
ret["once"] = once
}
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}
func Depart_update(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -85,11 +85,11 @@ func Depart_update(w http.ResponseWriter, r *http.Request) bool {
if err != nil {
return c.ErrJSON(w, "事务"+err.Error())
}
return c.SuccJSON(w)
return c.SuccJSON(w, r)
}
func Depart_del(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -123,11 +123,11 @@ func Depart_del(w http.ResponseWriter, r *http.Request) bool {
}
ret := map[string]any{}
ret["ids"] = vids
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}
func Depart_modifyupid(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -158,11 +158,11 @@ func Depart_modifyupid(w http.ResponseWriter, r *http.Request) bool {
if err != nil {
return c.ErrJSON(w, "事务"+err.Error())
}
return c.SuccJSON(w)
return c.SuccJSON(w, r)
}
func Depart_multiadd(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -199,5 +199,5 @@ func Depart_multiadd(w http.ResponseWriter, r *http.Request) bool {
if cnt == 0 {
return c.ErrJSON(w, "没有任何新增")
}
return c.SuccJSON(w)
return c.SuccJSON(w, r)
}

View File

@ -22,7 +22,7 @@ func funcslow_setwhere(post *c.CiyPost) (map[string]any, *c.CiySQL) {
}
func Funcslow_init(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -77,11 +77,11 @@ func Funcslow_init(w http.ResponseWriter, r *http.Request) bool {
once["input"] = input
ret["once"] = once
}
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}
func Funcslow_del(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -113,12 +113,12 @@ func Funcslow_del(w http.ResponseWriter, r *http.Request) bool {
}
ret := map[string]any{}
ret["ids"] = vids
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}
func Funcslow_exportxls(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -186,5 +186,5 @@ func Funcslow_exportxls(w http.ResponseWriter, r *http.Request) bool {
}
ret := map[string]any{}
ret["url"] = filename
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}

View File

@ -30,7 +30,7 @@ func logdb_setwhere(post *c.CiyPost) (map[string]any, *c.CiySQL) {
}
func Logdb_init(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -92,11 +92,11 @@ func Logdb_init(w http.ResponseWriter, r *http.Request) bool {
once["input"] = input
ret["once"] = once
}
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}
func Logdb_del(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -127,12 +127,12 @@ func Logdb_del(w http.ResponseWriter, r *http.Request) bool {
}
ret := map[string]any{}
ret["ids"] = vids
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}
func Logdb_multiread(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -167,5 +167,5 @@ func Logdb_multiread(w http.ResponseWriter, r *http.Request) bool {
}
ret := map[string]any{}
ret["ids"] = vids
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}

View File

@ -13,7 +13,7 @@ import (
func Logfile_init(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -23,7 +23,7 @@ func Logfile_init(w http.ResponseWriter, r *http.Request) bool {
}
ret := map[string]any{}
ret["logfiles"] = logfiles
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}
func Logfile_viewlog(w http.ResponseWriter, r *http.Request) bool {
@ -32,7 +32,7 @@ func Logfile_viewlog(w http.ResponseWriter, r *http.Request) bool {
return false
}
post := c.NewCiyPost(w, r)
_, err := admin.Verifyuser(c.CiyDB, post)
_, err := admin.Verifyuser(r, c.CiyDB, post)
if err != nil {
c.SSESend_event(w, "请重新登录")
return false

View File

@ -11,7 +11,7 @@ import (
func Menu_init(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
rsuser, _ := admin.Verifyfast(c.CiyDB, post)
rsuser, _ := admin.Verifyfast(r, c.CiyDB, post)
if rsuser == nil {
return false
}
@ -64,11 +64,11 @@ func Menu_init(w http.ResponseWriter, r *http.Request) bool {
once["input"] = input
ret["once"] = once
}
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}
func Menu_update(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -132,11 +132,11 @@ func Menu_update(w http.ResponseWriter, r *http.Request) bool {
ret["url"] = url
ret["demo"] = demo
ret["pow"] = pow
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}
func Menu_del(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -171,11 +171,11 @@ func Menu_del(w http.ResponseWriter, r *http.Request) bool {
}
ret := map[string]any{}
ret["ids"] = vids
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}
func Menu_modifyupid(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -217,11 +217,11 @@ func Menu_modifyupid(w http.ResponseWriter, r *http.Request) bool {
if err != nil {
return c.ErrJSON(w, "事务"+err.Error())
}
return c.SuccJSON(w)
return c.SuccJSON(w, r)
}
func Menu_multiadd(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -279,12 +279,12 @@ func Menu_multiadd(w http.ResponseWriter, r *http.Request) bool {
if err != nil {
return c.ErrJSON(w, "更新upid失败:"+err.Error())
}
return c.SuccJSON(w)
return c.SuccJSON(w, r)
}
func Menu_seticon(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -304,7 +304,7 @@ func Menu_seticon(w http.ResponseWriter, r *http.Request) bool {
return c.ErrJSON(w, "数据不存在", err)
}
if datarow == nil && svg == "" {
return c.SuccJSON(w)
return c.SuccJSON(w, r)
}
err = c.CiyDB.Tran(func() error {
msg := ""
@ -337,5 +337,5 @@ func Menu_seticon(w http.ResponseWriter, r *http.Request) bool {
if err != nil {
return c.ErrJSON(w, "事务"+err.Error())
}
return c.SuccJSON(w)
return c.SuccJSON(w, r)
}

View File

@ -22,7 +22,7 @@ func mock_setwhere(post *c.CiyPost) (map[string]any, *c.CiySQL) {
}
func Mock_init(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -82,11 +82,11 @@ func Mock_init(w http.ResponseWriter, r *http.Request) bool {
once["input"] = input
ret["once"] = once
}
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}
func Mock_update(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -159,11 +159,11 @@ func Mock_update(w http.ResponseWriter, r *http.Request) bool {
}
ret := map[string]any{}
ret["data"] = updata
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}
func Mock_del(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -194,5 +194,5 @@ func Mock_del(w http.ResponseWriter, r *http.Request) bool {
}
ret := map[string]any{}
ret["ids"] = vids
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}

View File

@ -20,7 +20,7 @@ func online_setwhere(post *c.CiyPost) (map[string]any, *c.CiySQL) {
}
func Online_init(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -68,11 +68,11 @@ func Online_init(w http.ResponseWriter, r *http.Request) bool {
once["input"] = input
ret["once"] = once
}
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}
func Online_del(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -104,12 +104,12 @@ func Online_del(w http.ResponseWriter, r *http.Request) bool {
}
ret := map[string]any{}
ret["ids"] = vids
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}
func Online_logout(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -132,5 +132,5 @@ func Online_logout(w http.ResponseWriter, r *http.Request) bool {
updata["sid"] = ""
ret := map[string]any{}
ret["data"] = updata
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}

View File

@ -19,7 +19,7 @@ func power_setwhere(post *c.CiyPost) (map[string]any, *c.CiySQL) {
}
func Power_init(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -86,11 +86,11 @@ func Power_init(w http.ResponseWriter, r *http.Request) bool {
once["input"] = input
ret["once"] = once
}
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}
func Power_update(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -160,11 +160,11 @@ func Power_update(w http.ResponseWriter, r *http.Request) bool {
}
ret := map[string]any{}
ret["data"] = updata
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}
func Power_del(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -196,5 +196,5 @@ func Power_del(w http.ResponseWriter, r *http.Request) bool {
}
ret := map[string]any{}
ret["ids"] = vids
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}

View File

@ -19,7 +19,7 @@ func role_setwhere(post *c.CiyPost) (map[string]any, *c.CiySQL) {
}
func Role_init(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -62,11 +62,11 @@ func Role_init(w http.ResponseWriter, r *http.Request) bool {
once["input"] = input
ret["once"] = once
}
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}
func Role_del(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -99,5 +99,5 @@ func Role_del(w http.ResponseWriter, r *http.Request) bool {
}
ret := map[string]any{}
ret["ids"] = vids
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}

View File

@ -11,7 +11,7 @@ import (
func Role_u_init(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -36,11 +36,11 @@ func Role_u_init(w http.ResponseWriter, r *http.Request) bool {
if err != nil {
return c.ErrJSON(w, "读取power失败:"+err.Error())
}
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}
func Role_u_update(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -116,5 +116,5 @@ func Role_u_update(w http.ResponseWriter, r *http.Request) bool {
if err != nil {
return c.ErrJSON(w, "事务"+err.Error())
}
return c.SuccJSON(w)
return c.SuccJSON(w, r)
}

View File

@ -10,7 +10,7 @@ import (
func Statsdb_init(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -293,5 +293,5 @@ func Statsdb_init(w http.ResponseWriter, r *http.Request) bool {
ret["tps"] = tps
}
ret["stats"] = stats
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}

View File

@ -23,7 +23,7 @@ func statsfunc_setwhere(post *c.CiyPost) (map[string]any, *c.CiySQL) {
}
func Statsfunc_init(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -81,11 +81,11 @@ func Statsfunc_init(w http.ResponseWriter, r *http.Request) bool {
once["input"] = input
ret["once"] = once
}
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}
func Statsfunc_del(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -117,12 +117,12 @@ func Statsfunc_del(w http.ResponseWriter, r *http.Request) bool {
}
ret := map[string]any{}
ret["ids"] = vids
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}
func Statsfunc_exportxls(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -211,5 +211,5 @@ func Statsfunc_exportxls(w http.ResponseWriter, r *http.Request) bool {
}
ret := map[string]any{}
ret["url"] = filename
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}

View File

@ -10,7 +10,7 @@ import (
func Statssrv_init(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -34,5 +34,5 @@ func Statssrv_init(w http.ResponseWriter, r *http.Request) bool {
ret := map[string]any{}
ret["stats"] = stats
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}

View File

@ -17,7 +17,7 @@ func Upload_upload(w http.ResponseWriter, r *http.Request) bool {
extselect := "exts"
post := c.NewCiyPost(w, r)
_, userid := Verifyfast(c.CiyDB, post)
_, userid := Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -43,12 +43,12 @@ func Upload_upload(w http.ResponseWriter, r *http.Request) bool {
if err != nil {
return c.ErrJSON(w, err.Error())
}
return c.SuccJSON(w, json)
return c.SuccJSON(w, r, json)
}
func Upload_s3(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := Verifyfast(c.CiyDB, post)
_, userid := Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -96,7 +96,7 @@ func Upload_s3(w http.ResponseWriter, r *http.Request) bool {
headers["x-amz-content-sha256"] = vsha256
headers["x-amz-date"] = zdate
ret["headers"] = headers
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}
func sign(key []byte, msg string) []byte {

View File

@ -7,7 +7,7 @@ import (
func Welcome_init(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
_, userid := Verifyfast(c.CiyDB, post)
_, userid := Verifyfast(r, c.CiyDB, post)
if userid == 0 {
return false
}
@ -24,5 +24,5 @@ func Welcome_init(w http.ResponseWriter, r *http.Request) bool {
// })
// }
ret["works"] = works
return c.SuccJSON(w, ret)
return c.SuccJSON(w, r, ret)
}

View File

@ -14,7 +14,7 @@ func Wsdemo(w http.ResponseWriter, r *http.Request) bool {
return false
}
post := c.NewCiyPost(w, r)
_, userid := admin.Verifyfast(c.CiyDB, post)
_, userid := admin.Verifyfast(r, c.CiyDB, post)
if userid == 0 {
ws.SendFail(0, "请重新登录")
ws.Close()

View File

@ -58,10 +58,10 @@
var wsurl = $5('[name=ws]').val();
if(wsurl.indexOf("ws") !== 0){
console.log(location);
wsurl = "ws://" + location.host + wsurl;
wsurl = "wss://" + location.host + wsurl;
}
var url = wsurl;
url += '&_' + ciy_vars.tokenfield + '=' + ciyfn.getstorage('_' + ciy_vars.tokenfield);
url += '&_ciyauth=' + ciyfn.getstorage('_' + ciy_vars.tokenfield);
ws = new ciyclass.websocket(url);
ws.onopen = function (event) {
$5('#id_log').append('<div>connected:'+wsurl+'</div>');

View File

@ -1042,7 +1042,7 @@ ciyfn.callfunc = function (funcname, post, successfunc, opn) { //opn showload,m
if (typeof (window['ciy_vars']) === 'undefined')
window.ciy_vars = {};
if (ciy_vars.tokenfield)
opn.header[ciy_vars.tokenfield] = ciyfn.getstorage('_' + ciy_vars.tokenfield);
opn.header['ciyauth'] = ciyfn.getstorage('_' + ciy_vars.tokenfield);
if (document.location.search)
funcname += '&' + document.location.search.substring(1);
if (opn.showload === undefined)
@ -1086,16 +1086,15 @@ ciyfn.callfunc = function (funcname, post, successfunc, opn) { //opn showload,m
if (opn._load)
opn._load.close('succ');
if (ciy_vars.tokenfield) {
var re = xhr.getResponseHeader(ciy_vars.tokenfield + 're');
var re = xhr.getResponseHeader('_re');
if (re && funcname.indexOf('restorage') == -1
&& document.location.pathname.indexOf('/rigger/cata.html') == -1
&& document.location.pathname.indexOf('/rigger/admin.html') == -1
) {
ciyfn.sendsignal(window.top, 'restorage', { show: false });
}
var newauth = xhr.getResponseHeader(ciy_vars.tokenfield);
if (newauth)
ciyfn.setstorage('_' + ciy_vars.tokenfield, newauth);
if (json['_ciyauth'])
ciyfn.setstorage('_' + ciy_vars.tokenfield, json['_ciyauth']);
}
if (typeof (successfunc) == 'function')
successfunc(json, xhr);

152
web/jscss/ciy_websocket.js Normal file
View File

@ -0,0 +1,152 @@
/*
* Author: 众产® https://ciy.cn/code
* Version: 0.1.1
*/
'use strict';
ciyclass.websocket = function (addr, header) {
var thos = this;
this.buffer = new Array(); //发送数据缓冲区
this.reOpenData = [2, 5, 3, 5, 5, 3, 5, 8, 10, 20, 30, 30]; //断线重连,每次间隔时间/秒
this.reOpen = 0; //断线重连次数
this.wsidx = 0;
this.keepAliveTimer = setInterval(function () {
try {
if (thos.wsock && thos.wsock.readyState !== 1) {
thos.reOpenSec--;
if (thos.reOpenSec <= 0) {
thos.reOpen++;
thos.reOpenSec = 10;
thos.open();
}
return;
}
if (thos.buffer.length > 0) {
var data = thos.buffer.pop();
thos.send(data);
} else {
if (new Date().getTime() - thos.last_health_time >= 15000 && thos.wsock.readyState === 1) {
console.log('ping');
thos.wsock.send('h');//.ping();
thos.last_health_time = new Date().getTime();
}
}
} catch (err) {
console.log(err);
}
}, 1000);
this.setOpenSec = function () {
(thos.reOpen < thos.reOpenData.length) ? thos.reOpenSec = thos.reOpenData[thos.reOpen] : thos.reOpenSec = 90; //断线重试太多后的间隔时间
}
this.open = function () {
try {
if (thos.wsock && thos.wsock.trueClose)
return;
thos.setOpenSec();
if (thos.wsock) {
if (thos.wsock.readyState == 1)
return;
thos.wsock.close();
}
thos.wsock = new WebSocket(addr);
thos.wsock.onopen = function (event) {
try {
//获取header刷新reauth
thos.reOpen = 0;
thos.last_health_time = new Date().getTime();
if (typeof (thos.onopen) == "function")
thos.onopen(event);
} catch (err) {
console.log('ws.onopen', err);
}
};
thos.wsock.onmessage = function (e) {
try {
thos.last_health_time = new Date().getTime();
if (typeof (thos.onmessage) == "function")
thos.onmessage(e);
} catch (err) {
console.log('ws.onmessage', err);
}
};
thos.wsock.onclose = function (e) {
try {
if (this.trueClose) {
clearInterval(thos.keepAliveTimer);
return;
}
thos.setOpenSec();
if (typeof (thos.onclose) == "function")
thos.onclose(e);
} catch (err) {
console.log('ws.onclose', err);
}
};
thos.wsock.onerror = function (e) {
try {
thos.setOpenSec();
if (typeof (thos.onerror) == "function")
thos.onerror(e);
} catch (err) {
console.log('ws.onerror', err);
}
};
} catch (err) {
console.log('ws.open', err);
}
}
this.send = function (msg) {
console.log('op send', msg);
try {
if (this.wsock === undefined || this.wsock.trueClose)
return false;
if (this.wsock.readyState !== 1 || this.wsock.bufferedAmount > 0)
this.buffer.push(msg);
else {
this.wsock.send(msg);
this.last_health_time = new Date().getTime();
}
return true;
} catch (err) {
console.log('ws.send', err);
}
}
this.sendjson = function (json) {
console.log('op sendjson', json);
json._wsidx = this.wsidx++;
try {
if (this.wsock === undefined || this.wsock.trueClose)
return false;
if (this.wsock.readyState !== 1 || this.wsock.bufferedAmount > 0)
this.buffer.push(JSON.stringify(json));
else {
this.wsock.send(JSON.stringify(json));
this.last_health_time = new Date().getTime();
}
return true;
} catch (err) {
console.log('ws.sendjson', err);
}
}
this.close = function (send) {
this.wsock.trueClose = true;
this.wsock.close();
}
this.open();
}
ciyfn.bin2hex = function (str) {
var ret = '';
for (var i = 0, l = str.length; i < l; i++) {
var c = str.charCodeAt(i).toString(16);
if (c.length == 1)
c = '0' + c;
ret += c;
}
return ret;
}
ciyfn.hex2bin = function (str) {
var ret = '';
for (var i = 0; i < str.length - 1; i += 2) {
ret += String.fromCharCode(parseInt(str.substr(i, 2), 16));
}
return ret;
}

View File

@ -113,7 +113,7 @@ ciyfn.file_uploads = function (maxcount, files, opn, fn) {
postdata.append('file', gfile, gfile.name);
var xhr = new XMLHttpRequest();
xhr.open("POST", opn.action + ".upload&pathfile=" + pathfile, true);
xhr.setRequestHeader(ciy_vars.tokenfield, ciyfn.getstorage('_' + ciy_vars.tokenfield));
xhr.setRequestHeader('ciyauth', ciyfn.getstorage('_' + ciy_vars.tokenfield));
xhr.setRequestHeader("X-Custom-Header", "CustomValue");
xhr.onload = function () {
var data = xhr.responseText;

BIN
web/ud/demo/211215_6165.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View File

@ -87,6 +87,7 @@ import (
"crypto/hmac"
"crypto/md5"
"crypto/sha256"
"crypto/sha512"
"encoding/base64"
"encoding/hex"
"fmt"
@ -879,7 +880,14 @@ func MD5Byte(src ...[]byte) []byte {
}
return h.Sum(nil)
}
func Sha256(src string) string {
hash := sha256.Sum256([]byte(src))
return hex.EncodeToString(hash[:])
}
func Sha512(src string) string {
hash := sha512.Sum512([]byte(src))
return hex.EncodeToString(hash[:])
}
func Uniqid(length int) string {
numbers := make([]byte, length)
for i := range numbers {

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