★ 建站顺序另见《云酷德建站流程法》(tempx buildlaw.index,打开章程,2026-10-05 定稿):先名后形 → 计划六表 → 补正 → 开工 → newresname 建名 → 照 funtxt 施工 → samekdatatotab 回填 → 验收。
以前文档里写的是「直接调 API 接口」——那是旧约,作废。所有资源的增删改,一律按下述六步走。
GET 本站域名/localxres/funx/commonlogin/?uid=<账号>&pass=<makepass密文>&sysid=<系统id>msg 就是 stoken。随后 Cookie 必须带 三个值:uid、stoken、deadline=time()+3600*72。$leftt>0 拦掉,现象是 302 静默跳转,接口返回空。funx.newresname?restype=<类型>&rescode=<域.名>&sysid=<系统>&restitle=<标题>coode_userlist 中必须 PRIME=1。tempx 的 rescode 若含点号,点前是域、点后是单元名;不含点号则自动补 .index。coode_sysrestypedefine 按 restypecode 查 cloudpath 字段——它就是该类型资源的编辑器地址。cloudpath 值为 mysql 的,说明这类资源基本不落盘,可以直接改数据;值是一条 URL 的,说明会落盘,必须进编辑器改,直接改库会造成库盘不一致。coode_sysrestypedefine 找到该 restypecode 那一行,读它的 cloudpath 字段,那就是现成的完整编辑器地址,? 后面已经把参数位留好了;你要做的只是把占位符换成资源名或该数据的 SNO 序号。https://qianjilian.com/localxres/tempx/tempeditor/index.html?unitid=xianfa.indexhttps://qianjilian.com/localxres/pagex/htmleditor/WrvLoe/index.html?funid=savefunchttps://qianjilian.com/localxres/pagex/htmleditor/WrvLoe/index.html?funid=coode_funsetfile@SNO:12345.funfullcoode_funlist 的 usearea 字段声明:它写明该方法允许被哪个页面调用,形如 tempx.tempeditor.index。pgmark(资源类型.目录.单元),拿它和 usearea 比对,不匹配直接判无权。所以「在哪个页面里调」不是形式,是权限本身。heartbeat 的 refreshtoken 方法:校验 stoken 是否有效、刷新 coode_loginstoken 有效期、并下发 deadline。所有「为什么明明登录了还是没权限」的答案都在这里。下表「编辑器 / 落点」列即 coode_sysrestypedefine.cloudpath 的值(已补全域名前缀),可直接复制使用。
| 类型 | 主表 | 编辑器 / 落点(完整地址) |
|---|---|---|
| funx 函数 | coode_funlist | https://qianjilian.com/localxres/pagex/htmleditor/WrvLoe/index.html?funid=<函数名> |
| clsx 类 | coode_phpcls | https://qianjilian.com/localxres/pagex/htmleditor/WrvLoe/index.html?funid=<类名> |
| sfunx 函数集 | coode_funsetfile | https://qianjilian.com/localxres/pagex/htmleditor/WrvLoe/index.html?funid=coode_funsetfile@SNO:<该数据序号>.funfull |
| dfunx 数据函数 | coode_datafun | https://qianjilian.com/localxres/pagex/htmleditor/WrvLoe/index.html?funid=coode_funsetfile@SNO:<该数据序号>.funfull |
| constx 静态量 | coode_sysconstant | https://qianjilian.com/localxres/pagex/htmleditor/WrvLoe/index.html?funid=coode_funsetfile@SNO:<该数据序号>.funfull |
| configx 系统参数 | coode_sysconfig | https://qianjilian.com/localxres/pagex/htmleditor/WrvLoe/index.html?funid=coode_funsetfile@SNO:<该数据序号>.funfull |
| tempx 模板 | coode_domainunit | https://qianjilian.com/localxres/tempx/tempeditor/index.html?unitid=<域.单元> |
| pagex 页面 | coode_tiny | https://qianjilian.com/localxres/tempx/tinylayeditor/index.html?unitid=<域.单元>&tinyid=<tinymark> |
| mfunx 分布函数 | coode_multifunlist | https://qianjilian.com/localxres/tempx/tinylayeditor/index.html?unitid=resuptool.index&tinyid=o16CUI |
| tabx 表 | coode_tablist | https://qianjilian.com/localxres/funx/anyjsshort/?stid=2qPIqS-sfile:anyjsshort.php-&pnum=150:<表名>&page=1:TABLE_NAME& |
| formx 表单 | coode_shortdata | https://qianjilian.com/localxres/funx/anyjsshort/?datatype=html&stid=keydtly-&pnum=100:<shortid>&page=1:shortid& |
| dataspacex 数据空间 | coode_dataspace | https://qianjilian.com/localxres/tempx/dspcmgr/index.html |
| sysx 系统容器 | coode_sysinformation | mysql:不落盘,可直接改库 |
| appx 应用容器 | coode_appdefault | mysql:不落盘,可直接改库 |
| layx 输出容器 | coode_applay | mysql:不落盘,可直接改库 |
| cdtrdrx 条件跳转 | coode_cdtrdr | mysql:不落盘,可直接改库 |
| parardrx 参数跳转 | coode_parardr | mysql:不落盘,可直接改库 |
| groupx 一级分类 | coode_grouplist | mysql:不落盘,可直接改库 |
| plotx 节点 | coode_plotlist | mysql:不落盘,可直接改库 |
| csspagex 样式页面 | coode_facelist | mysql:不落盘,可直接改库 |
| iconsetx 图标库 | coode_iconset | mysql:不落盘,可直接改库 |
| databasex 数据库 | coode_dblist | mysql:不落盘,可直接改库 |
| afunx 事务函数 | coode_affairfunlist | mysql:不落盘,可直接改库 |
| parax 外部框架 | coode_para | mysql:不落盘,可直接改库 |
| apix 接口密钥 | coode_apipool | mysql:不落盘,可直接改库 |
| smallcssx 小CSS | coode_codedemo | mysql:不落盘,可直接改库 |
统一存放第三方接口的密钥(AK / SK / Token / AppID),不在代码里硬编码,不各建各的表。
以前每个新系统接一个第三方(七牛、百度、火山、高德、GitHub)就顺手建一张配置表,
结果密钥散落各处,谁也说不清存哪。apix 的做法是:所有接口密钥一律进同一张表,
靠 sysid(哪个系统)+ CRTOR(哪个用户/归属人)隔离。
coode_apipool| 字段 | 类型 | 说明 |
|---|---|---|
| SNO | int | 主键 |
| sysid | varchar(50) | ★ 归属系统(tjx / massqrcode / 0 / 1 / v …) |
| apicode | varchar(50) | ★ 资源码,唯一索引。一个接口一条码,如 qnywxh、qnywxl |
| appid | varchar(100) | 应用标识 / 空间名(七牛就是 bucket) |
| apikey | varchar(255) | ★ 主密钥(AK) |
| apival | varchar(255) | ★ 副密钥(SK / 第二个值) |
| apititle | varchar(1024) | 标题,如「七牛云-王晓华接口」 |
| parcode | varchar(100) | 服务商官网,如 https://www.qiniu.com/ |
| partitle | varchar(255) | 服务商名,如「七牛云」「火山」「百度」 |
| CRTOR | varchar(255) | ★ 归属人(多用户隔离就靠它) |
| OLMK | varchar(255) | 唯一标记 |
| OPRT | varchar(1024) | 附加信息(现用于存访问域名) |
| STATUS | decimal | 状态,1 = 启用 |
| CRTM / UPTM | datetime | 创建 / 更新时间 |
| VRT | varchar(255) | 校验值(多为 md5) |
qny。
sysid + CRTOR,谁的系统谁的号,互不干扰
主副密钥apikey 放主密钥,apival 放副密钥/第二个值
空间名七牛这类「空间」概念放 appid,域名通常就是 appid + 域名后缀
附加信息字段不够用时放 OPRT(如访问域名),别再建新表
SELECT appid, apikey, apival, IFNULL(OPRT,'') AS domain
FROM coode_apipool
WHERE sysid = 'tjx'
AND CRTOR = '18841880246'
AND apicode LIKE 'qny%'
AND STATUS = 1
ORDER BY SNO DESC LIMIT 1;
INSERT INTO coode_apipool
(sysid, apicode, appid, apikey, apival, apititle, parcode, partitle,
CRTM, UPTM, CRTOR, OLMK, OPRT, STATUS, STCODE)
VALUES
('tjx', 'qnye74af2', 'wrdstock', '<AK>', '<SK>', '七牛云-18841880246',
'https://www.qiniu.com/', '七牛云', now(), now(),
'18841880246', 'tjxqny18841880246', 'wrdstock.divlovecss.com', 1, '');
POST 本站域名/localxres/funx/savefunc/?fn=SNO:37.apikey@coode_apipool
Cookie: uid=divlovecss; stoken=; deadline=
场景:多用户系统里,每个用户填自己的七牛空间,上传的照片进他自己的空间,互不打混。
sysid = 本系统码(如 tjx)CRTOR = 用户账号(隔离键)apicode = qny + md5(系统码+账号) 前 6 位 → 保证唯一且可复现appid = bucket · apikey = AK · apival = SK · OPRT = 访问域名def acode_of(uid):
return 'qny' + hashlib.md5(('tjxqny' + str(uid)).encode('utf-8')).hexdigest()[:6]
def qn_cfg(uid):
cur.execute("SELECT appid,apikey,apival,IFNULL(OPRT,'') FROM coode_apipool "
"WHERE sysid=%s AND CRTOR=%s AND apicode LIKE %s AND STATUS=1 "
"ORDER BY SNO DESC LIMIT 1", (SYSID, uid, 'qny%'))
r = cur.fetchone()
if not r:
return None
return <'bucket': r[0], 'ak': r[1], 'sk': r[2],
'domain': r[3] or (str(r[0]) + '.divlovecss.com')>
LIKE 'qny%',
那个 % 会被当成参数占位符报
not enough arguments for format string。用参数传值 LIKE %s + 'qny%'。
coode_tjxqny 这类)。
要加接口就往 coode_apipool 插一条,用 sysid + CRTOR 区分。