From 8788079dad1166c2c0473f7a29d04cab9181522b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=81=86=E5=90=AC?= Date: Wed, 28 Nov 2018 10:18:20 +0800 Subject: [PATCH 01/11] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20README.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 983f0631..1595d31f 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ ## 本项目还在不断开发完善中,如有建议或问题请[在这里提出](https://gitee.com/ZhongBangKeJi/CRMEB/issues) # 如果对您有帮助,您可以点右上角 "Star" 支持一下 谢谢! - +## :point_right: 小程序版:https://gitee.com/ZhongBangKeJi/CRMEB_WeChatMiniProgram ## [帮助文档](https://gitee.com/ZhongBangKeJi/CRMEB/wikis/) ## 项目介绍 From 5e23cd6e6d221ee27e7c99f9a77148b743c10b2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=81=86=E5=90=AC?= Date: Thu, 6 Dec 2018 22:10:26 +0800 Subject: [PATCH 02/11] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20README.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 1595d31f..a11aa47e 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@

-## 本项目还在不断开发完善中,如有建议或问题请[在这里提出](https://gitee.com/ZhongBangKeJi/CRMEB/issues) +## 本项目还在不断开发完善中,如有建议或问题请[官方论坛](http://bbs.crmeb.net) # 如果对您有帮助,您可以点右上角 "Star" 支持一下 谢谢! ## :point_right: 小程序版:https://gitee.com/ZhongBangKeJi/CRMEB_WeChatMiniProgram @@ -121,6 +121,8 @@ Git clone https://gitee.com/ZhongBangKeJi/CRMEB.git QQ群: 116279623 +官方论坛:http://bbs.crmeb.net + Gitee: https://gitee.com/ZhongBangKeJi/CRMEB/issues ## 特别鸣谢 From a4e9e58a140989daf94fbdb9f02860b43f0d7bb7 Mon Sep 17 00:00:00 2001 From: samoye <849688611@qq.com> Date: Fri, 7 Dec 2018 10:37:02 +0800 Subject: [PATCH 03/11] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=88=86=E9=94=80?= =?UTF-8?q?=E6=97=B6=E4=BA=8C=E7=BA=A7=E6=8E=A8=E5=B9=BF=E4=BA=BA=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E8=8E=B7=E5=BE=97=E5=A5=96=E5=8A=B1=E9=87=91=E9=97=AE?= =?UTF-8?q?=E9=A2=98=20=E6=BA=90=E4=BB=A3=E7=A0=81=E4=B8=AD=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E4=BA=8C=E7=BA=A7=E8=BF=94=E4=BD=A3=E6=AF=94=E4=BE=8B?= =?UTF-8?q?=E6=97=B6=E5=AD=97=E6=AE=B5=E5=90=8D=E4=B8=8E=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E5=AD=97=E6=AE=B5=E5=90=8D=E4=B8=8D=E7=AC=A6=E5=90=88?= =?UTF-8?q?=EF=BC=88=20store=5Fbrokerage=5Fratio=5Ftwo=EF=BC=89=EF=BC=8C?= =?UTF-8?q?=E8=87=B4=E4=BD=BF=E5=8F=96=E5=87=BA=E7=9A=84=E6=AF=94=E4=BE=8B?= =?UTF-8?q?=E4=B8=BA0,=E4=BA=8C=E7=BA=A7=E5=88=86=E9=94=80=E5=87=BD?= =?UTF-8?q?=E6=95=B0=E7=9B=B4=E6=8E=A5=E8=BF=94=E5=9B=9E=EF=BC=8C=E8=BF=9B?= =?UTF-8?q?=E8=80=8C=E5=AF=BC=E8=87=B4=E4=BA=86=E4=BA=8C=E7=BA=A7=E5=88=86?= =?UTF-8?q?=E9=94=80=E4=BA=BA=E6=97=A0=E6=B3=95=E5=BE=97=E5=88=B0=E4=BD=A3?= =?UTF-8?q?=E9=87=91=EF=BC=8C=E4=BF=AE=E6=94=B9=E5=AD=97=E6=AE=B5=E4=B8=BA?= =?UTF-8?q?=EF=BC=88store=5Fbrokerage=5Ftwo=EF=BC=89=EF=BC=8C=E4=B8=8E?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93=E5=AF=B9=E5=BA=94=E5=8D=B3=E5=8F=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- application/routine/model/user/User.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/application/routine/model/user/User.php b/application/routine/model/user/User.php index 8913faea..e339374e 100644 --- a/application/routine/model/user/User.php +++ b/application/routine/model/user/User.php @@ -131,7 +131,7 @@ class User extends ModelBasic if($storeBrokerageStatu == 1){ 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; $cost = isset($orderInfo['cost']) ? $orderInfo['cost'] : 0;//成本价 if($cost > $orderInfo['pay_price']) return true;//成本价大于支付价格时直接返回 From 9864878de11fd44f73f6565e6955ac51b46116a3 Mon Sep 17 00:00:00 2001 From: samoye <849688611@qq.com> Date: Fri, 7 Dec 2018 10:39:48 +0800 Subject: [PATCH 04/11] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=85=AC=E4=BC=97?= =?UTF-8?q?=E5=8F=B7=E6=97=A0=E6=B3=95=E4=BA=8C=E7=BA=A7=E5=88=86=E9=94=80?= =?UTF-8?q?=E9=97=AE=E9=A2=98=20=E5=85=AC=E4=BC=97=E5=8F=B7User=E6=A8=A1?= =?UTF-8?q?=E5=9E=8Bl=E7=BC=BA=E5=B0=91=E4=BA=86=E4=BA=8C=E7=BA=A7?= =?UTF-8?q?=E5=88=86=E9=94=80=E7=9A=84=E5=87=BD=E6=95=B0=EF=BC=8C=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E5=8D=B3=E5=8F=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- application/wap/model/user/User.php | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/application/wap/model/user/User.php b/application/wap/model/user/User.php index 04915ec8..19f0fef4 100644 --- a/application/wap/model/user/User.php +++ b/application/wap/model/user/User.php @@ -110,6 +110,29 @@ class User extends ModelBasic $res2 = self::bcInc($userInfo['spread_uid'],'now_money',$brokeragePrice,'uid'); $res = $res1 && $res2; self::checkTrans($res); + if(res) self::backOrderBrokerageTwo($orderInfo); + return $res; + } + 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_ratio_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; } From ae83bae74c6f8f33a156ca7b50da192bdc0957f1 Mon Sep 17 00:00:00 2001 From: samoye <849688611@qq.com> Date: Fri, 7 Dec 2018 10:47:10 +0800 Subject: [PATCH 05/11] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B8=8B=E5=8D=95?= =?UTF-8?q?=E6=97=B6=E6=8A=A5=E5=87=BA=E7=9A=84illegal=20offset=E9=94=99?= =?UTF-8?q?=E8=AF=AF=20=E7=94=A8=E4=BA=8E=E5=AD=98=E6=94=BE=E7=AD=BE?= =?UTF-8?q?=E5=90=8D=E7=9A=84=E4=B8=B4=E6=97=B6=E6=95=B0=E7=BB=84$tem?= =?UTF-8?q?=E4=B8=8E=E8=BF=94=E5=9B=9E=E7=9A=84$data=E5=BA=94=E5=88=9D?= =?UTF-8?q?=E5=A7=8B=E5=8C=96=E4=B8=BAarray=E8=80=8C=E4=B8=8D=E5=BA=94?= =?UTF-8?q?=E8=AF=A5=E4=B8=BA=E7=A9=BA=E5=AD=97=E7=AC=A6=E4=B8=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- extend/service/RoutineService.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/extend/service/RoutineService.php b/extend/service/RoutineService.php index 0896c231..1285691b 100644 --- a/extend/service/RoutineService.php +++ b/extend/service/RoutineService.php @@ -65,13 +65,13 @@ class RoutineService{ $array = self::xml($xml);//全要大写 if($array['RETURN_CODE'] == 'SUCCESS' && $array['RESULT_CODE'] == 'SUCCESS'){ $time = time(); - $tmp='';//临时数组用于签名 + $tmp=array();//临时数组用于签名 $tmp['appId'] = $appid; $tmp['nonceStr'] = $nonce_str; $tmp['package'] = 'prepay_id='.$array['PREPAY_ID']; $tmp['signType'] = 'MD5'; $tmp['timeStamp'] = "$time"; - + $data=array(); $data['state'] = 1; $data['timeStamp'] = "$time";//时间戳 $data['nonceStr'] = $nonce_str;//随机字符串 @@ -80,6 +80,7 @@ class RoutineService{ $data['paySign'] = self::sign($tmp);//签名,具体签名方案参见微信公众号支付帮助文档; $data['out_trade_no'] = $out_trade_no; }else{ + $data=array(); $data['state'] = 0; $data['text'] = "错误"; $data['RETURN_CODE'] = $array['RETURN_CODE']; From 5b52a0aa7763a0c2ced149288ff07732e7e517db Mon Sep 17 00:00:00 2001 From: samoye <849688611@qq.com> Date: Fri, 7 Dec 2018 11:33:53 +0800 Subject: [PATCH 06/11] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20crmeb.sql=E4=B8=AD?= =?UTF-8?q?=E7=9A=84eb=5Fstore=5Fproduct=E8=A1=A8=E4=B8=ADslider=5Fimage?= =?UTF-8?q?=E7=9A=84=E7=B1=BB=E5=9E=8B=EF=BC=8C=E8=BF=9B=E8=80=8C=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E4=BA=86=E4=B8=8A=E4=BC=A0=E5=95=86=E5=93=81=E5=A4=9A?= =?UTF-8?q?=E5=BC=A0=E8=BD=AE=E6=92=AD=E5=9B=BE=E5=90=8E=E7=BC=96=E8=BE=91?= =?UTF-8?q?=E6=8A=A5=E9=94=99=20=E5=8E=9F=E6=9C=89eb=5Fstore=5Fproduct?= =?UTF-8?q?=E8=A1=A8=E4=B8=ADslider=5Fimage=E7=9A=84=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E4=B8=BAvarchar(512)=EF=BC=8C=E5=AF=BC=E8=87=B4=E4=B8=8A?= =?UTF-8?q?=E4=BC=A0=E5=A4=9A=E5=BC=A0=E8=BD=AE=E6=92=AD=E5=9B=BE=E5=90=8E?= =?UTF-8?q?=EF=BC=8C=E5=86=85=E5=AE=B9=E9=95=BF=E5=BA=A6=E8=B6=85=E8=BF=87?= =?UTF-8?q?=E4=BA=86512=EF=BC=8C=E4=BD=BF=E5=BE=97=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E5=86=85=E5=AE=B9=E8=A2=AB=E6=88=AA=E5=8F=96=EF=BC=8C=E8=87=B4?= =?UTF-8?q?=E4=BD=BF=E5=9C=A8=E4=B8=8A=E4=BC=A0=E5=A4=9A=E5=BC=A0=E8=BD=AE?= =?UTF-8?q?=E6=92=AD=E5=9B=BE=E5=90=8E=E5=86=8D=E7=82=B9=E5=87=BB=E7=BC=96?= =?UTF-8?q?=E8=BE=91=E5=95=86=E5=93=81=E6=8A=A5=E9=94=99=EF=BC=88=E5=8E=9F?= =?UTF-8?q?=E5=9B=A0=E6=98=AF=E5=9B=A0=E4=B8=BAjson=5Fdecode=E7=9A=84?= =?UTF-8?q?=E7=BB=93=E6=9E=9C=E4=B8=BAnull=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/install/crmeb.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/install/crmeb.sql b/public/install/crmeb.sql index f6fe11fa..64c87c87 100644 --- a/public/install/crmeb.sql +++ b/public/install/crmeb.sql @@ -614,7 +614,7 @@ CREATE TABLE `eb_store_product` ( `id` mediumint(11) NOT NULL AUTO_INCREMENT COMMENT '商品id', `mer_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '商户Id(0为总后台管理员创建,不为0的时候是商户后台创建)', `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_info` varchar(256) NOT NULL COMMENT '商品简介', `keyword` varchar(256) NOT NULL COMMENT '关键字', From 304af615e7bc90e62db2b7b86e729bf7cc67143d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=81=86=E5=90=AC?= Date: Fri, 14 Dec 2018 15:12:54 +0800 Subject: [PATCH 07/11] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20README.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index a11aa47e..f4b7fb42 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,6 @@ +

