提交代码
This commit is contained in:
146
app/Http/Controllers/AddressController.php
Normal file
146
app/Http/Controllers/AddressController.php
Normal file
@@ -0,0 +1,146 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Rules\Checkmobile;
|
||||
use Auth;
|
||||
use Illuminate\Http\Request;
|
||||
use RuLong\Area\Models\Area;
|
||||
use RuLong\Area\Models\UserAddress;
|
||||
use Validator;
|
||||
|
||||
class AddressController extends Controller
|
||||
{
|
||||
public function __construct(Request $request)
|
||||
{
|
||||
$this->middleware('auth');
|
||||
view()->share('nav', 4);
|
||||
}
|
||||
|
||||
public function index()
|
||||
{
|
||||
$addresses = Auth::user()->addresses()->orderBy('is_default', 'desc')->orderBy('id', 'desc')->get();
|
||||
|
||||
if ($addresses->isEmpty()) {
|
||||
return redirect()->route('addresses.create');
|
||||
}
|
||||
$provinces = Area::where('type', '省级')->pluck('name', 'sn');
|
||||
|
||||
return view('address.index', compact('addresses', 'provinces'));
|
||||
}
|
||||
|
||||
public function create()
|
||||
{
|
||||
$provinces = \Area::index(0);
|
||||
return view('address.create', compact('provinces'));
|
||||
}
|
||||
|
||||
public function store(Request $request)
|
||||
{
|
||||
$validator = Validator::make($request->all(), [
|
||||
'name' => 'required|max:4',
|
||||
'mobile' => ['required', new Checkmobile],
|
||||
'province_sn' => 'required',
|
||||
'city_sn' => 'required',
|
||||
'area_sn' => 'required',
|
||||
'address' => 'required',
|
||||
], [
|
||||
'name.required' => '收货人必须填写',
|
||||
'name.max' => '收货人最多:max字符',
|
||||
'mobile.required' => '手机号必须填写',
|
||||
'province_sn.required' => '省份必须选择',
|
||||
'city_sn.required' => '城市必须选择',
|
||||
'area_sn.required' => '地区必须选择',
|
||||
'address.required' => '详细地址必须填写',
|
||||
|
||||
]);
|
||||
|
||||
if ($validator->fails()) {
|
||||
return $this->error($validator->errors()->first());
|
||||
}
|
||||
$data = [
|
||||
'user_id' => Auth::id(),
|
||||
'name' => $request->name,
|
||||
'mobile' => $request->mobile,
|
||||
'province_sn' => $request->province_sn,
|
||||
'city_sn' => $request->city_sn,
|
||||
'area_sn' => $request->area_sn,
|
||||
'address' => $request->address,
|
||||
];
|
||||
|
||||
if ($request->has('def')) {
|
||||
$data['is_default'] = 1;
|
||||
}
|
||||
|
||||
$info = \Address::store($data);
|
||||
|
||||
if ($request->callback) {
|
||||
$callback = $request->callback . '?address=' . $info->id;
|
||||
} else {
|
||||
$callback = route('addresses.index');
|
||||
}
|
||||
return $this->success('地址创建成功', $callback);
|
||||
}
|
||||
|
||||
public function show(UserAddress $address)
|
||||
{
|
||||
# code...
|
||||
}
|
||||
|
||||
public function edit(UserAddress $address)
|
||||
{
|
||||
$provinces = \Area::index(0);
|
||||
$cities = \Area::index($address->province_sn);
|
||||
$areas = \Area::index($address->city_sn);
|
||||
return view('address.edit', compact('address', 'provinces', 'cities', 'areas'));
|
||||
}
|
||||
|
||||
public function update(Request $request, UserAddress $address)
|
||||
{
|
||||
if (\Address::update($address, $request->all())) {
|
||||
return $this->success('修改成功', route('addresses.index'));
|
||||
} else {
|
||||
return $this->error('修改失败');
|
||||
}
|
||||
}
|
||||
|
||||
public function destroy($id)
|
||||
{
|
||||
if (\Address::destroy($id)) {
|
||||
return $this->success('删除成功', route('addresses.index'));
|
||||
} else {
|
||||
return $this->error();
|
||||
}
|
||||
}
|
||||
|
||||
public function select(Request $request)
|
||||
{
|
||||
$callback = $request->has('callback') && $request->callback == route('orders.create') ? route('orders.create') : route('orders.create');
|
||||
$addresses = Auth::user()->addresses()->orderBy('is_default', 'desc')->orderBy('id', 'desc')->get();
|
||||
return view('address.change', compact('addresses', 'callback'));
|
||||
}
|
||||
|
||||
public function areas(Request $request)
|
||||
{
|
||||
if (empty($request->psn)) {
|
||||
return ['msg' => '请选择省份', 'code' => 0];
|
||||
}
|
||||
|
||||
$areas = \Area::index($request->psn);
|
||||
|
||||
if ($areas) {
|
||||
return response()->json(['msg' => '', 'code' => 1, 'data' => $areas]);
|
||||
} else {
|
||||
return ['msg' => '请选择省份/城市', 'code' => 0];
|
||||
}
|
||||
}
|
||||
|
||||
public function setdef($id)
|
||||
{
|
||||
if (\Address::setDefault(UserAddress::find($id))) {
|
||||
return $this->success('设置成功', route('addresses.index'));
|
||||
} else {
|
||||
return $this->error();
|
||||
}
|
||||
}
|
||||
}
|
||||
28
app/Http/Controllers/AjaxResponse.php
Normal file
28
app/Http/Controllers/AjaxResponse.php
Normal file
@@ -0,0 +1,28 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
trait AjaxResponse
|
||||
{
|
||||
|
||||
public function success($message = '', $redirect = null)
|
||||
{
|
||||
return [
|
||||
'status' => 'SUCCESS',
|
||||
'statusCode' => 200,
|
||||
'message' => $message,
|
||||
'redirect' => $redirect,
|
||||
];
|
||||
}
|
||||
|
||||
public function error($message = '', $redirect = null)
|
||||
{
|
||||
return [
|
||||
'status' => 'ERROR',
|
||||
'statusCode' => 400,
|
||||
'message' => $message,
|
||||
'redirect' => $redirect,
|
||||
];
|
||||
}
|
||||
|
||||
}
|
||||
60
app/Http/Controllers/ArticleController.php
Normal file
60
app/Http/Controllers/ArticleController.php
Normal file
@@ -0,0 +1,60 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\Advert;
|
||||
use App\Models\Article;
|
||||
use App\Models\Category;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\View;
|
||||
|
||||
class ArticleController extends Controller
|
||||
{
|
||||
|
||||
public function __construct(Request $request)
|
||||
{
|
||||
view()->share('nav', 3);
|
||||
view()->share('app_title', '教程资讯');
|
||||
}
|
||||
|
||||
public function index(Request $request)
|
||||
{
|
||||
$category_id = $request->category_id;
|
||||
$page = $request->page ?? '';
|
||||
|
||||
$lists = Article::where('hot', 0)->when($category_id, function ($q) use ($category_id) {
|
||||
$q->where('category_id', $category_id);
|
||||
})->orderBy('created_at', 'desc')->paginate();
|
||||
|
||||
if ($page > 1) {
|
||||
if ($lists->isNotEmpty()) {
|
||||
$html = response(view('articles.more', compact('lists')))->getContent();
|
||||
return $this->success($html);
|
||||
} else {
|
||||
return $this->error('没有数据了');
|
||||
}
|
||||
} else {
|
||||
$categorys = Category::where('type', 'article')->where('parent_id', 0)->get();
|
||||
$adverts = Advert::where('channel', 'article')->orderBy('sort', 'asc')->take(5)->get(); //banner
|
||||
$hot = Article::where('hot', 1)->orderBy('id', 'desc')->first();
|
||||
return view('articles.index', compact('lists', 'categorys', 'adverts', 'category_id', 'hot'));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public function show(Article $article)
|
||||
{
|
||||
$article->increment('clicks');
|
||||
$lists = Article::where('category_id', $article->category_id)->inRandomOrder()->take(2)->get();
|
||||
return view('articles.show', compact('article', 'lists'));
|
||||
}
|
||||
|
||||
public function more(Request $request)
|
||||
{
|
||||
$category_id = $request->category_id;
|
||||
|
||||
$lists = Article::when($category_id, function ($q) use ($category_id) {
|
||||
$q->where('category_id', $category_id);
|
||||
})->orderBy('created_at', 'desc')->paginate();
|
||||
}
|
||||
}
|
||||
263
app/Http/Controllers/AuthController.php
Normal file
263
app/Http/Controllers/AuthController.php
Normal file
@@ -0,0 +1,263 @@
|
||||
<?php
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\User;
|
||||
use App\Rules\Checkmobile;
|
||||
use Auth;
|
||||
use Illuminate\Auth\Events\Login;
|
||||
use Illuminate\Auth\Events\Registered;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Session;
|
||||
use Illuminate\Support\Facades\View;
|
||||
use RuLong\Sms\Models\Sms as SmsModel;
|
||||
use Validator;
|
||||
|
||||
class AuthController extends Controller
|
||||
{
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->middleware('auth')->except(['login', 'wechat', 'wechatCallback']);
|
||||
}
|
||||
|
||||
public function register(Request $request)
|
||||
{
|
||||
$user = Auth::user();
|
||||
|
||||
if ($request->isMethod('post')) {
|
||||
$request->validate([
|
||||
'username' => ['required', 'unique:users', new Checkmobile],
|
||||
'password' => 'required|between:6,32|confirmed',
|
||||
'password_confirmation' => 'required|between:6,32',
|
||||
'code' => ['required', 'size:4', function ($attribute, $value, $fail) use ($request) {
|
||||
if ($value != SmsModel::where('mobile', $request->username)->where('used', 0)->latest()->value('code')) {
|
||||
return $fail('验证码不正确');
|
||||
}
|
||||
}],
|
||||
], [
|
||||
'username.required' => '手机号码必须填写',
|
||||
'username.unique' => '手机号已经注册',
|
||||
'code.required' => '验证码必须填写',
|
||||
'code.size' => '验证码长度为:size位',
|
||||
'password.required' => '登录密码必须填写',
|
||||
'password.between' => '登录密码有误',
|
||||
'password.confirmed' => '确认密码与登录密码不一致',
|
||||
'password_confirmation.required' => '确认密码必须填写',
|
||||
'password_confirmation.between' => '确认密码有误',
|
||||
]);
|
||||
|
||||
$user->username = $request->username;
|
||||
$user->password = $request->password;
|
||||
$user->save();
|
||||
return $this->success('设置成功', route('index'));
|
||||
} else {
|
||||
return view('auth.register');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 用户登录 *
|
||||
* @Author:<C.Jason>
|
||||
* @Date:2018-11-07T13:47:02+0800
|
||||
* @param Request $request
|
||||
*/
|
||||
public function login(Request $request)
|
||||
{
|
||||
if ($request->isMethod('POST')) {
|
||||
|
||||
$validator = Validator::make($request->all(), [
|
||||
'username' => 'required|mobile|exists:users',
|
||||
'password' => 'required|between:6,32',
|
||||
], [
|
||||
'username.required' => '手机号码必须填写',
|
||||
'username.mobile' => '手机号码格式不正确',
|
||||
'username.exists' => '手机号码不存在',
|
||||
'password.required' => '登录密码必须填写',
|
||||
'password.between' => '登录密码应在:min-:max位之间',
|
||||
]);
|
||||
|
||||
if ($validator->fails()) {
|
||||
return $this->error($validator->errors()->first());
|
||||
}
|
||||
|
||||
$cert = [
|
||||
'username' => $request->username,
|
||||
'password' => $request->password,
|
||||
];
|
||||
|
||||
if (Auth::attempt($cert, true)) {
|
||||
return $this->success('登录成功', route('index'));
|
||||
} else {
|
||||
return $this->error('用户名或密码不存在');
|
||||
}
|
||||
} else {
|
||||
return view('auth.login');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 微信登录 、微信快速注册 *
|
||||
* 注册完之后,在这里没有办法判断推荐关系
|
||||
*
|
||||
* @Author:<C.Jason>
|
||||
* @Date:2018-11-07T13:44:34+0800
|
||||
* @param Request $request
|
||||
*/
|
||||
public function wechat(Request $request)
|
||||
{
|
||||
if (strpos($request->server('HTTP_USER_AGENT'), 'MicroMessenger') !== false) {
|
||||
if ($request['share_uid']) {
|
||||
session(['parent_id' => $request['share_uid']]);
|
||||
}
|
||||
|
||||
if ($request['r']) {
|
||||
session(['r' => $request['r']]);
|
||||
}
|
||||
$app = app('wechat.official_account');
|
||||
$app['config']->set('oauth.callback', 'login/wechatCallback');
|
||||
return $app->oauth->redirect();
|
||||
} else {
|
||||
return redirect()->route('authlogin');
|
||||
}
|
||||
}
|
||||
|
||||
public function wechatCallback(Request $request)
|
||||
{
|
||||
try {
|
||||
$app = app('wechat.official_account');
|
||||
$weUser = $app->oauth->user();
|
||||
$callback = $request['callback'] ?? '';
|
||||
$openUser = $app->user->get($weUser->id);
|
||||
$oldUser = User::where('openid', $weUser->id)->first();
|
||||
if ($oldUser) {
|
||||
$oldUser->info()->update([
|
||||
'headimgurl' => $weUser->getOriginal()['headimgurl'],
|
||||
'sex' => $weUser->getOriginal()['sex'],
|
||||
'country' => $weUser->getOriginal()['country'],
|
||||
'province' => $weUser->getOriginal()['province'],
|
||||
'city' => $weUser->getOriginal()['city'],
|
||||
'subscribe_at' => isset($openUser['subscribe_time']) ? date('Y-m-d H:i:s', $openUser['subscribe_time']) : null,
|
||||
'subscribe_scene' => isset($openUser['subscribe_scene']) ? $openUser['subscribe_scene'] : '',
|
||||
]);
|
||||
|
||||
Auth::login($oldUser, true);
|
||||
if (!$oldUser->username) {
|
||||
return redirect()->route('register');
|
||||
} else {
|
||||
$r = session('r', '');
|
||||
if ($r) {
|
||||
return redirect($r);
|
||||
} else {
|
||||
return redirect()->route('index');
|
||||
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$parent_id = session('parent_id', 0);
|
||||
|
||||
$user = User::create(
|
||||
[
|
||||
'openid' => $weUser->id,
|
||||
'parent_id' => $parent_id,
|
||||
]
|
||||
);
|
||||
|
||||
$user->info()->create([
|
||||
'nickname' => $weUser->getOriginal()['nickname'],
|
||||
'headimgurl' => $weUser->getOriginal()['headimgurl'],
|
||||
'sex' => $weUser->getOriginal()['sex'],
|
||||
'country' => $weUser->getOriginal()['country'],
|
||||
'province' => $weUser->getOriginal()['province'],
|
||||
'city' => $weUser->getOriginal()['city'],
|
||||
'subscribe_at' => isset($openUser['subscribe_time']) ? date('Y-m-d H:i:s', $openUser['subscribe_time']) : null,
|
||||
'subscribe_scene' => isset($openUser['subscribe_scene']) ? $openUser['subscribe_scene'] : '',
|
||||
]);
|
||||
|
||||
Session::forget('parent_id');
|
||||
|
||||
event(new Registered($user));
|
||||
Auth::login($user, true);
|
||||
|
||||
return redirect()->route('register');
|
||||
}
|
||||
/**
|
||||
* 这个注册完成事件,只能把 updateOrCreate 这个方法拆分开来使用了
|
||||
*/
|
||||
} catch (\Exception $e) {
|
||||
return redirect()->route('login');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 退出登录
|
||||
* @Author:<C.Jason>
|
||||
* @Date:2018-11-07T13:46:45+0800
|
||||
*/
|
||||
public function logout()
|
||||
{
|
||||
Auth::logout();
|
||||
session()->flush();
|
||||
return redirect()->route('login');
|
||||
}
|
||||
|
||||
/**
|
||||
* 发送验证码
|
||||
* @Author:<C.Jason>
|
||||
* @Date:2018-11-07T13:49:55+0800
|
||||
* @return
|
||||
*/
|
||||
public function smsCode(Request $request)
|
||||
{
|
||||
$channel = $request->channel;
|
||||
$mobile = $request->username;
|
||||
switch ($channel) {
|
||||
case 'FORGOT':
|
||||
$validator = Validator::make($request->all(), [
|
||||
'username' => ['required', new Checkmobile],
|
||||
], [
|
||||
'username.required' => '手机号码必须填写',
|
||||
'username.mobile' => '手机号码格式不正确',
|
||||
'username.exists' => '手机号码不存在',
|
||||
]);
|
||||
break;
|
||||
case 'BIND':
|
||||
// 绑定手机号,要不存在才可以
|
||||
$channel = 'DEFAULT';
|
||||
$validator = Validator::make($request->all(), [
|
||||
'username' => ['required', 'unique:users', new Checkmobile],
|
||||
], [
|
||||
'username.required' => '手机号码必须填写',
|
||||
'username.mobile' => '手机号码格式不正确',
|
||||
'username.unique' => '手机号码已经绑定',
|
||||
]);
|
||||
break;
|
||||
default:
|
||||
$validator = Validator::make($request->all(), [
|
||||
'username' => ['required', new Checkmobile],
|
||||
], [
|
||||
'username.required' => '手机号码必须填写',
|
||||
]);
|
||||
break;
|
||||
}
|
||||
|
||||
if ($validator->fails()) {
|
||||
return $this->error($validator->errors()->first());
|
||||
}
|
||||
|
||||
$res = SmsModel::verify_code($mobile);
|
||||
if ($res !== true) {
|
||||
return $this->error($res);
|
||||
}
|
||||
try {
|
||||
$code = \Sms::send($mobile, $channel);
|
||||
$config = config('rulong_sms');
|
||||
if ($config['debug'] != true) {
|
||||
return $this->success('验证码发送成功');
|
||||
} else {
|
||||
return $this->success('验证码发送成功' . $code);
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
return $this->error($e->getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
108
app/Http/Controllers/CartController.php
Normal file
108
app/Http/Controllers/CartController.php
Normal file
@@ -0,0 +1,108 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\Cart;
|
||||
use App\Models\Goods;
|
||||
use App\Models\GoodsParams;
|
||||
use Auth;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\View;
|
||||
|
||||
class CartController extends Controller
|
||||
{
|
||||
|
||||
public function __construct(Request $request)
|
||||
{
|
||||
$this->middleware('auth');
|
||||
View::share('nav', 1);
|
||||
}
|
||||
|
||||
public function index(Request $request)
|
||||
{
|
||||
$lists = Cart::mine()->orderBy('id', 'desc')->get();
|
||||
$carts = [];
|
||||
foreach ($lists as $cart) {
|
||||
if ($cart->params->stock < 1) {
|
||||
$cart->delete();
|
||||
} else {
|
||||
if ($cart->number > $cart->params->stock) {
|
||||
$cart->number = $cart->params->stock;
|
||||
$cart->save();
|
||||
}
|
||||
$carts[] = $cart;
|
||||
}
|
||||
}
|
||||
$recommends = Goods::where('status', 1)->where('is_recommend', 1)->take(6)->orderBy('created_at', 'desc')->get();
|
||||
return view('cart.index', compact('carts', 'recommends'));
|
||||
}
|
||||
|
||||
public function setnum(Request $request)
|
||||
{
|
||||
$cart = Cart::find($request->id);
|
||||
$cart->number = $request->number;
|
||||
$cart->save();
|
||||
}
|
||||
|
||||
public function sure(Request $request)
|
||||
{
|
||||
$data = array();
|
||||
foreach (explode(',', $request->cart_id) as $key => $value) {
|
||||
$cart = Cart::find($value);
|
||||
if ($cart) {
|
||||
$data['details'][0][$value]['cart_id'] = $value;
|
||||
$data['details'][0][$value]['params_id'] = $cart->params_id;
|
||||
$data['details'][0][$value]['number'] = $cart->number;
|
||||
}
|
||||
}
|
||||
$data['item']['id'] = 0;
|
||||
$data['item']['type'] = 'MEMBER';
|
||||
return redirect()->route('orders.create', $data);
|
||||
|
||||
}
|
||||
|
||||
public function delete(Request $request)
|
||||
{
|
||||
$id = $request->id;
|
||||
$cart = Cart::find($id);
|
||||
if ($cart->delete()) {
|
||||
return $this->success('删除成功');
|
||||
} else {
|
||||
return $this->error('删除失败');
|
||||
}
|
||||
}
|
||||
|
||||
//加入购物车
|
||||
public function store(Request $request)
|
||||
{
|
||||
if (Cart::where('user_id', Auth::id())->count() == 99) {
|
||||
return ['code' => 0, 'msg' => '您的购物车商品数量已达上限99个'];
|
||||
}
|
||||
foreach ($request->details as $key => $details) {
|
||||
foreach ($details as $detail) {
|
||||
$user_id = Auth::id();
|
||||
$result = Cart::where(['user_id' => $user_id, 'params_id' => $detail['params_id']])->first();
|
||||
$params = GoodsParams::find($detail['params_id']);
|
||||
if ($result) {
|
||||
$result->number += $detail['number'];
|
||||
$result->save();
|
||||
} else {
|
||||
$result = Cart::create([
|
||||
'user_id' => Auth::id(),
|
||||
'params_id' => $detail['params_id'],
|
||||
'goods_id' => $params->goods_id, //保存goods_id是为了下架商品时,删除购物车
|
||||
'number' => $detail['number'],
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if ($result) {
|
||||
return $this->success('成功加入购物车');
|
||||
} else {
|
||||
return $this->error('加入购物车失败');
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
47
app/Http/Controllers/Controller.php
Normal file
47
app/Http/Controllers/Controller.php
Normal file
@@ -0,0 +1,47 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
|
||||
use Illuminate\Foundation\Bus\DispatchesJobs;
|
||||
use Illuminate\Foundation\Validation\ValidatesRequests;
|
||||
use Illuminate\Routing\Controller as BaseController;
|
||||
use RuLong\Area\Models\Area;
|
||||
use Session;
|
||||
|
||||
class Controller extends BaseController
|
||||
{
|
||||
use AuthorizesRequests, DispatchesJobs, ValidatesRequests, AjaxResponse;
|
||||
|
||||
//获取当前定位数组
|
||||
public function getDefaultLocation()
|
||||
{
|
||||
$lat = session('lat', '45.76021');
|
||||
$lng = session('lng', '126.66835');
|
||||
$area = session('area', '');
|
||||
$real_area = session('real_area', '');
|
||||
|
||||
if (!$area) {
|
||||
$area = Area::where('sn', '230100')->first();
|
||||
}
|
||||
|
||||
if (!$real_area) {
|
||||
session::put('real_area', $area);
|
||||
$real_area = $area;
|
||||
}
|
||||
|
||||
$location = [
|
||||
'lat' => $lat,
|
||||
'lng' => $lng,
|
||||
'area' => $area,
|
||||
'real_area' => $real_area,
|
||||
];
|
||||
return $location;
|
||||
}
|
||||
|
||||
public function getDefault($value)
|
||||
{
|
||||
$location = $this->getDefaultLocation();
|
||||
return $location[$value] ?? '';
|
||||
}
|
||||
}
|
||||
37
app/Http/Controllers/FavoriteController.php
Normal file
37
app/Http/Controllers/FavoriteController.php
Normal file
@@ -0,0 +1,37 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\Goods;
|
||||
use Auth;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\View;
|
||||
|
||||
class FavoriteController extends Controller
|
||||
{
|
||||
public function __construct(Request $request)
|
||||
{
|
||||
$this->middleware('auth');
|
||||
View::share('nav', 4);
|
||||
}
|
||||
|
||||
public function index(Request $request)
|
||||
{
|
||||
$user = Auth::user();
|
||||
$lists = $user->favorites(Goods::class)->paginate();
|
||||
return view('favorite.index', compact('lists'));
|
||||
}
|
||||
|
||||
public function more(Request $request)
|
||||
{
|
||||
$user = Auth::user();
|
||||
$lists = $user->favorites(Goods::class)->paginate();
|
||||
if ($lists->isNotEmpty()) {
|
||||
$html = response(view('favorite.more', compact('lists')))->getContent();
|
||||
return $this->success($html);
|
||||
} else {
|
||||
return $this->error('没有数据了');
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
113
app/Http/Controllers/GoodsController.php
Normal file
113
app/Http/Controllers/GoodsController.php
Normal file
@@ -0,0 +1,113 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\Category;
|
||||
use App\Models\Goods;
|
||||
use Auth;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class GoodsController extends Controller
|
||||
{
|
||||
public function __construct(Request $request)
|
||||
{
|
||||
view()->share('nav', 1);
|
||||
}
|
||||
|
||||
public function show(Goods $good)
|
||||
{
|
||||
$params = $good->params()->where('stock', '>', 0)->orderBy('price', 'asc')->get();
|
||||
$first = $good->params()->orderBy('original', 'asc')->first();
|
||||
$user = Auth::user();
|
||||
return view('goods.show', compact('good', 'params', 'user', 'first'));
|
||||
}
|
||||
|
||||
public function category(Request $request)
|
||||
{
|
||||
$category_id = $request->category_id ?? '';
|
||||
if ($category_id) {
|
||||
$category = Category::find($category_id);
|
||||
} else {
|
||||
$category = '';
|
||||
}
|
||||
|
||||
$categorys = Category::where('parent_id', 0)->where('type', 'goods')->get();
|
||||
|
||||
return view('goods.category', compact('categorys', 'category', 'category_id'));
|
||||
}
|
||||
|
||||
public function lists(Request $request)
|
||||
{
|
||||
$category_id = $request->get('category_id', '');
|
||||
$title = $request->get('title', '');
|
||||
$page = $request->get('page', '');
|
||||
$price = $request->get('price', '');
|
||||
$sold = $request->get('sold', '');
|
||||
|
||||
$goods = Goods::where('status', 1)
|
||||
->when($category_id, function ($query) use ($category_id) {
|
||||
$ids = Category::where('id', $category_id)->orWhere('parent_id', $category_id)->pluck('id');
|
||||
return $query->whereIn('category_id', $ids);
|
||||
})
|
||||
->when($title, function ($query) use ($title) {
|
||||
return $query->where('title', 'like', "%$title%");
|
||||
})
|
||||
->when($price, function ($q) use ($price) {return $q->orderBy('price', $price);})
|
||||
->when($sold, function ($q) use ($sold) {return $q->orderBy('sold', $sold);})
|
||||
->orderBy('sort', 'asc')
|
||||
->orderBy('created_at', 'desc')
|
||||
->paginate(10);
|
||||
|
||||
if ($page > 1) {
|
||||
if ($goods->count() > 0) {
|
||||
$html = response(view('goods.more', compact('goods')))->getContent();
|
||||
return $this->success($html);
|
||||
} else {
|
||||
return $this->error('已经到最后一页');
|
||||
}
|
||||
}
|
||||
|
||||
$parent_id = 0;
|
||||
|
||||
$category = '';
|
||||
$app_title = '商品列表';
|
||||
$parent_cate = '';
|
||||
if ($category_id) {
|
||||
$parent_cate = $category = Category::find($category_id);
|
||||
if ($category->parent_id) {
|
||||
$app_title = $category->parent->title . '--' . $category->title;
|
||||
$parent_cate = $category->parent;
|
||||
$parent_id = $parent_cate->id;
|
||||
} else {
|
||||
$parent_id = $category->id;
|
||||
$app_title = $category->title;
|
||||
}
|
||||
}
|
||||
$categorys = Category::where('parent_id', $parent_id)->where('type', 'goods')->get();
|
||||
|
||||
view()->share('app_title', $app_title);
|
||||
return view('goods.lists', compact('goods', 'categorys', 'sold', 'price', 'category_id', 'title', 'parent_cate'));
|
||||
}
|
||||
|
||||
//收藏
|
||||
public function favorite(Goods $goods)
|
||||
{
|
||||
$user = Auth::user();
|
||||
if (!$user) {
|
||||
return $this->error('请登录后在进行此操作', route('login'));
|
||||
}
|
||||
if ($user->hasFavorited($goods)) {
|
||||
$result = $user->unfavorite($goods);
|
||||
$text = '取消收藏';
|
||||
} else {
|
||||
$result = $user->favorite($goods);
|
||||
$text = '收藏';
|
||||
}
|
||||
|
||||
if ($result) {
|
||||
return $this->success($text . '成功', route('goods.show', $goods));
|
||||
} else {
|
||||
return $this->error($text . '失败');
|
||||
}
|
||||
}
|
||||
}
|
||||
61
app/Http/Controllers/IndexController.php
Normal file
61
app/Http/Controllers/IndexController.php
Normal file
@@ -0,0 +1,61 @@
|
||||
<?php
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\Advert;
|
||||
use App\Models\Category;
|
||||
use App\Models\Goods;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\View;
|
||||
|
||||
class IndexController extends Controller
|
||||
{
|
||||
|
||||
public function __construct(Request $request)
|
||||
{
|
||||
View::share('nav', 1);
|
||||
view()->share('app_title', '会员商城');
|
||||
}
|
||||
|
||||
public function index(Request $request)
|
||||
{
|
||||
$title = $request->title;
|
||||
|
||||
$adverts = Advert::where('channel', 'member')->orderBy('sort', 'asc')->take(5)->get(); //banner
|
||||
$c_lists = Category::where('type', 'goods')->where('parent_id', 0)->orderBy('order', 'asc')->take(4)->get();
|
||||
|
||||
$lists = Goods::where('status', 1)
|
||||
->when($title, function ($q) use ($title) {
|
||||
$q->where('title', 'like', "%{$title}%");
|
||||
})
|
||||
->where('type', 'member')
|
||||
->where('is_hot_sell', 1)
|
||||
->orderBy('sort', 'asc')
|
||||
->orderBy('created_at', 'desc')
|
||||
->paginate(10);
|
||||
|
||||
return view('index.index', compact('c_lists', 'adverts', 'lists', 'title'));
|
||||
}
|
||||
|
||||
public function more(Request $request)
|
||||
{
|
||||
$category_id = $request->category;
|
||||
$title = $request->title;
|
||||
|
||||
$lists = Goods::where('status', 1)
|
||||
->when($title, function ($q) use ($title) {
|
||||
$q->where('title', 'like', "%{$title}%");
|
||||
})
|
||||
->where('type', 'member')
|
||||
->where('is_hot_sell', 1)
|
||||
->orderBy('sort', 'asc')
|
||||
->orderBy('created_at', 'desc')
|
||||
->paginate(10);
|
||||
|
||||
if ($lists->isNotEmpty()) {
|
||||
$html = response(view('index.more', compact('lists')))->getContent();
|
||||
return $this->success($html);
|
||||
} else {
|
||||
return $this->error('没有数据了');
|
||||
}
|
||||
}
|
||||
}
|
||||
114
app/Http/Controllers/LocationController.php
Normal file
114
app/Http/Controllers/LocationController.php
Normal file
@@ -0,0 +1,114 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use GuzzleHttp\Client;
|
||||
use Illuminate\Http\Request;
|
||||
use RuLong\Area\Models\Area;
|
||||
use Session;
|
||||
|
||||
class LocationController extends Controller
|
||||
{
|
||||
public function __construct(Request $request)
|
||||
{
|
||||
view()->share('nav', 2);
|
||||
|
||||
}
|
||||
|
||||
//自动设置默认地区
|
||||
public function setLocation(Request $request)
|
||||
{
|
||||
$lat = $request->lat;
|
||||
$lng = $request->lng;
|
||||
|
||||
if (!$lat || !$lng) {
|
||||
return $this->error('设置失败');
|
||||
}
|
||||
|
||||
$location = $this->getDefaultLocation();
|
||||
|
||||
if (!$location['real_area']) {
|
||||
$url = "http://api.map.baidu.com/geocoder";
|
||||
$client = new Client();
|
||||
$response = $client->request('GET', $url, [
|
||||
'timeout' => 30,
|
||||
'query' => [
|
||||
'location' => $lat . "," . $lng,
|
||||
'output' => 'json',
|
||||
],
|
||||
]);
|
||||
|
||||
if ($response->getStatusCode() == 200) {
|
||||
$data = json_decode($response->getBody()->getContents(), true);
|
||||
$city = $data['result']['addressComponent']['city'];
|
||||
} else {
|
||||
return $this->location($url);
|
||||
}
|
||||
$area = Area::where('name', $city)->first();
|
||||
|
||||
//如果地址没有开通,默认哈尔滨
|
||||
if ($area->status != 1) {
|
||||
$area = Area::where('sn', '230100')->first();
|
||||
$lat = $area->lat;
|
||||
$lng = $area->lng;
|
||||
}
|
||||
|
||||
Session::put('lat', $lat);
|
||||
Session::put('lng', $lng);
|
||||
Session::put('area', $area);
|
||||
Session::put('real_area', $area);
|
||||
return $this->success($city);
|
||||
} else {
|
||||
Session::put('lat', $lat);
|
||||
Session::put('lng', $lng);
|
||||
return $this->error(json_encode($location));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//设置地区
|
||||
public function setArea(Request $request)
|
||||
{
|
||||
$area_id = $request->area_id;
|
||||
if ($area_id) {
|
||||
$area = Area::find($area_id);
|
||||
} else {
|
||||
$area = [
|
||||
"id" => 0,
|
||||
"sn" => 0,
|
||||
"psn" => 0,
|
||||
"province" => "全国",
|
||||
"city" => "全国",
|
||||
"area" => "",
|
||||
"name" => "全国",
|
||||
];
|
||||
$area = (object) $area;
|
||||
}
|
||||
|
||||
session(['area' => $area]);
|
||||
$url = route('pick.lists');
|
||||
$callback = session('address_callback', '');
|
||||
if ($callback) {
|
||||
$url = $callback;
|
||||
}
|
||||
return $this->success('设置成功', $url);
|
||||
}
|
||||
|
||||
//设置城市
|
||||
public function address(Request $request)
|
||||
{
|
||||
$name = $request->name ?? '';
|
||||
$callback = $request->callback ?? '';
|
||||
if ($callback) {
|
||||
session(['address_callback' => $callback]);
|
||||
}
|
||||
$location = $this->getDefaultLocation();
|
||||
if (empty($name)) {
|
||||
$addresses = Area::where('psn', 0)->get();
|
||||
} else {
|
||||
$addresses = Area::where('name', 'like', "%{$name}%")->where('type', '地级')->get();
|
||||
}
|
||||
$hots = Area::where('hot', 1)->get();
|
||||
return view('location.address', compact('addresses', 'location', 'hots', 'name'));
|
||||
}
|
||||
}
|
||||
48
app/Http/Controllers/NotifyController.php
Normal file
48
app/Http/Controllers/NotifyController.php
Normal file
@@ -0,0 +1,48 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Events\UpgradePaid;
|
||||
use App\Models\Payment;
|
||||
use App\Models\UpgradePayment;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class NotifyController extends Controller
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public function payment(Request $request)
|
||||
{
|
||||
$app = app('wechat.payment');
|
||||
|
||||
return $app->handlePaidNotify(function ($message, $fail) {
|
||||
$payment = Payment::where('trade_no', $message['out_trade_no'])->first();
|
||||
if ($payment->state != 'SUCCESS') {
|
||||
$payment->state = 'SUCCESS';
|
||||
$payment->transaction_id = $message['transaction_id'];
|
||||
$payment->paid_at = $message['time_end'];
|
||||
$payment->save();
|
||||
$payment->order->paid();
|
||||
}
|
||||
|
||||
return true;
|
||||
});
|
||||
}
|
||||
|
||||
public function upgrade(Request $request)
|
||||
{
|
||||
$app = app('wechat.payment');
|
||||
return $app->handlePaidNotify(function ($message, $fail) {
|
||||
$UpgradePayment = UpgradePayment::where('trade_no', $message['out_trade_no'])->first();
|
||||
$UpgradePayment->state = 'SUCCESS';
|
||||
$UpgradePayment->transaction_id = $message['transaction_id'];
|
||||
$UpgradePayment->paid_at = $message['time_end'];
|
||||
$UpgradePayment->save();
|
||||
event(new UpgradePaid($UpgradePayment));
|
||||
return true;
|
||||
});
|
||||
}
|
||||
}
|
||||
215
app/Http/Controllers/OrderController.php
Normal file
215
app/Http/Controllers/OrderController.php
Normal file
@@ -0,0 +1,215 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\Cart;
|
||||
use App\Models\GoodsParams;
|
||||
use Auth;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Session;
|
||||
use RuLong\Area\Models\UserAddress;
|
||||
use RuLong\Order\Models\Order;
|
||||
use RuLong\Order\Models\OrderDetail;
|
||||
|
||||
class OrderController extends Controller
|
||||
{
|
||||
public $orderid;
|
||||
public function __construct(Request $request)
|
||||
{
|
||||
view()->share('nav', 4);
|
||||
$this->middleware('auth');
|
||||
}
|
||||
|
||||
public function index()
|
||||
{
|
||||
$orders = Order::where('user_id', Auth::id())
|
||||
->where('state', '<>', Order::ORDER_CLOSED)
|
||||
->orderBy('id', 'desc')
|
||||
->get();
|
||||
|
||||
return view('orders.index', compact('orders'));
|
||||
}
|
||||
|
||||
public function unpay()
|
||||
{
|
||||
$orders = Order::Unpaid()
|
||||
->where('user_id', Auth::id())
|
||||
->orderBy('id', 'desc')
|
||||
->get();
|
||||
return view('orders.index', compact('orders'));
|
||||
}
|
||||
|
||||
public function paid()
|
||||
{
|
||||
$orders = Order::UnDeliver()
|
||||
->where('user_id', Auth::id())
|
||||
->orderBy('id', 'desc')
|
||||
->get();
|
||||
|
||||
return view('orders.index', compact('orders'));
|
||||
}
|
||||
|
||||
public function delivered()
|
||||
{
|
||||
$orders = Order::Delivered()
|
||||
->where('user_id', Auth::id())
|
||||
->orderBy('id', 'desc')
|
||||
->get();
|
||||
return view('orders.index', compact('orders'));
|
||||
}
|
||||
|
||||
public function signed()
|
||||
{
|
||||
$orders = Order::Signed()
|
||||
->where('user_id', Auth::id())
|
||||
->orderBy('id', 'desc')
|
||||
->get();
|
||||
return view('orders.index', compact('orders'));
|
||||
}
|
||||
|
||||
public function show($orderid)
|
||||
{
|
||||
$order = Order::where('orderid', $orderid)->firstOrFail();
|
||||
return view('orders.show', compact('order'));
|
||||
}
|
||||
|
||||
//确认订单
|
||||
public function create(Request $request)
|
||||
{
|
||||
$user = Auth::user();
|
||||
$address_id = $request->get('address', '');
|
||||
$address = $address_id ? UserAddress::find($address_id) : UserAddress::where('user_id', Auth::id())->orderBy('is_default', 'desc')->first() ?? '';
|
||||
|
||||
if (!($request->has('details'))) {
|
||||
$items = Session::get('items_store');
|
||||
} else {
|
||||
$items = $request->details;
|
||||
Session::put(['items_store' => $items]);
|
||||
}
|
||||
|
||||
//为存储到order表中区分普通商品or套餐商品,item_id>0套餐商品
|
||||
if (!($request->has('item'))) {
|
||||
$item = Session::get('item');
|
||||
} else {
|
||||
$item = $request->item;
|
||||
Session::put(['item' => $item]);
|
||||
}
|
||||
|
||||
if (empty($items)) {
|
||||
return redirect()->route('user.index');
|
||||
}
|
||||
$sellers_score = 0;
|
||||
$sellers_total = 0;
|
||||
$sellers_freight = 0;
|
||||
$sellers_count = 0;
|
||||
//按照商户分单,一个商户一个订单,一个订单可多个商品
|
||||
foreach ($items as $key => $seller_item) {
|
||||
$detail[$key]['seller_id'] = $key;
|
||||
$detail[$key]['amount'] = 0;
|
||||
$detail[$key]['freight'] = 0;
|
||||
$detail[$key]['heavy'] = 0;
|
||||
$detail[$key]['score'] = 0;
|
||||
foreach ($seller_item as $kk => $value) {
|
||||
$params = GoodsParams::find($value['params_id']);
|
||||
if ($params) {
|
||||
|
||||
if ($item['type'] == 'MEMBER') {
|
||||
$price = $user->identity_id > 0 ? $params->price : $params->original;
|
||||
} else {
|
||||
$price = $params->price;
|
||||
}
|
||||
|
||||
$detail[$key]['items'][] = [
|
||||
'params_id' => $params->id,
|
||||
'params_cover' => $params->storage,
|
||||
'params_title' => $params->getTitle(),
|
||||
'params_price' => $price,
|
||||
'params_score' => $params->score,
|
||||
'number' => $value['number'],
|
||||
'cart_id' => isset($value['cart_id']) ? $value['cart_id'] : 0, //是否从购物车下单的商品
|
||||
];
|
||||
}
|
||||
$detail[$key]['amount'] += $value['number'] * $price;
|
||||
$detail[$key]['score'] += $value['number'] * $params->score;
|
||||
}
|
||||
|
||||
$sellers_score += $detail[$key]['score'];
|
||||
$sellers_total += $detail[$key]['amount'];
|
||||
$detail[$key]['freight'] = 0; //包邮
|
||||
|
||||
$detail[$key]['item']['id'] = $item['id']; //0普通商品订单,一单支持多商品,
|
||||
$detail[$key]['item']['type'] = $item['type']; //0普通商品订单,一单支持多商品,
|
||||
$card_id = $item['card_id'] ?? 0;
|
||||
$sellers_total += $detail[$key]['freight'];
|
||||
$sellers_freight += $detail[$key]['freight'];
|
||||
$sellers_count += 1;
|
||||
}
|
||||
return view('orders.create', compact('detail', 'address', 'sellers_total', 'sellers_score', 'sellers_freight', 'sellers_count', 'card_id'));
|
||||
|
||||
}
|
||||
|
||||
public function store(Request $request)
|
||||
{
|
||||
$user = Auth::user();
|
||||
|
||||
try {
|
||||
DB::transaction(function () use ($request, $user) {
|
||||
$address = UserAddress::find($request->address_id);
|
||||
$card_id = $request->card_id ?? 0;
|
||||
foreach ($request->details as $kk => $seller_detail) {
|
||||
$items[$kk] = array();
|
||||
$score[$kk] = 0;
|
||||
$score_order[$kk] = 0;
|
||||
foreach ($seller_detail['items'] as $key => $value) {
|
||||
if ($value['cart_id'] != 0 && $cart = Cart::find($value['cart_id'])) {
|
||||
$cart->delete();
|
||||
}
|
||||
$params = GoodsParams::find($value['params_id']);
|
||||
if ($seller_detail['type'] == 'MEMBER' && $user->identity_id < 1) {
|
||||
$params->price = $params->original;
|
||||
}
|
||||
array_push($items[$kk], new OrderDetail(['goods' => $params, 'number' => $value['number']]));
|
||||
}
|
||||
|
||||
$express_type[$kk] = isset($seller_detail['express_type']) ? $seller_detail['express_type'] : 1;
|
||||
$seller_detail['freight'] = 0;
|
||||
$this->orderid = \Orders::create(Auth::id(), $seller_detail['seller_id'], $seller_detail['type'], $items[$kk], $express_type[$kk], $address, $request->remark, null, $score_order[$kk], $seller_detail['freight'], $card_id);
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
Session::forget('items_store');
|
||||
Session::forget('item');
|
||||
|
||||
return $this->success('订单创建成功', route('pay.order', $this->orderid));
|
||||
|
||||
} catch (\Exception $e) {
|
||||
return $this->error('订单创建失败' . $e->getmessage());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public function sign($orderid)
|
||||
{
|
||||
$order = Order::where('orderid', $orderid)->firstOrFail();
|
||||
try {
|
||||
$order->signin();
|
||||
return $this->success('签收成功', route('orders.signed'));
|
||||
} catch (\Exception $e) {
|
||||
return $this->error('签收失败' . $e->getmessage());
|
||||
}
|
||||
}
|
||||
|
||||
public function delete($orderid)
|
||||
{
|
||||
$order = Order::where('orderid', $orderid)->firstOrFail();
|
||||
try {
|
||||
$order->close();
|
||||
return $this->success('取消订单成功');
|
||||
} catch (\Exception $e) {
|
||||
return $this->error('取消订单失败' . $e->getmessage());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
81
app/Http/Controllers/PayController.php
Normal file
81
app/Http/Controllers/PayController.php
Normal file
@@ -0,0 +1,81 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\Card;
|
||||
use App\Models\Payment;
|
||||
use Illuminate\Http\Request;
|
||||
use RuLong\Order\Models\Order;
|
||||
|
||||
class PayController extends Controller
|
||||
{
|
||||
public function __construct(Request $request)
|
||||
{
|
||||
$this->middleware('auth');
|
||||
}
|
||||
|
||||
private function getpayOrder(Order $order, $type)
|
||||
{
|
||||
$payOrder = Payment::create([
|
||||
'order_id' => $order->id,
|
||||
'type' => $type,
|
||||
'amount' => $order->total - $order->score,
|
||||
]);
|
||||
return $payOrder;
|
||||
}
|
||||
|
||||
public function order(Request $request, $orderid)
|
||||
{
|
||||
$order = Order::where('orderid', $orderid)->findOrFail();
|
||||
return view('pay.order', compact('order'));
|
||||
}
|
||||
|
||||
/**
|
||||
* 微信支付
|
||||
* @param Request $request [description]
|
||||
* @param [type] $orderid [description]
|
||||
* @return [type] [description]
|
||||
*/
|
||||
public function wechat(Request $request, $orderid)
|
||||
{
|
||||
$order = Order::where('orderid', $orderid)->firstOrFail();
|
||||
$openid = $order->user->openid;
|
||||
|
||||
$amount = $order->amount - $order->score;
|
||||
|
||||
$payOrder = $this->getpayOrder($order, 'WECHAT');
|
||||
if ($amount != $payOrder->amount) {
|
||||
$payOrder->amount = $amount;
|
||||
$payOrder->save();
|
||||
}
|
||||
|
||||
if ($order->card_id) {
|
||||
$card = Card::find($order->card_id);
|
||||
if ($card && in_array($card->status, [0, 5])) {
|
||||
return $this->error('提货卡被禁用或被使用');
|
||||
}
|
||||
}
|
||||
|
||||
$app = app('wechat.payment');
|
||||
$amount = $payOrder->amount;
|
||||
if (config('pick.DEBUG')) {
|
||||
$amount = 0.01;
|
||||
}
|
||||
$result = $app->order->unify([
|
||||
'body' => '商城订单',
|
||||
'out_trade_no' => $payOrder->trade_no,
|
||||
'total_fee' => $amount * 100,
|
||||
'notify_url' => route('notify.payment'),
|
||||
'trade_type' => 'JSAPI',
|
||||
'openid' => $openid,
|
||||
]);
|
||||
|
||||
if ($result['return_code'] == 'SUCCESS' && isset($result['prepay_id'])) {
|
||||
$json = $app->jssdk->bridgeConfig($result['prepay_id']);
|
||||
return $this->success($json);
|
||||
} else {
|
||||
return $this->error($result['return_msg']);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
213
app/Http/Controllers/PickController.php
Normal file
213
app/Http/Controllers/PickController.php
Normal file
@@ -0,0 +1,213 @@
|
||||
<?php
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\Advert;
|
||||
use App\Models\Card;
|
||||
use App\Models\Goods;
|
||||
use App\Models\Mobile;
|
||||
use Auth;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use RuLong\Order\Models\OrderDetail;
|
||||
|
||||
/**
|
||||
* 提货商城
|
||||
*/
|
||||
class PickController extends Controller
|
||||
{
|
||||
|
||||
public $orderid;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
view()->share('nav', 2);
|
||||
view()->share('app_title', '提货商城');
|
||||
}
|
||||
|
||||
public function index(Request $request)
|
||||
{
|
||||
$area = $this->getDefault('area');
|
||||
|
||||
$this->setSearchValue($request);
|
||||
$pick_search = session('pick_search');
|
||||
$number = $pick_search['number'];
|
||||
$operator = $pick_search['operator'];
|
||||
$begin = $pick_search['begin'];
|
||||
$type = $pick_search['type'];
|
||||
$adverts = Advert::where('channel', 'pick')->orderBy('sort', 'asc')->take(5)->get(); //banner
|
||||
|
||||
$lists = Mobile::where('status', 1)
|
||||
->when($number, function ($q) use ($number) {
|
||||
$q->where('number', 'like', "%{$number}");
|
||||
})
|
||||
->when($operator, function ($q) use ($operator) {
|
||||
$q->where('operator', $operator);
|
||||
})
|
||||
->when($area->sn, function ($q) use ($area) {
|
||||
$q->where('city_sn', $area->sn);
|
||||
})
|
||||
->when($begin, function ($q) use ($begin) {
|
||||
$q->where('begin', $begin);
|
||||
})
|
||||
->when($type, function ($q) use ($type) {
|
||||
$q->where('type', $type);
|
||||
})
|
||||
->inRandomOrder()
|
||||
->take(6)
|
||||
->get();
|
||||
|
||||
if ($request->isMethod('POST')) {
|
||||
if ($lists->isNotEmpty()) {
|
||||
$html = response(view('pick.mobile', compact('lists')))->getContent();
|
||||
return $this->success($html);
|
||||
} else {
|
||||
return $this->error('没有数据了');
|
||||
}
|
||||
} else {
|
||||
view()->share('user', Auth::user());
|
||||
return view('pick.index', compact('lists', 'adverts', 'area', 'number'));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public function setSearchValue($request)
|
||||
{
|
||||
$pick_search = [
|
||||
'number' => '',
|
||||
'operator' => [],
|
||||
'begin' => [],
|
||||
'type' => [],
|
||||
];
|
||||
foreach ($request->all() as $key => $value) {
|
||||
$pick_search[$key] = $value;
|
||||
}
|
||||
|
||||
session(['pick_search' => $pick_search]);
|
||||
}
|
||||
|
||||
//更多
|
||||
public function lists(Request $request)
|
||||
{
|
||||
$adverts = Advert::where('channel', 'pick')->orderBy('sort', 'asc')->take(5)->get(); //banner
|
||||
$area = $this->getDefault('area');
|
||||
$this->setSearchValue($request);
|
||||
$pick_search = session('pick_search');
|
||||
|
||||
$number = $pick_search['number'];
|
||||
$operator = $pick_search['operator'];
|
||||
$begin = $pick_search['begin'];
|
||||
$type = $pick_search['type'];
|
||||
|
||||
$lists = Mobile::where('status', 1)
|
||||
->when($number, function ($q) use ($number) {
|
||||
$q->where('number', 'like', "%{$number}");
|
||||
})
|
||||
->when($area->sn, function ($q) use ($area) {
|
||||
$q->where('city_sn', $area->sn);
|
||||
})
|
||||
->when($operator, function ($q) use ($operator) {
|
||||
$q->whereIn('operator', $operator);
|
||||
})
|
||||
->when($begin, function ($q) use ($begin) {
|
||||
$q->whereIn('begin', $begin);
|
||||
})
|
||||
->when($type, function ($q) use ($type) {
|
||||
$q->whereIn('type', $type);
|
||||
})
|
||||
->paginate();
|
||||
|
||||
if ($request->isMethod('AJAX')) {
|
||||
$html = response(view('pick.mobile', compact('lists')))->getContent();
|
||||
return $this->success($html);
|
||||
} else {
|
||||
return view('pick.lists', compact('lists', 'adverts', 'number', 'area'));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//领取手机号
|
||||
public function receiveMobile(Request $request)
|
||||
{
|
||||
$id = $request->mobile_id;
|
||||
$mobile = Mobile::find($id);
|
||||
$res = $this->checkCard($request);
|
||||
if ($res['status'] != 'ERROR') {
|
||||
$card = $res['card'];
|
||||
} else {
|
||||
$url = $res['redirect'] ?? '';
|
||||
return $this->error($res['message'], $url);
|
||||
}
|
||||
|
||||
try {
|
||||
DB::transaction(function () use ($mobile, $card) {
|
||||
$data = new OrderDetail(['goods' => $mobile, 'number' => 1]);
|
||||
$this->orderid = \Orders::create(Auth::id(), 0, 'PICK', [0 => $data], 0, null, '', null, 0, 0, $card->id);
|
||||
});
|
||||
return $this->success('订单创建成功', route('pay.order', $this->orderid));
|
||||
} catch (\Exception $e) {
|
||||
return $this->error('订单创建失败' . $e->getmessage());
|
||||
}
|
||||
}
|
||||
|
||||
//领取商品
|
||||
public function receiveGoods(Request $request)
|
||||
{
|
||||
$params_id = $request->params_id;
|
||||
$params = Mobile::find($params_id);
|
||||
$res = $this->checkCard($request);
|
||||
|
||||
if ($res['status'] != 'ERROR') {
|
||||
$card = $res['card'];
|
||||
} else {
|
||||
return $this->error($res['message'], $res['redirect']);
|
||||
}
|
||||
|
||||
$data['details'][0][1]['params_id'] = $params_id;
|
||||
$data['details'][0][1]['number'] = 1;
|
||||
|
||||
$data['item']['id'] = 0;
|
||||
$data['item']['type'] = 'PICK';
|
||||
$data['item']['card_id'] = $card->id;
|
||||
return $this->success('领取成功', route('orders.create', $data));
|
||||
}
|
||||
|
||||
//校验提货卡
|
||||
public function checkCard($request)
|
||||
{
|
||||
if (!Auth::user()) {
|
||||
return $this->error('请登录后进行此操作', route('login', ['callback' => url()->current()]));
|
||||
}
|
||||
|
||||
if (count(array_filter($request->pass)) != 4) {
|
||||
return $this->error('卡密必须输入完整');
|
||||
}
|
||||
|
||||
$pass = implode('-', $request->pass);
|
||||
|
||||
$card = Card::where('pass', $pass)->first();
|
||||
if (!$card) {
|
||||
return ['status' => 'ERROR', 'message' => '卡密不正确'];
|
||||
} elseif ($card->status == 5 || empty($card->user_id)) {
|
||||
return ['status' => 'ERROR', 'message' => '卡号状态不对'];
|
||||
}
|
||||
|
||||
return ['status' => 'SUCCESS', 'card' => $card];
|
||||
|
||||
}
|
||||
|
||||
//提货商品详情
|
||||
public function detail(Goods $good)
|
||||
{
|
||||
$params = $good->params()->where('stock', '>', 0)->orderBy('price', 'asc')->get();
|
||||
$first = $good->params()->orderBy('original', 'asc')->first();
|
||||
$user = Auth::user();
|
||||
return view('pick.detail', compact('good', 'params', 'user', 'first'));
|
||||
}
|
||||
|
||||
public function search()
|
||||
{
|
||||
$pick_search = session('pick_search');
|
||||
return view('pick.search', compact('pick_search'));
|
||||
}
|
||||
|
||||
}
|
||||
160
app/Http/Controllers/SettingsController.php
Normal file
160
app/Http/Controllers/SettingsController.php
Normal file
@@ -0,0 +1,160 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\Param;
|
||||
use App\User;
|
||||
use Auth;
|
||||
use Hash;
|
||||
use Illuminate\Http\Request;
|
||||
use RuLong\Sms\Models\Sms as SmsModel;
|
||||
use Session;
|
||||
use Validator;
|
||||
use \Illuminate\Support\Facades\URL;
|
||||
|
||||
class SettingsController extends Controller
|
||||
{
|
||||
public function __construct(Request $request)
|
||||
{
|
||||
$this->middleware('auth');
|
||||
view()->share('nav', 4);
|
||||
}
|
||||
|
||||
public function index(Request $request)
|
||||
{
|
||||
$user = Auth::user();
|
||||
return view('settings.index', compact('user'));
|
||||
}
|
||||
|
||||
public function mobile(Request $request)
|
||||
{
|
||||
if ($request->isMethod('POST')) {
|
||||
|
||||
$validator = Validator::make($request->all(), [
|
||||
'username' => 'required|mobile|unique:users',
|
||||
'code' => ['required', 'size:4', function ($attribute, $value, $fail) use ($request) {
|
||||
if ($value != SmsModel::where('mobile', $request->username)->where('used', 0)->latest()->value('code')) {
|
||||
return $fail('验证码不正确');
|
||||
}
|
||||
}],
|
||||
], [
|
||||
'username.required' => '手机号码必须填写',
|
||||
'username.mobile' => '手机号码格式不正确',
|
||||
'username.unique' => '手机号码已经绑定',
|
||||
'code.required' => '验证码必须填写',
|
||||
'code.size' => '验证码长度为:size位',
|
||||
]);
|
||||
|
||||
if ($validator->fails()) {
|
||||
return $this->error($validator->errors()->first());
|
||||
}
|
||||
|
||||
$username = $request->username;
|
||||
|
||||
$user = Auth::user();
|
||||
|
||||
$user->username = $username;
|
||||
$user->save();
|
||||
|
||||
return $this->success('手机号修改成功', route('user.index'));
|
||||
} else {
|
||||
return view('settings.mobile');
|
||||
}
|
||||
}
|
||||
|
||||
public function password(Request $request)
|
||||
{
|
||||
if ($request->isMethod('post')) {
|
||||
$validator = Validator::make($request->all(), [
|
||||
'oldpassword' => ['required', function ($attribute, $value, $fail) {
|
||||
if (!Hash::check($value, Auth::user()->password)) {
|
||||
return $fail('原密码不正确');
|
||||
}
|
||||
}],
|
||||
'password' => 'required|between:6,32|confirmed',
|
||||
'password_confirmation' => 'required|between:6,32',
|
||||
], [
|
||||
'oldpassword.required' => '原密码必须填写',
|
||||
'password.required' => '新密码必须填写',
|
||||
'password.between' => '新密码有误',
|
||||
'password.confirmed' => '确认密码与新密码不一致',
|
||||
'password_confirmation.required' => '确认密码必须填写',
|
||||
'password_confirmation.between' => '确认密码有误',
|
||||
]);
|
||||
|
||||
if ($validator->fails()) {
|
||||
return $this->error($validator->errors()->first());
|
||||
}
|
||||
|
||||
$user = Auth::user();
|
||||
$user->password = $request->password;
|
||||
if ($user->save()) {
|
||||
return $this->success('密码修改成功', route('user.index'));
|
||||
} else {
|
||||
return $this->error('密码修改失败');
|
||||
}
|
||||
|
||||
} else {
|
||||
return view('settings.password');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 找回支付密码
|
||||
* @Author:<C.Jason>
|
||||
* @Date:2018-11-07T13:46:34+0800
|
||||
* @param Request $request
|
||||
*/
|
||||
public function forgot(Request $request)
|
||||
{
|
||||
if ($request->isMethod('POST')) {
|
||||
$validator = Validator::make($request->all(), [
|
||||
'mobile' => 'required|mobile|exists:users',
|
||||
'code' => 'required|sms_check:mobile,FORGOT',
|
||||
], [
|
||||
'mobile.required' => '手机号码必须填写',
|
||||
'mobile.mobile' => '手机号码格式不正确',
|
||||
'mobile.exists' => '手机号码不存在',
|
||||
'code.required' => '验证码必须填写',
|
||||
'code.sms_check' => '验证码不正确',
|
||||
]);
|
||||
if ($validator->fails()) {
|
||||
return $this->error($validator->errors()->first());
|
||||
}
|
||||
$request->session()->put('reset_mobile', $request->mobile);
|
||||
return $this->success('身份验证成功', Url::temporarySignedRoute('setting.forgot.reset', now()->addHour()));
|
||||
} else {
|
||||
return view('settings.forgot');
|
||||
}
|
||||
}
|
||||
|
||||
//修改昵称
|
||||
public function nickname(Request $request)
|
||||
{
|
||||
$user = Auth::user();
|
||||
if ($request->isMethod('POST')) {
|
||||
$validator = Validator::make($request->all(), [
|
||||
'nickname' => 'required',
|
||||
], [
|
||||
'nickname.required' => '昵称必须填写',
|
||||
]);
|
||||
|
||||
if ($validator->fails()) {
|
||||
return $this->error($validator->errors()->first());
|
||||
}
|
||||
|
||||
$result = $user->info()->update([
|
||||
'nickname' => $request->nickname,
|
||||
]);
|
||||
if ($result) {
|
||||
return $this->success('信息更新成功', route('user.index'));
|
||||
} else {
|
||||
return $this->error('信息更新失败');
|
||||
}
|
||||
|
||||
} else {
|
||||
return view('settings.nickname', compact('user'));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
30
app/Http/Controllers/TestController.php
Normal file
30
app/Http/Controllers/TestController.php
Normal file
@@ -0,0 +1,30 @@
|
||||
<?php
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\UpgradePayment;
|
||||
use App\Models\User;
|
||||
|
||||
class TestController extends Controller
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
|
||||
$user = User::find(3);
|
||||
$data = [
|
||||
'username' => '15663876871',
|
||||
'password' => '161723',
|
||||
];
|
||||
$res = $user->fill($data);
|
||||
$user->save();
|
||||
|
||||
dd($res);
|
||||
die();
|
||||
$upgradepayment = UpgradePayment::find(16);
|
||||
$user = $upgradepayment->user;
|
||||
$user->activationd_at = now();
|
||||
$user->save();
|
||||
die();
|
||||
$upgradepayment->user->activationd_at = now();
|
||||
$upgradepayment->save();
|
||||
}
|
||||
}
|
||||
106
app/Http/Controllers/UpgradeController.php
Normal file
106
app/Http/Controllers/UpgradeController.php
Normal file
@@ -0,0 +1,106 @@
|
||||
<?php
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\UpgradePayment;
|
||||
use App\User;
|
||||
use Auth;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\View;
|
||||
use RuLong\Order\Models\Order;
|
||||
|
||||
/**
|
||||
* 用户升级
|
||||
*/
|
||||
class UpgradeController extends Controller
|
||||
{
|
||||
public function __construct(Request $request)
|
||||
{
|
||||
$this->middleware('auth');
|
||||
View::share('nav', 4);
|
||||
}
|
||||
|
||||
// 升级vip
|
||||
public function vip(Request $request)
|
||||
{
|
||||
if (Auth::user()->identity->identity_id > 0) {
|
||||
// return redirect()->route('user.index');
|
||||
}
|
||||
return view('upgrade.vip');
|
||||
}
|
||||
|
||||
//升级代理商
|
||||
public function agent(Request $request)
|
||||
{
|
||||
if (!Auth::user()->username) {
|
||||
return redirect()->route('login');
|
||||
}
|
||||
if (Auth::user()->identity->identity_id > 1) {
|
||||
return redirect()->route('Agent.login');
|
||||
}
|
||||
|
||||
return view('upgrade.agent');
|
||||
}
|
||||
|
||||
public function wechat(Request $request)
|
||||
{
|
||||
$user = Auth::user();
|
||||
$type = $request->type ?? 'vip';
|
||||
$upgradeOrder = UpgradePayment::where(['user_id' => $user->id, 'type' => $type, 'state' => 'SUCCESS'])->first();
|
||||
if ($upgradeOrder) {
|
||||
$url = route('user.index');
|
||||
if ($type == 'agent') {
|
||||
$url = route('Agent.login');
|
||||
}
|
||||
return $this->error('您已经升级成功', $url);
|
||||
}
|
||||
|
||||
$upgradeOrder = $this->getpayOrder($type);
|
||||
$app = app('wechat.payment');
|
||||
$amount = $upgradeOrder->amount;
|
||||
if (config('pick.DEBUG')) {
|
||||
$amount = 0.01;
|
||||
}
|
||||
$result = $app->order->unify([
|
||||
'body' => $type == 'vip' ? '开通会员' : '开通代理商',
|
||||
'out_trade_no' => $upgradeOrder->trade_no,
|
||||
'total_fee' => $amount * 100,
|
||||
'notify_url' => route('notify.upgrade'),
|
||||
'trade_type' => 'JSAPI',
|
||||
'openid' => $user->openid,
|
||||
]);
|
||||
if ($result['return_code'] == 'SUCCESS' && isset($result['prepay_id'])) {
|
||||
$json = $app->jssdk->bridgeConfig($result['prepay_id']);
|
||||
return $this->success($json);
|
||||
} else {
|
||||
return $this->error($result['return_msg'] . ($result['err_code_des'] ?? ''));
|
||||
}
|
||||
}
|
||||
|
||||
private function getpayOrder($type)
|
||||
{
|
||||
$amount = 399;
|
||||
if ($type == 'vip') {
|
||||
$amount = config('vip_price');
|
||||
}
|
||||
|
||||
if ($type == 'agent') {
|
||||
$amount = config('agent_price');
|
||||
}
|
||||
|
||||
$upgradeOrder = UpgradePayment::create([
|
||||
'user_id' => Auth::id(),
|
||||
'type' => $type,
|
||||
'pay_type' => 'WECHAT',
|
||||
'amount' => $amount,
|
||||
'total' => $amount,
|
||||
]);
|
||||
|
||||
return $upgradeOrder;
|
||||
}
|
||||
|
||||
public function hasAgent()
|
||||
{
|
||||
return view('upgrade.hasagent');
|
||||
}
|
||||
|
||||
}
|
||||
33
app/Http/Controllers/UserController.php
Normal file
33
app/Http/Controllers/UserController.php
Normal file
@@ -0,0 +1,33 @@
|
||||
<?php
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\User;
|
||||
use Auth;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\View;
|
||||
use RuLong\Order\Models\Order;
|
||||
|
||||
class UserController extends Controller
|
||||
{
|
||||
public function __construct(Request $request)
|
||||
{
|
||||
$this->middleware('auth');
|
||||
view()->share('nav', 4);
|
||||
view()->share('app_title', '个人中心');
|
||||
}
|
||||
|
||||
public function index()
|
||||
{
|
||||
$user = Auth::user();
|
||||
if (!$user->username) {
|
||||
return redirect()->route('logout');
|
||||
}
|
||||
$orderCount = [
|
||||
'unpay' => Order::Unpaid()->where('user_id', $user->id)->count(),
|
||||
'paid' => Order::UnDeliver()->where('user_id', $user->id)->count(),
|
||||
'delivered' => Order::Delivered()->where('user_id', $user->id)->count(),
|
||||
];
|
||||
return view('user.index', compact('user', 'orderCount'));
|
||||
}
|
||||
|
||||
}
|
||||
69
app/Http/Controllers/WeChatController.php
Normal file
69
app/Http/Controllers/WeChatController.php
Normal file
@@ -0,0 +1,69 @@
|
||||
<?php
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Http\WechatHandlers\EventMessageHandler;
|
||||
use App\Http\WechatHandlers\FileMessageHandler;
|
||||
use App\Http\WechatHandlers\ImageMessageHandler;
|
||||
use App\Http\WechatHandlers\LinkMessageHandler;
|
||||
use App\Http\WechatHandlers\LocationMessageHandler;
|
||||
use App\Http\WechatHandlers\ShortVideoMessageHandler;
|
||||
use App\Http\WechatHandlers\TextMessageHandler;
|
||||
use App\Http\WechatHandlers\TransferMessageHandler;
|
||||
use App\Http\WechatHandlers\VideoMessageHandler;
|
||||
use App\Http\WechatHandlers\VoiceMessageHandler;
|
||||
use EasyWeChat\Kernel\Messages\Message;
|
||||
use Overtrue\LaravelWeChat\Controllers\Controller;
|
||||
|
||||
class WeChatController extends Controller
|
||||
{
|
||||
|
||||
public function serve()
|
||||
{
|
||||
$app = app('wechat.official_account');
|
||||
$app->server->push(TextMessageHandler::class, Message::TEXT);
|
||||
$app->server->push(ImageMessageHandler::class, Message::IMAGE);
|
||||
$app->server->push(VoiceMessageHandler::class, Message::VOICE);
|
||||
$app->server->push(VideoMessageHandler::class, Message::VIDEO);
|
||||
$app->server->push(ShortVideoMessageHandler::class, Message::SHORT_VIDEO);
|
||||
$app->server->push(LocationMessageHandler::class, Message::LOCATION);
|
||||
$app->server->push(LinkMessageHandler::class, Message::LINK);
|
||||
$app->server->push(FileMessageHandler::class, Message::FILE);
|
||||
$app->server->push(EventMessageHandler::class, Message::EVENT);
|
||||
$app->server->push(TransferMessageHandler::class, Message::TRANSFER);
|
||||
return $app->server->serve();
|
||||
}
|
||||
|
||||
public function publish()
|
||||
{
|
||||
$app = app('wechat.official_account');
|
||||
$buttons = [
|
||||
[
|
||||
"name" => '会员商城',
|
||||
"type" => "view",
|
||||
"url" => route('index'),
|
||||
],
|
||||
[
|
||||
"name" => '提货专区',
|
||||
"type" => "view",
|
||||
"url" => route('pick.index'),
|
||||
],
|
||||
[
|
||||
"name" => "代理商入口",
|
||||
"sub_button" => [
|
||||
[
|
||||
"type" => "view",
|
||||
"name" => "成为代理商",
|
||||
"url" => route('upgrade.agent'),
|
||||
],
|
||||
[
|
||||
"type" => "view",
|
||||
"name" => "代理商登录平台",
|
||||
"url" => route('Agent.login'),
|
||||
],
|
||||
],
|
||||
],
|
||||
];
|
||||
$res = $app->menu->create($buttons);
|
||||
return $res;
|
||||
}
|
||||
}
|
||||
79
app/Http/Kernel.php
Normal file
79
app/Http/Kernel.php
Normal file
@@ -0,0 +1,79 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http;
|
||||
|
||||
use Illuminate\Foundation\Http\Kernel as HttpKernel;
|
||||
|
||||
class Kernel extends HttpKernel
|
||||
{
|
||||
/**
|
||||
* The application's global HTTP middleware stack.
|
||||
*
|
||||
* These middleware are run during every request to your application.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $middleware = [
|
||||
\App\Http\Middleware\TrustProxies::class,
|
||||
\App\Http\Middleware\CheckForMaintenanceMode::class,
|
||||
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
|
||||
\App\Http\Middleware\TrimStrings::class,
|
||||
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
|
||||
];
|
||||
|
||||
/**
|
||||
* The application's route middleware groups.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $middlewareGroups = [
|
||||
'web' => [
|
||||
\App\Http\Middleware\EncryptCookies::class,
|
||||
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
|
||||
\Illuminate\Session\Middleware\StartSession::class,
|
||||
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
|
||||
\App\Http\Middleware\VerifyCsrfToken::class,
|
||||
\Illuminate\Routing\Middleware\SubstituteBindings::class,
|
||||
],
|
||||
|
||||
'api' => [
|
||||
'throttle:60,1',
|
||||
'bindings',
|
||||
],
|
||||
];
|
||||
|
||||
/**
|
||||
* The application's route middleware.
|
||||
*
|
||||
* These middleware may be assigned to groups or used individually.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $routeMiddleware = [
|
||||
'auth' => \App\Http\Middleware\Authenticate::class,
|
||||
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
|
||||
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
|
||||
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
|
||||
'can' => \Illuminate\Auth\Middleware\Authorize::class,
|
||||
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
|
||||
'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
|
||||
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
|
||||
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
|
||||
];
|
||||
|
||||
/**
|
||||
* The priority-sorted list of middleware.
|
||||
*
|
||||
* This forces non-global middleware to always be in the given order.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $middlewarePriority = [
|
||||
\Illuminate\Session\Middleware\StartSession::class,
|
||||
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
|
||||
\App\Http\Middleware\Authenticate::class,
|
||||
\Illuminate\Session\Middleware\AuthenticateSession::class,
|
||||
\Illuminate\Routing\Middleware\SubstituteBindings::class,
|
||||
\Illuminate\Auth\Middleware\Authorize::class,
|
||||
];
|
||||
}
|
||||
22
app/Http/Middleware/Authenticate.php
Normal file
22
app/Http/Middleware/Authenticate.php
Normal file
@@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Middleware;
|
||||
|
||||
use Illuminate\Auth\Middleware\Authenticate as Middleware;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
|
||||
class Authenticate extends Middleware
|
||||
{
|
||||
/**
|
||||
* Get the path the user should be redirected to when they are not authenticated.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @return string
|
||||
*/
|
||||
protected function redirectTo($request)
|
||||
{
|
||||
if (!$request->expectsJson()) {
|
||||
return route('login', ['r' => $request->url()]);
|
||||
}
|
||||
}
|
||||
}
|
||||
17
app/Http/Middleware/CheckForMaintenanceMode.php
Normal file
17
app/Http/Middleware/CheckForMaintenanceMode.php
Normal file
@@ -0,0 +1,17 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Middleware;
|
||||
|
||||
use Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode as Middleware;
|
||||
|
||||
class CheckForMaintenanceMode extends Middleware
|
||||
{
|
||||
/**
|
||||
* The URIs that should be reachable while maintenance mode is enabled.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $except = [
|
||||
//
|
||||
];
|
||||
}
|
||||
17
app/Http/Middleware/EncryptCookies.php
Normal file
17
app/Http/Middleware/EncryptCookies.php
Normal file
@@ -0,0 +1,17 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Middleware;
|
||||
|
||||
use Illuminate\Cookie\Middleware\EncryptCookies as Middleware;
|
||||
|
||||
class EncryptCookies extends Middleware
|
||||
{
|
||||
/**
|
||||
* The names of the cookies that should not be encrypted.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $except = [
|
||||
//
|
||||
];
|
||||
}
|
||||
27
app/Http/Middleware/RedirectIfAuthenticated.php
Normal file
27
app/Http/Middleware/RedirectIfAuthenticated.php
Normal file
@@ -0,0 +1,27 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Middleware;
|
||||
|
||||
use Closure;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
|
||||
class RedirectIfAuthenticated
|
||||
{
|
||||
/**
|
||||
* Handle an incoming request.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param \Closure $next
|
||||
* @param string|null $guard
|
||||
* @return mixed
|
||||
*/
|
||||
public function handle($request, Closure $next, $guard = null)
|
||||
{
|
||||
|
||||
if (Auth::guard($guard)->check()) {
|
||||
return redirect('/');
|
||||
}
|
||||
|
||||
return $next($request);
|
||||
}
|
||||
}
|
||||
18
app/Http/Middleware/TrimStrings.php
Normal file
18
app/Http/Middleware/TrimStrings.php
Normal file
@@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Middleware;
|
||||
|
||||
use Illuminate\Foundation\Http\Middleware\TrimStrings as Middleware;
|
||||
|
||||
class TrimStrings extends Middleware
|
||||
{
|
||||
/**
|
||||
* The names of the attributes that should not be trimmed.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $except = [
|
||||
'password',
|
||||
'password_confirmation',
|
||||
];
|
||||
}
|
||||
23
app/Http/Middleware/TrustProxies.php
Normal file
23
app/Http/Middleware/TrustProxies.php
Normal file
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Middleware;
|
||||
|
||||
use Illuminate\Http\Request;
|
||||
use Fideloper\Proxy\TrustProxies as Middleware;
|
||||
|
||||
class TrustProxies extends Middleware
|
||||
{
|
||||
/**
|
||||
* The trusted proxies for this application.
|
||||
*
|
||||
* @var array|string
|
||||
*/
|
||||
protected $proxies;
|
||||
|
||||
/**
|
||||
* The headers that should be used to detect proxies.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
protected $headers = Request::HEADER_X_FORWARDED_ALL;
|
||||
}
|
||||
24
app/Http/Middleware/VerifyCsrfToken.php
Normal file
24
app/Http/Middleware/VerifyCsrfToken.php
Normal file
@@ -0,0 +1,24 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Middleware;
|
||||
|
||||
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;
|
||||
|
||||
class VerifyCsrfToken extends Middleware
|
||||
{
|
||||
/**
|
||||
* Indicates whether the XSRF-TOKEN cookie should be set on the response.
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
protected $addHttpCookie = true;
|
||||
|
||||
/**
|
||||
* The URIs that should be excluded from CSRF verification.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $except = [
|
||||
'wechat', 'notify/payment', 'payments/wechat', 'notify/upgrade', 'agent/notify/payment', 'agent/payments/wechat',
|
||||
];
|
||||
}
|
||||
109
app/Http/WechatHandlers/EventMessageHandler.php
Normal file
109
app/Http/WechatHandlers/EventMessageHandler.php
Normal file
@@ -0,0 +1,109 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\WechatHandlers;
|
||||
|
||||
use App\Models\User;
|
||||
use EasyWeChat\Kernel\Contracts\EventHandlerInterface;
|
||||
use EasyWeChat\Kernel\Messages\Text;
|
||||
|
||||
class EventMessageHandler implements EventHandlerInterface
|
||||
{
|
||||
|
||||
private $payload;
|
||||
|
||||
public function handle($payload = null)
|
||||
{
|
||||
if (method_exists($this, $payload['Event'])) {
|
||||
$this->payload = $payload;
|
||||
return call_user_func_array([$this, $payload['Event']], []);
|
||||
} else {
|
||||
return '暂不支持的消息类型';
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 扫码事件
|
||||
* @Author:<C.Jason>
|
||||
* @Date:2018-11-12T16:28:19+0800
|
||||
*/
|
||||
private function SCAN()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* 主菜单点击
|
||||
* @Author:<C.Jason>
|
||||
* @Date:2018-11-12T16:28:06+0800
|
||||
*/
|
||||
private function CLICK()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 关注事件
|
||||
* @Author:<C.Jason>
|
||||
* @Date:2018-11-12T16:27:51+0800
|
||||
*/
|
||||
private function subscribe()
|
||||
{
|
||||
$app = app('wechat.official_account');
|
||||
$user = $app->user->get($this->payload['FromUserName']);
|
||||
|
||||
// 先查找用户是否存在,不存在再注册
|
||||
$existUser = User::where('openid', $this->payload['FromUserName'])->first();
|
||||
if ($existUser) {
|
||||
$existUser->update([
|
||||
'info' => [
|
||||
'headimgurl' => $user['headimgurl'],
|
||||
'sex' => $user['sex'],
|
||||
'country' => $user['country'],
|
||||
'province' => $user['province'],
|
||||
'city' => $user['city'],
|
||||
'subscribe_at' => $user['subscribe_time'],
|
||||
'subscribe_scene' => $user['subscribe_scene'],
|
||||
// 'qr_scene' => $user['qr_scene'],
|
||||
// 'qr_scene_str' => $user['qr_scene_str'],
|
||||
],
|
||||
]);
|
||||
|
||||
return $this->firstSubscribeMessage($existUser);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public function VIEW()
|
||||
{
|
||||
#Todo..
|
||||
}
|
||||
|
||||
public function LOCATION()
|
||||
{
|
||||
#Todo..
|
||||
}
|
||||
|
||||
/**
|
||||
* 取消关注事件
|
||||
* @Author:<Leady>
|
||||
* @Date:2018-12-12T13:44:54+0800
|
||||
* @return [type] [description]
|
||||
*/
|
||||
private function unsubscribe()
|
||||
{
|
||||
$existUser = User::where('openid', $this->payload['FromUserName'])->first();
|
||||
if ($existUser) {
|
||||
$existUser->update([
|
||||
'info' => [
|
||||
'subscribe_at' => null,
|
||||
// 'subscribe_scene' => null,
|
||||
],
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
private function firstSubscribeMessage($user)
|
||||
{
|
||||
$text = new Text('您好,欢迎关注连卡蝠');
|
||||
return $text;
|
||||
}
|
||||
}
|
||||
26
app/Http/WechatHandlers/FileMessageHandler.php
Normal file
26
app/Http/WechatHandlers/FileMessageHandler.php
Normal file
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\WechatHandlers;
|
||||
|
||||
use EasyWeChat\Kernel\Contracts\EventHandlerInterface;
|
||||
|
||||
class FileMessageHandler implements EventHandlerInterface
|
||||
{
|
||||
|
||||
public function handle($payload = null)
|
||||
{
|
||||
|
||||
$payload->ToUserName;
|
||||
$payload->FromUserName;
|
||||
$payload->CreateTime;
|
||||
$payload->MsgId;
|
||||
|
||||
$payload->Title;
|
||||
$payload->Description;
|
||||
$payload->FileKey;
|
||||
$payload->FileMd5;
|
||||
$payload->FileTotalLen;
|
||||
|
||||
return '文件消息';
|
||||
}
|
||||
}
|
||||
23
app/Http/WechatHandlers/ImageMessageHandler.php
Normal file
23
app/Http/WechatHandlers/ImageMessageHandler.php
Normal file
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\WechatHandlers;
|
||||
|
||||
use EasyWeChat\Kernel\Contracts\EventHandlerInterface;
|
||||
|
||||
class ImageMessageHandler implements EventHandlerInterface
|
||||
{
|
||||
|
||||
public function handle($payload = null)
|
||||
{
|
||||
|
||||
$payload->ToUserName;
|
||||
$payload->FromUserName;
|
||||
$payload->CreateTime;
|
||||
$payload->MsgId;
|
||||
|
||||
$payload->MediaId;
|
||||
$payload->PicUrl;
|
||||
|
||||
return '图片消息';
|
||||
}
|
||||
}
|
||||
24
app/Http/WechatHandlers/LinkMessageHandler.php
Normal file
24
app/Http/WechatHandlers/LinkMessageHandler.php
Normal file
@@ -0,0 +1,24 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\WechatHandlers;
|
||||
|
||||
use EasyWeChat\Kernel\Contracts\EventHandlerInterface;
|
||||
|
||||
class LinkMessageHandler implements EventHandlerInterface
|
||||
{
|
||||
|
||||
public function handle($payload = null)
|
||||
{
|
||||
|
||||
$payload->ToUserName;
|
||||
$payload->FromUserName;
|
||||
$payload->CreateTime;
|
||||
$payload->MsgId;
|
||||
|
||||
$payload->Title;
|
||||
$payload->Description;
|
||||
$payload->Url;
|
||||
|
||||
return '链接消息';
|
||||
}
|
||||
}
|
||||
24
app/Http/WechatHandlers/LocationMessageHandler.php
Normal file
24
app/Http/WechatHandlers/LocationMessageHandler.php
Normal file
@@ -0,0 +1,24 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\WechatHandlers;
|
||||
|
||||
use EasyWeChat\Kernel\Contracts\EventHandlerInterface;
|
||||
|
||||
class LocationMessageHandler implements EventHandlerInterface
|
||||
{
|
||||
|
||||
public function handle($payload = null)
|
||||
{
|
||||
|
||||
$payload->ToUserName;
|
||||
$payload->FromUserName;
|
||||
$payload->CreateTime;
|
||||
$payload->MsgId;
|
||||
|
||||
$payload->Latitude;
|
||||
$payload->Longitude;
|
||||
$payload->Precision;
|
||||
|
||||
return '上报位置消息';
|
||||
}
|
||||
}
|
||||
23
app/Http/WechatHandlers/ShortVideoMessageHandler.php
Normal file
23
app/Http/WechatHandlers/ShortVideoMessageHandler.php
Normal file
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\WechatHandlers;
|
||||
|
||||
use EasyWeChat\Kernel\Contracts\EventHandlerInterface;
|
||||
|
||||
class ShortVideoMessageHandler implements EventHandlerInterface
|
||||
{
|
||||
|
||||
public function handle($payload = null)
|
||||
{
|
||||
|
||||
$payload->ToUserName;
|
||||
$payload->FromUserName;
|
||||
$payload->CreateTime;
|
||||
$payload->MsgId;
|
||||
|
||||
$payload->MediaId;
|
||||
$payload->ThumbMediaId;
|
||||
|
||||
return '短视频消息';
|
||||
}
|
||||
}
|
||||
15
app/Http/WechatHandlers/TextMessageHandler.php
Normal file
15
app/Http/WechatHandlers/TextMessageHandler.php
Normal file
@@ -0,0 +1,15 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\WechatHandlers;
|
||||
|
||||
use EasyWeChat\Kernel\Contracts\EventHandlerInterface;
|
||||
|
||||
class TextMessageHandler implements EventHandlerInterface
|
||||
{
|
||||
|
||||
public function handle($payload = null)
|
||||
{
|
||||
return '您的留言已经收到';
|
||||
return $payload->Content;
|
||||
}
|
||||
}
|
||||
14
app/Http/WechatHandlers/TransferMessageHandler.php
Normal file
14
app/Http/WechatHandlers/TransferMessageHandler.php
Normal file
@@ -0,0 +1,14 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\WechatHandlers;
|
||||
|
||||
use EasyWeChat\Kernel\Contracts\EventHandlerInterface;
|
||||
|
||||
class TransferMessageHandler implements EventHandlerInterface
|
||||
{
|
||||
|
||||
public function handle($payload = null)
|
||||
{
|
||||
return '客服消息' . json_encode($payload);
|
||||
}
|
||||
}
|
||||
23
app/Http/WechatHandlers/VideoMessageHandler.php
Normal file
23
app/Http/WechatHandlers/VideoMessageHandler.php
Normal file
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\WechatHandlers;
|
||||
|
||||
use EasyWeChat\Kernel\Contracts\EventHandlerInterface;
|
||||
|
||||
class VideoMessageHandler implements EventHandlerInterface
|
||||
{
|
||||
|
||||
public function handle($payload = null)
|
||||
{
|
||||
|
||||
$payload->ToUserName;
|
||||
$payload->FromUserName;
|
||||
$payload->CreateTime;
|
||||
$payload->MsgId;
|
||||
|
||||
$payload->MediaId;
|
||||
$payload->ThumbMediaId;
|
||||
|
||||
return '视频消息';
|
||||
}
|
||||
}
|
||||
24
app/Http/WechatHandlers/VoiceMessageHandler.php
Normal file
24
app/Http/WechatHandlers/VoiceMessageHandler.php
Normal file
@@ -0,0 +1,24 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\WechatHandlers;
|
||||
|
||||
use EasyWeChat\Kernel\Contracts\EventHandlerInterface;
|
||||
|
||||
class VoiceMessageHandler implements EventHandlerInterface
|
||||
{
|
||||
|
||||
public function handle($payload = null)
|
||||
{
|
||||
|
||||
$payload->ToUserName;
|
||||
$payload->FromUserName;
|
||||
$payload->CreateTime;
|
||||
$payload->MsgId;
|
||||
|
||||
$payload->MediaId;
|
||||
$payload->Format;
|
||||
$payload->Recognition;
|
||||
|
||||
return '语音消息';
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user