1
0

提交代码

This commit is contained in:
2020-08-06 14:45:56 +08:00
commit 9d0d5f4be9
361 changed files with 36445 additions and 0 deletions

40
.env Normal file
View File

@@ -0,0 +1,40 @@
APP_NAME=连卡蝠
APP_ENV=local
APP_KEY=base64:CgU3ufbX61GpKpG9aW1ySTrBLjQYOzbvVJ5CY620dKA=
APP_DEBUG=true
APP_URL=http://www.lkafu.com
LOG_CHANNEL=daily
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=lkafu
DB_USERNAME=root
DB_PASSWORD=Anetadmin1
BROADCAST_DRIVER=log
CACHE_DRIVER=file
QUEUE_CONNECTION=database
SESSION_DRIVER=file
SESSION_LIFETIME=120
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
WECHAT_OFFICIAL_ACCOUNT_APPID=wxce012ab75eab4e72
WECHAT_OFFICIAL_ACCOUNT_SECRET=51bb5effafc38d28d04e496df8e1b7cc
WECHAT_OFFICIAL_ACCOUNT_TOKEN=BHATtkSCY447mYgNE8Pg1AlqMxTttVZ8
WECHAT_OFFICIAL_ACCOUNT_AES_KEY=PteIbB4FHlWQTNt1kEIWhPnA80sSHZD0G7B7jh73eLx
WECHAT_PAYMENT_SANDBOX=false
WECHAT_PAYMENT_APPID=wxce012ab75eab4e72
WECHAT_PAYMENT_MCH_ID=1559503521
WECHAT_PAYMENT_KEY=Yhx1sWgBJntuZgZO2B2oT2Ac7k8r5CJn
WECHAT_PAYMENT_CERT_PATH=/home/wwwroot/lkafu/storage/certs/apiclient_cert.pem
WECHAT_PAYMENT_KEY_PATH=/home/wwwroot/lkafu/storage/certs/apiclient_key.pem

0
README.md Normal file
View File

View File

@@ -0,0 +1,97 @@
<?php
namespace App\Admin\Actions;
use App\Models\Card;
use App\Models\CardOrder;
use App\Models\User;
use Encore\Admin\Actions\Action;
use Illuminate\Http\Request;
class AllotCard extends Action
{
protected $selector = '.report-posts';
public function handle(Request $request)
{
$request->validate([
'startNum' => 'required|integer|min:1|lte:endNum',
'endNum' => 'required|integer|min:1',
], [
'startNum.required' => '开始号码必须填写',
'startNum.integer' => '开始号码必须是整数',
'startNum.min' => '开始号码最小为1',
'startNum.lte' => '开始号码要小于结束号码',
'endNum.required' => '结束号码必须填写',
'endNum.integer' => '结束号码必须是整数',
'endNum.min' => '结束号码最小为1',
]);
$response = $this->response();
$startNum = $request->startNum ?: 0;
$endNum = $request->endNum ?: 0;
$order_id = $request->order_id ?: 0;
$company = $request->company;
$number = $request->number;
$order = CardOrder::where('status', 1)->find($order_id);
if (!$order) {
$response->status = false;
return $response->error('订单不存在或状态不正确');
}
$startNum = sprintf("%'.08d", $startNum);
$endNum = sprintf("%'.08d", $endNum);
$count = Card::whereBetween('code', [$startNum, $endNum])->count();
if ($order->num != $count) {
$response->status = false;
return $response->error('调拨数量与订单数量不匹配');
}
$isActive = Card::whereBetween('code', [$startNum, $endNum])->where('status', '!=', 1)->value('code');
if ($isActive) {
$response->status = false;
return $response->error($isActive . '卡号状态不正确');
}
if (!$order->user) {
$response->status = false;
return $response->error('用户不存在');
} elseif ($order->user->identity->identity_id < 2) {
$response->status = false;
return $response->error($order->user->username . '用户不是代理');
}
$order->status = 2;
$order->save();
$order->deliver($company, $number);
Card::whereBetween('code', [$startNum, $endNum])->update([
'user_id' => $order->user_id,
'order_id' => $order->id,
'status' => 3,
]);
return $response->success('卡分配完毕')->refresh();
}
public function form()
{
$orders = CardOrder::where('status', 1)->get();
$orderData = array();
foreach ($orders as $key => $order) {
$orderData[$order->id] = '单号:' . $order->order_id . '(用户账号:' . $order->user->username . ',数量:' . $order->num . '';
}
$options = deliver_list();
$this->select('order_id', '订单号')->options($orderData)->rules('required');
$this->text('startNum', '开始')->rules('required|integer|min:1');
$this->text('endNum', '结束')->rules('required|integer|min:1');
$this->select('company', '物流名称')->options($options)->required();
$this->text('number', '物流单号')->required();
}
public function html()
{
return "<a class='report-posts btn btn-sm btn-danger'><i class='fa fa-info-circle'></i>分配卡</a>";
}
}

View File

@@ -0,0 +1,38 @@
<?php
namespace App\Admin\Actions;
use App\Models\User;
use Encore\Admin\Actions\RowAction;
use Encore\Admin\Form;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\Request;
class AreaSetManage extends RowAction
{
public $name = '设置管理人';
public function handle(Model $model, Request $request)
{
$user = User::find($request->user_id);
$model->user_id = $user->id;
$model->save();
return $this->response()->success('操作成功')->refresh();
}
public function form()
{
$this->text('user_id', '用户序号')->rules(['required', 'numeric', function ($attribute, $value, $fail) {
$user = User::find($value);
if (!$user) {
return $fail('未找到账号');
}
if (!in_array($user->identity->identity_id, [4])) {
return $fail('账号等级不够');
}
}], [
'required' => '用户序号不能为空',
'numeric' => '用户序号必须为整数',
], '2');
}
}

View File

@@ -0,0 +1,40 @@
<?php
namespace App\Admin\Actions\CardOrder;
use Config;
use Encore\Admin\Actions\RowAction;
use Encore\Admin\Form;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\Request;
class OrderDeliver extends RowAction
{
public $name = '提货卡发货';
public function handle(Model $model, Request $request)
{
$company = $request->company;
$number = $request->number;
$model->deliver($company, $number);
return $this->response()->success('发货成功')->refresh();
}
public function form(Model $model)
{
$deliver_list = Config::get('deliver_list');
$array = preg_split('/[\r\n]+/', trim($deliver_list, "\r\n"));
if (strpos($deliver_list, ':')) {
$options = [];
foreach ($array as $val) {
[$k, $v] = explode(':', $val, 2);
$options[$k] = $v;
}
} else {
$options = $array;
}
$this->select('company','物流名称')->options($options)->required();
$this->text('number','物流单号')->required();
}
}

View File

@@ -0,0 +1,42 @@
<?php
namespace App\Admin\Actions\Cashout;
use Encore\Admin\Actions\RowAction;
use Encore\Admin\Form;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\Request;
use Storage;
class Audit extends RowAction
{
public $name = '审核提现';
public function handle(Model $model, Request $request)
{
$status = $request->status;
if (!$status) {
return $this->response()->error('请选择审核状态')->refresh();
}
if ($status == 'pass') {
$model->pass();
return $this->response()->success('操作成功')->refresh();
} else {
$reason = $request->get('reason');
$model->reject();
$model->user->rule('cashoutreject', $model->variable);
return $this->response()->success('驳回成功')->refresh();
}
}
public function form(Model $model)
{
$this->image('支付宝二维')->value(Storage::disk('admin')->url($model->user->cashAccount->alipay_account_code))->readonly();
$this->text('用户账号')->value($model->user->username)->readonly();
$this->text('用户名称')->value($model->user->info->nickname)->readonly();
$this->text('提现金额')->value($model->variable)->readonly();
$this->text('当前状态')->value($model->state_text)->readonly();
$this->select('status', '审核')->options(['pass' => '通过', 'reject' => '驳回']);
}
}

View File

@@ -0,0 +1,33 @@
<?php
namespace App\Admin\Actions;
use App\Admin\Imports\Mobile;
use Encore\Admin\Actions\Action;
use Illuminate\Http\Request;
use Maatwebsite\Excel\Facades\Excel;
class MobileImport extends Action
{
public $name = '导入手机号';
protected $selector = '.import-post';
public $modelName = '';
public function handle(Request $request)
{
$res = Excel::import(new Mobile, $request->file('file'), 'excel');
return $this->response()->success('导入完成!')->refresh();
}
public function form()
{
$this->file('file', '请选择文件');
}
public function html()
{
return <<<HTML
<a class="btn btn-sm btn-default import-post"><i class="fa fa-upload"></i>导入数据</a>
HTML;
}
}

View File

@@ -0,0 +1,40 @@
<?php
namespace App\Admin\Actions\Order;
use Config;
use Encore\Admin\Actions\RowAction;
use Encore\Admin\Form;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\Request;
class OrderDeliver extends RowAction
{
public $name = '发货';
public function handle(Model $model, Request $request)
{
$company = $request->company;
$number = $request->number;
$res = $model->deliver($company, $number);
return $this->response()->success('发货成功')->refresh();
}
public function form(Model $model)
{
$deliver_list = Config::get('deliver_list');
$array = preg_split('/[\r\n]+/', trim($deliver_list, "\r\n"));
if (strpos($deliver_list, ':')) {
$options = [];
foreach ($array as $val) {
[$k, $v] = explode(':', $val, 2);
$options[$k] = $v;
}
} else {
$options = $array;
}
$this->select('company','物流名称')->options($options)->required();
$this->text('number','物流单号')->required();
}
}

View File

@@ -0,0 +1,74 @@
<?php
namespace App\Admin\Extensions\Actions;
use Encore\Admin\Admin;
class OrderRefundAgree
{
protected $row;
protected $resource;
public function __construct($row)
{
$this->row = $row;
$this->resource = url()->current();
}
protected function script()
{
return <<<SCRIPT
$('.grid-deliver-row').unbind('click').click(function() {
var id = $(this).data('id');
swal({
title: "确认要同意退款吗?",
type: "warning",
showCancelButton: true,
confirmButtonColor: "#DD6B55",
confirmButtonText: "确认",
showLoaderOnConfirm: true,
cancelButtonText: "取消",
preConfirm: function() {
return new Promise(function(resolve) {
$.ajax({
method: 'post',
url: '{$this->resource}/' + id + '/agree',
data: {
_token:LA.token,
},
success: function (data) {
$.pjax.reload('#pjax-container');
resolve(data);
}
});
});
}
}).then(function(result) {
var data = result.value;
console.log(data);
if (typeof data === 'object') {
if (data.status) {
swal(data.message, '', 'success');
} else {
swal(data.message, '', 'error');
}
}
});
});
SCRIPT;
}
protected function render()
{
Admin::script($this->script());
return "<button type='button' class='btn btn-xs btn-success grid-deliver-row' data-id='{$this->row->orderid}'>确认退款</button>";
}
public function __toString()
{
return $this->render();
}
}

View File

@@ -0,0 +1,30 @@
<?php
namespace App\Admin\Actions;
use Admin;
use Encore\Admin\Actions\RowAction;
use Encore\Admin\Form;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\Request;
class ProfitStart extends RowAction
{
public $name = '执行全球分红';
public function handle(Model $model, Request $request)
{
$admin_pass = $request->admin_pass;
if (!Admin::guard()->attempt(['username' => Admin::user()->username, 'password' => $admin_pass])) {
return $this->response()->error('验证密码失败')->refresh();
}
\App\Bonus\ProfitStart::settlement($this->row);
return $this->response()->success('操作成功')->refresh();
}
public function form()
{
$this->text('admin_pass', '当前管理员密码')->rules('required');
}
}

View File

@@ -0,0 +1,38 @@
<?php
namespace App\Admin\Actions;
use App\Models\User;
use Encore\Admin\Actions\RowAction;
use Encore\Admin\Form;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\Request;
class SetParent extends RowAction
{
public $name = '设置推荐人';
public function handle(Model $model, Request $request)
{
$parent = User::find($request->parent_id);
$this->row->UpdateRelation($parent);
return $this->response()->success('操作成功')->refresh();
}
public function form()
{
$this->text('parent_id', '用户序号')->rules(['required', 'numeric', function ($attribute, $value, $fail) {
$parent = User::find($value);
if (!$parent) {
return $fail('未找到账号');
}
if (!in_array($parent->identity->identity_id, [2, 3, 4])) {
return $fail('账号等级不够');
}
}], [
'required' => '用户序号不能为空',
'numeric' => '用户序号必须为整数',
], '2');
}
}

View File

@@ -0,0 +1,69 @@
<?php
namespace App\Admin\Actions;
use App\Models\UpgradePayment;
use Encore\Admin\Actions\RowAction;
use Encore\Admin\Form;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\Request;
use RuLong\Identity\Models\Identity;
class UserUpgrade extends RowAction
{
public $name = '空升';
public function handle(Model $model, Request $request)
{
$identity_id = $request->identity_id;
$model->identityUpdate($identity_id, 'EmptyUp');
if ($identity_id > 1 && !$model->activationd_at) {
$model->activationd_at = now();
$model->save();
}
$amount = $model->getIdentityPrice($identity_id);
if ($amount) {
$upgrade_payment = UpgradePayment::create([
'user_id' => $model->id,
'type' => 'agent',
'pay_type' => 'ADMIN',
'amount' => $amount,
'total' => 0,
'state' => 'SUCCESS',
]);
if ($identity_id == 1) {
\App\Bonus\DirectVip::settlement($upgrade_payment);
$source = [
'user_id' => $upgrade_payment->user->id,
'type' => 'UpgradeVip',
'payment_id' => $upgrade_payment->id,
];
\App\Bonus\AddPerf::settlement($upgrade_payment->user, $upgrade_payment->amount, $source);
} elseif ($identity_id > 1) {
\App\Bonus\DirectAgency::settlement($upgrade_payment);
$source = [
'user_id' => $upgrade_payment->user->id,
'type' => 'UpgradeAgency',
'payment_id' => $upgrade_payment->id,
];
\App\Bonus\AddPerf::settlement($upgrade_payment->user, $upgrade_payment->amount, $source);
}
}
return $this->response()->success('升级成功')->refresh();
}
public function form(Model $model)
{
$identitys = Identity::where('id', '!=', $model->identity_id)->orderBy('id', 'asc')->pluck('title', 'id')->toArray();
$identitys[0] = '普通用户';
ksort($identitys);
$this->text('用户名称')->value($model->info->nickname);
$this->text('当前等级')->value($model->identity_text);
$this->select('identity_id', '目标等级')->options($identitys);
}
}

View File

@@ -0,0 +1,64 @@
<?php
namespace App\Admin\Controllers;
use Encore\Admin\Controllers\AdminController;
use Encore\Admin\Grid;
use RuLong\Identity\Models\Identity;
use RuLong\UserAccount\Models\UserAccount;
class AccountController extends AdminController
{
protected $title = '账户管理';
protected function grid()
{
$grid = new Grid(new UserAccount);
$grid->disableCreateButton();
$grid->disableRowSelector();
$grid->disableActions();
$grid->disableColumnSelector();
$grid->disableExport();
$grid->model()->orderBy('cash', 'desc');
$grid->column('user_id', '用户序号')->sortable();
$grid->column('用户名称')->display(function () {
return $this->user->info->nickname;
});
$grid->column('级别')->display(function () {
return $this->user->identity_text;
});
$grid->column('cash', '余额')->display(function ($cash) {
return "<span class='label label-warning'>" . number_format($cash, 1) . "</span>";
})->sortable();
$grid->filter(function ($filter) {
$filter->column(4, function ($filter) {
$filter->equal('user_id', '用户序号');
});
$filter->column(4, function ($filter) {
$filter->like('user.username', '用户账号');
});
$filter->column(4, function ($filter) {
$filter->where(function ($query) {
$query->whereHas('user.info', function ($query) {
$query->where('nickname', 'like', "%{$this->input}%");
});
}, '用户名称');
});
$filter->column(4, function ($filter) {
$filter->where(function ($query) {
$query->whereHas('user', function ($query) {
$query->whereHas('identity', function ($query) {
$query->where('identity_id', $this->input);
});
});
}, '级别')->select(Identity::pluck('title', 'id'));
});
});
return $grid;
}
}

View File

@@ -0,0 +1,90 @@
<?php
namespace App\Admin\Controllers;
use App\Admin\Exporters\AccountLog;
use App\Models\User;
use Encore\Admin\Controllers\AdminController;
use Encore\Admin\Grid;
use Encore\Admin\Layout\Content;
use Illuminate\Http\Request;
use RuLong\UserAccount\Models\UserAccountLog;
class AccountlogController extends AdminController
{
protected $title = '佣金明细管理';
protected function grid()
{
$grid = new Grid(new UserAccountLog);
$grid->disableCreateButton();
$grid->disableRowSelector();
$grid->disableActions();
$grid->disableColumnSelector();
$grid->model()->orderBy('id', 'desc');
$grid->column('id', '排序')->sortable();
$grid->column('user_id', '用户序号');
$grid->column('user.username', '用户账号');
$grid->column('userinfo.nickname', '用户名称');
$grid->column('rule.title', '佣金名称');
$grid->column('variable', '佣金金额')->display(function ($variable) {
return number_format($variable, 2);
})->label('success');
$grid->column('rule.remark', '规则描述');
$grid->column('created_at', '产生时间');
$grid->filter(function ($filter) {
$filter->column(4, function ($filter) {
$filter->equal('user.id', '用户序号');
});
$filter->column(4, function ($filter) {
$filter->like('user.username', '用户账号');
});
$filter->column(4, function ($filter) {
$filter->where(function ($query) {
$query->whereHas('user.info', function ($query) {
$query->where('nickname', 'like', "%{$this->input}%");
});
}, '用户名称');
});
});
$grid->exporter(new AccountLog());
return $grid;
}
//某人收益详情
public function logs(Content $content, Request $request)
{
$grid = new Grid(new UserAccountLog);
$grid->disableCreateButton();
$user = User::find($request->user_id);
$grid->disableCreateButton();
$grid->disableRowSelector();
$grid->disableActions();
$grid->disableColumnSelector();
$grid->model()->where('user_id', $request->user_id)->orderBy('id', 'desc');
$grid->column('id', '排序')->sortable();
$grid->column('user_id', '用户序号');
$grid->column('user.username', '用户账号');
$grid->column('userinfo.nickname', '用户名称');
$grid->column('rule.title', '佣金名称');
$grid->column('variable', '佣金金额')->display(function ($variable) {
return number_format($variable, 2);
})->label('success');
$grid->column('rule.remark', '规则描述');
$grid->column('created_at', '产生时间');
$grid->exporter(new AccountLog());
return $content
->header($user->info->nickname . '的收益详情')
->description('列表')
->body($grid);
}
}

View File

@@ -0,0 +1,104 @@
<?php
namespace App\Admin\Controllers;
use App\Models\Advert;
use Encore\Admin\Controllers\AdminController;
use Encore\Admin\Form;
use Encore\Admin\Grid;
use Encore\Admin\Layout\Content;
class AdvertController extends AdminController
{
/**
* Index interface.
*
* @param Content $content
* @return Content
*/
public function index(Content $content)
{
return $content
->header('轮播图管理')
->description('列表')
->body($this->grid());
}
/**
* Edit interface.
*
* @param mixed $id
* @param Content $content
* @return Content
*/
public function edit($id, Content $content)
{
return $content
->header('轮播图管理')
->description('编辑')
->body($this->form()->edit($id));
}
/**
* Create interface.
*
* @param Content $content
* @return Content
*/
public function create(Content $content)
{
return $content
->header('轮播图管理')
->description('创建')
->body($this->form());
}
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
$channel_type = (new Advert)->channel_type;
$grid = new Grid(new Advert);
$grid->id('ID');
$grid->column('频道')->display(function () {
return $this->channel_text;
});
$grid->cover('图片')->image('', 60, 60);
$grid->url('地址');
$grid->sort('排序');
$grid->filter(function ($filter) use ($channel_type) {
// 去掉默认的id过滤器
$filter->disableIdFilter();
// 在这里添加字段过滤器
$filter->equal('channel', '渠道')->select($channel_type);
});
return $grid;
}
/**
* Make a form builder.
*
* @return Form
*/
protected function form()
{
$channel_type = (new Advert)->channel_type;
$form = new Form(new Advert);
$form->select('channel', '频道')->options($channel_type)->rules('required', ['required' => '必须选择频道']);
$form->text('url', '地址')->rules('required');
$form->image('cover', '图片')->rules('required')->uniqueName();
$form->number('sort', '排序')->default(1);
return $form;
}
}

