最土团购数据表结构

代金券card

id 代金券ID
   code 识别码
   partner_id 商户ID
   team_id 商品ID
   order_id 订单ID
   credit  代金券金额
   consume  是否使用过
   ip       时候时候的IP
   begin_time  有效期开始时间
   end_time    有效期结束时间

分类表category

 分类的id:  id
分类类型:  zone
分类的分组: czone
分类名称:  name
分类的英文名称: ename
分类的名称首字:letter
分类的排序:sort_order
是否显示首页:display

订单表order

订单id: id
pay_id: 支付编号,也就是订单编号
buy_id: 购买会员的ID
service: 支付方式
会员ID:user_id
管理员id: admin_id,判断是否管理员
项目ID:   team_id
城市ID:   city_id
代金券ID: card_id
支付状态: state
商品数量: quantity
真实姓名: realname
手机号码: mobile
邮政编码: zipcode
收货地址: address
是否选择快递:express
快递编号: express_id
快递单编码: express_no
商品价格:  price
已支付金额: money
订单总价格: origin
积分获取:  credit
使用优惠券金额:card
商品属性:condbuy
购买备注:remark
下单时间:create_time
支付时间:pay_time
评论内容:comment_content
评论显示:comment_display
评论级别:comment_grade
评论时间:comment_time
商家ID:  partner_id
短信通知:sms_express

最土数据库优惠券表coupon

优惠卷ID:  id
会员的ID:  user_id
商户的ID:  partner_id
项目的ID:  team_id
订单编号ID:order_id
类型:      type
获得积分:  credit
优惠卷密码:secret
是否使用过:consume
使用优惠卷时的ip:ip
是否成功发送短信:sms
优惠券过期时间:expire_time
短信发送时间:sms_time
该项目下的购买次序:buy_id

最土数据库商家信息partner

商户ID:  id
商户用户名: username
商户密码:password
商户名称:title
商户商品分类:group_id
商户网站地址:homepage
商户城市id:  city_id
商户银行帐户名称:bank_name
商户银行帐户帐号:bank_no
商户用户名:      bank_user
商户所处位置:  location
商户联系人:   contact
商户图片:image
商户图片1:image1
商户图片2:image2
商户电话号码:phone
商户联系地址:address
商户其他信息:other
商户手机号码:mobile
商户展示:open
商户会员id:user_id
商户建立时间:create_time
是否显示首页:display
对商户评论满意数量:comment_good
对商户评论一般数量:comment_none
对商户评论失望数量:comment_bad

最土数据库管理员日志表logger_admin结构

日志编号:id

      操作管理员ID:  user_id

      操作管理员的邮件:user_email

      操作类型:   type

      操作描述:  operation

      相关数据:relate_data

      操作时间:create_on

最土会员user表结构

会员id:     id
会员邮件:    email
会员名称:    username
会员真实名:   realname
会员密码:    password
会员头项:    avatar
性别:        gender
手机号码:    mobile
联系QQ:     qq
帐户余额:   money
帐户积分:  score
邮政编码:   zipcode
联系地址:    address
所在城市ID:  city_id
是否通过邮件验证:enable
是否为管理员:manager
邮件验证的密钥:secret
修改密码的密钥种子:recode
登陆时IP地址:    ip
最后登陆时间:    login_time
注册时间:       create_time

最土数据库友情链接表friendlink

友情连接ID:id

      友情链接标题:title

      友情链接地址:url

      友情链接logo: logo

      排序:     sort_order

      是否显示首页:display

最土数据库邀请返利表invite

  邀请id:   id

      邀请人ID:user_id

      处理邀请的管理员: admin_id

      邀请注册时IP:  user_ip

      被邀请人ID: other_user_id

      项目ID:   team_id

      是否支付:pay

       获得的返利: credit

      购买时间:buy_time

      写入记录时间: create_time

最土数据库问题反馈表feedback

  留言编号: id

    城市id:    city_id

    留言用户id: user_id

    留言类型:       category

    称呼:           title

   联系email :  contact

    留言内容: conent

   留言时间: create_time

最土数据库提问答疑ask

提问ID: id

     提问用户UID: user_id

     团购项目id:  team_id

     提问所在城市id:city_id

     提问类型:    type

     提问内容:content

     回复内容:comment

     提问时间:create_time

最土积分兑换商品数据库goods

积分商品id:     id

    积分商品标题: titie

    兑换所需要的积分:score

    积分商品的图片: image

    积分商品创建时间: time

    排序字段:              sort_order

     已经兑换数量:consume

    是否显示: display

最土数据库邮件订阅表subscribe

订阅ID:   id

    订阅邮件:email

    订阅所在的城市ID:city_id

     订阅时候的密钥:  secret

最土数据库手机号码订阅表smssubscribe

订阅编号:  id

      订阅的手机号:   mobile

      城市ID:       city_id

      手机订阅的密钥:secret

      状态:     enable

      订阅时间:create_time

最土收货人信息功能分析

    我们在使用和研究最土程序的时候。就必须知道和了解最土收货人信息功能,我们在在最土后台录入最土项目的时候,在填写配送信息的时候,我们可以选择使用优惠券,当然也可以为该商品选择对应的物流。那么他就是记录在express字段中。

    首先我们看购买信息填写页面,当录入该商品的时候。选择了物流信息。那么在购买该商品的时候,就必须填写收货人信息和地址。首先我们找到对应的模板。

     <!--{if$team['delivery']=='express'}-->
   <divclass="expresstip">${nl2br(htmlspecialchars($team['express']))}</div>
   <div class="wholetip clear"><h3>快递信息</h3></div>
   <div class="field username">
    <label>收件人</label>
    <input type="text" size="30"name="realname" id="settings-realname"class="f-input" value="{$login_user['realname']}"require="true" datatype="require" />
    <span class="hint">收件人请与有效证件姓名保持一致,便于收取物品</span>
   </div>
   <div class="field mobile">
    <label>手机号码</label>
    <input type="text" size="30"name="mobile" id="settings-mobile" class="number"value="{$login_user['mobile']}" require="true"datatype="mobile" maxLength="11" /> <spanclass="inputtip">手机号码是我们联系您最重要的方式,请准确填写</span>
   </div>
    <div class="field username">
    <label>收件地址</label>
    <input type="text" size="30"name="address" id="settings-address"class="f-input" value="{$login_user['address']}"require="true" datatype="require" />
    <span class="hint">为了能及时收到物品,请按照格式填写:_省_市_县(区)_</span>

   当我们填写完信息最土的订单信息之后,我们可以将数据提交到数据库表order中去。具体的代码参考以下。

    $insert = array(
   'user_id', 'team_id', 'city_id', 'state', 'express_id',
   'fare', 'express', 'origin', 'price',
   'address', 'zipcode', 'realname', 'mobile',
   'quantity', 'create_time', 'remark', 'condbuy',
  );
 if ($flag = $table->update($insert)) {
  $order_id = abs(intval($table->id));
  
  /* 插入订单来源 */
  $data['order_id'] = $order_id;
  $data['user_id'] = $login_user_id;
  $data['referer'] = $_COOKIE['referer'];
  $data['create_time'] = time();
  DB::Insert('referer', $data);
  
  redirect(WEB_ROOT."/order/check.php?id={$order_id}");
 }
   </div>
   <div class="field mobile">
    <label>邮政编码</label>
    <input type="text" size="30"name="zipcode" id="settings-mobile"class="number" value="{$login_user['zipcode']}"require="true" datatype="zip" maxLength="6" />
   </div>
   <!--{else}-->

     当最土的订订单提交后,我们就可以通过后台查看订单的详细信息。具体的代码。可以参考以下代码。

