This commit is contained in:
众产-王坤 2025-08-04 02:21:00 +08:00
parent da592b5c8d
commit 00790ad84e
33 changed files with 1251 additions and 173 deletions

View File

@ -1,6 +1,19 @@
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for ap_api
-- ----------------------------
DROP TABLE IF EXISTS `ap_api`;
CREATE TABLE `ap_api` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '|appid|',
`apisecret` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT ',appkey',
`ips` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '白名单IP,BR',
`addtimes` 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 = 215696 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'API授权管理' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for ap_art_post
-- ----------------------------
@ -302,6 +315,26 @@ CREATE TABLE `ap_pnt_track` (
-- ----------------------------
INSERT INTO `ap_pnt_track` VALUES (1, '登录签到', 2, 2, 10, 1738132278);
-- ----------------------------
-- Table structure for ap_transfer
-- ----------------------------
DROP TABLE IF EXISTS `ap_transfer`;
CREATE TABLE `ap_transfer` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '|流水号|',
`orderstatus` int(11) NOT NULL COMMENT '|交易状态|,CATA,orderstatus',
`amount` bigint(20) NOT NULL COMMENT '金额|,CNY',
`addtimes` bigint(20) NOT NULL COMMENT '创建时间,DATE',
`uptimes` bigint(20) NOT NULL COMMENT '完成时间,DATE',
`apiid` int(11) NOT NULL COMMENT 'APIID',
`thirdno` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '调用方单号',
`notifyurl` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '回调地址',
`signature` varchar(600) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT ',签名',
`retimes` bigint(20) NOT NULL COMMENT '回调时间,DATE',
`nexttimes` bigint(20) NOT NULL COMMENT '下次回调时间,DATE',
PRIMARY KEY (`id`) USING BTREE,
INDEX `mo`(`orderstatus`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 54390876 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '交易单' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for ap_user
-- ----------------------------
@ -552,6 +585,102 @@ CREATE TABLE `ap_usr_suggest` (
-- ----------------------------
INSERT INTO `ap_usr_suggest` VALUES (4, 86, '', '展商查询不方便', '', 1746105322, 10, 1750889230, '感谢反馈,已经提交给技术部处理。');
-- ----------------------------
-- Table structure for doc_help
-- ----------------------------
DROP TABLE IF EXISTS `doc_help`;
CREATE TABLE `doc_help` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`upid` int(11) NOT NULL COMMENT ',上级',
`name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '标题',
`csort` int(11) NOT NULL DEFAULT 1 COMMENT '排序',
`isuse` int(11) NOT NULL DEFAULT 0 COMMENT '|公开|,BOOL',
`uptimes` bigint(20) NOT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 152 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '菜单表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of doc_help
-- ----------------------------
INSERT INTO `doc_help` VALUES (1, 0, '首页', 10, 1, 1751753699);
INSERT INTO `doc_help` VALUES (10, 0, '快速了解', 10, 1, 1751760694);
INSERT INTO `doc_help` VALUES (11, 0, '环境部署', 10, 1, 0);
INSERT INTO `doc_help` VALUES (12, 0, '项目入门', 10, 1, 0);
INSERT INTO `doc_help` VALUES (20, 0, 'PC 前端手册', 10, 1, 0);
INSERT INTO `doc_help` VALUES (21, 0, 'PC PHP8手册', 10, 1, 0);
INSERT INTO `doc_help` VALUES (22, 0, 'PC Golang手册', 10, 2, 0);
INSERT INTO `doc_help` VALUES (23, 0, 'PC Python3手册', 10, 2, 0);
INSERT INTO `doc_help` VALUES (25, 0, '移动端手册', 10, 1, 0);
INSERT INTO `doc_help` VALUES (26, 0, '图表手册', 10, 1, 0);
INSERT INTO `doc_help` VALUES (27, 0, '网站手册', 10, 1, 0);
INSERT INTO `doc_help` VALUES (30, 0, '区块链研究', 10, 2, 1751753440);
INSERT INTO `doc_help` VALUES (40, 0, 'AI决策手册', 10, 1, 0);
INSERT INTO `doc_help` VALUES (41, 0, 'AI视觉手册', 10, 2, 0);
INSERT INTO `doc_help` VALUES (42, 0, 'Web3D手册', 10, 1, 0);
INSERT INTO `doc_help` VALUES (43, 0, 'UE虚幻手册', 10, 1, 0);
INSERT INTO `doc_help` VALUES (44, 0, '数据采集手册', 10, 1, 0);
INSERT INTO `doc_help` VALUES (45, 0, '物联网协议', 10, 1, 0);
INSERT INTO `doc_help` VALUES (50, 0, '开发约定', 10, 1, 0);
INSERT INTO `doc_help` VALUES (51, 0, '通用方法论', 10, 1, 0);
INSERT INTO `doc_help` VALUES (52, 0, '开发自动化', 10, 1, 0);
INSERT INTO `doc_help` VALUES (53, 0, '开发配套工具', 10, 1, 0);
INSERT INTO `doc_help` VALUES (60, 0, 'Golang开发', 10, 1, 0);
INSERT INTO `doc_help` VALUES (61, 0, '集群演进', 10, 1, 0);
INSERT INTO `doc_help` VALUES (62, 0, '运维优化', 10, 1, 1751759825);
INSERT INTO `doc_help` VALUES (63, 0, '安全研究', 10, 1, 0);
INSERT INTO `doc_help` VALUES (80, 0, '.net8桌面开发', 10, 1, 0);
INSERT INTO `doc_help` VALUES (90, 0, '常见问题', 10, 1, 0);
INSERT INTO `doc_help` VALUES (100, 11, 'Windows开发环境', 10, 1, 1751920466);
INSERT INTO `doc_help` VALUES (101, 11, 'Mac开发环境', 10, 1, 0);
INSERT INTO `doc_help` VALUES (102, 11, 'Linux生产环境部署', 10, 1, 0);
INSERT INTO `doc_help` VALUES (103, 11, '镜像部署', 10, 1, 0);
INSERT INTO `doc_help` VALUES (104, 41, 'AIBOX中间件', 10, 1, 0);
INSERT INTO `doc_help` VALUES (105, 50, '开发原则', 10, 1, 1751754931);
INSERT INTO `doc_help` VALUES (106, 50, '库表约定', 10, 1, 1751758452);
INSERT INTO `doc_help` VALUES (107, 50, '字段注解', 10, 1, 1751759052);
INSERT INTO `doc_help` VALUES (108, 50, '接口约定', 10, 1, 1751759750);
INSERT INTO `doc_help` VALUES (109, 50, '数据字典', 10, 1, 1751759682);
INSERT INTO `doc_help` VALUES (110, 50, '文件存储', 10, 1, 1751759709);
INSERT INTO `doc_help` VALUES (111, 50, '选型原则', 10, 1, 1751759868);
INSERT INTO `doc_help` VALUES (112, 52, '原型图设计器', 10, 1, 0);
INSERT INTO `doc_help` VALUES (113, 52, 'AI自动规划器', 10, 1, 0);
INSERT INTO `doc_help` VALUES (114, 52, '代码生成器', 10, 1, 0);
INSERT INTO `doc_help` VALUES (115, 53, '离线备份工具', 10, 1, 0);
INSERT INTO `doc_help` VALUES (116, 53, 'UE实景地编器', 10, 1, 0);
INSERT INTO `doc_help` VALUES (117, 53, '行政区划字典工具', 10, 1, 0);
INSERT INTO `doc_help` VALUES (118, 53, '云转储工具', 10, 1, 0);
INSERT INTO `doc_help` VALUES (119, 53, '文件清理工具', 10, 1, 0);
INSERT INTO `doc_help` VALUES (120, 53, 'SaaS导出工具', 10, 1, 0);
INSERT INTO `doc_help` VALUES (121, 60, 'PC端开发', 10, 1, 0);
INSERT INTO `doc_help` VALUES (122, 60, '服务发现', 10, 1, 0);
INSERT INTO `doc_help` VALUES (124, 61, '集群日志分析器', 10, 1, 0);
INSERT INTO `doc_help` VALUES (125, 61, '集群服务注册', 10, 1, 0);
INSERT INTO `doc_help` VALUES (127, 50, '选型历史', 10, 1, 1751759911);
INSERT INTO `doc_help` VALUES (128, 51, '登录校验模式', 10, 1, 0);
INSERT INTO `doc_help` VALUES (129, 51, '权限单字符串校验模式', 10, 1, 0);
INSERT INTO `doc_help` VALUES (130, 51, '服务器安全防护模式', 10, 1, 0);
INSERT INTO `doc_help` VALUES (131, 51, 'PC菜单实现思路', 10, 1, 0);
INSERT INTO `doc_help` VALUES (132, 51, '多语言模式', 10, 1, 0);
INSERT INTO `doc_help` VALUES (133, 51, '数据排序存储模式', 10, 1, 0);
INSERT INTO `doc_help` VALUES (134, 51, '文件存储模式', 10, 1, 0);
INSERT INTO `doc_help` VALUES (135, 51, '文件上传模式', 10, 1, 0);
INSERT INTO `doc_help` VALUES (136, 51, '图片懒加载', 10, 1, 0);
INSERT INTO `doc_help` VALUES (137, 51, '前端防重复请求', 10, 1, 0);
INSERT INTO `doc_help` VALUES (138, 51, '传统字典模式', 10, 1, 0);
INSERT INTO `doc_help` VALUES (139, 51, '租户字典模式', 10, 1, 0);
INSERT INTO `doc_help` VALUES (140, 51, '静态字典', 10, 1, 0);
INSERT INTO `doc_help` VALUES (141, 51, '一对多 所属模式', 10, 1, 0);
INSERT INTO `doc_help` VALUES (142, 51, '同时在线并发量定义', 10, 1, 0);
INSERT INTO `doc_help` VALUES (143, 51, '性能优化指标', 10, 1, 0);
INSERT INTO `doc_help` VALUES (144, 51, '本地离线备份模式', 10, 1, 0);
INSERT INTO `doc_help` VALUES (145, 51, 'HTTP API模式', 10, 1, 0);
INSERT INTO `doc_help` VALUES (146, 51, '爬虫开发模式', 10, 1, 0);
INSERT INTO `doc_help` VALUES (147, 51, '前端调试方案', 10, 1, 0);
INSERT INTO `doc_help` VALUES (148, 51, '测试分工模式', 10, 1, 0);
INSERT INTO `doc_help` VALUES (149, 51, '代码审查模式', 10, 1, 0);
INSERT INTO `doc_help` VALUES (150, 51, '分页场景优化方案', 10, 1, 0);
INSERT INTO `doc_help` VALUES (151, 51, '秒杀场景架构模式', 10, 1, 0);
-- ----------------------------
-- Table structure for xa_user
-- ----------------------------
@ -603,7 +732,7 @@ CREATE TABLE `zc_admin` (
`roleid` int(11) NOT NULL COMMENT '岗位角色,DB,zc_role',
`logintimes` bigint(20) NOT NULL DEFAULT 0 COMMENT '活跃时间,DATE',
`addtimes` bigint(20) NOT NULL COMMENT '注册时间,DATE',
`password` varchar(40) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT ',密码',
`password` varchar(70) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT ',密码',
`trytime` int(11) NOT NULL DEFAULT 0 COMMENT ',连续错误次数',
`power` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT ',权限表',
PRIMARY KEY (`id`) USING BTREE,
@ -613,8 +742,8 @@ CREATE TABLE `zc_admin` (
-- ----------------------------
-- Records of zc_admin
-- ----------------------------
INSERT INTO `zc_admin` VALUES (10, '', '超级管理员', 10, '12345678901', 10, 34, 0, 1750891980, 1000000000, '745371a00438ced9c918d3d44b64d4a1', 0, '.*.');
INSERT INTO `zc_admin` VALUES (18, '', '运营官', 10, '10000452346', 10, 34, 6, 1745062148, 1721153234, '17d73a3b6f9ca783817fc909aad0cfdb', 0, '.p3624.');
INSERT INTO `zc_admin` VALUES (10, '', '超级管理员', 10, '12345678901', 10, 34, 0, 1750891980, 1000000000, 'fa3046be160f84e79da4a5cf004e367997730a662598082f5181efdb8aa43dc9', 0, '.*.');
INSERT INTO `zc_admin` VALUES (18, '', '运营官', 10, '10000452346', 10, 34, 6, 1745062148, 1721153234, 'fa3046be160f84e79da4a5cf004e367997730a662598082f5181efdb8aa43dc9', 0, '.p3624.');
-- ----------------------------
-- Table structure for zc_autotask
@ -704,6 +833,8 @@ INSERT INTO `zc_cata` VALUES (22, 1, 0, 1, 0, 'artsort', '文章排序', '', 'ap
INSERT INTO `zc_cata` VALUES (23, 1, 0, 1, 0, 'artstatus', '文章状态', '', 'ap_art_post');
INSERT INTO `zc_cata` VALUES (100, 2, 0, 1, 0, 'aicapacity', 'AI能力', '', 'zc_ai_key');
INSERT INTO `zc_cata` VALUES (101, 1, 0, 1, 0, 'aidotype', 'AI执行方式', '', 'zc_ai_tsk_run');
INSERT INTO `zc_cata` VALUES (102, 1, 10, 1, 0, 'education', '学历', '', '');
INSERT INTO `zc_cata` VALUES (103, 0, 10, 1, 0, 'orderstatus', '订单状态', '', '');
INSERT INTO `zc_cata` VALUES (1000, 0, 10, 1, 10, '10', '', '', '');
INSERT INTO `zc_cata` VALUES (1001, 0, 20, 1, 10, '20', '', '', '');
INSERT INTO `zc_cata` VALUES (1002, 0, 90, 1, 10, '90', '其他', '', '');
@ -757,6 +888,18 @@ INSERT INTO `zc_cata` VALUES (10157, 0, 0, 1, 101, '160', '改后执行', '', ''
INSERT INTO `zc_cata` VALUES (10159, 0, 0, 1, 101, '190', '人类拒绝', '', '');
INSERT INTO `zc_cata` VALUES (10160, 0, 0, 1, 101, '200', 'AI执行已阅', '', '');
INSERT INTO `zc_cata` VALUES (10161, 0, 0, 1, 101, '210', 'AI执行问题', '', '');
INSERT INTO `zc_cata` VALUES (10200, 0, 10, 1, 102, '10', '小学', '', '');
INSERT INTO `zc_cata` VALUES (10201, 0, 10, 1, 102, '20', '初中', '', '');
INSERT INTO `zc_cata` VALUES (10202, 0, 10, 1, 102, '30', '高中', '', '');
INSERT INTO `zc_cata` VALUES (10203, 0, 10, 1, 102, '40', '大专', '', '');
INSERT INTO `zc_cata` VALUES (10204, 0, 10, 1, 102, '50', '本科', '', '');
INSERT INTO `zc_cata` VALUES (10205, 0, 10, 1, 102, '60', '硕士', '', '');
INSERT INTO `zc_cata` VALUES (10206, 0, 10, 1, 102, '70', '博士', '', '');
INSERT INTO `zc_cata` VALUES (10250, 0, 10, 1, 103, '10', '等待指令', '', '');
INSERT INTO `zc_cata` VALUES (10251, 0, 10, 1, 103, '20', '队列中', '', '');
INSERT INTO `zc_cata` VALUES (10252, 0, 10, 1, 103, '30', '转账中', '', '');
INSERT INTO `zc_cata` VALUES (10253, 0, 10, 1, 103, '100', '成功', '', '');
INSERT INTO `zc_cata` VALUES (10254, 0, 10, 1, 103, '90', '失败', '', '');
-- ----------------------------
-- Table structure for zc_cemap_bill
@ -960,7 +1103,7 @@ INSERT INTO `zc_depart` VALUES (34, 32, '技术部', 19, 1, 10);
DROP TABLE IF EXISTS `zc_dev_dbcode`;
CREATE TABLE `zc_dev_dbcode` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`schem` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '',
`dbcid` int(11) NOT NULL COMMENT '生成器,DB,zc_dev_dbsaas',
`tabl` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '',
`pcjson` mediumtext CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'PC配置',
PRIMARY KEY (`id`) USING BTREE
@ -969,7 +1112,24 @@ CREATE TABLE `zc_dev_dbcode` (
-- ----------------------------
-- Records of zc_dev_dbcode
-- ----------------------------
INSERT INTO `zc_dev_dbcode` VALUES (18, 'c5_ciyon', 'ap_usr_real_apply', '{\"bcod\":{\"verifyfunc\":\"verifyfast\",\"titname\":\"\\u5b9e\\u540d\\u8ba4\\u8bc1\\u7533\\u8bf7\",\"uploadpat\":\"usr_real_apply\",\"liiddict\":\"auditstatus\",\"uptabcard\":\"\",\"tabdict\":\"zc_cata\",\"saascode\":\"\",\"selectorder\":\"\",\"newline\":\"\\u5bfc\\u51fa\",\"multibtn\":\"\\u6279\\u91cf\\u5220\\u9664,\\u5ba1\\u6838\\u901a\\u8fc7,\\u9a73\\u56de\",\"btnlist_line\":\"\\u5ba1\\u6838\",\"savepc\":\"web\\\\admin\\\\ap\\\\usr_real_apply\",\"htmllang\":\"js\",\"proglang\":\"php\",\"pctemplate\":\"\",\"mbtemplate\":\"\"},\"col\":{\"id\":{\"bchk\":\",bout,\",\"set\":\"noup=no\"},\"auditstatus\":{\"bchk\":\",bviw,bout,\",\"set\":\"noup=no\"},\"vuser\":{\"bchk\":\",bviw,bmin,bout,\",\"set\":\"listload=rel\"},\"name\":{\"bchk\":\",bviw,bmin,bout,bqry,bimp,\",\"set\":\"\"},\"idid\":{\"bchk\":\",bviw,bmin,bout,\",\"set\":\"\"},\"idcard1\":{\"bchk\":\",bviw,bout,\",\"set\":\"ftype=jpg,png\"},\"idcard2\":{\"bchk\":\",bviw,bout,\",\"set\":\"ftype=jpg,png\"},\"addtimes\":{\"bchk\":\",bviw,bout,bqry,\",\"set\":\"noup=now\"},\"audituser\":{\"bchk\":\",bviw,bout,bqry,\",\"set\":\"noup=no\"},\"audittimes\":{\"bchk\":\",bviw,bout,\",\"set\":\"noup=no\"},\"auditmsg\":{\"bchk\":\",bviw,bout,bqry,\",\"set\":\"noup=no\"}}}');
INSERT INTO `zc_dev_dbcode` VALUES (18, 1, 'ap_demo', '{\"bcod\":{\"verifyfunc\":\"verifyfast\",\"titname\":\"\\u590d\\u6742\\u529f\\u80fd\",\"uploadpat\":\"demo\",\"liiddict\":\"auditstatus\",\"uptabcard\":\"\",\"tabdict\":\"zc_cata\",\"saascode\":\"\",\"selectorder\":\"\",\"newline\":\"\\u6dfb\\u52a0,\\u5bfc\\u5165,\\u5bfc\\u51fa\",\"multibtn\":\"\\u6279\\u91cf\\u5220\\u9664,\\u5ba1\\u6838\\u901a\\u8fc7,\\u9a73\\u56de\",\"btnlist_line\":\"\\u67e5\\u770b,\\u4fee\\u6539,\\u5ba1\\u6838\",\"savepc\":\"web\\\\admin\\\\ap\\\\demo\",\"htmllang\":\"js\",\"proglang\":\"php\",\"pctemplate\":\"\",\"mbtemplate\":\"\"},\"col\":{\"id\":{\"bchk\":\",bout,\",\"set\":\"noup=no\"},\"auditstatus\":{\"bchk\":\",bviw,bout,\",\"set\":\"noup=no|colview=8\"},\"audituser\":{\"bchk\":\",bviw,bout,bqry,\",\"set\":\"noup=no|listload=rel|colview=8\"},\"audittimes\":{\"bchk\":\",bviw,bout,bqry,\",\"set\":\"noup=no|colview=8\"},\"auditmsg\":{\"bchk\":\",bviw,bout,bqry,\",\"set\":\"noup=no\"},\"name\":{\"bchk\":\",bviw,bmin,bout,bqry,bimp,\",\"set\":\"coledit=16|colview=16\"},\"menuid\":{\"bchk\":\",bviw,bmin,bout,bqry,\",\"set\":\"listload=rel|coledit=8|colview=8\"},\"filesize\":{\"bchk\":\",bviw,bmin,bout,\",\"set\":\"coledit=8|colview=8\"},\"metre\":{\"bchk\":\",bviw,bmin,bout,\",\"set\":\"coledit=8|colview=8\"},\"bankmoney\":{\"bchk\":\",bviw,bmin,bout,\",\"set\":\"coledit=8|colview=8\"},\"setdate\":{\"bchk\":\",bviw,bmin,bout,\",\"set\":\"coledit=8|colview=8\"},\"settimes\":{\"bchk\":\",bviw,bmin,bout,\",\"set\":\"coledit=8|colview=8\"},\"dayclock\":{\"bchk\":\",bviw,bmin,bout,\",\"set\":\"coledit=8|colview=8\"},\"downurl\":{\"bchk\":\",bviw,bout,\",\"set\":\"ftype=jpg,png|num=3|coledit=16\"},\"avar\":{\"bchk\":\",bviw,bout,\",\"set\":\"ftype=jpg,png|coledit=8\"},\"isuse\":{\"bchk\":\",bviw,bmin,bout,\",\"set\":\"coledit=6|colview=6\"},\"isopen\":{\"bchk\":\",bviw,bmin,bout,bqry,\",\"set\":\"coledit=6|colview=6\"},\"unit\":{\"bchk\":\",bviw,bmin,bout,\",\"set\":\"coledit=12|colview=12\"},\"sigstatus\":{\"bchk\":\",bviw,bmin,bout,\",\"set\":\"coledit=8|colview=6\"},\"mauditstatus\":{\"bchk\":\",bviw,bmin,bout,bqry,\",\"set\":\"dbquery=select|coledit=16|colview=6\"},\"prodcata\":{\"bchk\":\",bviw,bmin,bout,\",\"set\":\"colview=12\"},\"areacode\":{\"bchk\":\",bviw,bmin,bout,\",\"set\":\"colview=12\"},\"renzheng\":{\"bchk\":\",bviw,bmin,bout,\",\"set\":\"coledit=16|colview=12\"},\"ppint\":{\"bchk\":\",bviw,bmin,bout,\",\"set\":\"coledit=8|colview=6\"},\"npcyc\":{\"bchk\":\",bviw,bmin,bout,\",\"set\":\"coledit=8|colview=6\"},\"runsec\":{\"bchk\":\",bviw,bmin,bout,\",\"set\":\"coledit=8|colview=6\"},\"acttm\":{\"bchk\":\",bviw,bmin,bout,\",\"set\":\"coledit=8|colview=6\"},\"imgs\":{\"bchk\":\",bviw,bout,\",\"set\":\"ftype=jpg,png|num=3\"},\"ton\":{\"bchk\":\",bviw,bmin,bout,bqry,\",\"set\":\"coledit=8|colview=6\"},\"price\":{\"bchk\":\",bviw,bmin,bout,\",\"set\":\"coledit=8|colview=6\"},\"lat\":{\"bchk\":\",bout,\",\"set\":\"noup=fow|coledit=8|colview=6\"},\"lng\":{\"bchk\":\",bviw,bmin,bout,\",\"set\":\"coledit=8|colview=6\"},\"nums\":{\"bchk\":\",bviw,bmin,bout,\",\"set\":\"coledit=8|colview=6\"},\"pct\":{\"bchk\":\",bviw,bmin,bout,\",\"set\":\"coledit=8|colview=6\"},\"url\":{\"bchk\":\",bviw,bmin,bout,\",\"set\":\"coledit=8|colview=6\"},\"weightg\":{\"bchk\":\",bviw,bmin,bout,\",\"set\":\"coledit=8|colview=6\"},\"eartmpr\":{\"bchk\":\",bviw,bmin,bout,\",\"set\":\"coledit=8|colview=6\"},\"qian\":{\"bchk\":\",bviw,bmin,bout,\",\"set\":\"coledit=8\"},\"meishi\":{\"bchk\":\",bviw,bmin,bout,\",\"set\":\"coledit=8\"},\"weight\":{\"bchk\":\",bviw,bmin,bout,\",\"set\":\"coledit=8\"},\"height\":{\"bchk\":\",bviw,bmin,bout,\",\"set\":\"coledit=8\"},\"skt\":{\"bchk\":\",bviw,bmin,bout,\",\"set\":\"coledit=8\"},\"idcard\":{\"bchk\":\",bviw,bmin,bout,\",\"set\":\"msk=****##|coledit=8|colview=12\"},\"addtimes\":{\"bchk\":\",bviw,bout,\",\"set\":\"noup=now|colview=12\"},\"content\":{\"bchk\":\",bviw,bmin,bout,\",\"set\":\"nocmn=no\"},\"md\":{\"bchk\":\",bviw,\",\"set\":\"nocmn=no\"}}}');
-- ----------------------------
-- Table structure for zc_dev_dbsaas
-- ----------------------------
DROP TABLE IF EXISTS `zc_dev_dbsaas`;
CREATE TABLE `zc_dev_dbsaas` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '名称',
`schem` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '数据库',
`subpath` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '相对路径',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 79 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '代码目录表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of zc_dev_dbsaas
-- ----------------------------
INSERT INTO `zc_dev_dbsaas` VALUES (1, '总控', 'c5_ciyon', 'admin\\ap');
-- ----------------------------
-- Table structure for zc_dev_note
@ -988,7 +1148,7 @@ CREATE TABLE `zc_dev_note` (
-- ----------------------------
INSERT INTO `zc_dev_note` VALUES (1, 10, 1750891369, '==单一机构管理系统==\n用户表移动端与PC端复用admin\n用online实现多端登录及多设备同时登陆限制\n组织管理、服务器监控、系统管理是标配\n业务功能独立开发\n\n==单一互联网平台==\n前端互联网用户使用ap_user表\n总控后台管理用户使用zc_admin表\n平台端数据表前缀与后台管理区分。\n平台业务一般按客服工作、运营工作、财务工作分组。\n客服工作主要处理注册后的用户遇到的问题。包括工单、意见建议、客户查询及窗口业务处理。\n运营工作主要分析数据制定获客策略、营收策略、广告等。包括金币模式、充值提现模式、付费会员模式等设计佣金、多级分享、活跃埋点等。\n财务工作主要对账、开票、支付操作等。\n\n演示版开发一个应用。可扩展成多个应用入口录入买家版、卖家版等。\n\n==多端SaaS软件==\n以某个行业为切入点开发SaaS功能表前缀建议xa、xb、xc未来可扩展上下游产业SaaS应用。\n例如为农贸批发市场行业开发SaaS软件启用表前缀xa_user、xz_org。\n随着业务发展可能配套开发上下游SaaS例如食堂SaaS、冷链运输物流企业SaaS、时鲜类仓储企业SaaS、种植户溯源SaaS、团购团长SaaS等等。\n未平台化之前整合开发低成本满足客户独立部署需求。\n平台化后方便微服务拆分。\n\n\n==AI辅助决策能力==\n实现算力库、浓缩知识、MCP本地数据函数、AIAgent、AI任务编排、AIGC写作等。\n鉴于RAG、微调效果欠佳经过这几年摸索浓缩知识能降低幻觉的产生。\nAI自动调用本地数据函数实现信息系统到AI的打通。需精心设计函数返回内容。\n通过AI任务编排实现AI分解工作并行执行合并结果并且使用独立提示词或数学函数检验判断置信度。\n以置信度为核心的自动控制指令调用建立AI从辅助决策到自主决策的工程实现。\n\n==审批事项==\n基于图的可配置审批流程\n通用审批流程给到具体表单更新表单状态。直至审批成功或返回原点。\n\n==产业官网==\n自研SaaS软件需要网络推广做SEO\n通过产业官网及后续的配套文章自动发布模型实现自动化的更新站点强化SEO。\n\n==AI私域==\n通过自动操控手机或PC屏幕。实现自动化的操作微信、QQ、抖音、小红书等软件。\n达到AI自动跟客户聊天自动给客户分类通知人类集中回复高意向客户。\n\n\n==AI自媒体==\n通过自动操控和API接入实现自动生成图文及短视频、定时自动发自媒体文章/视频。\n自动回复评论、点赞自动回点、自动回关、自动搜索兴趣话题并自动评论点赞。\n\n\n==各种接入==\n各种常见的功能接入\n例如短信、收发邮件、区块链上链、公众号推送、AI监控、常见物联网设备等。\n\n==Web3D==\n实现基本的3D数字孪生效果\n实现一个可视化场景编辑器封装常用的JS函数便于二次开发。\n常用于数据大屏、场景展示。\n\n==系统管理==\n包括组织管理、管理员管理、用户角色。\n服务器各项指标监控关键运行指标上报到服务发现网关用于负载均衡。\n实现业务日志、程序日志、数据库慢请求日志等用于综合分析运行瓶颈及时发现异常。\n实现通用配置、数据字典、自动化任务(非实时)、数据计算(耗时)等框架功能。\n\n==开发者==\n隐藏的开发者模式便于调试按Ctrl+E 5下切换调试。\n实现菜单配置、扩展权限、mock。\n一些示例代码、原型图、代码生成器、AI辅助规划等。');
INSERT INTO `zc_dev_note` VALUES (2, 11, 1750891424, '\n金币购买记录 pnt_buy\n 所属会员、金币、金额、时间\n\n金币使用记录 pnt_use\n 所属会员、金币、摘要、时间\n\n金币奖励记录 pnt_reward\n 所属会员、金币、摘要、时间\n\n充值套餐表 fina_buy\n 金币、金额\n 功能:添加、修改\n\n财务收入记录 fina_earn\n 所属会员、金额、摘要、时间\n\n财务提现记录 fina_cash\n 所属会员、金额、状态(申请、通过、发放)、时间\n ');
INSERT INTO `zc_dev_note` VALUES (3, 12, 1750891779, '\n== 未来 ==\n审批事项(老平台移植)\n产业官网(老平台移植)\nAI私域\nAI自媒体\n部分接入(老平台移植)\n\n== 三期 ==\nok AI算力、浓缩知识、决策单元\nok 数据函数MCP\nok AIGC写作\n决策任务、置信度评分、主动决策执行\n\n\n== 二期 ==\nok Web3DJS库封装、Web3D地编器\n\n== 一期 ==\nok 总控菜单\nok 管理员角色组织机构\nok 系统管理\nok 服务监控\nok Mocks、示例代码\nok 充提、金币、付费会员\nok 分享、单页、埋点\nok 提现、开票、收货地址\nok 意见建议、工单');
INSERT INTO `zc_dev_note` VALUES (3, 12, 1753836209, '\n== 未来 ==\n审批事项(老平台移植)\n产业官网(老平台移植)\nAI私域\nAI自媒体\n部分接入(老平台移植)\n\ndao的建立表\nschema: 项目id、总控、库名、相对路径\ntable: schemaid、表名、英文名、columnjson、pcjson\n基于表生成代码、生成数据库文档。里程碑文档\n\n建立testyl、testtk用例/任务。\n基于测试数据生成测试文档。\n\n== 25.06 ==\n变更开发者菜单:\n软件设置。多端菜单管理、扩展权限、调试登录\n示例代码。前端组件分出交互示例功能示例增加一些。\n开发工具。统一碎片代码位置增加众产支持(统管)。\n研发管理。开发记录(统管)、里程碑更新记录(统管)。\n测试工具。测试用例和任务(统管)、mock接口。\n\n平台业务。增加API接口、订单示例。\n\nAI多语言翻译:\n语言库从js中读取要设置的语言\nlang、name、trans\n以lang=\'\'为核心,新建一个,就自动根据语言建几个。\n列表: 中文、English、日本语、xxxx\n输入一个就自动更新一个文本框变化一下\n在头部可以整列AI自动翻译。也可以在文本框旁边点击\"翻译\"\n\n== 25.03 ==\nok AI算力、浓缩知识、决策单元\nok 数据函数MCP\nok AIGC写作\n决策任务、置信度评分、主动决策执行\n\n\n== 24.06 ==\nok Web3DJS库封装、Web3D地编器\n\n== 24.02 ==\nok 总控菜单\nok 管理员角色组织机构\nok 系统管理\nok 服务监控\nok Mocks、示例代码\nok 充提、金币、付费会员\nok 分享、单页、埋点\nok 提现、开票、收货地址\nok 意见建议、工单');
-- ----------------------------
-- Table structure for zc_funcslow
@ -1067,8 +1227,8 @@ CREATE TABLE `zc_menu` (
`name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '名称',
`url` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '链接',
`pow` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '权限',
`csort` int(11) NOT NULL DEFAULT 1 COMMENT '排序',
`isuse` int(11) NOT NULL DEFAULT 0 COMMENT '|启用|,BOOL',
`csort` int(11) NOT NULL DEFAULT 10 COMMENT '排序',
`isuse` int(11) NOT NULL DEFAULT 1 COMMENT '|启用|,BOOL',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 20003 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '菜单表' ROW_FORMAT = Dynamic;
@ -1090,9 +1250,6 @@ INSERT INTO `zc_menu` VALUES (80, 0, '组织管理', '', '', 10, 1);
INSERT INTO `zc_menu` VALUES (81, 0, '服务器监控', '', '', 10, 1);
INSERT INTO `zc_menu` VALUES (82, 0, '系统管理', '', '', 10, 1);
INSERT INTO `zc_menu` VALUES (99, 0, '*开发者', '', '', 1, 1);
INSERT INTO `zc_menu` VALUES (100, 1, '简体中文', 'ciyfn.setlang()', '', 1, 1);
INSERT INTO `zc_menu` VALUES (101, 1, 'English', 'ciyfn.setlang(\'en\')', '', 1, 1);
INSERT INTO `zc_menu` VALUES (102, 1, '日本語', 'ciyfn.setlang(\'ja\')', '', 1, 1);
INSERT INTO `zc_menu` VALUES (120, 1, '刷新缓存', 'restorage(true)', '', 1, 1);
INSERT INTO `zc_menu` VALUES (121, 1, '修改密码', 'rigger/chgpass.html', '', 1, 1);
INSERT INTO `zc_menu` VALUES (130, 2, 'SSH', 'setssh(true)', '', 1, 1);
@ -1168,7 +1325,7 @@ INSERT INTO `zc_menu` VALUES (550, 81, '健康指标', 'rigger/statsfunc.html',
INSERT INTO `zc_menu` VALUES (551, 81, '服务器详情', 'rigger/statssrv.html', '', 10, 1);
INSERT INTO `zc_menu` VALUES (552, 81, '数据库详情', 'rigger/statsdb.html', '', 10, 1);
INSERT INTO `zc_menu` VALUES (553, 81, '业务日志', 'rigger/logdb.html?liid=1', 's=审阅|d=删除', 10, 1);
INSERT INTO `zc_menu` VALUES (554, 81, '程序日志', 'rigger/logfile.html', '', 10, 1);
INSERT INTO `zc_menu` VALUES (554, 81, '程序日志', 'rigger/logfile.html', 'd=删除', 10, 1);
INSERT INTO `zc_menu` VALUES (555, 81, '慢请求记录', 'rigger/funcslow.html', 'd=删除|e=导出', 10, 1);
INSERT INTO `zc_menu` VALUES (600, 82, '配置管理', 'rigger/config.html', 'u=管理|d=删除', 10, 1);
INSERT INTO `zc_menu` VALUES (601, 82, '数据字典', 'rigger/cataindex.html', 'pi=库管理|pd=字典管理', 10, 1);
@ -1177,35 +1334,55 @@ INSERT INTO `zc_menu` VALUES (603, 82, '表单设计器', '~:tabbase 字段设
INSERT INTO `zc_menu` VALUES (604, 82, '流程设计器', '~:mattertemplate 流程设置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 (622, 82, '静态字典生成', '', '', 10, 1);
INSERT INTO `zc_menu` VALUES (900, 99, '用户调试登录', 'rigger/debug_user.html', 'u=管理|n=使用', 10, 1);
INSERT INTO `zc_menu` VALUES (903, 99, '总控菜单', 'rigger/menu.html', 'u=管理|d=删除', 10, 1);
INSERT INTO `zc_menu` VALUES (910, 99, '扩展权限', 'rigger/power.html', 'u=设置', 10, 1);
INSERT INTO `zc_menu` VALUES (911, 99, 'Mocks接口', 'rigger/mock.html', 'u=管理|d=删除', 10, 1);
INSERT INTO `zc_menu` VALUES (912, 99, '通用事项管理', '~:mattercomm 未送审、未办结', '', 10, 2);
INSERT INTO `zc_menu` VALUES (920, 99, '示例代码', '', '', 10, 1);
INSERT INTO `zc_menu` VALUES (925, 99, '原型图', '', '', 10, 1);
INSERT INTO `zc_menu` VALUES (926, 99, '代码生成器', 'develop/code_list.html', '', 10, 1);
INSERT INTO `zc_menu` VALUES (927, 99, '开发文档', '', '', 10, 1);
INSERT INTO `zc_menu` VALUES (930, 920, '小工具', 'https://i.qiboc.cn/tool/', '', 10, 1);
INSERT INTO `zc_menu` VALUES (931, 920, '增删改查', 'ap/demo.html', '', 10, 1);
INSERT INTO `zc_menu` VALUES (932, 920, '前端组件', 'demo/index.html', '', 10, 1);
INSERT INTO `zc_menu` VALUES (933, 920, 'WebSocket示例', 'wsdemo/', '', 10, 1);
INSERT INTO `zc_menu` VALUES (934, 920, 'SSE示例', 'demo/dyn/sse.html', '', 10, 1);
INSERT INTO `zc_menu` VALUES (950, 925, '生成源码', '~:选择本地自定义表单生成,原型拉取到自定义表单,远程原型直接生成', '', 10, 0);
INSERT INTO `zc_menu` VALUES (955, 925, 'PC端原型', '~m4376,key=18679ba2c1fb8749727dae0ce6bde66cbbf00b7ce0', '', 10, 1);
INSERT INTO `zc_menu` VALUES (956, 925, '移动端原型', '~a4187,tag=me', '', 10, 1);
INSERT INTO `zc_menu` VALUES (957, 925, '图表原型', '~c836', '', 10, 1);
INSERT INTO `zc_menu` VALUES (958, 925, '大屏原型', '~c3125,key=18679ba589ab4e057e13b752ebc399a8f3f4ffeaf6', '', 10, 1);
INSERT INTO `zc_menu` VALUES (959, 925, '原型右键参考', 'rigger/config.html~m4376', '', 10, 1);
INSERT INTO `zc_menu` VALUES (960, 925, '菜单说明文字', '~:第一行|第二行', '', 10, 1);
INSERT INTO `zc_menu` VALUES (970, 927, '功能原型', 'develop/note.html?typeid=10', '', 10, 1);
INSERT INTO `zc_menu` VALUES (971, 927, '数据接口', 'develop/note.html?typeid=11', '', 10, 1);
INSERT INTO `zc_menu` VALUES (972, 927, '开发计划', 'develop/note.html?typeid=12', '', 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);
INSERT INTO `zc_menu` VALUES (903, 99, '开发管理', '', '', 10, 1);
INSERT INTO `zc_menu` VALUES (904, 99, '测试工具', '', '', 10, 1);
INSERT INTO `zc_menu` VALUES (910, 901, '前端组件', 'demo/index.html', '', 10, 1);
INSERT INTO `zc_menu` VALUES (911, 901, '交互示例', 'demo/index_fb.html', '', 10, 1);
INSERT INTO `zc_menu` VALUES (912, 901, '功能示例', '', '', 10, 1);
INSERT INTO `zc_menu` VALUES (920, 902, '碎片试验代码', '/ajax/api/test1.t1', '', 10, 1);
INSERT INTO `zc_menu` VALUES (921, 902, '共享工具集', 'https://i.qiboc.cn/tool/', '', 10, 1);
INSERT INTO `zc_menu` VALUES (922, 902, '原型图演示', '', '', 10, 1);
INSERT INTO `zc_menu` VALUES (923, 902, '众产支持', '', '', 10, 1);
INSERT INTO `zc_menu` VALUES (930, 903, '里程碑更新记录', '', '', 10, 1);
INSERT INTO `zc_menu` VALUES (931, 903, '开发记录', '', '', 10, 1);
INSERT INTO `zc_menu` VALUES (940, 904, '测试用例', 'dao.ciy.cn/dev', '', 10, 1);
INSERT INTO `zc_menu` VALUES (941, 904, '测试任务', 'dao.ciy.cn/dev', '', 10, 1);
INSERT INTO `zc_menu` VALUES (942, 904, 'Bug处置', 'dao.ciy.cn/dev', '', 10, 1);
INSERT INTO `zc_menu` VALUES (945, 904, 'Mocks接口', 'rigger/mock.html', '', 10, 1);
INSERT INTO `zc_menu` VALUES (980, 900, '总控菜单', 'rigger/menu.html', '', 10, 1);
INSERT INTO `zc_menu` VALUES (981, 900, 'SaaS菜单', '', '', 10, 1);
INSERT INTO `zc_menu` VALUES (990, 900, '调试登录', 'rigger/debug_user.html', '', 10, 1);
INSERT INTO `zc_menu` VALUES (991, 900, '扩展权限', 'rigger/power.html', '', 10, 1);
INSERT INTO `zc_menu` VALUES (992, 900, '通用事项管理', '~:mattercomm 未送审、未办结', '', 10, 1);
INSERT INTO `zc_menu` VALUES (1120, 912, '常规列表页', 'ap/demo.html', '', 10, 1);
INSERT INTO `zc_menu` VALUES (1121, 912, '块列表页', '', '', 10, 1);
INSERT INTO `zc_menu` VALUES (1122, 912, '多层分类', '', '', 10, 1);
INSERT INTO `zc_menu` VALUES (1123, 912, '行编辑表', '', '', 10, 1);
INSERT INTO `zc_menu` VALUES (1124, 912, '设置单页', '', '', 10, 1);
INSERT INTO `zc_menu` VALUES (1125, 912, '安全功能页', '', '', 10, 1);
INSERT INTO `zc_menu` VALUES (1126, 912, '分类列表页', '', '', 10, 1);
INSERT INTO `zc_menu` VALUES (1220, 922, 'PC端', '~m4376,key=18679ba2c1fb8749727dae0ce6bde66cbbf00b7ce0', '', 10, 1);
INSERT INTO `zc_menu` VALUES (1221, 922, '移动端', '~a4187,tag=me', '', 10, 1);
INSERT INTO `zc_menu` VALUES (1222, 922, '图表', '~c836', '', 10, 1);
INSERT INTO `zc_menu` VALUES (1223, 922, '大屏', '~c3125,key=18679ba589ab4e057e13b752ebc399a8f3f4ffeaf6', '', 10, 1);
INSERT INTO `zc_menu` VALUES (1224, 922, '菜单说明', '~:第一行|第二行', '', 10, 1);
INSERT INTO `zc_menu` VALUES (1230, 923, '加入指引', '', '', 10, 1);
INSERT INTO `zc_menu` VALUES (1231, 923, 'AI规划', '!DAO/dev/ciyon/project.html', '', 10, 1);
INSERT INTO `zc_menu` VALUES (1232, 923, '代码生成器', 'develop/code_saas.html', '', 10, 1);
INSERT INTO `zc_menu` VALUES (1233, 923, '生成文档', '', '', 10, 1);
INSERT INTO `zc_menu` VALUES (1234, 923, 'AI多语言翻译', '', '', 10, 1);
INSERT INTO `zc_menu` VALUES (1235, 923, '工具支持', '', '', 10, 1);
INSERT INTO `zc_menu` VALUES (1300, 931, '产品规划', 'develop/note.html?typeid=10', '', 10, 1);
INSERT INTO `zc_menu` VALUES (1301, 931, '架构设计', 'develop/note.html?typeid=11', '', 10, 1);
INSERT INTO `zc_menu` VALUES (1302, 931, '开发计划', 'develop/note.html?typeid=12', '', 10, 1);
INSERT INTO `zc_menu` VALUES (10000, 10, '客服工作', '', '', 10, 1);
INSERT INTO `zc_menu` VALUES (10001, 10, '运营工作', '', '', 10, 1);
INSERT INTO `zc_menu` VALUES (10002, 10, '财务工作', '', '', 10, 1);
INSERT INTO `zc_menu` VALUES (10010, 10, '用户数据', '', '', 10, 1);
INSERT INTO `zc_menu` VALUES (10011, 10, 'API接口', 'ap/api.html', '', 10, 1);
INSERT INTO `zc_menu` VALUES (10100, 10000, '工单处理', 'ap/usr_problem.html', '', 10, 1);
INSERT INTO `zc_menu` VALUES (10101, 10000, '意见建议', 'ap/usr_suggest.html', '', 10, 1);
INSERT INTO `zc_menu` VALUES (10105, 10000, '用户服务', 'ap/user_service.html', '', 10, 1);
@ -1220,6 +1397,7 @@ INSERT INTO `zc_menu` VALUES (10222, 10001, '广告图管理', 'ap/banner.html',
INSERT INTO `zc_menu` VALUES (10230, 10001, '金币奖励埋点', 'ap/pnt_track.html', '', 10, 1);
INSERT INTO `zc_menu` VALUES (10231, 10001, '付费会员定价', 'ap/usr_buy_bundle.html', '', 10, 1);
INSERT INTO `zc_menu` VALUES (10232, 10001, '金币购买定价', 'ap/pnt_bundle.html', '', 10, 1);
INSERT INTO `zc_menu` VALUES (10235, 10001, '订单示例', 'ap/transfer.html', '', 10, 1);
INSERT INTO `zc_menu` VALUES (10300, 10002, '提现支付', 'ap/cash_out_2.html', '', 10, 1);
INSERT INTO `zc_menu` VALUES (10301, 10002, '发票开票', 'ap/usr_invoicing.html', '', 10, 1);
INSERT INTO `zc_menu` VALUES (10302, 10002, '付费会员流水', 'ap/usr_buy_user.html?liid=2', '', 10, 1);
@ -1237,6 +1415,7 @@ INSERT INTO `zc_menu` VALUES (10408, 10010, '验证码', 'ap/usr_capcode.html',
DROP TABLE IF EXISTS `zc_mnufav`;
CREATE TABLE `zc_mnufav` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`favtarget` int(11) NOT NULL,
`user` int(11) NOT NULL COMMENT '|用户|,CATA,adminuser',
`menuid` int(11) NOT NULL,
`addtimes` bigint(20) NOT NULL COMMENT '添加时间,DATE',
@ -1357,8 +1536,7 @@ DROP TABLE IF EXISTS `zc_ymock`;
CREATE TABLE `zc_ymock` (
`id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID',
`name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '名称备注',
`upath` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '类路径',
`ufunc` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '函数名',
`ufunc` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '类.函数',
`mockjson` mediumtext CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT ',mock数据',
`lastrequest` text CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT ',请求快照',
`lasttimes` bigint(20) NOT NULL DEFAULT 0 COMMENT '请求时间,DATE',
@ -1369,7 +1547,7 @@ CREATE TABLE `zc_ymock` (
-- ----------------------------
-- Records of zc_ymock
-- ----------------------------
INSERT INTO `zc_ymock` VALUES (6, '', 'work/art', 'get', '{\"code\":1}', '', 0, 1722713211);
INSERT INTO `zc_ymock` VALUES (6, '', 'admin/rigger/mock.testmock', '{\"code\":1,\"data\":12344321}', '/z/?func=admin/rigger/mock.testmock<br/>{\"abc\":\"def\",\"_pf\":\"PC\"}', 1754001371, 1722713211);
-- ----------------------------
-- Table structure for zc_zmem_var
@ -1385,9 +1563,10 @@ CREATE TABLE `zc_zmem_var` (
-- ----------------------------
-- Records of zc_zmem_var
-- ----------------------------
INSERT INTO `zc_zmem_var` VALUES (1, 'func_runms', 4332);
INSERT INTO `zc_zmem_var` VALUES (2, 'func_succ', 154);
INSERT INTO `zc_zmem_var` VALUES (3, 'func_fail', 8);
INSERT INTO `zc_zmem_var` VALUES (4, 'func_commit', 31);
INSERT INTO `zc_zmem_var` VALUES (1, 'func_runms', 0);
INSERT INTO `zc_zmem_var` VALUES (2, 'func_succ', 0);
INSERT INTO `zc_zmem_var` VALUES (3, 'func_fail', 0);
INSERT INTO `zc_zmem_var` VALUES (4, 'func_commit', 0);
INSERT INTO `zc_zmem_var` VALUES (5, 'func_rollback', 0);
SET FOREIGN_KEY_CHECKS = 1;

223
web/admin/ap/api.html Normal file
View File

@ -0,0 +1,223 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1">
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
<link href="/jscss/style.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" charset="utf-8" src="/jscss/theme.js"></script>
</head>
<body>
<div class="container">
<form class="search" onsubmit="table.search(this,'btn');return false;">
<ul></ul>
<div>
<div class="sinps"></div>
<div class="sbtns">
<a class="lang btn" onclick="addnew()">新建API通道</a>
<a class="lang btn def" href="/ud/api/api.pdf" target="_blank">API文档</a>
<a class="lang btn def" href="/ud/api/api_sign.pdf" target="_blank">签名文档</a>
<a class="lang btn def" href="/ud/public.pem" onclick="">平台回调公钥下载</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>
|
</div>
<div class="page"></div>
</div>
</div>
</div>
<div id="alert_edit" style="display:none;">
<div class="char4 row">
<div class="ciy-form col-24 col-sm-24 top">
<label class="lang">白名单IP</label>
<div>
<ciy-textarea com="ips" minheight="10em" />
</div>
</div>
</div>
</div>
<div id="alert_pubkey" style="display:none;">
<div class="char4 row">
<div class="ciy-form col-24 col-sm-24 top">
<label class="lang">公钥</label>
<div>
<ciy-textarea com="pubkey" minheight="10em" />
</div>
</div>
<div class="ciy-form col-24 col-sm-24">
<label class="lang">待签数据</label>
<div id="id_hash"></div>
</div>
<div class="ciy-form col-24 col-sm-24">
<label class="lang">签名</label>
<div>
<ciy-textarea com="sign" minheight="10em" />
</div>
</div>
<div class="ciy-form col-24 col-sm-24">
<div class="ciy-tip">
<div><kbd>签名算法</kbd>RSA  <kbd>填充方式</kbd>RSASSA-PKCS1-v1.5  <kbd>秘钥格式</kbd>PEM PKCS#8  <kbd>签名输出格式</kbd>HEX</div>
<div>生成私钥命令行 <code>openssl genpkey -algorithm RSA -out pri.pem -pkeyopt rsa_keygen_bits:2048</code></div>
<div>提取公钥命令行 <code>openssl rsa -in pri.pem -pubout -out pub.pem</code></div>
</div>
</div>
</div>
</div>
<script type="text/javascript" src="/jscss/ciy.js"></script>
<script type="text/javascript" src="/jscss/ciycmp.js"></script>
<script type="text/javascript" src="/jscss/ciytable.js"></script>
<script type="text/javascript" src="../common.js"></script>
<script type="text/javascript">
'use strict';
var table;
var Glob = {};
ciyfn.pageload(function () {
//Glob.urlp = ciyfn.urlparam();
table = new ciyclass.table({
dom: '.table'
, url: 'list'
, pagecount: 10
, fn_beforedata: function (json) {
ciyfn.fillsearch({
searchdom: '.search'
, data: json
});
return json;
}
, fn_tdcontent: function (key, datashow, field, data) {
if (key == '_btn') {
var html = '';
html += `<a class="lang btn" onclick="menubtn(this, 'edit')">设置</a>`;
html += `<a class="lang btn warn" onclick="menubtn(this, 'rekey')">重置ApiKey</a>`;
html += `<a class="lang btn dag" onclick="menubtn(this, 'del')">删除</a>`;
return html;
}
if (key == 'pubkey') {
if(data[key] == '')
return '<a class="lang btn" onclick="menubtn(this, \'pubkey\')">安装证书</a>';
return '已安装';
}
if (key == 'msg') {
if(data['apisecret'] == '')
return '<a class="lang btn def" onclick="menubtn(this, \'qa\')">质量分析</a> 接入质量较低已经暂停API请重置ApiKey恢复';
else
return '正常';
}
}
, fn_done: function (json) {
// table.mergecol('auditstatus');
// table.mergefix('总计', 'center', 6, 0, 8, 1);
// table.footertotal();
}
});
table.callpage(1);
});
async function menubtn(dom, btn) {
var id = $5(dom).parent('tr').attr('data-id');
if (btn == 'pubkey') {
var oridata = 'CIY' + tostamp();
var hash = await ciyfn.sha256(oridata);
ciyfn.alert({
title: '安装证书'
, width: 'pc'
, content: document.getElementById("alert_pubkey").innerHTML
, fn_showed: function (doc, dom) {
var dat = table.data[id];
ciycmp({ dom: $5('[com=pubkey]', dom) });
ciycmp({ dom: $5('[com=sign]', dom) });
$5('#id_hash', dom).html(hash);
}
, cb: function (opn) {
if (opn.btn == "关闭")
return opn.close();
opn.inputs.id = id;
opn.inputs.oridata = oridata;
opn.inputs.hash = hash;
if (ciyfn.throttle(opn.dombtn)) return;
ciyfn.callfunc('pubkey', opn.inputs, function (json) {
table.updateline(json);
opn.close();
ciyfn.toast('设置成功');
});
},
btns: ["提交", "*关闭"],
});
}
if (btn == 'edit') {
ciyfn.alert({
title: '设置'
, width: 'mb'
, content: document.getElementById("alert_edit").innerHTML
//, noparent:true
, fn_showed: function (doc, dom) {
var dat = table.data[id];
ciycmp({ dom: $5('[com=ips]', dom), value: dat.ips });
}
, cb: function (opn) {
if (opn.btn == "关闭")
return opn.close();
opn.inputs.id = id;
if (ciyfn.throttle(opn.dombtn)) return;
ciyfn.callfunc('edit', opn.inputs, function (json) {
table.updateline(json);
opn.close();
ciyfn.toast('提交成功');
});
},
btns: ["提交", "*关闭"],
});
}
if (btn == 'rekey') {
ciyfn.alert({
content: '是否重置appkey<br/>重置后原appkey不可用'
, btns: ["重置", '*关闭']
, cb: function (opn) {
if (opn.btn == '关闭')
return opn.close();
ciyfn.callfunc("rekey", { id: id }, function (json) {
ciyfn.alert('appid: <kbd>' + id + '</kbd><br/>appkey: <kbd>' + json.secret + '</kbd><br/>平台将不再显示,请妥善保管!');
opn.close();
});
}
});
}
if (btn == 'del') {
ciyfn.callfastfunc(dom, '是否删除?', 'del', { ids: id }, function (json) { table.delline(json) });
}
}
function getdata(id, act, cb) {
cb({ data: id == 0 ? {} : table.data[id] });
}
function addnew() {
ciyfn.alert({
content: '确认新建一条API通道'
, btns: ["新建", '*关闭']
, cb: function (opn) {
if (opn.btn == '关闭')
return opn.close();
ciyfn.callfunc("addnew", {}, function (json) {
ciyfn.alert('appid: <kbd>' + json.data.id + '</kbd><br/>appkey: <kbd>' + json.data.apisecret + '</kbd><br/>请妥善保管!');
table.updateline(json);
opn.close();
});
}
});
}
function edit(id) {
} </script>
</body>
</html>

244
web/admin/ap/api.php Normal file
View File

@ -0,0 +1,244 @@
<?php
namespace web\admin\ap;
class api {
static function setwhere($db, $post) {
$query = $post->get('query');
$csql = new \ciy\sql('ap_api');
$order = objstr($query, 'order', 'id desc');
$csql->order($order);
$query['order'] = $order;
return [$query, $csql];
}
public static function json_list() {
global $db;
$rsuser = verifyfast();
$post = new \ciy\post();
list($where, $csql) = self::setwhere($db, $post);
$pageno = $post->getint('pageno', 1);
$pagecount = $post->getint('pagecount', 10);
$csql->limit($pageno, $pagecount);
$mainrowcount = $post->getint('count');
$rows = $db->get($csql, $mainrowcount);
if ($rows === false)
return errjson($db->error);
$ret = array('where' => $where, 'pageno' => $pageno, 'pagecount' => $pagecount, 'count' => $mainrowcount, 'list' => $rows);
if ($post->getbool('field')) {
$field = array();
$fshow = $db->getfield($field, 'ap_api');
foreach ($field as $fr => $v) {
if (get('_' . $fr))
$field[$fr]['c'] = ',' . $field[$fr]['c'];
}
$fshow = fieldadd($fshow, $field, 0, '_btn', '操作');
$fshow = fieldadd($fshow, $field, -1, 'msg', '接入检测');
$ret['field'] = $field;
$ret['fshow'] = $fshow;
}
if ($post->getbool('once')) {
$ret['once'] = array();
$input = array();
$ret['once']['input'] = $input;
}
return succjson($ret);
}
public static function json_addnew() {
global $db;
$rsuser = verifyfast();
//if (nopower($db, $rsuser['id'], 'p u'))
// return errjson('您未被授权操作');
$post = new \ciy\post();
$csql = new \ciy\sql('ap_api');
$csql->where('addtimes>', time() - 86400 * 7);
$csql->column('id');
$chkid = toint($db->get1($csql));
if ($chkid > 0)
return errjson('一周内只能建立一条API通道');
$secret = randstr(10) . randstr(10);
try {
$db->begin();
$updata = array();
$updata['apisecret'] = $secret;
$updata['ips'] = '';
$updata['addtimes'] = tostamp();
$updata['pubkey'] = '';
$csql = new \ciy\sql('ap_api');
if ($db->insert($csql, $updata) === false)
throw new \Exception('新增失败:' . $db->error);
$updata['id'] = $db->insert_id();
$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_rekey() {
global $db;
$rsuser = verifyfast();
//if (nopower($db, $rsuser['id'], 'p u'))
// return errjson('您未被授权操作');
$post = new \ciy\post();
$id = $post->getint('id');
$secret = randstr(10) . randstr(10);
try {
$db->begin();
$updata = array();
$updata['apisecret'] = $secret;
$csql = new \ciy\sql('ap_api');
$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());
}
$ret['secret'] = $secret;
return succjson($ret);
}
public static function json_edit() {
global $db;
$rsuser = verifyfast();
//if (nopower($db, $rsuser['id'], 'p u'))
// return errjson('您未被授权操作');
$post = new \ciy\post();
$id = $post->getint('id');
$ips = explode("\n", $post->get('ips'));
$iparr = array();
foreach ($ips as $ip) {
$ip = trim($ip);
if (empty($ip))
continue;
if (!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE))
return errjson('公网IP格式错误:' . $ip);
$iparr[] = $ip;
}
try {
$db->begin();
$updata = array();
$updata['ips'] = implode("\n", $iparr);
$csql = new \ciy\sql('ap_api');
$csql->where('id', $id);
if ($db->update($csql, $updata) === false)
throw new \Exception('更新失败:' . $db->error);
$updata['id'] = $id;
//savelogdb($db, $rsuser['id'], 'ap_api', $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_pubkey() {
global $db;
$rsuser = verifyfast();
//if (nopower($db, $rsuser['id'], 'p u'))
// return errjson('您未被授权操作');
$post = new \ciy\post();
$pubkey = $post->get('pubkey');
$id = $post->getint('id');
$oridata = $post->get('oridata');
$hash = $post->get('hash');
$pubkey = $post->get('pubkey');
$csql = new \ciy\sql('ap_api');
$csql->where('id', $id);
$apirow = $db->getone($csql);
if (!is_array($apirow))
return errjson('API通道不存在');
if (!empty($apirow['pubkey']))
return errjson('该API通道已设置公钥');
$publickey = $pubkey;
if (strpos($publickey, '-----BEGIN PUBLIC KEY-----') === false)
$publickey = "-----BEGIN PUBLIC KEY-----\n" . wordwrap($publickey, 64, "\n") . "\n-----END PUBLIC KEY-----";
$pubkey = str_replace('-----BEGIN PUBLIC KEY-----', '', $pubkey);
$pubkey = str_replace('-----END PUBLIC KEY-----', '', $pubkey);
$pubkey = str_replace(["\r", "\n"], '', $pubkey);
$pubkey = trim($pubkey);
$csql = new \ciy\sql('ap_api');
$csql->where('pubkey', $pubkey);
$chkrow = $db->getone($csql);
if (is_array($chkrow))
return errjson('该公钥已存在');
$sign = $post->get('sign');
$timestamp = toint(substr($oridata, 3));
if (abs(time() - $timestamp) > 300)
return errjson('请在5分钟内完成操作');
if (sha256($oridata) != $hash)
return errjson('hash数据校验失败');
$signbin = hex2bin($sign);
if ($signbin === false)
return errjson('签名格式错误');
$hashbin = hex2bin($hash);
if ($hashbin === false)
return errjson('hash格式错误');
$result = openssl_verify($hashbin, $signbin, $publickey, OPENSSL_ALGO_SHA256);
if ($result === 0)
return errjson('验签失败');
else if ($result !== 1)
return errjson('验签错误:' . openssl_error_string());
$hash = strtoupper($hash);
try {
$db->begin();
$updata = array();
$updata['pubkey'] = $pubkey;
$csql = new \ciy\sql('ap_api');
$csql->where('id', $id);
if ($db->update($csql, $updata) === false)
throw new \Exception('更新失败:' . $db->error);
$updata['id'] = $id;
//savelogdb($db, $rsuser['id'], 'ap_api', $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'], 'p d'))
// return errjson('您未被授权操作');
$post = new \ciy\post();
$ids = $post->get('ids');
if (empty($ids))
return errjson('请选择至少一条');
$csql = new \ciy\sql('ap_api');
$csql->where('id in', $ids);
$rows = $db->get($csql);
$vids = array();
try {
$db->begin();
foreach ($rows as $row) {
$delid = $row['id'];
delcheck($db, $delid, 'ap_transfer', 'apiid', '转账订单');
//delall($db, $delid, 'tablexx', 'xxid', '运动员'); //deltimeall
delme($db, $delid, 'ap_api');
$vids[] = $delid;
}
$db->commit();
} catch (\Exception $ex) {
$db->rollback();
savelogfile('err_db', $ex->getMessage());
return errjson($ex->getMessage());
}
$ret['ids'] = $vids;
return succjson($ret);
}
}

101
web/admin/ap/transfer.html Normal file
View File

@ -0,0 +1,101 @@
<!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>
<a class="lang btn" onclick="exportxls()">导出</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>
|
</div>
<div class="page"></div>
</div>
</div>
</div>
<script type="text/javascript" src="/jscss/ciy.js"></script>
<script type="text/javascript" src="/jscss/ciycmp.js"></script>
<script type="text/javascript" src="/jscss/ciytable.js"></script>
<script type="text/javascript" src="../common.js"></script>
<script type="text/javascript">
'use strict';
var table;
var Glob = {};
ciyfn.pageload(function () {
//Glob.urlp = ciyfn.urlparam();
table = new ciyclass.table({
dom: '.table'
, url: 'list'
, pagecount: 10
, fn_beforedata: function (json) {
ciyfn.fillsearch({
searchdom: '.search'
, data: json
, liall: '全部'
, lidata: 'orderstatus'
, liclick: function (dom) {
table.search(dom, 'li');
}
});
return json;
}
, fn_tdcontent: function (key, datashow, field, data) {
if (key == 'id') {
return 'P' + datashow;
}
if (key == '_btn') {
var html = '';
if (data['pubkeyid'] > 0)
html += `<a class="lang btn" onclick="menubtn(this, 'checksign')">验签</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 == 'checksign') {
ciyfn.callfastfunc(dom, '', 'checksign', { id: id }, function (json) { ciyfn.alert('数字证书验签通过') });
}
}
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>

155
web/admin/ap/transfer.php Normal file
View File

@ -0,0 +1,155 @@
<?php
namespace web\admin\ap;
class transfer {
static function setwhere($db, $post) {
$query = $post->get('query');
$csql = new \ciy\sql('ap_transfer');
$liid = objint($query, 'liid');
if ($liid > 0)
$csql->where('orderstatus', $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->wheredaterange('addtimes', objstr($query, 'addtimes'));
$csql->where('thirdno like', objstr($query, 'thirdno'));
$order = objstr($query, 'order', 'id desc');
$csql->order($order);
$query['order'] = $order;
return [$query, $csql];
}
public static function json_list() {
global $db;
$rsuser = verifyfast();
$post = new \ciy\post();
list($where, $csql) = self::setwhere($db, $post);
$pageno = $post->getint('pageno', 1);
$pagecount = $post->getint('pagecount', 10);
$csql->limit($pageno, $pagecount);
$mainrowcount = $post->getint('count');
$rows = $db->get($csql, $mainrowcount);
if ($rows === false)
return errjson($db->error);
$ret = array('where' => $where, 'pageno' => $pageno, 'pagecount' => $pagecount, 'count' => $mainrowcount, 'list' => $rows);
if ($post->getbool('field')) {
$field = array();
$fshow = $db->getfield($field, 'ap_transfer');
foreach ($field as $fr => $v) {
if (get('_' . $fr))
$field[$fr]['c'] = ',' . $field[$fr]['c'];
}
$fshow = fieldadd($fshow, $field, 0, '_btn', '操作');
$ret['field'] = $field;
$ret['fshow'] = $fshow;
}
if ($post->getbool('once')) {
$ret['once'] = array();
$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' => 'daterange', 'form' => 'addtimes', 'name' => '创建时间');
$input[] = array('type' => 'input', 'form' => 'thirdno', 'name' => '三方单号', 'prop' => ' style="width:8em;"');
$ret['once']['input'] = $input;
}
return succjson($ret);
}
public static function json_checksign() {
global $db;
$post = new \ciy\post();
$id = $post->getint('id');
$csql = new \ciy\sql('ap_transfer');
$csql->where('id', $id);
$orderrow = $db->getone($csql);
if (!is_array($orderrow))
return errjson('数据不存在');
$csql = new \ciy\sql('ap_api');
$csql->where('id', $orderrow['apiid']);
$apirow = $db->getone($csql);
if (!is_array($apirow))
return errjson('API不存在');
$signs = array();
$waitsignstr = 'amount=' . $orderrow['amount'] . ',addtimes=' . $orderrow['addtimes'];
$signs[] = array('hash' => hash('sha256', $waitsignstr), 'sign' => $orderrow['signature']);
$retsign = self::verifysign_api($apirow['pubkey'], $signs);
if (is_string($retsign))
return errjson($retsign);
return succjson();
}
static function verifysign_api($signKey, $signs) {
if (strpos($signKey, '-----BEGIN RSA PUBLIC KEY-----') === false && strpos($signKey, '-----BEGIN PUBLIC KEY-----') === false)
$signKey = "-----BEGIN PUBLIC KEY-----\n" . wordwrap($signKey, 64, "\n") . "\n-----END PUBLIC KEY-----";
foreach ($signs as $sign) {
$signbin = hex2bin($sign['sign']);
if ($signbin === false)
return errjson('签名格式错误');
$hashbin = hex2bin($sign['hash']);
$result = openssl_verify($hashbin, $signbin, $signKey, OPENSSL_ALGO_SHA256);
if ($result === 0)
return '数字证书验签失败';
else if ($result !== 1)
return '数字证书验签错误:' . openssl_error_string();
return true;
}
}
public static function json_exportxls() {
global $db;
$rsuser = verifyfast();
//if (nopower($db, $rsuser['id'], 'p e'))
// return errjson('您未被授权操作');
$post = new \ciy\post();
list($where, $csql) = self::setwhere($db, $post);
$rows = $db->get($csql);
if (count($rows) > 10000)
return errjson('将导出' . count($rows) . '条不建议超过1万条请筛选缩小范围');
$fields = array();
$fields[] = array('style' => 'l', 'width' => 60, 'field' => 'id', 'name' => '行码');
$fields[] = array('style' => 'l', 'width' => 100, 'field' => 'orderstatus', 'name' => '状态');
$fields[] = array('style' => 'r', 'width' => 100, 'field' => 'amount', 'name' => '金额');
$fields[] = array('style' => 'l', 'width' => 100, 'field' => 'addtimes', 'name' => '创建时间');
$fields[] = array('style' => 'l', 'width' => 100, 'field' => 'uptimes', 'name' => '完成时间');
$fields[] = array('style' => 'l', 'width' => 150, 'field' => 'thirdno', 'name' => '订单号');
$fields[] = array('style' => 'l', 'width' => 150, 'field' => 'apiuser', 'name' => 'APIID');
$fields[] = array('style' => 'l', 'width' => 150, 'field' => 'signature', 'name' => '签名');
$code_orderstatus = getcatas($db, 'orderstatus');
$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 == 'orderstatus')
$val = ccode($code_orderstatus, $val);
if ($field == 'amount')
$val = number_format($val / 100, 2);
if ($field == 'addtimes')
$val = ($val == 0 ? '--' : date('Y-m-d H:i', $val));
if ($field == 'uptimes')
$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'] = '转账单数据报表';
$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));
}
}

View File

@ -12,7 +12,7 @@ var Gtokensalt string //登录盐值
var Gdefpass string //默认密码
func init() {
Gtokenfield = "ciyadm"
Gtokensalt = "ast34h$2"
Gtokensalt = "bka02$59gG"
Gdefpass = "1q2w"
}
func Verifyfast(db *c.CiyMysql, post *c.CiyPost) (map[string]any, int) {

View File

@ -1,9 +1,14 @@
var ciy_vars = {
"tokenfield": "ciyadm"
, "tokensalt": "ast34h$3"
, "tokensalt": "bka02$59gG"
, "uploadurl": "admin/upload"
, "loginurl": "admin/login.html"
, "dupsec": 60
, "storselect": '/'
, "storlist": { '/': '/ud/', 'A': 'https://cf5.nyyzsoft.cn/ud/', 'Z': 'https://cf5.nyyzsoft.cn/ud/' }
, "storlist": { '/': '/ud/', 'A': 'https://cf5.nyyzsoft.cn/ud/' }
, "langs": {
'': '简体中文'
, 'en': 'English'
, 'ja': '日本語'
}
}

View File

@ -19,10 +19,10 @@
$_token = array();
$_token['type'] = 'cookie'; //cookie(更安全) 、 localstorage(兼容性好)
$_token['swapsec'] = 10; //更换JWT时间
$_token['expsec'] = 86400; //过期退出时间
$_token['swapsec'] = 3600; //更换JWT时间
$_token['expsec'] = 86400*7; //过期退出时间
$_token['field'] = 'ciyadm';
$_token['salt'] = 'ast34h$3'; //做数据加解密时的加密因子,每个项目都不要相同。
$_token['salt'] = 'bka02$59gG'; //做数据加解密时的加密因子,每个项目都不要相同。
function verifyfast() {
$rsuser = verifyuser();

View File

@ -127,10 +127,6 @@
<a class="btn sm" href="demo_dom.html" target="_blank">ciydom</a>
dom封装。替代jquery
</div>
<div>
<a class="btn sm" href="bs/" target="_blank">bigscreen</a>
数据大屏实现原理。
</div>
<div>
<a class="btn sm" href="demo_shadow.html" target="_blank">shadow</a>
文字阴影CSS实现原理。
@ -163,38 +159,10 @@
<a class="btn sm" href="demo_proxy.html" target="_blank">proxy prop</a>
Proxy响应式示例。
</div>
<div>
<a class="btn sm" href="demo_rsa.html" target="_blank">rsa sign</a>
RSA私钥签名
</div>
<div>
<a class="btn sm" href="demo_ecc_ukey_ad.html" target="_blank">ecc sign</a>
ECC UKey签名(VN)
</div>
<div>
<a class="btn sm" href="demo_web3.html" target="_blank">web3</a>
web3登录、签名、验签
</div>
<div>
<a class="btn sm" href="dyn/mail.html" target="_blank">mail</a>
Mail收发邮件。
</div>
<div>
<a class="btn sm" href="dyn/openai.html" target="_blank">deepseek</a>
DeepSeek接口。
</div>
<div>
<a class="btn sm" href="lab/tesseract.html" target="_blank">tesseract</a>
文字OCR识别。
</div>
<div>
<a class="btn sm" href="tool_alipaycb.html" target="_blank">alipaycb</a>
阿里API回调数据分析
</div>
<div>
<a class="btn sm" href="tool_realip.html" target="_blank">realip</a>
复杂网络环境下获取真实ip
</div>
</div>
<div class="ciy-form inline"><label>滑动选择</label>

View File

@ -0,0 +1,96 @@
<!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="ciy-caption">
<div class="mk"></div>
<div class="title">交互示例</div>
<div class="sub">com</div>
</div>
<div class="bg2 px3 py3">
<div>
<a class="btn sm" href="/admin/wsdemo/" target="_blank">websocket</a>
websocket示例。
</div>
<div>
<a class="btn sm" href="dyn/sse.html" target="_blank">SSE</a>
SSE示例。
</div>
<div>
<a class="btn sm" href="bs/" target="_blank">bigscreen</a>
数据大屏实现原理。
</div>
<div>
<a class="btn sm" href="demo_rsa.html" target="_blank">rsa sign</a>
RSA私钥签名
</div>
<div>
<a class="btn sm" href="demo_ecc_ukey_ad.html" target="_blank">ecc sign</a>
ECC UKey签名(VN)
</div>
<div>
<a class="btn sm" href="demo_web3.html" target="_blank">web3</a>
web3登录、签名、验签
</div>
<div>
<a class="btn sm" href="dyn/mail.html" target="_blank">mail</a>
Mail收发邮件。
</div>
<div>
<a class="btn sm" href="dyn/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>
</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 () {
ciyfn.fillsearch({
searchdom: '.search'
, data: { once: {} }
, card_click: function (lidom) {
console.log(lidom);
//table.search(lidom,'li');
}
});
ciycmp({ dom: '[com=select1]', range: 'auditstatus', all: '全部' });
ciycmp({ dom: '[com=radio1]', range: 'auditstatus', all: '全部' });
ciycmp({ dom: '[com=switch1]' });
ciycmp({ dom: '[com=month1]' });
ciycmp({ dom: '[com=day1]' });
ciycmp({ dom: '[com=daterange1]' });
//$('[wit-seltransfer]').multiselect({ name: 'baseplantids', data: 'auditstatus' });
});
</script>
</body>
</html>

View File

@ -506,6 +506,9 @@
</svg></a>
<!-- <span class="ciy-badge">9</span> -->
</li>
<li class="btn-menu cselectlang"><a>🌐</a>
<ul class="ciy-popmenu" style="top: 4em; right: 0.2em;"></ul>
</li>
<li class="btn-menu"><a id="nav_user" style="white-space: nowrap;"></a>
<!-- <span class="ciy-badge-dot"></span> -->
<ul class="ciy-popmenu" style="top: 4em; right: 0.2em;" id="nav_userpopmenu"></ul>
@ -674,6 +677,12 @@
}
} else if (href.substring(0, 4) == 'http') {
window.open(href);
} else if (href.substring(0, 4) == '!DAO') {
ciyfn.callfunc("godao", { url: href.substring(4) }, function (json) {
thos.page_ifropen(json.url, txt);
if (window.innerWidth < 992)
thos.page_shrink();
});
} else {
if (href.substring(0, 5) == '$http')
href = href.substring(1);
@ -854,8 +863,8 @@
ableclose = '';
else
ableclose = '<i><svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><path class="svgfill" d="M512 0C229.216 0 0 229.216 0 512s229.216 512 512 512 512-229.216 512-512S794.784 0 512 0zM723.2 642.752c22.112 22.112 22.112 58.336 0 80.448s-58.336 22.112-80.448 0L512 592.448 381.248 723.2c-22.112 22.112-58.336 22.112-80.448 0s-22.112-58.336 0-80.448L431.552 512 300.8 381.248c-22.112-22.112-22.112-58.336 0-80.448s58.336-22.112 80.448 0L512 431.552 642.752 300.8c22.112-22.112 58.336-22.112 80.448 0s22.112 58.336 0 80.448L592.448 512 723.2 642.752z"></path></svg></i>';
if (url.indexOf('http') === 0)
url = '';
if (url.indexOf('token=') > 0)
url = url.substring(0, url.indexOf('token=') + 6);
tabsuldom.append("<li draggable='true' class='active' data-tit='" + eletxt + "' title='" + url + "'><div><a>" + ciyfn.lang(txt) + "</a>" + ableclose + "</div></li>");
//滚动到最后
tabsdom[0].scrollLeft = tabsdom.width() * 2;
@ -891,8 +900,13 @@
}
this.page_refresh = function () {
var domifm = $5("#id_ifms>iframe.active");
if (domifm.length == 1)
domifm[0].contentWindow.location.reload(); //domifm.attr('src', domifm.attr('src'));
if (domifm.length == 1) {
try {
domifm[0].contentWindow.location.reload();//domifm.attr('src', domifm.attr('src'));
} catch (error) {
ciyfn.sendsignal(domifm[0].contentWindow, 'reload');
}
}
}
this.page_ifrclose = function (domtab) {
var txt = domtab.attr('data-tit');
@ -950,6 +964,13 @@
$5('.ciy-pageload').html(json.errmsg);
}
});
if (isobj(ciy_vars.langs)) {
var html = '';
for (var i in ciy_vars.langs)
html += '<li><a onclick="ciyfn.setlang(\'' + i + '\')">' + ciy_vars.langs[i] + '</a></li>';
$5('.cselectlang ul').html(html);
} else
$5('.cselectlang').hide();
});
window.addEventListener('message', function (event) {
if (!event.data.func)

View File

@ -13,7 +13,7 @@ class index {
$csql = new \ciy\sql('zc_menu');
$csql->where('isuse', 1)->order('csort desc,id')->column('id,upid,name,url,pow');
$ret['menu'] = $db->get($csql);
if($ret['menu'] === false)
if ($ret['menu'] === false)
return errjson('菜单获取失败:' . $db->error);
if (count($ret['menu']) == 0)
$ret['menu'][] = array('id' => 2, 'upid' => 0, 'name' => '您无任何菜单权限', 'url' => '', 'pow' => '', 'csort' => 0);
@ -60,6 +60,23 @@ class index {
$db->delete($csql);
return succjson();
}
public static function json_godao() {
$rsuser = verifyfast();
$post = new \ciy\post();
$url = $post->get('url');
$cfg = webini('ciyapi');
$apiid = $cfg['apiid'];
$apikey = $cfg['apikey'];
$url = 'https://dao.local.ciy.cn' . $url;
if (strpos($url, '?') === false)
$url .= '?';
else
$url .= '&';
$time = time();
$url .= 'token=' . $apiid . 'I' . $time . 'I' . sha256($apiid . $time . $apikey);
$ret['url'] = $url;
return succjson($ret);
}
public static function json_setssh() {
global $db;
$rsuser = verifyfast();

View File

@ -98,9 +98,6 @@
<a class="btn-menu btn-menu-caret">
<span class="lang">选择语言</span>
<ul class="ciy-popmenu">
<li onclick="ciyfn.setlang()">简体中文</li>
<li onclick="ciyfn.setlang('en')">English</li>
<li onclick="ciyfn.setlang('ja')">日本語</li>
</ul>
</a>
</div>
@ -150,6 +147,13 @@
'use strict';
var Glob = {};
ciyfn.pageload(function () {
if (isobj(ciy_vars.langs)) {
var html = '';
for (var i in ciy_vars.langs)
html += '<li><a onclick="ciyfn.setlang(\'' + i + '\')">' + ciy_vars.langs[i] + '</a></li>';
$5('.cselectlang ul').html(html);
} else
$5('.cselectlang').hide();
var debuguser = ciyfn.getstorage('_debuguser10');
if (isarray(debuguser)) {
for (var i in debuguser) {

View File

@ -40,7 +40,7 @@ class login {
$csql = new \ciy\sql('zc_admin');
$csql->where('id', $rsuser['id']);
$db->update($csql, $updata);
savelog($db, $rsuser['id'], 'LOGINERR', '用户[' . $user . ']登录密码错误 密码1:[' . sha256('1' . $_token['salt']) . ']');
savelog($db, $rsuser['id'], 'LOGINERR', '用户[' . $user . ']登录密码错误 密码123654:[' . sha256('123654' . $_token['salt']) . ']');
return errjson('用户名或密码错误.');
}
$id = $rsuser['id'];

View File

@ -92,7 +92,7 @@ func Debug_user_update(w http.ResponseWriter, r *http.Request) bool {
if userid == 0 {
return false
}
if admin.Nopower(c.CiyDB, userid, "p900u") {
if admin.Nopower(c.CiyDB, userid, "p991u") {
return c.ErrJSON(w, "您未被授权操作")
}
id := post.Getint("id")
@ -167,7 +167,7 @@ func Debug_user_del(w http.ResponseWriter, r *http.Request) bool {
if userid == 0 {
return false
}
if admin.Nopower(c.CiyDB, userid, "p900u") {
if admin.Nopower(c.CiyDB, userid, "p991u") {
return c.ErrJSON(w, "您未被授权操作")
}
ids := post.Get("ids")
@ -204,7 +204,7 @@ func Debug_user_getlocal(w http.ResponseWriter, r *http.Request) bool {
if userid == 0 {
return false
}
if admin.Nopower(c.CiyDB, userid, "p900n") {
if admin.Nopower(c.CiyDB, userid, "p991n") {
return c.ErrJSON(w, "您未被授权操作")
}
targettype := post.Getint("targettype")

View File

@ -62,7 +62,7 @@ class debug_user {
global $db;
$rsuser = verifyfast();
if (nopower($db, $rsuser['id'], 'p900u'))
if (nopower($db, $rsuser['id'], 'p991u'))
return errjson('您未被授权操作');
$post = new \ciy\post();
@ -130,7 +130,7 @@ class debug_user {
global $db;
$rsuser = verifyfast();
if (nopower($db, $rsuser['id'], 'p900u'))
if (nopower($db, $rsuser['id'], 'p991u'))
return errjson('您未被授权操作');
$post = new \ciy\post();
@ -164,7 +164,7 @@ class debug_user {
global $db;
$rsuser = verifyfast();
if (nopower($db, $rsuser['id'], 'p900n'))
if (nopower($db, $rsuser['id'], 'p991n'))
return errjson('您未被授权操作');
$post = new \ciy\post();

View File

@ -5,7 +5,7 @@ namespace web\admin\rigger;
class logfile {
public static function json_init() {
global $logpath;
Verifyfast();
verifyfast();
$files = scandir($logpath);
$logfiles = array();
foreach ($files as $file) {
@ -17,7 +17,11 @@ class logfile {
return succjson($ret);
}
public static function json_clear() {
global $db;
global $logpath;
$rsuser = verifyfast();
if (nopower($db, $rsuser['id'], 'p554d'))
return errjson('您未被授权操作');
$post = new \ciy\post();
$param = $post->get('param');
$logfile = $logpath . $param . '.log';

View File

@ -72,7 +72,7 @@ func Menu_update(w http.ResponseWriter, r *http.Request) bool {
if userid == 0 {
return false
}
if admin.Nopower(c.CiyDB, userid, "p903u") {
if admin.Nopower(c.CiyDB, userid, "p980u") {
return c.ErrJSON(w, "您未被授权操作")
}
id := post.Getint("id")
@ -140,7 +140,7 @@ func Menu_del(w http.ResponseWriter, r *http.Request) bool {
if userid == 0 {
return false
}
if admin.Nopower(c.CiyDB, userid, "p903d") {
if admin.Nopower(c.CiyDB, userid, "p980d") {
return c.ErrJSON(w, "您未被授权操作")
}
ids := post.Get("ids")
@ -179,7 +179,7 @@ func Menu_modifyupid(w http.ResponseWriter, r *http.Request) bool {
if userid == 0 {
return false
}
if admin.Nopower(c.CiyDB, userid, "p903u") {
if admin.Nopower(c.CiyDB, userid, "p980u") {
return c.ErrJSON(w, "您未被授权操作")
}
id := post.Getint("id")
@ -225,7 +225,7 @@ func Menu_multiadd(w http.ResponseWriter, r *http.Request) bool {
if userid == 0 {
return false
}
if admin.Nopower(c.CiyDB, userid, "p903u") {
if admin.Nopower(c.CiyDB, userid, "p980u") {
return c.ErrJSON(w, "您未被授权操作")
}
upid := post.Getint("upid")
@ -288,7 +288,7 @@ func Menu_seticon(w http.ResponseWriter, r *http.Request) bool {
if userid == 0 {
return false
}
if admin.Nopower(c.CiyDB, userid, "p903u") {
if admin.Nopower(c.CiyDB, userid, "p980u") {
return c.ErrJSON(w, "您未被授权操作")
}
id := post.Getint("id")

View File

@ -51,7 +51,7 @@ class menu {
global $db;
$rsuser = verifyfast();
if (nopower($db, $rsuser['id'], 'p903u'))
if (nopower($db, $rsuser['id'], 'p980u'))
return errjson('您未被授权操作');
$post = new \ciy\post();
$updata = array();
@ -117,7 +117,7 @@ class menu {
global $db;
$rsuser = verifyfast();
if (nopower($db, $rsuser['id'], 'p903d'))
if (nopower($db, $rsuser['id'], 'p980d'))
return errjson('您未被授权操作');
$post = new \ciy\post();
$ids = $post->get('ids');
@ -151,7 +151,7 @@ class menu {
global $db;
$rsuser = verifyfast();
if (nopower($db, $rsuser['id'], 'p903u'))
if (nopower($db, $rsuser['id'], 'p980u'))
return errjson('您未被授权操作');
$post = new \ciy\post();
$id = $post->getint('id');
@ -190,7 +190,7 @@ class menu {
global $db;
$rsuser = verifyfast();
if (nopower($db, $rsuser['id'], 'p903u'))
if (nopower($db, $rsuser['id'], 'p980u'))
return errjson('您未被授权操作');
$post = new \ciy\post();
$upid = $post->getint('upid');
@ -243,7 +243,7 @@ class menu {
global $db;
$rsuser = verifyfast();
if (nopower($db, $rsuser['id'], 'p903u'))
if (nopower($db, $rsuser['id'], 'p980u'))
return errjson('您未被授权操作');
$post = new \ciy\post();
$id = $post->getint('id');

View File

@ -90,7 +90,7 @@ func Mock_update(w http.ResponseWriter, r *http.Request) bool {
if userid == 0 {
return false
}
if admin.Nopower(c.CiyDB, userid, "p911u") {
if admin.Nopower(c.CiyDB, userid, "p942u") {
return c.ErrJSON(w, "您未被授权操作")
}
id := post.Getint("id")
@ -167,7 +167,7 @@ func Mock_del(w http.ResponseWriter, r *http.Request) bool {
if userid == 0 {
return false
}
if admin.Nopower(c.CiyDB, userid, "p911u") {
if admin.Nopower(c.CiyDB, userid, "p942u") {
return c.ErrJSON(w, "您未被授权操作")
}
ids := post.Get("ids")

View File

@ -17,6 +17,7 @@
<div class="sbtns">
<button class="lang btn" type="submit">查询</button>
<a class="lang btn def" onclick="pagehelp()">帮助</a>
<a class="lang btn succ" onclick="testmock()">mock示例</a>
</div>
</div>
</form>
@ -37,7 +38,8 @@
<div id="alert_pagehelp" style="display:none;">
<b>支持Apifox/Postman等Mock调试工具</b>
<div style="margin: 0 0 1em 1em;">
JSON中填入http://127.0.0.1:xxx/xxx<br />
原始访问地址: https://xxx.local.ciy.cn/z/?func=admin/rigger/mock.init<br />
或: https://xxx.local.ciy.cn/ajax/admin/rigger/mock.init<br />
</div>
<b>支持在线Mock模式</b>
<div style="margin: 0 0 1em 1em;">
@ -46,7 +48,7 @@
target=zc_ymock (数据库表名)<br />
重启后生效<br />
</div>
<b>支持本地文件模式</b>
<b>支持本地文件模式 (即将移除)</b>
<div style="margin: 0 0 1em 1em;">
在web/ud/mock/文件夹下建立对应空间目录。<br />
例如: func=admin/rigger/mock.init<br />
@ -90,12 +92,11 @@
if (key == 'mock') {
var html = '';
html += '<div style="padding:0.3em;">接口名: <input style="width:16em;" onkeydown="btnset(this)" type="text" name="name" value="' + data['name'] + '"/></div>';
html += '<div style="padding:0.3em;">类空间: <input style="width:16em;" onkeydown="btnset(this)" class="imp" type="text" name="upath" value="' + data['upath'] + '"/></div>';
html += '<div style="padding:0.3em;">函数名: <input style="width:16em;" onkeydown="btnset(this)" class="imp" type="text" name="ufunc" value="' + data['ufunc'] + '"/></div>';
html += '<div style="padding:0.3em;">类.函数 <input style="width:16em;" onkeydown="btnset(this)" class="imp" type="text" name="ufunc" value="' + data['ufunc'] + '"/></div>';
return html;
}
if (key == 'mockjson') {
return '<textarea style="height:9em;" onkeydown="btnset(this)" name="' + key + '">' + datashow + '</textarea>';
return '<textarea style="height:6em;" onkeydown="btnset(this)" name="' + key + '">' + datashow + '</textarea>';
}
if (key == '_btn') {
var html = '<a class="lang btn def upbtn" onclick="menubtn(this, \'edit\')">' + (data['id'] == 0 ? '新增' : '更新') + '</a>';
@ -118,6 +119,12 @@
, content: document.getElementById("alert_pagehelp").innerHTML
});
}
function testmock() {
ciyfn.toast('F12查看');
ciyfn.callfunc('testmock', { abc: 'def' }, function (json) {
console.log(json);
});
}
function menubtn(dom, btn) {
var trdom = $5(dom).parent('tr');
var id = trdom.attr('data-id');
@ -138,7 +145,7 @@
html += '<div class="ciy-form col-24 col-sm-24">';
html += '<label class="lang">请求时间</label>';
html += '<div>';
html += ciyfn.todatetime(dat.lasttimes);
html += ciyfn.todatetime(dat.lasttimes, 'Y-m-d H:i:s');
html += '</div>';
html += '</div>';
html += '<div class="ciy-form col-24 col-sm-24">';

View File

@ -4,10 +4,9 @@ namespace web\admin\rigger;
class mock {
static function setwhere($db, $post) {
$query = $post->get('query');
$query = $post->get('query', array());
$csql = new \ciy\sql('zc_ymock');
$csql->where('name like', objstr($query, 'name'));
$csql->where('upath like', objstr($query, 'upath'));
$csql->where('ufunc like', objstr($query, 'ufunc'));
$order = objstr($query, 'order', 'id desc');
$csql->order($order);
@ -24,7 +23,7 @@ class mock {
$csql->limit($pageno, $pagecount);
$mainrowcount = $post->getint('count');
$rows = $db->get($csql, $mainrowcount);
$rows[] = array('id' => 0, 'name' => '', 'upath' => '', 'ufunc' => '', 'mockjson' => '{"code":1}');
$rows[] = array('id' => 0, 'name' => '', 'ufunc' => '', 'mockjson' => '{"code":1}');
$ret = array('where' => $where, 'pageno' => $pageno, 'pagecount' => $pagecount, 'count' => $mainrowcount, 'list' => $rows);
if ($post->getbool('field')) {
$field = array();
@ -44,10 +43,7 @@ class mock {
'type' => 'input', 'form' => 'name', 'name' => '名称', 'prop' => ' style="width:8em;"'
);
$input[] = array(
'type' => 'input', 'form' => 'upath', 'name' => '类空间', 'prop' => ' style="width:8em;"'
);
$input[] = array(
'type' => 'input', 'form' => 'ufunc', 'name' => '函数名', 'prop' => ' style="width:8em;"'
'type' => 'input', 'form' => 'ufunc', 'name' => '类.函数', 'prop' => ' style="width:8em;"'
);
$ret['once']['input'] = $input;
}
@ -57,12 +53,11 @@ class mock {
public static function json_update() {
global $db;
$rsuser = verifyfast();
if (nopower($db, $rsuser['id'], 'p911u'))
if (nopower($db, $rsuser['id'], 'p942u'))
return errjson('您未被授权操作');
$post = new \ciy\post();
$id = $post->getint('id');
$name = $post->get('name');
$upath = $post->get('upath');
$ufunc = $post->get('ufunc');
$mockjson = $post->get('mockjson', '', 'all');
if (empty($mockjson))
@ -72,10 +67,8 @@ class mock {
if ($jsn == null)
return errjson('JSON格式错误');
}
if (empty($upath))
return errjson('请填写类空间');
if (empty($ufunc))
return errjson('请填写函数');
return errjson('请填写类.函数');
$datarow = null;
@ -89,7 +82,6 @@ class mock {
try {
$db->begin();
$csql = new \ciy\sql('zc_ymock');
$csql->where('upath', $upath);
$csql->where('ufunc', $ufunc);
$csql->column('id');
$chkid = toint($db->get1($csql));
@ -98,7 +90,6 @@ class mock {
$updata = array();
$updata['name'] = $name;
$updata['upath'] = $upath;
$updata['ufunc'] = $ufunc;
$updata['mockjson'] = $mockjson;
$csql = new \ciy\sql('zc_ymock');
@ -127,7 +118,7 @@ class mock {
global $db;
$rsuser = verifyfast();
if (nopower($db, $rsuser['id'], 'p911u'))
if (nopower($db, $rsuser['id'], 'p942u'))
return errjson('您未被授权操作');
$post = new \ciy\post();
$ids = $post->get('ids');

View File

@ -94,7 +94,7 @@ func Power_update(w http.ResponseWriter, r *http.Request) bool {
if userid == 0 {
return false
}
if admin.Nopower(c.CiyDB, userid, "p910u") {
if admin.Nopower(c.CiyDB, userid, "p990u") {
return c.ErrJSON(w, "您未被授权操作")
}
id := post.Getint("id")
@ -168,7 +168,7 @@ func Power_del(w http.ResponseWriter, r *http.Request) bool {
if userid == 0 {
return false
}
if admin.Nopower(c.CiyDB, userid, "p910u") {
if admin.Nopower(c.CiyDB, userid, "p990u") {
return c.ErrJSON(w, "您未被授权操作")
}
ids := post.Get("ids")

View File

@ -64,7 +64,7 @@ class power {
global $db;
$rsuser = verifyfast();
if (nopower($db, $rsuser['id'], 'p910u'))
if (nopower($db, $rsuser['id'], 'p990u'))
return errjson('您未被授权操作');
$post = new \ciy\post();
$id = $post->getint('id');
@ -131,7 +131,7 @@ class power {
global $db;
$rsuser = verifyfast();
if (nopower($db, $rsuser['id'], 'p910u'))
if (nopower($db, $rsuser['id'], 'p990u'))
return errjson('您未被授权操作');
$post = new \ciy\post();
$ids = $post->get('ids');

View File

@ -72,6 +72,7 @@
<h1 class="lang cursor-p" onclick="window.open('https://ciy.cn/')">众产 <sup>®</sup></h1>
<div class="cline"></div>
<div class="mt"><span class="lang">您好</span><span id="id_name" style="font-size:1.3em;" class="lang"></span></div>
<div class="m1"><span class="lang">登录账号</span> <span id="id_loginuser"></span></div>
<div class="m1"><span class="lang">所属组织</span> <span id="id_depart" class="lang"></span></div>
<div class="m1"><span class="lang">加入日期</span> <span id="id_addtimes"></span></div>
<div class="m1"><span class="lang">权限范围</span> <span id="id_power"></span></div>
@ -93,9 +94,9 @@
ciyfn.callfunc("init", {}, function (json) {
var me = ciyfn.getstorage(ciy_vars.tokenfield);
$5('#id_name').html(ciyfn.lang(me.name));
$5('#id_loginuser').html(ciyfn.lang(me.mobile));
$5('#id_depart').html(ciyfn.lang(me.depart));
$5('#id_addtimes').html(ciyfn.todatetime(me.addtimes, 'Y年m月d日'));
var powerhtml = '';
if (me.power == '.*.')
powerhtml = '<kbd style="text-shadow:none;">' + ciyfn.lang('超级管理员') + '</kbd>';

View File

@ -8,8 +8,10 @@ class login {
$post = new \ciy\post();
$errs = $post->get('err');
$meid = $post->getint('meid');
foreach ($errs as $err) {
savelog($db, $meid, $err['type'], $err['msg'], false, $err['t']);
if (is_array($errs)) {
foreach ($errs as $err) {
savelog($db, $meid, $err['type'], $err['msg'], false, $err['t']);
}
}
return succjson();
}

12
web/api/test1.php Normal file
View File

@ -0,0 +1,12 @@
<?php
//https://ciyon.local.ciy.cn/ajax/api/test1.t1
namespace web\api;
class test1 {
public static function json_t1() {
$param = array();
$param['time'] = time();
clog($param);
die();
}
}

View File

@ -108,7 +108,7 @@ class v1 {
$hashstr .= $key . '=' . $value . '&';
}
$hashstr = substr($hashstr, 0, -1) . $apirow['apisecret'];
if ($hash != md5($hashstr)) {
if ($hash != sha256($hashstr)) {
return 'hash验证错误';
}
$ip = getip();

View File

@ -39,7 +39,7 @@ class v1_test {
}
$signstr = substr($signstr, 0, -1);
$signstr .= $apisecret;
$hash = md5($signstr);
$hash = sha256($signstr);
$param['hash'] = $hash;
$urlget = 'https://ciyon.local.ciy.cn/ajax/api/v1.' . $func;
$http = new \ciy\http();

View File

@ -1021,6 +1021,21 @@ ciyfn.callfastfunc = function (dom, confirmmsg, func, postparam, succfunc, failf
}, { fail: failfunc });
}
}
ciyclass.loading = function () {
try {
if (window.parent != window && window.parent.ciyclass.loading)
return window.parent.ciyclass.loading();
} catch { }
var htmldom = '<div class="ciy-layer ciy-loading" style="z-index: ' + (ciygv.zindex++) + ';"></div>';
htmldom = $5(htmldom);
$5('body').append(htmldom);
setTimeout(function () { htmldom.addClass("start") }, 50);
this.close = function (cls) {
htmldom.addClass(cls);
setTimeout(function () { $5('.ciy-loading').remove(); }, 600);
}
return this;
}
ciyfn.callfunc = function (funcname, post, successfunc, opn) { //opn showload,method,fail,complete,header,timeout
opn = opn || {};
opn.header = opn.header || {};
@ -1514,8 +1529,10 @@ ciyfn.alert = function (content, cb, opn) {
opn.maskclose = false;
}
opn.autoheight = opn.autoheight || true;
if (!opn.noparent && window.parent != window && window.parent.ciyfn.alert)
return window.parent.ciyfn.alert(opn);
try {
if (!opn.noparent && window.parent != window && window.parent.ciyfn.alert)
return window.parent.ciyfn.alert(opn);
} catch { }
var contentstyle = opn.contentstyle || '';
if (opn.width) {
if (opn.width == 'mb')
@ -1770,8 +1787,10 @@ ciyfn.toast = function (content, cb, opn) {
}
if (opn.maskclose === undefined)
opn.maskclose = true;
if (window.parent != window && window.parent.ciyfn.toast)
return window.parent.ciyfn.toast(opn);
try {
if (window.parent != window && window.parent.ciyfn.toast)
return window.parent.ciyfn.toast(opn);
} catch { }
var htmldom = '<div class="ciy-layer ciy-toast" style="left:-100vw;z-index: ' + ciygv.zindex + ';">' + ciyfn.lang(opn.content) + '</div>';
htmldom = $5(htmldom);
if (opn.maskclose) {
@ -1866,19 +1885,6 @@ ciyfn.showend = function (opn) {
setTimeout(function () { $5('b', viewdom).trigger('click') }, opn.timeout * 1000);
}
}
ciyclass.loading = function () {
if (window.parent != window && window.parent.ciyclass.loading)
return window.parent.ciyclass.loading();
var htmldom = '<div class="ciy-layer ciy-loading" style="z-index: ' + (ciygv.zindex++) + ';"></div>';
htmldom = $5(htmldom);
$5('body').append(htmldom);
setTimeout(function () { htmldom.addClass("start") }, 50);
this.close = function (cls) {
htmldom.addClass(cls);
setTimeout(function () { $5('.ciy-loading').remove(); }, 600);
}
return this;
}
ciyfn.dropmenu = function (dom) {
dom = $5(dom);
if ('ontouchend' in window) {
@ -1923,7 +1929,7 @@ ciyfn.dropmenu = function (dom) {
if (direction == 'lr')
left = domrect.left - menuwidth;
else
left = $5(document).width() - menuwidth - 20;
left = $5(document).width() - menuwidth - 2;
}
if (left < 0)
left = 0;
@ -2738,6 +2744,8 @@ document.addEventListener('DOMContentLoaded', function () {
return;
if (event.data.func == 'chgtheme')
ciy_chgtheme(event.data.data);
else if (event.data.func == 'reload')
location.reload();
else if (event.data.func == 'alert_getwh') {
ciyfn.sendsignal(event.source, 'alert_mywh', { width: document.body.scrollWidth, height: document.body.scrollHeight });
} else {

View File

@ -145,6 +145,22 @@ ciyfn.markdown = function (markdown) {
}
if (bcode)
md += '</kbd>';
bcode = false;
while (true) {
var ind = md.indexOf('**');
if (ind == -1)
break;
var el = '<b>';
if (bcode) {
bcode = false;
el = '</b>';
}
else
bcode = true;
md = md.substring(0, ind) + el + md.substring(ind + 2);
}
if (bcode)
md += '</b>';
while (true) {
let ind = md.indexOf('[');
if (ind === -1)
@ -931,7 +947,7 @@ ciycmpfunc.ciymarkdown = function (opn) {
opn.imgwidth = toint(opn.imgwidth || opn.dom.attr('imgwidth'));
opn.imgheight = toint(opn.imgheight || opn.dom.attr('imgheight'));
opn.width = opn.width || opn.dom.attr('width');
if(opn.width == 'pc')
if (opn.width == 'pc')
opn.width = '50%';
else
opn.width = '418px';
@ -1043,8 +1059,12 @@ ciycmpfunc.ciymarkdown = function (opn) {
var blob = e.clipboardData.items[i].getAsFile();
bb.push(blob);
}
if (e.clipboardData.items[i].type.indexOf("video/mp4") !== -1) {
var blob = e.clipboardData.items[i].getAsFile();
bb.push(blob);
}
}
opn.type = ['JPG', 'PNG'];
opn.type = ['JPG', 'PNG', 'MP4'];
mdedit_uploadfile(bb);
});
opn.dom.on('click', '.btn_help', function (e) {
@ -1058,10 +1078,12 @@ ciycmpfunc.ciymarkdown = function (opn) {
html += '<code>@c</code> 正文居中<br/>';
html += '<code>@r</code> 正文右对齐<br/>';
html += '<code>!imgurl</code> 引用图片imgurl为图片地址<br/>';
html += '<kbd>`</kbd>强调<kbd>`</kbd> 被Tab键上方的波浪键包围代表强调<br/>';
html += '<kbd>[链接文字](网址)</kbd>,如:[众产](https://ciy.cn/)。<br/>';
html += '链接文字可为图片,如[!imgurl](https://ciy.cn/)<br/>';
ciyfn.alert(html);
html += '<code>`强调`</code> 反引号包裹,<kbd>强调</kbd> 效果<br/>';
html += '<code>**加粗**</code> 双星号包裹,<b>加粗</b> 效果<br/>';
html += '<code>[链接文字](网址)</code>,如:[众产](https://ciy.cn/)。<br/>';
html += '<code>[!imgurl](https://ciy.cn/)</code>,图片链接。<br/>';
html += '可在录入区直接 Ctrl+V 粘贴剪贴板中的图片和视频。<br/>';
ciyfn.alert({content:html, width:'30em'});
});
opn.dom.on('click', '.btn_kh', function (e) {
var content = textareadom.val();

View File

@ -774,7 +774,7 @@ ciyfn.fillsearch = function (opn) {
if (w == 'liid') {
$5('li[data-liid]', '.search').removeClass('active');
$5('li[data-liid="' + opn.data.where[w] + '"]', '.search').addClass('active');
} else
} else if(w)
$5('[sechr=' + w + ']', '.search').val(opn.data.where[w]);
}
}

View File

@ -5,30 +5,48 @@ $qstr = get('func'); // 例: admin/rig/user.list
if (!empty($qstr)) {
$qstrarr = explode('.', $qstr);
$ms = timems();
if (count($qstrarr) < 2) {
if (count($qstrarr) != 2) {
echo '{"errmsg":"' . $qstr . '格式错误"}';
die;
}
$qs0 = $qstrarr[0];
$qstrarr[0] = str_replace('\\\\', '\\', 'web\\' . str_replace('/', '\\', $qstrarr[0]));
if (!class_exists($qstrarr[0]))
//先找fun没有找mock最后提示错误
$retarr = null;
if (!class_exists($qstrarr[0])) {
$retarr = array('code' => 9, 'errmsg' => $qstrarr[0] . '无效类');
else if (!method_exists($qstrarr[0], 'json_' . $qstrarr[1]))
} else if (!method_exists($qstrarr[0], 'json_' . $qstrarr[1])) {
$retarr = array('code' => 9, 'errmsg' => $qstr . '无效函数');
else {
}
$db = new ciy\db(); //默认数据库全局变量
if ($retarr === null) {
$qs0 = substr($qs0, 0, strpos($qs0, '/'));
if (file_exists(PATH_WEB . $qs0 . '/common.php'))
require PATH_WEB . $qs0 . '/common.php'; //需要全局业务函数和全局变量
$db = new ciy\db(); //默认数据库全局变量
// $dbrd1 = new ciy\db('rd1');//读库 可实现注册中心取一个空闲实例 业务端判断
// $dbag = new ciy\db('ag');//独立ag库
// web\admin\autotask\task::json_run
$retarr = call_user_func($qstrarr[0] . '::json_' . $qstrarr[1]);
} else {
$csql = new \ciy\sql('zc_ymock');
$csql->where('ufunc', $qstr);
$csql->order('id desc');
$mockrow = $db->getone($csql);
if (is_array($mockrow)) {
$updata = array();
$updata['lastrequest'] = $_SERVER['REQUEST_URI'] . '<br/>' . file_get_contents('php://input');
$updata['lasttimes'] = time();
$csql = new \ciy\sql('zc_ymock');
$csql->where('id', $mockrow['id']);
$db->update($csql, $updata);
echo $mockrow['mockjson'];
die;
}
}
if ($retarr === 'html')
die;
if ($retarr['code'] == 302) {
header('Location: ' . $retarr['errmsg']);
header('Location: ' . $retarr['redirect']);
die;
}
ciy_ouputJSON($retarr, timems() - $ms, $_SERVER['REQUEST_URI']);
@ -75,7 +93,7 @@ if (!empty($qstr)) {
header('X-Accel-Buffering: no');
ob_start();
$retarr = call_user_func($qstrarr[0] . '::sse_' . $qstrarr[1], function ($data, $id = '') {
if(is_object($data) || is_array($data))
if (is_object($data) || is_array($data))
$data = json_encode($data, JSON_UNESCAPED_UNICODE);
// if (strpos($data, "\n") !== false)
// $data = 'base64,' . base64_encode($data);
@ -92,7 +110,7 @@ if (!empty($qstr)) {
});
}
}
if(isset($retarr))
if (isset($retarr))
ciy_ouputJSON($retarr, timems() - $ms, $_SERVER['REQUEST_URI']);
die;
}