<?php namespace app\api\controller; use app\common\controller\Api; use app\common\library\Sms; use app\common\model\User as UserModel; use app\common\model\UserAddress; use app\common\model\UserSize; use app\common\model\Area; use app\common\controller\Wechat; use think\Validate; /** * 会员接口 */ class User extends Api { protected $noNeedLogin = ['index','login','measure']; protected $noNeedRight = '*'; public function _initialize() { parent::_initialize(); $this->model = model('app\common\model\User'); $this->user = $this->auth->getUser(); } /** * 我的-首页 * @ApiMethod (GET) * @ApiHeaders (name=token, type=string, required=true, description="请求的Token") * @ApiReturnParams (name="code", type="integer", required=true, sample="0") * @ApiReturnParams (name="msg", type="string", required=true, sample="返回成功") * @ApiReturnParams (name="data", type="object", description="扩展数据返回") * @ApiReturn ({ 'code':'1', 'msg':'返回成功' }) */ public function index() { // 当前用户信息 $user = $this->user; $coupon_count = \app\common\model\UserCoupon::alias('uc') ->join('coupon c','c.id = uc.coupon_id') ->where('uc.user_id',$this->user['id']) ->where('uc.status','1') ->where('c.expiretime','>',time()) ->count(); return $this->success('成功',compact('user','coupon_count')); } /** * 我的-授权登录 * @ApiMethod (POST) * @ApiHeaders (name=token, type=string, required=true, description="请求的Token") * @ApiParams (name="code", type="string", required=true, description="重定向code") * @ApiParams (name="user_info", type="object", required=true, description="用户信息", sample="{'user_id':'int','user_name':'string','profile':{'email':'string','age':'integer'}}") * @ApiParams (name="testopenid", type="string", description="测试openid") * @ApiReturnParams (name="code", type="integer", required=true, sample="0") * @ApiReturnParams (name="msg", type="string", required=true, sample="返回成功") * @ApiReturnParams (name="data", type="object", description="扩展数据返回") * @ApiReturn ({ 'code':'1', 'msg':'返回成功' }) */ public function login() { $code = $this->request->post('code'); $user_info = $this->request->post('user_info'); $testopenid = $this->request->post('testopenid'); $session = Wechat::miniProgram()->auth->session($code); // 自动注册用户 $userInfo = json_decode(htmlspecialchars_decode($user_info), true); if (!$user = $this->model->get(['openid' => $session['openid']])) { $user = $this->model; $userInfo['openid'] = $session['openid']; } $userInfo['nickname'] = preg_replace('/[\xf0-\xf7].{3}/', '', $userInfo['nickName']); $userInfo['avatar'] = $userInfo['avatarUrl']; if (!$user->allowField(true)->save($userInfo)) { $this->error('用户登录失败'); } // $session = [ // 'openid' => $testopenid ?: 'test', // ]; // $user = $this->model->get(['openid' => $session['openid']]); // 生成token (session3rd) $guid = guidv4();// 生成一个不会重复的随机字符串 $timeStamp = microtime(true);// 当前时间戳 (精确到毫秒) $salt = 'token_salt';// 自定义一个盐 $token = md5("{$timeStamp}_{$session['openid']}_{$guid}_{$salt}"); $this->auth->direct($user['id'],$token); $this->success(__('登录成功'),[ 'token' => $token, 'avatar' => $user['avatar'] ]); } /** * 我的-成为会员(会员介绍) * @ApiMethod (GET) * @ApiReturnParams (name="code", type="integer", required=true, sample="0") * @ApiReturnParams (name="msg", type="string", required=true, sample="返回成功") * @ApiReturnParams (name="data", type="object", description="扩展数据返回") * @ApiReturn ({ 'code':'1', 'msg':'返回成功' }) */ public function memberIntro() { $member_intro = str_replace('src="/uploads/', 'src="'.cdnurl('/uploads/',true), config('site.member_intro')); $this->success(__('成功'),compact('member_intro')); } /** * 我的-成为会员(绑定手机号) * @ApiMethod (POST) * @ApiHeaders (name=token, type=string, required=true, description="请求的Token") * @ApiParams (name="mobile", type="string", required=true, description="手机号") * @ApiParams (name="captcha", type="string", required=true, description="验证码") * @ApiParams (name="area", type="string", required=true, description="所在地区", sample="广东省,广州市,海珠区") * @ApiReturnParams (name="code", type="integer", required=true, sample="0") * @ApiReturnParams (name="msg", type="string", required=true, sample="返回成功") * @ApiReturnParams (name="data", type="object", description="扩展数据返回") * @ApiReturn ({ 'code':'1', 'msg':'返回成功' }) */ public function bindMobile() { $mobile = $this->request->post('mobile'); $captcha = $this->request->post('captcha'); $area = $this->request->post('area'); if (!empty($this->user['mobile'])) { $this->error(__('您已经成为会员,请勿重复操作')); } if (!$mobile || !$captcha || !$area) { $this->error(__('Invalid parameters')); } if (!Validate::regex($mobile, "^1\d{10}$")) { $this->error(__('Mobile is incorrect')); } if ($this->model->where('mobile', $mobile)->where('id', '<>', $this->user['id'])->find()) { $this->error(__('Mobile already exists')); } // $result = Sms::check($mobile, $captcha, 'changemobile'); $result = \app\api\controller\Sms::check($mobile, $captcha, 'changemobile'); if (!$result) { $this->error(__('Captcha is incorrect')); } $area = explode(',', $area); $province_id = Area::getIdByName($area[0], 1); $city_id = Area::getIdByName($area[1], 2, $province_id); $district_id = Area::getIdByName($area[2], 3, $city_id); $this->user->allowField(true)->save(compact('mobile','province_id', 'city_id', 'district_id')); Sms::flush($mobile, 'changemobile'); $this->success(__('注册成功')); } /** * 我的-积分记录 * @ApiMethod (GET) * @ApiHeaders (name=token, type=string, required=true, description="请求的Token") * @ApiParams (name="rows", type="integer", required=true, description="每页条数") * @ApiParams (name="page", type="integer", required=true, description="页码") * @ApiReturnParams (name="code", type="integer", required=true, sample="0") * @ApiReturnParams (name="msg", type="string", required=true, sample="返回成功") * @ApiReturnParams (name="data", type="object", description="扩展数据返回") * @ApiReturn ({ 'code':'1', 'msg':'返回成功' }) */ public function scoreLog(){ $rows = $this->request->get('rows',null);// 每页条数 $page = $this->request->get('page',1);// 页码 $list = $this->model->scoreLog($this->user['id'],$page,$rows); $this->success(__('成功'),array_merge([ 'score' => $this->user['score'] ],$list)); } /** * 我的-优惠券 * @ApiMethod (GET) * @ApiHeaders (name=token, type=string, required=true, description="请求的Token") * @ApiParams (name="status", type="string", required=true, description="优惠券状态:all=全部,normal=正常,soon_expire=即将到期,expired=已到期,used=已使用") * @ApiReturnParams (name="code", type="integer", required=true, sample="0") * @ApiReturnParams (name="msg", type="string", required=true, sample="返回成功") * @ApiReturnParams (name="data", type="object", sample="0", sample="返回成功", description="扩展数据返回") * @ApiReturn ({ 'code':'1', 'msg':'返回成功' }) */ public function couponList(){ $status = $this->request->get('status'); $list = \app\common\model\UserCoupon::couponList($this->user, $status); $this->success(__('成功'),compact('list')); } /** * 我的地址-列表 * @ApiMethod (GET) * @ApiHeaders (name=token, type=string, required=true, description="请求的Token") * @ApiReturnParams (name="code", type="integer", required=true, sample="0") * @ApiReturnParams (name="msg", type="string", required=true, sample="返回成功") * @ApiReturnParams (name="data", type="object", description="扩展数据返回") * @ApiReturn ({ 'code':'1', 'msg':'返回成功' }) */ public function addressList() { $list = UserAddress::addressList($this->user['id']); $this->success(__('成功'),compact('list')); } /** * @ApiTitle (我的地址-添加) * @ApiMethod (POST) * @ApiHeaders (name=token, type=string, required=true, description="请求的Token") * @ApiParams (name="name", type="string", required=true, description="收货人") * @ApiParams (name="phone", type="string", required=true, description="手机号码") * @ApiParams (name="area", type="string", required=true, description="所在地区", sample="广东省,广州市,海珠区") * @ApiParams (name="detail", type="string", description="详细地址") * @ApiParams (name="isdefault", type="string", description="是否默认:0=否,1=是") * @ApiReturnParams (name="code", type="integer", required=true, sample="0") * @ApiReturnParams (name="msg", type="string", required=true, sample="返回成功") * @ApiReturnParams (name="data", type="object", description="扩展数据返回") * @ApiReturn ({ 'code':'1', 'msg':'返回成功' }) */ public function addressAdd() { $post = $this->request->post(); empty($post['name']) && $this->error(__('请填写收货人')); empty($post['phone']) && $this->error(__('请填写手机号码')); empty($post['area']) && $this->error(__('请选择所在地区')); empty($post['detail']) && $this->error(__('请填写详细地址')); if ((new UserAddress)->add($this->user, $post)) { $this->success(__('添加成功')); } $this->error(__('添加失败')); } /** * 我的地址-详情 * @ApiMethod (GET) * @ApiHeaders (name=token, type=string, required=true, description="请求的Token") * @ApiParams (name="user_address_id", type="integer", required=true, description="地址ID") * @ApiReturnParams (name="code", type="integer", required=true, sample="0") * @ApiReturnParams (name="msg", type="string", required=true, sample="返回成功") * @ApiReturnParams (name="data", type="object", description="扩展数据返回") * @ApiReturn ({ 'code':'1', 'msg':'返回成功' }) */ public function addressDetail() { $user_address_id = $this->request->get('user_address_id'); $detail = UserAddress::detail($this->user['id'],$user_address_id); $this->success(__('成功'),compact('detail')); } /** * 我的地址-编辑 * @ApiMethod (POST) * @ApiHeaders (name=token, type=string, required=true, description="请求的Token") * @ApiParams (name="user_address_id", type="integer", required=true, description="地址ID") * @ApiParams (name="name", type="string", required=true, description="收货人") * @ApiParams (name="phone", type="string", required=true, description="手机号码") * @ApiParams (name="area", type="object", required=true, description="所在地区", sample="{'user_id':'int','user_name':'string','profile':{'email':'string','age':'integer'}}") * @ApiParams (name="detail", type="string", description="详细地址") * @ApiParams (name="isdefault", type="string", description="是否默认:0=否,1=是") * @ApiReturnParams (name="code", type="integer", required=true, sample="0") * @ApiReturnParams (name="msg", type="string", required=true, sample="返回成功") * @ApiReturnParams (name="data", type="object", description="扩展数据返回") * @ApiReturn ({ 'code':'1', 'msg':'返回成功' }) */ public function addressEdit() { $post = $this->request->post(); $model = UserAddress::detail($this->user['id'], $post['user_address_id']); if(empty($model)){ $this->error(__('地址不存在')); } empty($post['name']) && $this->error(__('请填写收货人')); empty($post['phone']) && $this->error(__('请填写手机号码')); empty($post['area']) && $this->error(__('请选择所在地区')); empty($post['detail']) && $this->error(__('请填写详细地址')); if ($model->edit($post)) { $this->success(__('更新成功')); } $this->error(__('更新失败')); } /** * 我的地址-删除 * @ApiMethod (GET) * @ApiHeaders (name=token, type=string, required=true, description="请求的Token") * @ApiParams (name="user_address_id", type="integer", required=true, description="地址ID") * @ApiReturnParams (name="code", type="integer", required=true, sample="0") * @ApiReturnParams (name="msg", type="string", required=true, sample="返回成功") * @ApiReturnParams (name="data", type="object", description="扩展数据返回") * @ApiReturn ({ 'code':'1', 'msg':'返回成功' }) */ public function addressDelete() { $user_address_id = $this->request->get('user_address_id'); $model = UserAddress::detail($this->user['id'], $user_address_id); if ($model->remove($this->user)) { $this->success(__('删除成功')); } $this->error(__('删除失败')); } /** * 我的地址-设为默认 * @ApiMethod (GET) * @ApiHeaders (name=token, type=string, required=true, description="请求的Token") * @ApiParams (name="user_address_id", type="integer", required=true, description="尺寸ID") * @ApiReturnParams (name="code", type="integer", required=true, sample="0") * @ApiReturnParams (name="msg", type="string", required=true, sample="返回成功") * @ApiReturnParams (name="data", type="object", description="扩展数据返回") * @ApiReturn ({ 'code':'1', 'msg':'返回成功' }) */ public function addressDefault() { $user_address_id = $this->request->get('user_address_id'); $model = UserAddress::detail($this->user['id'], $user_address_id); if ($model->setDefault()) { $this->success(__('设置成功')); } $this->error(__('设置失败')); } /** * 我的尺寸-列表 * @ApiMethod (GET) * @ApiHeaders (name=token, type=string, required=true, description="请求的Token") * @ApiReturnParams (name="code", type="integer", required=true, sample="0") * @ApiReturnParams (name="msg", type="string", required=true, sample="返回成功") * @ApiReturnParams (name="data", type="object", description="扩展数据返回") * @ApiReturn ({ 'code':'1', 'msg':'返回成功' }) */ public function sizeList() { $list = UserSize::sizeList($this->user['id']); $this->success(__('成功'),compact('list')); } /** * 我的尺寸-身体信息 * @ApiMethod (GET) * @ApiParams (name="gender", type="string", required=true, description="性别:1=男,2=女") * @ApiReturnParams (name="code", type="integer", required=true, sample="0") * @ApiReturnParams (name="msg", type="string", required=true, sample="返回成功") * @ApiReturnParams (name="data", type="object", description="扩展数据返回") * @ApiReturn ({ 'code':'1', 'msg':'返回成功' }) */ public function bodyInfo() { $gender = $this->request->get('gender','1'); $list = \app\common\model\Style::styleList($gender); $this->success(__('成功'),compact('list')); } /** * 我的尺寸-身材特征 * @ApiMethod (GET) * @ApiReturnParams (name="code", type="integer", required=true, sample="0") * @ApiReturnParams (name="msg", type="string", required=true, sample="返回成功") * @ApiReturnParams (name="data", type="object", description="扩展数据返回") * @ApiReturn ({ 'code':'1', 'msg':'返回成功' }) */ public function bodyFeatures() { $list = \app\common\model\Style::styleList(3); $this->success(__('成功'),compact('list')); } /** * 我的尺寸-全身照或半身照 * @ApiMethod (GET) * @ApiReturnParams (name="code", type="integer", required=true, sample="0") * @ApiReturnParams (name="msg", type="string", required=true, sample="返回成功") * @ApiReturnParams (name="data", type="object", description="扩展数据返回") * @ApiReturn ({ 'code':'1', 'msg':'返回成功' }) */ public function bodyImage() { $list = \app\common\model\Style::styleList(4); $this->success(__('成功'),compact('list')); } /** * @ApiTitle (我的尺寸-添加) * @ApiMethod (POST) * @ApiHeaders (name=token, type=string, required=true, description="请求的Token") * @ApiParams (name="name", type="string", required=true, description="尺寸名称") * @ApiParams (name="height", type="integer", required=true, description="身高(厘米)") * @ApiParams (name="weight", type="integer", required=true, description="体重(公斤)") * @ApiParams (name="collar", type="integer", description="领围(厘米)") * @ApiParams (name="hipline", type="integer", description="臀围(厘米)") * @ApiParams (name="arm_length", type="integer", description="臂长(厘米)") * @ApiParams (name="bust", type="integer", description="胸围(厘米)") * @ApiParams (name="shoulder_width", type="integer", description="肩宽(厘米)") * @ApiParams (name="gender", type="string", required=true, description="性别:1=男,2=女") * @ApiParams (name="body_info", type="object", required=true, description="身体信息") * @ApiParams (name="body_features", type="string", description="身体特征,多个值用英文逗号分隔") * @ApiParams (name="remark", type="string", description="备注") * @ApiParams (name="body_images", type="file", description="身材照片,多文件") * @ApiParams (name="isdefault", type="string", description="是否默认:0=否,1=是") * @ApiReturnParams (name="code", type="integer", required=true, sample="0") * @ApiReturnParams (name="msg", type="string", required=true, sample="返回成功") * @ApiReturnParams (name="data", type="object", description="扩展数据返回") * @ApiReturn ({ 'code':'1', 'msg':'返回成功' }) */ public function sizeAdd() { $post = $this->request->post(); empty($post['name']) && $this->error(__('请填写尺寸名称')); empty($post['height']) && $this->error(__('请填写身高')); empty($post['weight']) && $this->error(__('请填写体重')); empty($post['gender']) && $this->error(__('请选择性别')); empty($post['body_info']) && $this->error(__('请选择身体信息')); if ((new UserSize)->add($this->user, $post)) { $this->success(__('添加成功')); } $this->error(__('添加失败')); } /** * 我的尺寸-详情 * @ApiMethod (GET) * @ApiHeaders (name=token, type=string, required=true, description="请求的Token") * @ApiParams (name="user_size_id", type="integer", required=true, description="尺寸ID") * @ApiReturnParams (name="code", type="integer", required=true, sample="0") * @ApiReturnParams (name="msg", type="string", required=true, sample="返回成功") * @ApiReturnParams (name="data", type="object", description="扩展数据返回") * @ApiReturn ({ 'code':'1', 'msg':'返回成功' }) */ public function sizeDetail() { $user_size_id = $this->request->get('user_size_id'); $detail = UserSize::detail($this->user['id'],$user_size_id); $this->success(__('成功'),compact('detail')); } /** * 我的尺寸-编辑 * @ApiMethod (POST) * @ApiHeaders (name=token, type=string, required=true, description="请求的Token") * @ApiParams (name="user_size_id", type="integer", required=true, description="尺寸ID") * @ApiParams (name="name", type="string", required=true, description="尺寸名称") * @ApiParams (name="height", type="integer", required=true, description="身高(厘米)") * @ApiParams (name="weight", type="integer", required=true, description="体重(公斤)") * @ApiParams (name="collar", type="integer", description="领围(厘米)") * @ApiParams (name="hipline", type="integer", description="臀围(厘米)") * @ApiParams (name="arm_length", type="integer", description="臂长(厘米)") * @ApiParams (name="bust", type="integer", description="胸围(厘米)") * @ApiParams (name="shoulder_width", type="integer", description="肩宽(厘米)") * @ApiParams (name="gender", type="string", required=true, description="性别:1=男,2=女") * @ApiParams (name="body_info", type="object", required=true, description="身体信息") * @ApiParams (name="body_features", type="string", description="身体特征,多个值用英文逗号分隔") * @ApiParams (name="remark", type="string", description="备注") * @ApiParams (name="body_images", type="file", description="身材照片,多文件") * @ApiParams (name="isdefault", type="string", description="是否默认:0=否,1=是") * @ApiReturnParams (name="code", type="integer", required=true, sample="0") * @ApiReturnParams (name="msg", type="string", required=true, sample="返回成功") * @ApiReturnParams (name="data", type="object", description="扩展数据返回") * @ApiReturn ({ 'code':'1', 'msg':'返回成功' }) */ public function sizeEdit() { $post = $this->request->post(); $this->success(json_encode($post)); $model = UserSize::detail($this->user['id'], $post['user_size_id']); if(empty($model)){ $this->error(__('尺寸信息不存在')); } empty($post['name']) && $this->error(__('请填写尺寸名称')); empty($post['height']) && $this->error(__('请填写身高')); empty($post['weight']) && $this->error(__('请填写体重')); empty($post['gender']) && $this->error(__('请选择性别')); empty($post['body_info']) && $this->error(__('请选择身体信息')); if ($model->edit($post)) { $this->success(__('更新成功')); } $this->error(__('更新失败')); } /** * 我的尺寸-删除 * @ApiMethod (GET) * @ApiHeaders (name=token, type=string, required=true, description="请求的Token") * @ApiParams (name="user_size_id", type="integer", required=true, description="尺寸ID") * @ApiReturnParams (name="code", type="integer", required=true, sample="0") * @ApiReturnParams (name="msg", type="string", required=true, sample="返回成功") * @ApiReturnParams (name="data", type="object", description="扩展数据返回") * @ApiReturn ({ 'code':'1', 'msg':'返回成功' }) */ public function sizeDelete() { $user_size_id = $this->request->get('user_size_id'); $model = UserSize::detail($this->user['id'], $user_size_id); if ($model->remove($this->user)) { $this->success(__('删除成功')); } $this->error(__('删除失败')); } /** * 我的尺寸-设为默认 * @ApiMethod (GET) * @ApiHeaders (name=token, type=string, required=true, description="请求的Token") * @ApiParams (name="user_size_id", type="integer", required=true, description="尺寸ID") * @ApiReturnParams (name="code", type="integer", required=true, sample="0") * @ApiReturnParams (name="msg", type="string", required=true, sample="返回成功") * @ApiReturnParams (name="data", type="object", description="扩展数据返回") * @ApiReturn ({ 'code':'1', 'msg':'返回成功' }) */ public function sizeDefault() { $user_size_id = $this->request->get('user_size_id'); $model = UserSize::detail($this->user['id'], $user_size_id); if ($model->setDefault()) { $this->success(__('设置成功')); } $this->error(__('设置失败')); } /** * 我的尺寸-量体教程 * @ApiMethod (GET) * @ApiReturnParams (name="code", type="integer", required=true, sample="0") * @ApiReturnParams (name="msg", type="string", required=true, sample="返回成功") * @ApiReturnParams (name="data", type="object", description="扩展数据返回") * @ApiReturn ({ 'code':'1', 'msg':'返回成功' }) */ public function measure() { $measure = str_replace('src="/uploads/', 'src="'.cdnurl('/uploads/',true), config('site.measure')); $this->success(__('成功'),compact('measure')); } }