View File

@@ -0,0 +1,85 @@
<?php
namespace App\Admin\Controllers;
use App\Admin\Actions\AreaSetManage;
use App\Admin\Exporters\ProvinceExporter;
use App\Models\User;
use Encore\Admin\Controllers\AdminController;
use Encore\Admin\Form;
use Encore\Admin\Grid;
use RuLong\Area\Models\Area;
class AreaController extends AdminController
{
protected $title = '省市管理';
protected function grid()
{
$grid = new Grid(new Area);
$grid->disableCreateButton();
// $grid->disableActions();
$grid->exporter(new ProvinceExporter());
$grid->model()->where('depth', '<', 3);
$grid->actions(function ($actions) {
if ($this->row->type == '地级') {
$actions->add(new AreaSetManage);
}
$actions->disableView();
$actions->disableEdit();
$actions->disableDelete();
});
$grid->filter(function ($filter) {
$filter->column(1 / 3, function ($filter) {
$filter->like('name', '省市全称');
$filter->equal('hot', '是否热门')->select([
' ' => '全部',
'1' => '是',
'0' => '否',
]);
});
$filter->column(1 / 3, function ($filter) {
$filter->equal('type', '等级')->select([
' ' => '全部',
'省级' => '省级',
'地级' => '地级',
]);
});
});
$grid->column('sn', '排序')->sortable();
$states = [
'on' => ['value' => 1, 'text' => '是', 'color' => 'primary'],
'off' => ['value' => 0, 'text' => '否', 'color' => 'default'],
];
$grid->column('name', '省市全称');
$grid->column('type', '等级');
$grid->column('管理人')->display(function ($title, $column) use ($grid) {
if ($this->user) {
return $this->user->info->nickname;
} else {
return '---';
}
});
$grid->column('shortname', '简称');
// $grid->column('cnname', '拼音');
// $grid->column('enname', '英文');
$grid->column('hot', '是否热门')->switch($states);
return $grid;
}
/**
* Make a form builder.
*
* @return Form
*/
protected function form()
{
$form = new Form(new Area);
$form->switch('hot', '是否热门')->default(1);
return $form;
}
}

View File

@@ -0,0 +1,146 @@
<?php
namespace App\Admin\Controllers;
use App\Models\Article;
use App\Models\Category;
use Encore\Admin\Controllers\AdminController;
use Encore\Admin\Form;
use Encore\Admin\Grid;
use Encore\Admin\Layout\Content;
use Encore\Admin\Show;
class ArticleController extends AdminController
{
/**
* Index interface.
*
* @param Content $content
* @return Content
*/
public function index(Content $content)
{
return $content
->header('资讯管理')
->description('列表')
->body($this->grid());
}
/**
* Edit interface.
*
* @param mixed $id
* @param Content $content
* @return Content
*/
public function edit($id, Content $content)
{
return $content
->header('资讯管理')
->description('编辑')
->body($this->form()->edit($id));
}
/**
* Create interface.
*
* @param Content $content
* @return Content
*/
public function create(Content $content)
{
return $content
->header('资讯管理')
->description('创建')
->body($this->form());
}
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
$grid = new Grid(new Article);
$grid->id('ID');
$grid->title('标题');
$grid->column('category.title', '所属分类');
$grid->description('简介')->display(function ($text) {
return str_limit($text, 100, '...');
});
$grid->cover('标题图')->image('', 60, 60);
$grid->status('状态')->switch([
'on' => ['value' => 1, 'text' => '正常', 'color' => 'primary'],
'off' => ['value' => 0, 'text' => '关闭', 'color' => 'danger'],
]);
$grid->hot('推荐')->switch([
'on' => ['value' => 1, 'text' => '是', 'color' => 'primary'],
'off' => ['value' => 0, 'text' => '否', 'color' => 'danger'],
]);
$grid->order('排序');
$grid->filter(function ($filter) {
// 去掉默认的id过滤器
$filter->disableIdFilter();
// 在这里添加字段过滤器
$filter->like('title', '标题');
$filter->equal('category.id', '所属分类')->select(Category::selectOptions(function ($model) {
return $model->where('status', 1)->where('type', 'article');
}, '所有分类'));
});
return $grid;
}
/**
* Make a show builder.
*
* @param mixed $id
* @return Show
*/
protected function detail($id)
{
$show = new Show(Article::findOrFail($id));
$show->id('ID');
$show->title('标题');
$show->description('简介');
$show->cover('标题图')->image('', 60, 60)->uniqueName();
$show->content('详情');
$show->status('状态')->using(['1' => '正常', '0' => '关闭']);
$show->order('排序');
$show->clicks('浏览量');
return $show;
}
/**
* Make a form builder.
*
* @return Form
*/
protected function form()
{
$form = new Form(new Article);
$form->text('title', '标题')->rules('required');
$form->select('category_id', '所属分类')->options(Category::selectOptions(function ($model) {
return $model->where('status', 1)->where('type', 'article');
}, '选择分类'))->rules('required', ['required' => '必须选择分类']);
$form->textarea('description', '简介')->rules('max:255', ['max' => '简介最多255字']);
$form->image('cover', '标题图');
$form->editor('content', '详情')->rules('required', ['required' => '详情不能为空']);
$form->switch('status', '状态')->default(1);
$form->switch('hot', '推荐')->default(0);
$form->number('order', '排序')->default(0);
$form->number('clicks', '浏览量')->default(0);
return $form;
}
}

View File

@@ -0,0 +1,10 @@
<?php
namespace App\Admin\Controllers;
use Encore\Admin\Controllers\AuthController as BaseAuthController;
class AuthController extends BaseAuthController
{
}

View File

@@ -0,0 +1,189 @@
<?php
namespace App\Admin\Controllers;
use App\Admin\Actions\AllotCard;
use App\Admin\Exporters\CardExporters;
use App\Models\Card;
use App\Models\Goods;
use App\Models\GoodsParams;
use Encore\Admin\Controllers\AdminController;
use Encore\Admin\Grid;
use Encore\Admin\Widgets\Box;
use Encore\Admin\Widgets\Form;
use Illuminate\Http\Request;
class CardController extends AdminController
{
protected $title = '卡管理';
protected function grid()
{
$grid = new Grid(new Card);
$grid->disableCreateButton();
$grid->disableRowSelector();
$grid->disableActions();
$grid->disableColumnSelector();
$grid->tools(function (Grid\Tools $tools) {
$tools->append(new AllotCard());
});
$grid->header(function ($query) {
$form = new Form();
$form->action('card/createCard');
$form->hidden('_token')->default(csrf_token());
$form->disableReset();
$form->text('num', '生成数量')->rules('required|integer|min:1');
$form->select('type', '类型')->options([
'L' => '联【L】',
'K' => '卡【K】',
'F' => '蝠【F】',
])->load('goods', 'card/getGoods')->rules('required');
$form->select('goods', '专属商品')->load('param', 'card/getParam');
$form->select('param', '专属规格');
$box = new Box();
$box = new Box('生成卡', $form->render());
$box->collapsable();
$box->style('success');
$box->solid();
return $box->render();
});
$grid->model()->orderBy('id', 'desc');
$grid->column('id', '卡序号')->sortable();
$grid->column('归属')->display(function () {
return ($this->user->username ?? '---') . "<br>" . ($this->user->info->nickname ?? '---');
});
$grid->column('code', '卡号')->sortable();
$grid->column('打印卡号')->display(function () {
return $this->type . $this->code;
});
$grid->column('pass', '卡密');
$grid->column('type', '类型')->using([
'L' => '联【L】',
'K' => '卡【K】',
'F' => '蝠【F】',
]);
$grid->column('专项')->display(function () {
if ($this->type == 'K') {
return '商品ID' . $this->source['goods'] . '规格ID' . $this->source['param'];
} else {
return '非专项';
}
});
$grid->column('status', '状态')->display(function () {
return $this->status_text;
})->label([
0 => 'warning',
1 => 'success',
2 => 'success',
3 => 'success',
4 => 'success',
5 => 'info',
]);
$grid->column('激活用户')->display(function () {
return $this->activeUser->username ?? '无';
});
$grid->column('actived_at', '激活时间');
$grid->column('created_at', '创建时间');
$grid->column('updated_at', '更改时间');
$grid->filter(function ($filter) {
$filter->disableIdFilter();
$filter->column(4, function ($filter) {
$filter->equal('code', '卡号');
});
$filter->column(4, function ($filter) {
$filter->equal('type', '类型')->select([
'L' => '联【L】',
'K' => '卡【K】',
'F' => '蝠【F】',
]);
});
$filter->column(4, function ($filter) {
});
$filter->column(4, function ($filter) {
});
});
$grid->disableExport(false);
$grid->exporter(new CardExporters());
return $grid;
}
public function createCard(Request $request)
{
$request->validate([
'num' => 'required|integer|min:1',
'type' => 'required',
], [
'num.required' => '数量必须填写',
'num.integer' => '数量必须是整数',
'num.min' => '数量最小为1',
'type.required' => '类型必须填写',
]);
$num = $request->num;
$type = $request->type;
$source = [
'goods' => $request->goods ?: 0,
'param' => $request->param ?: 0,
];
$data = [];
$codeStart = (Card::max('id') ?? 0) + 1;
$source = json_encode($source);
while ($num > 0) {
$data[] = [
'code' => sprintf("%'.08d", $codeStart++),
'pass' => sprintf("%'.04d", mt_rand(0, 9999)) . '-' . sprintf("%'.04d", mt_rand(0, 9999)) . '-' . sprintf("%'.04d", mt_rand(0, 9999)) . '-' . sprintf("%'.04d", mt_rand(0, 9999)),
'type' => $type,
'status' => 1,
'source' => $source,
'created_at' => now(),
'updated_at' => now(),
];
--$num;
}
Card::insert($data);
admin_success('成功生成', $request->num . '个码已经生成。');
return back();
}
public function getGoods()
{
$type = request('q');
$data = [];
if ($type == 'K') {
$plucks = Goods::where('status', 1)->get(['id', 'title as text']);
return $plucks;
} else {
$data[] = [
'id' => 0,
'text' => '非专属卡',
];
return $data;
}
}
public function getParam()
{
$goods_id = request('q');
if ($goods_id) {
$plucks = GoodsParams::where('goods_id', $goods_id)->where('status', 1)->get(['id', 'value as text']);
return $plucks;
} else {
$data[] = [
'id' => 0,
'text' => '非专属卡',
];
return $data;
}
}
}

View File

@@ -0,0 +1,111 @@
<?php
namespace App\Admin\Controllers;
use App\Models\CardOrder;
use Encore\Admin\Controllers\AdminController;
use Encore\Admin\Form;
use Encore\Admin\Grid;
class CardOrderController extends AdminController
{
protected $title = '购卡管理';
protected function grid()
{
$grid = new Grid(new CardOrder);
$grid->disableRowSelector();
$grid->disableColumnSelector();
$grid->disableExport();
$grid->disableActions();
$grid->model()->orderBy('created_at', 'desc');
$grid->column('order_id', '订单号');
$grid->column('user_id', '用户编号');
$grid->column('用户账号')->display(function () {
return $this->user->username;
});
$grid->column('用户名称')->display(function () {
return $this->user->info->nickname;
});
$grid->column('num', '购卡数量');
$grid->column('price', '购卡金额');
$grid->column('status', '状态')->display(function () {
return $this->status_text;
})->label([
0 => 'warning',
1 => 'success',
2 => 'success',
3 => 'success',
4 => 'info',
]);
$grid->column('收货地址')->display(function () {
if ($this->express) {
$res = $this->express->name . "<br>";
$res .= $this->express->mobile . "<br>";
$res .= $this->express->address . "<br>";
return $res;
} else {
return '';
}
});
$grid->column('物流')->display(function () {
if ($this->express) {
$res = get_deliver_name($this->express->company) . "<br>";
$res .= $this->express->number . "<br>";
return $res;
} else {
return '';
}
});
$grid->filter(function ($filter) {
$filter->disableIdFilter();
$filter->column(1 / 3, function ($filter) {
$filter->like('order_id', '订单编号');
$filter->equal('status', '订单状态')->select([
0 => '待支付',
1 => '已支付',
2 => '已发货',
3 => '已收货',
]);
});
$filter->column(1 / 3, function ($filter) {
$filter->where(function ($query) {
$query->whereHas('user', function ($query) {
$query->whereHas('info', function ($query) {
$query->where('nickname', 'like', "%{$this->input}%");
});
});
}, '下单用户');
$filter->equal('type', '订单类型')->select(['L' => '拉', 'K' => '卡', 'F' => '蝠']);
});
// $filter->column(1 / 3, function ($filter) {
// $filter->between('created_at', '下单时间')->datetime();
// });
});
return $grid;
}
/**
* Make a form builder.
*
* @return Form
*/
protected function form()
{
$form = new Form(new CardOrder);
$form->text('user_id', '购卡用户ID')->rules('required');
$form->number('num', '购卡数量')->rules('required');
$form->currency('price', '购卡金额')->symbol('¥')->rules('required');
$form->textarea('remark', '备注')->rules('max:255', ['max' => '简介最多255字']);
$form->hidden('status')->default(1);
return $form;
}
}

View File

@@ -0,0 +1,226 @@
<?php
namespace App\Admin\Controllers;
use App\Admin\Actions\Cashout\Audit;
use App\Admin\Exporters\CashOutExport;
use App\Models\Cashout;
use App\Models\User;
use Encore\Admin\Controllers\AdminController;
use Encore\Admin\Grid;
use Encore\Admin\Grid\Displayers\Modal;
use Encore\Admin\Layout\Content;
use Illuminate\Http\Request;
use Storage;
class CashOutController extends AdminController
{
protected $title = '用户提现管理';
protected function grid()
{
$grid = new Grid(new Cashout);
$grid->disableCreateButton();
$grid->actions(function ($actions) {
$actions->disableDelete();
$actions->disableEdit();
$actions->disableView();
if ($actions->row->state == "INIT") {
$actions->add(new Audit);
}
});
$grid->filter(function ($filter) {
$filter->column(1 / 3, function ($filter) {
$filter->where(function ($query) {
$query->whereHas('user', function ($query) {
$query->where('id', $this->input);
});
}, '用户序号');
$filter->where(function ($query) {
$query->whereHas('user.identity', function ($query) {
$query->where('identity_id', $this->input);
});
}, '级别')->select([
' ' => '全部',
'5' => '一级',
'4' => '二级',
'3' => '三级',
'1' => '员工',
'2' => '商户',
]);
});
$filter->column(1 / 3, function ($filter) {
$filter->where(function ($query) {
$query->whereHas('user', function ($query) {
$query->where('username', $this->input);
});
}, '手机号');
$filter->where(function ($query) {
$query->whereHas('user.info', function ($query) {
$query->where('nickname', 'like', "%{$this->input}%");
});
}, '用户名称');
});
$filter->column(1 / 3, function ($filter) {
$filter->equal('state', '状态')->select([
' ' => '全部',
'INIT' => '审核中',
'PASS' => '通过',
'REJECT' => '驳回',
]);
$filter->equal('created_at', '提交时间')->date();
});
});
$grid->model()->orderBy('id', 'desc');
$grid->column('id', '排序')->sortable();
$grid->column('用户序号')->display(function () {
return $this->user->id;
});
$grid->column('手机号')->display(function () {
return $this->user->username;
});
$grid->column('用户名称')->display(function () {
return $this->user->info->nickname;
});
$grid->column('级别')->display(function () {
return $this->user->identity_text;
});
$grid->column('支付宝账户')->display(function () {
if ($this->cash_account_no) {
return $this->cash_account_no;
} else {
return $this->user->cashAccount->alipay_account;
}
});
$grid->column('支付宝商户二维码')->display(function ($title, $column) use ($grid) {
if ($this->user->cashAccount->alipay_account_code) {
$modal = new Modal('点击查看', $grid, $column, $this);
$str = $modal->display('支付宝商户二维码', function ($modal) {
return '<div style="width:100%;text-align:center;"><img style="max-height:50vh;margin:auto;" src="' . Storage::disk('admin')->url($modal->user->cashAccount->alipay_account_code) . '"></div>';
});
return $str;
} else {
return '无';
}
});
$grid->column('variable', '提现金额');
$grid->column('审核状态')->display(function ($state) {
switch ($this->state) {
case 'INIT':
return "<span style='color:red'>审核中</span>";
break;
case 'PASS':
return "<span style='color:blue'>通过</span>";
break;
case 'REJECT':
return "<span style='color:grey'>驳回</span>";
break;
}
});
$grid->column('created_at', '创建时间');
$grid->column('updated_at', '修改时间');
$grid->footer(function ($query) {
$all = number_format(Cashout::sum('variable'), 2) ?? 0;
$init = number_format(Cashout::where('state', 'INIT')->sum('variable'), 2) ?? 0;
$pass = number_format(Cashout::where('state', 'PASS')->sum('variable'), 2) ?? 0;
$reject = number_format(Cashout::where('state', 'REJECT')->sum('variable'), 2) ?? 0;
return '<label class="label label-success">总提现额:' . $all . '</label>&nbsp;<label class="label label-success">审核中:' . $init . '</label>&nbsp;<label class="label label-success">通过:' . $pass . '</label>&nbsp;<label class="label label-success">驳回:' . $reject . '</label>';
});
$grid->exporter(new CashOutExport());
return $grid;
}
//某人收益详情
public function logs(Content $content, Request $request)
{
$grid = new Grid(new Cashout);
$user = User::find($request->user_id);
$grid->disableCreateButton();
$grid->disableActions();
$grid->filter(function ($filter) {
$filter->column(1 / 3, function ($filter) {
$filter->equal('state', '状态')->select([
' ' => '全部',
'INIT' => '审核中',
'PASS' => '通过',
'REJECT' => '驳回',
]);
$filter->equal('created_at', '提交时间')->date();
});
});
$grid->model()->where('user_id', $user->id)->orderBy('id', 'desc');
$grid->column('id', '排序')->sortable();
$grid->column('用户序号')->display(function () {
return $this->user->id;
});
$grid->column('用户账号')->display(function () {
return $this->user->username;
});
$grid->column('用户名称')->display(function () {
return $this->user->info->nickname;
});
$grid->column('级别')->display(function () {
return $this->user->identity_text;
});
$grid->column('支付宝账户')->display(function () {
if ($this->cash_account_no) {
return $this->cash_account_no;
} else {
return $this->user->cashAccount->alipay_account;
}
});
$grid->column('支付宝商户二维码')->display(function ($title, $column) use ($grid) {
if ($this->user->cashAccount->alipay_account_code) {
$modal = new Modal('点击查看', $grid, $column, $this);
$str = $modal->display('支付宝商户二维码', function ($modal) {
return '<div style="width:100%;text-align:center;"><img style="max-height:50vh;margin:auto;" src="' . Storage::disk('admin')->url($modal->user->cashAccount->alipay_account_code) . '"></div>';
});
return $str;
} else {
return '无';
}
});
$grid->column('variable', '提现金额');
$grid->column('审核状态')->display(function ($state) {
switch ($this->state) {
case 'INIT':
return "<span style='color:red'>审核中</span>";
break;
case 'PASS':
return "<span style='color:blue'>通过</span>";
break;
case 'REJECT':
return "<span style='color:grey'>驳回</span>";
break;
}
});
$grid->column('created_at', '创建时间');
$grid->column('updated_at', '修改时间');
$grid->exporter(new CashOutExport());
return $content
->header($user->info->nickname . '的提现详情')
->description('列表')
->body($grid);
}
}

