mirror of
https://github.com/crmeb/CRMEB.git
synced 2025-12-16 14:22:48 +00:00
Merge branch 'master' of https://gitee.com/ZhongBangKeJi/CRMEB
* 'master' of https://gitee.com/ZhongBangKeJi/CRMEB: 更新 README.md 更新 README.md 更新 README.md 分享时显示产品名称 更新 README.md 修改 crmeb.sql中的eb_store_product表中slider_image的类型,进而修复了上传商品多张轮播图后编辑报错 原有eb_store_product表中slider_image的类型为varchar(512),导致上传多张轮播图后,内容长度超过了512,使得字段内容被截取,致使在上传多张轮播图后再点击编辑商品报错(原因是因为json_decode的结果为null) 修复下单时报出的illegal offset错误 用于存放签名的临时数组$tem与返回的$data应初始化为array而不应该为空字符串 修复公众号无法二级分销问题 公众号User模型l缺少了二级分销的函数,添加即可 修复分销时二级推广人无法获得奖励金问题 源代码中获取二级返佣比例时字段名与数据库字段名不符合( store_brokerage_ratio_two),致使取出的比例为0,二级分销函数直接返回,进而导致了二级分销人无法得到佣金,修改字段为(store_brokerage_two),与数据库对应即可 更新 README.md 更新 README.md # Conflicts: # .htaccess # application/wap/model/user/User.php # public/.htaccess
This commit is contained in:
commit
f25078c485
41
README.md
41
README.md
@ -1,3 +1,6 @@
|
|||||||
|
<p align="center">
|
||||||
|
<img src="https://images.gitee.com/uploads/images/2018/1214/151026_2299df23_892944.gif" />
|
||||||
|
</p>
|
||||||
<h1 align="center"> CRMEB客户管理+电商管理系统</h1>
|
<h1 align="center"> CRMEB客户管理+电商管理系统</h1>
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="http://www.crmeb.com">
|
<a href="http://www.crmeb.com">
|
||||||
@ -14,10 +17,10 @@
|
|||||||
</a>
|
</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
## 本项目还在不断开发完善中,如有建议或问题请[在这里提出](https://gitee.com/ZhongBangKeJi/CRMEB/issues)
|
## 本项目还在不断开发完善中,如有建议或问题请[官方论坛](http://bbs.crmeb.net)
|
||||||
|
|
||||||
# 如果对您有帮助,您可以点右上角 "Star" 支持一下 谢谢!
|
# 如果对您有帮助,您可以点右上角 "Star" 支持一下 谢谢!
|
||||||
|
## :point_right: 小程序版:https://gitee.com/ZhongBangKeJi/CRMEB_WeChatMiniProgram
|
||||||
## [帮助文档](https://gitee.com/ZhongBangKeJi/CRMEB/wikis/)
|
## [帮助文档](https://gitee.com/ZhongBangKeJi/CRMEB/wikis/)
|
||||||
|
|
||||||
## 项目介绍
|
## 项目介绍
|
||||||
@ -61,15 +64,17 @@
|
|||||||
5.订单:能够完成用户的订单管理(发货、订单详情、修改订单、订单备注、订单记录、订单退款) 、售后服务 (评论的回复与删除)
|
5.订单:能够完成用户的订单管理(发货、订单详情、修改订单、订单备注、订单记录、订单退款) 、售后服务 (评论的回复与删除)
|
||||||
|
|
||||||
6.分销:后台有分销统计管理,分销可以设置人人分销和指定人分销,也可以自己稍微开发一下修改规则,例如下单后成为分销等
|
6.分销:后台有分销统计管理,分销可以设置人人分销和指定人分销,也可以自己稍微开发一下修改规则,例如下单后成为分销等
|
||||||
|
|
||||||
|
7.数据统计图表统计分析(财务统计、产品统计、会员统计、营销统计、分销统计、交易统计等)
|
||||||
|
|
||||||
7.设置:能够完成管理员对网站的商品资料(添加大类、添加小类、商品添加、属性快速生成、商品审查)、商品交易(外理订单、发
|
8.设置:能够完成管理员对网站的商品资料(添加大类、添加小类、商品添加、属性快速生成、商品审查)、商品交易(外理订单、发
|
||||||
货查询)、会员管理(会员审查)、操作管理(管理员添加、管理员审查、管理员退出)、系统配置、后台通知等功能
|
货查询)、会员管理(会员审查)、操作管理(管理员添加、管理员审查、管理员退出)、系统配置、后台通知等功能
|
||||||
|
|
||||||
8.内容:管理文章分类 (添加分类、删除分类、修改分类) 、 管理文章
|
9.内容:管理文章分类 (添加分类、删除分类、修改分类) 、 管理文章
|
||||||
|
|
||||||
9.维护:查看系统日志、文件变动效验、刷新网站缓存、在线更新系统、清除数据等功能
|
10.维护:查看系统日志、文件变动效验、刷新网站缓存、在线更新系统、清除数据、文件管理等功能
|
||||||
|
|
||||||
10.强大的权限管理系统
|
11.强大的权限管理系统
|
||||||
|
|
||||||
## 演示地址
|
## 演示地址
|
||||||
演示站后台:[<a href='http://demo25.crmeb.net' target="_blank"> crmeb_v2.5 </a>]
|
演示站后台:[<a href='http://demo25.crmeb.net' target="_blank"> crmeb_v2.5 </a>]
|
||||||
@ -90,10 +95,6 @@ CRMEB微信小程序v2.5版:除了以上功能还带砍价、拼团功能
|
|||||||
|
|
||||||
CRMEB微信公众号小程序打通v2.5版:除了以上功能还带砍价、拼团功能 需要申请微信开放平台
|
CRMEB微信公众号小程序打通v2.5版:除了以上功能还带砍价、拼团功能 需要申请微信开放平台
|
||||||
|
|
||||||
CRMEB微信公众号v2.0版:除了以上功能还带拼团功能
|
|
||||||
|
|
||||||
CRMEB微信小程序v2.0版:除了以上功能还带砍价、拼团功能
|
|
||||||
|
|
||||||
还有定制开发服务,例如:预约系统、O2O、付费阅读、多店版、多商家版
|
还有定制开发服务,例如:预约系统、O2O、付费阅读、多店版、多商家版
|
||||||
|
|
||||||
### 详情[<a href='https://s.click.taobao.com/W7hVkLw' target="_blank"> 进入淘宝 </a>]
|
### 详情[<a href='https://s.click.taobao.com/W7hVkLw' target="_blank"> 进入淘宝 </a>]
|
||||||
@ -121,8 +122,26 @@ Git clone https://gitee.com/ZhongBangKeJi/CRMEB.git
|
|||||||
|
|
||||||
QQ群: 116279623
|
QQ群: 116279623
|
||||||
|
|
||||||
|
官方论坛:http://bbs.crmeb.net
|
||||||
|
|
||||||
Gitee: https://gitee.com/ZhongBangKeJi/CRMEB/issues
|
Gitee: https://gitee.com/ZhongBangKeJi/CRMEB/issues
|
||||||
|
|
||||||
|
## 系统组件开源项目
|
||||||
|
|
||||||
|
#### form-builder
|
||||||
|
|
||||||
|
tp5 PHP表单生成器,快速生成现代化的form表单。包含复选框、单选框、输入框、下拉选择框等元素以及,省市区三级联动,时间选择,日期选择,颜色选择,文件/图片上传等功能。
|
||||||
|
form-builder : https://github.com/xaboy/form-builder
|
||||||
|
#### laravel-form-builder
|
||||||
|
|
||||||
|
laravel PHP表单生成器,快速生成现代化的form表单。包含复选框、单选框、输入框、下拉选择框等元素以及,省市区三级联动,时间选择,日期选择,颜色选择,文件/图片上传等功能。
|
||||||
|
https://github.com/xaboy/laravel-form-builder
|
||||||
|
|
||||||
|
#### form-create
|
||||||
|
|
||||||
|
具有动态渲染、数据收集、校验功能的表单生成器,支持双向数据绑定、事件扩展以及自定义组件,可快速生成包含有省市区三级联动、时间选择、日期选择等17种功能组件。 http://fc.gd8.top
|
||||||
|
https://github.com/xaboy/form-create
|
||||||
|
|
||||||
## 特别鸣谢
|
## 特别鸣谢
|
||||||
感谢以下的项目,排名不分先后
|
感谢以下的项目,排名不分先后
|
||||||
|
|
||||||
@ -134,8 +153,6 @@ jQuery:http://jquery.com
|
|||||||
|
|
||||||
iView:https://www.iviewui.com
|
iView:https://www.iviewui.com
|
||||||
|
|
||||||
form-builder : https://github.com/xaboy/form-builder(也是参与本项目开发的技术)
|
|
||||||
|
|
||||||
Vue:https://cn.vuejs.org/
|
Vue:https://cn.vuejs.org/
|
||||||
|
|
||||||
font-awesome: https://fontawesome.com/?from=io
|
font-awesome: https://fontawesome.com/?from=io
|
||||||
|
|||||||
@ -131,7 +131,7 @@ class User extends ModelBasic
|
|||||||
if($storeBrokerageStatu == 1){
|
if($storeBrokerageStatu == 1){
|
||||||
if(!User::be(['uid'=>$userInfoTwo['spread_uid'],'is_promoter'=>1])) return true;
|
if(!User::be(['uid'=>$userInfoTwo['spread_uid'],'is_promoter'=>1])) return true;
|
||||||
}
|
}
|
||||||
$brokerageRatio = (SystemConfigService::get('store_brokerage_ratio_two') ?: 0)/100;
|
$brokerageRatio = (SystemConfigService::get('store_brokerage_two') ?: 0)/100;
|
||||||
if($brokerageRatio <= 0) return true;
|
if($brokerageRatio <= 0) return true;
|
||||||
$cost = isset($orderInfo['cost']) ? $orderInfo['cost'] : 0;//成本价
|
$cost = isset($orderInfo['cost']) ? $orderInfo['cost'] : 0;//成本价
|
||||||
if($cost > $orderInfo['pay_price']) return true;//成本价大于支付价格时直接返回
|
if($cost > $orderInfo['pay_price']) return true;//成本价大于支付价格时直接返回
|
||||||
|
|||||||
@ -1,150 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @author: xaboy<365615158@qq.com>
|
|
||||||
* @day: 2017/12/21
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace app\wap\model\user;
|
|
||||||
|
|
||||||
|
|
||||||
use basic\ModelBasic;
|
|
||||||
use service\SystemConfigService;
|
|
||||||
use think\Request;
|
|
||||||
use think\response\Redirect;
|
|
||||||
use think\Session;
|
|
||||||
use think\Url;
|
|
||||||
use traits\ModelTrait;
|
|
||||||
|
|
||||||
class User extends ModelBasic
|
|
||||||
{
|
|
||||||
use ModelTrait;
|
|
||||||
|
|
||||||
protected $insert = ['add_time','add_ip','last_time','last_ip'];
|
|
||||||
|
|
||||||
protected function setAddTimeAttr($value)
|
|
||||||
{
|
|
||||||
return time();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function setAddIpAttr($value)
|
|
||||||
{
|
|
||||||
return Request::instance()->ip();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function setLastTimeAttr($value)
|
|
||||||
{
|
|
||||||
return time();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function setLastIpAttr($value)
|
|
||||||
{
|
|
||||||
return Request::instance()->ip();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static function setWechatUser($wechatUser,$spread_uid = 0)
|
|
||||||
{
|
|
||||||
return self::set([
|
|
||||||
'account'=>'wx'.$wechatUser['uid'].time(),
|
|
||||||
'pwd'=>md5(123456),
|
|
||||||
'nickname'=>$wechatUser['nickname']?:'',
|
|
||||||
'avatar'=>$wechatUser['headimgurl']?:'',
|
|
||||||
'spread_uid'=>$spread_uid,
|
|
||||||
'uid'=>$wechatUser['uid'],
|
|
||||||
'user_type'=>'wechat'
|
|
||||||
]);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public static function updateWechatUser($wechatUser,$uid)
|
|
||||||
{
|
|
||||||
return self::edit([
|
|
||||||
'nickname'=>$wechatUser['nickname']?:'',
|
|
||||||
'avatar'=>$wechatUser['headimgurl']?:''
|
|
||||||
],$uid,'uid');
|
|
||||||
}
|
|
||||||
|
|
||||||
public static function setSpreadUid($uid,$spreadUid)
|
|
||||||
{
|
|
||||||
return self::where('uid',$uid)->update(['spread_uid'=>$spreadUid]);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public static function getUserInfo($uid)
|
|
||||||
{
|
|
||||||
$userInfo = self::where('uid',$uid)->find();
|
|
||||||
if(!$userInfo) exception('读取用户信息失败!');
|
|
||||||
return $userInfo->toArray();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获得当前登陆用户UID
|
|
||||||
* @return int $uid
|
|
||||||
*/
|
|
||||||
public static function getActiveUid()
|
|
||||||
{
|
|
||||||
$uid = null;
|
|
||||||
if(Session::has('loginUid','wap')) $uid = Session::get('loginUid','wap');
|
|
||||||
if(!$uid && Session::has('loginOpenid','wap') && ($openid = Session::get('loginOpenid','wap')))
|
|
||||||
$uid = WechatUser::openidToUid($openid);
|
|
||||||
if(!$uid) exit(exception('请登陆!'));
|
|
||||||
return $uid;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** //TODO 一级返佣
|
|
||||||
* @param $orderInfo
|
|
||||||
* @return bool
|
|
||||||
*/
|
|
||||||
public static function backOrderBrokerage($orderInfo)
|
|
||||||
{
|
|
||||||
$userInfo = User::getUserInfo($orderInfo['uid']);
|
|
||||||
if(!$userInfo || !$userInfo['spread_uid']) return true;
|
|
||||||
$storeBrokerageStatu = SystemConfigService::get('store_brokerage_statu') ? : 1;//获取后台分销类型
|
|
||||||
if($storeBrokerageStatu == 1){
|
|
||||||
if(!User::be(['uid'=>$userInfo['spread_uid'],'is_promoter'=>1])) return true;
|
|
||||||
}
|
|
||||||
$brokerageRatio = (SystemConfigService::get('store_brokerage_ratio') ?: 0)/100;
|
|
||||||
if($brokerageRatio <= 0) return true;
|
|
||||||
$cost = isset($orderInfo['cost']) ? $orderInfo['cost'] : 0;//成本价
|
|
||||||
if($cost > $orderInfo['pay_price']) return true;//成本价大于支付价格时直接返回
|
|
||||||
$brokeragePrice = bcmul(bcsub($orderInfo['pay_price'],$cost,2),$brokerageRatio,2);
|
|
||||||
if($brokeragePrice <= 0) return true;
|
|
||||||
$mark = $userInfo['nickname'].'成功消费'.floatval($orderInfo['pay_price']).'元,奖励推广佣金'.floatval($brokeragePrice);
|
|
||||||
self::beginTrans();
|
|
||||||
$res1 = UserBill::income('获得推广佣金',$userInfo['spread_uid'],'now_money','brokerage',$brokeragePrice,$orderInfo['id'],0,$mark);
|
|
||||||
$res2 = self::bcInc($userInfo['spread_uid'],'now_money',$brokeragePrice,'uid');
|
|
||||||
$res = $res1 && $res2;
|
|
||||||
self::checkTrans($res);
|
|
||||||
if($res) self::backOrderBrokerageTwo($orderInfo);
|
|
||||||
return $res;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* //TODO 二级推广
|
|
||||||
* @param $orderInfo
|
|
||||||
* @return bool
|
|
||||||
*/
|
|
||||||
public static function backOrderBrokerageTwo($orderInfo){
|
|
||||||
$userInfo = User::getUserInfo($orderInfo['uid']);
|
|
||||||
$userInfoTwo = User::getUserInfo($userInfo['spread_uid']);
|
|
||||||
if(!$userInfoTwo || !$userInfoTwo['spread_uid']) return true;
|
|
||||||
$storeBrokerageStatu = SystemConfigService::get('store_brokerage_statu') ? : 1;//获取后台分销类型
|
|
||||||
if($storeBrokerageStatu == 1){
|
|
||||||
if(!User::be(['uid'=>$userInfoTwo['spread_uid'],'is_promoter'=>1])) return true;
|
|
||||||
}
|
|
||||||
$brokerageRatio = (SystemConfigService::get('store_brokerage_two') ?: 0)/100;
|
|
||||||
if($brokerageRatio <= 0) return true;
|
|
||||||
$cost = isset($orderInfo['cost']) ? $orderInfo['cost'] : 0;//成本价
|
|
||||||
if($cost > $orderInfo['pay_price']) return true;//成本价大于支付价格时直接返回
|
|
||||||
$brokeragePrice = bcmul(bcsub($orderInfo['pay_price'],$cost,2),$brokerageRatio,2);
|
|
||||||
if($brokeragePrice <= 0) return true;
|
|
||||||
$mark = '二级推广人'.$userInfo['nickname'].'成功消费'.floatval($orderInfo['pay_price']).'元,奖励推广佣金'.floatval($brokeragePrice);
|
|
||||||
self::beginTrans();
|
|
||||||
$res1 = UserBill::income('获得推广佣金',$userInfoTwo['spread_uid'],'now_money','brokerage',$brokeragePrice,$orderInfo['id'],0,$mark);
|
|
||||||
$res2 = self::bcInc($userInfoTwo['spread_uid'],'now_money',$brokeragePrice,'uid');
|
|
||||||
$res = $res1 && $res2;
|
|
||||||
self::checkTrans($res);
|
|
||||||
return $res;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@ -65,13 +65,13 @@ class RoutineService{
|
|||||||
$array = self::xml($xml);//全要大写
|
$array = self::xml($xml);//全要大写
|
||||||
if($array['RETURN_CODE'] == 'SUCCESS' && $array['RESULT_CODE'] == 'SUCCESS'){
|
if($array['RETURN_CODE'] == 'SUCCESS' && $array['RESULT_CODE'] == 'SUCCESS'){
|
||||||
$time = time();
|
$time = time();
|
||||||
$tmp='';//临时数组用于签名
|
$tmp=array();//临时数组用于签名
|
||||||
$tmp['appId'] = $appid;
|
$tmp['appId'] = $appid;
|
||||||
$tmp['nonceStr'] = $nonce_str;
|
$tmp['nonceStr'] = $nonce_str;
|
||||||
$tmp['package'] = 'prepay_id='.$array['PREPAY_ID'];
|
$tmp['package'] = 'prepay_id='.$array['PREPAY_ID'];
|
||||||
$tmp['signType'] = 'MD5';
|
$tmp['signType'] = 'MD5';
|
||||||
$tmp['timeStamp'] = "$time";
|
$tmp['timeStamp'] = "$time";
|
||||||
|
$data=array();
|
||||||
$data['state'] = 1;
|
$data['state'] = 1;
|
||||||
$data['timeStamp'] = "$time";//时间戳
|
$data['timeStamp'] = "$time";//时间戳
|
||||||
$data['nonceStr'] = $nonce_str;//随机字符串
|
$data['nonceStr'] = $nonce_str;//随机字符串
|
||||||
@ -80,6 +80,7 @@ class RoutineService{
|
|||||||
$data['paySign'] = self::sign($tmp);//签名,具体签名方案参见微信公众号支付帮助文档;
|
$data['paySign'] = self::sign($tmp);//签名,具体签名方案参见微信公众号支付帮助文档;
|
||||||
$data['out_trade_no'] = $out_trade_no;
|
$data['out_trade_no'] = $out_trade_no;
|
||||||
}else{
|
}else{
|
||||||
|
$data=array();
|
||||||
$data['state'] = 0;
|
$data['state'] = 0;
|
||||||
$data['text'] = "错误";
|
$data['text'] = "错误";
|
||||||
$data['RETURN_CODE'] = $array['RETURN_CODE'];
|
$data['RETURN_CODE'] = $array['RETURN_CODE'];
|
||||||
|
|||||||
@ -630,7 +630,7 @@ CREATE TABLE `eb_store_product` (
|
|||||||
`id` mediumint(11) NOT NULL AUTO_INCREMENT COMMENT '商品id',
|
`id` mediumint(11) NOT NULL AUTO_INCREMENT COMMENT '商品id',
|
||||||
`mer_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '商户Id(0为总后台管理员创建,不为0的时候是商户后台创建)',
|
`mer_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '商户Id(0为总后台管理员创建,不为0的时候是商户后台创建)',
|
||||||
`image` varchar(128) NOT NULL COMMENT '商品图片',
|
`image` varchar(128) NOT NULL COMMENT '商品图片',
|
||||||
`slider_image` varchar(512) NOT NULL COMMENT '轮播图',
|
`slider_image` text NOT NULL COMMENT '轮播图',
|
||||||
`store_name` varchar(128) NOT NULL COMMENT '商品名称',
|
`store_name` varchar(128) NOT NULL COMMENT '商品名称',
|
||||||
`store_info` varchar(256) NOT NULL COMMENT '商品简介',
|
`store_info` varchar(256) NOT NULL COMMENT '商品简介',
|
||||||
`keyword` varchar(256) NOT NULL COMMENT '关键字',
|
`keyword` varchar(256) NOT NULL COMMENT '关键字',
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user