else if ( 'orderview' ==$action) {
 $order = Table::Fetch('order', $id);
 $user = Table::Fetch('user', $order['user_id']);
 $team = Table::Fetch('team', $order['team_id']);
 $order['referer'] = Table::Fetch('referer', $id);
 
 if ($team['delivery'] == 'express') {
  $option_express = option_category('express');
  $order['express_name'] = $option_express[$order['express_id']];
 }
 $payservice = array(
  'alipay' => '支付宝',
  'tenpay' => '财付通',
  'chinabank' => '网银在线',
  'credit' => '余额付款',
  'cash' => '线下支付',
 );
 $paystate = array(
  'unpay' => '<font color="green">未付款</font>',
  'pay' => '<font color="red">已付款</font>',
 );
 $option_refund = array(
  'credit' => '退款到账户余额',
  'online' => '其他途径已退款',
 );
 
 $html = render('manage_ajax_dialog_orderview');
 json($html, 'dialog');
}

最土代金券功能分析

我们在录入最土项目的时候,我们可以选择该商品最多能使用多少代金券,比如你录入是10,商品价格是20。那么你手上有最土的代金券的话。你只需要支付10元就可以。非常方便。我们在后台可以生成代金券,具体的在最土后台代金券管理里面。

     最土后台生成代金券之后,他是存储在最土数据库card表里面。主要占据id字段。里面存储着使用期限。
 
     
   我们在购买的时候,当填写完最土的收货人信息之后,会进入支付页面,这个时候如果该商品允许使用最土代金券的话。你就可以直接输入代金券。抵消部分余额。当我们点输入代金券的时候,将触发以下JS
   
    X.misc.cardcode = function() {
 var oid = jQuery('#cardcode-order-id').attr('value');
 var cid = jQuery('#cardcode-card-id').attr('value');

 if(oid&&cid) return !X.get(WEB_ROOT +'/ajax/order.php?action=cardcode&id='+oid+'&cid='+cid);
};
  
    该方法调用ajax/order.php来返回逻辑数据流。
   
elseif ( $action == 'cardcode') {
 $cid = strval($_GET['cid']);
 $order = Table::Fetch('order', $order_id);
 if ( !$order ) json('订单记录不存在', 'alert');
 $ret = ZCard::UseCard($order, $cid);
 if ( true === $ret ) {
  json(array(
     array('data' => "代金券使用成功", 'type'=>'alert'),
     array('data' => null, 'type'=>'refresh'),
      ), 'mix');
 }
 $error = ZCard::Explain($ret);
 json($error, 'alert');
}

我们看到,当我们输入代金券的时候,将返回一定的提示。。他就是通过 ZCard::Explain($ret);方式来返回提示信息的。该函数代码如下。
  
    static public function Explain($errno) {
  switch($errno) {
   case self::ERR_NOCARD : return '代金券不存在';
   case self::ERR_TEAM : return '代金券不可用于本单';
   case self::ERR_CREDIT : return '代金券面额受限';
   case self::ERR_EXPIRE : return '不在有效期内';
   case self::ERR_USED : return '代金券已被使用';
   case self::ERR_ORDER: return '每单只能用一张代金券';
  }
  return '未知错误';
 }

最土邀请返利润功能分析

研究最土有很长时间,对最土二次开发也有不少接触.最近朋友常常要求对最土返利功能进行分析.首先我们在个人中心里面。可以获取自己的邀请链接,其实他就是指向r.php的一个链接,在该页面记录_rid的cookie变量为3天。
 
   我们可以看到注册页面有以下代码,就是注册的时候判断如果存在邀请.也就是$_COOKIE[_rid]存在,那么记录当前注册会员的推荐人为cookie里面的值.
   $_rid = abs(intval(cookieget('_rid')));
  if ($_rid && $user_row['id']) {
   $r_user = Table::Fetch('user', $_rid);
   if ( $r_user ) {
    ZInvite::Create($r_user, $user_row);
    ZCredit::Invite($r_user['id']);
   }
  }

   
   然后我们可以看到在invite表里面增加了一条邀请记录.
    'user_id' => $ruser['id'],
   'user_ip' => $ruser['ip'],
   'other_user_id' => $newuser['id'],
   'other_user_ip' => $newuser['ip'],
   'create_time' => time(),
  );
  return DB::Insert('invite', $invite);

 

  如果后台设置了最土邀请送积分的话。我们还可以看到会员的帐户积分和积分表明晰里面的积分记录将增加一条,通过该代码实现的。将数据写入最土邀请 最土邀请返利表invite
$user = Table::Fetch('user', $user_id);
  Table::UpdateCache('user', $user_id, array(
     'score' => array( "`score`+{$score}"),
     ));

  $u = array(
    'user_id' => $user_id,
    'admin_id' => 0,
    'score' => $score,
    'action' => $action,
    'detail_id' => $detail_id,
    'create_time' => time(),
    );
  return DB::Insert('credit', $u);

最土团购程序注册功能扩展

我们在使用和研究最土二次开发的时候,需要对最土的注册功能进行改进和调整,比如对最土注册功能进行扩展,在最土程序的注册功能里面,增加几个注册字段。下面我们将结合最土的注册程序,来谈谈注册功能扩展.

    1:alter table user add column usercardvarchar(64) , add column intid int(1) default  0

    2:ajax/validator.php增加以下代码

elseif ( 'signupcard' == $n ) {
 $slength = strlen($v);
 if ($slength<4) Output::Json(null, 1);
 if (!Utility::ValiUsercard($v)) {
  Output::Json(null, 1);
 }

 $exists = Table::Count('user', array(
     'usercard' =>  $v,
    ));

 if($exists){
  Output::Json(null, 1);
 }

 Output::Json(0);
}

  3:include/template/account_signup.html

 <div class="field username">
                           <label for="signup-username">身份证号</label>
                           <input type="text" size="30" name="usercard"id="signup-usercard" class="f-input"value="{$_POST['usercard']}" datatype="limit|ajax"require="true" url="${WEB_ROOT}/ajax/validator.php"min="2" max="32"maxLength="32"vname="signupcard" msg="身份证格式不对或者被使用过" />
                           <span class="hint">请填写正确的身份证编码</span>
                       </div>

 <div class="field username">
                           <label for="signup-username">邀请人帐户ID</label>
                           <input type="text" size="30" name="intid"id="signup-intid" class="f-input"value="{$_POST['intid']}"  min="2" max="16"maxLength="16"  vname="signupintid"  />
                           <span class="hint">填写4-16个字符,一个汉字为两个字符</span>
                       </div>

 

 4:include/library/Utility.class.php

static public function ValiUsercard($card) {
  $regexp = '/^(\d{15}$|^\d{18}$|^\d{17}(\d|X|x))$/';
  if ( preg_match($regexp, $card) ){
   
   return true;
   
  }
  return false;
 }

 

5:account/signup.php

$u['usercard'] = strval($_POST['usercard']);
 $u['intid']    = intval($_POST['intid']);
 

if (!Utility::ValiUsercard($u['usercard'])) {
    Session::Set('error', '您输入的身份证号码格式不对');
    redirect( WEB_ROOT . '/account/signup.php');
 }

$exists1 = Table::Count('user', array(
     'usercard' => $u['usercard'],
    ));

 if ($exists1) {
   Session::Set('error', '注册失败,该身份证号已经使用');
   redirect( WEB_ROOT . '/account/signup.php');
 }

 

6:include/class/ZUser.class.php的Create()

 if($user_row['intid']){
   $_rid = abs(intval($user_row['intid']));
  }else{
   $_rid = abs(intval(cookieget('_rid')));
  }

 

