牟新芬 4 years ago
parent
commit
31a1d2387f

+ 15 - 0
app/api/controller/v1/Index.php

@@ -23,6 +23,20 @@ class Index extends BaseController
         return app('json')->success($menus);
     }
 
+    /**
+     * 获取产品标签
+     */
+    public function getKeyword($cid){
+        $data = Product::where('is_del', 0)->where('is_show', 1)->where('cate_id',$cid)->where('keyword','<>',"")->group('keyword')->column('keyword');
+        $keyword = [];
+        foreach ($data as $k => $v) {
+            $arr = explode('、',$v);
+            $keyword = array_merge($keyword, $arr);
+        }
+        $keyword = array_unique($keyword);
+        return app('json')->success($keyword);
+    }
+
     /**
      * 获取产品列表
      */
@@ -30,6 +44,7 @@ class Index extends BaseController
         $data = UtilService::getMore([
             ['cid', 0],
             ['sort', ''],
+            ['keyword', ''],
             ['page', 1],
             ['limit', 24]
         ], $request);

+ 85 - 171
app/api/controller/v1/Login.php

@@ -1,37 +1,19 @@
 <?php
-// +----------------------------------------------------------------------
-// | [ WE CAN DO IT MORE SIMPLE  ]
-// +----------------------------------------------------------------------
-// | Copyright (c) 2018-2020 rights reserved.
-// +----------------------------------------------------------------------
-// | Author: TABLE ME
-// +----------------------------------------------------------------------
-// | Date: 2020-08-25 17:23
-// +----------------------------------------------------------------------
-declare (strict_types = 1);
 namespace app\api\controller\v1;
 
 use app\BaseController;
 use app\model\api\Member;
-use app\model\Api\SiteProduct;
 use app\model\api\SmsYzm;
 use app\Request;
 use library\services\UtilService;
-use library\utils\AdvertUtils;
-use library\utils\Icon;
 use library\utils\Sms;
 use think\facade\Db;
 
 class Login extends BaseController
 {
 
-    public function aaa(){
-        $icon = new Icon;
-        $icon->mkIcon(app()->getRootPath().'public/1.png');
-    }
-
     /**
-     * 登录中心
+     * 登录
      * @param Request $request
      */
     public function l(Request $request) {
@@ -69,7 +51,54 @@ class Login extends BaseController
     }
 
     /**
-     * 注册1号
+     * 获取验证码
+     * @param Request $request
+     */
+    public function yzm(Request $request) {
+        [$mobile,$time,$token]  = UtilService::getMore([
+            ['mobile','','empty','请输入手机号码'],
+            ['time',''],
+            ['token','']
+        ],$request,true);
+        $outStr = @crypto_decrypt(base64_decode($token), 'xxlm');
+        if($mobile != $outStr) {
+            return app('json')->fail("获取验证码失败!");
+        }
+        $lastTime = 120;
+        $time     = time();
+        $smsTime = (new SmsYzm)->where('mobile',$mobile)
+            ->where("action","yzm")
+            ->order("time desc")
+            ->value("time");
+        //验证码
+        if (!empty($smsTime) && abs($time - $smsTime) < $lastTime) {
+            $data['status'] = 2;
+            $data['time']   = $time - $smsTime;
+            return app('json')->success($data);
+        }
+        //发送验证码
+        $code = randString(6, true);
+        $send = (new Sms)->SmsCode($mobile, "718562", array("1" => $code,"2"=>"30"));
+
+        if ($send['status'] == 1) {
+            $savedata['mobile'] = $mobile;
+            $savedata['code'] = $code;
+            $savedata['action'] = 'yzm';
+            $savedata['time'] = time();
+            (new SmsYzm)->insert($savedata);
+            $data['status'] = 1;
+        } else {
+            $data = $send;
+        }
+        if($data['status'] == 1) {
+            return app('json')->success("发送成功", ['status'=>1,'time'=>$lastTime]);
+        } else {
+            return app('json')->fail($data['error']);
+        }
+    }
+
+    /**
+     * 注册第一步
      * @param Request $request
      */
     public function reg1(Request $request) {
@@ -78,190 +107,77 @@ class Login extends BaseController
             ['yzm','']
         ],$request,true);
         //判断验证码
