<?php namespace app\api\controller; use app\api\model\Tax; use app\api\model\UserAddress; use app\api\model\UserCoupon; use app\common\controller\Api; use EasyWeChat\Factory; use fast\Http; use think\Config; use think\Db; use think\Validate; /** * 我的页面 */ class User extends Api { protected $noNeedLogin = ['third','joinUs','developLogin']; protected $noNeedRight = '*'; public function _initialize() { parent::_initialize(); if (!Config::get('fastadmin.usercenter')) { $this->error(__('User center already closed')); } } /** * 会员中心 * @ApiReturn ( * data:{ * nickname 昵称 * avatar 头像 * pay 待支付 * wait_send 待发货 * wait_collect 待收货 * wait_comment 待评价 * } * ) */ public function index() { $data = []; $data['nickname'] = $this->auth->nickname; $data['avatar'] = cdnurl($this->auth->avatar,true); $data['mobile'] = $this->auth->mobile; $data['pay'] = Db::name('litestore_order')->where('user_id',$this->auth->id)->where('pay_status','10')->count(); $data['wait_send'] = Db::name('litestore_order')->where('user_id',$this->auth->id)->where('freight_status','10')->count(); $data['wait_collect'] = Db::name('litestore_order')->where('user_id',$this->auth->id)->where('receipt_status','10')->count(); $data['wait_comment'] = Db::name('litestore_order')->where('user_id',$this->auth->id)->where('receipt_status','20')->count(); $this->success('会员中心', ['welcome' => $data]); } /** * 修改会员个人信息 * * @ApiMethod (POST) * @param string $avatar 头像地址 * @param string $mobile 联系方式 * @param string $nickname 昵称 */ public function profile() { $user = $this->auth->getUser(); $mobile = $this->request->post('mobile'); $nickname = $this->request->post('nickname'); $avatar = $this->request->post('avatar', '', 'trim,strip_tags,htmlspecialchars'); if ($mobile) { $user->mobile = $mobile; } if ($nickname) { $user->nickname = $nickname; } if ($avatar) { $user->avatar = $avatar; } $user->save(); $this->success(); } /** * 第三方登录 * * @ApiMethod (POST) * @param string $code Code码 * @param string $nickname 微信昵称 * @param string $avatar 微信头像 * @param string $invite_id 邀请人id。默认传0 */ public function third() { $code = $this->request->post('code'); $nickname = $this->request->post('nickname'); $avatar = $this->request->post('avatar'); $invite_id = $this->request->post('invite_id'); if (!$code || !$nickname || !$avatar){ $this->error('后台所需参数缺失请完善参数'); } $param = []; $param['js_code'] = $code; $param['grant_type'] = 'authorization_code'; $param['secret'] = Config::get('site.secret'); $param['appid'] = Config::get('site.appid'); $wxapi = Http::get('https://api.weixin.qq.com/sns/jscode2session',$param);//请求openid $wxapi = json_decode($wxapi,true); if (isset($wxapi['errcode'])){ $this->error($wxapi['errmsg']); } $third = new \app\api\model\Third(); $userid = $third->where('openid',$wxapi['openid'])->value('user_id'); if ($userid){ $this->auth->direct($userid,$invite_id); $third->isUpdate()->save(['session_key'=>$wxapi['session_key']],['user_id'=>$userid]); $this->success('登录成功',['token'=>$this->auth->getToken(),'user_type'=>$this->auth->user_type]); }else{ if ($invite_id > 0){ $userid = $this->auth->register($nickname,'','','',['avatar'=>$avatar,'invite_user_id'=>$invite_id,'invite_time'=>time()]); }else{ $userid = $this->auth->register($nickname,'','','',['avatar'=>$avatar]); } if ($userid){ $third->isUpdate(false)->save(['openid'=>$wxapi['openid'],'user_id'=>$userid,'session_key'=>$wxapi['session_key']]); $this->success('登录成功',['token'=>$this->auth->getToken(),'user_type'=>$this->auth->user_type]); }else{ $this->error('注册失败'); } } } /** * @ApiTitle (用户授权获取手机号) * @ApiMethod (POST) * @ApiHeaders (name=token, type=string, required=true, description="请求的Token") * @ApiParams (name="iv", type="string", required=true, description="小程序iv") * @ApiParams (name="encryptedData", type="string", required=true, description="小程序encryptedData") * @ApiReturn ({ 'code':'1', 'msg':'返回成功', "data": { "mobile": "13580006666", //没有区号的手机号 } }) */ public function getPhoneNumber() { $param = $this->request->param(); $validate = new \think\Validate([ 'iv' => 'require', 'encryptedData' => 'require', ]); $validate->message([ 'iv.require' => 'iv参数错误!', 'encryptedData.require' => 'encryptData参数错误!', ]); if (!$validate->check($param)) { $this->error($validate->getError()); } // 获取session_key $user = $this->auth->getUser(); $third = \app\api\model\Third::where('user_id',$user['id'])->field('session_key')->find(); empty($third) && $this->error('请先登录'); // 获取小程序配置 $app = Factory::miniProgram([ 'app_id' => Config::get('site.appid'), 'secret' => Config::get('site.secret'), ]); $res = $app->encryptor->decryptData($third['session_key'], $param['iv'], $param['encryptedData']); // 更新手机号 $user->mobile = $res['purePhoneNumber']; $user->save(); $this->success('授权成功',['mobile' => $res['purePhoneNumber']]); } /** * @ApiTitle (用户优惠券) * @ApiMethod (POST) * @ApiHeaders (name=token, type=string, required=true, description="请求的Token") * @ApiParams (name="type", type="integer", required=true, description="0未使用1已使用2已过期") * @ApiReturn ({ 'code':'1', 'msg':'返回成功' "data": [ { "id": 1, "user_id": 1, "coupon_id": 1, "name": "手动阀手动阀", "price": "1.00", 优惠券金额 "full_price": "10.00", 满减金额 "createtime": 111122244, "endtime": 1641869388, "status": "0", "endtime_text": "2022年01月11日到期" } ] }) */ public function userCoupon() { $type = $this->request->post('type'); if (!in_array($type,[0,1,2])) $this->error('type参数不合法'); $model = new UserCoupon(); $list = $model->where('status',$type)->where('user_id',$this->auth->id)->select(); $this->success('用户优惠券列表',$list); } /** * @ApiTitle (用户地址列表) * @ApiMethod (POST) * @ApiHeaders (name=token, type=string, required=true, description="请求的Token") * @ApiReturn ({ 'code':'1', 'msg':'返回成功' "data": [ { "id": 1, "user_id": 1, "username": "1", 收件人 "address": "阿松大", 地址 "address_detail": "阿松大", 详细地址 "normal_status": "0", 0不默认1默认 "lng": null, 经度 "lat": null, 纬度 "createtime": null, "mobile_hide": "135****9988" 电话号码 "mobile": "13549059988" 电话号码 } ] }) */ public function userAddressList() { $model = new UserAddress(); $list = $model->where('user_id',$this->auth->id)->order('normal_status','desc')->select(); $this->success('用户地址列表',$list); } /** * @ApiTitle (用户修改(删除)地址) * @ApiMethod (POST) * @ApiHeaders (name=token, type=string, required=true, description="请求的Token") * @ApiParams (name=id, type=integer, required=true, description="地址id") * @ApiParams (name=type, type=integer, required=true, description="1修改2删除") * @ApiParams (name=username, type=string, required=false, description="收件人") * @ApiParams (name=mobile, type=string, required=flase, description="手机号") * @ApiParams (name=address, type=string, required=false, description="地址") * @ApiParams (name=address_detail, type=string, required=false, description="详细地址") * @ApiParams (name=normal, type=integer, required=false, description="默认状态 0不默认或1默认") * @ApiParams (name=lat, type=float, required=false, description="纬度") * @ApiParams (name=lng, type=float, required=false, description="经度") * @ApiReturn ({ 'code':'1', 'msg':'SUCCESS' "data": }) */ public function userAddressEdit() { $id = $this->request->post('id'); $type = $this->request->post('type'); $username = $this->request->post('username'); $mobile = $this->request->post('mobile'); $address = $this->request->post('address'); $address_detail = $this->request->post('address_detail'); $normal = $this->request->post('normal'); $lat = $this->request->post('lat'); $lng = $this->request->post('lng'); $data = [ 'type' => $type, 'mobile' => $mobile, 'id' => $id, 'normal' => $normal, 'lat' => $lat, 'lng' => $lng, ]; $rule = [ 'type' => 'require|in:1,2', 'mobile' => 'regex:^1\d{10}$', 'id' => 'require|integer', 'normal' => 'in:0,1', 'lat' => 'float', 'lng' => 'float', ]; $msg = [ 'type' => 'type参数不合法', 'mobile' => '电话号码格式不正确', 'id' => '地址id不合法', 'normal' => '默认状态参数不合法', 'lat' => '纬度请为浮点数格式', 'lng' => '经度请为浮点数格式', ]; $validate = new \think\Validate(); $validate->rule($rule); $validate->message($msg); if (!$validate->check($data)) $this->error($validate->getError()); $model = new UserAddress(); if ($type == 1){ $data = [ 'mobile' => $mobile, 'normal_status' => $normal, 'lat' => $lat, 'lng' => $lng, 'username' => $username, 'address' => $address, 'address_detail' => $address_detail, ]; if ($normal == 1) $model->isUpdate()->save(['normal_status'=>'0'],['user_id'=>$this->auth->id]); $model->isUpdate()->save($data,['id'=>$id]); }else{ $model->where('id',$id)->delete(); } $this->success('SUCCESS'); } /** * @ApiTitle (用户添加地址) * @ApiMethod (POST) * @ApiHeaders (name=token, type=string, required=true, description="请求的Token") * @ApiParams (name=username, type=string, required=true, description="收件人") * @ApiParams (name=mobile, type=string, required=true, description="手机号") * @ApiParams (name=address, type=string, required=true, description="地址") * @ApiParams (name=address_detail, type=string, required=true, description="详细地址") * @ApiParams (name=normal, type=integer, required=true, description="默认状态 0不默认或1默认") * @ApiParams (name=lat, type=float, required=true, description="纬度") * @ApiParams (name=lng, type=float, required=true, description="经度") * @ApiReturn ({ 'code':'1', 'msg':'SUCCESS' "data": }) */ public function userAddressAdd() { $username = $this->request->post('username'); $mobile = $this->request->post('mobile'); $address = $this->request->post('address'); $address_detail = $this->request->post('address_detail'); $normal = $this->request->post('normal'); $lat = $this->request->post('lat'); $lng = $this->request->post('lng'); $data = [ 'mobile' => $mobile, 'username' => $username, 'address' => $address, 'normal' => $normal, 'lat' => $lat, 'lng' => $lng, ]; $rule = [ 'mobile' => 'require|regex:^1\d{10}$', 'username' => 'require', 'address' => 'require', 'normal' => 'require|in:0,1', 'lat' => 'require|float', 'lng' => 'require|float', ]; $msg = [ 'mobile' => '请正确填写电话号码', 'username' => '请填写收件人', 'address' => '请选择地址', 'normal' => '默认状态参数不合法', 'lat' => '请上传纬度且为浮点数格式', 'lng' => '请上传经度且为浮点数格式', ]; $validate = new \think\Validate(); $validate->rule($rule); $validate->message($msg); if (!$validate->check($data)) $this->error($validate->getError()); $model = new UserAddress(); $data = [ 'mobile' => $mobile, 'user_id' => $this->auth->id, 'normal_status' => $normal, 'lat' => $lat, 'lng' => $lng, 'username' => $username, 'address' => $address, 'address_detail' => $address_detail, ]; if ($normal == 1) $model->isUpdate()->save(['normal_status'=>'0'],['user_id'=>$this->auth->id]); $model->isUpdate(false)->save($data); $this->success('SUCCESS'); } /** * @ApiTitle (加入我们) * @ApiMethod (POST) * @ApiParams (name=work, type=string, required=true, description="从事行业") * @ApiParams (name=years, type=string, required=true, description="从业时间") * @ApiParams (name=username, type=string, required=true, description="姓名") * @ApiParams (name=mobile, type=string, required=true, description="手机号") * @ApiParams (name=money, type=string, required=true, description="预计可投入资金") * @ApiParams (name=team, type=integer, required=true, description="团队拥有0没有1有") * @ApiParams (name=city, type=string, required=true, description="意向城市") * @ApiParams (name=content, type=string, required=true, description="自身优势") * @ApiReturn ({ 'code':'1', 'msg':'SUCCESS' "data": }) */ public function joinUs() { $work = $this->request->post('work'); $years = $this->request->post('years'); $username = $this->request->post('username'); $mobile = $this->request->post('mobile'); $money = $this->request->post('money'); $team = $this->request->post('team'); $city = $this->request->post('city'); $content = $this->request->post('content'); $data = [ 'work' => $work, 'mobile' => $mobile, 'username' => $username, 'years' => $years, 'money' => $money, 'team' => $team, 'city' => $city, 'content' => $content, ]; $rule = [ 'work' => 'require', 'mobile' => 'require|regex:^1\d{10}$', 'years' => 'require', 'username' => 'require', 'money' => 'require', 'team' => 'require|in:0,1', 'city' => 'require', 'content' => 'require|max:100', ]; $msg = [ 'work' => '请填写从事行业', 'mobile' => '请正确填写电话号码', 'years' => '请填写从业时间', 'username' => '请输入姓名', 'money' => '请输入可投入资金', 'team' => '请选择是否拥有团队', 'city' => '请填写意向城市', 'content' => '请填写描述控制在100字以内', ]; $validate = new \think\Validate(); $validate->rule($rule); $validate->message($msg); if (!$validate->check($data)) $this->error($validate->getError()); // 禁止连点 !empty(cache('joinus_'.$username)) && $this->error('操作频繁,请稍后再试'); cache('joinus_'.$username,'123',5); $data['createtime'] = time(); Db::name('join_us')->insert($data); $this->success('SUCCESS'); } /** * @ApiTitle (帮助反馈列表) * @ApiMethod (POST) * @ApiHeaders (name=token, type=string, required=true, description="token") * @ApiParams (name=page, type=integer, required=true, description="页数") * @ApiReturn ({ 'code':'1', 'msg':'SUCCESS' "data": "list": { "total": 1, "per_page": 15, "current_page": 1, "last_page": 1, "data": [ { "id": 1, "title": "123", 标题 "content": "啊实打实大苏打", 内容 } ] }, "rider_status": 0 申请骑手状态:0=无,1=申请中,2=成功,3=拒绝 "mobile": 拨号电话号码 }) */ public function helpsList() { $page = $this->request->post('page'); if (!is_numeric($page)) $this->error('页数参数不合法'); $list = Db::name('helps') ->order('id','desc') ->paginate(15,false,['page'=>$page]); $this->success('SUCCESS',['list'=>$list,'rider_status'=>$this->auth->rider,'mobile'=>Config::get('site.work_mobile')]); } /** * @ApiTitle (意见反馈) * @ApiMethod (POST) * @ApiHeaders (name=token, type=string, required=true, description="token") * @ApiParams (name=cotent, type=string, required=true, description="意见描述") * @ApiParams (name=images, type=string, required=false, description="图片逗号隔开 不要域名") * @ApiParams (name=mobile, type=string, required=true, description="联系方式") * @ApiReturn ({ 'code':'1', 'msg':'SUCCESS' "data": }) */ public function opinionAdd() { $cotent = $this->request->post('cotent'); $images = $this->request->post('images'); $mobile = $this->request->post('mobile'); if (!$cotent) $this->error('请填写意见描述'); if (mb_strlen($cotent) > 100) $this->error('请将意见描述控制在100字以内'); if (!$mobile || !preg_match('/^1\d{10}$/',$mobile)) $this->error('请正确填写联系方式'); $data = [ 'user_id' => $this->auth->id, 'cotent' => $cotent, 'images' => $images, 'mobile' => $mobile, 'createtime' => time() ]; Db::name('opinion')->insert($data); $this->success('SUCCESS'); } /** * @ApiTitle (申请成为骑手) * @ApiMethod (POST) * @ApiHeaders (name=token, type=string, required=true, description="token") * @ApiReturn ({ 'code':'1', 'msg':'SUCCESS' "data": }) */ public function riderApply() { if (in_array($this->auth->rider,[1,2])){ $this->error('您已申请,不可重复申请'); } $user = $this->auth->getUser(); $user->rider = '1'; $user->save(); $this->success('SUCCESS'); } /** * @ApiTitle (邀请有奖) * @ApiMethod (POST) * @ApiHeaders (name=token, type=string, required=true, description="token") * @ApiReturn ({ 'code':'1', 'msg':'邀请有奖' "data": "price": "10.00", 优惠价格 "full_price": "100.00", 满减价格 "endtime": "2022年04月10日", 到期时间 "rule": "啊实打实大苏打", 规则 "user_list": [ { "user": { "nickname": "admin", "avatar_text": "" }, "createtime_text": "" } ], "invite_id": 1, 邀请人id }) */ public function inviteReward() { $model = new \app\api\model\User(); $coupon = Db::name('coupon')->field('price,full_price,endtime')->find(); $coupon['endtime'] = date('Y年m月d日',$coupon['endtime']); $coupon['rule'] = Config::get('site.invite_rule'); $coupon['user_list'] = $model ->where('invite_user_id',$this->auth->id) ->where('invite_status','1') ->limit(3) ->select(); foreach ($coupon['user_list'] as $key => $value){ $value->visible(['nickname']); } $coupon['invite_id'] = $this->auth->id; $this->success('邀请有奖',$coupon); } /** * @ApiTitle (发票管理列表) * @ApiMethod (POST) * @ApiHeaders (name=token, type=string, required=true, description="token") * @ApiParams (name=page, type=integer, required=true, description="页数") * @ApiReturn ({ 'code':'1', 'msg':'发票管理列表' "data": "total": 1, 总条数 "per_page": 5, 每页数量 "current_page": 1, 当前页 "last_page": 1, 最后一页 "data": [ { "id": "1", "company_name": "asdsd", 公司名称 "username": "asdsa", 个人名称 "type": "1", 1个人发票2公司发票 "price": 0, 发票价格 "tax_time": 1654891234, "tax_time_text": "2022年01月12日" 开票时间 } ] }) */ public function taxList() { $page = $this->request->post('page',1); $model = new Tax(); $list = $model ->where('user_id',$this->auth->id) ->where('del_status','normal') ->field('id,company_name,username,type,price,tax_time') ->order('id','desc') ->paginate(5,false,['page'=>$page]); $this->success('发票管理列表',$list); } /** * @ApiTitle (申请发票) * @ApiSummary (个人信息和企业信息必填二选一) * @ApiMethod (POST) * @ApiHeaders (name=token, type=string, required=true, description="token") * @ApiParams (name=type, type=integer, required=true, description="1个人2企业单位") * @ApiParams (name=username, type=string, required=false, description="个人名称") * @ApiParams (name=company_name, type=string, required=false, description="公司名称") * @ApiParams (name=tax_number, type=string, required=false, description="纳税识别号") * @ApiParams (name=company_address, type=string, required=false, description="公司地址") * @ApiParams (name=company_mobile, type=string, required=false, description="公司电话") * @ApiParams (name=bank, type=string, required=false, description="开户银行") * @ApiParams (name=mobile, type=string, required=true, description="收票人电话号码") * @ApiParams (name=eamil, type=string, required=true, description="电子邮箱") * @ApiParams (name=order_no, type=string, required=true, description="订单编号") * @ApiReturn ({ 'code':'1', 'msg':'SUCCESS' "data": }) */ public function taxApply() { $type = $this->request->post('type'); $username = $this->request->post('username'); $company_name = $this->request->post('company_name'); $tax_number = $this->request->post('tax_number'); $company_address = $this->request->post('company_address'); $company_mobile = $this->request->post('company_mobile'); $bank = $this->request->post('bank'); $mobile = $this->request->post('mobile'); $eamil = $this->request->post('eamil'); $order_no = $this->request->post('order_no'); //校验数据 if (!in_array($type,[1,2])) $this->error('type参数不合法'); $data = [ 'mobile' => $mobile, 'eamil' => $eamil, 'order_no' => $order_no, ]; $rule = [ 'mobile' => 'regex:^1\d{10}$', 'eamil' => 'regex:^[A-Za-z\d]+([-_.][A-Za-z\d]+)*@([A-Za-z\d]+[-.])+[A-Za-z\d]{2,4}$', 'order_no' => 'require', ]; $msg = [ 'mobile' => '收票人电话号码格式不正确', 'eamil' => '电子邮箱格式不正确', 'order_no' => '请输入订单编号', ]; $validate = new \think\Validate($rule,$msg); if (!$validate->check($data)) $this->error($validate->getError()); if ($type == 2){ $data = [ 'company_name' => $company_name, 'company_mobile' => $company_mobile, 'tax_number' => $tax_number, 'company_address' => $company_address, 'bank' => $bank, ]; $rule = [ 'company_name' => 'require', 'tax_number' => 'require', 'company_address' => 'require', 'bank' => 'require', 'company_mobile' => 'regex:^1\d{10}$', ]; $msg = [ 'company_mobile' => '公司电话格式不正确', 'company_name' => '请填写公司名称', 'tax_number' => '请填写纳税人识别号', 'company_address' => '请填写公司地址', 'bank' => '请填写开户银行', ]; $validate = new \think\Validate($rule,$msg); if (!$validate->check($data)) $this->error($validate->getError()); }else{ $data = [ 'username' => $username, ]; $rule = [ 'username' => 'require', ]; $msg = [ 'username' => '请填写个人/非企业单位名称', ]; $validate = new \think\Validate($rule,$msg); if (!$validate->check($data)) $this->error($validate->getError()); } //校验订单编号 $orderModel = new \app\api\model\Order(); $order = $orderModel::get(['order_no'=>$order_no]); if (!$order) $this->error('订单编号不存在'); if ($order['user_id'] != $this->auth->id) $this->error('当前用户无权使用此订单编号'); // 插入数据 $data = [ 'company_name' => $company_name, 'username' => $username, 'company_mobile' => $company_mobile, 'tax_number' => $tax_number, 'company_address' => $company_address, 'bank' => $bank, 'mobile' => $mobile, 'email' => $eamil, 'order_no' => $order_no, 'type' => $type, 'order_id' => $order['id'], 'price' => $order['total_price'], 'user_id' => $this->auth->id, ]; $model = new Tax(); $model->allowField(true)->isUpdate(false)->save($data); $this->success('SUCCESS'); } /** * @ApiTitle (发票删除) * @ApiMethod (POST) * @ApiHeaders (name=token, type=string, required=true, description="token") * @ApiParams (name=ids, type=string, required=true, description="发票id逗号隔开") * @ApiReturn ({ 'code':'1', 'msg':'SUCCESS' "data": }) */ public function taxDelete() { $ids = $this->request->post('ids'); //校验数据 $ids = explode(',',$ids); foreach ($ids as $key => $value){ if (!is_numeric($value)) $this->error('ids参数不合法'); } $model = new Tax(); $model->isUpdate()->save(['del_status' => 'hidden'],['id' => ['in',$ids]]); $this->success('SUCCESS'); } /** * 开发登录 * @ApiMethod (POST) * @param string $account 账号 */ public function developLogin() { $account = $this->request->post('account'); if (!$account) { $this->error(__('Invalid parameters')); } $field = Validate::is($account, 'email') ? 'email' : (Validate::regex($account, '/^1\d{10}$/') ? 'mobile' : 'username'); $user = \app\common\model\User::get([$field => $account]); if (!$user) { $this->error('账号格式不正确'); } $ret = $this->auth->direct($user->id); if ($ret) { $data = ['userinfo' => $this->auth->getUserinfo()]; $this->success(__('Logged in successful'), $data); } else { $this->error($this->auth->getError()); } } }