7:include/template/account_loginup.html

 <div class="field username">
                           <label for="signup-username">身份证号</label>
                           <input type="text" size="30" name="usercard"id="signup-usercard" class="f-input"value="{$_POST['usercard']}" datatype="limit|ajax"require="true" url="${WEB_ROOT}/ajax/validator.php"min="2" max="32" maxLength="32"vname="signupcard" msg="身份证格式不对或者被使用过"/>
                           <span class="hint">请填写正确的身份证编码</span>
                       </div>
       <div class="fieldusername">
                           <label for="signup-username">邀请人帐户ID</label>
                           <input type="text" size="30" name="intid"id="signup-intid" class="f-input"value="{$_POST['intid']}"  min="2" max="16"maxLength="16"  vname="signupintid"  />
                           <span class="hint">填写4-16个字符,一个汉字为两个字符</span>
                       </div>

最土代金券功能分析

我们在录入最土项目的时候,我们可以选择该商品最多能使用多少代金券,比如你录入是10,商品价格是20。那么你手上有最土的代金券的话。你只需要支付10元就可以。非常方便。我们在后台可以生成代金券,具体的在最土后台代金券管理里面。

     最土后台生成代金券之后,他是存储在最土数据库card表里面。主要占据id字段。里面存储着使用期限。
 
     
   我们在购买的时候,当填写完最土的收货人信息之后,会进入支付页面,这个时候如果该商品允许使用最土代金券的话。你就可以直接输入代金券。抵消部分余额。当我们点输入代金券的时候,将触发以下JS
   
    X.misc.cardcode = function() {
 var oid = jQuery('#cardcode-order-id').attr('value');
 var cid = jQuery('#cardcode-card-id').attr('value');

 if(oid&&cid) return !X.get(WEB_ROOT +'/ajax/order.php?action=cardcode&id='+oid+'&cid='+cid);
};
  
    该方法调用ajax/order.php来返回逻辑数据流。
   
elseif ( $action == 'cardcode') {
 $cid = strval($_GET['cid']);
 $order = Table::Fetch('order', $order_id);
 if ( !$order ) json('订单记录不存在', 'alert');
 $ret = ZCard::UseCard($order, $cid);
 if ( true === $ret ) {
  json(array(
     array('data' => "代金券使用成功", 'type'=>'alert'),
     array('data' => null, 'type'=>'refresh'),
      ), 'mix');
 }
 $error = ZCard::Explain($ret);
 json($error, 'alert');
}

我们看到,当我们输入代金券的时候,将返回一定的提示。。他就是通过 ZCard::Explain($ret);方式来返回提示信息的。该函数代码如下。
  
    static public function Explain($errno) {
  switch($errno) {
   case self::ERR_NOCARD : return '代金券不存在';
   case self::ERR_TEAM : return '代金券不可用于本单';
   case self::ERR_CREDIT : return '代金券面额受限';
   case self::ERR_EXPIRE : return '不在有效期内';
   case self::ERR_USED : return '代金券已被使用';
   case self::ERR_ORDER: return '每单只能用一张代金券';
  }
  return '未知错误';
 }

最土程序商品图片调用分析

在研究最土程序的时候,我们常常要研究最土商品录入和图片调用问题。比如在最土的api接口中.也常常需要调用最土商品图片.最土程序商品图片调用分析由此显示的格外重要了。

  首先我们应该去了解最土的商品数据库结构.我们找到最土商品数据team表。里面有image,image1,image2字段。分别存储着最土商品的三张图片。我们在最土过往团购和现在团购的列表中。我们可以发现一点.一般都是通过调用image字段来显示图片的。

  最土商品的图片有两个概念,一个是存储在static/team文件夹里面。是最土商品录入的时候上传的。也有一种方式,通过最土的image图片来动态生成一张新的商品缩略图片来获得.

  我们看最土商品图片函数

      function team_image($image=null,$index=false) {
 global $INI;
 if (!$image) return null;
 if ($index) {
  $path = WWW_ROOT . '/static/' . $image;
  $image = preg_replace('#(\d+)\.(\w+)$#', "\\1_index.\\2",$image);
  $dest = WWW_ROOT . '/static/' . $image;
  if (!file_exists($dest) && file_exists($path) ) {
   Image::Convert($path, $dest, 200, 120, Image::MODE_SCALE);
  }
 }
 return "{$INI['system']['imgprefix']}/static/{$image}";
}

      在这里我们不难发现,第一个参数是商品图片地址,第二个参数是表示显示原始图片还是显示动态生成的缩略图.如果$index为false就表示商品调用原始图片.否则就动态的通过最土图片处理函数来动态生成.

     如果要输出原始图片:team_image($one['image'],false);

     要输出动态生成缩略图:team_image($one['image'], true);

最土后台导航功能分析

  最后后台导航功能,其实有些代码写的还是很好的.我们在做最土二次开发的时候。常常看到最土有些代码写的不错。最土后台导航功能选择中高亮,其实也是可以给我们一个参考的。

      我们可以看到最土后台导航功能的模板,十分简洁.${biz_mcurrent_team($selector)}

  这个意思是十分简单的。意思就是后台选中了当前项目导航。我们再看看最土函数biz_mcurrent_team();

      function biz_mcurrent_team($selector=null){
 $a = array(
  '/biz/team/index.php' => '当前项目',
  '/biz/team/success.php' => '成功项目',
  '/biz/team/failure.php' => '失败项目',
  '/biz/team/edit.php' => '编辑项目',
  
 );
 $l = "/biz/team/{$selector}.php";
 return current_link($l,$a,true);
}

       很显然最土要做一个导航选择的时候,必须将该导航数据放在一个数组中,当某个选择的动作被执行十,动作的名称其实就是和文件名称一样,就可以使用 $l = "/biz/team/{$selector}.php";方式来取得当前被选中高亮的导航.

  那么current_link()函数也是分精妙.他对比传递过来的参数,如果导航数组中的值也当前被选中的值一样。那么就默认该导航被选中,而且高亮.

       functioncurrent_link($link, $links, $span=false) {
 $html = '';
 $span = $span ? '<span></span>' : '';
 foreach($links AS $l=>$n) {
  if (trim($l,'/')==trim($link,'/')) {
   $html .= "<li class=\"current\"><ahref=\"{$l}\">{$n}</a>{$span}</li>";
  }
  else $html .= "<li><a href=\"{$l}\">{$n}</a>{$span}</li>";
 }
 return $html;
}

  最土后台导航功能分析之后,发现十分简单,十分容易。我们必须掌握该技巧,就很容易自己封装出自己的新导航。

最土项目录入功能分析

最土程序的最土项目录入功能,其实是对最土二次开发必须知道的。我们常常对最土项目功能修改。中间最重要的就是最土的项目录入功能修改.已经和最土项目录入相关的功能。

  要谈最土项目录入功能分析,首先必须知道最土的项目是存储在team表中,他有三种形态。团购,热卖和秒杀.在最土数据库中字段值分别为normal,goods,seconds如果我们要对最土项目录入的功能进行修改。首先必须熟悉这个。

      最土不但可以编辑项目基本信息,最土项目的基本问题大概包括以下几个内容。首先是商品基本信息,然后是商品杂项信息,然后是商品SEO信息.最土的基本信息包括商品的价格,商品的图片和描述等。

 最土的杂项信息包括本商品项目相关的代金券,邀请返利,免运费的数量等。

 最土商品的seo优化项目。主要是为了让最土项目更加适合seo的需求。对标题进行处理。设置seo标题,seo关键字以及seo相关的描述.

 如果你想更深入的了解最土项目操作,必须知道项目的具体某些字段的意思.

 1:seo_title 表示seo的标题.

    2:seo_keyword表示seo的关键字.

 3:seo_description表示seo的描述

     4:card表示代金券

     5:bonus邀请返利,赠送

  6:credit消费返利.

      最土项目录入的时候,还有商户的概念,在最土后台可以管理和增加商户,在录入项目的时候,如果存在商户,就必须选择商户.他是通过partner_id字段来和商户数据联系起来的。

  最土项目发布之后,我们还需要通过最土api接口。将数据对外共享,这个时候就必须有完整的商户信息,以及针对该最土项目seo优化的优化信息。