View File

@@ -0,0 +1,180 @@
<?php
namespace App\Admin\Controllers;
use App\Models\Category;
use Encore\Admin\Controllers\AdminController;
use Encore\Admin\Controllers\HasResourceActions;
use Encore\Admin\Form;
use Encore\Admin\Grid;
use Encore\Admin\Layout\Column;
use Encore\Admin\Layout\Content;
use Encore\Admin\Layout\Row;
use Encore\Admin\Show;
use Encore\Admin\Tree;
use Encore\Admin\Widgets\Box;
use Encore\Admin\Widgets\Form as WidgetsForm;
class CategoryController extends AdminController
{
use HasResourceActions;
/**
* Index interface.
*
* @param Content $content
* @return Content
*/
public function index(Content $content)
{
return $content
->header('分类')
->row(function (Row $row) {
$row->column(6, $this->treeView());
$row->column(6, function (Column $column) {
$form = new WidgetsForm();
$form->select('parent_id', '上级分类')->options(Category::selectOptions(function ($model) {
return $model->where('status', 1);
}, '一级分类'));
$form->select('type', '分类类型')->options(['goods' => '商品', 'article' => '文章']);
$form->text('title', '分类名称')->rules('required');
$form->textarea('description', '分类简介')->rows(4)->rules('nullable');
$form->image('cover', 'Logo');
$form->number('order', '排序')->default(0);
$form->switch('status', '显示')->states()->default(1);
$form->action('/admin/categories');
$column->append((new Box('新增分类', $form))->style('success'));
});
});
}
/**
* @return \Encore\Admin\Tree
*/
protected function treeView()
{
return Category::tree(function (Tree $tree) {
$tree->disableCreate();
$tree->branch(function ($branch) {
if ($branch['status'] == 1) {
$payload = "<i class='fa fa-eye text-primary'></i> ";
} else {
$payload = "<i class='fa fa-eye text-gray'></i> ";
}
$payload .= " [ID:{$branch['id']}] - ";
$payload .= " <strong>{$branch['title']}</strong> ";
$payload .= " <small style='color:#999'>{$branch['description']}</small>";
return $payload;
});
});
}
/**
* Show interface.
*
* @param mixed $id
* @param Content $content
* @return Content
*/
public function show($id, Content $content)
{
return $content
->header('Detail')
->description('description')
->body($this->detail($id));
}
/**
* Edit interface.
*
* @param mixed $id
* @param Content $content
* @return Content
*/
public function edit($id, Content $content)
{
return $content
->header('Edit')
->description('description')
->body($this->form()->edit($id));
}
/**
* Create interface.
*
* @param Content $content
* @return Content
*/
public function create(Content $content)
{
return $content
->header('Create')
->description('description')
->body($this->form());
}
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
$grid = new Grid(new Category);
$grid->id('Id');
$grid->title('分类名称');
$grid->description('分类简介');
$grid->order('排序');
$grid->status('显示')->switch();
$grid->created_at('创建时间');
return $grid;
}
/**
* Make a show builder.
*
* @param mixed $id
* @return Show
*/
protected function detail($id)
{
$show = new Show(Category::findOrFail($id));
$show->id('Id');
$show->created_at('Created at');
$show->updated_at('Updated at');
return $show;
}
/**
* Make a form builder.
*
* @return Form
*/
protected function form()
{
$form = new Form(new Category);
$form->select('parent_id', '上级分类')->options(Category::selectOptions(function ($model) {
return $model->where('status', 1);
}, '一级分类'));
$form->select('type', '分类类型')->options(['goods' => '商品', 'article' => '文章'])->rules('required');
$form->text('title', '分类名称')->rules('required');
$form->textarea('description', '分类简介')->rows(4)->rules('nullable');
$form->image('cover', 'Logo');
$form->number('order', '排序')->default(0);
$form->switch('status', '显示')->states()->default(1);
return $form;
}
}

View File

@@ -0,0 +1,14 @@
<?php
namespace App\Admin\Controllers;
use Encore\Admin\Controllers\HasResourceActions;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Routing\Controller as BaseController;
class Controller extends BaseController
{
use HasResourceActions, AuthorizesRequests, DispatchesJobs, ValidatesRequests;
}

View File

@@ -0,0 +1,235 @@
<?php
namespace App\Admin\Controllers;
use App\Models\Category;
use App\Models\Goods;
use Encore\Admin\Controllers\AdminController;
use Encore\Admin\Form;
use Encore\Admin\Grid;
use Encore\Admin\Layout\Content;
use Encore\Admin\Show;
use Illuminate\Support\MessageBag;
class GoodsController extends AdminController
{
/**
* Index interface.
*
* @param Content $content
* @return Content
*/
public function index(Content $content)
{
return $content
->header('商品管理')
->description('description')
->body($this->grid());
}
/**
* Edit interface.
*
* @param mixed $id
* @param Content $content
* @return Content
*/
public function edit($id, Content $content)
{
return $content
->header('编辑商品')
->body($this->form()->edit($id));
}
/**
* Create interface.
*
* @param Content $content
* @return Content
*/
public function create(Content $content)
{
return $content
->header('新增商品')
->body($this->form());
}
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
$grid = new Grid(new Goods);
$grid->model()->orderBy('id', 'desc');
$grid->filter(function ($filter) {
$filter->column(1 / 3, function ($filter) {
$filter->like('title', '商品名称');
$filter->like('category.id', '所属分类')->select(Category::selectOptions(function ($model) {
return $model->where('status', 1)->where('type', 'goods');
}, '所有分类'));
});
$filter->column(1 / 3, function ($filter) {
$filter->equal('status', '商品状态')->select([
1 => '正常',
0 => '禁用',
]);
$filter->equal('type', '商品类型')->select([
'member' => '会员商品',
'pick' => '提货商品',
]);
});
$filter->column(1 / 3, function ($filter) {
$filter->equal('is_hot_sell', '热销推荐')->select([
1 => '是',
0 => '否',
]);
$filter->equal('is_recommend', '最新推荐')->select([
1 => '是',
0 => '否',
]);
});
$filter->disableIdFilter();
});
$grid->id('序号');
$grid->cover('封面')->image('', 60, 60);
$grid->title('商品名称');
$grid->column('所属分类')->display(function () {
return $this->category->title;
});
$grid->description('简介');
$grid->column('类型')->display(function () {
return $this->type_text;
});
$grid->status('状态')->switch([
'on' => ['value' => 1, 'text' => '正常', 'color' => 'primary'],
'off' => ['value' => 0, 'text' => '禁用', 'color' => 'danger'],
]);
$grid->is_hot_sell('热销推荐')->switch([
'on' => ['value' => 1, 'text' => '是', 'color' => 'primary'],
'off' => ['value' => 0, 'text' => '否', 'color' => 'danger'],
]);
$grid->is_recommend('最新推荐')->switch([
'on' => ['value' => 1, 'text' => '是', 'color' => 'primary'],
'off' => ['value' => 0, 'text' => '否', 'color' => 'danger'],
]);
$grid->created_at('创建时间');
$grid->actions(function (Grid\Displayers\Actions $actions) {
if ($this->row->type == 'pick') {
$actions->disableDelete();
}
$actions->disableView();
});
return $grid;
}
/**
* Make a show builder.
*
* @param mixed $id
* @return Show
*/
protected function detail($id)
{
$show = new Show(Goods::findOrFail($id));
$show->id('编号');
$show->name('商品名称');
$show->created_at('创建时间');
return $show;
}
/**
* Make a form builder.
*
* @return Form
*/
protected function form()
{
$form = new Form(new Goods);
$form->text('title', '商品名称')->rules('required');
$form->select('category_id', '所属分类')->options(Category::selectOptions(function ($model) {
return $model->where('status', 1)->where('type', 'goods');
}, '选择分类'))->rules('required');
$form->textarea('description', '简介')->rules('required|max:255', [
'required' => '简介不能为空',
'max' => '简介不能超过255字',
]);
$form->image('cover', '封面')->rules('required')->uniqueName();
$form->radio('type', '类型')->options(['member' => '会员产品', 'pick' => '提货商品'])->default('member');
$form->editor('content', '详情')->rules('required', ['required' => '详情不能为空']);
$form->switch('status', '状态')->default(1);
$form->switch('is_recommend', '最新推荐')->default(0);
$form->switch('is_hot_sell', '热销推荐')->default(0);
$form->hasMany('params', '产品属性', function (Form\NestedForm $form) {
$form->text('value', '名称')->rules('required');
$form->text('original', '原价')->rules('required');
$form->text('price', '会员价')->rules('required');
$form->text('stock', '库存')->rules('required');
$form->text('one', '一级佣金')->rules('required');
$form->text('two', '二及佣金')->rules('required');
})->rules('required');
$form->saving(function (Form $form) {
if (request()->has('title')) {
$params = request()->params;
$params_count = empty($params) ? 0 : count($params);
if (!$params_count) {
$error = new MessageBag([
'title' => '错误',
'message' => '必须添加产品属性',
]);
return back()->with(compact('error'));
}
$remove = 0;
foreach ($params as $key => $param) {
if ($param['_remove_'] == 1) {
$remove++;
}
}
if ($remove == $params_count) {
$error = new MessageBag([
'title' => '错误',
'message' => '必须添加产品属性',
]);
return back()->with(compact('error'));
}
}
});
$form->saved(function (Form $form) {
$goods_id = $form->model()->id;
$goods = Goods::find($goods_id);
$price = $goods->params()->orderBy('price', 'asc')->value('price');
if ($price) {
$goods->price = $price;
$goods->save();
}
});
return $form;
}
}

View File

@@ -0,0 +1,71 @@
<?php
namespace App\Admin\Controllers;
use App\Http\Controllers\Controller;
use App\Models\User;
use Encore\Admin\Layout\Column;
use Encore\Admin\Layout\Content;
use Encore\Admin\Layout\Row;
use Encore\Admin\Widgets\InfoBox;
use RuLong\Order\Models\Order;
class HomeController extends Controller
{
public function index(Content $content)
{
return $content
->title('控制台')
->description('数据中心')
->row(function (Row $row) {
$row->column(2, function (Column $column) {
$column->append(new InfoBox('总用户数', 'user', 'yellow', '/admin/users', User::count()));
});
$row->column(2, function (Column $column) {
$column->append(new InfoBox('会员', 'users', 'yellow', '/admin/users?identity[identity_id]=1', User::whereHas('identity', function ($q) {$q->where('identity_id', 1);})->count()));
});
$row->column(2, function (Column $column) {
$column->append(new InfoBox('金牌', 'users', 'yellow', '/admin/users?identity[identity_id]=2', User::whereHas('identity', function ($q) {$q->where('identity_id', 2);})->count()));
});
$row->column(2, function (Column $column) {
$column->append(new InfoBox('城市', 'users', 'yellow', '/admin/users?identity[identity_id]=3', User::whereHas('identity', function ($q) {$q->where('identity_id', 3);})->count()));
});
$row->column(2, function (Column $column) {
$column->append(new InfoBox('股东', 'users', 'yellow', '/admin/users?identity[identity_id]=4', User::whereHas('identity', function ($q) {$q->where('identity_id', 4);})->count()));
});
})
->row(function (Row $row) {
$row->column(3, function (Column $column) {
$column->append(new InfoBox('总订单数', 'print', 'orange', 'admin/orders', Order::count()));
});
$row->column(3, function (Column $column) {
$column->append(new InfoBox('已支付', 'dollar', 'orange', 'admin/orders?state=PAID', Order::UnDeliver()->count()));
});
$row->column(3, function (Column $column) {
$column->append(new InfoBox('已发货', 'dollar', 'orange', 'admin/orders?state=DELIVERED', Order::Delivered()->count()));
});
$row->column(3, function (Column $column) {
$column->append(new InfoBox('已签收', 'dollar', 'orange', 'admin/orders?state=SIGNED', Order::Signed()->count()));
});
});
// return $content
// ->title('Dashboard')
// ->description('Description...')
// ->row(Dashboard::title())
// ->row(function (Row $row) {
// $row->column(4, function (Column $column) {
// $column->append(Dashboard::environment());
// });
// $row->column(4, function (Column $column) {
// $column->append(Dashboard::extensions());
// });
// $row->column(4, function (Column $column) {
// $column->append(Dashboard::dependencies());
// });
// });
}
}

View File

@@ -0,0 +1,111 @@
<?php
namespace App\Admin\Controllers;
use Encore\Admin\Controllers\AdminController;
use Encore\Admin\Form;
use Encore\Admin\Grid;
use RuLong\Identity\Models\Identity;
class IdentityController extends AdminController
{
protected $title = '用户身份配置';
protected function grid()
{
$grid = new Grid(new Identity);
$grid->disableCreateButton();
$grid->disableFilter();
$grid->disableExport();
$grid->disableRowSelector();
$grid->tools(function ($tools) {
$tools->batch(function ($batch) {
$batch->disableDelete();
});
});
$grid->actions(function ($actions) {
$actions->disableDelete();
$actions->disableView();
});
$grid->fixColumns(0, 0);
$grid->model()->orderBy('id', 'asc');
$grid->column('id', '身份编号')->sortable();
$grid->column('title', '级别');
$grid->column('name', '等级');
$grid->column('直推会员(奇)')->display(function () {
return ($this->configs['direct_odd'] ?? 0) . '%';
});
$grid->column('直推会员(偶)')->display(function () {
return ($this->configs['direct_even'] ?? 0) . '%';
});
$grid->column('一级卡酬')->display(function () {
return '&yen; ' . ($this->configs['direct_card'] ?? 0) . ' 元';
});
$grid->column('二级卡酬')->display(function () {
return '&yen; ' . ($this->configs['indirect_card'] ?? 0) . ' 元';
});
$grid->column('团队卡酬')->display(function () {
return '&yen; ' . ($this->configs['team_card'] ?? 0) . ' 元';
});
$grid->column('直推代理')->display(function () {
return ($this->configs['direct_agency'] ?? 0) . '%';
});
$grid->column('间推代理')->display(function () {
return ($this->configs['indirect_agency'] ?? 0) . '%';
});
$grid->column('100万业绩奖')->display(function () {
return ($this->configs['perf_100'] ?? 0) . '%';
});
$grid->column('500万业绩奖')->display(function () {
return ($this->configs['perf_500'] ?? 0) . '%';
});
$grid->column('1000万业绩奖')->display(function () {
return ($this->configs['perf_1000'] ?? 0) . '%';
});
$grid->column('城市分红')->display(function () {
return ($this->configs['orderPerf'] ?? 0) . '%';
});
$grid->column('remark', '说明');
$grid->column('updated_at', '修改时间');
return $grid;
}
protected function form()
{
$form = new Form(new Identity);
$form->display('id', 'ID');
$form->text('title', '级别')->rules('required');
$form->text('name', '等级')->rules('required');
$form->embeds('configs', '佣金设定', function ($form) {
$form->rate('direct_odd', '直推会员(奇)')->value($this->configs['direct_odd'] ?? 0)->required()->setWidth(1, 3)->default(0);
$form->rate('direct_even', '直推会员(偶)')->value($this->configs['direct_even'] ?? 0)->required()->setWidth(1, 3)->default(0);
$form->currency('direct_card', '一级卡酬')->symbol('¥')->value($this->configs['direct_card'] ?? 0)->required()->setWidth(1, 3)->default(0);
$form->currency('indirect_card', '二级卡酬')->symbol('¥')->value($this->configs['indirect_card'] ?? 0)->required()->setWidth(1, 3)->default(0);
$form->currency('team_card', '团队卡酬')->symbol('¥')->value($this->configs['team_card'] ?? 0)->required()->setWidth(1, 3)->default(0);
$form->rate('direct_agency', '直推代理')->value($this->configs['direct_agency'] ?? 0)->required()->setWidth(1, 3)->default(0);
$form->rate('indirect_agency', '间推代理')->value($this->configs['indirect_agency'] ?? 0)->required()->setWidth(1, 3)->default(0);
$form->rate('perf_100', '100万业绩奖')->value($this->configs['perf_100'] ?? 0)->required()->setWidth(1, 3)->default(0);
$form->rate('perf_500', '500万业绩奖')->value($this->configs['perf_500'] ?? 0)->required()->setWidth(1, 3)->default(0);
$form->rate('perf_1000', '1000万业绩奖')->value($this->configs['perf_1000'] ?? 0)->required()->setWidth(1, 3)->default(0);
$form->rate('orderPerf', '城市分红')->value($this->configs['orderPerf'] ?? 0)->required()->setWidth(1, 3)->default(0);
});
$form->textarea('remark', '说明')->rules('required');
$form->tools(function (Form\Tools $tools) {
$tools->disableDelete();
$tools->disableView();
});
$form->footer(function ($footer) {
$footer->disableReset();
$footer->disableViewCheck();
$footer->disableCreatingCheck();
});
return $form;
}
}

View File

@@ -0,0 +1,150 @@
<?php
namespace App\Admin\Controllers;
use App\Admin\Actions\MobileImport;
use App\Models\Mobile;
use Encore\Admin\Controllers\AdminController;
use Encore\Admin\Form;
use Encore\Admin\Grid;
use Encore\Admin\Layout\Content;
use Encore\Admin\Show;
class MobileController extends AdminController
{
/**
* Index interface.
*
* @param Content $content
* @return Content
*/
public function index(Content $content)
{
return $content
->header('手机号管理')
->description('description')
->body($this->grid());
}
/**
* Edit interface.
*
* @param mixed $id
* @param Content $content
* @return Content
*/
public function edit($id, Content $content)
{
return $content
->header('编辑手机号')
->body($this->form()->edit($id));
}
/**
* Create interface.
*
* @param Content $content
* @return Content
*/
public function create(Content $content)
{
return $content
->header('新增手机号')
->body($this->form());
}
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
$grid = new Grid(new Mobile);
$grid->model()->orderBy('id', 'desc');
$grid->tools(function (Grid\Tools $tools) {
$tools->append(new MobileImport);
});
$grid->filter(function ($filter) {
$filter->column(1 / 2, function ($filter) {
$filter->like('number', '手机号');
$filter->equal('status', '状态')->select([
1 => '正常',
0 => '禁用',
]);
});
$filter->column(1 / 2, function ($filter) {
$filter->equal('operator', '运营商')->select(config('pick.operators'));
$filter->like('city_name', '所属(市)');
});
$filter->disableIdFilter();
});
$grid->id('ID');
$grid->number('手机号');
$grid->charge('服务费');
$grid->price('低消费');
$grid->type('靓号类型');
$grid->column('运营商')->display(function () {
return $this->operator_text;
});
$grid->column('所属地区')->display(function () {
return $this->city_name;
});
$grid->column('所属用户')->display(function () {
return $this->user ? $this->user->info->nickname : '---';
});
$grid->column('状态')->display(function () {
return $this->status_text;
});
$grid->created_at('创建时间');
return $grid;
}
/**
* Make a show builder.
*
* @param mixed $id
* @return Show
*/
protected function detail($id)
{
$show = new Show(Mobile::findOrFail($id));
$show->id('编号');
$show->name('手机号名称');
$show->created_at('创建时间');
return $show;
}
/**
* Make a form builder.
*
* @return Form
*/
protected function form()
{
$operators = (new Mobile)->operators;
$form = new Form(new Mobile);
$form->text('number', '手机号')->rules('required');
$form->text('type', '靓号类型')->rules('required');
$form->text('charge', '服务费')->rules('required');
$form->text('price', '低消')->rules('required');
$form->select('operator', '运营商')->options($operators)->rules('required');
return $form;
}
}

View File

