0、緣起
客戶(hù)有個(gè) dede 制作的行業(yè)網(wǎng)站,提供相關(guān)資料下載,作為主要盈利手段的金幣充值業(yè)務(wù)需要接入微信、支付寶等支付方式。但是如果每筆都單獨(dú)進(jìn)行支付的話(huà)手續(xù)費(fèi)會(huì)比較高,因此采用充值某種會(huì)員來(lái)進(jìn)行的話(huà)會(huì)更劃算。
dede 本身提供了會(huì)員產(chǎn)品,可以通過(guò)購(gòu)買(mǎi)會(huì)員產(chǎn)品來(lái)達(dá)到不同的用戶(hù)級(jí)別。那么我們只需要給相應(yīng)的用戶(hù)等級(jí)設(shè)置對(duì)應(yīng)的下載配額就可以控制這一等級(jí)的免費(fèi)額度了。
業(yè)務(wù)邏輯上客戶(hù)要求,用戶(hù)購(gòu)買(mǎi)的等級(jí)可以每月得到規(guī)定的授信次數(shù),用完后繼續(xù)和正常情況一樣充值金幣下載。到下個(gè)月又重新授信。
1、設(shè)置表結(jié)構(gòu)
1.1、用戶(hù)等級(jí)表增加 每月下載授信次數(shù) 字段:
ALTER TABLE `dede_arcrank` ADD `download_credit` INT(11) UNSIGNED NOT NULL DEFAULT '0' COMMENT '每月下載授信次數(shù)' AFTER `scores`;
1.2、 用戶(hù)表增加當(dāng)前月授信次數(shù)、更新月份、已用次數(shù)等字段
ALTER TABLE `dede_member`
ADD `download_month` INT UNSIGNED NOT NULL DEFAULT '0' COMMENT '下載授信月份' AFTER `checkmail`,
ADD `download_counter` INT UNSIGNED NOT NULL DEFAULT '0' COMMENT '下載授信使用次數(shù)' AFTER `download_month`,
ADD `download_credit` INT UNSIGNED NOT NULL DEFAULT '0' COMMENT '下載授信次數(shù)' AFTER `download_counter`;
2、后臺(tái)管理界面
后臺(tái)主要在用戶(hù)等級(jí)管理界面進(jìn)行調(diào)整,增刪改查的時(shí)候增加響應(yīng)的界面和處理代碼即可,這里貼出修改的上下文,可以自行對(duì)應(yīng)修改
2.1、dede/member_rank.php
//保存更改
if($dopost=='save')
{
@@ -25,11 +32,12 @@ if($dopost=='save')
$rank = ${"rank_".$startID};
$money = ${"money_".$startID};
$scores = ${"scores_".$startID};
+ $download_credit = ${"download_credit_".$startID};
if(isset(${"check_".$startID}))
{
if($rank>0)
{
- $query = "UPDATE `#@__arcrank` SET membername='$name',money='$money',rank='$rank',scores='$scores' WHERE id='$id' ";
+ $query = "UPDATE `#@__arcrank` SET membername='$name',money='$money',rank='$rank',scores='$scores',download_credit='$download_credit' WHERE id='$id' ";
}
}
else
@@ -42,7 +50,7 @@ if($dopost=='save')
{
if($rank_new > 0 && $name_new != '' && $rank_new > 10)
{
- $inquery = "INSERT INTO `#@__arcrank`(`rank`,`membername`,`adminrank`,`money`,`scores`,`purviews`) VALUES('$rank_new','$name_new','5','$money_new','$scores',''); ";
+ $inquery = "INSERT INTO `#@__arcrank`(`rank`,`membername`,`adminrank`,`money`,`scores`,`download_credit`,`purviews`) VALUES('$rank_new','$name_new','5','$money_new','$scores', '$download_credit',''); ";
$dsql->ExecuteNoneQuery($inquery);
}
}
2.2、dede/templets/member_rank.htm
@@ -20,6 +20,7 @@
<td width="18%">會(huì)員等級(jí)值</td>
<td width="15%">默認(rèn)金幣</td>
<td width="15%">默認(rèn)積分</td>
+ <td width="15%">月免費(fèi)下載次數(shù)</td>
<td width="16%">類(lèi)型</td>
<td width="16%">狀態(tài)</td>
</tr>
@@ -29,12 +30,13 @@
{
$k++;
?>
-
<tr align="center" bgcolor="#FFFFFF" height="24">
<td><input type="hidden" name="ID_<?php echo $k?>" value="<?php echo $row->id; ?>"><input name="name_<?php echo $k?>" value="<?php echo $row->membername; ?>" type="text" id="name_<?php echo $k?>" c
lass='autoinput alltxt' /></td>
<td><input name="rank_<?php echo $k?>" value="<?php echo $row->rank; ?>" type="text" id="rank_<?php echo $k?>" class='autoinput alltxt' /></td>
<td><input name="money_<?php echo $k?>" value="<?php echo $row->money; ?>" type="text" id="money_<?php echo $k?>" class='autoinput alltxt' /></td>
<td><input name="scores_<?php echo $k?>" value="<?php echo $row->scores; ?>" type="text" id="scores_<?php echo $k?>" class='autoinput alltxt' /></td>
+ <td><input name="download_credit_<?php echo $k?>" value="<?php echo $row->download_credit; ?>" type="text" id="download_credit_<?php echo $k?>" class='autoinput alltxt' /></td>
<td align="center">
<?php
if($row->id<=5) { echo "系統(tǒng)"; }
@@ -55,6 +57,7 @@
<td> 級(jí)別值(待審為0,注冊(cè)會(huì)員為10) </td>
<td> 默認(rèn)金幣 </td>
<td> 默認(rèn)積分 </td>
+ <td>默認(rèn)月免費(fèi)下載次數(shù)</td>
<td> 操作設(shè)置 </td>
<td> </td>
</tr>
@@ -63,6 +66,7 @@
<td><input name="rank_new" type="text" id="rank_new" value='20' class='autoinput alltxt' /></td>
<td><input name="money_new" type="text" id="money_new" value='0' class='autoinput alltxt' /></td>
<td><input name="scores_new" type="text" id="scores_new" value='100' class='autoinput alltxt' /></td>
+ <td><input name="download_credit_new" type="text" id="download_credit_new" value='0' class='autoinput alltxt' /></td>
<td><input name="check_new" type="checkbox" id="check_new" class="np" value="1" checked />
增加等級(jí) </td>
<td> </td>
3、前端功能調(diào)整
首先用戶(hù)在自己的控制面板需要能夠查看自己的剩余額度,然后在下載的時(shí)候優(yōu)先使用授信額度,使用完畢后如果繼續(xù)下載則繼續(xù)充值金幣。
3.1、include/memberlogin.class.php
每次實(shí)例化當(dāng)前登錄用戶(hù)信息的時(shí)候,都檢查以下是否需要更新授信額度,然后在展示用戶(hù)等級(jí)的時(shí)候顯示已用額度和總額度。
//間隔一小時(shí)更新一次用戶(hù)登錄時(shí)間
if(time() - $this->M_LoginTime > 3600)
{
$dsql->ExecuteNoneQuery("update `#@__member` set logintime='".time()."',loginip='".GetIP()."' where mid='".$this->fields['mid']."';");
PutCookie("DedeLoginTime",time(),$this->M_KeepTime);
}
+ $this->updateDownloadCredit();
if(!is_array($rs)){
if($this->M_Rank>10 && $this->M_HasDay>0) $sta .= " 剩余天數(shù): <font color='red'>".$this->M_HasDay."</font> 天 ";
elseif($this->M_Rank>10) $sta .= " <font color='red'>會(huì)員升級(jí)已經(jīng)到期</font> ";
+ $sta .= sprintf('月免費(fèi)下載次數(shù) %d/%d', $this->M_DownloadCounter, $this->M_DownloadCredit);
+
}
}
$sta .= " 擁有金幣:{$this->M_Money} 個(gè), 積分:{$this->M_Scores} 分。";
return $sta;
}
-
+ function updateDownloadCredit(){
+ global $dsql;
+ $dc_month = date('Ym');
+ $rank = $dsql->GetOne("Select membername,download_credit From `#@__arcrank` where rank='".$this->M_Rank."'");
+ $this->M_DownloadCredit = $rank['download_credit'];
+ $this->M_DownloadMonth = $this->fields['download_month'];
+ if($this->M_DownloadMonth < $dc_month){
+ $dsql->ExecuteNoneQuery("UPDATE `#@__member`
+ SET download_month=$dc_month,
+ download_credit = {$rank['download_credit']}
+ download_counter = 0
+ WHERE mid='".$this->M_ID."'");
+ }
+ $this->M_DownloadCounter = $this->fields['download_counter'];
+ $this->M_DownloadMonth = $dc_month;
+ }
### 3.2、`plus/download.php`
下載時(shí)在扣除金幣的時(shí)候和之前一樣,如果已經(jīng)購(gòu)買(mǎi)不再重復(fù)購(gòu)買(mǎi)和使用授信額度。當(dāng)需要購(gòu)買(mǎi)時(shí),優(yōu)先使用剩余的授信額度,如果授信額度用完才繼續(xù)進(jìn)入購(gòu)買(mǎi)金幣流程。
```diff
@@ -196,25 +196,40 @@ else if($open==2)
//未購(gòu)買(mǎi)過(guò)此文章
if( !is_array($row) )
{
- //沒(méi)有足夠的金幣
- if( $needMoney > $cfg_ml->M_Money || $cfg_ml->M_Money=='')
- {
- $msgtitle = "你沒(méi)有權(quán)限下載軟件:{$arctitle}!";
- $moremsg = "這個(gè)軟件需要 <font color='red'>".$needMoney." 金幣</font> 才能下載,你目前擁有金幣:<font color='red'>".$cfg_ml->M_Money." 個(gè)</font> !";
- include_once(DEDETEMPLATE.'/plus/view_msg.htm');
- exit(0);
+ // 會(huì)員等級(jí)有相應(yīng)的下載授信額度,則直接扣減額度,扣減完畢后才需要購(gòu)買(mǎi)
+ if($cfg_ml->M_Rank && $cfg_ml->M_DownloadCredit && $cfg_ml->M_DownloadCounter < $cfg_ml->M_DownloadCredit){
+ $inquery = "INSERT INTO `#@__member_operation`(mid,oldinfo,money,mtime,buyid,product,pname,sta)
+ VALUES ('".$cfg_ml->M_ID."','$arctitle','$needMoney','".time()."', 'ARCHIVE".$id."', 'archive','下載軟件(授信)', 2); ";
+ //記錄定單
+ if( !$dsql->ExecuteNoneQuery($inquery) )
+ {
+ ShowMsg('記錄定單失敗, 請(qǐng)返回', '-1');
+ exit(0);
+ }
+ //記錄已用授信次數(shù)
+ $dsql->ExecuteNoneQuery("UPDATE `#@__member` SET download_counter = download_counter + 1 WHERE mid='".$cfg_ml->M_ID."'");
}
- //有足夠金幣,記錄用戶(hù)信息
- $inquery = "INSERT INTO `#@__member_operation`(mid,oldinfo,money,mtime,buyid,product,pname,sta)
- VALUES ('".$cfg_ml->M_ID."','$arctitle','$needMoney','".time()."', 'ARCHIVE".$id."', 'archive','下載軟件', 2); ";
- //記錄定單
- if( !$dsql->ExecuteNoneQuery($inquery) )
- {
- ShowMsg('記錄定單失敗, 請(qǐng)返回', '-1');
- exit(0);
+ else{
+ //沒(méi)有足夠的金幣
+ if( $needMoney > $cfg_ml->M_Money || $cfg_ml->M_Money=='')
+ {
+ $msgtitle = "你沒(méi)有權(quán)限下載軟件:{$arctitle}!";
+ $moremsg = "這個(gè)軟件需要 <font color='red'>".$needMoney." 金幣</font> 才能下載,你目前擁有金幣:<font color='red'>".$cfg_ml->M_Money." 個(gè)</font> !";
+ include_once(DEDETEMPLATE.'/plus/view_msg.htm');
+ exit(0);
+ }
+ //有足夠金幣,記錄用戶(hù)信息
+ $inquery = "INSERT INTO `#@__member_operation`(mid,oldinfo,money,mtime,buyid,product,pname,sta)
+ VALUES ('".$cfg_ml->M_ID."','$arctitle','$needMoney','".time()."', 'ARCHIVE".$id."', 'archive','下載軟件', 2); ";
+ //記錄定單
+ if( !$dsql->ExecuteNoneQuery($inquery) )
+ {
+ ShowMsg('記錄定單失敗, 請(qǐng)返回', '-1');
+ exit(0);
+ }
+ //扣除金幣
+ $dsql->ExecuteNoneQuery("UPDATE `#@__member` SET money = money - $needMoney WHERE mid='".$cfg_ml->M_ID."'");
}
- //扣除金幣
- $dsql->ExecuteNoneQuery("UPDATE `#@__member` SET money = money - $needMoney WHERE mid='".$cfg_ml->M_ID."'");
}
}
}
4、測(cè)試
-
管理后臺(tái)->會(huì)員產(chǎn)品分類(lèi)->設(shè)置產(chǎn)品定價(jià) -
管理后臺(tái)->會(huì)員級(jí)別設(shè)置->設(shè)置對(duì)應(yīng)級(jí)別授信額度 -
用戶(hù)首頁(yè)(http://mysite.com/member)->消費(fèi)中心(http://mysite.com/member/buy.php)-會(huì)員升級(jí)完成后可以回到首頁(yè)查看個(gè)人的授信額度使用和剩余情況 - 下載付費(fèi)資料看是否不在需要付費(fèi),并且出現(xiàn)授信額度使用記錄
5、總結(jié)
從修改開(kāi)始修改代碼到最后完成真心沒(méi)超過(guò)半小時(shí),但是在這之前我就覺(jué)得這個(gè)授信額度的每月重置功能如何設(shè)計(jì)很是鬧心。增加定時(shí)任務(wù)?會(huì)員升級(jí)后馬上處理?總之會(huì)引入各種問(wèn)題,在思前想后想了很久才有這個(gè)辦法:月份不對(duì)馬上更新,授信額度不對(duì)馬上更新,記錄使用次數(shù),比對(duì)時(shí)比對(duì)授信額度和已用次數(shù)即可,簡(jiǎn)單實(shí)用。
這個(gè)功能上上去了客戶(hù)很滿(mǎn)意,但是預(yù)算不多,我也沒(méi)掙到錢(qián),記錄下來(lái)分享給大家,大家看著好的話(huà)打個(gè)賞?如果有效以后我會(huì)給大家分享更多。