-        $bool = (new SmsYzm)->VerCode($mobile,$yzm,'yzm',$request->site['sassid']);
+        $bool = (new SmsYzm)->VerCode($mobile,$yzm,'yzm');
         if(!$bool) {
             return app('json')->fail(SmsYzm::getErrorInfo("验证码错误"));
         }
         //判断是否被注册了
-        $count = (new Member)->where('mobile',$mobile)->where('sassid',$request->site['sassid'])->count();
+        $count = (new Member)->where('mobile',$mobile)->count();
         if($count > 0) {
             return app('json')->fail("用户已经被注册,请勿重复操作!");
         }
          //生成MD5
-        $param = ['mobile'=>$mobile,'sassid'=>$request->site['sassid'],'time'=>time()];
-        $secret_key = $request->site['secret_key'];
-        $token =base64_encode( @crypto_encrypt(json_encode($param), $secret_key));
+        $param = ['mobile'=>$mobile,'time'=>time()];
+        $token =base64_encode( @crypto_encrypt(json_encode($param), 'xxlm'));
         return app('json')->success([
             'token' => $token
         ]);
     }
 
-
     /**
-     * 注册2
+     * 注册第二步
      * @param Request $request
      */
     public function reg2(Request $request) {
         $post  = UtilService::getMore([
-            ['token','','empty','参数错误'],
+            ['mobile',''],
+            ['wechat',''],
+            ['shopname',''],
+            ['platform',''],
             ['password','','empty','请输入正确的密码'],
-            ['nickname',''],
-            ['avatar',''],
-            ['tjUid',''],
-            ['weixin_name','']
+            ['tjUid','']
         ],$request);
 
         $time = time();
-        $secret_key = $request->site['secret_key'];
-        $tokenData = @json_decode(@crypto_decrypt(base64_decode($post['token']), $secret_key),true);
+        /*$tokenData = @json_decode(@crypto_decrypt(base64_decode($post['token']), 'xxlm'),true);
         //注册token大于30分钟或者超过30分钟
-        if(empty($tokenData) ||  ($time - $tokenData['time']) > 30 * 60){
-            return app('json')->fail("注册过期,请重新注册");
-        }
+        if(empty($tokenData) || ($time - $tokenData['time']) > 30 * 60){
+            return app('json')->fail("验证过期,请重新注册");
+        }*/
 
         //判断是否被注册了
-        $count = (new Member)->where('mobile',$tokenData['mobile'])->where('sassid',$request->site['sassid'])->count();
+        $count = (new Member)->where('mobile',$post['mobile'])->count();
         if($count > 0) {
             return app('json')->fail("用户已经被注册!");
         }
         //推荐码
         if(!empty($post['tjUid'])){
-            $tjuid =  crypto_decrypt(base64_decode($post['tjUid']),$request->site['secret_key']);
+            $tjuid =  crypto_decrypt(base64_decode($post['tjUid']),'xxlm');
             $save['i_uid'] = $tjuid;
         }
-        $save['mobile'] = $tokenData['mobile'];
-        $save['username'] = '';
+        $save['mobile'] = $post['mobile'];
+        $save['wechat'] = $post['wechat'];
+        $save['shopname'] = $post['shopname'];
+        $save['platform'] = $post['platform'];
         $save['password'] = md5($post['password']);
-        $save['nickname'] = $post['nickname'];
-        $save['name'] = '';
-        $save['avatar'] = $post['avatar'];
         $save['regip'] = $request->ip();
         $save['regtime'] = $time;
         $save['lasttime'] = $time;
-        $save['sassid'] = $request->site['sassid'];
-        $save['weixin_name'] = $post['weixin_name'];
         $save['status'] = 1;
         $uid = (new Member)->insertGetId($save);
-        $meberInfo = Member::where('uid',$uid)->find();
+        $memberInfo = Member::where('uid',$uid)->find();
         //生成令牌
-        $token = Member::createToken($meberInfo, $request->site['secret_key']);
+        $token = Member::createToken($memberInfo, 'xxlm');
         return app('json')->success([
             'token' => $token,
             'user_info' => [
-                'mobile'      => $meberInfo->getData('mobile'),
-                'name'      => $meberInfo->getData('name'),
-                'avatar'    => $meberInfo->getData('avatar'),
-                'money'     => $meberInfo->getData('money')
-            ],
-        ]);
-    }
-
-
-    public function mreg(Request $request) {
-        $post  = UtilService::getMore([
-            ['mobile','','empty','请输入正确的手机号码'],
-            ['code','','empty','请输入正确的验证码'],
-            ['passWord','','empty','请输入正确的密码'],
-            ['tjUid',''],
-            ['weixin','']
-        ],$request);
-
-
-        //判断验证码
-        $bool = (new SmsYzm)->VerCode($post['mobile'],$post['code'],'yzm',$request->site['sassid']);
-        if(!$bool) {
-            return app('json')->fail(SmsYzm::getErrorInfo("验证码错误"));
-        }
-        //判断是否被注册了
-        $count = (new Member)
-                        ->where('mobile',$post['mobile'])
-                        ->where('sassid',$request->site['sassid'])
-                        ->count();
-        if($count > 0) {
-            return app('json')->fail("用户已经被注册,请勿重复操作!");
-        }
-        //推荐码
-        if(!empty($post['tjUid'])){
-            $tjuid =  crypto_decrypt(base64_decode($post['tjUid']),$request->site['secret_key']);
-            $save['i_uid'] = $tjuid;
-        }
-        $time = time();
-        $save['mobile'] = $post['mobile'];
-        $save['username'] = '';
-        $save['password'] = md5($post['passWord']);
-        $save['nickname'] = '';
-        $save['name'] = '';
-        $save['avatar'] = '';
-        $save['regip'] = $request->ip();
-        $save['regtime'] = $time;
-        $save['lasttime'] = $time;
-        $save['sassid'] = $request->site['sassid'];
-        $save['weixin_name'] = $post['weixin_name'];
-        $save['status'] = 1;
-        $uid = (new Member)->insertGetId($save);
-        $meberInfo = Member::where('uid',$uid)->find();
-        //生成令牌
-        $token = Member::createToken($meberInfo, $request->site['secret_key']);
-        return app('json')->success([
-            'user_info' => [
-                'mobile'      => $meberInfo->getData('mobile'),
-                'name'      => $meberInfo->getData('name'),
-                'avatar'    => $meberInfo->getData('avatar'),
-                'money'     => $meberInfo->getData('money')
+                'mobile'      => $memberInfo->getData('mobile'),
+                'wechat'      => $memberInfo->getData('wechat'),
+                'money'     => $memberInfo->getData('money')
             ],
         ]);
     }
 