@@ -0,0 +1,149 @@
<?php
namespace App\Admin\Controllers;
use App\Admin\Actions\Order\OrderDeliver;
use App\Admin\Exporters\OrderExporter;
use Encore\Admin\Controllers\AdminController;
use Encore\Admin\Facades\Admin;
use Encore\Admin\Grid;
use Encore\Admin\Layout\Content;
use Encore\Admin\Show;
use RuLong\Order\Models\Order;
class OrderController extends AdminController
{
/**
* Index interface.
* @param Content $content
* @return Content
*/
public function index(Content $content)
{
return $content
->header('订单列表')
->body($this->grid());
}
/**
* Show interface.
* @param mixed $id
* @param Content $content
* @return Content
*/
public function detail(Order $order, Content $content)
{
return Admin::content(function (Content $content) use ($order) {
$content->header('订单详情');
$content->body(view("admin.order.detail", compact('order')));
});
}
/**
* Make a grid builder.
* @return Grid
*/
protected function grid()
{
$grid = new Grid(new Order);
$grid->disableCreateButton();
$grid->model()->orderBy('id', 'desc')->with(['details.item', 'user.info', 'payment']);
$grid->actions(function ($actions) {
$actions->disableDelete();
$actions->disableEdit();
$actions->disableView();
if ($actions->row->canDeliver() && $actions->row->state == Order::ORDER_PAID) {
$actions->add(new OrderDeliver);
}
});
$grid->filter(function ($filter) {
$filter->disableIdFilter();
$filter->column(1 / 3, function ($filter) {
$filter->like('orderid', '订单编号');
$filter->equal('state', '订单状态')->select([
Order::ORDER_UNPAID => '待支付',
Order::ORDER_PAID => '已支付',
Order::ORDER_DELIVERED => '已发货',
Order::ORDER_SIGNED => '已签收',
Order::ORDER_CANCEL => '已取消',
]);
});
$filter->column(1 / 3, function ($filter) {
$filter->where(function ($query) {
$query->whereHas('user', function ($query) {
$query->whereHas('info', function ($query) {
$query->where('nickname', 'like', "%{$this->input}%");
});
});
}, '下单用户');
$filter->equal('type', '订单类型')->select(['MEMBER' => '会员商城', 'PICK' => '提货商城']);
});
$filter->column(1 / 3, function ($filter) {
$filter->between('created_at', '下单时间')->datetime();
$filter->between('paid_at', '付款时间')->datetime();
});
// $filter->expand();
});
$grid->orderid('订单编号')->display(function ($model) {
$ret = "<a href='orders/{$this->id}/detail' style='font-size:18px'>{$this->orderid}</a>";
$ret .= '<br/><span style="color:#999">商品数量:' . $this->details()->sum('number') . '</span>';
return $ret;
});
$grid->column('订单类型')->display(function () {
return $this->type_text;
});
$grid->column('商品信息')->display(function () {
$ret = '';
foreach ($this->details as $detail) {
$ret .= '<p style="font-size: 12px;line-height: 18px;margin: 0px;padding: 0px">' . $detail->item->getTitle() . '&nbsp;&nbsp;<span style="color:red">' . number_format($detail['price'], 2) . '</span> * ' . $detail['number'] . '</p>';
}
return $ret;
});
$grid->column('下单用户')->display(function () {
$ret = '<img src="' . $this->user->info->headimgurl . '" alt="" class="img img-thumbnail" style="max-width:40px;max-height:40px;vertical-align:top">';
$ret .= '<div style="display:inline-block;margin-left:5px">' . $this->user->info->nickname;
$ret .= '<br/>' . $this->user->info->mobile . '</div>';
return $ret;
});
$grid->column('价格')->display(function () {
$ret = '商品小计:' . number_format($this->amount, 2);
$ret .= '<br/>应收总额:' . number_format($this->total, 2);
return $ret;
});
$grid->column('状态')->display(function () {
$ret = $this->state_text . '<br>';
// $ret .= $this->status . '<br>';
if ($this->payment) {
$ret .= $this->payment->type_text . '<br>';
$ret .= $this->payment->trade_no . '<br>';
$ret .= $this->payment->transaction_id;
}
return $ret;
});
$grid->column('下单时间/付款时间')->display(function ($gd) {
$ret = $this->created_at . '<br/>';
$ret .= $this->paid_at;
return $ret;
});
$grid->disableExport(false);
$grid->exporter(new OrderExporter());
return $grid->render();
}
}

View File

@@ -0,0 +1,117 @@
<?php
namespace App\Admin\Controllers;
use App\Admin\Actions\ProfitStart;
use App\Models\Profit;
use Encore\Admin\Controllers\AdminController;
use Encore\Admin\Form;
use Encore\Admin\Grid;
use Encore\Admin\Widgets\Table;
use RuLong\Identity\Models\Identity;
class ProfitController extends AdminController
{
protected $title = '大盘分红管理';
protected function grid()
{
$grid = new Grid(new Profit);
$grid->disableFilter();
$grid->disableExport();
$grid->disableRowSelector();
$grid->tools(function ($tools) {
$tools->batch(function ($batch) {
$batch->disableDelete();
});
});
$grid->actions(function ($actions) {
$actions->disableDelete();
$actions->disableView();
if ($this->row->sett === 0) {
$actions->add(new ProfitStart);
}
});
$grid->fixColumns(0, 0);
$grid->model()->orderBy('id', 'asc');
$grid->column('id', '序号')->sortable();
$grid->column('分配级别')->display(function () {
return $this->identity->title ?? '';
});
$grid->column('price', '分配额度');
$grid->column('num', '分配人数');
$grid->column('single', '单人分红金额');
$grid->column('realPrice', '实发总金额');
$grid->column('sett', '是否结算')->using([
0 => '否',
1 => '是',
])->label([
0 => 'warning',
1 => 'success',
]);
$grid->column('created_at', '添加时间');
$grid->column('updated_at', '修改时间');
$grid->column('setted_at', '结算时间');
$grid->column('分红记录')->display(function () {
return '点击查看详情';
})->modal('分红记录', function ($model) {
$comments = $model->logs->map(function ($comment) {
return [
$comment->profit->id,
$comment->profit->price,
$comment->user_id,
$comment->user->username ?? '---',
$comment->user->info->nickname ?? '---',
$comment->price,
$comment->created_at->format('Y-m-d H:i:s'),
];
});
return new Table(['分红ID', '分红总金额', '用户ID', '用户账号', '用户昵称', '分红金额', '产生时间'], $comments->toArray());
});
return $grid;
}
protected function form()
{
$form = new Form(new Profit);
$form->display('id', 'ID');
$form->tools(function (Form\Tools $tools) {
$tools->disableDelete();
$tools->disableView();
});
$identitys = Identity::orderBy('id', 'desc')->pluck('title', 'id')->toArray();
$form->select('identity_id', '分红身份')->options($identitys)->required();
$form->currency('price', '分红总额度')->symbol('¥')->rules('required|min:0')->required();
$states = [
'on' => ['value' => 1, 'text' => '是', 'color' => 'success'],
'off' => ['value' => 0, 'text' => '否', 'color' => 'danger'],
];
$form->switch('sett', '是否立即结算')->states($states)->default('off');
$form->footer(function ($footer) {
$footer->disableReset();
$footer->disableViewCheck();
$footer->disableCreatingCheck();
});
$form->saved(function (Form $form) {
$log = $form->model();
if (!empty($log->setted_at) && $log->sett == 0) {
$log->sett = 1;
$log->save();
}
if ($log->sett == 1 && empty($log->setted_at)) {
//默认结算,并且结算时间为空,开始结算
$log->sett = 0;
$log->save();
\App\Bonus\ProfitStart::settlement($log);
}
});
return $form;
}
}

View File

@@ -0,0 +1,44 @@
<?php
namespace App\Admin\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class TestController extends Controller
{
public function index(Request $request)
{
$users = \App\Models\User::whereHas('identity.info', function ($query) {
$query->where('configs->perf_100', '>', 0)
->orWhere('configs->perf_500', '>', 0)
->orWhere('configs->perf_1000', '>', 0);
})->get();
foreach ($users as $key => $user) {
\App\Jobs\Perf::dispatch($user, true);
dump($user->id);
}
dd(1);
$UpgradePayment = \App\Models\UpgradePayment::find(7);
// $source = [
// 'user_id' => $UpgradePayment->user->id,
// 'type' => 'UpgradeVip',
// 'payment_id' => $UpgradePayment->id,
// ];
// \App\Bonus\AddPerf::settlement($UpgradePayment->user, $UpgradePayment->amount, $source);
event(new \App\Events\UpgradePaid($UpgradePayment));
dd();
//购卡订单
//
$info = \App\Models\CardPayment::find(2);
\App\Bonus\BuyCard::settlement($info);
//推荐代理示例
// $info = \App\Models\UpgradePayment::find(5);
// \App\Bonus\DirectAgency::settlement($info);
//推荐会员示例
// $info = \App\Models\UpgradePayment::find(2);
// \App\Bonus\DirectVip::settlement($info);
}
}

View File

@@ -0,0 +1,144 @@
<?php
namespace App\Admin\Controllers;
use App\Models\UpgradePayment;
use Encore\Admin\Controllers\AdminController;
use Encore\Admin\Grid;
use Encore\Admin\Layout\Content;
use RuLong\Identity\Models\IdentityLog;
class UpgradeController extends AdminController
{
/**
* Index interface.
*
* @param Content $content
* @return Content
*/
public function index(Content $content)
{
return $content
->header('升级订单')
->description('description')
->body($this->grid());
}
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
$grid = new Grid(new UpgradePayment);
$grid->model()->orderBy('id', 'desc');
$grid->disableCreateButton();
$grid->disableActions();
$grid->filter(function ($filter) {
$filter->column(1 / 3, function ($filter) {
$filter->like('id', '序号');
$filter->equal('type', '类型')->select([
'vip' => '升级会员',
'agent' => '升级代理商',
]);
});
$filter->column(1 / 3, function ($filter) {
$filter->where(function ($query) {
$query->whereHas('user', function ($query) {
$query->whereHas('info', function ($query) {
$query->where('nickname', 'like', "%{$this->input}%");
});
});
}, '用户名称');
});
$filter->disableIdFilter();
});
$grid->column('id', '序号');
$grid->column('手机号')->display(function () {
return $this->user->username;
});
$grid->column('用户名称')->display(function () {
return $this->user->info->nickname;
});
$grid->column('trade_no', '流水号');
$grid->column('amount', '金额');
$grid->column('total', '实付');
$grid->column('type', '类型')->display(function () {
return $this->type_text;
});
$grid->column('pay_type', '支付方式')->display(function () {
return $this->pay_type_text;
});
$grid->column('状态')->display(function () {
return $this->state_text;
});
$grid->column('created_at', '创建时间');
$grid->column('paid_at', '支付时间');
return $grid;
}
/**
* Index interface.
*
* @param Content $content
* @return Content
*/
public function logs(Content $content)
{
return $content
->header('升降记录')
->description('description')
->body($this->logsgrid());
}
public function logsgrid()
{
$grid = new Grid(new IdentityLog);
$grid->model()->orderBy('id', 'desc');
$grid->disableCreateButton();
$grid->disableActions();
$grid->filter(function ($filter) {
$filter->column(1 / 3, function ($filter) {
$filter->like('id', '序号');
$filter->equal('channel', '渠道')->select([
'AutoUp' => '自动升级',
'EmptyUp' => '后台升级',
]);
});
$filter->disableIdFilter();
});
$grid->column('id', '序号');
$grid->column('用户')->display(function () {
return $this->user->info->nickname;
});
$grid->column('升级前')->display(function () {
return $this->before_identity_title;
});
$grid->column('升级后')->display(function () {
return $this->identity_title ?: '普通用户';
});
$grid->column('渠道')->display(function () {
return $this->channel_text;
});
$grid->created_at('升级时间');
return $grid;
}
}

View File

@@ -0,0 +1,31 @@
<?php
namespace App\Admin\Controllers;
use Encore\Admin\Controllers\AdminController;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
class UploadController extends AdminController
{
public function editor(Request $request)
{
$files = $request->file("image");
if (empty($files)) {
return response()->json(['errno' => 5, 'msg' => '请选择文件']);
}
foreach ($files as $file) {
$path = $file->store(
'editor/' . date('Y/m/d'),
config('admin.upload.disk')
);
$data[] = Storage::disk(config('admin.upload.disk'))->url($path);
}
return ['errno' => 0, 'data' => $data];
}
}

View File

@@ -0,0 +1,133 @@
<?php
namespace App\Admin\Controllers;
use App\Admin\Actions\SetParent;
use App\Admin\Actions\UserUpgrade;
use App\Models\User;
use Encore\Admin\Controllers\AdminController;
use Encore\Admin\Facades\Admin;
use Encore\Admin\Form;
use Encore\Admin\Grid;
use Encore\Admin\Layout\Content;
class UserController extends AdminController
{
/**
* Index interface.
*
* @param Content $content
* @return Content
*/
public function index(Content $content)
{
return $content
->header('会员管理')
->body($this->grid());
}
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
$grid = new Grid(new User);
$grid->disableCreateButton();
$grid->disableRowSelector();
$grid->actions(function ($actions) {
$actions->disableDelete();
$actions->disableEdit();
$actions->disableView();
$actions->add(new UserUpgrade);
if (!$this->row->parent) {
$actions->add(new SetParent);
}
});
$grid->model()->orderBy('id', 'desc')->with(['info', 'account', 'orders']);
$grid->id('序号')->sortable();
$grid->filter(function ($filter) {
$filter->disableIdFilter();
$filter->column(1 / 2, function ($filter) {
$filter->like('id', '序号');
$filter->like('info.nickname', '会员昵称');
});
$filter->column(1 / 2, function ($filter) {
$filter->like('username', '会员手机号');
$filter->equal('identity.identity_id', '级别')->select([
' ' => '全部',
'1' => '会员',
'2' => '金牌',
'3' => '城市',
'4' => '股东',
]);
});
});
$grid->column('头像 昵称')->display(function () {
$avatar = '<img src="' . $this->info->headimgurl . '" alt="" style="width:40px;height:40px;border-radius:50%" />';
return $avatar . ' ' . $this->info->nickname;
});
$grid->column('手机号')->display(function () {
return $this->username;
});
$states = [
'on' => ['value' => 1, 'text' => '是', 'color' => 'primary'],
'off' => ['value' => 0, 'text' => '否', 'color' => 'default'],
];
$grid->column('is_contract', '签订合同')->switch($states);
$grid->column('activationd_at', '升级代理时间');
$grid->column('推荐人')->display(function () {
return $this->parent ? $this->parent->info->nickname . '(' . $this->parent->id . ')' : '';
});
$grid->column('账户')->display(function () {
$ret = '余额:' . $this->account->cash;
return $ret;
});
$grid->column('等级')->display(function () {
return $this->identity_text;
});
$grid->created_at('注册时间');
return $grid;
}
/**
* Make a form builder.
*
* @return Form
*/
protected function form()
{
$form = new Form(new User);
$form->switch('is_contract', '签订合同')->default(1);
$form->saving(function (Form $form) {
if (request()->has('is_contract') && $form->model()->identity_id < 2) {
return response()->json([
'status' => false,
'message' => '当前账号不可设置合同状态。',
]);
}
});
return $form;
}
}

View File

@@ -0,0 +1,44 @@
<?php
namespace App\Admin\Exporters;
use App\Models\User;
use Encore\Admin\Grid\Exporters\ExcelExporter;
use Maatwebsite\Excel\Concerns\WithMapping;
class AccountLog extends ExcelExporter implements WithMapping
{
protected $fileName = '佣金明细.xlsx';
protected $headings = [
'序号',
'用户编号',
'用户账号',
'用户名称',
'佣金名称',
'佣金金额',
'佣金描述',
'产生时间',
];
public function __construct()
{
$this->fileName = '佣金明细' . date('YmdHis') . '.xlsx';
}
public function map($info): array
{
$data = [
'id' => (string) $info->id,
'user_id' => (string) $info->user_id,
'username' => '`' . $info->user->username,
'nickname' => (string) $info->userinfo->nickname,
'title' => (string) $info->rule->title,
'variable' => (string) $info->variable,
'remark' => (string) $info->rule->remark,
'created_at' => (string) $info->created_at,
];
return $data;
}
}

View File

@@ -0,0 +1,43 @@
<?php
namespace App\Admin\Exporters;
use App\Models\User;
use Encore\Admin\Grid\Exporters\CsvExporter;
use Maatwebsite\Excel\Concerns\WithMapping;
use Maatwebsite\Excel\Concerns\WithStrictNullComparison;
class CardExporters extends CsvExporter implements WithMapping, WithStrictNullComparison
{
protected $fileName = '联卡蝠激活卡.csv';
protected $mapTrue = true;
protected $users = [];
public function __construct()
{
$this->fileName = '联卡蝠激活卡' . date('YmdHis') . '.csv';
$this->users = User::pluck('username', 'id')->toArray();
}
protected $headings = ['卡序号', '归属', '卡号', '打印卡号', '卡密', '类型', '专项', '状态', '激活用户', '激活时间', '创建时间', '更改时间'];
public function map($info): array
{
$data = [
$info->id,
$this->users[$info->user_id] ?? '无',
'`' . $info->code,
$info->type . $info->code,
$info->pass,
$info->type,
$info->type == 'K' ? '商品ID' . $info->source['goods'] . '规格ID' . $info->source['param'] : '非专项',
$info->status_text,
$this->users[$info->active_id] ?? '无',
$info->actived_at,
$info->created_at,
$info->updated_at,
];
return $data;
}
}

View File

@@ -0,0 +1,39 @@
<?php
namespace App\Admin\Exporters;
use Encore\Admin\Grid\Exporters\ExcelExporter;
use Maatwebsite\Excel\Concerns\WithMapping;
class CashOutExport extends ExcelExporter implements WithMapping
{
protected $fileName = '提现用户.xlsx';
protected $columns = [
'id' => '序号',
'user_id' => '用户ID',
'user.username' => '用户账号',
'user.info.nickname' => '用户昵称',
'cash_account_no' => '支付宝账户',
'variable' => '提现金额',
'state' => '提现状态',
'created_at' => '提现时间',
];
public function map($info): array
{
$data = [
'id' => $info->id,
'user_id' => $info->user_id,
'user.username' => ' ' . $info->user->username,
'user.info.nickname' => ' ' . $info->user->info->nickname,
'cash_account_no' => ' ' . $info->cash_account_no,
'variable' => ' ' . $info->variable,
'state' => $info->state_text,
'created_at' => $info->created_at,
];
return $data;
}
}

View File

@@ -0,0 +1,66 @@
<?php
/**
* Created by PhpStorm.
* User: 朝霞
* Date: 2019/5/14
* Time: 1:51 PM
*/
namespace App\Admin\Exporters;
use Encore\Admin\Grid\Exporters\AbstractExporter;
use Maatwebsite\Excel\Facades\Excel;
class GoodsExporter extends AbstractExporter
{
/**
* @Notes 商品导出
* @Author 朝霞
* @DateTime 2019/5/14 2:09 PM
*/
public function export()
{
Excel::create('商品导出', function ($excel) {
$excel->sheet('Sheetname', function ($sheet) {
$head = ['商品ID','商品名称','成本价','销售价','市场价','销量','库存','销售分公司','状态','开团时间','截团时间','创建时间', '最后更新时间'];
$body = ['id','name','cost_price','price','original_price','sales','stock','companies','status','activity_begined_at','activity_ended_at','created_at', 'updated_at'];
$bodyRows = collect($this->getData())->map(function ($item)use($body) {
foreach ($body as $keyName){
switch ($keyName) {
case 'status' :
switch (array_get($item, $keyName)) {
case 0:
$arr[] = '审核中';
break;
case 1:
$arr[] = '上架';
break;
case -1:
$arr[] = '下架';
break;
default:
$arr[] = '未知状态';
break;
}
break;
case 'companies' :
$companies = array_get($item, 'companies');
$arr[] = count($companies) > 0 ? implode('/', array_column($companies,'name')) : '';
break;
default:
$arr[] = array_get($item, $keyName);
break;
}
}
return $arr;
});
$rows = collect([$head])->merge($bodyRows);
$sheet->rows($rows);
});
})->export('xlsx');
}
}

View File