最土增加新闻模块思路

最近很多使用最土程序的朋友,都提出个最土程序二次开发需求。就是给最土程序增加个新闻模块.我的思路很简单就是对最土分类进行扩展,结合最土商品发布机制,在最土数据库中增加个新闻表。对应的增加最土新闻模块的处理以下是思路。

1:incude\function\common.php (587) functionget_zones($zone=null) 增加以下内容.
'article' =>'新闻分类',

2:include\function\current.php (21) functioncurrent_backend() 增加以下内容
'/manage/article/index.php' => '新闻',

 3:新增文章表

create table article(

id int(1) not null primary key auto_increment,

group_id int(1) default 0,

title varchar(255),

keyword varchar(255),

content text,

addtime int(1),

user_id int(1),

click_count int(1),

sort_type int(1) default '0'

);
 

 

 4:include\function\current.php (21)

function mcurrent_article($selector=null) {
 $a = array(
  '/manage/article/index.php' => '新闻列表',
  '/manage/article/create.php' => '文章发布',
 );
 $l = "/manage/article/{$selector}.php";
 return current_link($l,$a,true);
}

如何增加最土后台操作栏分析

很多朋友提到过如何增加最土后台操作栏,该如何操作呢。在对最土程序二次开发的过程中。我们应该很仔细的发现。最土的后台自定义操作栏目的增加,其实也是非常容易的。

     首先我们找到最土系统第一的模板,我们可以发现.里面有以下代码。

    <ul>${mcurrent_system('de')}</ul>

    我们可以查看mcurrent_system()函数的内容。

 function mcurrent_system($selector=null) {
 $a = array(
  '/manage/system/index.php' => '基本',
  '/manage/system/option.php' => '选项',
  '/manage/system/bulletin.php' => '公告',
  '/manage/system/pay.php' => '支付',
  '/manage/system/email.php' => '邮件',
  '/manage/system/sms.php' => '短信',
  '/manage/system/page.php' => '页面',
  '/manage/system/cache.php' => '缓存',
  '/manage/system/skin.php' => '皮肤',
  '/manage/system/template.php' => '模板',
  '/manage/system/upgrade.php' => '升级',
  '/manage/system/de.php' => '定义',
 );
 $l = "/manage/system/{$selector}.php";
 return current_link($l,$a,true);
}
 

 我们将自己定义一个"定义"栏目,文件是de.php,模板中要想取得这个地址。直接<ul>${mcurrent_system('de')}</ul>传入"de"参数就可以了,然后通过调用current_link()来返回合理的html

 function current_link($link, $links, $span=false) {
 $html = '';
 $span = $span ? '<span></span>' : '';
 foreach($links AS $l=>$n) {
  if (trim($l,'/')==trim($link,'/')) {
   $html .= "<li class=\"current\"><ahref=\"{$l}\">{$n}</a>{$span}</li>";
  }
  else $html .= "<li><ahref=\"{$l}\">{$n}</a>{$span}</li>";
 }
 return $html;
}
 这样就完成了最土后台导航栏目的增加,然后我们具体的新建立个de.php,以及对应的模板。就可以了。当然必须结合最土程序保存系统配置功能分析来进行系统文件的存储.

最土程序保存系统配置功能分析

最土程序里,后台系统配置的设置,都是保存在系统所指定的系统配置文件里面,而不是象ecshop系统设置保存在数据库里面。最土系统配置保存功能也十分强大。
 
   先分析最土程序设置最土短信接口的配置文件。我们在最土后台系统设置,详细步骤参考。。。。
 
   首先在sms.php中,我们可以看到最土系统变量$INI,先合并$最土提交的表单数据。注意最土后台配置的表单数据的名称都是以某个变量名开始的数组。比如短信配置表单的输入框名称是$sms['pass'].

   $INI = Config::MergeINI($INI, $_POST);
   $INI = ZSystem::GetUnsetINI($INI);
   先将系统配置封装成key/value对的数组,然后通过save_config()函数来保存在系统配置的文件中.主要是通过return configure_save();函数来完成文件保存操作。
  
    而该函数本身就是一个递归出来数据的函数。

    function configure_save($key=null) {
 global $INI;
 if ($key && isset($INN[$key])) {
  return _configure_save($key, $INI[$key]);
 }
 $keys = configure_keys();
 foreach($keys AS $one) {
  if(isset($INI[$one])) _configure_save($one, $INI[$one]);
 }
 return true;
}
    这里很明显,如果单单保存某个系统配置,就直接输入$key.否则将循环遍历该函数configure_keys().如果指定了键值,将直接修改该系统配置文件,否则整个系统配置文件,都将重新遍历一次。

  
     而该函数_configure_save将结合最土系统配置提交的数组,动态生成一个名为$key值的系统配置文件,从而完成了最土程序的后台设置。

最土程序短信接口和短信发送功能

     在对最土程序二次开发过程中,常常会遇到最土短信接口的问题。最土短信接口和最土短信发送原理,和ecshop短信发送稍微不同。最土短信接口主要是通过curl原理发送。而ecshop短信接口是封装http请求来对短信发送。

   最土短信在后台可以设置。
  
   后台=》设置=》短信息。通过这里我们可以设置最土程序的短信接口帐户信息。最土短信接口的配置信息保存在\include\configure\sms.php文件中,数组格式为以下格式
   $value = array (
  'user' => 'test',
  'pass' => 'test',
  'interval' => '0',
 
);
 
    最土短信接口的发送文件位置于include/function/sms.php文件,里面的sms_send()函数就是用来发送短信的函数。他有两个参数,一个是$ph one就是发送短信目标手机号码,另外一个参数就是最土短信发送的内容信息。

    最土的短信发送函数以下

     function sms_send($phone,$content) {
 global $INI;
 if (mb_strlen($content, 'UTF-8') < 20) {
  return '短信长度低于20汉字?长点吧~';
 }
 $user = strval($INI['sms']['user']);
 $pass = strtolower(md5($INI['sms']['pass']));
 if(null==$user) return true;
 $content = urlEncode($content);
 $api ="http://notice.zuitu.com/sms?user={$user}&pass={$pass}&phones={$phone}&content={$content}";
 $res = Utility::HttpRequest($api);
 return trim(strval($res))=='+OK' ? true : strval($res);
}


      我们可以看出,需要封装一个url。然后通过调用curl方式来发送短信。最土短信接口发送信息有一个返回值,为true或者是false.如果发送成功,返回true否则返回false.

      通过最土后台的帐户密码设置,最土短信息接口发送,完成整个信息发送过程

最土如何开发API最土团购api