-
-    /**
-     * 获取验证码
-     * @param Request $request
-     */
-    public function yzm(Request $request) {
-        [$mobile,$time,$token]  = UtilService::getMore([
-            ['mobile','','empty','请输入手机号码'],
-            ['time',''],
-            ['token','']
-        ],$request,true);
-        $secret_key = $request->site['secret_key'];
-        $outStr = @crypto_decrypt(base64_decode($token), $secret_key);
-        if($mobile != $outStr) {
-            return app('json')->fail("获取验证码失败!");
-        }
-        $lastTime = 120;//
-        $time     = time();
-        $smsTime = (new SmsYzm)->where('mobile',$mobile)
-                                ->where("action","yzm")
-                                ->order("time desc")
-                                ->value("time");
-        //验证码
-        if (!empty($smsTime) && abs($time - $smsTime) < $lastTime) {
-            $data['status'] = 2;
-            $data['time']   = $time - $smsTime;
-            return app('json')->success($data);
-        }
-        //发送验证码
-        $code = randString(6, true);
-        $send = (new Sms)->SmsCode($mobile, "718562",$request->site['sassid'], array("1" => $code,"2"=>"30"));
-
-        if ($send['status'] == 1) {
-            $savedata['mobile'] = $mobile;
-            $savedata['code'] = $code;
-            $savedata['action'] = 'yzm';
-            $savedata['time'] = time();
-            $savedata['sassid'] = $request->site['sassid'];
-            (new SmsYzm)->insert($savedata);
-            $data['status'] = 1;
-        } else {
-            $data = $send;
-        }
-        if($data['status'] == 1) {
-            return app('json')->success("发送成功", ['status'=>1,'time'=>$lastTime]);
-        } else {
-            return app('json')->fail($data['error']);
-        }
-    }
-
     /**
      * 忘记密码验证码
      * @param Request $request
@@ -277,12 +193,12 @@ class Login extends BaseController
         if($mobile != $outStr) {
             return app('json')->fail("获取验证码失败!");
         }
-        //count
-        $count = (new Member)->where('mobile',$mobile)->where('sassid',$request->site['sassid'])->count();
+
+        $count = (new Member)->where('mobile',$mobile)->count();
         if($count <= 0) {
             return app('json')->fail("账号未注册!");
         }
-        $lastTime = 120;//
+        $lastTime = 120;
         $time     = time();
         $smsTime = (new SmsYzm)->where('mobile',$mobile)
             ->where("action","forget_yzm")
@@ -296,14 +212,13 @@ class Login extends BaseController
         }
         //发送验证码
         $code = randString(6, true);
-        $send = (new Sms)->SmsCode($mobile, "718570",$request->site['sassid'], array("1" => $code));
+        $send = (new Sms)->SmsCode($mobile, "718570", array("1" => $code));
 
         if ($send['status'] == 1) {
             $savedata['mobile'] = $mobile;
             $savedata['code'] = $code;
             $savedata['action'] = 'forget_yzm';
             $savedata['time'] = time();
-            $savedata['sassid'] = $request->site['sassid'];
             (new SmsYzm)->insert($savedata);
             $data['status'] = 1;
         } else {
@@ -317,7 +232,7 @@ class Login extends BaseController
     }
 
     /**
-     * 账号找回第一
+     * 重置密码第一步
      * @param Request $request
      */
     public function forget1(Request $request) {
@@ -326,26 +241,25 @@ class Login extends BaseController
             ['yzm','']
         ],$request,true);
         //判断验证码