@@ -0,0 +1,59 @@
<?php
namespace App\Admin\Exporters;
use App\Models\User;
use Encore\Admin\Grid\Exporters\CsvExporter;
use Maatwebsite\Excel\Concerns\WithMapping;
use Maatwebsite\Excel\Concerns\WithStrictNullComparison;
class OrderExporter extends CsvExporter implements WithMapping, WithStrictNullComparison
{
protected $mapTrue = true;
public function __construct()
{
$this->fileName = '订单导出' . date('YmdHis') . '.csv';
}
protected $headings = ['订单编号', '商品总数', '订单类型', '商品信息', '下单用户', '价格', '状态', '下单时间', '付款时间'];
public function map($info): array
{
$data = [
'`' . $info->orderid,
$info->details()->sum('number'),
$info->type_text,
self::getGoodsValue($info->details),
$info->user->info->nickname . "\r\n" . $info->user->username,
"商品小计:" . number_format($info->amount, 2) . "\r\n" . "应收总额:" . number_format($info->total, 2),
self::getOrderStatus($info),
$info->created_at,
$info->paid_at,
];
return $data;
}
protected function getGoodsValue($details)
{
$ret = '';
foreach ($details as $detail) {
$ret .= $detail['item']['name'] . number_format($detail['price'], 2) . "\r\n";
}
return $ret;
}
protected function getOrderStatus($order)
{
$ret = $order->state_text . "\r\n";
if ($order->payment) {
$ret .= $order->payment->type_text . "\r\n";
$ret .= $order->payment->trade_no . "\r\n";
$ret .= $order->payment->transaction_id;
}
return $ret;
}
}

View File

@@ -0,0 +1,22 @@
<?php
namespace App\Admin\Exporters;
use Encore\Admin\Grid\Exporters\ExcelExporter;
use Maatwebsite\Excel\Concerns\WithMapping;
class ProvinceExporter extends ExcelExporter implements WithMapping
{
protected $fileName = '省市管理.xlsx';
protected $columns = [
'shortname' => '省市区名称',
];
public function map($area): array
{
return [
$area->shortname,
];
}
}

View File

@@ -0,0 +1,43 @@
<?php
namespace App\Admin\Extensions;
use Encore\Admin\Form\Field;
class WangEditor extends Field
{
protected $view = 'admin.wang-editor';
protected static $css = [
'/vendor/wangEditor-3.1.1/release/wangEditor.min.css',
];
protected static $js = [
'/vendor/wangEditor-3.1.1/release/wangEditor.min.js',
];
public function render()
{
$_token = csrf_token();
$name = $this->formatName($this->column);
$this->script = <<<EOT
var E = window.wangEditor
var editor = new E('#{$this->id}');
editor.customConfig.zIndex = 0
editor.customConfig.uploadImgServer = '/admin/uploads/editor'
editor.customConfig.uploadImgMaxSize = 2 * 1024 * 1024
editor.customConfig.uploadFileName = 'image[]'
editor.customConfig.uploadImgParams = {
_token: '{$_token}'
}
editor.customConfig.onchange = function (html) {
$('input[name=\'$name\']').val(html);
}
editor.create()
EOT;
return parent::render();
}
}

View File

@@ -0,0 +1,36 @@
<?php
namespace App\Admin\Extensions;
/**
* 校验手机号
*/
class mobile
{
public function phoneOperator()
{
$isPhone = "/^1[3-9]\d{9}$/"; //先判断正确手机号格式
if (preg_match($isPhone, $phone)) {
$isChinaMobile = "/^134[0-9]\d{7}$|^1703\d{7}$|^170[5-6]\d{7}$|^(?:13[5-9]|147|148|15[0-27-9]|178|18[2-478]|198)\d{8}$/"; //
$isChinaUnion = "/^1704\d{7}$|^170[7-9]\d{7}$|^171[0-9]\d{7}$|^(?:13[0-2]|145|15[56]|166|140|175|176|18[56])\d{8}$/"; //
$isChinaTelcom = "/^(?:133|153|169|177|173|174|170|179|18[019]|199)\d{8}$|^170[0-2]\d{7}$/"; //
if (preg_match($isChinaMobile, $phone)) {
return 'mobile'; //中国移动
} else if (preg_match($isChinaUnion, $phone)) {
return 'unicom'; //中国联通
} else if (preg_match($isChinaTelcom, $phone)) {
return 'telecom'; //中国电信
} else {
return 0;
}
} else {
return 0;
}
}
}

View File

@@ -0,0 +1,50 @@
<?php
namespace App\Admin\Imports;
use App\Models\Mobile as MobileModel;
use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\ToCollection;
use RuLong\Area\Models\Area;
class Mobile implements ToCollection
{
public function collection(Collection $rows)
{
$operators = [
'移动号码' => 'mobile',
'联通号码' => 'unicom',
'电信号码' => 'telecom',
];
unset($rows[0]);
$lists = [];
foreach ($rows as $row) {
$area = Area::where('name', $row['5'])->first();
$data = [
'number' => (string) $row[0] ?: '', //手机号
'begin' => substr($row[1], 0, 3), //号段
'type' => $row[2], //靓号类型
'charge' => $row[3] ?: 0, //服务费
'price' => $row[4] ?: 0, //低消
'province_sn' => $area->psn ?: null,
'city_sn' => $area->sn ?: null,
'operator' => $operators[$row[6]] ?: null, //运营商
'city_name' => $row[5],
'created_at' => now(),
'updated_at' => now(),
];
$info = MobileModel::where('number', $data['number'])->first();
if ($info) {
$info->update($data);
} else {
$lists[] = $data;
}
}
if (count($lists) > 0) {
MobileModel::insert($lists);
}
}
}

28
app/Admin/bootstrap.php Normal file
View File

@@ -0,0 +1,28 @@
<?php
use App\Admin\Extensions\WangEditor;
use Encore\Admin\Form;
use Encore\Admin\Grid;
Form::forget(['map']);
Form::extend('editor', WangEditor::class);
Form::init(function (Form $form) {
$form->disableEditingCheck();
$form->disableCreatingCheck();
$form->disableViewCheck();
$form->tools(function (Form\Tools $tools) {
$tools->disableDelete();
$tools->disableView();
$tools->disableList();
});
});
Grid::init(function (Grid $grid) {
$grid->disableExport();
$grid->disableRowSelector();
$grid->actions(function (Grid\Displayers\Actions $actions) {
$actions->disableView();
});
});

68
app/Admin/routes.php Normal file
View File

@@ -0,0 +1,68 @@
<?php
use Illuminate\Routing\Router;
Admin::routes();
Route::group([
'prefix' => config('admin.route.prefix'),
'namespace' => config('admin.route.namespace'),
'middleware' => config('admin.route.middleware'),
], function (Router $router) {
$router->get('/', 'HomeController@index')->name('admin.home');
$router->post('uploads/editor', 'UploadController@editor')->name('uploads.editor');
// 分类
$router->resource('categories', 'CategoryController');
//文章
$router->resource('articles', 'ArticleController');
// 轮播图管理
$router->resource('adverts', 'AdvertController');
//商品管理
$router->resource('goods', 'GoodsController');
//手机号管理
$router->resource('mobiles', 'MobileController');
//大盘分红
$router->resource('profit', 'ProfitController');
//卡管理管理
$router->get('card/getGoods', 'CardController@getGoods');
$router->get('card/getParam', 'CardController@getParam');
$router->post('card/createCard', 'CardController@createCard');
$router->resource('card', 'CardController');
$router->resource('cardorder', 'CardOrderController');
//用户管理
$router->get('users/{user}/empty', 'UserController@emptys')->name('admin.users.empty');
$router->post('users/{user}/empty', 'UserController@DoEmpty');
$router->any('users/{user}/remark', 'UserController@remark')->name('admin.users.remark');
$router->resource('users', 'UserController');
// 订单管理
$router->post('orders/{order}/deliver', 'OrderController@deliver');
$router->get('orders/{order}/detail', 'OrderController@detail')->name('admin.orders.detail');
$router->resource('orders', 'OrderController');
//账户管理
$router->resource('account', 'AccountController');
//账变明细
$router->get('accountlog/logs', 'AccountlogController@logs')->name('admin.accountlog.logs');
$router->resource('accountlog', 'AccountlogController');
//身份管理
$router->resource('identity', 'IdentityController');
//区域列表
$router->post('areas/setManage', 'AreaController@setManage');
$router->resource('areas', 'AreaController');
//升级订单
$router->get('upgrades', 'UpgradeController@index')->name('admin.upgrades.index');
$router->get('upgrades/logs', 'UpgradeController@logs')->name('admin.upgrades.logs');
//用户提现管理
$router->get('cashout/logs', 'CashOutController@logs')->name('admin.cashout.logs');
$router->resource('cashout', 'CashOutController');
$router->get('test', 'TestController@index');
});

View File

@@ -0,0 +1,42 @@
<?php
namespace App\Agent;
use App\Agent\Middleware\Authenticate;
use Illuminate\Support\Facades\Route;
use Illuminate\Support\ServiceProvider;
class AgentServiceProvider extends ServiceProvider
{
protected $routeMiddleware = [
'auth.agent' => Authenticate::class,
];
public function boot()
{
$this->loadViewsFrom(__DIR__ . '/Views', 'Agent');
}
public function register()
{
$this->registerRouteMiddleware();
$this->loadAgentRoutes();
}
protected function registerRouteMiddleware()
{
foreach ($this->routeMiddleware as $key => $middleware) {
Route::aliasMiddleware($key, $middleware);
}
}
protected function loadAgentRoutes()
{
Route::middleware('web')
->prefix('agent')
->name('Agent.')
->namespace('App\Agent\Controllers')
->group(__DIR__ . '/routes.php');
}
}

View File

@@ -0,0 +1,34 @@
<?php
namespace App\Agent\Controllers;
use Auth;
use Illuminate\Http\Request;
/**
* 账户管理
*/
class AccountController extends Controller
{
public function __construct(Request $request)
{
view()->share('app_title', '账户管理');
}
public function index(Request $request)
{
$user = Auth::guard('agent')->user();
$lists = $user->accountLogs()->paginate();
if ($request->isMethod('POST')) {
if ($lists->isNotEmpty()) {
$html = response(view('Agent::account.more', compact('lists')))->getContent();
return $this->success($html);
} else {
return $this->error('没有数据了');
}
} else {
return view('Agent::account.index', compact('user', 'lists'));
}
}
}

View File

@@ -0,0 +1,28 @@
<?php
namespace App\Agent\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,
];
}
}

View File

@@ -0,0 +1,83 @@
<?php
namespace App\Agent\Controllers;
use Auth;
use Illuminate\Auth\Events\Login;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\View;
use Validator;
class AuthController extends Controller
{
public function __construct()
{
$this->middleware('auth.agent')->except(['login']);
}
/**
* 用户登录 *
* @Author:<C.Jason>
* @Date:2018-11-07T13:47:02+0800
* @param Request $request
*/
public function login(Request $request)
{
$user = Auth::guard('agent')->user();
if ($user) {
if ($user->identity_id < 2) {
return redirect()->route('Agent.logout');
}
return redirect()->route('Agent.index');
}
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::guard('agent')->attempt($cert, true)) {
$user = Auth::guard('agent')->user();
if ($user->identity_id < 2) {
return $this->success('您没有登录权限', route('Agent.logout'));
}
return $this->success('登录成功', route('Agent.index'));
} else {
return $this->error('用户名或密码不存在');
}
} else {
return view('Agent::auth.login');
}
}
/**
* 退出登录
* @Author:<C.Jason>
* @Date:2018-11-07T13:46:45+0800
*/
public function logout()
{
Auth::guard('agent')->logout();
session()->flush();
return redirect()->route('Agent.login');
}
}

View File

@@ -0,0 +1,101 @@
<?php
namespace App\Agent\Controllers;
use App\Models\CardOrder;
use App\Models\CardOrderExpress;
use App\Rules\Checkmobile;
use Auth;
use Config;
use Illuminate\Http\Request;
use RuLong\Area\Models\UserAddress;
/**
* 提货卡管理
*/
class CardController extends Controller
{
public function index(Request $request)
{
$user = Auth::guard('agent')->user();
$status = $request->status;
$lists = $user
->mycard()
->when($status, function ($q) use ($status) {
$q->where('status', $status);
})->paginate();
if ($request->isMethod('POST')) {
if ($lists->isNotEmpty()) {
$html = response(view('Agent::card.more', compact('lists')))->getContent();
return $this->success($html);
} else {
return $this->error('没有数据了');
}
} else {
$data = [
'all' => $user->mycard()->count(),
'residue' => $user->mycard()->where('active_id', 0)->count(),
'5' => $user->mycard()->where('status', 5)->count(),
'2' => $user->mycard()->where('status', 2)->count(),
'3' => $user->mycard()->where('status', 3)->count(),
'4' => $user->mycard()->where('status', 4)->count(),
];
return view('Agent::card.index', compact('user', 'data', 'lists', 'status'));
}
}
//进卡
public function buy(Request $request)
{
$user = Auth::guard('agent')->user();
if ($request->isMethod('POST')) {
if ($user->identity_id < 2) {
return $this->error('您没有购卡权限');
}
$request->validate([
'num' => 'required',
'name' => 'required',
'mobile' => ['required', new Checkmobile],
'address' => 'required',
], [
'num.required' => '进货数量不能为空',
'name.required' => '收货人姓名必须填写',
'mobile.required' => '收货人电话必须填写',
'address.required' => '收货人地址必须填写',
]);
$num = $request->num;
$card_price = Config::get('card_price', 15);
$price = $num * $card_price;
$data = [
'user_id' => $user->id,
'num' => $num,
'price' => $price,
'remark' => $request->remark ?? '',
];
if ($cardOrder = CardOrder::create($data)) {
$address = [
'name' => $request->name,
'mobile' => $request->mobile,
'address' => $request->address,
];
$express = new CardOrderExpress(['instance' => $address]);
$cardOrder->express()->save($express);
} else {
return $this->error('下单失败');
}
return $this->success('订单创建成功', route('Agent.pay.order', $cardOrder->order_id));
} else {
$address = UserAddress::where('user_id', $user->id)->orderBy('is_default', 'desc')->first() ?? '';
return view('Agent::card.buy', compact('user', 'address'));
}
}
}

View File

@@ -0,0 +1,126 @@
<?php
namespace App\Agent\Controllers;
use App\Models\CashAccount;
use Auth;
use Carbon\Carbon;
use Illuminate\Http\Request;
use RuLong\UserAccount\Account;
use Validator;
class CashOutController extends Controller
{
public function index(Request $request)
{
$user = Auth::guard('agent')->user();
if ($request->isMethod('post')) {
$check = $user->cashouts()->whereDate('created_at', Carbon::today()->toDateString())->get()->toArray();
if ($check) {
// return $this->error('每天只能提现一次');
}
$validator = Validator::make($request->all(), [
'variable' => ['required', 'numeric', function ($attribute, $value, $fail) use ($user) {
if ($value == 0) {
return $fail('输入金额不能为0');
}
if ($value > $user->account->cash) {
return $fail('输入金额不能大于可提现金额');
}
}],
], [
'variable.required' => '金额不能为空',
'variable.numeric' => '金额格式不正确',
]);
if ($validator->fails()) {
return $this->error($validator->errors()->first());
}
$result = $user->cashouts()->create([
'cash_account_id' => $user->cashAccount->id,
'variable' => $request->variable,
'state' => 'INIT',
'cash_account_no' => $user->cashAccount->alipay_account,
]);
if ($result) {
$user->rule('cashout', -$request->variable);
return $this->success('操作成功', route('Agent.index'));
} else {
return $this->error('提现失败');
}
} else {
return view('Agent::cashout.index', compact('user'));
}
}
public function cashadd(Request $request)
{
if ($request->isMethod('post')) {
$user = Auth::guard('agent')->user();
$validator = Validator::make($request->all(), [
'alipay_account' => 'required',
'name' => 'required',
'alipay_account_code' => 'required',
], [
'alipay_account.required' => '支付宝账号不能为空',
'name.required' => '姓名不能为空',
'alipay_account_code' => '商户二维码必须上传',
]);
if ($validator->fails()) {
return $this->error($validator->errors()->first());
}
$result = $user->cashAccount()->create([
'alipay_account' => $request->alipay_account,
'name' => $request->name,
'alipay_account_code' => $request->alipay_account_code,
]);
if ($result) {
return $this->success('操作成功', route('Agent.cashout'));
} else {
return $this->error('失败');
}
} else {
return view('Agent::cashout.cashadd');
}
}
public function cashedit(Request $request, CashAccount $cashaccount)
{
if ($request->isMethod('put')) {
$validator = Validator::make($request->all(), [
'alipay_account' => 'required',
'name' => 'required',
'alipay_account_code' => 'required',
], [
'alipay_account.required' => '支付宝账号不能为空',
'name.required' => '姓名不能为空',
'alipay_account_code' => '商户二维码必须上传',
]);
if ($validator->fails()) {
return $this->error($validator->errors()->first());
}
if ($cashaccount->update($request->all())) {
return $this->success('操作成功', route('Agent.cashout'));
} else {
return $this->error('失败');
}
} else {
return view('Agent::cashout.cashedit', compact('cashaccount'));
}
}
public function logs(Request $request)
{
$user = Auth::guard('agent')->user();
$lists = $user->cashouts()->paginate();
if ($request->isMethod('POST')) {
if ($lists->isNotEmpty()) {
$html = response(view('Agent::cashout.more', compact('lists')))->getContent();
return $this->success($html);
} else {
return $this->error('没有数据了');
}
} else {
return view('Agent::cashout.logs', compact('user', 'lists'));
}
}
}

View File

@@ -0,0 +1,13 @@
<?php
namespace App\Agent\Controllers;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Routing\Controller as BaseController;
class Controller extends BaseController
{
use AuthorizesRequests, DispatchesJobs, ValidatesRequests, AjaxResponse;
}

View File

@@ -0,0 +1,33 @@
<?php
namespace App\Agent\Controllers;
use App\Events\CardOrderPaid;
use App\Models\CardPayment;
use Illuminate\Http\Request;
class NotifyController extends Controller
{
public function payment(Request $request)
{
$app = app('wechat.payment');
return $app->handlePaidNotify(function ($message, $fail) {
$payment = CardPayment::where('trade_no', $message['out_trade_no'])->first();
$order = $payment->order;
if ($payment->state != 'SUCCESS') {
$payment->state = 'SUCCESS';
$payment->transaction_id = $message['transaction_id'];
$payment->paid_at = $message['time_end'];
$payment->save();
$order->status = 1;
$order->save();
event(new CardOrderPaid($payment));
}
return true;
});
}
}

View File

@@ -0,0 +1,78 @@
<?php
namespace App\Agent\Controllers;
use App\Events\CardOrderSignined;
use App\Models\CardOrder;
use Auth;
class OrderController extends Controller
{
public function __construct()
{
view()->share('app_title', '我的订单');
}
public function index()
{
$orders = CardOrder::where('user_id', Auth::guard('agent')->id())
->orderBy('id', 'desc')
->get();
return view('Agent::orders.index', compact('orders'));
}
public function unpay()
{
$orders = CardOrder::where('status', 0)
->where('user_id', Auth::guard('agent')->id())
->orderBy('id', 'desc')
->get();
return view('Agent::orders.index', compact('orders'));
}
public function paid()
{
$orders = CardOrder::where('status', 1)
->where('user_id', Auth::guard('agent')->id())
->orderBy('id', 'desc')
->get();
return view('Agent::orders.index', compact('orders'));
}
public function delivered()
{
$orders = CardOrder::where('status', 2)
->where('user_id', Auth::guard('agent')->id())
->orderBy('id', 'desc')
->get();
return view('Agent::orders.index', compact('orders'));
}
public function signed()
{
$orders = CardOrder::where('status', 3)
->where('user_id', Auth::guard('agent')->id())
->orderBy('id', 'desc')
->get();
return view('Agent::orders.index', compact('orders'));
}
public function sign($orderid)
{
$order = CardOrder::where('order_id', $orderid)->firstOrFail();
try {
$order->express->update([
'receive_at' => now(),
]);
$order->status = 3;
$order->save();
event(new CardOrderSignined($order));
return $this->success('签收成功', route('Agent.orders.signed'));
} catch (\Exception $e) {
return $this->error('签收失败' . $e->getmessage());
}
}
}

