近期我们公司项目里陆陆续续有很多为了招引新用户的活动推出,砍价的活动由我来负责,我们的项目是在微信浏览器里供用户浏览访问。

大概描述:进入砍价活动列表页选择有意向的商品,用户点击商品图片可以看到WEB商城中所卖的商品价格与详细参数等信息,点击列表中对应商品标识下的'马上抢购'可以进入砍价页面,该页面有两个主要按钮,一个是'请土豪帮忙'(点击之后起引导分享作用)、'买买买'(砍到一定价位后可以购买),其次包括价格的进度条等信息,用户分享到朋友圈引来朋友帮忙砍价,在触发砍价按钮的同时,如果帮忙的朋友不是本站用户,那么帮忙的朋友会成为本站的会员,同时会是该分享用户的下级,然后根据产品运营采购针对每个商品的讨论,会给商品定义好要砍价的活动价和最低价,以及每砍一次所能砍掉的价格区间和要参与的人数做计算,比如(商品原价3000,最低价1000,那么所能砍掉的价格是2000,规定参与的人数是500人,那么平均一个人砍掉4块钱,可以设定区间为1~7元,来设定砍价的起伏大小,来提高用户的参与兴趣),当用户砍到规定的价格区间内购买时,跳转到订单确认页面,然后下单支付一系列流程。

页面截图:

                        

实现相关:

通过看到几张图片大概我想大家也会考虑到所涉及的相关信息。

想要发布参与活动的商品就有一个商品区分表示,在数据库的设计当中,我没有修改商品表来增加一个区分的字段,而是新创建了一个数据表作为专门放置砍价活动的相关信息。

来看一下后台的前台展示我是这么设计的,没有经过专业前端之手,仅仅在复制了后台商品列表模块代码的基础上自己简单的做了一下布局。

我的数据表设计:

#活动商品设置表:
CREATE TABLE `hp_activity_bargain` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`product_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '商品ID',
`product_name` varchar(200) COLLATE utf8_unicode_ci NOT NULL COMMENT '商品名称',
`activity_money` decimal(7,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '活动价',
`bargain_section` varchar(20) COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '砍价区间',
`bargain_section2` varchar(20) COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '砍价区间2【用户线上砍价(新用户砍价区间)】', #忽略,此处是迭代后期地推而加上的
`join_count` smallint(3) unsigned NOT NULL DEFAULT '0' COMMENT '参与人数',
`product_desc` varchar(80) COLLATE utf8_unicode_ci NOT NULL COMMENT '活动商品描述',
`attr1_id` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'attr1属性',
`attr2_id` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'attr2属性',
`type` tinyint(1) NOT NULL DEFAULT '0' COMMENT '0是线上,1是地推',
PRIMARY KEY (`id`),
KEY `product_id` (`product_id`),
KEY `attr2_id` (`attr2_id`),
KEY `attr1_id` (`attr1_id`),
KEY `type` (`type`)
) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
#用户参与进度信息表
CREATE TABLE `hp_activity_bargainirg` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`activity_bargain_id` int(10) unsigned NOT NULL COMMENT 'activity_prodcuts主键id',
`product_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '参与活动的商品',
`attr1_id` smallint(5) unsigned NOT NULL COMMENT 'attr1属性id',
`attr2_id` smallint(5) unsigned NOT NULL COMMENT 'attr2属性id',
`user_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '砍价商品发起的用户ID',
`bargain_count` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT '被砍价次数',
`deal_money` decimal(7,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '最终交易价格',
`create_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '发起时间',
`is_addorder` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否下单(0:未下单,1已下单)',
`type` tinyint(1) NOT NULL DEFAULT '0' COMMENT '0是线上,1是地推', #可以忽略,后期地推加上去的
PRIMARY KEY (`id`),
KEY `activity_bargain_id` (`activity_bargain_id`),
KEY `attr1_id` (`attr1_id`),
KEY `attr2_id` (`attr2_id`),
KEY `product_id` (`product_id`),
KEY `user_id` (`user_id`),
KEY `is_addorder` (`is_addorder`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
#参与砍价详情表
CREATE TABLE `hp_activity_bargain_list` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`bargain_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'activity_bargainirg表主键id',
`assistor_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '帮助者ID',
`create_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '参与时间',
`bargain_money` decimal(5,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '砍掉价格',
PRIMARY KEY (`id`),
KEY `assistor_id` (`assistor_id`),
KEY `bargain_id` (`bargain_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

控制器几个方法:

 //线上砍价活动列表
public function bargainirgAction()
{
$type = ;
$way = input('param.way', '','string');
if (is_not_empty_string($way) && $way == 'live') {
$type = ;
}
$pageSize = ;
if (Request::isAjax()) {
$page = input('post.page', , 'intval');
$product_list = Hmodel\Activity::getActivityBargainProducts($type, $pageSize, $page * $pageSize);
if (is_not_empty_array($product_list)) {
return json_encode(['status' => , 'info' => $product_list]);
} else {
return json_encode(['status' => ]);
}
}
$product_list = Hmodel\Activity::getActivityBargainProducts($type, , );
$view = new view();
$view->assign('bargainirgList',$product_list);
if ($type == ) {
return $view->fetch('bargainirg');
} else {
return $view->fetch('bargainirg_live');
} } //砍价活动\商品详情\查看贡献度\请帮忙
public function bargaindetailAction()
{ $this->checkUserLogin();
$uid = session('userinfo.uid');
// $uid = 3;
$seting_id = input('param.id',,'int');
$seting_info = Hmodel\Activity::getActivityProductsSeting($seting_id); //砍价活动商品设置
$bargain_section2 = !empty($seting_info['bargain_section2']) ? $seting_info['bargain_section2'] : 'no seting';
if (!is_not_empty_array($seting_info)) notFund(); $bargain_progress = Hmodel\Activity::returnProgressData( $seting_id, $seting_info['product_id'], $uid, $seting_info['attr1_id'],$seting_info['attr2_id'],
$seting_info['add_money'],$seting_info['type']); if (!is_not_empty_array($bargain_progress) || $bargain_progress['user_id'] != $uid) notFund(); $username = session('userinfo.username');
$user_info = Hmodel\User::getuser_info($uid);
$invite_code = $user_info['invite_code'];
$encrypt_code = encrypt_hopeband($bargain_progress['id'] . '(&)' .$bargain_progress['activity_bargain_id'] . '(&)' .$uid . '(&)' . $invite_code . '(&)'
. $seting_info['product_id'] . '(&)' . $seting_info['activity_money'] . '(&)' . $seting_info['bargain_section'] . '(&)' . $seting_info['bargain_section2'] .'(&)'
. $seting_info['join_count'] . '(&)'. $bargain_progress['type'], 'E', 'Hp_HopeBand_Bargainirg'); //是否已经下单
// $is_addorder = Hmodel\Activity::checkIsAddorder($bargain_progress['id']);
$is_addorder = $bargain_progress['is_addorder']; //帮助列表
$assistor_list = Hmodel\Activity::getAssistorList($bargain_progress['id']); $view = new view();
$view->assign([
'bar_code' => $encrypt_code,
'seting_info' => $seting_info,
'bargain_progress' => $bargain_progress,
'assistor_list' => $assistor_list,
'seting' => $seting_id,
'is_addorder' => $is_addorder
]);
$view->assign();
return $view->fetch(); } //帮忙砍价\进度\底部砍价商品列表
public function bargainirgingAction ()
{
$url = $_SERVER['REQUEST_URI'];
$encrypt_code = substr(substr($url,),,strpos(substr($url,), '?invite_code')); $bargain_param = self::retrunBargainCode($encrypt_code);
$bargain_id = $bargain_param['bargain_id'];
$bargainInfo = Hmodel\Activity::getBargainirgProgress($bargain_id);
if ( !is_not_empty_array($bargain_param) || !is_not_empty_array($bargainInfo)) {
notFund();
} $is_addorder = $bargainInfo['is_addorder'] == ? true : false; $uid = session('userinfo.uid');
$activity_product_id = $bargain_param['activity_product_id']; if ($bargain_param['sponsor_uid'] == $uid) {
$this->redirect('bargaindetail',['id' => $activity_product_id]);
}
$product_id = $bargain_param['product_id']; $bargain_list = Hmodel\Activity::getActivityBargainProducts($bargain_param['type'], ); //所有参与砍价活动的商品 foreach ($bargain_list as $v) {
if ( $v['id'] == $activity_product_id) {
$product_info = $v;
}
} if (!is_not_empty_array($product_info)) notFund();
$type = $bargain_param['type'];
$activity_bargain_url = url('activity/bargainirg') ; $view = new view();
$view->assign([
'bar_code' => $encrypt_code, //邀请码
'bargainInfo' => $bargainInfo, //当前砍价进度
'product_info' => $product_info, //商品详情
'bargain_list' => $bargain_list, //底部相关推荐
'is_addorder' => $is_addorder, //是否入库
'activity_bargain_url' => $activity_bargain_url
]); return $view->fetch(); } //ajax砍价
public function goBargainAction ()
{
if (Request::isAjax()) { $uid = session('userinfo.uid');
$username = session('userinfo.username');
$encrypt_code = input('post.bar_code', '', 'string');
if (empty($uid) || empty($username)) {
$this->checkUserLogin();
}
$bargain_param = self::retrunBargainCode($encrypt_code);
if (!is_not_empty_array($bargain_param)) {
echo json_encode(array('status' => -, 'info' => '不明错误,请联系客服'));die;
} $seting_info = Hmodel\Activity::getActivityProductsSeting($bargain_param['activity_product_id']); //砍价活动商品设置
$stock = Hmodel\CategoryAttr::getproductstockbyidsonattr($seting_info['product_id'],$seting_info['attr1_id'],$seting_info['attr2_id']); if ($stock['category_sum'] < ) {
echo json_encode(['status' => -, 'info' => '已抢光!']);die;
} $userinfo = Hmodel\User::getuser_info($uid);
$register_time = $userinfo['create_time'];
$is_new_user = false; //用户状态[default:老用户]
if (($register_time + ( * * )) > time() && Hmodel\Activity::checkUserIsbargainEd($uid) === false) {
$is_new_user = true; //是新用户
} $sponsor_uid = $bargain_param['sponsor_uid']; //发起者id
$bargain_id = $bargain_param['bargain_id']; //[activity_bargainirg]表主键id
$join_count = $bargain_param['join_count']; //设置砍价次数
$section = $bargain_param['bargain_section']; //砍价区间(老用户)
$section2 = $bargain_param['bargain_section2']; //砍价区间(新用户)
$type = $bargain_param['type'] == $seting_info['type'] ? $bargain_param['type'] : ''; //0:线上; 1:地推
$activity_money= $bargain_param['activity_money']; //活动最低价 if (!is_not_empty_string($type)) {
echo json_encode(array('status' => -, 'info' => '不明错误,请联系客服'));die;
} if ($uid == $sponsor_uid) {
echo json_encode(array('status' => -, 'info' => '不能给自己砍价'));die;
} $state = Hmodel\Activity::checkPartBargain($bargain_id, $uid); //是否帮伙伴砍过当前参与的进度 if ( $state !== false) {
echo json_encode(array('status' => -, 'info' => '您已帮伙伴砍掉' . $state . '元啦,不要再砍啦!'));die;
}
if ($type == && $is_new_user === false) {
echo json_encode(array('status' => -, 'info' => '抱歉,该活动仅限新用户参加!'));die;
} $state = Hmodel\Activity::givePartBargain($bargain_id, $sponsor_uid, $uid, $section, $section2, $join_count, $is_new_user,
$activity_money, $type);
if ($state == -) {
echo json_encode(array('status' => -, 'info' => '已经最低价啦,不能再砍啦!'));die;
}
if ($state === false) {
echo json_encode(array('status' => -, 'info' => '哎呀,失败了!稍后帮我砍一次!'));die;
} else {
if ($is_new_user === true) {
echo json_encode(array('status' => , 'info' => '砍掉了' . $state .'元', 'deal_money' => $state));die;
} else {
echo json_encode(array('status' => , 'info' => '成功帮伙伴砍掉' . $state .'元!', 'deal_money' => $state));die;
}
} }
} //返回砍价活动相关数据
public static function retrunBargainCode( $encrypt_str = '')
{
$data = [];
$code_str = encrypt_hopeband($encrypt_str, 'D', 'Hp_HopeBand_Bargainirg'); $code_arr = explode('(&)', $code_str); if (is_not_empty_array($code_arr) && count($code_arr) == ) {
$data['bargain_id'] = $code_arr[]; //砍价活动表主键id
$data['activity_product_id'] = $code_arr[];
$data['sponsor_uid'] = $code_arr[]; //砍价活动发起者uid
$data['sponsor_invite_code'] = $code_arr[]; //砍价活动发起者邀请码
$data['product_id'] = $code_arr[]; //砍价活动发起的商品id
$data['activity_money'] = $code_arr[]; //活动最低价格
$data['bargain_section'] = $code_arr[]; //老用户砍价区间
$data['bargain_section2'] = $code_arr[]; //新用户砍价区间
$data['join_count'] = $code_arr[]; //设置砍价次数
$data['type'] = $code_arr[]; //设置砍价次数 } return $data;
}
public function checkOrder2PayAction()
{
$this->checkUserLogin();
if (!Request::isAjax()) { notFund(); }
$seting_id = input('post.seting',,'intval');
$user_id = session('userinfo.uid');
//拿付款的额度和商品id
$BargainPayData = Hmodel\Activity::getBargainResult2Pay($seting_id, $user_id);
$stock = Hmodel\CategoryAttr::getproductstockbyidsonattr($BargainPayData['product_id'],$BargainPayData['attr1_id'],$BargainPayData['attr2_id']);
if ($stock['category_sum'] < ) {
return json_encode(['status' => -, 'info' => '已抢光!']);die;
}
if ($BargainPayData['is_addorder'] == ) {
return json_encode(['status' => -, 'info' => '此商品已经购买过,不能重复购买!']);die;
}
if (!is_not_empty_array( $BargainPayData)) {
return json_encode(['status' => -, 'info' => '不明错误,请联系客服!']);die;
} $product_id = $BargainPayData['product_id']; $attr1_name = '';
$attr2_name = '';
if (is_not_empty_array($attr1_info = Hmodel\Activity::getAttr1NameByAttrId($BargainPayData['attr1_id'], $product_id))){
$attr1_name = $attr1_info['attr'];
}
if (is_not_empty_array($attr2_info = Hmodel\Activity::getAttr2NameByAttrId($BargainPayData['attr2_id'], $product_id))){
$attr2_name = $attr2_info['attr'];
}
$data = [
'product_id' => $product_id,
'prodcut_num' => ,
'attr1' => $attr1_name,
'attr2' => $attr2_name,
'seting_id' => $seting_id
];
return json_encode(['status' => , 'info' => $data]); } //查看砍价后的预付款订单信息
public function createActivityOrderAction ()
{
$this->checkUserLogin(); $uid = session('userinfo.uid'); $product_num = ;
$attr1 = input("param.attr1", "" , "trim,string");
$attr2 = input("param.attr2", "" , "trim,string");
$seting_id = intval(input('param.seting_id', , 'intval'));
$product_id = intval(input("param.product_id", "" , "intval")); $pay_price_money = Hmodel\Activity::returnPayMoney($product_id, $seting_id, $uid); $type = $pay_price_money['type']; if (!is_not_empty_array($pay_price_money)) notFund();
Cookie::set('ready_finish_bargain', encrypt_hopeband($pay_price_money['id'] . '(&)', 'E', 'hp_ready_bargain_pay'));
$pay_info = $this->calculateFromProduct($product_id, $product_num, $attr1, $attr2, $uid , $pay_price_money['deal_money'], $type);
$def_address = Hmodel\UserAddress::getDefAddress($uid);
$view = new View();
$view->assign('def_address',$def_address);
$view->assign('product_carlist_bymerchantid',$pay_info['product_carlist_bymerchantid']);
$view->assign('total_price',sprintf("%.2f",$pay_info['total_price'])); $view->assign('total_delivery',$pay_info['total_delivery']);
$view->assign('seting_id',$seting_id); return $view->fetch('createorder');
}

Model层部分方法:

//根据主键id查询活动产品相关属性设置
public static function getActivityProductsSeting( $id = ) {
$data = [];
if (!is_positive_integer($id)) {
return $data;
}
$sql = "SELECT a.`id`,a.`product_id`,a.`activity_money`,a.`bargain_section`,a.`join_count`,a.`product_desc`,a.`product_name`,
a.`attr1_id`,a.`attr2_id`,
b.`give_score`,b.`category_img`,b.`add_money`,b.`category_sum`
FROM `hp_activity_bargain` AS a
LEFT JOIN `hp_category_attr` AS b
ON a.`attr1_id` = b.`attr1_son_id` AND a.`attr2_id` = b.`attr2_son_id` AND a.`product_id` = b.`category_id`
WHERE a.`id` = $id
LIMIT ";
$res = Db::query($sql);
if (is_not_empty_array($res)) {
$data = $res[];
}
return $data;
}
//通过主键id拿砍价活动表的相关信息
public static function getBargainirgProgress($id = ) {
$data = [];
$sql = "SELECT `id`,`activity_bargain_id`,`product_id`,`attr1_id`,`attr2_id`,`user_id`,`bargain_count`,`deal_money`,`is_addorder`
FROM `hp_activity_bargainirg`
WHERE `id` = $id LIMIT ";
$res = self::query($sql);
if (is_not_empty_array($res)) {
$data = $res[];
}
return $data;
}
//返回要砍
public static function returnProgressData($a_b_id = , $product_id = , $user_id = , $attr1_son_id = , $attr2_son_id = , $deal_money= ){
$data = [];
$sql = "SELECT `id`,`activity_bargain_id`,`product_id`,`attr1_id`,`attr2_id`,`user_id`,`bargain_count`,`deal_money`,`is_addorder`
FROM `hp_activity_bargainirg`
WHERE `activity_bargain_id` = $a_b_id AND `attr1_id` = $attr1_son_id AND `attr2_id` = $attr2_son_id AND `product_id` = $product_id AND `user_id` = $user_id
LIMIT "; $res = self::query($sql);
if (is_not_empty_array($res)) {
$data = $res[];
} else {
$data['activity_bargain_id'] = $a_b_id;
$data['product_id'] = $product_id;
$data['user_id'] = $user_id;
$data['deal_money'] = $deal_money;
$data['attr1_id'] = $attr1_son_id;
$data['attr2_id'] = $attr2_son_id;
$data['create_time'] = time();
$data['bargain_count'] = ;
Db::name('activity_bargainirg')->insert($data);
$insertId = Db::name('activity_bargainirg')->getLastInsID();
$data['id'] = $insertId;
// $data = self::getBargainirgProgress($insert_id);
}
return $data;
}
//通过 表[activity_products] 主键id 和 user_id 拿到用户购买前要付款的额度和购买商品
public static function getBargainResult2Pay($a_b_id = , $user_id = ) {
$data = [];
if ( !is_positive_integer($a_b_id) || !is_positive_integer($user_id)) {
return $data;
}
$sql = "SELECT `id`,`deal_money`,`product_id`,`attr1_id`,`attr2_id` FROM `hp_activity_bargainirg`
WHERE `activity_bargain_id` = $a_b_id AND `user_id` = $user_id
LIMIT ";
$res = Db::query($sql);
if (is_not_empty_array($res)) {
$data = $res[];
}
return $data;
} //检测是否帮助伙伴砍价
//$bargain_id [activity_bargainirg]表主键id
//$assistor_id 帮助砍价者用户id
public static function checkPartBargain ($bargain_id = , $assistor_id = ) {
$state = false;
if (!is_positive_integer($bargain_id) || !is_positive_integer($assistor_id)) {
return $state;
}
$sql = "SELECT `bargain_money` FROM `hp_activity_bargain_list`
WHERE `bargain_id` = $bargain_id AND `assistor_id` = $assistor_id
LIMIT "; $res = self::query($sql); if (is_not_empty_array($res)) { return $res[]['bargain_money'];
}
return $state; } //查询帮忙砍价的伙伴列表
public static function getAssistorList ( $bargain_id = ){
$data = [];
if (is_positive_integer($bargain_id) && is_positive_integer($assistor_id))
return $data;
$sql = "SELECT a.`create_time`, a.`bargain_money`, b.`nickname`, b.`headimgurl`
FROM `hp_activity_bargain_list` AS a
LEFT JOIN `hp_user_auths` AS b
ON a.`assistor_id` = b.`user_id`
WHERE a.`bargain_id` = $bargain_id
ORDER BY a.`id` DESC"; $data = self::query($sql);
return $data;
} //拿到上次所砍掉的价格
public static function getBeforeMoney ( $bargain_id = , $limit = ) {
$beforemoney_sum = ;
$sql = "SELECT SUM(`bargain_money`) AS beforemoney_sum FROM
(SELECT `bargain_money` FROM `hp_activity_bargain_list`
WHERE `bargain_id` = $bargain_id
ORDER BY `id` DESC
LIMIT $limit) sum"; $res = Db::query($sql);
if (is_not_empty_array($res)) {
$beforemoney_sum = $res[]['beforemoney_sum'];
}
return $beforemoney_sum;
} /**
* 砍价相关数据操作
*$bargain_id [activity_bargainirg] 表主键id
*$sponsor_id 砍价发起者id
*$assistor_id 帮助砍价者id
*$min 最小值
*$max 最大值
*$join_count 设置要参与砍价的人数
*return bool
*/
public static function givePartBargain($bargain_id = , $sponsor_id = , $assistor_id = , $min = , $max = ,$join_count = ) {
$state = false;
if (is_positive_integer($assistor_id) && $bargain_id > && is_positive_integer($sponsor_id)) {
$bargainirg_info = Db::name('activity_bargainirg')->find($bargain_id); if ( !$bargainirg_info ) {
return $state;
} $fp = fopen('./bargain_lock.txt','r');
$try = ;
do {
$lock = flock($fp,LOCK_EX);
if(!$lock)
usleep();
} while (!$lock && --$try >= ) ;
if ($lock) {
Db::startTrans();
try {
$bargain_money = self::returnRandMoney($bargain_id, $min, $max, $join_count);
/*-------------*/
$id = ;
$sql = "UPDATE `hp_activity_bargainirg`
SET `deal_money` = `deal_money` - $bargain_money,`bargain_count` = `bargain_count`+
WHERE `id` = $bargain_id AND `user_id` = $sponsor_id AND `deal_money` > $bargain_money
AND `bargain_count` < $join_count";
$row = self::execute($sql);
if ( $row > ) {
$insert_data = [];
$insert_data['bargain_id'] = $bargain_id;
$insert_data['assistor_id'] = $assistor_id;
$insert_data['bargain_money'] = $bargain_money;
$insert_data['create_time'] = time();
$id = Db::name('activity_bargain_list')->insert($insert_data);
}
/*-------------*/
if ($id > )
$state = true;
Db::commit();
}catch(\Exception $e){
$state = false;
Db::rollback();
}

        flock($lock,LOCK_UN);
        fclose($lock);

            }
}
if ($state !== false ) {
return $bargain_money;
}
return $state;
} //返回要砍的价格
public static function returnRandMoney ($bargain_id = , $min = ,$max = , $join_count = ){
$randMoney = self::randomFloat( $min, $max); //返回随机价格
$prev_Progress = self::getBargainirgProgress($bargain_id);
$prev_bargain_count = $prev_Progress['bargain_count']; //返回已经被砍价的次数
$remainder = $prev_bargain_count % ; $bout_count = floor($join_count / ) * ; //最后一轮结束的刀数 39
$last_num = $join_count - $bout_count;
$avg = ($min + $max) / ;
$before_sum = self::getBeforeMoney($bargain_id, $remainder); if ($prev_bargain_count >= $bout_count) {
if ($last_num == ){
return $avg;
} elseif ($last_num == ) {
$end = $join_count - $prev_Progress['bargain_count'] ;
if ($end == ) {
return $randMoney;
} elseif($end == ) {
return $avg * - $before_sum;
}
}
}
// $remainder_num = $join_count % 3; //总回合数的余数
if ($remainder > ) {
if ( $remainder == ) {
$point = $max * 0.8; //最大额度的80%
$bout_sum = * $avg;
if ($before_sum >= $point) {
$randMoney = self::randomFloat($min, ($bout_sum - $before_sum) / );
} else {
$randMoney = self::randomFloat(($bout_sum - $before_sum) / , $point);
}
}
if ($remainder == ) {
$round_sum_money = * $avg;
$randMoney = $round_sum_money - $before_sum;
}
}
return $randMoney; }
//拿随机价格
public static function randomFloat($min = , $max = ) {
return round($min + mt_rand() / mt_getrandmax() * ($max - $min),);
} //拿砍价活动下所有商品
public static function getActivityBargainProducts ( $limit = , $offset = ) {
$data = [];
$sql = "SELECT a.`id`,a.`product_id`,a.`activity_money`,a.`bargain_section`,a.`join_count`,a.`product_desc`,a.`product_name`,
a.`attr1_id`,a.`attr2_id`,
b.`give_score`,b.`category_img`,b.`add_money`,b.`category_sum`
FROM `hp_activity_bargain` AS a
LEFT JOIN `hp_category_attr` AS b
ON a.`attr1_id` = b.`attr1_son_id` AND a.`attr2_id` = b.`attr2_son_id` AND a.`product_id` = b.`category_id`
WHERE =
ORDER BY a.`id` DESC
LIMIT $limit OFFSET $offset";
$data = self::query($sql);
return $data;
}

