★ 宪法总纲:编辑任何资源的唯一正确姿势

★ 建站顺序另见《云酷德建站流程法》(tempx buildlaw.index,打开章程,2026-10-05 定稿):先名后形 → 计划六表 → 补正 → 开工 → newresname 建名 → 照 funtxt 施工 → samekdatatotab 回填 → 验收。

以前文档里写的是「直接调 API 接口」——那是旧约,作废。所有资源的增删改,一律按下述六步走。

  1. 先登录,拿三件套
    GET 本站域名/localxres/funx/commonlogin/?uid=<账号>&pass=<makepass密文>&sysid=<系统id>
    返回 JSON 的 msg 就是 stoken。随后 Cookie 必须带 三个值:uid、stoken、deadline=time()+3600*72。
    坑:只带 uid+stoken、不带 deadline,会被 heartbeat 的 $leftt>0 拦掉,现象是 302 静默跳转,接口返回空。
  2. 建资源名
    funx.newresname?restype=<类型>&rescode=<域.名>&sysid=<系统>&restitle=<标题>
    Cookie 里的 uid 在 coode_userlist 中必须 PRIME=1。tempx 的 rescode 若含点号,点前是域、点后是单元名;不含点号则自动补 .index。
  3. 查编辑器地址
    到 coode_sysrestypedefine 按 restypecode 查 cloudpath 字段——它就是该类型资源的编辑器地址。
    分水岭:cloudpath 值为 mysql 的,说明这类资源基本不落盘,可以直接改数据;值是一条 URL 的,说明会落盘,必须进编辑器改,直接改库会造成库盘不一致。
  4. 打开编辑器
    编辑器地址不用猜、不用记——去 coode_sysrestypedefine 找到该 restypecode 那一行,读它的 cloudpath 字段,那就是现成的完整编辑器地址,? 后面已经把参数位留好了;你要做的只是把占位符换成资源名或该数据的 SNO 序号。
    三个完整地址示例:
    https://qianjilian.com/localxres/tempx/tempeditor/index.html?unitid=xianfa.index
    https://qianjilian.com/localxres/pagex/htmleditor/WrvLoe/index.html?funid=savefunc
    https://qianjilian.com/localxres/pagex/htmleditor/WrvLoe/index.html?funid=coode_funsetfile@SNO:12345.funfull
  5. 编辑器里能调哪些后端方法
    由 coode_funlist 的 usearea 字段声明:它写明该方法允许被哪个页面调用,形如 tempx.tempeditor.index。
    heartbeat 会把 HTTP Referer 解析成 pgmark(资源类型.目录.单元),拿它和 usearea 比对,不匹配直接判无权。所以「在哪个页面里调」不是形式,是权限本身。
    usearea 为空 = 不限制来源,可从外部调用(如 newresname、savetoseed、makelayfolder)。
  6. 鉴权在哪
    数据集 heartbeat 的 refreshtoken 方法:校验 stoken 是否有效、刷新 coode_loginstoken 有效期、并下发 deadline。所有「为什么明明登录了还是没权限」的答案都在这里。

26 类资源:编辑器完整地址 / 能不能直接改库

下表「编辑器 / 落点」列即 coode_sysrestypedefine.cloudpath 的值(已补全域名前缀),可直接复制使用。

类型主表编辑器 / 落点(完整地址)
funx 函数coode_funlisthttps://qianjilian.com/localxres/pagex/htmleditor/WrvLoe/index.html?funid=<函数名>
clsx 类coode_phpclshttps://qianjilian.com/localxres/pagex/htmleditor/WrvLoe/index.html?funid=<类名>
sfunx 函数集coode_funsetfilehttps://qianjilian.com/localxres/pagex/htmleditor/WrvLoe/index.html?funid=coode_funsetfile@SNO:<该数据序号>.funfull
dfunx 数据函数coode_datafunhttps://qianjilian.com/localxres/pagex/htmleditor/WrvLoe/index.html?funid=coode_funsetfile@SNO:<该数据序号>.funfull
constx 静态量coode_sysconstanthttps://qianjilian.com/localxres/pagex/htmleditor/WrvLoe/index.html?funid=coode_funsetfile@SNO:<该数据序号>.funfull
configx 系统参数coode_sysconfighttps://qianjilian.com/localxres/pagex/htmleditor/WrvLoe/index.html?funid=coode_funsetfile@SNO:<该数据序号>.funfull
tempx 模板coode_domainunithttps://qianjilian.com/localxres/tempx/tempeditor/index.html?unitid=<域.单元>
pagex 页面coode_tinyhttps://qianjilian.com/localxres/tempx/tinylayeditor/index.html?unitid=<域.单元>&tinyid=<tinymark>
mfunx 分布函数coode_multifunlisthttps://qianjilian.com/localxres/tempx/tinylayeditor/index.html?unitid=resuptool.index&tinyid=o16CUI
tabx 表coode_tablisthttps://qianjilian.com/localxres/funx/anyjsshort/?stid=2qPIqS-sfile:anyjsshort.php-&pnum=150:<表名>&page=1:TABLE_NAME&
formx 表单coode_shortdatahttps://qianjilian.com/localxres/funx/anyjsshort/?datatype=html&stid=keydtly-&pnum=100:<shortid>&page=1:shortid&
dataspacex 数据空间coode_dataspacehttps://qianjilian.com/localxres/tempx/dspcmgr/index.html
sysx 系统容器coode_sysinformationmysql:不落盘,可直接改库
appx 应用容器coode_appdefaultmysql:不落盘,可直接改库
layx 输出容器coode_applaymysql:不落盘,可直接改库
cdtrdrx 条件跳转coode_cdtrdrmysql:不落盘,可直接改库
parardrx 参数跳转coode_parardrmysql:不落盘,可直接改库
groupx 一级分类coode_grouplistmysql:不落盘,可直接改库
plotx 节点coode_plotlistmysql:不落盘,可直接改库
csspagex 样式页面coode_facelistmysql:不落盘,可直接改库
iconsetx 图标库coode_iconsetmysql:不落盘,可直接改库
databasex 数据库coode_dblistmysql:不落盘,可直接改库
afunx 事务函数coode_affairfunlistmysql:不落盘,可直接改库
parax 外部框架coode_paramysql:不落盘,可直接改库
apix 接口密钥coode_apipoolmysql:不落盘,可直接改库
smallcssx 小CSScoode_codedemomysql:不落盘,可直接改库
云酷德宪法/funx

