24 lines
14 KiB
JavaScript
24 lines
14 KiB
JavaScript
import{_ as i,o as a,c as t,a2 as e}from"./chunks/framework.BbmSSMjL.js";const c=JSON.parse('{"title":"D. 公共函数速查","description":"","frontmatter":{},"headers":[],"relativePath":"zh/appendix/functions.md","filePath":"zh/appendix/functions.md"}'),n={name:"zh/appendix/functions.md"};function d(l,s,h,r,p,k){return a(),t("div",null,[...s[0]||(s[0]=[e(`<h1 id="D-公共函数速查" tabindex="-1">D. 公共函数速查 <a class="header-anchor" href="#D-公共函数速查" aria-label="Permalink to "D. 公共函数速查""></a></h1><div class="tip custom-block"><p class="custom-block-title">概述</p><p>以下函数定义在 <code>app/Helpers/helpers.php</code> 中(通过 <code>composer.json</code> 的 <code>autoload.files</code> 自动加载),可在任何地方直接调用。</p></div><h2 id="字符串-加密" tabindex="-1">字符串 / 加密 <a class="header-anchor" href="#字符串-加密" aria-label="Permalink to "字符串 / 加密""></a></h2><table tabindex="0"><thead><tr><th>函数</th><th>说明</th><th>签名</th></tr></thead><tbody><tr><td><code>random_string($length)</code></td><td>生成随机字符串</td><td><code>string random_string(int $length = 16)</code></td></tr><tr><td><code>encrypt_password($password, $salt)</code></td><td>密码加密(委托 PasswordService)</td><td><code>array encrypt_password(string $password, ?string $salt = null)</code></td></tr><tr><td><code>verify_password($password, $hash, $salt)</code></td><td>验证密码</td><td><code>bool verify_password(string $password, string $encryptPassword, string $salt)</code></td></tr></tbody></table><h2 id="文件处理" tabindex="-1">文件处理 <a class="header-anchor" href="#文件处理" aria-label="Permalink to "文件处理""></a></h2><table tabindex="0"><thead><tr><th>函数</th><th>说明</th><th>签名</th></tr></thead><tbody><tr><td><code>save_file($fileUrl, $saveDir)</code></td><td>临时文件迁移到正式目录</td><td><code>save_file(string $fileUrl, string $saveDir = '')</code></td></tr><tr><td><code>save_content(&$content, $saveDir)</code></td><td>处理富文本中的媒体文件(迁移 + 域名替换)</td><td><code>bool save_content(string &$content, string $saveDir = 'article')</code></td></tr><tr><td><code>save_content_match(...)</code></td><td>富文本内单类 URL 匹配迁移(save_content 内部使用)</td><td><code>void save_content_match(string $content, string $pattern, string $domainUrl, string $saveDir, array &$urlMap)</code></td></tr><tr><td><code>get_file_url($path)</code></td><td>相对路径转完整 URL</td><td><code>string get_file_url(string $path)</code></td></tr><tr><td><code>create_file_path($saveDir, $ext)</code></td><td>生成文件存储路径(按日期分目录)</td><td><code>string create_file_path(string $saveDir = '', string $ext = '')</code></td></tr><tr><td><code>save_remote_file($url, $saveDir)</code></td><td>保存远程文件</td><td><code>save_remote_file(string $url, string $saveDir = '')</code></td></tr><tr><td><code>detect_image_ext($content)</code></td><td>根据内容检测图片后缀</td><td><code>?string detect_image_ext(string $content)</code></td></tr></tbody></table><div class="info custom-block"><p class="custom-block-title">上传入口不在这里</p><p>HTTP 文件上传入口是 <code>POST /api/upload/uploadFile</code>(见 <a href="/zh/tools/upload.html">7.1 文件上传全流程</a>),业务层的临时→正式迁移由 <code>HasFileProcessing</code> Trait 调用 <code>save_file()</code> / <code>save_content()</code> 完成。</p></div><h2 id="驼峰-下划线转换" tabindex="-1">驼峰 / 下划线转换 <a class="header-anchor" href="#驼峰-下划线转换" aria-label="Permalink to "驼峰 / 下划线转换""></a></h2><table tabindex="0"><thead><tr><th>函数</th><th>说明</th><th>签名</th></tr></thead><tbody><tr><td><code>snake_to_camel($str)</code></td><td>下划线转驼峰</td><td><code>string snake_to_camel(string $str)</code></td></tr><tr><td><code>camel_to_snake($str)</code></td><td>驼峰转下划线</td><td><code>string camel_to_snake(string $str)</code></td></tr><tr><td><code>array_snake_to_camel($data)</code></td><td>数组键名下划线转驼峰(递归)</td><td><code>array array_snake_to_camel(array $data)</code></td></tr><tr><td><code>array_camel_to_snake($data, $except)</code></td><td>数组键名驼峰转下划线(递归)</td><td><code>array array_camel_to_snake(array $data, array $except = [])</code></td></tr><tr><td><code>is_camel_convert_enabled()</code></td><td>是否开启转换(读 <code>config('api.camel_snake_convert')</code>)</td><td><code>bool is_camel_convert_enabled()</code></td></tr><tr><td><code>convert_to_camel($data)</code></td><td>单条数据转驼峰(受开关控制)</td><td><code>convert_to_camel($data)</code></td></tr><tr><td><code>convert_list_to_camel($list)</code></td><td>列表数据转驼峰(受开关控制)</td><td><code>array convert_list_to_camel(array $list)</code></td></tr></tbody></table><h2 id="工具函数" tabindex="-1">工具函数 <a class="header-anchor" href="#工具函数" aria-label="Permalink to "工具函数""></a></h2><table tabindex="0"><thead><tr><th>函数</th><th>说明</th><th>签名</th></tr></thead><tbody><tr><td><code>get_client_ip()</code></td><td>获取客户端 IP(经 ProxyMiddleware 受信代理解析)</td><td><code>string get_client_ip()</code></td></tr><tr><td><code>is_internal_ip($ip)</code></td><td>判断是否内网 / 回环地址</td><td><code>bool is_internal_ip(string $ip)</code></td></tr><tr><td><code>format_page_params($params)</code></td><td>格式化分页参数(pageNo ≥ 1、pageSize 1~100)</td><td><code>array format_page_params(array $params)</code></td></tr><tr><td><code>build_tree($list, $parentId, $parentField)</code></td><td>平面列表组装为树</td><td><code>array build_tree(array $list, int $parentId = 0, string $parentField = 'parent_id')</code></td></tr></tbody></table><h2 id="使用示例" tabindex="-1">使用示例 <a class="header-anchor" href="#使用示例" aria-label="Permalink to "使用示例""></a></h2><div class="language-php vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">php</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">// 生成随机字符串</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">$</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#B07D48;">str</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> random_string</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">(</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;">32</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">);</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">// 密码加密与验证</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">$</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#B07D48;">result</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> encrypt_password</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">(</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">123456</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">);</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">// ['password' => '$2y$12$...', 'salt' => 'xK7pMn3qRt']</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">$</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#B07D48;">ok</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> verify_password</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">(</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">123456</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">,</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> $</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#B07D48;">user</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;">-></span><span style="--shiki-dark:#F6F6F4;--shiki-light:#B07D48;">password</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">,</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> $</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#B07D48;">user</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;">-></span><span style="--shiki-dark:#F6F6F4;--shiki-light:#B07D48;">salt</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">);</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">// 临时文件迁移到正式目录(HasFileProcessing 内部即这样调用)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">$</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#B07D48;">result</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> save_file</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">($</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#B07D48;">data</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">avatar</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">],</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> '</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">user</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">);</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">if</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> ($</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#B07D48;">result</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;"> ===</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#1E754F;"> false</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">)</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> {</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> // 保留原值,避免误清空</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">}</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">// 相对路径补全域名</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">$</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#B07D48;">url</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> get_file_url</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">($</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#B07D48;">data</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">avatar</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]);</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">// 驼峰转换</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">camel_to_snake</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">(</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">createTime</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">);</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> // 'create_time'</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">snake_to_camel</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">(</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">create_time</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">);</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> // 'createTime'</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">// 平面列表组装为树(树形模块 treeList 使用)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">$</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#B07D48;">tree</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> build_tree</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">($</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#B07D48;">list</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">,</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;"> 0</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">,</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> '</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">parent_id</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">);</span></span></code></pre></div>`,13)])])}const F=i(n,[["render",d]]);export{c as __pageData,F as default};
|