织梦自定义表单用js控制必填选项

织梦自定义表单用js控制必填选项代码如下:

 

<script language='javascript'>
function Checkfeedback() {
if (document.myform.name.value.length == 0) {
alert('您的姓名 不能为空');
document.myform.name.focus();
return false;
}
if (document.myform.qq.value.length == 0) {
alert('QQ号码 不能为空');
document.myform.qq.focus();
return false;
}
if (document.myform.email.value.length == 0) {
alert('email 不能为空');
document.myform.email.focus();
return false;
}
if (document.myform.tel.value.length == 0) {
alert('手机 不能为空');
document.myform.tel.focus();
return false;
}
}
</script>


<form action="http://127.0.0.1/plus/diy.php" method="post"

name='myform' onSubmit='return Checkfeedback();'>

关于人人商城小程序开发中遇到的坑

一、首次登陆下叫程序获取用户openid不准确问题
如第一次获取sns_wa
第二次获取sns_wa_sns_wa
等这些空数据 ,使用户进入会员中心也重复验证 还是无法或许信息,只能关闭重新打开小程序才可以

  • 文件路径:..\addons\ewei_shopv2\plugin\app\core\mobile\wxapp.php

修复代码如下:

  • //方法名
  • function check()
  • //修改如下 判断多增加两个条件 openid赋值时也判断下前缀是否重复
  • if( empty($openid) || $openid == ‘sns_wa_’ || $openid == ‘sns_wa_sns_wa_’)
  • {
  • app_error(AppError::$ParamsError);
  • }
  • if(strpos($openid,‘sns_wa_’)!==false){
  • $wxopenid = $openid;
  • }else{
  • $wxopenid = “sns_wa_” . $openid;
  • }

解决思路大概就是获取空openid时返回错误信息 让小程序前端重新获取用户信息,然后传入sns_wa_开头的openid时将重复头部去除来获取正常的openid进行查询,避免重复插入sns_wa_及sns_wa_sns_wa_,也避免重复获取该无用户的用户数据
二、自动授权弹出废除后导致重复授权的解决方法
原理:微信小程序更新后,只有第一次打开页面时调用app.js里的onLaunch方法,解决方法就是用户获取用户信息后再次调用改方法
> bindgetuserinfo
> 用户点击该按钮时,会返回获取到的用户信息,回调的detail数据与wx.getUserInfo返回的一致 open-type=”getUserInfo”
> 基础库1.3.0
WXML
//授权按钮增加获取用户信息方法同意`
JS

  • var i = getApp();
  • bindGetUserInfo:function(e){
  • i.onLaunch()
  • },

三、因二中重复获取用户信息,ios可能存在打开分享页面丢失上级参数mid的问题(无法绑定上级关系)
原理: 在首次调用login的时候把mid存在了全局变量$_W里,在分销方法中判断:如果全局变量$_W的mid存在,而$_GPC的mid不存在,则让$mid=$_W里的mid。
路径1:addonsewei_shopv2pluginappcoremobilewxapp.php
方法名:login()

  • //保存mid
  • if($_GPC[‘mid’]){
  • $_W[‘up_mid’] = intval($_GPC[‘mid’]);
  • }

路径2:addonsewei_shopv2plugincommissioncoremodel.php
方法名:checkAgent()

  • $parent = false;
  • $mid = intval($_GPC[‘mid’]);
  • //获取保存的mid
  • if (empty($mid) &amp;&amp; $_W[‘up_mid’]&gt;0){
  • $mid = $_W[‘up_mid’];
  • }
  • if (!(empty($mid)))
  • {
  • $parent = m(‘member’)-&gt;getMember($mid);
  • }
 

CSS选取第几个标签元素:nth-child(n)、first-child、last-child

前言:今天码代码时候遇到的需求要选取前两个标签元素,查了资料记录下来~

nth-child(n)、first-child、last-child用法
注:nth-child(n)选择器匹配父元素中的第n个子元素。
n可以是一个数字,一个关键字,或者一个公式。

nth-child(n)用法:
1、nth-child(3)
表示选择列表中的第3个标签,代码如下:

li:nth-child(3){background:#fff}
1
2、nth-child(2n)
表示选择列表中的偶数标签,即选择 第2、第4、第6…… 标签,代码如下:

li:nth-child(2n){background:#fff}
1
3、nth-child(2n-1)
表示选择列表中的奇数标签,即选择 第1、第3、第5、第7……标签,代码如下:

li:nth-child(2n-1){background:#fff}
1
4、nth-child(n+3)
表示选择列表中的标签从第3个开始到最后,代码如下:

li:nth-child(n+3){background:#fff}
1
5、nth-child(-n+3)
表示选择列表中的标签从0到3,即小于3的标签,代码如下:

li:nth-child(-n+3){background:#fff}
1
6、nth-last-child(3)
表示选择列表中的倒数第3个标签,代码如下:

li:nth-last-child(3){background:#fff}
1
first-child用法:
1、first-child
first-child表示选择列表中的第一个标签。代码如下:

li:first-child{background:#fff}
1
last-child用法:
1、last-child
last-child表示选择列表中的最后一个标签,代码如下:

li:last-child{background:#fff}

织梦多条件联动筛选带删除功能教程

多条件筛选功能常用在图片、装修、机械设备、商城网站等,一般筛选的条件是用户较关注的项目,没必要什么条件都加入。DedeCMS多条件筛选PHP开发并不带有删除所选条件功能,PHP筛选和JS筛选原理不一样,实现起来并不复杂。

装修效果图实现多条件联动筛选带删除功能分享给大家。

效果参考图

点击“x”符号即可删除筛选条件。

52918-1pq0104pk55

先参考文章《织梦多条件筛选以筛选词为SEO标题教程》,下载两个必要的文件

修改下载后的extend.func.php文件,找到

}

}

}

}

echo $dede_addonfields;

}

在这段代码之前(switch条件case 2 的下面增加case 3)增加如下代码:

1
2
3
4
5
6
7
8
9
case 3:
  $addonfields_items = explode(“,”,$ctag->GetAtt(‘default’));
  for ($i=0; $i<count($addonfields_items); $i++)
  {
  $href = stripos($filterarr,$ctag->GetName() . ‘=’ ) ?  str_replace(“=” . $fields_value,”=” . urlencode($addonfields_items[$i]),$filterarr) : $filterarr . ‘&’ . $ctag->GetName() . ‘=’ . urlencode($addonfields_items[$i] );//echo $href;
  $dede_addonfields .= $fields_value != urlencode($addonfields_items[$i]) ? ” : ‘<span class=”tiao”>’ . $addonfields_items[$i];
  }
  $dede_addonfields .= (preg_match(“/&”.$ctag->GetName().”=/is”,$filterarr,$regm) ? ‘<a title=”删除” href=”‘ . $GLOBALS[‘cfg_basehost’] . str_replace(“&” . $ctag->GetName() . “=” . $fields_value,””,$filterarr) . ‘”> x </a></span>’ : ”);
  break;

模板部分PHP调用

增加未筛选时不显示“筛选条件”字样,用PHP判断自定义字段不为空则显示。

 

<p class="textc yixuan">
  {dede:php}
  $a = $_GET['zxfg'];
  $b = $_GET['hx'];
  $c = $_GET['zxmj'];
  if($a != '' || $b != '' || $c != '')
  echo "筛选条件:";
  AddFilter(7,3,'zxfg,hx,zxmj'); //“7”是自定义字段(橙色部分)所在的频道模型ID,“3”是上面修改部分,下面同理;
  {/dede:php}
  </p>
  <div class="shaixuanbox">
  {dede:php}
  AddFilter(7,1,'zxfg,hx,zxmj');
  {/dede:php}
  </div>


CSS样式:
.shaixuanbox{width:100%;height:auto;margin:0 auto 10px;border-bottom:1px solid #c0c0c0}
  .shaixuan{padding:10px;text-align:left;font-size:14px;line-height:14px}
  .shaixuan a{margin:0 6px;color:#000}
  .shaixuan a:hover{color:#32B9AB}
  .shaixuan .hover,.shaixuan span{padding:0 5px;color:#fff;background:#32B9AB}
  .tiao{position:relative;padding:0 20px 0 5px;border:1px solid #eee;border-radius:5px;margin-right:5px;}
  .tiao a{position:absolute;right:5px;top:0;font-size:20px;color:#ccc;line-height:31px;}
  .tiao a:hover{text-decoration:none;}

360恢复前端公共库CDN服务 但调用URL地址有变更

360日前又恢复了前端公共库的CDN服务,不过所有资源的调用URL地址已经进行了变更。

所以至今仍在使用360前端公共库CDN服务的站长应该及时调整地址,不然网站访问还是会出问题。

360恢复前端公共库CDN服务 但调用URL地址有变更

(点击图片看查看大图)

此前运营了几年的360前端公共库CDN服务发布公告称由于业务调整立即关闭了该服务。

由于事情发生的比较突然且没有提前通知,当时导致了国内一大批使用该服务的网站出现了问题。

尤其是很多WordPress站点使用的主题直接调用了该库的文件,对于没有技术能力排查和调整的站长造成了不少了麻烦。

不过现在该前端公共库CDN服务由360奇舞团(奇虎360旗下前端开发团队)的内部协调后再次启动。

新版的360前端公共库CDN服务新增对HTTPS和HTTP/2的支持,资源上包括常用库和Google字体。

在这里也特别需要提醒站长们的是虽然公共库CDN服务恢复,但调用的URL地址已经进行了变更。

也就是说你需要使用新的资源调用地址才可以,尤其是对于没有技术能力调整的WordPress站长应该联系主题开发者对主题进行升级调整后再使用。

新版360前端公共库CDN服务:https://cdn.baomitu.com/

新旧URL对比:

//lib.baomitu.com <新>

http://libs.useso.com <旧>

附360的公告原文:

360网站卫士前端公共库服务之前因故停止使用一个多月,为了保障各位站长能够继续享用高质量的前端资源CDN服务,经过公司内部协调,该项服务由360奇舞团(奇虎360旗下前端开发团队)再次启动。新版的前端公共库支持HTTPS和HTTP/2,囊括了二千多个常见的前端资源库和 Google 字体库。

目前新版前端公共库的域名已经更换,旧版的域名已不再使用,请进入新版前端公共库官网重新获取资源地址,及时更换相关链接。

360网站卫士团队

ul li 默认样式写法

ul li:first-child{margin-left:0;}  第一个
ul li:last-child{margin-left:0;}   最后一个
ul li:nth-child(5){margin-left:0;} 指定第几个
ul li:nth-child(3n+1){background:orange;}/*匹配第1、第4、第7、…、每3个为一组的第1个LI*/
ul li:nth-child(odd){background:orange;}   基数
ul li:nth-child(even){background:orange;}  偶数

AMH控制面板通过Rewrite设置域名301重定向

如果你通过AMH设置过静态化,那么在你的管理模块下就会有AMRewrite这个模块。

因为AMH是基于Nginx环境的,所以我们在网站根目录通过.htaccess文件定义301永久跳转是不会生效的,而这里我们就需要做好Nginx的301跳转。

看过很多人发布的文章,说是从/usr/local/nginx/conf/vhost文件夹下找到一个*.conf的文件,在里面添加代码即可实现301。但是使用AMH做静态化的时候,有一个模块叫AMRewrite,我们通过这个模块也可以直接实现网站的301重定向。

1.进入AMH后台,点击进入模块扩展-模块管理;

2.查看AMRewrite模块,选择管理模块;

3.这时候会有一个列表,里面有很多的*.conf文件,我们可以新建一个301.conf

4.在规则内容中添加如下代码:

 

location / {
if ($host = ‘fuhaodoor.cn’ ) {
rewrite ^/(.*)$ http://www.fuhaodoor.cn/$1 permanent;
}
}

 

5.重启服务器完成设置。

redis实现高并发下的抢购/秒杀功能

之前写过一篇文章,高并发的解决思路(点此进入查看),今天再次抽空整理下实际场景中的具体代码逻辑实现吧:
抢购/秒杀是如今很常见的一个应用场景,那么高并发竞争下如何解决超抢(或超卖库存不足为负数的问题)呢?

常规写法:

查询出对应商品的库存,看是否大于0,然后执行生成订单等操作,但是在判断库存是否大于0处,如果在高并发下就会有问题,导致库存量出现负数

这里我就只谈redis的解决方案吧…
我们先来看以下代码(这里我以laravel为例吧)是否能正确解决超抢/卖的问题:

复制代码
<?php
 
 $num = 10;   //系统库存量
 $user_id =  \Session::get('user_id');//当前抢购用户id
 $len = \Redis::llen('order:1');  //检查库存,order:1 定义为健名
 if($len >= $num)
   return '已经抢光了哦';

$result = \Redis::lpush('order:1',$user_id);  //把抢到的用户存入到列表中
if($result)
  return '恭喜您!抢到了哦';
复制代码

如果代码正常运行,按照预期理解的是列表order:1中最多只能存储10个用户的id,因为库存只有10个。
然而,但是,在使用jmeter工具模拟多用户并发请求时,最后发现order:1中总是超过5个用户,也就是出现了“超抢/超卖”。
分析问题就出在这一段代码:

 $len = \Redis::llen('order:1');  //检查库存,order:1 定义为健名
 if($len >= $num)
   return '已经抢光了哦';

在抢购进行到一定程度,假如现在已经有9个人抢购成功,又来了3个用户同时抢购,这时if条件将会被绕过(条件同时被满足了),这三个用户都能抢购成功。而实际上只剩下一件库存可以抢了。
在高并发下,很多看似不大可能是问题的,都成了实际产生的问题了。要解决“超抢/超卖”的问题,核心在于保证检查库存时的操作是依次执行的,再形象的说就是把“多线程”转成“单线程”。即使有很多用户同时到达,也是一个个检查并给与抢购资格,一旦库存抢尽,后面的用户就无法继续了。
我们需要使用redis的原子操作来实现这个“单线程”。首先我们把库存存在goods_store:1这个列表中,假设有10件库存,就往列表中push10个数,这个数没有实际意义,仅仅只是代表一件库存。抢购开始后,每到来一个用户,就从goods_store:1中pop一个数,表示用户抢购成功。当列表为空时,表示已经被抢光了。因为列表的pop操作是原子的,即使有很多用户同时到达,也是依次执行的。抢购的示例代码如下:
比如这里我先把库存(可用库存,这里我强调下哈,一般都是商品详情页抢购,后来者进来看到的库存可能不再是后台系统配置的10个库存数了)放入redis队列:

复制代码
 $num=10; //库存
 $len=\Redis::llen('goods_store:1'); //检查库存,goods_store:1 定义为健名
 $count = $num-$len; //实际库存-被抢购的库存 = 剩余可用库存
 for($i=0;$i<$count;$i++)
   \Redis::lpush('goods_store:1',1);//往goods_store列表中,未抢购之前这里应该是默认滴push10个库存数了

 //echo \Redis::llen('goods_store:1');//未抢购之前这里就是10了
复制代码

好吧,抢购时间到了:

 /* 模拟抢购操作,抢购前判断redis队列库存量 */
 $count=\Redis::lpop('goods_store:1');//lpop是移除并返回列表的第一个元素。
 if(!$count)
    return '已经抢光了哦';
 /* 下面处理抢购成功流程 */
\DB::table('goods')->decrement('num', 1);//减少num库存字段

用户抢购成功后,上面的我们也可以稍微优化下,比如我们可用将用户ID存入了order:1列表中。接下来我们可以引导这些用户去完成订单的其他步骤,到这里才涉及到与数据库的交互。最终只有很少的人走到这一步吧,也就解决的数据库的压力问题。
我们再改下上面的代码:

复制代码
$user_id =  \Session::get('user_id');//当前抢购用户id
/* 模拟抢购操作,抢购前判断redis队列库存量 */
$count=\Redis::lpop('goods_store:1');
if(!$count)
  return '已经抢光了哦';

$result = \Redis::lpush('order:1',$user_id);
if($result)
  return '恭喜您!抢到了哦';
复制代码

为了检测实际效果,我使用jmeter工具模拟100、200、1000个用户并发进行抢购,经过大量的测试,最终抢购成功的用户始终为10,没有出现“超抢/超卖”。

上面只是简单模拟高并发下的抢购思路,真实场景要比这复杂很多,比如双11活动远远比这更复杂多啦,很多注意的地方如抢购活动页面做成静态的,通过ajax调用接口
再如上面的会导致一个用户抢多个,思路:
需要一个排队队列(比如:queue:1,以user_id为值的列表)和抢购结果队列(比如:order:1,以user_id为值的列表)及库存队列(比如上面的goods_store:1)。高并发情况,先将用户进入排队队列,用一个线程循环处理从排队队列取出一个用户,判断用户是否已在抢购结果队列,如果在则已抢购,否则未抢购,接着执行库存减1,写入数据库,将此user_id用户同时也进入结果队列。