funx

函数已验证

PHP 函数资源,云酷德最小的可执行单元。主表 coode_funlist:funname=资源名(英文码)、funcname=中文标题、funfull=正文(HEX)。落盘 /localxres/funx/<名>/index.php,HTTP 端点 /localxres/funx/<名>/ 。响应统一信封 makereturnjson() → <”status”:”1”,...>。

它是什么

先看懂
函数类:谁都能调,端点就是资源本身调用方Agent / 页面 / funxHTTP 端点/localxres/funx/<名>/GET / POST,必须带 Cookie返回结果库 coode_funlist(HEX 正文)盘 /localxres/funx/<名>/index.php

图:funx(函数)在云酷德体系里的位置

一句话:PHP 函数资源,云酷德最小的可执行单元。主表 coode_funlist:funname=资源名(英文码)、funcname=中文标题、funfull=正文(HEX)。落盘 /localxres/funx/<名>/index.php,HTTP 端点 /localxres/funx/<名>/ 。响应统一信封 makereturnjson() → <”status”:”1”,...>。

落盘 /localxres/funx/<名>/index.php,HTTP 端点直接就是 /localxres/funx/<名>/。五条铁律:不带 <?php 头 / 不能出现连续 TYPE_HEX / 不能写正则 / % 后必须空格或括号 / 裸单引号用 dyh() 拼。

生命周期

四个接口走一圈
资源生命周期:建 → 存 → 读 → 卸(四个接口,走完一圈)anahtmlcode新建·拆骨架·落盘savetempdata保存·刷索引·回写gettempdata读取·编辑器取回unstallres卸载·摘掉资源

所有资源都是这套节奏:先建,再存,要改就取回来改,不用了就卸载

元信息

先认表
类型码
funx
中文名
函数
主表
coode_funlist
定位键
funname
落盘目录
/localxres/funx/
库内条数
1192

主表字段(coode_funlist,共 14 个起):
SNO sysid appid vers vermd5 usearea funname funcname industry business matter imhead funtype funcls…

主表速查 SQL复制
select * from coode_funlist where funname='funx';

创建

anahtmlcode
1
准备一份成品 HTML

含 head 里要引的 css/js,以及完整 body;本地先拼好再提交

2
正文转 HEX

'dTYPE:HEX:' + html.encode('utf8').hex() —— 中文走明文会被 unstrs() 改字符

3
POST 到 anahtmlcode

带 resid=域.名、wb=1、sysid=0,必须带 Cookie

4
看返回值确认

wbinfo.isnew=1 才是真新建,fileok=1 说明盘上已落

第一次新建走 anahtmlcode:给它一份完整成品 HTML,它会自己拆成 样式 / 脚本 / 主体 / 骨架,写进 coode_domainunit,并落盘 /localxres/tempx/xianfa/funx.html。
这一步就把「库 + 盘 + 索引」都建好了,不要自己插 SQL、不要 SFTP 传文件。

用 askapi 创建

万能通道 · 含必填字段

除了本类型自己的专用接口,26 种资源全部可以走同一个入口:funx.askapi。
它怎么知道每种资源该填哪些字段'+String.fromCharCode(65311)+'——看这两张表:
coode_asklist(datamark=<类型码>_<操作>,记录作用在哪个主表、定位键是哪个)
coode_askkey(同 datamark,逐字段记录字段名、中文名、fromurl=GET / POST / VIEW)。
所以「这个资源要建哪些字段」不用猜,查这两张表就有。