最土如何开发API,最土团购api的开发有些什么讲究.最近很多朋友都在问我最土程序api开发的事情。最土程序的api接口开发主要是一个xml接口生成的过程。最主要的就是通过读商品表,连接查询出最土商家信息。

      最土程序有个文件,叫做xml的接口处理文件。就是位置于include/library/Output.class.php的文件。该文件主要是将最土数据库中的数据生成数组,然后形成xml文件。从而达到生成最土团购api的效果。

      最土程序api的标准主要有两大主流,一类是类似baidu标准,一种就是和baidu差不多,但不完全一样的标准。在最土api接口生成文件中。有个方法。是专门用来处理baidu api标准的。
   

      static public functionXmlBaidu($data=null, $error=0)
 {
  $xml = "<?xml version=\"1.0\"encoding=\"utf-8\"?>\n";
  $xml .= self::ArrayToXml( $data, 0, 'urlset' );
  die( $xml );
 }

    他就是通过调用ArrayToXml()方法来处理的。我们可以找到该函数。

      static public functionArrayToXml($array, $level=0, $topTagName='result')
 {
  if ($topTagName) {
   $xml = str_repeat("\t",$level) ."<$topTagName>\n";
   $level++;
  }

  foreach ($array as $key=>$value) {
   if( is_numeric($key) ){
    $key = self::GetSubTagName($topTagName);
   }  

   if($value===false) $value='false';
   if($value===true) $value='true';

   if (is_array($value)) {
    $xml .= self::ArrayToXml($value,$level,$key);
   } else {
    if (htmlspecialchars($value) != $value) {
     $xml .= str_repeat("\t",$level)
      ."<$key><![CDATA[$value]]></$key>\n";
    } else {
     $xml .= str_repeat("\t",$level).
      "<$key>$value</$key>\n";
    }
   }
  }

  if ($topTagName) {
   $xml .= str_repeat("\t",($level-1)) ."</$topTagName>\n";
  }
  return $xml;
 }

      他主要是将数组转化为xml.而且在转化的过程中,我们可以看到.他同时处理换行和缩格.这样我们在制作最土程序api接口的时候。很方便的通过检索最土商品数据库,然后调用Output::XmlBaidu($oa)类似的方法.就能成功制作最土团购api

最土团购数据库连接分析

既然我们是从事最土程序二次开发的。我们就必须知道最土团购数据库连接方式,我们都知道最土程序是php的。那很显然最土团购程序的数据库也是mysql,和ecshop程序一样,最土程序也是在安装的时候就对数据库进行了配置,将数据库连接信息写入到了一个叫做db.php的文件.

  首先我们来分析下,最土程序安装的时候,一是选择了路径,而是记录了数据库信息。最土程序的数据库信息记录在include/configuer/db.php文件里面。我们可以分析该文件的内容。

    <?php

$value = array (
  'host' => 'localhost',
  'user' => 'root',
  'pass' => 'root',
  'name' => 'tu01',
);

?>

  host表示最土数据库位置所在,既数据库服务器地址.

  user表示该数据库的用户

  pass表示该数据库的密码

  name表示最土程序所属于的数据库名称。

 既然我们懂得了这些。那么我们在转移数据库或者换数据库的时候。我们该如何操作呢,首先我们必须将mysql数据库备份下来,传到新的数据库服务器上去.接着我们将找到include/configuer/db.php.修改以上内容,然后保存.这里举例子,比如数据库密码换成了"123456";我们只要对程序做以下修改.

  

    <?php

$value = array (
  'host' => 'localhost',
  'user' => 'root',
  'pass' => '123456',
  'name' => 'tu01',
);

?>

   最土程序的数据库操作类位置于include/library/DB.class.php,里面包含了所有的最土的数据库常见的操作和方法。我们也写了一篇专门的文章.叫做最土程序数据库基本操作

最土api接口程序分析

最土api接口程序分析,主要是为了阐述最土程序中api接口的重要性。在最土程序二次开发中。常常要对最土程序的api接口进行开发。最土程序的api接口位置与api目录。里面的api接口主要是为了和其他站进行合作或者数据调用的对外接口.

      现在是最土程序疯狂发展的时期。出现了很多团购分成站,团购导航站。都需要最土程序的api接口.才能给团购站或者团购导航站进行数据调用和商品信息的抓取.最土程序api接口其实就是xml格式的文件.

     最土团购程序的api接口开发比较简单。主要是从数据库中取得商品信息。然后动态的生成xml.

  从我们分析最土程序的api接口来看。主要存在以下个要点:

  1:api接口程序api文件的编码.

      2:api接口程序api文件的单元格式.

      3:api接口商品信息.主要包括商品价格,数量,开始和结束时间.

      4:api接口中也要体现一部分商家信息.比如最土程序商户电话,地址,所在区域等。

      我们结合最土程序api接口的tuan800接口来谈谈。

      $city =$cities[$one['city_id']];
 $group = $groups[$one['group_id']];
 $item = array();
 $item['loc'] = $si['wwwprefix'] . "/team.php?id={$one['id']}";
 $item['data'] = array();
 $item['data']['display'] = array();
 $item['data']['shops']['shop']= array();

 $o = array();
 $o['website'] = $INI['system']['sitename'];
 $o['identifier'] = $one['id'];
 $o['siteurl'] = $INI['system']['wwwprefix'];
 ($o['city'] = $city) || ($o['city'] = '全国');
 ($o['tag'] = $group) || ($o['tag'] = '无');
 $o['title'] = $one['title'];
 $o['image'] = team_image($one['image'], true);
 $o['startTime'] = $one['begin_time'];
 $o['endTime'] = $one['end_time'];
 $o['value'] = $one['market_price'];
 $o['price'] = $one['team_price'];
 if ( $one['market_price'] > 0 ) {
  $o['rebate'] = moneyit(10*$one['team_price']/$one['market_price']);
 } else {
  $o['rebate'] = '0';
 }
 $o['bought'] = abs(intval($one['now_number']));
 $o['maxQuota'] = $one['max_number'];
 $o['minQuota'] = $one['min_number'];
 $o['post'] = ($team['delivery'] == 'express') ? 'yes' : 'no';
 $o['soldOut'] = (($team['now_number'] > $team['max_num']) &&($team['max_num'] > 0)) ? 'yes' : 'no';
 $o['tip'] = $one['notice'];

 $item['data']['display'] = $o;


 $p = Table::Fetch('partner', $one['partner_id']);
 $pval = array();
 $pval['name'] = $p['title'];
 $pval['tel'] = $p['tel'];
 $pval['address'] = $p['address'];
 if ($p['longlat']) {
  list($pval['longitude'], $pval['latitude'])
   = explode(',', $p['longlat']);
 }
 $item['data']['shops']['shop']=$pval;
 $oa[] = $item;

    他就是通过调用商品信息,取得团购商品的基本信息.然后通过xml格式。让团购导航站调用。

最土团购程序分类管理分析

很长时间没有写最土团购程序的教程了。本次我们结合最土程序的分类表,来谈谈我们在对最土程序进行二次开发的时候。如何很好的去处理和了解最土程序的分类管理的。最土团购程序中的分类都放在一个表中。就是最土数据库category表中.

  既然最土程序的所有分类,都放在category表中。那么我们如何去区分不同的类型呢,不同的分类类型如何调用和区分呢?

     我们先看最土的数据库category.在这里我们可以看到最土zone字段。这个就是来区分分类的类型的。

     在最土程序的后台。我们可以看到有类别管理,包括城市列表,项目分类,讨论分区,用户等级,快递公司和商户分类。他没不管有多少内容。都是靠zone字段来区分的。

  group代表团购项目分类.

      city代表最土程序中的城市分类的概念.

      public代表最土的讨论分区.

      grade代表最土程序会员等级.

      partner代表最土程序商户类型.

      当我们去数据,不同分类对应不同数据的时候.

最土程序的购买流程分析