View File

@@ -0,0 +1,66 @@
<?php
namespace App\Agent\Controllers;
use App\Models\CardOrder;
use App\Models\CardPayment;
use Illuminate\Http\Request;
class PayController extends Controller
{
private function getpayOrder(CardOrder $order, $type)
{
$payOrder = CardPayment::create([
'card_order_id' => $order->id,
'type' => $type,
'amount' => $order->price,
]);
return $payOrder;
}
public function order(Request $request, $orderid)
{
$order = CardOrder::where('order_id', $orderid)->first();
return view('Agent::pay.order', compact('order'));
}
/**
* 微信支付
* @param Request $request [description]
* @param [type] $orderid [description]
* @return [type] [description]
*/
public function wechat(Request $request, $orderid)
{
$order = CardOrder::where('order_id', $orderid)->first();
$openid = $order->user->openid;
$amount = $order->price;
$payOrder = $this->getpayOrder($order, 'WECHAT');
if ($amount != $payOrder->amount) {
$payOrder->amount = $amount;
$payOrder->save();
}
$app = app('wechat.payment');
$amount = $payOrder->amount;
$result = $app->order->unify([
'body' => '商城订单-进货卡',
'out_trade_no' => $payOrder->trade_no,
// 'total_fee' => $amount * 100,
'total_fee' => 1,
'notify_url' => route('Agent.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']);
}
}
}

View File

@@ -0,0 +1,26 @@
<?php
namespace App\Agent\Controllers;
use App\Models\User;
use Auth;
use Image;
use QrCode;
class ShareController extends Controller
{
public function __construct()
{
view()->share('app_title', '我的推广');
}
public function index(User $user)
{
$user = Auth::guard('agent')->user();
$shareimg = Image::make(QrCode::size(3000)->format('png')->margin(0)->generate(route('login') . '?share_uid=' . $user->id))
->resize(240, 240)
->encode('data-url');
return view('Agent::share.index', compact('shareimg', 'user'));
}
}

View File

@@ -0,0 +1,41 @@
<?php
namespace App\Agent\Controllers;
use File;
use Illuminate\Http\Request;
use Storage;
class StorageController extends Controller
{
public function index(Request $request)
{
$File = $request->file('image');
$oldName = $File->getClientOriginalName();
$hash = File::hash($File->path());
$size = File::size($File->path());
if ($size > (10 * 1024 * 1024)) {
return [
'code' => 0,
'message' => '文件不能超过10M',
];
}
$pathUrl = 'images' . date('/Y-m/d');
$fileName = $hash . '.' . $File->getClientOriginalExtension();
$path = Storage::disk('public')->putFileAs(
$pathUrl, $File, $fileName
);
if (!$path) {
return [
'code' => 0,
'message' => '文件上传失败',
];
}
return [
'code' => 1,
'message' => '文件上传成功',
'path' => '/' . $pathUrl . '/' . $fileName,
];
}
}

View File

@@ -0,0 +1,73 @@
<?php
namespace App\Agent\Controllers;
use Auth;
use Illuminate\Http\Request;
use RuLong\UserRelation\Models\UserRelation;
/**
* 团队管理
*/
class TeamController extends Controller
{
public function __construct(Request $request)
{
view()->share('app_title', '推广团队');
}
public function index(Request $request)
{
$user = Auth::guard('agent')->user();
$identity_id = $request->identity_id;
$nickname = $request->nickname;
// $lists = UserRelation::query()
// ->when(is_numeric($identity_id), function ($query) use ($identity_id) {
// $query->whereHas('user', function ($q1) use ($identity_id) {
// if ($identity_id) {
// $q1->whereHas('identity', function ($q2) use ($identity_id) {
// $q2->where('identity_id', $identity_id);
// });
// } else {
// $q1->whereDoesntHave('identity');
// }
// });
// })
// ->when($nickname, function ($query) use ($nickname) {
// $query->whereHas('userinfo', function ($q1) use ($nickname) {
// $q1->where('nickname', 'like', "%{$nickname}%");
// });
// })
// ->where('parent_id', $user->id)
// ->paginate();
$lists = UserRelation::query()
->when(is_numeric($identity_id), function ($query) use ($identity_id) {
if ($identity_id) {
$query->whereHas('useridentity', function ($q) use ($identity_id) {
$q->where('identity_id', $identity_id);
});
} else {
$query->whereDoesntHave('useridentity');
}
})
->when($nickname, function ($query) use ($nickname) {
$query->whereHas('userinfo', function ($q1) use ($nickname) {
$q1->where('nickname', 'like', "%{$nickname}%");
});
})
->where('parent_id', $user->id)
->paginate();
if ($request->isMethod('POST')) {
if ($lists->isNotEmpty()) {
$html = response(view('Agent::team.more', compact('lists')))->getContent();
return $this->success($html);
} else {
return $this->error('没有数据了');
}
} else {
return view('Agent::team.index', compact('user', 'identity_id', 'nickname', 'lists'));
}
}
}

View File

@@ -0,0 +1,20 @@
<?php
namespace App\Agent\Controllers;
use App\Models\User;
use Auth;
use Illuminate\Http\Request;
class UserController extends Controller
{
public function __construct(Request $request)
{
view()->share('app_title', '个人中心');
}
public function index(Request $request)
{
$user = Auth::guard('agent')->user();
return view('Agent::user.index', compact('user'));
}
}

View File

@@ -0,0 +1,17 @@
<?php
namespace App\Agent\Middleware;
use Auth;
use Closure;
class Authenticate
{
public function handle($request, Closure $next)
{
if (Auth::guard('agent')->guest()) {
return redirect()->route('Agent.login');
}
return $next($request);
}
}

View File

@@ -0,0 +1,24 @@
<?php
namespace App\Agent\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 = [
'notify/payment', 'agent/notify/payment',
];
}

View File

@@ -0,0 +1,94 @@
@extends('Agent::layouts.app')
@section('content')
<section class="app">
<ul>
<!-- 个人信息 -->
<div class="accountHead">
<div class="accountHeadImg">
<span style="background-image: url({{ $user->info->headimgurl }});"></span>
</div>
<div class="accountHeadText">
<div class="mainHeadText-name">
{{ $user->info->nickname }}<span class="Vip">{{ $user->identity_text }}</span>
</div>
</div>
</div>
<!-- 账户 -->
<div class="account">
<div class="accountBack">
<div class="account-price">
余额()
<span>{{ number_format($user->account->cash,2) }}</span>
</div>
<ul class="account-nav">
<li>
<span>累计业绩</span>
{{ number_format($user->selfearnings(),2) }}
</li>
<li>
<span>今日业绩</span>
{{ number_format($user->selfearnings('day'),2) }}
</li>
</ul>
<div class="account-btn" data-href="{{ route('Agent.cashout.logs') }}">
立即提现
<i class="icon icon-angle-right"></i>
</div>
</div>
</div>
<!-- 记录 -->
<!-- 记录 -->
<div class="accountList">
<div class="accountList-title">
记录
</div>
@if ($lists->isNotEmpty())
<!-- 有数据 -->
<ul class="accountList-ul more">
@include('Agent::account.more',['lists'=>$lists])
</ul>
@else
<!-- 无数据显示 -->
<div class="empty">
<img src="/assets/agent/img/empty.png" >
<span>抱歉,暂无数据!</span>
</div>
@endif
</div>
</section>
</ul>
@endsection
@section('script')
<script type="text/javascript" src="/assets/agent/js/PullToRefresh.min.js" ></script>
<script type="text/javascript">
var loadMore = {{ $lists->hasMorePages()?:'false' }}
if (loadMore) {
var page=2;
var refreshBox=new PullToRefresh({
container:".app",
up:{
callback:function(e){
refreshBox.endUpLoading(false)
$.post("{{ route('Agent.account.index') }}",{page:page,'_token': '{{ csrf_token() }}'},function(data){
if(data.status=='SUCCESS'){
$(".more").append(data.message);
page++;
refreshBox.endUpLoading(true)
} else {
refreshBox.endUpLoading(false)
}
});
}
}
})
}
</script>
@endsection

View File

@@ -0,0 +1,19 @@
@foreach ($lists as $log)
<li>
<div class="accountList-ul-top">
<div class="accountList-ul-top-time">
<i class="icon icon-credit"></i>{{ $log->rule->title }}
</div>
<span>{{ $log->variable }}</span>
</div>
<div class="accountList-ul-cont">
<div class="accountList-ul-cont-text">
[<span class="accountList-ul-red">
<font @if($log->frozen==1) style="color: red" @else style="color:green" @endif> @if($log->frozen==1) 未结算 @else 已结算 @endif</font>
</span>]
{{ $log->rule->remark }}
</div>
{{ $log->created_at->format('m/d H:i') }}
</div>
</li>
@endforeach

View File

@@ -0,0 +1,37 @@
@extends('Agent::layouts.app')
@section('content')
<section>
<!-- 登录 -->
<div class="register">
<div class="registerTitle">
<p>Hi请登录代理商平台</p>
<span>如需更换手机号,则需在设置中修改</span>
</div>
<form action="{{ route('Agent.login') }}" method="">
<div class="registerList">
<div class="registerList-name">
<i class="icon icon-phone"></i>手机号
</div>
<div class="registerList-tel">
<span>+86</span>
<input type="text" name="username" value="" placeholder="输入手机号" />
</div>
</div>
<div class="registerList">
<div class="registerList-name">
<i class="icon icon-lock"></i>输入密码
</div>
<div class="registerList-tel">
<input type="password" name="password" value="" placeholder="请输入密码" />
</div>
</div>
<div class="registerBtn">
@csrf
<button type="button" class="ajax-post">立即登录</button>
</div>
</form>
</div>
</section>
@endsection

View File

@@ -0,0 +1,66 @@
@extends('Agent::layouts.app')
@section('content')
<section>
<!-- 我要进卡 -->
<div class="enterCard">
<div class="enterCard-title">
<img src="/assets/agent/img/enterCard.png">
</div>
<div class="enterCard-top">
<div class="enterCard-cont-title">
我要进卡
</div>
<form class="enterCard-form" action="{{ url()->current() }}">
<div class="enterCard-block">
<span class="minus">-</span>
<input type="tel" name="num" class="num" value="100" placeholder="100" readonly="">
<span class="plus">+</span>
</div>
<div class="enterCard-address">
<input type="text" name="name" value="{{ $address->name??'' }}" placeholder="请输入收货人姓名">
<input type="text" name="mobile" value="{{ $address->mobile??'' }}" placeholder="请输入收货人电话">
<input type="text" name="address" value="{{ $address->address??'' }}" placeholder="请输入收货人地址">
</div>
<div class="enterCard-btn">
@csrf
<button class="ajax-post">立即进卡</button>
</div>
</form>
</div>
{{-- <div class="enterCard-cont">
<div class="enterCard-cont-title">
卡权益
</div>
<div class="enterCard-cont-text">
通过招行金葵花卡可以办理各种综合理财业务比如代理收付及小额支付、个人融资、外汇投资等招行金葵花卡全球通用可以在全球2000多家商户刷卡消费在全球近百万台ATM机上提取当地货币等。
</div>
</div> --}}
</div>
</section>
@endsection
@section('script')
<script src="/assets/index/js/operation.js"></script>
<script type="text/javascript">
// 数量减
$('.minus').click(function () {
var t = $(this).parent().find('.num');
var num = getMax('-', t.val(), 100);
if (num < 100) {
updateAlert('数量不能小于100', false);
return false;
}
$('.num').val(num);
});
$('.plus').click(function () {
var t = $(this).parent().find('.num');
var num = getMax('+', t.val(), 100);
$('.num').val(num);
});
</script>
@endsection

View File

@@ -0,0 +1,108 @@
@extends('Agent::layouts.app')
@section('content')
<section class="app">
<ul>
<!-- 个人信息 -->
<div class="cardHead accountHead">
<div class="accountHeadImg">
<span style="background-image: url({{ $user->info->headimgurl }});"></span>
</div>
<div class="accountHeadText">
<div class="mainHeadText-name">
{{ $user->info->nickname }}<span class="Vip">{{ $user->identity_text }}</span>
</div>
</div>
</div>
<!-- 卡分类 -->
<div class="cardNav">
<div class="cardNav-top">
<i class="icon icon-credit"></i>
卡管理
</div>
<ul class="cardNav-ul">
<li>
<span>{{ $data['all'] }}</span>
已进卡
</li>
<li>
<span>{{ $data[2] }}</span>
待发货
</li>
<li>
<span>{{ $data[3] }}</span>
已发货
</li>
<li>
<span>{{ $data[4] }}</span>
已收货
</li>
<li>
<span>{{ $data[5] }}</span>
已激活
</li>
</ul>
</div>
<!-- 卡记录 -->
<div class="cardList">
<div class="cardList-title">
<span>卡记录</span>
<div class="temScreen cardScreen">
<select onchange="window.location.href='card?status='+this.options[selectedIndex].value">
<option value ="">全部</option>
<option value ="2" @if($status==2) selected="" @endif >待发卡</option>
<option value ="3" @if($status==3) selected="" @endif >已发卡</option>
<option value ="4" @if($status==4) selected="" @endif >已到卡</option>
<option value ="5" @if($status==5) selected="" @endif >已激活</option>
</select>
</div>
</div>
<div class="cardList-take">
@if ($lists->isNotEmpty())
<ul class="cardList-ul more">
@include('Agent::card.more',['lists'=>$lists])
</ul>
@else
<!-- 无数据显示 -->
<div class="empty">
<img src="/assets/agent/img/empty.png" >
<span>抱歉,暂无数据!</span>
</div>
@endif
</div>
</div>
</ul>
</section>
@endsection
@section('script')
<script type="text/javascript" src="/assets/agent/js/PullToRefresh.min.js" ></script>
<script type="text/javascript">
var loadMore = {{ $lists->hasMorePages()?:'false' }}
if (loadMore) {
var page=2;
var status = "{{ $status }}";
var refreshBox=new PullToRefresh({
container:".app",
up:{
callback:function(e){
$.post("{{ route('Agent.card.index') }}",{status:status,page:page,'_token': '{{ csrf_token() }}'},function(data){
if(data.status=='SUCCESS'){
$(".more").append(data.message);
page++;
refreshBox.endUpLoading(true)
} else {
refreshBox.endUpLoading(false)
}
});
}
}
})
}
</script>
@endsection

View File

@@ -0,0 +1,11 @@
@foreach ($lists as $card)
<li>
<div class="cardList-ul-left">
<span>卡号:{{ $card->code }}</span>
<span>卡密:{{ $card->pass }}</span>
</div>
<div class="cardList-ul-right {{ config('pick.cardstyle')[$card->status]??'' }}">
{{ $card->status_text }}
</div>
</li>
@endforeach

View File

@@ -0,0 +1,86 @@
@extends('Agent::layouts.app')
@section('title', '添加支付宝')
@section('content')
<section>
<!-- 添加银行卡 -->
<div class="withdrawForm">
<form action="{{ url()->current() }}" method="post" accept-charset="utf-8">
<div class="formbox">
<div class="formbox-label">
支付宝账户
</div>
<div class="formbox-input">
<input type="text" name="alipay_account" value="" placeholder="支付宝账户">
</div>
</div>
<div class="formbox">
<div class="formbox-label">
姓名
</div>
<div class="formbox-input">
<input type="text" name="name" value="" placeholder="开户人姓名">
</div>
</div>
<div class="formbox">
<div class="formbox-label">
支付宝收款二维码
</div>
<div class="formbox-file-margin">
<div class="formbox-file">
<input type="hidden" id="storage" name="alipay_account_code" value="">
<input type="file" id="file" accept="image/*">
<span id="show" class="formbox-input-img" style="background-image:url()"></span>
</div>
<span class="ce-text-c worksFile-btn">上传支付宝收款二维码</span>
</div>
</div>
@csrf
<div class="withdrawForm-btn ajax-post">
确定添加
</div>
</form>
</div>
</section>
@endsection
@section('script')
<script src="{{ asset('assets/agent/js/lrz.all.bundle.js') }}"></script>
<script type="text/javascript">
// 图片上传
$('#show').click(function(event){
$('#file').click();
});
$('#file').change(function(event){
var $this = $(this);
lrz(this.files[0], {
width: 640,
fieldName: 'image'
}).then(function(rst) {
$('#show').attr('style', 'background-image:url(' + rst.base64 + ')');
return rst;
}).then(function(rst) {
var xhr = new XMLHttpRequest();
xhr.open('POST', "{{ route('Agent.storages.index') }}?_token={{ csrf_token() }}", true);
xhr.onload = function () {
var data = $.parseJSON(xhr.responseText);
if (data.code == 1) {
$('#storage').val(data.path);
} else {
updateAlert(data.message);
}
};
xhr.onerror = function () {
};
xhr.send(rst.formData);
return rst;
}).catch(function (err) {
updateAlert(err);
}).always(function () {
// 不管是成功失败,这里都会执行
});
});
</script>
@endsection

View File

@@ -0,0 +1,87 @@
@extends('Agent::layouts.app')
@section('title', '修改支付宝')
@section('content')
<section>
<!-- 添加银行卡 -->
<div class="withdrawForm">
<form action="{{ url()->current() }}" method="post" accept-charset="utf-8">
<div class="formbox">
<div class="formbox-label">
支付宝账户
</div>
<div class="formbox-input">
<input type="text" name="alipay_account" value="{{ $cashaccount->alipay_account }}" placeholder="支付宝账户">
</div>
</div>
<div class="formbox">
<div class="formbox-label">
姓名
</div>
<div class="formbox-input">
<input type="text" name="name" value="{{ $cashaccount->name }}" placeholder="开户人姓名">
</div>
</div>
<div class="formbox">
<div class="formbox-label">
支付宝收款二维码
</div>
<div class="formbox-file-margin">
<div class="formbox-file">
<input type="hidden" id="storage" name="alipay_account_code" value="{{ $cashaccount->alipay_account_code }}">
<input type="file" id="file" accept="image/*">
<span id="show" class="formbox-input-img" style="background-image:url(/storage{{ $cashaccount->alipay_account_code }})"></span>
</div>
<span class="ce-text-c worksFile-btn">上传支付宝收款二维码</span>
</div>
</div>
@csrf
@method('put')
<div class="withdrawForm-btn ajax-post">
修改信息
</div>
</form>
</div>
</section>
@endsection
@section('script')
<script src="{{ asset('assets/agent/js/lrz.all.bundle.js') }}"></script>
<script type="text/javascript">
// 图片上传
$('#show').click(function(event){
$('#file').click();
});
$('#file').change(function(event){
console.log(event);
var $this = $(this);
lrz(this.files[0], {
width: 640,
fieldName: 'image'
}).then(function(rst) {
$('#show').attr('style', 'background-image:url(' + rst.base64 + ')');
return rst;
}).then(function(rst) {
var xhr = new XMLHttpRequest();
xhr.open('POST', "{{ route('Agent.storages.index') }}?_token={{ csrf_token() }}", true);
xhr.onload = function () {
var data = $.parseJSON(xhr.responseText);
if (data.code == 1) {
$('#storage').val(data.path);
} else {
updateAlert(data.message);
}
};
xhr.onerror = function () {
};
xhr.send(rst.formData);
return rst;
}).catch(function (err) {
updateAlert(err);
}).always(function () {
// 不管是成功失败,这里都会执行
});
});
</script>
@endsection

View File