-        $bool = (new SmsYzm)->VerCode($mobile,$yzm,'forget_yzm',$request->site['sassid']);
+        $bool = (new SmsYzm)->VerCode($mobile,$yzm,'forget_yzm');
         if(!$bool) {
             return app('json')->fail(SmsYzm::getErrorInfo("验证码错误"));
         }
         //判断是否被注册了
-        $count = (new Member)->where('mobile',$mobile)->where('sassid',$request->site['sassid'])->count();
+        $count = (new Member)->where('mobile',$mobile)->count();
         if($count <= 0) {
             return app('json')->fail("找不到账号!");
         }
         //生成MD5
-        $param = ['mobile'=>$mobile,'sassid'=>$request->site['sassid'],'time'=>time()];
-        $secret_key = $request->site['secret_key'];
-        $token =base64_encode( @crypto_encrypt(json_encode($param), $secret_key));
+        $param = ['mobile'=>$mobile,'time'=>time()];
+        $token =base64_encode( @crypto_encrypt(json_encode($param), 'xxlm'));
         return app('json')->success([
             'token' => $token
         ]);
     }
 
     /**
-     * 账号找回第二
+     * 重置密码第二步
      * @param Request $request
      */
     public function forget2(Request $request) {
@@ -361,7 +275,7 @@ class Login extends BaseController
             return app('json')->fail("操作已过期,返回重新操作");
         }
         //判断是否被注册了
-        $data = (new Member)->where('mobile',$tokenData['mobile'])->where('sassid',$request->site['sassid'])->find();
+        $data = (new Member)->where('mobile',$tokenData['mobile'])->find();
         if(empty($data)) {
             return app('json')->fail("找不到账号!");
         }

+ 2 - 0
app/api/route/index.php