最土程序的购买流程非常复杂。因为最土团购程序不存在购物车的概念。所以最土程序里面应该是每个订单对应一个商品。也就是对应一个团购。最土程序的团购程序是按照最土的。

      最土程序的团购商品在index.php页面,他有三中概念,团购,秒杀,热销三个概念。这个在最土程序的后台体现的十分清晰。

       最土程序的buy.php就是该商品的购买页面,填写购买数量和购买信息,最土的购买流程里面其实分两部分,一部分是购买商品。其实就是填写购买信息。最土程序的购买信息有两种方式,一种是直接填写电话号码,不需要物流的购买方式,另外一种就是直接填写联系方式。

      最土程序和ecshop购买方式不同,最土程序不存在购物车。所以他更象是订单提交系统,或者更象是直接购买系统,所有的购买流程里面,非常简单也非常清晰。最土程序的订单也存在一个表里面,他将商品信息和最土的收货人信息都填写在一个表order表里面。

     最土程序订购过程中,流程比一般的购买流程多了几个判断。第一是判断该商品是否只能购买一次。如果一个人只能购买一次的话,那么该商品就不能被重复购买。其次商品数量是否有限,如果商品数量有限。将不会形成购买。

最土程序后台登陆原理分析

最土程序的管理员后台登陆.其实也是有点复杂。我们在做最土程序二次开发的时候,必须注意到.最土程序后台登陆。必须是两个条件,首先必须是后台授予了管理员权限Y,其实必须在最土前台会员登陆.

  我们看到最土程序后台登陆的这段代码

     $login_admin =ZUser::GetLogin($_POST['username'], $_POST['password']);
 if ( !$login_admin || $login_admin['manager'] != 'Y' ) {
  Session::Set('error', '用户名密码不匹配!');
  redirect( WEB_ROOT . '/manage/login.php');
 }

    这个表明,不但要录入正确的帐户名称和密码,还必须是管理员.也就是说user表中的manage字段必须是"Y"

    我们分析最土程序的manage/index.php,里面的该代码need_manager();表示是判断管理员登陆和管理员权限的。

    function need_manager($super=false) {
 if ( ! is_manager() ) {
  redirect( WEB_ROOT . '/manage/login.php' );
 }
 if ( ! $super ) return true;
 if ( abs(intval($_SESSION['user_id'])) == 1 ) return true;
 return redirect( WEB_ROOT . '/manage/misc/index.php');
}

   首先,必须是管理员.is_manager()函数内容如下.

   function is_manager($super=false, $weak=false){
 global $login_user;
 if ( $weak===false &&
   ( !$_SESSION['admin_id']
     || $_SESSION['admin_id'] != $login_user['id']) ) {
  return false;
 }
 if ( ! $super ) return ($login_user['manager'] == 'Y');
 return $login_user['id'] == 1;
}

   首先,必须是最土后台管理员密码和帐户输入正确,其次.管理员的id必须和会员id相等,也就是说。必须登陆最土会员中心,还必须登陆后台。两次登陆成功,才能进入最土后台进行操作。

最土程序短信功能发送分析

