diff --git a/c5_ciyon.sql b/c5_ciyon.sql index 0fa4a76..2fc75e7 100644 --- a/c5_ciyon.sql +++ b/c5_ciyon.sql @@ -282,7 +282,7 @@ CREATE TABLE `ap_log` ( `ip` varchar(40) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'IP,IP', `logs` text CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '详情', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 3449 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '日志表' ROW_FORMAT = Dynamic; +) ENGINE = InnoDB AUTO_INCREMENT = 3449 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '应用日志表' ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of ap_log @@ -290,7 +290,7 @@ CREATE TABLE `ap_log` ( -- ---------------------------- -- Table structure for ap_luser -- ---------------------------- -DROP TABLE IF EXISTS `ap_luser`; +DROP TABLE IF EXISTS `ap_lug`; CREATE TABLE `ap_luser` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `isinout` int(11) NOT NULL COMMENT '|登录|,BOOL,登入.登出', @@ -299,10 +299,10 @@ CREATE TABLE `ap_luser` ( `ip` varchar(40) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'IP,IP', `model` varchar(250) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '设备指纹', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 3437 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '日志表' ROW_FORMAT = Dynamic; +) ENGINE = InnoDB AUTO_INCREMENT = 3437 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '登录日志表' ROW_FORMAT = Dynamic; -- ---------------------------- --- Records of ap_luser +-- Records of ap_lug -- ---------------------------- -- ---------------------------- @@ -1628,7 +1628,7 @@ CREATE TABLE `zc_log` ( `ip` varchar(40) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'IP,IP', `logs` text CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '详情', PRIMARY KEY (`id`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 147 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '日志表' ROW_FORMAT = Dynamic; +) ENGINE = InnoDB AUTO_INCREMENT = 147 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '总控日志表' ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of zc_log @@ -1703,17 +1703,20 @@ INSERT INTO `zc_menu` VALUES (231, 61, '待审批事项', '!MSGmatternotice 需 INSERT INTO `zc_menu` VALUES (232, 61, '知会事项', '!MSGmattertell 待处理、处理中、已处理', '', 10, 1); INSERT INTO `zc_menu` VALUES (233, 61, '我已批事项', '!MSGmatterapproval 非我审批[有代理人]', '', 10, 1); INSERT INTO `zc_menu` VALUES (234, 61, '指派代理人', '!MSGmatteragent 指派中,已指派历史', '', 10, 1); -INSERT INTO `zc_menu` VALUES (250, 62, '模版维护', '!MSG在线编辑源码', '', 10, 1); -INSERT INTO `zc_menu` VALUES (251, 62, '栏目管理', '!MSG发布计划。关键词管理,ABCDE,按组合方式生成关键词。|主题管理[内容方向提示词]。|AI规则管理[绑定知识组]', '', 10, 1); -INSERT INTO `zc_menu` VALUES (252, 62, '文章管理', '', '', 10, 1); -INSERT INTO `zc_menu` VALUES (253, 62, '落地页管理', '!MSG单页面图文内容', '', 10, 1); -INSERT INTO `zc_menu` VALUES (254, 62, '锚内关键词', '!MSGSEO用', '', 10, 1); -INSERT INTO `zc_menu` VALUES (255, 62, '用户管理', '!MSG用户注册的资源', '', 10, 1); -INSERT INTO `zc_menu` VALUES (256, 62, '咨询线索管理', '!MSG网站表单留下的联系方式', '', 10, 1); -INSERT INTO `zc_menu` VALUES (257, 62, '远程监管设置', '!MSG新用户、新线索、待发库存预警等数据上报中心', '', 10, 1); -INSERT INTO `zc_menu` VALUES (270, 252, '已发文章', '!MSG网站上显示的文章管理', '', 10, 1); -INSERT INTO `zc_menu` VALUES (271, 252, '待发文章', '!MSG按计划准备自动发的文章,库存重要', '', 10, 1); -INSERT INTO `zc_menu` VALUES (272, 252, 'AI生成文章', '!MSG生成的文章,需要人工过一遍,再到待发', '', 10, 1); +INSERT INTO `zc_menu` VALUES (250, 62, '用户线索', '', '', 10, 1); +INSERT INTO `zc_menu` VALUES (251, 62, '文章管理', '', '', 10, 1); +INSERT INTO `zc_menu` VALUES (252, 62, '文章生成', '', '', 10, 1); +INSERT INTO `zc_menu` VALUES (253, 62, '栏目管理', '', '', 10, 1); +INSERT INTO `zc_menu` VALUES (254, 62, '锚内关键词', '', '', 10, 1); +INSERT INTO `zc_menu` VALUES (255, 62, '单页管理', '', '', 10, 1); +INSERT INTO `zc_menu` VALUES (260, 251, '文章草稿', '', '', 10, 1); +INSERT INTO `zc_menu` VALUES (261, 251, '文章待发', '', '', 10, 1); +INSERT INTO `zc_menu` VALUES (262, 251, '已发文章', '', '', 10, 1); +INSERT INTO `zc_menu` VALUES (263, 251, '热门调优', '', '', 10, 1); +INSERT INTO `zc_menu` VALUES (270, 252, '关键词库', '', '', 10, 1); +INSERT INTO `zc_menu` VALUES (271, 252, '浓缩知识', '', '', 10, 1); +INSERT INTO `zc_menu` VALUES (272, 252, '文章模版', '', '', 10, 1); +INSERT INTO `zc_menu` VALUES (273, 252, 'SEO规划', '', '', 10, 1); INSERT INTO `zc_menu` VALUES (300, 63, '私域平台账号', '!MSG添加企业微信、个人微信、QQ号等', '', 10, 1); INSERT INTO `zc_menu` VALUES (301, 63, '线索客户', '!MSG导入手机号,自动分配平台账号,加人。加好后按标签策略,主动跟客户聊天。', '', 10, 1); INSERT INTO `zc_menu` VALUES (302, 63, '线索待聊', '!MSG每次回复生成后,根据数字量,延迟1-几分钟。这期间可以人工介入。', '', 10, 1); @@ -1769,7 +1772,8 @@ INSERT INTO `zc_menu` VALUES (602, 82, '自动化任务', 'rigger/autotask.html' INSERT INTO `zc_menu` VALUES (603, 82, '表单设计器', '!MSGtabbase 字段设计tabfield', '', 10, 1); INSERT INTO `zc_menu` VALUES (604, 82, '流程设计器', '!MSGmattertemplate 流程设置matterflow', '', 10, 1); INSERT INTO `zc_menu` VALUES (610, 82, '数据计算', 'datasse/index.html', 'r=执行', 10, 1); -INSERT INTO `zc_menu` VALUES (621, 82, '文档短链', '', '', 10, 1); +INSERT INTO `zc_menu` VALUES (611, 82, '总控API', 'rigger/tokapi.html', '', 10, 1); +INSERT INTO `zc_menu` VALUES (612, 82, '三方接入', 'rigger/tokthd.html', '', 10, 1); INSERT INTO `zc_menu` VALUES (900, 99, '软件设置', '', '', 10, 1); INSERT INTO `zc_menu` VALUES (901, 99, '示例代码', '', 'u=管理|n=使用', 10, 1); INSERT INTO `zc_menu` VALUES (902, 99, '开发工具', '', '', 10, 1); @@ -1982,10 +1986,10 @@ CREATE TABLE `zc_stats` ( -- ---------------------------- -- ---------------------------- --- Table structure for zc_token +-- Table structure for zc_tokthd -- ---------------------------- -DROP TABLE IF EXISTS `zc_token`; -CREATE TABLE `zc_token` ( +DROP TABLE IF EXISTS `zc_tokthd`; +CREATE TABLE `zc_tokthd` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '三方平台名称', `cfgtoken` varchar(180) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'ConfigData', @@ -1996,7 +2000,26 @@ CREATE TABLE `zc_token` ( ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = 'API配置表' ROW_FORMAT = Dynamic; -- ---------------------------- --- Records of zc_token +-- Records of zc_tokthd +-- ---------------------------- + +-- ---------------------------- +-- Table structure for zc_tokapi +-- ---------------------------- +DROP TABLE IF EXISTS `zc_tokapi`; +CREATE TABLE `zc_tokapi` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '|appid|', + `vuser` int(11) NOT NULL COMMENT '用户,CATA,adminuser', + `apisecret` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT ',appkey', + `ips` varchar(180) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '白名单IP,BR', + `addtimes` bigint(20) NOT NULL COMMENT '创建时间,DATE', + `uptimes` bigint(20) NOT NULL COMMENT '活跃时间,DATE', + `pubkey` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '|证书|', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 215699 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'API接口授权' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of zc_tokapi -- ---------------------------- -- ---------------------------- @@ -2018,7 +2041,7 @@ CREATE TABLE `zc_ymock` ( -- ---------------------------- -- Records of zc_ymock -- ---------------------------- -INSERT INTO `zc_ymock` VALUES (6, '', '', 'admin/rigger/mock.testmock', '{\"code\":1,\"data\":12344321}', '/z/?func=admin/rigger/mock.testmock
{\"abc\":\"def\",\"_pf\":\"PC\"}', 1754001371, 1722713211); +INSERT INTO `zc_ymock` VALUES (6, '', '', '/admin/rigger/mock.testmock', '{\"code\":1,\"data\":12344321}', '/z/?func=admin/rigger/mock.testmock
{\"abc\":\"def\",\"_pf\":\"PC\"}', 1754001371, 1722713211); -- ---------------------------- -- Table structure for zc_zmem_var diff --git a/fapp/ciyon_ap/App.vue b/fapp/ciyon_ap/App.vue index 09979f2..575a15d 100644 --- a/fapp/ciyon_ap/App.vue +++ b/fapp/ciyon_ap/App.vue @@ -55,7 +55,7 @@ app.globalData.mqfunc = []; app.globalData.srv = 't'; - app.globalData.jsnajax = 'z/?func=ambap/'; + app.globalData.jsnajax = 'ambap/'; app.globalData.jsnurl = {}; app.globalData.jsnurl.t = 'https://ciyon.ciy.cn/'; app.globalData.demourl = 'https://i.qiboc.cn/app.goc'; //原型图地址 diff --git a/main.go b/main.go index b539303..69c1863 100644 --- a/main.go +++ b/main.go @@ -20,7 +20,7 @@ import ( func main() { //nohup ./zgo & //nohup /data/go/ciyon/zgo > /dev/null 2>&1 & - c.CiyVars.Version = "1.0.1" + c.CiyVars.Version = "1.0.2" c.Clog("---=========================Ciyon=========================---") c.Clog("Version:", c.CiyVars.Version, " WorkDir:", c.CiyWebDir) //读取配置文件ini @@ -131,7 +131,7 @@ func main() { web.SetMockFile() //在web/ud/mock目录下建立对应的json文件。 } else if mock != "" { web.SetMockFn(func(w http.ResponseWriter, r *http.Request) error { - funname := c.GetQuery("func", r) + funname := r.URL.Path funs := strings.Split(funname, ".") if len(funs) < 2 { return fmt.Errorf("func fmterr func=%v", funname) diff --git a/route_adm.go b/route_adm.go index 80e6fcd..2b9c171 100644 --- a/route_adm.go +++ b/route_adm.go @@ -8,6 +8,7 @@ import ( "ciyon/web/admin/autotask" "ciyon/web/admin/datasse" "ciyon/web/admin/demo" + "ciyon/web/admin/demo/dyn" "ciyon/web/admin/rigger" "ciyon/web/admin/wsdemo" c "ciyon/zciyon" @@ -17,14 +18,11 @@ import ( 本文件由node生成 */ func setWebRoute_adm(web *c.CiyWebServer) { - web.RouterFunc("admin/rigger", map[string]map[string]func(http.ResponseWriter, *http.Request) bool{ + web.RouterFunc("/admin/rigger", map[string]map[string]func(http.ResponseWriter, *http.Request) bool{ "logfile": { "init": rigger.Logfile_init, "viewlog": rigger.Logfile_viewlog, }, - "datasse": { - "demo": datasse.DataSSE_demo, - }, "statsfunc": { "init": rigger.Statsfunc_init, "del": rigger.Statsfunc_del, @@ -134,7 +132,7 @@ func setWebRoute_adm(web *c.CiyWebServer) { "update": rigger.Role_u_update, }, }) - web.RouterFunc("admin/ap", map[string]map[string]func(http.ResponseWriter, *http.Request) bool{ + web.RouterFunc("/admin/ap", map[string]map[string]func(http.ResponseWriter, *http.Request) bool{ "paper": { "init": ap.Paper_init, "update": ap.Paper_update, @@ -142,7 +140,7 @@ func setWebRoute_adm(web *c.CiyWebServer) { "del": ap.Paper_del, }, }) - web.RouterFunc("admin/demo", map[string]map[string]func(http.ResponseWriter, *http.Request) bool{ + web.RouterFunc("/admin/demo", map[string]map[string]func(http.ResponseWriter, *http.Request) bool{ "normal": { "list": demo.Normal_list, "del": demo.Normal_del, @@ -154,17 +152,28 @@ func setWebRoute_adm(web *c.CiyWebServer) { "importxls_data": demo.Normal_importxls_data, }, }) - web.RouterFunc("admin/autotask", map[string]map[string]func(http.ResponseWriter, *http.Request) bool{ + web.RouterFunc("/admin/demo/dyn", map[string]map[string]func(http.ResponseWriter, *http.Request) bool{ + "sse": { + "get": dyn.SSE_get, + "post": dyn.SSE_get, + }, + }) + web.RouterFunc("/admin/autotask", map[string]map[string]func(http.ResponseWriter, *http.Request) bool{ "task": { "main": autotask.Task_main, }, }) - web.RouterFunc("admin/wsdemo", map[string]map[string]func(http.ResponseWriter, *http.Request) bool{ + web.RouterFunc("/admin/datasse", map[string]map[string]func(http.ResponseWriter, *http.Request) bool{ + "index": { + "demo": datasse.Index_demo, + }, + }) + web.RouterFunc("/admin/wsdemo", map[string]map[string]func(http.ResponseWriter, *http.Request) bool{ "go": { "demo": wsdemo.Wsdemo, //需nginx转发upgrade为websocket协议 }, }) - web.RouterFunc("admin", map[string]map[string]func(http.ResponseWriter, *http.Request) bool{ + web.RouterFunc("/admin", map[string]map[string]func(http.ResponseWriter, *http.Request) bool{ "welcome": { "init": admin.Welcome_init, }, diff --git a/web/admin/ap/cash_out_apply.php b/web/admin/ap/cash_out_apply.php index 0cb1c87..6869b58 100644 --- a/web/admin/ap/cash_out_apply.php +++ b/web/admin/ap/cash_out_apply.php @@ -95,7 +95,7 @@ class cash_out_apply { if ($row['cashstatus'] != 10) continue; if ($act == 2) { //退余额 - \web\cweb_ap::usercashoe($db, 11, $row['vuser'], $row['cashmoney'], '提现审核拒绝'); + \web\cwebcomon::usercashoe($db, 11, $row['vuser'], $row['cashmoney'], '提现审核拒绝'); } $id = $row['id']; $updata = array(); diff --git a/web/admin/ap/cash_out_inv.php b/web/admin/ap/cash_out_inv.php index 39dbca6..b104c3f 100644 --- a/web/admin/ap/cash_out_inv.php +++ b/web/admin/ap/cash_out_inv.php @@ -100,7 +100,7 @@ class cash_out_inv { if ($row['cashstatus'] != 30) continue; if ($act == 2) { //退余额 - \web\cweb_ap::usercashoe($db, 11, $row['vuser'], $row['cashmoney'], '提现发票拒绝'); + \web\cwebcomon::usercashoe($db, 11, $row['vuser'], $row['cashmoney'], '提现发票拒绝'); } $id = $row['id']; $updata = array(); diff --git a/web/admin/ap/cash_out_transfer.php b/web/admin/ap/cash_out_transfer.php index 6ced100..2a8c14e 100644 --- a/web/admin/ap/cash_out_transfer.php +++ b/web/admin/ap/cash_out_transfer.php @@ -103,7 +103,7 @@ class cash_out_transfer { $db->begin(); if ($auditstatus == 90) { //退余额 $updata = array(); - \web\cweb_ap::usercashoe($db, 11, $row['vuser'], $row['cashmoney'], '提现支付拒绝'); + \web\cwebcomon::usercashoe($db, 11, $row['vuser'], $row['cashmoney'], '提现支付拒绝'); } $id = $row['id']; $updata = array(); diff --git a/web/admin/common.php b/web/admin/common.php index 1b71991..c03ea3e 100644 --- a/web/admin/common.php +++ b/web/admin/common.php @@ -33,9 +33,10 @@ function verifyfast() { function verifyuser() { global $db; global $_token; + $ciyauth = ''; if ($_token['type'] == 'cookie') - $ciyauth = $_COOKIE[$_token['field']]; - else + $ciyauth = @$_COOKIE[$_token['field']]; + if (!$ciyauth) $ciyauth = @$_SERVER['HTTP_CIYAUTH']; if (!$ciyauth) $ciyauth = get('_ciyauth'); @@ -84,6 +85,20 @@ function verifyuser() { } return $auth; } +function verifysign($pubkey, $data, $pairsign) { + $signbin = hex2bin($pairsign); + if ($signbin === false) + return '签名格式错误'; + $hashbin = hex2bin(hash('sha256', $data)); + if (strpos($pubkey, '-----BEGIN RSA PUBLIC KEY-----') === false && strpos($pubkey, '-----BEGIN PUBLIC KEY-----') === false) + $pubkey = "-----BEGIN PUBLIC KEY-----\n" . wordwrap($pubkey, 64, "\n") . "\n-----END PUBLIC KEY-----"; + $result = openssl_verify($hashbin, $signbin, $pubkey, OPENSSL_ALGO_SHA256); + if ($result === 0) + return '数字证书验签失败'; + if ($result !== 1) + return '数字证书验签错误:' . openssl_error_string(); + return true; +} //true无权限,false有权限 function nopower($db, $userid, $chkpower) { $csql = new \ciy\sql('zc_admin'); diff --git a/web/admin/datasse/index.go b/web/admin/datasse/index.go index 719d57e..8bc3827 100644 --- a/web/admin/datasse/index.go +++ b/web/admin/datasse/index.go @@ -7,7 +7,7 @@ import ( "time" ) -func DataSSE_demo(w http.ResponseWriter, r *http.Request) bool { +func Index_demo(w http.ResponseWriter, r *http.Request) bool { if !c.SSEInit(w) { w.Write([]byte("不支持SSE Flush")) return false @@ -22,11 +22,11 @@ func DataSSE_demo(w http.ResponseWriter, r *http.Request) bool { c.SSESend_event(w, "您未被授权操作") return false } - param := post.Get("param") + param := post.Get("bb") c.SSESend_data(w, param) for i := 0; i < 100; i++ { if i%10 == 1 { - c.SSESend_data(w, "ssr: "+c.Tostr(i), i) + c.SSESend_data(w, "sse: "+c.Tostr(i), i) } if !c.SSESend_event(w, c.Tostr(i)) { return true diff --git a/web/admin/datasse/index.php b/web/admin/datasse/index.php index 027a15c..18b7662 100644 --- a/web/admin/datasse/index.php +++ b/web/admin/datasse/index.php @@ -14,7 +14,7 @@ class index { $senddata('param: ' . $param); for ($i = 0; $i < 100; $i++) { if ($i % 10 == 1) - $senddata('ssr: ' . $i . "\n\n" . 'ddd', $i); + $senddata('ssr: ' . $i . "\n\n", $i); $sendevent($i); usleep(50000); } diff --git a/web/admin/demo/dyn/callapi.html b/web/admin/demo/dyn/callapi.html new file mode 100644 index 0000000..e56f2b8 --- /dev/null +++ b/web/admin/demo/dyn/callapi.html @@ -0,0 +1,61 @@ + + + + + + + + + + + + + +
+ +
获取token
+
+ APIID: + + APIKey: + + + +
+ +
业务调用
+
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/web/admin/demo/dyn/callapi.php b/web/admin/demo/dyn/callapi.php new file mode 100644 index 0000000..385d255 --- /dev/null +++ b/web/admin/demo/dyn/callapi.php @@ -0,0 +1,42 @@ +getint('apiid'); + if (empty($apiid)) + return errjson('请输入apiid'); + $apikey = $post->get('apikey'); + if (empty($apikey)) + return errjson('请输入apikey'); + $param = array(); + $param['apiid'] = $apiid; + $param['apitime'] = time(); + $param['sign'] = hash('sha256', $apiid . '&' . $param['apitime'] . '&' . $apikey); + $http = new \ciy\http(); + $http->request('https://ciyon.local.ciy.cn/admin/login.gettoken', json_encode($param)); + $datastr = $http->get_data(); + $data = json_decode($datastr, true); + if ($data === null) + return errjson('API返回错误:' . $datastr); + return succjson($data); + } + public static function json_call1() { + $post = new \ciy\post(); + $token = $post->get('token'); + if (empty($token)) + return errjson('请输入token'); + $param = array(); + $param['query'] = array('liid' => 10); + $http = new \ciy\http(); + $http->set_header('CIYAUTH', $token); + $http->request('https://ciyon.local.ciy.cn/admin/rigger/admin.init', json_encode($param)); + $datastr = $http->get_data(); + $data = json_decode($datastr, true); + if ($data === null) + return errjson('API返回错误:' . $datastr); + return succjson($data); + } +} diff --git a/web/admin/demo/dyn/index.html b/web/admin/demo/dyn/index.html index b80a2c3..8e30f7f 100644 --- a/web/admin/demo/dyn/index.html +++ b/web/admin/demo/dyn/index.html @@ -41,6 +41,10 @@ web3 web3登录、签名、验签 +
+ callapi + api接口调用示例。 +
mail Mail收发邮件。 diff --git a/web/admin/demo/dyn/openai.php b/web/admin/demo/dyn/openai.php index a34f26c..81c35ff 100644 --- a/web/admin/demo/dyn/openai.php +++ b/web/admin/demo/dyn/openai.php @@ -11,6 +11,8 @@ class openai { $csql = new \ciy\sql('zc_ai_key'); $csql->where('id', 1); $aikeyrow = $db->getone($csql); + if(!is_array($aikeyrow)) + return $senddata('AI密钥不存在'); $openai = new \ciy\openai($aikeyrow); $openai->debug(); $retai = $openai->chat($messages, function($data) { diff --git a/web/admin/demo/dyn/sse.go b/web/admin/demo/dyn/sse.go new file mode 100644 index 0000000..5d7e656 --- /dev/null +++ b/web/admin/demo/dyn/sse.go @@ -0,0 +1,72 @@ +package dyn + +import ( + "ciyon/web/admin" + c "ciyon/zciyon" + "net/http" + "time" +) + +func SSE_get(w http.ResponseWriter, r *http.Request) bool { + if !c.SSEInit(w) { + w.Write([]byte("不支持SSE Flush")) + return false + } + post := c.NewCiyPost(w, r) + rsuser, err := admin.Verifyuser(r, c.CiyDB, post) + if err != nil { + c.SSESend_event(w, "请重新登录") + return false + } + if admin.Nopower(c.CiyDB, c.Toint(rsuser["id"]), "p610r") { + c.SSESend_event(w, "您未被授权操作") + return false + } + param := post.Get("bb") + c.SSESend_data(w, param) + for i := 0; i < 100; i++ { + if i%10 == 1 { + c.SSESend_data(w, "sse: "+c.Tostr(i), i) + } + if !c.SSESend_event(w, c.Tostr(i)) { + return true + } + c.Sleep(0.05) + } + c.SSESend_event(w, "ok") + return true +} + +func SSE_get_ch(w http.ResponseWriter, r *http.Request) bool { + if !c.SSEInit(w) { + w.Write([]byte("不支持SSE Flush")) + return false + } + post := c.NewCiyPost(w, r) + rsuser, err := admin.Verifyuser(r, c.CiyDB, post) + if err != nil { + c.SSESend_event(w, "请重新登录") + return false + } + if admin.Nopower(c.CiyDB, c.Toint(rsuser["id"]), "p610r") { + c.SSESend_event(w, "您未被授权操作") + return false + } + param := post.Get("param") + c.SSESend_data(w, param) + + done := r.Context().Done() + ticker := time.NewTicker(time.Second) + defer ticker.Stop() + + for { + select { + case <-done: + return false + case <-ticker.C: + if !c.SSESend_data(w, time.Now().Format(time.RFC3339)) { + return true + } + } + } +} diff --git a/web/admin/index.html b/web/admin/index.html index 0eefd26..8fb8467 100644 --- a/web/admin/index.html +++ b/web/admin/index.html @@ -9,6 +9,15 @@ +