必填字段含义提交方式类型说明
funname函数名POSTvarchar★ 定位键——整个资源靠它被找到;fullinfo / view 都得拿它当<定位值>
funcname函数别名POSTvarchar资源的中文名(标题/别名)。必填,但随时可改——改走 fullinfo 或 setbtn
sysid系统IDPOSTvarchar所属系统ID。公共资源填 0(云酷德运行时);填了具体 sysid 就归到那个系统名下
srctype资源类型POSTvarchar资源类型码,固定填 funx,不要拼错
规律:26 种资源的 crtres 基本都只要这四样——定位键(funname)+ 标题 + sysid(公共资源填 0)+ srctype(填资源类型码 funx)。剩下的字段建完再用 optype=fullinfo 补。
本类型实测 4 个必填字段(上表即全部)。
HTTP · 创建(funx)复制
POST 本站域名/localxres/funx/askapi/?optype=crtres&stype=funx
Cookie: uid=divlovecss; stoken=; deadline=
Content-Type: application/x-www-form-urlencoded
funname=<值>
funcname=<值>
sysid=<值>
srctype=<值>
# 返回:{"status":"1","msg":"已创建 … 共 N 个字段(权限已放行)","redirect":"<定位键值>"}
# status=0 的两种情况:
#   1. 缺少定位值 funname   -> 必须提交这个字段
#   2. 资源已存在:XXX      -> 别重复插,改值走 fullinfo / setbtn
创建之后:补全字段 / 读取 / 生成文件复制
# ① 补全其余字段(一次可改多个)
POST 本站域名/localxres/funx/askapi/?optype=fullinfo&stype=funx&funname=<定位值>
Cookie: uid=divlovecss; stoken=; deadline=
Content-Type: application/x-www-form-urlencoded
<字段名>=<新值>&<字段名2>=<新值2>
# ② 读回来看看对不对
GET  本站域名/localxres/funx/askapi/?optype=view&stype=funx&funname=<定位值>
Cookie: uid=divlovecss; stoken=; deadline=
# ③ 让它落盘成真正的资源文件
GET  本站域名/localxres/funx/askapi/?optype=mkfile&stype=funx&code=<定位值>
Cookie: uid=divlovecss; stoken=; deadline=
#   函数类 -> /localxres/funx/<code>/index.php
#   模板类 -> /localxres/funx/<code>/index.html
#   force=1 强制重写(默认文件缺失或为空才写)
# ④ 查这个类型到底有哪些字段可写
select keyname,keytitle,fromurl from coode_askkey where datamark='funx_fullinfo' order by SNO;
optype干什么说明
crtres新建资源插一条记录到主表,并自动给你放开发权限(coode_devespace)
fullinfo改多个字段按定位键找到记录,一次改掉提交上来的所有可写字段
view读取一条按定位键取出这条记录的主字段
viewext读取扩展取出关联的扩展信息(子项、依赖面等)
setbtn按钮写值改少量字段(通常是开关、状态位)
mkfile生成资源文件按类型生成落盘文件:函数类 index.php、模板类 index.html,其余生成数据出口
fromurl 三种值:GET=从 URL 参数取值、POST=从表单体取值、VIEW=只展示不写库。crtres 时 VIEW 字段会被跳过,所以创建后它们还是空的——这正是要接着走 fullinfo 的原因。
HTTP · 新建复制
POST 本站域名/localxres/funx/anahtmlcode/
Cookie: uid=divlovecss; stoken=; deadline=
Content-Type: application/x-www-form-urlencoded
resid     = xianfa.funx
htmlcode  = dTYPE:HEX:<完整 HTML 的十六进制>      # ★ 中文必须 hex,明文会被 unstrs 改字符
hex       = 1
wb        = 1                                     # 返回 JSON
unittitle = funx 函数
sysid     = 0                                     # 顺手登记 coode_sysregres
返回 · JSON复制
{"status":"1","msg":"生成成功","redirect":"",
 "wbinfo":{"resid":"xianfa.funx","outurl":"/localxres/tempx/xianfa/funx.html",
           "isnew":1,"fileok":1,"bytes":32110,"regok":1}}
Python · 完整可跑(含公共库)复制
import io, urllib.parse, urllib.request
SITE  = 'https://<你的本站域名>'
COOKIE = 'uid=divlovecss; stoken=; deadline='      # ★ 铁律:系统资源操作必带,否则 CRTOR 写空
def post(fn, data, timeout=180):
    url  = SITE + '/localxres/funx/' + fn + '/'
    body = urllib.parse.urlencode(data).encode('utf8')
    req  = urllib.request.Request(url, data=body, headers={
        'Content-Type': 'application/x-www-form-urlencoded',
        'Cookie': COOKIE})
    return urllib.request.urlopen(req, timeout=timeout).read().decode('utf8', 'replace')