@@ -10,6 +10,8 @@ use think\facade\Route;
 Route::group('index',function () {
     //产品分类
     Route::rule('getCategory', 'v1.index/getCategory');
+    //产品标签
+    Route::get('getKeyword/:cid', 'v1.index/getKeyword');
     //产品列表
     Route::rule('productList', 'v1.index/productList');
     //产品详情

+ 23 - 5
app/model/api/Product.php

@@ -15,19 +15,37 @@ class Product extends Model
     public static function getProductList($data)
     {
         $cid = $data['cid'];
+        $keyword = $data['keyword'];
         $page = $data['page'];
         $limit = $data['limit'];
+        $model = self::where('is_del', 0)->where('is_show', 1);
+        if($keyword != ''){
+            $model->where('store_name|keyword', 'LIKE', "%$keyword%");
+        }
         if($cid){
-            $model = self::where('cate_id', $cid);
+            if($cid == -1){
+                $model->where('issuing', 1);
+            }else if($cid == -2){
+                $model->where('is_leftover', 1);
+            }else{
+                $model->where('cate_id', $cid);
+            }
+            if($data['sort'] == 'sort'){
+                $model->order('sort DESC, add_time DESC');
+            }
         }else{
-            $model = self::where('is_best', 1);
+            if($data['sort'] == 'sort'){
+                $model->where('is_best', 1)->order('sort DESC, add_time DESC');
+            }
         }
         if($data['sort'] == 'sales'){
             $model->orderRaw('sales+ficti desc');
-        }else if($data['sort'] == 'commission'){
+        }
+        if($data['sort'] == 'commission'){
             $model->orderRaw('price-ot_price desc');
-        }else{
-            $model->order('sort DESC, add_time DESC');
+        }
+        if($data['sort'] == 'new'){
+            $model->order('add_time DESC');
         }
         $list = $model->page((int)$page, (int)$limit)->field('id,store_name,image,price,cost,ot_price,(price-ot_price) as commission,IFNULL(sales,0) + IFNULL(ficti,0) as sales')->select();
         $list = count($list) ? $list->toArray() : [];

+ 1 - 2
app/model/api/SmsYzm.php

@@ -19,11 +19,10 @@ class SmsYzm extends BaseModel
      * @param $active
      * @param $sassid
      */
-    public function VerCode($mobile,$yzm,$active,$sassid) {
+    public function VerCode($mobile,$yzm,$active) {
         $time = time();
         $smsCode = $this->where("mobile",$mobile)
             ->where("action",$active)
-            ->where('sassid',$sassid)
             ->where("status",0)
             ->order("time","desc")
             ->find();

+ 2 - 0
app/model/system/Category.php

@@ -103,6 +103,8 @@ class Category extends BaseModel
             $resChild = self::getTree($data, $navItem['id']);
             if (null != $resChild) {
                 $childs[$key]['children'] = $resChild;
+            }else{
+                $childs[$key]['children'] = [];
             }
         }
         return $childs;

+ 1 - 0
app/model/system/Merchant.php

@@ -55,6 +55,7 @@ class Merchant extends BaseModel
         $model = $model->alias('c');
         $model = $model->field('c.*');
         if (isset($where['name']) && $where['name'] != '') $model = $model->where('c.id|c.name', 'LIKE', "%$where[name]%");
+        if (isset($where['main']) && $where['main'] != '') $model = $model->where('c.main', $where['main']);
         return $model->order('c.id desc')->where('c.is_del', 0);
     }
 

+ 2 - 1
app/model/system/Product.php

@@ -37,7 +37,8 @@ class Product extends BaseModel
         $model = (new Product)->getWhere($where)->field([
             '*',
             '(SELECT SUM(stock) FROM table_product_attr_value WHERE product_id = table_product.id AND type = 0) as stock',
-            '(SELECT SUM(sales) FROM table_product_attr_value WHERE product_id = table_product.id AND type = 0) as sales'
+            '(SELECT SUM(sales) FROM table_product_attr_value WHERE product_id = table_product.id AND type = 0) as sales',
+            '(SELECT stars FROM table_product_score WHERE product_id = table_product.id) as stars'
         ]);
         $model = $model->page((int)$where['page'], (int)$where['limit']);
         $data = ($data = $model->select()) && count($data) ? $data->toArray() : [];

+ 2 - 1
app/system/controller/v1/Merchant.php

@@ -24,7 +24,8 @@ class Merchant extends BaseController
         $where = UtilService::getMore([
             ['page', 1],
             ['limit', 20],
-            ['name', '']
+            ['name', ''],
+            ['main', '']
         ]);
         $list = MerchantModel::systemPage($where);
         return app('json')->success($list);

+ 39 - 1
app/system/controller/v1/Product.php

@@ -10,6 +10,7 @@ use app\model\system\ProductAttrResult;
 use app\model\system\Product as ProductModel;
 use app\model\system\Category;
 use library\services\UtilService;
+use think\facade\Db;
 
 class Product extends BaseController
 {
@@ -239,8 +240,9 @@ class Product extends BaseController
             ['sales', 0],
             ['sort', 0],
             ['is_show', 0],
-            ['issuing', 0],
             ['packet', 0],
+            ['issuing', 0],
+            ['is_leftover', 0],
             ['is_hot', 0],
             ['is_best', 0],
             ['is_sub', 0],
@@ -382,5 +384,41 @@ class Product extends BaseController
         }
     }
 
+    /**
+     * 产品信息
+     */
+    public function product_info($id)
+    {
+        $info = ProductModel::where('id', $id)->field('id,image,price,ot_price,cost')->find()->toArray();
+        $score = Db::name("product_score")->where('product_id', $id)->find();
+        if($score){
+            $info['attribute'] = json_decode($score['attribute'], true);
+            $info['stars'] = $score['stars'];
+        }
+        return app('json')->success($info);
+    }
+
+    /**
+     * 产品评分
+     */
+    public function score()
+    {
+        $data = UtilService::getMore([
+            'product_id',
+            ['attribute', []],
+            'stars'
+        ]);
+        $data["attribute"] = json_encode($data["attribute"]);
+        $score = Db::name("product_score")->where('product_id', $data['product_id'])->find();
+        if($score){
+            $res = Db::name("product_score")->where('product_id', $data['product_id'])->update($data);
+        }else{
+            $res = Db::name("product_score")->insert($data);
+        }
+        if ($res)
+            return app('json')->success('产品评分成功');
+        else
+            return app('json')->fail('产品评分失败');
+    }
 
 }

+ 4 - 0
app/system/route/product.php

@@ -29,6 +29,10 @@ Route::group('product', function () {
     Route::rule('set_show/:id/:is_show', 'v1.Product/set_show');
     //设置批量商品上架
     Route::rule('product_show', 'v1.Product/product_show');
+    //产品信息
+    Route::rule('product_info/:id', 'v1.Product/product_info');
+    //产品评分
+    Route::rule('score', 'v1.Product/score');
 
 })->middleware([
     \app\system\middleware\AllowOriginMiddleware::class,

+ 4 - 14
library/utils/Sms.php

@@ -3,8 +3,6 @@
 declare (strict_types = 1);
 namespace library\utils;
 
-
-use library\utils\Sms\AliSms;
 use library\utils\Sms\TencentSms;
 
 class Sms {
@@ -13,12 +11,11 @@ class Sms {
      * 发送模板短信【前台使用】
      * @param $tel
      * @param $code
-     * @param $sassid
      * @param array $array
      * @return mixed
      */
-   public function SmsCode($tel, $code,$sassid, $array = array()) {
-        $data = $this->SmsSendTpl($tel, $code,$sassid, $array);
+    public function SmsCode($tel, $code, $array = array()) {
+        $data = $this->SmsSendTpl($tel, $code, $array);
         if ($data['Code'] == 'OK') {
             $r['status'] = 1;
             $r['error'] = 'ok';
@@ -29,24 +26,17 @@ class Sms {
         return $r;
     }
 
-
     /**
      * 发送模板的数据
      * @param $tel 手机号码
      * @param $code code
-     * @param $sassid
      * @param array $array
      * @return mixed|null
      */
-    function SmsSendTpl($tel, $code,$sassid, $array = array()) {
-       // $aliSms = new AliSms;
-      //  $r = $aliSms->SmsSendTmplete($tel,$code,$sassid,$array);
+    function SmsSendTpl($tel, $code, $array = array()) {
         $tencent = new TencentSms();
-        $r = $tencent->SmsSendTmplete($tel,$code,$sassid,$array);
+        $r = $tencent->SmsSendTmplete($tel,$code,$array);
         return $r;
     }
 
-
-
-
 }

+ 2 - 3
library/utils/Sms/TencentSms.php

@@ -38,7 +38,7 @@ class TencentSms {
      * @param type $tpl
      * @param type $code
      */
-    function SmsSendTmplete($tel, $code,$sassid, $array = []) {
+    function SmsSendTmplete($tel, $code, $array = []) {
         $sData = SmsTpl::where("code",$code)->find();
         $r = false;
         $error = '';
@@ -54,7 +54,6 @@ class TencentSms {
             $datax['content'] = $this->SmsTplParm($sData['content'], $array);
             $datax['time'] = time();
             $datax['code'] = $code;
-            $datax['sassid'] = $sassid;
             if ($r) {
                 $datax['is_success'] = 1;
             } else {
@@ -133,4 +132,4 @@ class TencentSms {
     }
 
 
-}
+}