@@ -0,0 +1,58 @@
@extends('Agent::layouts.app')
@section('title', '申请提现')
@section('content')
<section>
<form class="cash-form" method="post" action="{{ url()->current() }}">
<!-- 提现表单 -->
<div class="withdrawForm">
@if(!$user->cashAccount)
<div class="withdrawForm-add" data-href="{{ route('Agent.cashout.cashadd') }}">
<i class="icon icon-plus"></i>添加支付宝
</div>
@else
<ul class="withdrawForm-ul">
<li data-href="{{ route('Agent.cashout.cashedit', $user->cashAccount) }}">
<div class="pull-left withdrawForm-ul-right">
<div class="withdrawForm-ul-logo">
<img src="/assets/agent/img/icon/withdraw_00.png" >
</div>
<div class="withdrawForm-ul-text">
<div>
<span>支付宝账户</span>
{{ $user->cashAccount->alipay_account }}
</div>
<i class="icon icon-angle-right"></i>
</div>
</div>
</li>
</ul>
@endif
<div class="withdrawForm-money">
<p>提现金额</p>
<div class="withdrawForm-money-input">
<span></span>
<input type="tel" name="variable" placeholder="请输入提现金额"/>
</div>
<div class="withdrawForm-money-text">
<span>余额:{{ number_format($user->account->cash,2) }}</span>
{{-- <button type="button">全部提现</button> --}}
</div>
</div>
@csrf
@if(!$user->cashAccount)
<div class="withdrawForm-btn" onclick="updateAlert('请先添加支付宝信息', 1, function(){ location.href='{{ route('Agent.cashout.cashadd') }}' })" >提现</div>
@else
@if(!$user->cashAccount->alipay_account_code)
<div class="withdrawForm-btn" onclick="updateAlert('请先添加支付宝商户二维码', 1, function(){ location.href='{{ route('Agent.cashout.cashedit', $user->cashAccount) }}' })" >提现</div>
@else
<div class="withdrawForm-btn ajax-post">确认提现</div>
@endif
@endif
</form>
</div>
</section>
@endsection

View File

@@ -0,0 +1,66 @@
@extends('Agent::layouts.app')
@section('title', '提现日志')
@section('content')
<section class="app">
<!-- 余额 -->
<div class="recordHead">
<img src="/assets/agent/img/account_img.png" >
<div class="recordHead-price">
<span>{{ number_format($user->account->cash,2) }}</span>
(我的账户余额)
</div>
<div class="recordHead-btn" data-href="{{ route('Agent.cashout') }}">
立即提现
</div>
</div>
<div class="recordUl">
<div class="recordUl-title">
提现记录
</div>
@if ($lists->isNotEmpty())
<ul class="recordList more">
@include('Agent::cashout.more',['lists'=>$lists])
</ul>
@else
<!-- 无数据显示 -->
<div class="empty">
<img src="/assets/agent/img/empty.png" >
<span>抱歉,暂无数据!</span>
</div>
@endif
</div>
</section>
@endsection
@section('script')
<script type="text/javascript" src="/assets/agent/js/PullToRefresh.min.js" ></script>
<script type="text/javascript">
var loadMore = {{ $lists->hasMorePages()?:'false' }}
if (loadMore) {
var page=2;
var refreshBox=new PullToRefresh({
container:".app",
up:{
callback:function(e){
refreshBox.endUpLoading(false)
$.post("{{ route('Agent.account.index') }}",{page:page,'_token': '{{ csrf_token() }}'},function(data){
if(data.status=='SUCCESS'){
$(".more").append(data.message);
page++;
refreshBox.endUpLoading(true)
} else {
refreshBox.endUpLoading(false)
}
});
}
}
})
}
</script>
@endsection

View File

@@ -0,0 +1,14 @@
@foreach ($lists as $cashout)
<li>
<div class="recordList-name">
<span>提现</span>
{{ $cashout->variable }}
</div>
<div class="recordList-time">
<span>{{ $cashout->created_at->format('Y-m-d') }}</span>
<div class="recordList-green">
{{ $cashout->state_text }}
</div>
</div>
</li>
@endforeach

View File

@@ -0,0 +1,37 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="0" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<title>代理商 @yield('title', $app_title??config('app.name'))</title>
<link rel="stylesheet" href="{{ asset('assets/agent/css/mzui.min.css') }}">
<link rel="stylesheet" href="{{ asset('assets/agent/css/swiper.min.css') }}">
<link rel="stylesheet" href="{{ asset('assets/agent/css/style.css') }}?_{{time()}}">
<link rel="stylesheet" href="{{ asset('assets/agent/css/PullToRefresh.min.css') }}">
@yield('css')
@yield('js')
</head>
<body>
@if (route('Agent.index')!=url()->current())
<div class="topFixed" data-href="{{ route('Agent.index') }}">
<i class="icon icon-home"></i>
<!-- <span>返回</span> -->
</div>
@endif
@yield('content')
</body>
<script type="text/javascript" src="/assets/agent/js/jquery-3.2.1.min.js"></script>
<script type="text/javascript" src="/assets/agent/js/mzui.min.js" ></script>
<script type="text/javascript" src="/assets/agent/js/layer/layer.min.js" ></script>
<script type="text/javascript" src="/assets/agent/js/swiper.min.js"></script>
<script type="text/javascript" src="/assets/agent/js/cjango.js?v={{uniqid()}}"></script>
@yield('script')
</html>

View File

@@ -0,0 +1,18 @@
<footer>
<a href="{{ route('index') }}" class="footer-item @if( ($nav??'1') ==1) tab-active @endif">
<img class="footer-icon" @if( ($nav??'1') ==1) src="/assets/index/img/icon/tabIcon_active_00.png" @else src="/assets/index/img/icon/tabIcon_00.png" @endif alt="footerIcon">
<p class="footer-text">会员商城</p>
</a>
<a href="{{ route('pick.index') }}" class="footer-item @if( ($nav??'1') ==2) tab-active @endif">
<img class="footer-icon" @if( ($nav??'1') ==2) src="/assets/index/img/icon/tabIcon_active_01.png" @else src="/assets/index/img/icon/tabIcon_01.png" @endif alt="footerIcon">
<p class="footer-text">提货商城</p>
</a>
<a href="{{ route('articles.index') }}" class="footer-item @if( ($nav??'1') ==3) tab-active @endif">
<img class="footer-icon" @if( ($nav??'1') ==3) src="/assets/index/img/icon/tabIcon_active_02.png" @else src="/assets/index/img/icon/tabIcon_02.png" @endif alt="footerIcon">
<p class="footer-text">教程资讯</p>
</a>
<a href="{{ route('user.index') }}" class="footer-item @if( ($nav??'1') ==4) tab-active @endif">
<img class="footer-icon" @if( ($nav??'1') ==4) src="/assets/index/img/icon/tabIcon_active_03.png" @else src="/assets/index/img/icon/tabIcon_03.png" @endif alt="footerIcon">
<p class="footer-text">个人中心</p>
</a>
</footer>

View File

@@ -0,0 +1,56 @@
@extends('Agent::layouts.app')
@section('content')
<section>
<!-- 我的订单 -->
<nav class="nav orderNav" data-display="" data-selector="span" data-show-single="true" data-active-class="active" data-animate="false">
<span data-href="{{ route('Agent.orders.index') }}" @if(url()->current() == route('Agent.orders.index'))class="active" @endif>全部</span>
<span data-href="{{ route('Agent.orders.unpay') }}" @if(url()->current() == route('Agent.orders.unpay'))class="active" @endif>待付款</span>
<span data-href="{{ route('Agent.orders.delivered') }}" @if(url()->current() == route('Agent.orders.delivered'))class="active" @endif>待收货</span>
<span data-href="{{ route('Agent.orders.signed') }}" @if(url()->current() == route('Agent.orders.signed'))class="active" @endif>已签收</span>
</nav>
@if ($orders->isNotEmpty())
<div class="orderText">
@include('Agent::orders.item', ['orders' => $orders])
</div>
@else
<div class="empty">
<img src="/assets/agent/img/empty.png" >
<span>抱歉,暂无数据!</span>
</div>
@endif
</section>
@endsection
@section('script')
<script type="text/javascript">
function orderDelete (url) {
layer.open({
content: '确定要取消订单吗?'
,btn: ['确认', '不取消']
,skin: 'footer'
,yes: function(index){
$.post(url + '?_token={{ csrf_token() }}', function(data){
if (data.status == 'SUCCESS') {
updateAlert(data.message, 'success');
setTimeout(function(){
location.reload();
},500);
}else{
updateAlert(data.message, 'error');
}
});
}
});
}
</script>
@endsection

View File

@@ -0,0 +1,57 @@
@foreach ($orders as $order)
<div class="orderText-back">
<div class="orderText-name">
<p><i class="icon icon-stack"></i> {{ $order->order_id }}</p>
<span>{{ $order->status_text }}</span>
</div>
<ul class="orderText-list">
<li>
<div class="orderText-list-text">
<div class="text-nowrap orderText-list-name">
{{ $order->type_text }}
</div>
<div class="orderText-list-span">
<span class="orderText-list-price">
{{ $order->price }}
</span>
{{ $order->num }}
</div>
</div>
</li>
</ul>
@if ($order->express)
<ul class="orderAddress-list">
<li>
<div class="orderAddress-list-number">物流名称:</div>
<div>{{ get_deliver_name($order->express->company) }}</div>
</li>
<li>
<div class="orderAddress-list-number">物流单号:</div>
<div>{{ $order->express->number }}</div>
</li>
<li>
<div class="orderAddress-list-number">发货时间:</div>
<div>{{ $order->express->created_at }}</div>
</li>
</ul>
@endif
<div class="orderText-total">
共计{{ $order->num }}张卡&nbsp;&nbsp;&nbsp;&nbsp;合计:<span><small></small>{{ $order->price }}</span>
</div>
<div class="orderText-btn">
@if ($order->status===0)
<button type="button" data-href="{{ route('Agent.pay.order', $order->order_id) }}" class="orderText-btn-pay">立即付款</button>
@endif
@if ($order->status==2)
<button type="button" data-href="{{ route('Agent.orders.sign',$order->order_id) }}" class="orderText-btn-pay ajax-get confirm " tip="您确定已经收到货了吗">立即签收</button>
@endif
</div>
</div>
@endforeach

View File

@@ -0,0 +1,96 @@
@extends('Agent::layouts.app')
@section('content')
<section>
<!-- 支付-->
<ul class="modular-list order-confirm-list ce-margin-t-sm">
<li>
订单编号
<span class="pull-right">{{ $order->order_id }}</span>
</li>
<li>
支付金额
<span class="pull-right confirm-price-color">{{ $order->price}}</span>
</li>
</ul>
<form>
<ul class="modular-list order-confirm-list ce-margin-t-sm">
<li>
<i class="order-pay-icon weixin-icon"></i>
微信支付
<div class="order-list-radio pull-right">
<input type="radio" name="payment" value="WECHAT" id="weixin" checked="">
<label for="weixin">
<i class="icon icon-check-circle"></i>
</label>
</div>
</li>
{{-- <li>
<i class="order-pay-icon balance-icon"></i>
账户余额
<div class="order-list-radio pull-right">
<input type="radio" name="payment" value="BALANCE" id="balance">
<label for="balance">
<i class="icon icon-check-circle"></i>
</label>
</div>
</li> --}}
</ul>
<div class="order-pay-btn">
<button type="button" id="paybtn" >立即支付</button>
</div>
</form>
</section>
@endsection
@section('script')
<script>
var json='';
$("#paybtn").click(function(){
var me=$("input[name='payment']:checked");
if(me.attr('value')=='WECHAT'){
$.get("{{ route('Agent.pay.wechat', $order->order_id) }}", function(data) {
if (data.statusCode == 200) {
json = JSON.parse(data.message);
pay();
}else{
updateAlert(data.message,'error');
}
});
}
})
function pay() {
if (typeof WeixinJSBridge == "undefined") {
if (document.addEventListener) {
document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
} else if (document.attachEvent) {
document.attachEvent('WeixinJSBridgeReady', onBridgeReady);
document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
}
}else{
onBridgeReady();
}
}
function onBridgeReady() {
WeixinJSBridge.invoke('getBrandWCPayRequest', json, function(res) {
if (res.err_msg == "get_brand_wcpay_request:ok" ) {
setTimeout(function() {
location.href = "{{ route('Agent.orders.index') }}";
}, 1000);
} else {
console.log(res);
}
});
}
</script>
@endsection

View File

@@ -0,0 +1,30 @@
@extends('Agent::layouts.app')
@section('content')
<section>
<!-- 二维码 -->
<div class="codeBack" style="background-image: url(/assets/agent/img/code_bg.png);">
<div class="codeBack-title">
<img src="/assets/agent/img/codeTitle.png" >
</div>
<div class="codeCont">
<div class="codeCont-head">
<div class="codeCont-head-img">
<span style="background-image: url({{ $user->info->headimgurl }});"></span>
</div>
<div class="codeCont-head-name">
<span>"{{ $user->info->nickname }}"</span> 邀请你加入连卡蝠
</div>
</div>
<div class="codeCont-img" style="background-image: url(/assets/agent/img/codeImg_bg.png);">
<div class="codeCont-scan">
<img src="{{ $shareimg }}" width="330" height="330">
</div>
</div>
<div class="codeCont-text">
<span>长按保存二维码,分享好友扫码二维码</span>
</div>
</div>
</div>
</section>
@endsection

View File

@@ -0,0 +1,140 @@
@extends('Agent::layouts.app')
@section('content')
<section class="app">
<ul>
<!-- 个人信息 -->
<div class="temHead">
<p>{{ $user->team_count }}</p>
<span>团队人数(人)</span>
</div>
<!-- 数目 -->
<ul class="temNumber">
<li>
<div class="temNumber-icon">
<img src="/assets/agent/img/icon/temIcon_00.png" >
</div>
<div class="temNumber-text">
总业绩
<p><span class="temRed">{{ number_format($user->allearnings(),2) }}</span></p>
</div>
</li>
<li>
<div class="temNumber-icon">
<img src="/assets/agent/img/icon/temIcon_01.png" >
</div>
<div class="temNumber-text">
当月总业绩
<p><span class="temBlue">{{ number_format($user->allearnings('month'),2) }}</span></p>
</div>
</li>
<li>
<div class="temNumber-icon">
<img src="/assets/agent/img/icon/temIcon_02.png" >
</div>
<div class="temNumber-text">
团队总业绩
<p><span>{{ number_format($user->teamearnings(),2) }}</span></p>
</div>
</li>
<li>
<div class="temNumber-icon">
<img src="/assets/agent/img/icon/temIcon_03.png" >
</div>
<div class="temNumber-text">
当月团队总业绩
<p><span>{{ number_format($user->teamearnings('month'),2) }}</span></p>
</div>
</li>
<li>
<div class="temNumber-icon">
<img src="/assets/agent/img/icon/temIcon_04.png" >
</div>
<div class="temNumber-text">
个人总业绩
<p><span>{{ number_format($user->selfearnings(),2) }}</span></p>
</div>
</li>
<li>
<div class="temNumber-icon">
<img src="/assets/agent/img/icon/temIcon_05.png" >
</div>
<div class="temNumber-text">
当月个人总业绩
<p><span>{{ number_format($user->selfearnings('month'),2) }}</span></p>
</div>
</li>
</ul>
<!-- 搜索 -->
<div class="temForm">
<form action="{{ route('Agent.team.index') }}" method="">
<div class="temScreen">
<select name="identity_id">
<option value="">全部</option>
<option value="0" @if(is_numeric($identity_id) && empty($identity_id)) selected="" @endif >普通用户</option>
<option value="1" @if($identity_id == 1) selected="" @endif >会员</option>
<option value="2" @if($identity_id == 2) selected="" @endif >金牌</option>
<option value="3" @if($identity_id == 3) selected="" @endif >城市</option>
<option value="4" @if($identity_id == 4) selected="" @endif >股东</option>
</select>
</div>
<div class="temSearch">
<input type="text" name="nickname" value="{{ $nickname }}" placeholder="请输入关键字" />
<button type="submit" >搜索</button>
</div>
</form>
</div>
<!-- 列表 -->
<div class="temList">
<div class="temListTitle">
团队列表
</div>
@if ($lists->isEmpty())
<!-- 无数据显示 -->
<div class="empty">
<img src="/assets/agent/img/empty.png" >
<span>抱歉,暂无数据!</span>
</div>
@else
<ul class="temListUl more">
@include('Agent::team.more',['lists'=>$lists])
</ul>
@endif
</div>
</ul>
</section>
@endsection
@section('script')
<script type="text/javascript" src="/assets/index/js/PullToRefresh.min.js" ></script>
<script type="text/javascript">
var loadMore = {{ $lists->hasMorePages()?:'false' }}
if (loadMore) {
var page=2;
var identity_id = "{{ $identity_id }}";
var nickname = "{{ $nickname }}";
var refreshBox=new PullToRefresh({
container:".app",
up:{
callback:function(e){
$.post("{{ route('Agent.team.index') }}",{identity_id:identity_id,nickname:nickname,page:page,'_token': '{{ csrf_token() }}'},function(data){
if(data.status=='SUCCESS'){
$(".more").append(data.message);
page++;
refreshBox.endUpLoading(true)
} else {
refreshBox.endUpLoading(false)
}
});
}
}
})
}
</script>
@endsection

View File

@@ -0,0 +1,17 @@
@foreach ($lists as $relation)
<li>
<div class="temListUl-img">
<span style="background-image: url({{ $relation->userinfo->headimgurl }});"></span>
</div>
<div class="temListUl-cont">
<div class="temListUl-cont-name">
{{ $relation->userinfo->nickname }}
<span class="Vip">
<img src="/assets/agent/img/icon/identity_0{{ $relation->user->identity_id }}.png">{{ $relation->user->identity_text }}</span>
</div>
<div class="temListUl-cont-time">
加入日期:{{ $relation->user->created_at }}
</div>
</div>
</li>
@endforeach

View File

@@ -0,0 +1,129 @@
@extends('Agent::layouts.app')
@section('content')
<section>
<!-- 个人信息 -->
<div class="mainHead">
<div class="mainHeadImg">
<span style="background-image: url({{ $user->info->headimgurl }});"></span>
</div>
<div class="mainHeadText">
<div class="mainHeadText-name">
<p>
{{ $user->info->nickname }}
<span class="Vip">
<img src="/assets/agent/img/icon/identity_0{{ $user->identity_id }}.png">
{{ $user->identity_text }}
</span>
</p>
<small>{{ $user->username }}</small>
</div>
</div>
</div>
<!-- 收益 -->
<div class="mainNav">
<div class="mainNavLabel">
连卡蝠
</div>
<ul class="mainNavList">
<li class="mainNavList-price">
<span>{{ number_format($user->account->cash,2) }}</span>
<div class="mainNavList-name">
总收益()
</div>
</li>
<li>
<span>{{ $user->team_count }}</span>
<div class="mainNavList-name">
团队人数()
</div>
</li>
</ul>
</div>
<!-- 分类 -->
<ul class="mainList">
<li data-href="{{ route('Agent.team.index') }}">
<div class="mainList-icon">
<img src="/assets/agent/img/icon/icon_00.png" >
</div>
<div class="mainList-text">
推广团队
</div>
</li>
<li data-href="{{ route('Agent.account.index') }}">
<div class="mainList-icon">
<img src="/assets/agent/img/icon/icon_01.png" >
</div>
<div class="mainList-text">
账户管理
</div>
</li>
<li data-href="{{ route('Agent.card.index') }}">
<div class="mainList-icon">
<img src="/assets/agent/img/icon/icon_02.png" >
</div>
<div class="mainList-text">
卡管理
</div>
</li>
<li data-href="{{ route('Agent.card.buy') }}">
<div class="mainList-icon">
<img src="/assets/agent/img/icon/icon_03.png" >
</div>
<div class="mainList-text">
我要进卡
</div>
</li>
<li @if($user->identity_id>1 && $user->is_contract==1) data-href="{{ route('Agent.share') }}" @else onclick="updateAlert('您没有权限')" @endif >
<div class="mainList-icon">
<img src="/assets/agent/img/icon/icon_04.png" >
</div>
<div class="mainList-text">
我的推广码
</div>
</li>
<li data-href="tel::{{ config('default_tel') }}">
<div class="mainList-icon">
<img src="/assets/agent/img/icon/icon_05.png" >
</div>
<div class="mainList-text">
联系客服
</div>
</li>
<li data-href="{{ route('Agent.orders.index') }}">
<div class="mainList-icon">
<img src="/assets/agent/img/icon/icon_06.png" >
</div>
<div class="mainList-text">
我的订单
</div>
</li>
{{-- <li>
<div class="mainList-icon">
<img src="/assets/agent/img/icon/icon_07.png" >
</div>
<div class="mainList-text">
收货地址
</div>
</li> --}}
<li data-href="{{ route('Agent.logout') }}">
<div class="mainList-icon">
<img src="/assets/agent/img/icon/icon_08.png" >
</div>
<div class="mainList-text">
退出登录
</div>
</li>
</ul>
<!-- banner -->
<div class="banner">
<img src="/assets/agent/img/banner.png" >
</div>
</section>
@endsection

