Alpha Technology Group Limited, ATGL, $21.70, Change % -3.13

博客

  • thinkcmf 留言版(前端)

    一个留言表单,用于收集用户的姓名、电话、邮箱、地址和备注信息,并将数据提交到后端进行处理。不过代码似乎没有写完,textarea标签缺少闭合标签。以下是对这段代码的详细分析和补充完整的示例:

    代码分析
    1. 表单属性
    form标签的action属性值是经过URL编码的路由地址%7B:url('portal/GuestBook/add')%7D,解码后应该是指向后端添加留言的处理逻辑,也就是对应之前提到的GuestBookController中的add方法。
    method="post"指定了表单使用POST方式提交数据,这与后端代码中判断isPost()相契合。
    2. 输入字段:每个输入字段(inputtextarea)都设置了placeholder属性,用于在输入框为空时显示提示文字,还设置了name属性,用于给后端传递数据时标识每个字段。

    补充完整并优化后的代码

    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
        <meta charset="UTF-8">
        <title>留言表单</title>
    </head>
    <body>
        <form id="form" name="form" action="{:url('portal/GuestBook/add')}" method="post">
            <dd>
                <div>姓名</div>
                <div>
                    <span>
                        <input type="text" placeholder="姓名" data-defaultval="姓名" name="guest_name" value="">
                    </span>
                </div>
            </dd>
            <dd>
                <div>电话</div>
                <div>
                    <span>
                        <input type="text" placeholder="电话" data-defaultval="电话" name="guest_phone" value="">
                    </span>
                </div>
            </dd>
            <dd>
                <div>邮箱</div>
                <div>
                    <span>
                        <input type="text" placeholder="邮箱" data-defaultval="邮箱" name="guest_email" value="">
                    </span>
                </div>
            </dd>
            <dd>
                <div>地址</div>
                <div>
                    <span>
                        <input type="text" placeholder="地址" data-defaultval="地址" name="guest_address" value="">
                    </span>
                </div>
            </dd>
            <dd>
                <div>备注</div>
                <div>
                    <span>
                        <textarea placeholder="备注" data-defaultval="备注" name="guest_content"></textarea>
                    </span>
                </div>
            </dd>
            <dd>
                <div>验证码</div>
                <div>
                    <span>
                        <!-- 这里需要添加验证码相关的前端展示代码,例如图片验证码或者短信验证码输入框 -->
                        <input type="text" placeholder="验证码" name="captcha" value="">
                    </span>
                </div>
            </dd>
            <dd>
                <input type="submit" value="提交留言">
            </dd>
        </form>
    </body>
    </html>
    

    补充说明
    1. 闭合标签:补充了textarea的闭合标签,确保HTML语法正确。
    2. 验证码:添加了一个验证码输入框,不过这里只是简单添加了输入框占位,实际项目中还需要结合后端验证码生成逻辑,添加对应的验证码图片或者短信验证码获取按钮等相关组件。

  • 解决mysql修改auto_increment不生效

    在数据库开发的日常工作中,我们常常会碰到需要删除某些记录,并且重置表自增ID的情况。接下来,就为大家详细介绍一下相应的操作流程与解决后续问题的办法。

    重置自增ID

    想要重置表的自增ID起始值,只需执行一条SQL语句:ALTER TABLE tablename AUTO_INCREMENT = 1; 。不过,这里有个关键要点要牢记:您所设定的AUTO_INCREMENT值,必须大于该表现有键的最大值。要是忽略了这一点,这条语句在执行时,既不会抛出错误提示,重置操作也不会如预期般生效,这无疑会给后续开发工作埋下隐患。

    查看自增ID信息

    有时,即便我们已经成功执行了自增ID的重置语句,可当查询表信息的时候,却惊讶地发现,自增键显示的数值依旧是原来的记录,这着实让人有些摸不着头脑,对于那些追求数据精准、完美的开发者来说,更是难以忍受。其实,要想获取表当前准确的自增ID信息,只需运行下面这条SQL语句:SELECT AUTO_INCREMENT FROM information_schema.tables WHERE table_name = 'tablename';。借助这条语句,就能从系统表information_schema.tables里精准定位到指定表(tablename)的自增ID设定数值。

    更新表信息

    要是遇上自增ID显示与预期不符的状况,别着急,还有个简单有效的解决办法。只需执行ANALYZE TABLE tablename;语句,对目标表开展一次全面的“体检”与分析。经过这一番操作,表内各类信息就会得到及时更新,先前出现的自增ID显示异常问题,自然也就迎刃而解了。

  • thinkcmf伪静态文件

    用于ThinkCMF框架的伪静态配置,常见于Nginx服务器环境,下面详细解读一下:

    1. 根路径/的配置
      location / {
          if (!-e request_filename){
              rewrite  ^(.*)  /index.php?s=$1  last;   break;
          }
      }
      
      • if (!-e $request_filename) 这一条件判断非常关键,它检查请求的文件是否真实存在于服务器磁盘上。如果不存在,就会触发后续的重写规则。
      • rewrite ^(.*)/index.php?s=1 last; break;:这是重写规则的核心部分。^(.*)$ 会匹配任意的URL路径,捕获所有内容到变量$1中,然后将请求重定向到/index.php?s=$1last 指令告知Nginx,在当前重写规则执行完后,要停止当前location块内的其他重写操作,开始新一轮的请求处理;break 则进一步强调停止当前重写流程,避免不必要的循环。整体效果就是,当用户访问一个不存在的静态文件时,请求会被转发到ThinkCMF的入口文件index.php,并带上原始请求路径作为参数s,这样框架就能处理这个请求,模拟出静态页面访问的效果。
    2. /api/路径的配置
      location /api/ {
          index  index.php index.html index.htm;
          if (!-e request_filename)
          {
              rewrite ^/api/(.*) /api.php?s=$1;
          }
      }
      
      • index index.php index.html index.htm; 定义了该目录下默认的索引文件顺序,当访问/api/目录时,如果没有指定具体文件名,Nginx会按这个顺序查找对应的文件。
      • if (!-e $request_filename) 同样是判断请求的文件是否存在。若不存在,rewrite ^/api/(.*)/api.php?s=1; 这条规则会起作用,把/api/路径下的请求,捕获子路径部分到$1,重定向到/api.php?s=$1,让api.php来处理相关请求,实现了对/api/目录下的伪静态处理,保证了ThinkCMF框架中的API相关请求也能被正确处理。

    这份伪静态配置通过巧妙的重写规则,保障了ThinkCMF应用无论是常规页面访问,还是API相关访问,都能在Nginx服务器上顺畅运行,模拟出更友好的静态页面访问体验。不过,在实际部署时,还需要根据服务器的具体环境、项目的特性,对这些规则进行微调优化,避免潜在的冲突与错误。

  • 网站防复制

    JavaScript代码旨在实现网站内容防复制的功能,不过这种防复制手段只能起到一定的阻拦作用,并不能从根本上杜绝内容被复制,下面详细分析一下:

    1. 事件绑定函数 bindEvent
      var bindEvent = function(obj, ev, fun) {
          if (obj.attachEvent) {
              obj.attachEvent("on" + ev, fun);
          } else {
              obj.addEventListener(ev, fun);
          }
      }
      

      这个函数用于兼容不同浏览器的事件绑定方式。在旧版本的IE浏览器中,使用attachEvent方法来绑定事件,格式是attachEvent("on" + 事件名, 回调函数);而在现代标准浏览器中,使用addEventListener方法,格式为addEventListener(事件名, 回调函数)。通过这个函数,可以跨浏览器进行事件绑定。

    2. 防复制主函数 prevent_copy

      function prevent_copy() {
          (document).bind("contextmenu", function () { return false; });(document).bind("selectstart", function () { return false; });
          (document).keydown(function () { return key(arguments[0]) });(function () {
              $('body').css('-moz-user-select', 'none');
          });
      }
      
      • $(document).bind("contextmenu", function () { return false; });:禁用了右键菜单弹出,因为通常用户复制内容会先右键点击,触发contextmenu事件,这里直接返回false就阻止了右键菜单显示。
      • $(document).bind("selectstart", function () { return false; });:阻止了文本选中操作,用户无法通过鼠标拖动来选中网页上的文字,切断了复制操作的起始步骤。
      • $(document).keydown(function () { return key(arguments[0]) });:监听键盘按下事件,并将事件对象传递给key函数进行处理,目的是拦截一些复制快捷键。
      • $(function () { $('body').css('-moz-user-select', 'none'); });:使用CSS属性-moz-user-select(主要针对Firefox浏览器)设置用户不能选择网页文本,这是一种从样式层面辅助防复制的手段。
    3. 按键处理函数 key
      function key(e) {
          var keynum;
          if (window.event) keynum = e.keyCode; // IE                   
          else if (e.which )  keynum = e.which; // Netscape/Firefox/Opera
          if (e.ctrlKey && (keynum == 88 || keynum == 67)) { alert('防止复制!'); return false; }
      }
      

      这个函数用于判断按下的键是否是复制快捷键(Ctrl + C 对应键码67,Ctrl + X对应键码88 ),并且同时按下了Ctrl键。如果满足条件,弹出警告框提示“防止复制!”,并返回false阻止默认的复制、剪切操作。

    4. 启动防复制功能

      bindEvent(window, 'load', prevent_copy);
      

      最后,利用bindEvent函数,在页面加载完成(windowload事件触发)时,调用prevent_copy函数,启动整个防复制机制。

    值得注意的是,这种防复制方式很容易被绕过,比如通过浏览器开发者工具禁用JavaScript,或者查看网页源代码等方式,依然可以获取到内容。如果要更有效地保护内容,可能需要借助服务器端技术、加密手段等来综合考量。

  • thinkcmf 导航激活状态联动(片段)

    “`htmlnn

    n

    n

    n

    n

    n

    n

    n

    n {$menu.name|default=”}n

    n

    n

    n nn“`n> 用于判断当前页面的URL是否与导航菜单项的链接相同,如果相同则为菜单项添加一个指定的类名。nn1. $_SERVER[‘REQUEST_URI’] 用于获取当前页面的完整URL。n2. 使用条件语句判断菜单项的链接是否为根路径 /。n3. 如果是根路径,则判断当前URL是否也为根路径,如果相同则为菜单项添加类名 NItemCur,否则不添加。n4. 如果菜单项的链接不是根路径,则使用 strpos 函数判断当前URL是否包含菜单项的链接,如果包含则为菜单项添加类名 NItemCur,否则不添加。nn“`javascriptnn“`n> 至于内页的导航状态,我用了jq来控制

  • 帝国cms首页被木马无法找到文件的处理方法

    ## 事情是这样的n朋友公司的网站首页被挂马了,找我看看。n![](https://www.jefsky.com/storage/markdown/images/13c5fd301c72e227825d3397085ae6e1666aa42eacc9f.png)n打开首页源码发现头部被植入了恶意js。这部分代码设置了页面的标题、关键词和描述,但它们都使用了HTML实体编码(例如 国 代表中文字符“国”),解码后显示的是与产品推广、在线观看、品牌精品、亚洲等内容相关的标题和元信息。这明显是为了吸引用户点击或优化搜索引擎排名,但需要注意的是,内容似乎与朋友公司的主题不符,且含有敏感词汇,可能涉及不当或违规信息。所以必须得清楚。n既然找到木马了,那就找到首页删除就好了。n## 如果事情真的那么简单得话,就不会有这篇文章了n开始我翻遍了整个网站目录都没有找到,甚至把首页文件删了,缓存清了,网站首页还是安然无恙,那就奇怪了。n想了想帝国cms就是生成静态页面然后给人访问的吖,难道是js?又翻一遍。甚至试着全文搜编码,还是不行。n尝试着改内页,有反应!就是首页安然无恙。打开开发者工具,没有301或者302。推倒了,我觉得他是重定向要别的地方的猜想。那肯定是在本地,会在哪…n## 睡过一觉,,,,n没有在前端跳转,那会不会在服务器呢?既然修改首页没问题,那是不是说明其实根本没有进入到本地的首页?n顺着这个思路,我翻了下服务器的配置文件。没找到.htaccess相关的文件,但是发现了web.config顾名思义也是网站配置文件吧,打开一看,还家伙!如果不细心还真的以为没毛病n## IIS的URL重写模块配置n![](https://www.jefsky.com/storage/markdown/images/3b0baa9ed9a67c9a554883c91c07d61c666aa9cb3b68f.png)n开始的重写规则还是蛮正常的,将非HTTPS请求重定向到HTTPS。n“`xmln 元素定义了一个重写规则,name 属性为 “301”,stopProcessing 属性为 “true” 表示匹配到该规则后停止处理后续规则。n 元素用于匹配请求的URL,url 属性为 “^(.*)$” 表示匹配任何内容,ignoreCase 属性为 “false” 表示区分大小写。n 元素定义了匹配的条件,logicalGrouping 属性为 “MatchAll” 表示所有条件都必须满足。n 元素是一个条件,input 属性为 “{HTTP_FROM_HTTPS}” 表示获取请求头中的 “HTTP_FROM_HTTPS” 值,pattern 属性为 “^on$” 表示匹配值为 “on”,negate 属性为 “true” 表示取反,即不等于 “on”。n 元素定义了匹配成功后的处理方式,type 属性为 “Redirect” 表示重定向,url 属性为 “https://www.xxx.cn/{R:1}” 表示将匹配到的内容替换到目标URL中,redirectType 属性为 “Permanent” 表示重定向类型为 301 永久重定向。n“`n不细心的话还真以为这就是个强制https的规则文件,但是看到后面,嗯!?这是个反向代理功能喔!这段XML代码的作用是将访问根目录的请求重定向到指定的URL地址。一问,ip不认识,那不就是你!n“`xmln 标签定义了一个规则,name 属性为 “HomepageReverseProxy”,用于标识该规则。n 标签指定了匹配的URL模式,url 属性为 ^/?$,表示匹配根目录的URL路径。n 标签定义了匹配成功后的操作,type 属性为 “Rewrite”,表示进行URL重写操作。url 属性为 http://38.63.33.31/{R:0},表示将请求重定向到指定的URL地址。n“`nn把重定向的删了之后,网站正常了n## 疑问n不知道这是怎么入侵的,我觉得是有人想为了吸引用户点击或优化搜索引擎排名所以搞这一出的,但是我朋友说不知道,资料也没给过别人。也罢,找到原因了就算吧。

  • yarn出现“There are no scenarios ; must have at least one”

    ### 事情是这样的,新部署好ubuntu服务器想用yarn安装一下,结果就出现n> There are no scenarios ; must have at least onenn### 直接放代码吧n“`bashnsudo apt remove cmdtestnsudo apt remove yarnn ncurl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -necho “deb https://dl.yarnpkg.com/debian/ stable main” | sudo tee /etc/apt/sources.list.d/yarn.listn nsudo apt updatensudo apt install yarnn“`

  • 关于Laravel取消超时未支付订单的菜鸡解决方案(定时任务)

    ## 需求是这样的:n很多时候用户下单之后不会立刻结账付款,把订单一直挂着,甚至有些用户久而久之把订单忘记了。这样会导致库存一直被占用,经营无法正常进行了。所以,建议给用户订单一个超时时间,够钟就系统自动取消订单。n## 大概思想n用的是Laravel里的任务调度,每分钟调度一次,执行查询所有没确定的订单,然后统一取消。弊端就是时效性有点欠缺吧,固定时间执行,会出现订单时间到了,但是还没到任务调度时间。还有个问题就是,固定每分钟执行,就算明知道没有新订单了,还是会去调度,如果数据量大,问题就很大了。nn## 操作n####创建一个命令文件n`php artisan make:command CancelOrdersByUnpaid`n####编辑 app/Console/Commands/CancelOrdersByUnpaid.php 文件:n namespace App\Console\Commands;n n use App\Helpers\ResponseEnum;n use App\Models\ShopOrder;n use App\Service\Api\ShopOrderGoodsService;n use App\Service\Api\UserCouponService;n use Illuminate\Console\Command;n use Carbon\Carbon;n use Illuminate\Support\Facades\Log;n n class CancelUnpaidOrders extends Commandn {n /**n * The name and signature of the console command.n *n * @var stringn */n protected signature = ‘orders:cancel’;n n /**n * The console command description.n *n * @var stringn */n protecteddescription = ‘Command description’;n n /**n * Execute the console command.n *n * @return intn */n public function handle()n {n unpaidOrders = ShopOrder::where(‘status’, ‘0’)->where(‘add_time’, ‘subHours(24)))->get();n if(!empty(unpaidOrders)){n foreach (unpaidOrders asorder) {n order->status = ‘-1’;norder->save();n ShopOrderGoodsService::cancelDataByOrderId(order->id);n if (order->user_coupon_id) {n update_data[‘id’] =order->user_coupon_id;n update_data[‘user_id’] =order->user_id;n update_data[‘is_use’] = ‘0’;n UserCouponService::updateInfoByOrder(update_data);n }n }n }n Log::info(‘取消订单定时任务执行’.time());n return Command::SUCCESS;n }n }nn#### 修改 app/Console/Kernel.php 文件,注册定时任务:n protected function schedule(Schedule schedule)n {n //schedule->command(‘inspire’)->hourly();n $schedule->command(‘orders:cancel’)->everyMinute()->onSuccess(function () {n Log::info(‘schedule任务执行成功’.time());n })n ->onFailure(function () {n Log::info(‘schedule任务执行失败’.time());n });n n Log::info(‘schedule任务’.time());n }nn#### 配置服务器Cronn`crontab -u www -e` 打开cron配置n> 这里需要主要!必须要用www用户来创建,不然默认是root用户,后期会造成日志文件由root创建,laravel无法写入日志报错nn添加 `* * * * * cd /www/wwwroot/project && php artisan schedule:run >> /dev/null 2>&1`nn执行 `php artisan schedule:run`nn至此 Laravel取消超时未支付订单的菜鸡解决方案 基本完成

  • 解决Laravel 定时任务日志权限问题

    ### laravel 项目 计划任务 日志文件出现root 账号权限,导致www 无法写入 错误解决nn1. 删除root用户的日志文件n2. 使用www用户来配置crontabnn `crontab -u www -e`nn > 注意:www 取决于您服务器的web用户名n n3. 添加计划任务nn `* * * * * cd /www/wwwroot/project && php artisan schedule:run >> /dev/null 2>&1`

  • Lorem ipsum

    Lorem Ipsum,确实是一种常用的虚拟文本,也称为占位符文本或哑元文本,主要用于在排版、设计、印刷和网页开发中模拟实际内容,以便预览布局和视觉效果。nn### 它起源于哪里?nLorem Ipsum的起源可以追溯到一篇经典的拉丁文献,具体是西塞罗(Cicero)的《De Finibus Bonorum et Malorum》(论善与恶的界限)。这段文本是西塞罗在公元前45年写成的,并在文艺复兴时期被广泛阅读。Lorem Ipsum的开头“Lorem ipsum dolor sit amet”就是从这篇文献中选取的。nn### 我们为何用它?n使用Lorem Ipsum的主要原因是为了在排版和设计中提供一个标准的、可读的、不引人注目的文本内容。这有助于设计师和开发人员更专注于页面的布局、颜色、字体和其他视觉元素,而不必担心实际内容的影响。nn### 我能从哪里获取?n你可以从互联网上找到各种版本的Lorem Ipsum。但是,为了确保内容的准确性和专业性,最好从可靠的来源获取。有些网站提供了Lorem Ipsum的生成器,可以根据需要生成任意长度的Lorem Ipsum文本。此外,一些桌面排版软件和网页开发工具也内置了Lorem Ipsum作为默认的占位符文本。nn总之,Lorem Ipsum是一种非常有用的工具,它可以帮助设计师和开发人员更好地预览和测试他们的作品。