PHP-ThinkPHP5砍价活动相关设计的更多相关文章

  1. PHP基于Thinkphp5的砍价活动相关设计

    近期我们公司项目里陆陆续续有很多为了招引新用户的活动推出,砍价的活动由我来负责,我们的项目是在微信浏览器里供用户浏览访问. 大概描述:进入砍价活动列表页选择有意向的商品,用户点击商品图片可以看到WEB ...

  2. H5活动产品设计指南基础版

    本文来自 网易云社区 . H5一般页面不会很多,看似简单,实际上会有很多细节需要注意,我自己在做过了几个H5之后,发现了一些常犯的问题,做了小结,希望给新开始做H5的产品相关的同学提供一些帮助.  首 ...

  3. JAVA版本微信管家平台—JeeWx 捷微 4.1 微服务版本发布,微信砍价活动闪亮登场!

    捷微 4.1   微服务版本发布,微信砍价活动闪亮登场 ^_^ JEEWX 从4.0版本开始,技术架构全新换代更名 “捷微H5”.这是一款开源免费的微信运营平台,是jeewx的新一代产品,平台涵盖了: ...

  4. SAP Marketing Cloud功能简述(三) 营销活动内容设计和产品推荐

    Grace的前两篇文章: SAP Marketing Cloud功能简述(一) : Contacts和Profiles SAP Marketing Cloud功能简述(二) : Target Grou ...

  5. 【活动发布】捷微H5-微信新年砍价活动,开源发布了

    活动名称: 微信新年砍价 适用项目: 捷微H5活动平台源码下载:http://yun.jeecg.org/pmall/detail/924D63E4F73B4387B75DE9B8545136C5 视 ...

  6. Qt界面(控件)相关设计

    (转自:http://blog.chinaunix.net/uid-25799257-id-600157.html) 引言  最近在做数据库相关课程设计,所以就借此机会,先熟悉一下Qt的一些编程,同时 ...

  7. 【Tomcat】Tomcat相关设计模式分析

    门面模式 门面模式在 Tomcat 中有多处使用,在 Request 和 Response 对象封装中.Standard Wrapper 到 ServletConfig 封装中.Application ...

  8. swift 如何给tabBarItem的相关设计

    //设置tabBarItem的title,以及点击和不点击状态图片 self.tabBarController.tabBarItem = UITabBarItem(title: "投资理财& ...

  9. 现代JVM内存管理方法的发展历程,GC的实现及相关设计概述(转)

    JVM区域总体分两类,heap区和非heap区.heap区又分:Eden Space(伊甸园).Survivor Space(幸存者区).Tenured Gen(老年代-养老区). 非heap区又分: ...

随机推荐

  1. ubuntu下中文乱码解决方案(全)

    转自 http://www.cnblogs.com/end/archive/2011/04/19/2021507.html   1.ibus输入法 Ubuntu 系统安装后已经自带了ibus输入法,在 ...

  2. 使用Pangolon在同一副图中,画出两个轨迹,比较误差

    使用 code/ground-truth.txt 和 code/estimate.txt 两条轨迹.请你根据上面公式,实现 RMSE的计算代码,给出最后的 RMSE 结果.作为验算,参考答案为:2.2 ...

  3. HDU 3045 - Picnic Cows - [斜率DP]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3045 It’s summer vocation now. After tedious milking, ...

  4. deque Comparison of Queue and Deque methods Comparison of Stack and Deque methods

    1. 队列queue和双端队列deque的转换 Queue Method Equivalent Deque Methodadd(e) addLast(e)offer(e) offerLast(e)re ...

  5. Thymeleaf模板引擎的初步使用

    在springboot中,推荐使用的模板引擎是Thymeleaf模板引擎,它提供了完美的Spring MVC的支持.下面就简单的介绍一下Thymeleaf模板引擎的使用. 在controller层中, ...

  6. [python-opencv] 模糊操作

    @不要在奋斗的年纪 选择安逸 均值模糊 中值模糊 自定义模糊 意义与应用场景 模糊的基本原理: 1.基于离散卷积 2.定义好每个卷积核 3.不同卷积核得到不同的卷积效果 4.模糊是卷积的一种表象 #均 ...

  7. 聊一聊Linux中的工作队列2

    上一篇文章对工作队列原理以及核心数据结构做了简单介绍,本文重点介绍下workqueue的创建以及worker的管理. 一.工作队列的创建(__alloc_workqueue_key) struct w ...

  8. [js]js中原型的继承

    js继承01 思路: 单例/工厂/构造函数--演进到原型 搞清原型结构 原型继承 模拟系统原型继承 实现自己的继承 观察原型继承特点 演进到原型链这一步 //单例模式: 防止变量名冲突: // 思路: ...

  9. 训练/验证/测试集设置;偏差/方差;high bias/variance;正则化;为什么正则化可以减小过拟合

    1. 训练.验证.测试集 对于一个需要解决的问题的样本数据,在建立模型的过程中,我们会将问题的data划分为以下几个部分: 训练集(train set):用训练集对算法或模型进行训练过程: 验证集(d ...

  10. loadrunner怎么打印接口返回的参数

    //首先使用web_reg_save_param方法保存服务器返回的参数,如下: web_reg_save_param ("S_respond","LB=",& ...