+ +

CRMEB客户管理+电商管理系统

From a940d5854cdd47eb68832f8adfa6c60481b7404d Mon Sep 17 00:00:00 2001 From: Stone Bai Date: Mon, 17 Dec 2018 21:52:02 +0800 Subject: [PATCH 08/11] =?UTF-8?q?=E5=88=86=E4=BA=AB=E6=97=B6=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E4=BA=A7=E5=93=81=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- view/crmebN/pages/product-con/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/view/crmebN/pages/product-con/index.js b/view/crmebN/pages/product-con/index.js index e487254c..61a07cdc 100644 --- a/view/crmebN/pages/product-con/index.js +++ b/view/crmebN/pages/product-con/index.js @@ -875,7 +875,7 @@ Page({ onShareAppMessage: function () { var that = this; return { - title: '小程序', + title: that.data.productSelect.store_name, path: app.globalData.openPages, // imageUrl: that.data.url + that.data.product.image, success: function () { From 2b670b7731758687e2c9f1ab76284d4a57bb9f84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=81=86=E5=90=AC?= Date: Mon, 17 Dec 2018 23:49:55 +0800 Subject: [PATCH 09/11] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20README.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f4b7fb42..4cdf71f3 100644 --- a/README.md +++ b/README.md @@ -131,6 +131,9 @@ Gitee: https://gitee.com/ZhongBangKeJi/CRMEB/issues ## 特别鸣谢 感谢以下的项目,排名不分先后 +form-builder : https://github.com/xaboy/form-builder +(本项目开发的核心技术) + ThinkPHP:http://www.thinkphp.cn Bootstrap:http://getbootstrap.com @@ -139,8 +142,6 @@ jQuery:http://jquery.com iView:https://www.iviewui.com -form-builder : https://github.com/xaboy/form-builder(也是参与本项目开发的技术) - Vue:https://cn.vuejs.org/ font-awesome: https://fontawesome.com/?from=io From cf2806d464af6c14eb1b6a8e35ed9e677e7518a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=81=86=E5=90=AC?= Date: Wed, 19 Dec 2018 11:34:51 +0800 Subject: [PATCH 10/11] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20README.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 4cdf71f3..3ac0945c 100644 --- a/README.md +++ b/README.md @@ -128,12 +128,25 @@ QQ群: 116279623 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 + ## 特别鸣谢 感谢以下的项目,排名不分先后 -form-builder : https://github.com/xaboy/form-builder -(本项目开发的核心技术) - ThinkPHP:http://www.thinkphp.cn Bootstrap:http://getbootstrap.com From d721ed5c6c74853d95e33e0257b6f28ab954b5ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=81=86=E5=90=AC?= Date: Mon, 24 Dec 2018 14:44:46 +0800 Subject: [PATCH 11/11] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20README.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 3ac0945c..d7451052 100644 --- a/README.md +++ b/README.md @@ -64,15 +64,17 @@ 5.订单:能够完成用户的订单管理(发货、订单详情、修改订单、订单备注、订单记录、订单退款) 、售后服务 (评论的回复与删除) 6.分销:后台有分销统计管理,分销可以设置人人分销和指定人分销,也可以自己稍微开发一下修改规则,例如下单后成为分销等 + + 7.数据统计图表统计分析(财务统计、产品统计、会员统计、营销统计、分销统计、交易统计等) - 7.设置:能够完成管理员对网站的商品资料(添加大类、添加小类、商品添加、属性快速生成、商品审查)、商品交易(外理订单、发 + 8.设置:能够完成管理员对网站的商品资料(添加大类、添加小类、商品添加、属性快速生成、商品审查)、商品交易(外理订单、发 货查询)、会员管理(会员审查)、操作管理(管理员添加、管理员审查、管理员退出)、系统配置、后台通知等功能 - 8.内容:管理文章分类 (添加分类、删除分类、修改分类) 、 管理文章 + 9.内容:管理文章分类 (添加分类、删除分类、修改分类) 、 管理文章 - 9.维护:查看系统日志、文件变动效验、刷新网站缓存、在线更新系统、清除数据等功能 + 10.维护:查看系统日志、文件变动效验、刷新网站缓存、在线更新系统、清除数据、文件管理等功能 - 10.强大的权限管理系统 + 11.强大的权限管理系统 ## 演示地址 演示站后台:[ crmeb_v2.5 ] @@ -93,10 +95,6 @@ CRMEB微信小程序v2.5版:除了以上功能还带砍价、拼团功能 CRMEB微信公众号小程序打通v2.5版:除了以上功能还带砍价、拼团功能 需要申请微信开放平台 -CRMEB微信公众号v2.0版:除了以上功能还带拼团功能 - -CRMEB微信小程序v2.0版:除了以上功能还带砍价、拼团功能 - 还有定制开发服务,例如:预约系统、O2O、付费阅读、多店版、多商家版 ### 详情[ 进入淘宝 ]