45
app/Agent/routes.php Normal file
View File

@@ -0,0 +1,45 @@
<?php
Route::any('login', 'AuthController@login')->name('login');
// 图片上传
Route::post('storages', 'StorageController@index')->name('storages.index');
Route::any('notify/payment', 'NotifyController@payment')->name('notify.payment');
Route::middleware(['auth.agent'])->group(function ($route) {
$route->get('/', 'UserController@index')->name('index');
$route->get('logout', 'AuthController@logout')->name('logout');
//账户管理
$route->any('account', 'AccountController@index')->name('account.index');
//团队管理
$route->any('team', 'TeamController@index')->name('team.index');
//提货卡管理
$route->any('card/buy', 'CardController@buy')->name('card.buy');
$route->any('card', 'CardController@index')->name('card.index');
// 申请提现
$route->match(['get', 'post'], 'cashout', 'CashOutController@index')->name('cashout');
$route->match(['get', 'post'], 'cashout/cashadd', 'CashOutController@cashadd')->name('cashout.cashadd');
$route->match(['get', 'put'], 'cashout/{cashaccount}/cashedit', 'CashOutController@cashedit')->name('cashout.cashedit');
$route->get('cashout/logs', 'CashOutController@logs')->name('cashout.logs');
//支付
$route->any('payments/{orderid}', 'PayController@order')->name('pay.order');
$route->any('payments/wechat/{order}', 'PayController@wechat')->name('pay.wechat');
//订单管理
$route->get('orders', 'OrderController@index')->name('orders.index');
$route->get('orders/unpay', 'OrderController@unpay')->name('orders.unpay');
$route->get('orders/paid', 'OrderController@paid')->name('orders.paid');
$route->get('orders/delivered', 'OrderController@delivered')->name('orders.delivered');
$route->get('orders/signed', 'OrderController@signed')->name('orders.signed');
$route->post('orders/{orderid}/delete', 'OrderController@delete')->name('orders.delete');
$route->get('orders/{orderid}/sign', 'OrderController@sign')->name('orders.sign');
//分享
$route->get('share', 'ShareController@index')->name('share');
});

55
app/Bonus/AddPerf.php Normal file
View File

@@ -0,0 +1,55 @@
<?php
namespace App\Bonus;
use App\Models\User;
use App\Models\UserPerf;
use RuLong\Bonus\Contracts\Settlement;
use RuLong\Bonus\Models\Bonus;
use RuLong\Bonus\Traits\Settlementable;
/**
* 添加业绩
*/
class AddPerf implements Settlement
{
use Settlementable;
public $user;
public $perf;
public $source;
public function __construct(User $user, $perf, $source = [])
{
$this->user = $user->fresh();
$this->perf = $perf;
$this->source = $source;
}
/**
* 添加业绩
* @return [type] [description]
*/
public function fire()
{
$data = [
'user_id' => $this->user->id,
'perf' => $this->perf,
'from_id' => $this->user->id,
'source' => json_encode($this->source),
'created_at' => now()->format('Y-m-d H:i:s'),
'updated_at' => now()->format('Y-m-d H:i:s'),
];
$parent = $this->user;
$lists = [];
while ($parent) {
$data['user_id'] = $parent->id;
$lists[] = $data;
$parent = $parent->parent;
}
if (count($lists) > 0) {
UserPerf::insert($lists);
}
}
}

72
app/Bonus/BuyCard.php Normal file
View File

@@ -0,0 +1,72 @@
<?php
namespace App\Bonus;
use App\Models\CardPayment;
use RuLong\Bonus\Contracts\Settlement;
use RuLong\Bonus\Models\Bonus;
use RuLong\Bonus\Traits\Settlementable;
/**
* 购卡佣金
*/
class BuyCard implements Settlement
{
use Settlementable;
public $payment;
public function __construct(CardPayment $payment)
{
$this->payment = $payment->fresh();
}
/**
* 购卡佣金
* @return [type] [description]
*/
public function fire()
{
if ($this->payment && $this->payment->state == 'SUCCESS') {
//判断订单状态
$order = $this->payment->order; //获取订单
$user = $order->user; //获取会员
if ($order && $user) {
//基础判断
$parent = $user->parent; //获取推荐人
$eventName = 'direct_card'; //默认直推
while ($parent) {
$price = $parent->identity->info->configs[$eventName] ?? 0; //结算单价
if ($price) {
$amount = $this->payment->amount; //代理金额
$num = $order->num; //代理金额
$cash = $price * $num; //实际佣金
$log = $parent->accountLogs()->whereIn('rule_id', [7, 8])->where('source->order_id', $order->id)->first(); //查看是否结算过佣金
if ($cash > 0 && !$log) {
$source = [
'user_id' => $user->id, //会员ID
'payment_id' => $this->payment->id, //升级订单ID
'order_id' => $order->id, //升级订单ID
'price' => $price, //结算比例
'num' => $num, //结算数量
];
$parent->rule($eventName, $cash, false, $source); //执行立即到账
}
if ($eventName == 'indirect_card') {
break;
} else {
$eventName = 'indirect_card'; //更改间接推荐
}
}
$parent = $parent->parent;
}
} else {
\Log::channel('bonus')->error('购卡订单或会员不存在' . $this->payment->order_id);
}
} else {
\Log::channel('bonus')->error('购卡订单状态不正确(ID:' . ($this->payment->id ?? '无') . ')');
}
}
}

View File

@@ -0,0 +1,69 @@
<?php
namespace App\Bonus;
use App\Models\UpgradePayment;
use RuLong\Bonus\Contracts\Settlement;
use RuLong\Bonus\Models\Bonus;
use RuLong\Bonus\Traits\Settlementable;
/**
* 推荐代理
*/
class DirectAgency implements Settlement
{
use Settlementable;
public $payment;
public function __construct(UpgradePayment $payment)
{
$this->payment = $payment->fresh();
}
/**
* 推荐代理
* @return [type] [description]
*/
public function fire()
{
if ($this->payment && $this->payment->type == 'agent' && $this->payment->state == 'SUCCESS') {
//判断订单状态
$user = $this->payment->user; //获取会员
if ($user) {
//基础判断
$parent = $user->parent; //获取推荐人
$eventName = 'direct_agency'; //默认直推
while ($parent) {
$rate = $parent->identity->info->configs[$eventName] ?? 0; //结算比例
if ($rate) {
$amount = $this->payment->amount; //代理金额
$cash = round($amount * $rate / 100, 2); //实际佣金
$log = $parent->accountLogs()->whereIn('rule_id', [5, 6])->where('source->user_id', $user->id)->first(); //查看是否结算过佣金
if ($cash > 0 && !$log) {
$source = [
'user_id' => $user->id, //会员ID
'payment_id' => $this->payment->id, //升级订单ID
'rate' => $rate, //结算比例
'amount' => $amount, //结算金额
];
$parent->rule($eventName, $cash, false, $source); //执行立即到账
}
if ($eventName == 'indirect_agency') {
break;
} else {
$eventName = 'indirect_agency'; //更改间接推荐
}
}
$parent = $parent->parent;
}
return true;
} else {
\Log::channel('bonus')->error('升级代理不存在' . $this->payment->user_id);
}
} else {
\Log::channel('bonus')->error('升级代理状态不正确或不存在(ID:' . ($this->payment->id ?? '无') . ')');
}
}
}

69
app/Bonus/DirectVip.php Normal file
View File

@@ -0,0 +1,69 @@
<?php
namespace App\Bonus;
use App\Models\UpgradePayment;
use RuLong\Bonus\Contracts\Settlement;
use RuLong\Bonus\Models\Bonus;
use RuLong\Bonus\Traits\Settlementable;
/**
* 开通员工执行事件
*/
class DirectVip implements Settlement
{
use Settlementable;
public $payment;
public function __construct(UpgradePayment $payment)
{
$this->payment = $payment->fresh();
}
/**
* 推荐会员佣金
* @return [type] [description]
*/
public function fire()
{
if ($this->payment && $this->payment->type == 'vip' && $this->payment->state == 'SUCCESS') {
//判断订单状态
$user = $this->payment->user; //获取会员
if ($user) {
//基础判断
$parent = $user->parent; //获取推荐人
if ($parent) {
//基础判断
$odd_num = $parent->accountLogs()->where('rule_id', 3)->count(); //奇数次数
$even_num = $parent->accountLogs()->where('rule_id', 4)->count(); //偶数次数
$eventName = 'direct_odd'; //默认奇数
if ($odd_num > $even_num) {
//如果奇数大于偶数
$eventName = 'direct_even'; //偶数
}
$amount = $this->payment->amount; //会员金额
$rate = $parent->identity->info->configs[$eventName] ?? 0; //结算比例
$cash = round($amount * $rate / 100, 2); //实际佣金
$log = $parent->accountLogs()->whereIn('rule_id', [3, 4])->where('source->user_id', $user->id)->first(); //查看是否结算过佣金
if ($cash > 0 && !$log) {
$source = [
'user_id' => $user->id, //会员ID
'payment_id' => $this->payment->id, //升级订单ID
'rate' => $rate, //结算比例
'amount' => $amount, //结算金额
];
$parent->rule($eventName, $cash, false, $source); //执行立即到账
}
} else {
\Log::channel('bonus')->error('升级会员不存在推荐人' . $this->payment->user_id);
}
} else {
\Log::channel('bonus')->error('升级会员不存在' . $this->payment->user_id);
}
} else {
\Log::channel('bonus')->error('升级会员状态不正确或不存在(ID:' . ($this->payment->id ?? '无') . ')');
}
}
}

65
app/Bonus/ProfitStart.php Normal file
View File

@@ -0,0 +1,65 @@
<?php
namespace App\Bonus;
use App\Models\Profit;
use App\Models\ProfitLog;
use App\Models\User;
use RuLong\Bonus\Contracts\Settlement;
use RuLong\Bonus\Models\Bonus;
use RuLong\Bonus\Traits\Settlementable;
/**
* 购卡佣金
*/
class ProfitStart implements Settlement
{
use Settlementable;
public $profit;
public function __construct(Profit $profit)
{
$this->profit = $profit->fresh();
}
/**
* 购卡佣金
* @return [type] [description]
*/
public function fire()
{
if ($this->profit && $this->profit->sett === 0) {
$users = User::when($this->profit->identity_id, function ($query) {
$query->whereHas('identity', function ($q) {
$q->where('identity_id', $this->profit->identity_id);
});
})->get();
$this->profit->num = $users->count();
if ($this->profit->num == 0) {
$this->profit->single = 0;
} else {
$this->profit->single = bcadd($this->profit->price / $users->count(), 0, 2);
}
$this->profit->realPrice = $this->profit->single * $this->profit->num;
$this->profit->sett = 1;
$this->profit->setted_at = now();
if ($this->profit->save()) {
$source = [
'profit_id' => $this->profit->id,
];
foreach ($users as $key => $user) {
$user->rule('profit', $this->profit->single, false, $source);
ProfitLog::create([
'profit_id' => $this->profit->id,
'user_id' => $user->id,
'price' => $this->profit->single,
]);
}
}
} else {
\Log::channel('bonus')->error('全球分红不正确(ID:' . ($this->profit->id ?? '无') . ')');
}
}
}

69
app/Bonus/TeamCard.php Normal file
View File

@@ -0,0 +1,69 @@
<?php
namespace App\Bonus;
use App\Models\CardPayment;
use RuLong\Bonus\Contracts\Settlement;
use RuLong\Bonus\Models\Bonus;
use RuLong\Bonus\Traits\Settlementable;
/**
* 团队卡酬
*/
class TeamCard implements Settlement
{
use Settlementable;
public $payment;
public function __construct(CardPayment $payment)
{
$this->payment = $payment->fresh();
}
/**
* 购卡佣金
* @return [type] [description]
*/
public function fire()
{
if ($this->payment && $this->payment->state == 'SUCCESS') {
//判断订单状态
$order = $this->payment->order; //获取订单
$user = $order->user; //获取会员
if ($order && $user) {
//基础判断
$parent = $user->parent; //获取推荐人
$eventName = 'team_card'; //默认直推
$lastPrice = 0; //默认直推
while ($parent) {
$price = $parent->identity->info->configs[$eventName] ?? 0; //结算单价
if ($price) {
$amount = $this->payment->amount; //代理金额
$num = $order->num; //代理金额
$cash = $price * $num; //实际佣金
$cash -= $lastPrice;
$lastPrice += $cash;
$log = $parent->accountLogs()->where('rule_id', 9)->where('source->order_id', $order->id)->first(); //查看是否结算过佣金
if ($cash > 0 && !$log) {
$source = [
'user_id' => $user->id, //会员ID
'payment_id' => $this->payment->id, //升级订单ID
'order_id' => $order->id, //升级订单ID
'price' => $price, //结算比例
'num' => $num, //结算数量
];
$parent->rule($eventName, $cash, false, $source); //执行立即到账
}
}
$parent = $parent->parent;
}
} else {
\Log::channel('bonus')->error('购卡订单或会员不存在' . $this->payment->order_id);
}
} else {
\Log::channel('bonus')->error('购卡订单状态不正确(ID:' . ($this->payment->id ?? '无') . ')');
}
}
}

View File

@@ -0,0 +1,42 @@
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
class CityProfitCommand extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'rulong:CityProfitCommand';
/**
* The console command description.
*
* @var string
*/
protected $description = '股东城市分红';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
}
}

View File

@@ -0,0 +1,65 @@
<?php
namespace App\Console\Commands;
use App\Bonus\AddPerf;
use Illuminate\Console\Command;
use RuLong\Order\Models\Order;
class OrderPerfCommand extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'rulong:OrderPerfCommand';
/**
* The console command description.
*
* @var string
*/
protected $description = '计算订单业绩';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$time = now()->subDays(7)->format('Y-m-d H:i:s');
//状态签收或完成
//是否完成业绩为0
//type会员商城商品
//物流签收时间7天后
$orders = Order::whereIn('state', ['SIGNED', 'COMPLETED'])
->where('type', 'MEMBER')
->where('isPerf', 0)
->whereHas('express', function ($query) {
$query->where('receive_at', '<=', $time);
})->get();
foreach ($orders as $key => $order) {
$source = [
'user_id' => $order->user->id,
'type' => 'Shop',
'order_id' => $order->id,
];
AddPerf::settlement($order->user, $order->amount, $source);
\App\Jobs\CityOrderProfit::dispatch($order->express);
$order->isPerf = 1;
$order->save();
}
}
}

View File

@@ -0,0 +1,57 @@
<?php
namespace App\Console\Commands;
use App\Models\User;
use Illuminate\Console\Command;
use RuLong\UserRelation\Models\UserRelation;
class PerfBonusCommand extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'rulong:PerfBonusCommand';
/**
* The console command description.
*
* @var string
*/
protected $description = '业绩分润';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$maxLayer = UserRelation::max('layer');
for ($i = $maxLayer; $i >= 1; $i--) {
$users = User::whereHas('identity.info', function ($query) {
$query->where('configs->perf_100', '>', 0)
->orWhere('configs->perf_500', '>', 0)
->orWhere('configs->perf_1000', '>', 0);
})->whereHas('relation', function ($query) use ($i) {
$query->where('layer', $i);
})->get();
foreach ($users as $key => $user) {
\App\Jobs\Perf::dispatch($user);
}
}
}
}

44
app/Console/Kernel.php Normal file
View File

@@ -0,0 +1,44 @@
<?php
namespace App\Console;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
class Kernel extends ConsoleKernel
{
/**
* The Artisan commands provided by your application.
*
* @var array
*/
protected $commands = [
//
];
/**
* Define the application's command schedule.
*
* @param \Illuminate\Console\Scheduling\Schedule $schedule
* @return void
*/
protected function schedule(Schedule $schedule)
{
// $schedule->command('inspire')
// ->hourly();
$schedule->command('rulong:OrderPerfCommand')->hourly();
$schedule->command('rulong:PerfBonusCommand')->monthlyOn(1, '00:10');
}
/**
* Register the commands for the application.
*
* @return void
*/
protected function commands()
{
$this->load(__DIR__ . '/Commands');
require base_path('routes/console.php');
}
}

View File

@@ -0,0 +1,23 @@
<?php
namespace App\Events;
use App\Models\CardPayment;
use Illuminate\Queue\SerializesModels;
class CardOrderPaid
{
use SerializesModels;
public $card_payment;
/**
* Create a new event instance.
*
* @return void
*/
public function __construct(CardPayment $card_payment)
{
$this->card_payment = $card_payment;
}
}

View File

@@ -0,0 +1,23 @@
<?php
namespace App\Events;
use App\Models\CardOrder;
use Illuminate\Queue\SerializesModels;
class CardOrderSignined
{
use SerializesModels;
public $order;
/**
* Create a new event instance.
*
* @return void
*/
public function __construct(CardOrder $order)
{
$this->order = $order;
}
}

View File

@@ -0,0 +1,23 @@
<?php
namespace App\Events;
use App\Models\UpgradePayment;
use Illuminate\Queue\SerializesModels;
class UpgradePaid
{
use SerializesModels;
public $upgrade_payment;
/**
* Create a new event instance.
*
* @return void
*/
public function __construct(UpgradePayment $upgrade_payment)
{
$this->upgrade_payment = $upgrade_payment;
}
}

View File

@@ -0,0 +1,51 @@
<?php
namespace App\Exceptions;
use Exception;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
class Handler extends ExceptionHandler
{
/**
* A list of the exception types that are not reported.
*
* @var array
*/
protected $dontReport = [
//
];
/**
* A list of the inputs that are never flashed for validation exceptions.
*
* @var array
*/
protected $dontFlash = [
'password',
'password_confirmation',
];
/**
* Report or log an exception.
*
* @param \Exception $exception
* @return void
*/
public function report(Exception $exception)
{
parent::report($exception);
}
/**
* Render an exception into an HTTP response.
*
* @param \Illuminate\Http\Request $request
* @param \Exception $exception
* @return \Illuminate\Http\Response
*/
public function render($request, Exception $exception)
{
return parent::render($request, $exception);
}
}

43
app/Helpers/helpers.php Normal file
View File

@@ -0,0 +1,43 @@
<?php
use Encore\Admin\Config\ConfigModel;
if(!function_exists('deliver_list')){
function deliver_list()
{
$deliver_list = ConfigModel::where('name','deliver_list')->value('value');
$array = preg_split('/[\r\n]+/', trim($deliver_list, "\r\n"));
if(strpos($deliver_list, ':')){
$options = [];
foreach ($array as $val) {
[$k, $v] = explode(':', $val, 2);
$options[$k] = $v;
}
} else {
$options = $array;
}
return $options;
}
}
if(!function_exists('get_deliver_name')){
function get_deliver_name($value)
{
$deliver_list = deliver_list();
return $deliver_list[$value]??'未知';
}
}
// if(!function_exists('getMobileType')){
// function getMobileType($mobile)
// {
// if(preg_match('#([\d])\1{2}$#', $mobile)){
// return 'AAA';
// }
// return 1;
// }
// }

View 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();
}
}
}

View 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,
];
}
}

View 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();
}
}

View 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());
}
}
}

Some files were not shown because too many files have changed in this diff Show More