其他教程

模板兔提供一些网站建设相关的教程,让大家迅速的做好一个网站。

七牛云存储的图片水印处理如何弄成文字平铺水印,就是整个图片铺满文字的效果。 接口规格 watermark/4 /text/<encodedText> /font/<encodedFontName> /fontsize/<fontSize> /fill/<encodedTextColor> /dissolve/<dissolve> /rotate/<rotate> /uw/<unitW> /uh/<unitH> /resize/<resize> 参数名称 必填 说明 /text/<encodedText> 是 水印文字内容(经过URL安全的Base64编码) /font/<encodedFontName> 水印文字字体(经过URL安全的Base64编码),默认为方正黑体,详见支持字体列表 注意:中文水印必须指定中文字体。 /fonts...

假如有一个数组,数组里面有三个标题,我要同时向某API分别传入这三个标题,让这个API给我生成三篇文章,用PHP语言怎么写这个同时请求呢。如果我们通过循环来执行的话,只能等一次循环curl请求完成了才能进行下一次,这样并不是同时进行的三次请求。 经过模板兔的一翻研究,我们可以使用PHP的cURL库的curl_multi_init来实现三个并行请求。 具体步骤如下: 创建一个数组,包含要发送到API的三个标题。 $titles = array("Title 1", "Title 2", "Title 3"); 创建三个cURL句柄,并设置各自的请求参数和URL。 $requests = array(); foreach ($titles as $title) { $handle = curl_init(); curl_setopt_array($h...

下面是模板兔精心调试+亲测的js接收读取stream流的两种方法:EventSource与Fetch,供大家参考。可用于对接GPT等一些AI接口,从而在页面像打字一样输出内容。 EventSource: var es = new EventSource(result.url, { withCredentials: true }); es.onerror = function (event) { //执行错误的页面逻辑 es.close(); } es.onmessage = function (event) { //console.log(event.data); if (event.data == "[DONE]") { //执行完成的页面逻辑 es.close(); }else{ } } Fetch: fetch(result.url, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JS...

ThinkPHP6.0在使用内置的paginate分页类时,如果直接用paginate(10)的话,那么在地址栏额外加get参数数,点击下一页时get参数会丢失。如何解决呢? ThinkPHP6.0 paginate分页参数 主要的分页参数如下: 参数 描述 list_rows 每页数量 page 当前页 path url路径 query url额外参数 fragment url锚点 var_page 分页变量 分页参数的设置可以在调用分页方法的时候传入,如果需要在分页的时候传入查询条件,可以使用query参数拼接额外的查询参数。 $news=News::where('news_category_id',$id) ->order('id','desc') ->paginate( ['list_rows'=> 10, 'var_page...

最近模板兔在给客户用thinkphp对接文本审核功能,因为客户的网站是AIGC模式,内容审核是重点。话不多说,直接附上代码供参考: function erphp_bd_tms($content){ $error = 1;$msg = ''; $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => "https://aip.baidubce.com/oauth/2.0/token?client_id=".ERPHP_BDTMS_APPKEY."&client_secret=".ERPHP_BDTMS_APPSECRET."&grant_type=client_credentials", CURLOPT_TIMEOUT => 30, CURLOPT_RETURNTRANSFER => true, CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_HTTPHEADER => array( 'Content-Type: application/json', 'Accept: application/...

最近我在给客户开发科大讯飞的星火认知大模型SparkDesk,踩过一些坑,网上几乎搜不到PHP的demo代码,这里模板兔给出以下成果代码供大家参考。 首先,sparkdesk的接口需要使用到websocket,所以我们需要先安装websocket,使用composer在网站根目录安装: composer require textalk/websocket 然后就是写php代码: <?php require __DIR__.'/vendor/autoload.php'; use WebSocket\Client; class api { /** * 调用科大讯飞星火认知模型 * @param $params * @return array */ public function sendMsg($params) { $prompt = $params['prompt']; //获取科大讯飞参数 $app_id = $params['APPID']; $api_key = $param...

最近在用php给客户对接讯飞的星火认知大模型api,一开始就遇到个问题,因为接口需要传入RFC1123时间参数,一般用DateTime即可,但是在thinkphp里没法直接用,需要在前面加反斜杠。 $date = new \DateTime('now', new \DateTimeZone('UTC')); echo $date->format('D, d M Y H:i:s T');

需求是我们要将/?s=abc重定向到/letter/abc,这种请求如果我们不设置路由,那么会提示控制器不存在:app\controller\Abc。那么如果解决这个问题呢? 路由设置: Route::get('letter/:name', 'index/letter'); Route::get('/:s', 'index/search'); 注意这个上下顺序不能换,否则会出错。 控制器Index的代码如下: <?php namespace app\controller; use think\facade\View; use think\facade\Db; class Index { public function index() { $letters = Db::table('letter')->orderRand()->limit(40)->select(); View::assign('letters',$letters); return View::fetch(); } public function search($s = ''...

移动端需要点击两下才能触发click事件,通常是因为移动浏览器会先检测是否存在hover事件,如果存在,则第一次点击会触发hover事件,第二次点击才会触发click事件。这是因为移动设备没有鼠标,无法进行hover操作,为了兼容PC端的hover效果,移动浏览器在处理click事件时会先检测是否存在hover事件。 如果您的div绑定了hover事件,可能会导致移动端需要点击两次才能触发click事件。您可以尝试在CSS中添加以下代码来禁用hover效果: @media (hover: none) { div:hover { pointer-events: none; /* 禁用 hover 效果 */ } } 这样可以在移动端禁用hover效果,从而避免点击两次才能触发click事件的问题。

在插入包含引号的字符串时,可以使用预处理语句和绑定参数的方式来防止SQL注入。具体来说,可以使用MySQL提供的预处理语句功能,将需要插入的数据作为参数传递给SQL语句,而不是将数据直接拼接到SQL语句中。这样可以避免任何特殊字符对SQL语句的影响。例如: $stmt = $mysqli->prepare("INSERT INTO mytable (mycolumn) VALUES (?)"); $stmt->bind_param("s", $mystring); $mystring = '包含"引号"的字符串'; $stmt->execute(); 在这个例子中,我们使用了预处理语句和绑定参数的方式来插入包含引号的字符串。首先,我们使用`prepare()`方法创建了一个预处理语句,其中`?`表示需要插入的数据的占位符。然后,我们使用`bind_p...

在 JavaScript 中,const 和 var 都是用来声明变量的关键字,但它们有一些不同之处。 声明方式不同:使用 const 声明的变量是常量,一旦被赋值就不能再修改;而使用 var 声明的变量是可变的。 作用域不同:使用 const 和 let 声明的变量具有块级作用域,而使用 var 声明的变量具有函数级作用域。 变量提升不同:使用 var 声明的变量会被提升到函数或全局作用域的顶部,而使用 const 和 let 声明的变量不会被提升。 重复声明不同:使用 var 声明的变量可以被重复声明,而使用 const 和 let 声明的变量不能被重复声明。 总的来说,推荐使用 const 和 let 声明变量,因为它们具有更严格的作用域和更好的可读性,而且能够避免一...

要设置一个有效期与session相同的cookie,可以将cookie的过期时间设置为0。这将使cookie在浏览器关闭时自动过期,就像会话cookie一样。 下面是一个示例代码: // 设置cookie过期时间为0 setcookie('cookie_name', 'cookie_value', 0, '/'); 其中,第三个参数是cookie的过期时间。将其设置为0表示cookie在浏览器关闭时过期。第四个参数是cookie的路径,它指定了可以访问该cookie的页面路径。在这个例子中,设置为'/'表示该cookie可以在整个网站中访问。

以下是一个简单的CSS loading样式,简单但是很实用哦~ .loading { display: flex; justify-content: center; align-items: center; height: 100vh; } .loading::before { content: ""; display: block; width: 50px; height: 50px; border-radius: 50%; border: 5px solid #ccc; border-top-color: #333; animation: spin 1s ease-in-out infinite; } @keyframes spin { to { transform: rotate(360deg); } } 这个样式会在页面中心显示一个旋转的圆圈,表示正在加载。可以根据需要调整颜色、大小和动画速度等属性。

我们可以使用 jQuery 的 scrollTop() 方法来设置一个元素的滚动条的垂直偏移量。如果你想要将一个 overflow-y:scroll 的 div 滑动到底部,可以使用以下代码: var div = $('#yourDivId'); div.scrollTop(div.prop('scrollHeight')); 在上面的代码中,scrollTop() 方法接受一个整数参数,表示滚动条的垂直偏移量。我们将 scrollTop() 方法的参数设置为 div.prop('scrollHeight'),这个值表示 div 元素的内容高度,也就是滚动条的最大垂直偏移量,这样就可以将 div 滑动到底部了。 如果你想要在页面加载完成后就将 div 滑动到底部,可以将上面的代码放在 $(document).ready() 函数中: $(document).ready(function() { var div = $(...