最土团购程序也集成了短信发送接口。在下单发优惠卷还有其他用途的时候。可以调用短信接口进行优惠码的发送。当然一个好的电子商务购买平台。我们必须在很多情况下提供短信接口功能。比如注册时候我们可以通过短信接口给用户发送注册帐户名称和密码。最土程序中下单支付成功之后,我们可以提示他为订单成功支付.如果是需要密码找回,我们也可以结合该接口。进行密码找回。

     最土程序的短信接口位置于include/function/sms.php

     function sms_send($phone,$content) {
 global $INI;
 if (mb_strlen($content, 'UTF-8') < 20) {
  return '短信长度低于20汉字?长点吧~';
 }
 $user = strval($INI['sms']['user']);
 $pass = strtolower(md5($INI['sms']['pass']));
 if(null==$user) return true;
 $content = urlEncode($content);
 $api = "***"

 $res = Utility::HttpRequest($api);
 return trim(strval($res))=='+OK' ? true : strval($res);
}

   最土程序的接口他是调用了最土程序api接口的,他肯定位于最土的服务器上。当然这个必须让最土那边。给你分配一个会员名称和密码,这样才能顺利的调用短信接口.帐户和密码分别可以在后台配置.

   $user = strval($INI['sms']['user']);
 $pass = strtolower(md5($INI['sms']['pass']));

    最土团购程序最常见的功能就是最土程序优惠卷的发送功能。比如以下代码。

    if (true===($code=sms_send($mobile,$content))) {
  Table::UpdateCache('coupon', $coupon['id'], array(
     'sms' => array('`sms` + 1'),
     'sms_time' => time(),
     ));
  return true;

     主要调用手机号码和发送手机信息的内容。只要有了该代码,我们就可以对他进行扩展。灵活运用。

最土程序支付插件分析

最土程序的支付插件方式和ecshop支付方式插件不大一样。他在后台固定死了只有这么几个。也不可以安装之类的。只有在后台系统设置里面设置了帐户信息.才能启用该支付方式.

  最土程序的支付插件主要位置于include\library文件。这个文件下面处理支付方式的业务流程.最土程序的支付方式在/order/check.php页面进行选择。如果选择成功。将在最土程序的订单表里面,记录service字段。

     支付方式提交的页面位置于order/pay.php.我们可以从这里看到include\template\order_pay.html目录主要是用来显示支付方式的。在这里我们可以看到。通过订单中记录的支付方式代码.来选择显示对应的支付方式.

     最土程序的支付方式的配置信息,位置于include\configure里面的文件。我们可以通过后台来修改配置参数,而对应的数据修改就将会录入到该对应的文件中去.

     最土程序的既然要被配置文件读取.那么肯定需要include/function/configure.php里面的函数来支持.

    function configure_keys()

    而这个函数里面返回的数组中,必须有该支付方式的插件名称.不然难以调用该数据.

最土程序的ajax应用分析

最土程序的ajax应用,应该在广义上来说。是借助了jquery框架,但是他也结合了自身的特点。对最土程序进行了处理,结合了最土程序数据库的一些操作,来完成最土程序ajax的一些验证。我们下面将结合最土程序会员注册项。来谈谈最土程序ajax的应用。

   首先看最土程序的注册邮箱控制。
   <input type="text" size="30"name="email" id="signup-email-address"class="f-input" value="{$_POST['email']}"require="true" datatype="email|ajax"url="${WEB_ROOT}/ajax/validator.php" vname="signupemail"msg="Email格式不正确|Email已经被注册"/>
   上面的代码意思很明显。是告诉我们注册时候必须填写的email.而且还告诉我们。注册时候邮箱不能重复。那么这个时候不但要验证邮件格式,而且还需要邮件是否在会员表中已经存在。是否被占用了。

   url="${WEB_ROOT}/ajax/validator.php"这个是程序接口。用来将信息提交给php.通过vnanme标签传递数据过去。vname="signupemail"
   我们看到validator.php文件。。
   $n = strval($_GET['n']);
   $v = strval($_GET['v']);
   有必要解释下该代码。$n的作用是用来控制传递动作参数名称的。$v就是传递过来的就是表单txt的值得。然后通过以下代码进行处理。
   elseif ( 'signupname' == $n ) {
 $slength = strlen($v);
 if ($slength<4) Output::Json(null, 1);
 $u = Table::Fetch('user', $v, 'username');
 if ( $u ) Output::Json(null, 1);
 Output::Json(0);
   }

   这样,最后通过Output返回一个Json数据。传递给js

最土程序的api接口开发分析

我们在使用最土程序的时候,为了让更多的团购导航站或者是联盟站收录我们的商品的时候。我们可以对最土程序二次开发很多接口出来.供其导航站或者是联盟站抓取数据,重要是他们提供标准的接口文档,我们就能很容易的根据他们的需求开发出对应的最土程序api接口.

       我们可以看到在最土团购程序的根目录下,有个文件夹api,里面放的就是最土程序对外合作的api接口。其实也就是利用对方提供的api标准。来生成一个xml文件。

  比如我们可以看到api接口的baidu.php,里面生成的就是支持baidu团购程序的xml文件格式。通过Output::XmlBaidu($oa);来处理生成的,这个方法是通过includes/library/Output.class.php来负责处理的.

  我们分析起原理,不难发现。只要提供一个数据数组$array,按其key/value对出现封装.然后将其转化为xml格式.将通过该函数来处理,当然了。数据结构的生成需要最土程序数据库的一些操作来完成。

       static public functionArrayToXml($array, $level=0, $topTagName='result')
 {
  if ($topTagName) {
   $xml = str_repeat("\t",$level) ."<$topTagName>\n";
   $level++;
  }

  foreach ($array as $key=>$value) {
   if( is_numeric($key) ){
    $key = self::GetSubTagName($topTagName);
   }  

   if($value===false) $value='false';
   if($value===true) $value='true';

   if (is_array($value)) {
    $xml .= self::ArrayToXml($value,$level,$key);
   } else {
    if (htmlspecialchars($value) != $value) {
     $xml .= str_repeat("\t",$level)
      ."<$key><![CDATA[$value]]></$key>\n";
    } else {
     $xml .= str_repeat("\t",$level).
      "<$key>$value</$key>\n";
    }
   }
  }

  if ($topTagName) {
   $xml .= str_repeat("\t",($level-1)) ."</$topTagName>\n";
  }
  return $xml;
 }

    那很简单的道理,我们可以将任意一个接口解析,按其要求生成数组.比如生成baidu的接口.调用的方法是以下.

    static public functionXmlBaidu($data=null, $error=0)
 {
  $xml = "<?xml version=\"1.0\"encoding=\"utf-8\"?>\n";
  $xml .= self::ArrayToXml( $data, 0, 'urlset' );
  die( $xml );
 }
    

 最土程序的api制作也特别简单,只要我们熟悉上面的分析.我们就可以很方便的制造出接口.

最土程序邮件订阅功能分析

最近在研究最土程序,最土团购程序很注重邮件订阅,在收页和内页,都有对最土程序邮件订阅功能进行展现,最土程序的为了方便对最土程序二次开发,我们将结合最土程序邮件订阅。来具体的对他进行分析。
 
   最土团购程序的订阅文件位置于subscribe.php。他通过调用ZSubscribe::Create($_POST['email'], $city_id);来写入最土的邮件订阅输入。
 
   最土程序的ZSubscribe类有两个方法,分别用来订阅和取消订阅。

   1:最土邮件订阅录入功能是以下代码。
   static public function Create($email, $city_id)
 {
  if (!Utility::ValidEmail($email, true)) return;
  $secret = md5($email . $city_id);
  $table = new Table('subscribe', array(
     'email' => $email,
     'city_id' => $city_id,
     'secret' => $secret,
     ));
     
  $res = DB::LimitQuery('subscribe',array('condition'=>array

('email'=>$email),'one'=>true));
  
  if($res){
   return false;
  }else{
   return $table->insert(array('email', 'city_id',

'secret'));
  }
  
 }


    2:最土邮件订阅取消功能是以下代码。
    static public function Unsubscribe($subscribe) {
  Table::Delete('subscribe', $subscribe['email'], 'email');
 }

    最土后台管理邮,只要你登陆了后台。就可以看到邮件管理的地方了。

最土程序商户管理分析

最土团购程序里面有一个概念,那就是商户.这里的商户的意思应该更多的含义是供应商.在最土程序的后台增加最土项目,也就是增加商品的时候。我们可以看到可以选择该商品对应的商户.

    在最土程序里面,商户的概念主要是更多的维护他供应货品下面的订单,已经购买过该商品的会员获得的优惠卷情况。

 最土程序的主要核心文件在于includes/class/ZPartner.class.php文件.他里面有一些方法。

   1:登陆的密码换算.

    static public function GenPassword($p) {
  return md5($p . self::SECRET_KEY);
 }

   2:商户登陆处理程序

   static public function GetLogin($username,$password, $en=true) {
  if($en) $password = self::GenPassword($password);
  return DB::GetTableRow('partner', array(
     'username' => $username,
     'password' => $password,
  ));
 }

    3:定义了获得商户信息的函数信息和商户id的信息

    static public function GetLoginPartner(){
  if(isset($_SESSION['partner_id'])) {
   return self::GetPartner($_SESSION['partner_id']);
  }
  return array();
 }

 static public function Login($partner_id) {
  Session::Set('partner_id', $partner_id);
 }

   4:如何判断某个商户是否登陆了。

   function need_partner() {
 return is_partner() ? true : redirect( WEB_ROOT . '/biz/login.php');
}

    最土团购程序的管理员路径位于biz目录.所有的操作。都在这个目录里.

最土程序优惠卷发送机制

最近总是有很多最土朋友的使用者在询问我最土团购程序如何修改优惠卷生成机制,让所有的密码和优惠卷编码都是数字形成的。这样使用才方便。于是我就找到了最土程序include/class/ZCoupon.php文件。该文件的staticpublic function Create($order) 就是生成最土优惠卷的程序。

  我们通过使用最土团购程序二次开发,我们可以发现.最土程序的优惠卷只有在该项目完成之后,才能发送出优惠卷.那么发送优惠卷的触发有两种情况.

      1:当我们在支付订单的时候,如果达到该项目最后一笔订单支付成功之后,那么优惠卷就会自动发送出去.

       2:如果在后台,点该项目的最后一个交易订单支付的话,那么该动作也会引起触发该项目下所有成功的订单下会员,得到一个优惠卷。

      他们两个动作,都有同一个特点。调用static public function BuyOne($order) 的方法来完成优惠卷的发送触发.该代码在调用了ZCoupon::CheckOrder($order);代码来完成发送优惠卷的动作.

     我们找到最土团购程序下的这段程序.

      static public functionCheckOrder($order) {
  $coupon_array = array('coupon', 'pickup');
  $team = Table::FetchForce('team', $order['team_id']);
  if (!in_array($team['delivery'], $coupon_array)) return;
  if ( $team['now_number'] >= $team['min_number'] ) {
   //init coupon create;
   $last = ($team['conduser']=='Y') ? 1 : $order['quantity'];
   $offset = max(5, $last);
   if ( $team['now_number'] - $team['min_number'] < $last) {
    $orders = DB::LimitQuery('order', array(
     'condition' => array(
      'team_id' => $order['team_id'],
      'state' => 'pay',
     ),
    ));
    foreach($orders AS $order) {
     self::Create($order);
    }
   }
   else{
    self::Create($order);
   }
  }
 }
 

     这个方法主要是判断该项目下的项目是否成功,而且成功了的话。将调用self:Create($order)方式来完成最土程序优惠卷的发送。而我们可以发现,生成发送优惠卷的规则中。$id_pre = Utility::GenSecret(4, Utility::CHAR_NUM);这段代码才是最重要的。他直接影响着生成最土程序优惠卷的形式.

最土程序Session类的分析

最土程序建设的过程中。我们能够深刻的体会,在里面用的最多的代码是支持最土团购程序的session类。他通过自己定义session的一些操作类.让整个系统中的session使用更灵活.也是最土程序二次开发常用的一个文件。

      最土程序的session位于include\library\Session.class.php

      1:最土的session初始化是通过Init()方法来初始化的。

       static public functionInit($debug=false)
 {
  self::$_instance = new Session();
  self::$_debug = $debug;
  session_start();
 }

      2:最土程序的赋值和取值

       static public functionSet($name, $v)
 {
  $_SESSION[$name] = $v;
 }
   

     3:最土程序取得session的值,使用该方法。

      static public functionGet($name, $once=false)
 {
  $v = null;
  if ( isset($_SESSION[$name]) )
  {
   $v = $_SESSION[$name];
   if ( $once ) unset( $_SESSION[$name] );
  }
  return $v;
 }

     这里我们必须注意,如果第二个参数为false.那么我们将销毁该session

     以上三个方法,是最土团购程序最常使用的方法了。而且最土程序的session都是伴随着最土数据库操作来完成工作的

最土程序二次开发后台会手机号码搜索会员

最近总有和我说,最土团购程序后台会员中心搜索会员.十分不方便,只能用会员名称和邮件搜索.十分不方便。他们希望在最土团购程序增加可以使用手机号码来搜索会员列表。

  1:找到最土程序模板template/manage_user_index.html,增加以下代码。

        手机号:<input type="text" name="mobile"class="h-input" value="${htmlspecialchars($mobile)}" >

        2:在manage\user\index.php中,我们要增加会员中心会员搜索程序。

         先要获取手机号码:$mobile = strval($_GET['mobile']);

   其次要在检索SQL语句中增加以下代码.

         if($mobile) {
         $condition[] = "mobilelike '%".mysql_escape_string($mobile)."%'";
        }

最土团购程序一些常见的数据库操作

  我们在对最土程序进行二次开发的过程中。我们常常需要对数据库进行操作.最土程序的数据库操作方式还不少。我们将陆续总结最土程序的一些常见的数据库操作方式.

     1:如何取得最土数据库中一条数据。使用LimitQuery()

     $res = DB::LimitQuery('subscribe',array('condition'=>array('email'=>$email),'one'=>true));

     2:最土程序如何进行数据库插入数据

     $table = new Table('subscribe',array(
     'email' => $email,
     'city_id' => $city_id,
     'secret' => $secret,
     ));
     
 
   return $table->insert(array('email', 'city_id','secret'));

 

    3:检索一行内容
$field = strpos($email, '@') ? 'email' : 'username';
  $zuituuser = DB::GetTableRow('user', array(
     $field => $email,
     'password' => $password,
  ));

 

  4:通过某个值检索一行数据
return Table::Fetch('user', $email, 'email');


  5:修改数据库字段某个值

$table = new Table('user', $newuser);
  $table->SetPk('id', $user_id);
  if ($table->password) {
   $plainpass = $table->password;
   $table->password = self::GenPassword($table->password);
  }
  return $table->Update( array_keys($newuser) );

    6:如何统计数据库中某些数据的条数

     $now_count = Table::Count('order',array(
  'user_id' => $login_user_id,
  'team_id' => $id,
  'state' => 'pay',
 ), 'quantity');

    7:如何修改数据库中某个字段的值

     Table::UpdateCache('order',$table->id,array('order_sn'=>get_order_sn()));

    8:最土中如何检索某个字段的值

    $cond = array('zone'=>'city');
    $info = DB::LimitQuery('category', array(
     'condition' => $cond,
     'order' => 'ORDER BY id DESC',
     
    ));
   $citys = Utility::GetColumn($info, 'name');

    9:最土如何删除一条数据

 Table::Delete('article', $id);

最土程序配置文件configure.php分析

最土程序里面,我们通常可以看到configure.php.主要体现在最土程序的启动文件app.php.也是我们进行最土程序二次开发常常需要修改的一个文件。最土程序的configure.php类主要作用是读取和保存最土程序系统的一些配置文件。

    打开include\function\configure.php我们可以清晰的看到有以下函数。

   1:configure_keys()

    这个主要是返回配置文件的文件名代码。

    2:configure_save()

    这个就是用来保存系统配置信息的。

  global $INI;
 if ($key && isset($INN[$key])) {
  return _configure_save($key, $INI[$key]);
 }
 $keys = configure_keys();
 foreach($keys AS $one) {
  if(isset($INI[$one])) _configure_save($one, $INI[$one]);
 }

  3:那么系统的配置信息的读取.就是用configure_load()

  他返回所有最土程序中一些配置信息.global $INI,$INI是全局的变量,因此该程序的数据在整站都能调用

 

最土收货人信息功能分析

我们在使用和研究最土程序的时候。就必须知道和了解最土收货人信息功能,我们在在最土后台录入最土项目的时候,在填写配送信息的时候,我们可以选择使用优惠券,当然也可以为该商品选择对应的物流。那么他就是记录在express字段中。

    首先我们看购买信息填写页面,当录入该商品的时候。选择了物流信息。那么在购买该商品的时候,就必须填写收货人信息和地址。首先我们找到对应的模板。

     <!--{if$team['delivery']=='express'}-->
   <divclass="expresstip">${nl2br(htmlspecialchars($team['express']))}</div>
   <div class="wholetip clear"><h3>快递信息</h3></div>
   <div class="field username">
    <label>收件人</label>
    <input type="text" size="30"name="realname" id="settings-realname"class="f-input" value="{$login_user['realname']}"require="true" datatype="require" />
    <span class="hint">收件人请与有效证件姓名保持一致,便于收取物品</span>
   </div>
   <div class="field mobile">
    <label>手机号码</label>
    <input type="text" size="30"name="mobile" id="settings-mobile" class="number"value="{$login_user['mobile']}" require="true"datatype="mobile" maxLength="11" /> <spanclass="inputtip">手机号码是我们联系您最重要的方式,请准确填写</span>
   </div>
    <div class="field username">
    <label>收件地址</label>
    <input type="text" size="30"name="address" id="settings-address"class="f-input" value="{$login_user['address']}"require="true" datatype="require" />
    <span class="hint">为了能及时收到物品,请按照格式填写:_省_市_县(区)_</span>

   当我们填写完信息最土的订单信息之后,我们可以将数据提交到数据库表order中去。具体的代码参考以下。

    $insert = array(
   'user_id', 'team_id', 'city_id', 'state', 'express_id',
   'fare', 'express', 'origin', 'price',
   'address', 'zipcode', 'realname', 'mobile',
   'quantity', 'create_time', 'remark', 'condbuy',
  );
 if ($flag = $table->update($insert)) {
  $order_id = abs(intval($table->id));
  
  /* 插入订单来源 */
  $data['order_id'] = $order_id;
  $data['user_id'] = $login_user_id;
  $data['referer'] = $_COOKIE['referer'];
  $data['create_time'] = time();
  DB::Insert('referer', $data);
  
  redirect(WEB_ROOT."/order/check.php?id={$order_id}");
 }
   </div>
   <div class="field mobile">
    <label>邮政编码</label>
    <input type="text" size="30"name="zipcode" id="settings-mobile"class="number" value="{$login_user['zipcode']}"require="true" datatype="zip" maxLength="6" />
   </div>
   <!--{else}-->

     当最土的订订单提交后,我们就可以通过后台查看订单的详细信息。具体的代码。可以参考以下代码。

    else if ( 'orderview' == $action) {
 $order = Table::Fetch('order', $id);
 $user = Table::Fetch('user', $order['user_id']);
 $team = Table::Fetch('team', $order['team_id']);
 $order['referer'] = Table::Fetch('referer', $id);
 
 if ($team['delivery'] == 'express') {
  $option_express = option_category('express');
  $order['express_name'] = $option_express[$order['express_id']];
 }
 $payservice = array(
  'alipay' => '支付宝',
  'tenpay' => '财付通',
  'chinabank' => '网银在线',
  'credit' => '余额付款',
  'cash' => '线下支付',
 );
 $paystate = array(
  'unpay' => '<font color="green">未付款</font>',
  'pay' => '<font color="red">已付款</font>',
 );
 $option_refund = array(
  'credit' => '退款到账户余额',
  'online' => '其他途径已退款',
 );
 
 $html = render('manage_ajax_dialog_orderview');
 json($html, 'dialog');
}

 

 

 

你可能感兴趣的:(最土团购数据表结构)