def tohex(s):
    return 'dTYPE:HEX:' + s.encode('utf8').hex()   # ★ 中文正文必须走 hex,明文会被 unstrs 改字符
def nl(s):
    return s.replace('\r\n', '\n').replace('\n', '
')   # 换行 -> 
,unstrs 还原成 \r\n
# ---------- 1. 新建:anahtmlcode ----------
html = io.open('funx.html', encoding='utf8').read()
r = post('anahtmlcode', {
    'resid':     'xianfa.funx',              # 域.名 -> 落盘 /localxres/tempx/xianfa/funx.html
    'htmlcode':  tohex(html),               # 完整成品页(含 <head> 里的 css/js 引用)
    'hex':       '1',
    'wb':        '1',                       # 返回 JSON:isnew / fileok / bytes / regok
    'unittitle': 'funx 函数',
    'sysid':     '0',                       # 顺手登记进 coode_sysregres
})
print(r)      # isnew:1 才是真新建;isnew:0 说明同名已存在,走的是更新分支

不想写脚本'+String.fromCharCode(65311)+'用可视化通道:打开 本站域名/localxres/tempx/abhtmlcode/index.html?resid=xianfa.funx(页面标题就叫「html代码吸收器」),把整页 HTML 粘进文本框点提交即可。
它其实就是 anahtmlcode 的前端壳,提交的是 resid=<域.名>&htmlcode=mkstr(整页源码)——走明文、不带 hex=1,值统一过 mkstr();同名直接覆盖,所以也是改页面最省事的办法(铁哥 2026-09-29 亲授)。

参数要点:resid 必须是 域.名 两段式,wb=1 才返回 JSON;isnew 为 0 说明同名已存在,这次走的是更新分支(不会重复插库)。

怎么调用

用起来

函数类资源靠 HTTP 端点直接调用:浏览器、别的 Agent、另一个 funx 都能调。改内容走 savefunc,改完立即生效——库里存 HEX 正文,盘上 index.php 同步重写。

1
定位它

用 funname 在主表 coode_funlist 里查到这一条

2
取内容

库里正文是 dTYPE:HEX: 开头的十六进制,要先解出来才是可读原文

3
真正使用

直接请求端点 /localxres/funx/<名>/

4
确认生效

看盘上文件是否更新、页面刷新后是否变了

取一条记录出来看复制
select SNO,* from coode_funlist where funname='<资源码>';
# 按主键改某列(SNO 用上面查出来的真实值)
POST 本站域名/localxres/funx/savefunc/?fn=SNO:<真实主键>.<列名>@coode_funlist
Cookie: uid=divlovecss; stoken=; deadline=
dt=<这一列的新值>
# 库里正文是 TYPE_HEX 包装的十六进制,解出来才是原文
# Python:  bytes.fromhex(值[len('dTYPE:HEX:'):]).decode('utf8')

维护 / 保存

savetempdata
1
改本地那份 HTML

别在服务器上直接改文件,改本地源再重新提交

2
重新 anahtmlcode

同名会走更新分支(isnew=0),不会重复插库

3
savetempdata 回写

casecode 会被 eval,写错就是静默失败——返回空串要警惕

4
savetoseed 刷索引

让别的站能 installpod 装走

改完内容用 savetempdata 回写。它负责替换骨架里的 6 个占位、重算 vermd5、重新落盘 outurl,并自动调 savetoseed 刷索引。
⛔ 返回空串 = 失败(最常见的原因是 casecode 语法错,它内部会 eval,错了就静默不写库)。

HTTP · 保存复制
POST 本站域名/localxres/funx/savetempdata/
Cookie: uid=divlovecss; stoken=; deadline=
Content-Type: application/x-www-form-urlencoded
domain      = xianfa
mark        = funx
unittitle   = funx 函数
unitclass   = content              # ★ 自绘页必须 content(list/form/… 会被加 listdemo)
unitdescrib = 云酷德宪法 - funx 函数
stylex      =                      # 留空:公共样式走 cssfiles
scriptx     = <script src="/localxres/funx/xianfajs/"></script>
casecode    = $utitle="..."; 换行 $tmpcode='...';     # 会被 eval,语法错必失败
tmpcode     = <页面主体,< > 写成 { }>
srdcode     = <页面骨架,含 {!--thesecomCSSFILES--} 等占位>
cssfiles    = /localxres/funx/xianfacss/
jsfiles     = /localxres/funx/xianfajs/             # 多个用 ; 分隔
outurl      = /localxres/tempx/xianfa/funx.html
Python · 完整可跑复制
# ---------- 2. 保存:savetempdata ----------
BODY   = html[html.index('<div class="cg-wrap"'):]        # 页面主体
SCRIPT = '<script src="/localxres/funx/xianfajs/"></script>'
to_code = lambda s: s.replace('<', '{').replace('>', '}')  # coode 码:< > 写成 { }
r = post('savetempdata', {
    'domain': DOMAIN, 'mark': 'funx',
    'unittitle': 'funx 函数',
    'unitclass': 'content',                 # ★ 自绘页必须是 content
    'unitdescrib': '云酷德宪法 - funx 函数',
    'stylex': '',                           # 公共样式走 cssfiles,不内联
    'scriptx': nl(SCRIPT),
    'casecode': nl('$utitle="funx 函数";' + chr(10) + "$tmpcode='" +
                   to_code(BODY).replace("'", "'.dyh().'") + "';"),
    'tmpcode': nl(to_code(BODY)),
    'srdcode': nl(SRD),                     # 页面骨架,含 {!--thesecomCSSFILES--} 等占位
    'cssfiles': '/localxres/funx/xianfacss/',
    'jsfiles':  '/localxres/funx/xianfajs/',   # 多个用 ; 分隔
    'outurl':   '/localxres/tempx/xianfa/funx.html',
})
print(r)      # 返回 '1' = 成功;返回空串 = 失败(多半是 casecode 语法错)
提交前必须消毒:每个字段都会过 unstrs()——\ 反斜杠直接删光(所以别写正则);换行用 ;& 会被还原成 &;全角问号会被变半角。
另外从库里取回的 casecode 是 形态,必须先还原成真换行再提交,否则 eval 直接语法错。

详情 / 读取

gettempdata
HTTP · 读取复制
GET 本站域名/localxres/funx/gettempdata/?unitid=xianfa.funx
Cookie: uid=divlovecss; stoken=; deadline=
Python · 读取复制
# ---------- 3. 读取:gettempdata ----------
import urllib.request
url = SITE + '/localxres/funx/gettempdata/?unitid=xianfa.funx'
req = urllib.request.Request(url, headers={'Cookie': COOKIE})
print(urllib.request.urlopen(req, timeout=60).read().decode('utf8', 'replace'))

可视化编辑器:本站域名/localxres/tempx/tempeditor/index.html?unitid=xianfa.funx
⛔ 编辑器在 tempx 下,不是 csspagex(那只是 CSS 样式模板库)。
只有库 + 盘都存对了,编辑器才取得到内容并能改——这也是「不许直接写文件」的原因。

卸载 / 同步

unstallres · savetoseed
HTTP · 三件套复制
# 卸载资源
GET 本站域名/localxres/funx/unstallres/?restype=tempx&rescode=xianfa.funx&sysid=0&insmark=xianfa.funx
# 存为种子(刷 resdata 索引,让别的站能装)
GET 本站域名/localxres/funx/savetoseed/?restype=tempx&sysid=0&resmark=xianfa.funx
# 从别的站装过来
GET 本站域名/localxres/funx/installpod/?fromhost=<源站>&restype=tempx&rescode=xianfa.funx&sysid=0
登记表 · sysregres复制
insert into coode_sysregres(grpid,restype,resmark,restitle,STATUS,CRTM,UPTM,OLMK)
values('0','tempx','xianfa.funx','funx 函数','0',now(),now(),'...');
注意:本页讲的是「用 tempx 通道生成页面型资源」。funx 这种资源本身的主表是 coode_funlist,定位键 funname;卸载时把 restype 换成 funx 即可。

实操备注 / 踩坑沉淀

共 12 条 · 只增不删

下面每一条都是真跑过、真踩过之后记下来的,按时间正序排列。新发现只往上加,旧的绝不删——同一个资源的认识就是这样一点点变准、变细的。

1提交源码五条铁律(违反任意一条都会静默失败)2026-09-29
① 不带 <?php 头;
② 正文里不能出现连续的 TYPE_HEX(会触发 gohex 放行,见 tempx 备注);
③ 不能写正则(preg_* 相关会被 mkstr 的字符替换搞坏);
④ % 后面必须跟空格或括号(%s 会被当成 printf 占位炸掉);
⑤ 裸单引号用 dyh() 拼('abc'.dyh().'def'),别直接写 '。
2savefunc 的 fn 参数三种写法2026-09-29
fn=<函数名> —— 整段替换函数正文(最常用)
fn=<键>@<表>.<列> —— 只改某一行的某一列
fn=SNO:<主键>.<列>@<表> —— 按主键精确定位改列

提交后必须重新取回端点内容比对字节数,别信返回的成功字样。
3mkstr / unstrs 字符替换表(明文提交必看)2026-09-29
'→ノ &→δ +→+ =→= ?→'+String.fromCharCode(65311)+' \→↘(且会被删光) 换行→卍 «»→<?php ?>

所以中文内容一律走 HEX(dTYPE:HEX:<hex>),明文提交英文代码也要避开上面这些字符。
4输出型 funx:把 CSS / JS 变成系统资源2026-09-29
在 funx 正文里先 header('Content-Type: text/css')(或 application/javascript),再用 nowdoc 把整份样式/脚本原样 echo 出来,这个 funx 就成了一个可被 <link> / <script> 引用的端点。

这是云酷德里「公共样式/公共脚本」的正确做法——不要往服务器上 FTP 传文件(铁哥规矩:服务器上的资源要用系统方法生成)。
本 SDK 的 xianfacss / xianfajs 就是这么来的。
5老路径 /DNA/EXF/ 已经废弃2026-09-29
现在函数端点统一是 /localxres/funx/<函数名>/。
旧资料里的 /DNA/EXF/anyfuns.php?fid=xxx → 等价新地址 /localxres/funx/<xxx>/。看到旧写法直接换算,别照抄。
6askapi 万能通道:26 种资源通用的创建 / 改字段入口2026-09-29
入口就一个:/localxres/funx/askapi/,靠 optype + stype 两个参数走遍 26 种资源。 它不该问「这个资源要填哪些字段」——答案在两张表里:
coode_asklist(140 条,datamark=<类型码>_<操作>,记录作用主表、定位键 qrykey)
coode_askkey(1271 条,同 datamark 逐字段记录字段名、中文名、fromurl)。

六个 optype:crtres 新建 / fullinfo 改多字段 / view 读一条 / viewext 读扩展 / setbtn 按钮写值 / mkfile 生成落盘文件。

两条硬规律:
① 26 种资源的 crtres 都只要四样:定位键 + 标题 + sysid(公共填 0)+ srctype(填类型码)。 其余字段建完再用 fullinfo 补。
② fromurl 三种值要分清:GET=从 URL 取值、POST=从表单体取值、 VIEW=只展示不写库。crtres 会跳过 VIEW 字段,所以刚建出来的记录这些列是空的——这不是 bug,是提醒你接着走 fullinfo。

crtres 内部还会自动做三件事:补 OLMK,CRTOR,CRTM,UPTM;给 coode_devespace 放开发权限; tempx 特判把复合唯一键拆成 domainmark / unitmark;遇到 UNIQUE 列缺失自动塞 onlymark()。
重复创建会回 status=0「资源已存在」——别硬插,改值走 fullinfo / setbtn。

查某资源某操作有哪些可写字段,直接 SQL:
select keyname,keytitle,fromurl,keytype from coode_askkey where datamark='<类型码>_fullinfo' order by SNO;
7savefunc 回执「提交成功」但库里没动 = fn 顺序写反(2026-09-29 二次踩坑)2026-09-29
症状:savefunc 返回 status=1 提交成功,目标字段字节数都没变。别去查 STATUS / CRTOR / devespace —— 那些不是障碍(coode_keydetailx 整表 STATUS 全是 0 照样能改)。真因一定是 fn 顺序:必须是 表名@SNO:x.字段,写反成 SNO:x.字段@表名 时源码会把表名解析成 SNO:x,拼出非法 SQL,被 UX() 吞掉后照样打印成功。自查:拿 1 行试提交,回读比对字节数,没变就是没写进去。另一个隐蔽点:HEX 编码的列用 SQL LIKE 搜不到明文。
8htmleditor(funx 脚本编辑器)到底怎么保存参数(2026-10-01 铁哥要求永久记忆)2026-10-01

需求:搞清 funx 脚本编辑器(htmleditor)到底怎么把代码存进去 —— 铁哥 2026-10-01 要求「两大编辑器的保存参数永久强烈记忆」。

编辑器地址:/localxres/pagex/htmleditor/WrvLoe/index.html?funid=tdfind  funid = 函数名;改函数集时写 <表>@SNO:<主键>.<字段>。

真实提交串(把编辑器 scriptx.js 从库里 gohex 解码后读出来的原文):

fmtxt = mkstr(fmtxt);
ajaxhtmlpost("//"+domain+"/localxres/funx/savefunc/?parall="+parallel+"&fn="+GetRequest().funid,
             "dt="+fmtxt);

拆开就是:POST 到 savefunc;GET 参数只有 parall 与 fn, fn 直接等于 funid 的原值、不做任何加工;POST 体只有一个字段 dt,且必须先过 mkstr()。

mkstr 在哪:/localxres/formx/coodesys/js/coode.min.js(约 L116217)。 它把单引号、和号、加号、等号、问号、反斜杠、换行换成 ノ δ + = '+String.fromCharCode(65311)+' ↘ 卍 这类安全字符; 服务端 unstrs()(EARTH.php:1029)做逆变换。自己写脚本提交时必须实现同款 mkstr, 否则特殊字符整篇错位。

顺序坑:编辑器 funid 是「表在前」<表>@SNO:<n>.<字段>, 而 SDK 里 savefunc 常用的 fn 写法是「SNO 在前」SNO:<n>.<字段>@<表> —— 两者顺序相反,编辑器这边是把 funid 原样塞给 fn。

铁哥当面纠正的一句话:「savefunc 不可用直接改库,文件也得改啊,访问的是文件」。 正解是:savefunc 本来就两件一起做 —— 写库 coode_funlist.funfull(gohex 编码) + 落盘 /localxres/funx/<fn>/index.php(自动套 23 行模板头)。 所以别手工改库、也别手工改盘,老老实实走 savefunc 就是唯一正路; 只有源码里躲不开反斜杠/正则时才降级到 SFTP 双写,且做完必须验收。

回执不可信:savefunc 结尾无条件 echo makereturnjson("1","提交成功",""), 从不查 insert/update 返回值 —— 提交完一定查库验收(见下一条 unhex 铁律)。

9★ 验收铁律:库里是 dTYPE_HEX,比对前必须 unhex(我因此覆盖过正确数据)2026-10-01

这是我在 coode 上栽过的最狠一跟头,2026-10-01 亲历,写完必须刻进骨头里。

现象:用 savefunc 提交完 funx.tdfind 的新版本,回执「提交成功」, 但我拿明文去库里搜特征串 samples 却一条也搜不到, 于是判定「这个老函数写不进去」,反手一条 UPDATE coode_funlist SET funfull=<明文> 把它「补」上 —— 结果是把 savefunc 刚写进去的正确版本整个覆盖掉了。最后靠 oldfull (写入前那份快照)才捞回来。

原因:coode_funlist.funfull 存的是 TYPE:HEX: 前缀 + 十六进制(顶层是 dTYPE:HEX:), 换行还是字面 4 字符 ,而且不带磁盘那份模板头。 拿明文去 LIKE 搜索,当然永远搜不到 —— 不是没写进去,是我没解码。

正确验收姿势(三步,缺一不可):

raw = row['funfull']        # 形如 dTYPE:HEX:xxxx 或明文
txt = unhex(raw)            # 有前缀才解 hex;解完再把 '
' 还原成真换行
ok  = ('samples' in txt) and ('stat' in txt)

再配合长度对比判断到底有没有更新(实例:funfull 6070→7094 字节, 解码后 3130→3294 字符)。长度变化比 status 可靠一万倍。

同一个坑在 tempx 侧又踩了一次:拿明文搜 coode_domainunit.scriptx 里的 album 搜不到,以为线上页面还是旧版;unhex 后确认 「解码 5953 字符,含 album=True 含 groups=True」,页面本来就是新的 —— 白紧张一场。

磁盘那份才是真身:/localxres/funx/<fn>/index.php (含模板头、CRLF、属主 www:www),HTTP 访问执行的是它。判断「线上跑的到底是哪版」 要 curl 落点文件,别只看库。

保命习惯:动任何已存在的 funx 之前,先把 funfull / oldfull / lastfull 三个版本拉下来存本地,出事能秒回退。

一句话总结:coode 的老接口普遍「裸拼 SQL + 无条件返回成功」, 唯一可信的验收是「解码后查库比对」。

10★★ 铁律:涉及保存参数就先现场扒编辑器(editorsrc.py),附 htmleditor 三分支与 clsx 新端点2026-10-01

铁哥 2026-10-01 定的铁律:「以后只要涉及 tempx、funx 如何传参保存, 就找各自的前端编辑器页面重新寻找实现过程」。

为什么:编辑器会升级、参数会变,SDK 和技能里记的那串可能已经过期。 所以提交前的第一步不是写代码,是把编辑器源码拉下来看它现在到底怎么提交的。

一键工具(已落地):

python ~/.workbuddy/skills/coode-tempx/scripts/editorsrc.py --which funx
python ~/.workbuddy/skills/coode-tempx/scripts/editorsrc.py --which tempx
python ~/.workbuddy/skills/coode-tempx/scripts/editorsrc.py --unit pagex:htmleditor.index

它把编辑器各字段(scriptx / stylex / casecode …)gohex 解码后落盘, 再打印所有「保存相关」代码段:端点 URL、参数名、是否用 mkstr。

编辑器在哪(别找错表):

① funx 编辑器 = pagex 资源,在 coode_unittiny 里, dumark='htmleditor.index',中文名「网页代码编辑器」, 访问 /localxres/pagex/htmleditor/WrvLoe/index.html?funid=<名>。 ⛔ 不在 coode_domainunit 里 —— 找错表会以为它不存在。

② tempx 编辑器 = tempx 资源,在 coode_domainunit 里,dumark='tempeditor.index'。

现场扒出来的 funx 编辑器分支(2026-10-01,原文 L29~L33):

if (GetRequest().funid!="" && typeof(GetRequest().funid)!="undefined")<
   bkrst=ajaxhtmlpost("//"+domain+"/localxres/funx/savefunc/?parall="+parallel+"&fn="+GetRequest().funid,"dt="+fmtxt);
>else<
   bkrst=ajaxhtmlpost("//"+domain+"/localxres/funx/saveclsc/?fn="+GetRequest().clsid,"dt="+fmtxt);
>

⭕ 新发现第三条分支:带 ?clsid= 打开时存的是类(clsx), 走 saveclsc/?fn=<clsid>,POST 体同样是 dt=mkstr(正文)。 (另 L47 / L56 / L64 是试运行,不保存。)

一句话:以脚本打印出来的串为准,别照抄任何旧记忆。

11★★ 铁律:传网址一律用 makeviewurl / unviewurl(?→@@@ &→* =→$,不用 urlencode)2026-10-01

铁哥 2026-10-01 定的规矩:「以后传网址可以用 makeviewurl、unviewurl 方法」。

为什么需要:把一个网址当参数传(如 ?u=<另一个网址>)时, 里面的 ? & = 会把外层 query string 截得七零八落 —— & 直接变成外层的新参数。coode 的既定解法就是这两个核心函数。

它们是什么(localxres/EARTH.php 里的核心函数,funx 里直接调,不用 include):

makeviewurl($urlx)   // 发出去之前:? & =  换成  @@@ * $
unviewurl($urly)     // 收到之后:@@@ * $  换回  ? & =

变换后字符串里再没有 ? & =,可以安全塞进任何 query 参数值里,连 urlencode 都不用。

用法模板:

// ① 生成端
$px="/localxres/funx/tdimgpx/?u=".makeviewurl($u);
// ② 接收端(第一件事就是还原)
$u=_get("u"); if($u=="")<$u=_post("u");> $u=unviewurl($u);

边界(实测):

⛔ 不处理中文 —— 只换那三个字符,中文原样保留。浏览器会自己 percent-encode, PHP 的 $_GET 拿到解码后的中文,没问题; 但服务端拿这个网址去 curl 取图时,路径要自己 rawurlencode(逐段编码)。

⛔ 别再整体 urlencode($u) —— 铁哥要的是系统自带的这套; 而且 % 在传输链路里本来就易出事。

实战出处:funx.tdimgpx(2026-10-01 建,千机连)—— 图库图片代理。 前台只调 https://本站/localxres/funx/tdimgpx/?u=<makeviewurl后的图址>&t=1, 后台 curl 取图吐流,用来绕开图库域名 https 证书过期导致的前台图片加载失败。 实测:缩略图 17113 字节、原图 192720 字节,中文路径与含 ? 的裁剪链接都正常。

12★★ 铁哥定:PRIME=测试集代数(整数、必须后台 max 决定)+ 查图只认向量、语义另走一条路2026-10-01

一、PRIME = 测试集「代数」(2026-10-01 铁哥定,只能整数)

dbvideo_piccool.PRIME(coode 里中文名「素数定类」)在本项目里当测试集代数用:

值含义
0不在测试集
1第 1 代测试集(对应 td1.2 算法)
2第 2 代测试集(对应 td1.3 算法)
N以后每换一版算法 +1

⛔ 算法版本号不进 PRIME —— 它写在 tdver(字符串 'td1.2'/'td1.3'),两码事。 铁哥原话:「这个 prime 只能设置成整数,小数不可以」。

升代流程:老标记全归 0 → 用新算法重跑 → 跑完标新代数。

二、代数必须由后台决定,页面不许写死

铁哥原话:「tempx 代码也得改一下,你可以改成后台决定输出 prime=多少」。

做法(funx.tdfind):

$rx = SX("select max(PRIME) as g from dbvideo_piccool");
$gen = anyvalue($rx, "g", 0);        // 当前代 → stat / samples 都跟着它走
  • act=stat 返回 gen;act=samples 也返回 gen;
  • 页面 JS 拿 j.gen 显示「① 样图库(第 N 代)」——升代不用改页面;
  • 挑测试集:python tdpage2.py prime --gen=2。

⛔ 踩过的坑:gen=0(还没标过任何一代)时如果直接拼 where PRIME=$gen,等于 PRIME=0 → 命中全表 19.7 万张, 统计会出现「样图集 197705 张」,跑批后还会把非测试集的图全倒给页面。 正解:gen<=0 时直接返回空 / 报 0。

三、查图只认向量,语义另走一条路(2026-10-01 铁哥定)

铁哥原话:「语义判断不应该放在拍照图片的识别里,语义可以作为语义检索配合,这个查图应该主要看向量。」

排序本来就是纯向量(score_pair),问题在展示层——结果卡把 AI 图注放在主位, 让人以为在做语义匹配。改法:

  1. tdserve.py 新增 score_parts(A,B),把总分拆成 align(杆间位置关系) 和 dir(纯方向直方图余弦),接口逐条透传;
  2. 结果卡主展示 相似度 + 向量证据(位置关系/方向一致), AI 图注降为小灰字并标注「仅供参考,不参与匹配」;
  3. 样图库卡、目标样图卡不再显示图注(那只是干扰判断的文字);
  4. 新增独立 ③ 语义检索 Tab:funx.tdfind?act=sem&kw=关键词, 按 deswords LIKE 查。它代表「文字上相关」,不代表图像相似,与②互不掺。
云酷德宪法 · 本页是 tempx 资源 xianfa.funx,落盘 /localxres/tempx/xianfa/funx.html,上面每段代码就是造它自己的真实调用
操作方法会随造系统的过程持续补充——每实操一次,就回来补一段