first commit

master
fengyuexingzi 7 years ago
commit 2c3bd61988

@ -0,0 +1,38 @@
APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:n3wdEB7E5pNp5LmaK/qKCW7XkHjKmrHuR165yHIKD3A=
APP_DEBUG=true
APP_LOG_LEVEL=debug
APP_URL=https://mp.fengyuexingzi.top/
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=xiaot
DB_USERNAME=root
DB_PASSWORD=
BROADCAST_DRIVER=log
CACHE_DRIVER=file
SESSION_DRIVER=file
SESSION_LIFETIME=120
QUEUE_DRIVER=sync
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_APP_CLUSTER=mt1
WECHAT_MINI_PROGRAM_APPID=
WECHAT_MINI_PROGRAM_SECRET=

5
.gitattributes vendored

@ -0,0 +1,5 @@
* text=auto
*.css linguist-vendored
*.scss linguist-vendored
*.js linguist-vendored
CHANGELOG.md export-ignore

18
.gitignore vendored

@ -0,0 +1,18 @@
/node_modules
/public/hot
/public/storage
/storage/*.key
/vendor
/.idea
/.vagrant
Homestead.json
Homestead.yaml
npm-debug.log
yarn-error.log
.env
/.vscode
composer.lock
package-lock.json
/public/mix-manifest.json

@ -0,0 +1,144 @@
<?php
namespace App\Admin\Controllers;
use App\Models\ShopBrand;
use Encore\Admin\Form;
use Encore\Admin\Grid;
use Encore\Admin\Facades\Admin;
use Encore\Admin\Layout\Content;
use App\Http\Controllers\Controller;
use Encore\Admin\Controllers\ModelForm;
class BrandController extends Controller
{
use ModelForm;
/**
* Index interface.
*
* @return Content
*/
public function index()
{
return Admin::content(function (Content $content) {
$content->header('品牌列表');
$content->description('品牌管理');
$content->body($this->grid());
});
}
/**
* Edit interface.
*
* @param $id
* @return Content
*/
public function edit($id)
{
return Admin::content(function (Content $content) use ($id) {
$content->header('品牌信息修改');
$content->description('品牌管理');
$content->body($this->form()->edit($id));
});
}
/**
* Create interface.
*
* @return Content
*/
public function create()
{
return Admin::content(function (Content $content) {
$content->header('创建新的品牌');
$content->description('品牌管理');
$content->body($this->form());
});
}
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
return Admin::grid(ShopBrand::class, function (Grid $grid) {
$grid->model()->orderBy('id', 'desc');
$grid->id('序号')->sortable();
$grid->name('品牌名称')->label('info')->sortable();
$grid->pic_url('品牌图片')->image('', 100, 100);
$grid->list_pic_url('品牌列表展示图片')->image('', 100, 100);
$grid->simple_desc('品牌描述');
$grid->sort_order('展示排序');
$grid->floor_price('品牌显示的最低价');
$grid->is_new('是否新增')
->select(ShopBrand::getTypeStateDispayMap());
$grid->new_pic_url('新增展示图片')->image('', 100, 100);
$grid->new_sort_order('新增逻辑下的排序');
$grid->is_show('状态')
->select(ShopBrand::getStateDispayMap());
$grid->created_at('创建时间');
$grid->updated_at('更新时间');
$grid->filter(function ($filter) {
$filter->like('name', '品牌名称');
$filter->equal('is_show', '状态')
->radio(ShopBrand::getStateDispayMap());
});
});
}
/**
* Make a form builder.
*
* @return Form
*/
protected function form()
{
return Admin::form(ShopBrand::class, function (Form $form) {
$form->display('id', '序号');
$form->text('name', '品牌名称')
->rules('required');
$form->multipleImage('list_pic_url', '品牌列表展示图片')
->rules('required');
$form->textarea('simple_desc', '品牌描述');
$form->image('pic_url', '品牌图片')
->rules('required');
$form->number('sort_order','展示排序')
->default(255);
$form->currency('floor_price', '品牌显示的最低价')
->symbol('¥');
$form->radio('is_show', '状态')
->options(ShopBrand::getStateDispayMap())
->default(ShopBrand::STATE_SHOW);
$form->image('new_pic_url', '新增展示图片')
->rules('required')
->uniqueName() ;
$form->number('new_sort_order','新增逻辑下的排序')
->default(255);
$form->radio('is_new', '是否新增')
->options(ShopBrand::getTypeStateDispayMap())
->default(ShopBrand::NEW_ADD);
});
}
}

@ -0,0 +1,134 @@
<?php
namespace App\Admin\Controllers;
use App\Models\Carousel;
use App\Models\Good;
use Encore\Admin\Form;
use Encore\Admin\Grid;
use Encore\Admin\Facades\Admin;
use Encore\Admin\Layout\Content;
use App\Http\Controllers\Controller;
use Encore\Admin\Controllers\ModelForm;
class CarouselController extends Controller
{
use ModelForm;
/**
* Index interface.
*
* @return Content
*/
public function index()
{
return Admin::content(function (Content $content) {
$content->header('轮播图列表');
$content->description('轮播图管理');
$content->body($this->grid());
});
}
/**
* Edit interface.
*
* @param $id
* @return Content
*/
public function edit($id)
{
return Admin::content(function (Content $content) use ($id) {
$content->header('轮播图修改');
$content->description('轮播图管理');
$content->body($this->form()->edit($id));
});
}
/**
* Create interface.
*
* @return Content
*/
public function create()
{
return Admin::content(function (Content $content) {
$content->header('轮播图创建');
$content->description('轮播图管理');
$content->body($this->form());
});
}
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
return Admin::grid(Carousel::class, function (Grid $grid) {
$grid->id('序号')->sortable();
$grid->carousel_title('标题');
$grid->carousel_img('图片')
->image('', 75, 75);
$grid->booth_type('展位')
->select(Carousel::getBoothTypeDisplayMap());
$grid->goods_id('商品序号');
$grid->carousel_info('显示内容');
$grid->state('状态')
->switch(Carousel::getStateDisplayConfig());
$grid->created_at('创建时间');
$grid->updated_at('更改时间');
$grid->filter(function ($filter) {
$filter->like('carousel_title', '标题');
$filter->equal('booth_type', '展位')
->select(Carousel::getBoothTypeDisplayMap());
});
});
}
/**
* Make a form builder.
*
* @return Form
*/
protected function form()
{
return Admin::form(Carousel::class, function (Form $form) {
$form->display('id', '序号');
$form->text('carousel_title', '标题')
->rules('required|max:100');
$form->image('carousel_img', '图片')
->rules('required')
->uniqueName();
$form->select('booth_type', '展位')
->rules('required')
->options(Carousel::getBoothTypeDisplayMap())
->default(Carousel::BOOTH_TYPE_HOME);
// $form->select('goods_id', '商品序号')
// ->options(Good::getAllGoodsID())
// ->rules('required');
$form->text('carousel_info', '显示内容')
->rules('required|max:100');
$stateDisplayConfig = Carousel::getStateDisplayConfig();
$form->switch('state', '状态')
->states($stateDisplayConfig)
->default(Carousel::STATE_NORMAL);
$form->display('created_at', '创建时间');
$form->display('updated_at', '更新时间');
});
}
}

@ -0,0 +1,137 @@
<?php
namespace App\Admin\Controllers;
use App\Models\Classes;
use Encore\Admin\Form;
use Encore\Admin\Grid;
use Encore\Admin\Facades\Admin;
use Encore\Admin\Layout\Content;
use App\Http\Controllers\Controller;
use Encore\Admin\Controllers\ModelForm;
class ClassController extends Controller
{
use ModelForm;
/**
* Index interface.
*
* @return Content
*/
public function index()
{
return Admin::content(function (Content $content) {
$content->header('商品分类列表');
$content->description('分类管理');
$content->body($this->grid());
// $content->body(Classes::tree());
});
}
/**
* Edit interface.
*
* @param $id
* @return Content
*/
public function edit($id)
{
return Admin::content(function (Content $content) use ($id) {
$content->header('商品分类信息修改');
$content->description('分类管理');
$content->body($this->form()->edit($id));
});
}
/**
* Create interface.
*
* @return Content
*/
public function create()
{
return Admin::content(function (Content $content) {
$content->header('创建商品分类');
$content->description('分类管理');
$content->body($this->form());
});
}
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
return Admin::grid(Classes::class, function (Grid $grid) {
$grid->id('序号')->sortable();
$grid->class_name('分类名')
->label('info')
->sortable();
$grid->class_pid('父分类')
->select(Classes::getAllClasses());
$stateDisplayConfig = Classes::getStateDisplayConfig();
$grid->class_state('状态')
->switch($stateDisplayConfig);
$grid->created_at('创建时间');
$grid->updated_at('修改时间');
$grid->filter(function ($filter) {
$filter->like('class_name', '分类名');
$filter->in('class_pid', '父分类')
->multipleSelect(Classes::getAllClasses());
$filter->equal('class_state', '状态')
->radio(Classes::getStateDisplayMap());
});
$grid->actions(function ($actions) {
$actions->disableDelete();
});
});
}
/**
* Make a form builder.
*
* @return Form
*/
protected function form()
{
return Admin::form(Classes::class, function (Form $form) {
$form->display('id', '序号');
$form->text('class_name', '分类名')
->rules('required|max:100')
->placeholder('请输入分类名');
$form->select('class_pid', '父分类')
->rules('required')
->options(Classes::getAllClasses());
$form->text('class_desc', '描述')
->placeholder('请输入分类描述');
$form->switch('class_state', '状态')
->states(Classes::getStateDisplayConfig())
->default(Classes::STATE_ACTIVE);
$form->display('created_at', '创建时间');
$form->display('updated_at', '修改时间');
});
}
}

@ -0,0 +1,96 @@
<?php
namespace App\Admin\Controllers;
use Encore\Admin\Form;
use Encore\Admin\Grid;
use Encore\Admin\Facades\Admin;
use Encore\Admin\Layout\Content;
use App\Http\Controllers\Controller;
use Encore\Admin\Controllers\ModelForm;
class ExampleController extends Controller
{
use ModelForm;
/**
* Index interface.
*
* @return Content
*/
public function index()
{
return Admin::content(function (Content $content) {
$content->header('header');
$content->description('description');
$content->body($this->grid());
});
}
/**
* Edit interface.
*
* @param $id
* @return Content
*/
public function edit($id)
{
return Admin::content(function (Content $content) use ($id) {
$content->header('header');
$content->description('description');
$content->body($this->form()->edit($id));
});
}
/**
* Create interface.
*
* @return Content
*/
public function create()
{
return Admin::content(function (Content $content) {
$content->header('header');
$content->description('description');
$content->body($this->form());
});
}
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
return Admin::grid(YourModel::class, function (Grid $grid) {
$grid->id('ID')->sortable();
$grid->created_at();
$grid->updated_at();
});
}
/**
* Make a form builder.
*
* @return Form
*/
protected function form()
{
return Admin::form(YourModel::class, function (Form $form) {
$form->display('id', 'ID');
$form->display('created_at', 'Created At');
$form->display('updated_at', 'Updated At');
});
}
}

@ -0,0 +1,113 @@
<?php
namespace App\Admin\Controllers;
use App\User;
use Encore\Admin\Form;
use Encore\Admin\Grid;
use Encore\Admin\Facades\Admin;
use Encore\Admin\Layout\Content;
use App\Http\Controllers\Controller;
use Encore\Admin\Controllers\ModelForm;
class FrontEndUserController extends Controller
{
use ModelForm;
/**
* Index interface.
*
* @return Content
*/
public function index()
{
return Admin::content(function (Content $content) {
$content->header('前端用户列表');
$content->description('前端用户管理');
$content->body($this->grid());
});
}
/**
* Edit interface.
*
* @param $id
* @return Content
*/
public function edit($id)
{
return Admin::content(function (Content $content) use ($id) {
$content->header('header');
$content->description('description');
$content->body($this->form()->edit($id));
});
}
/**
* Create interface.
*
* @return Content
*/
public function create()
{
return Admin::content(function (Content $content) {
$content->header('header');
$content->description('description');
$content->body($this->form());
});
}
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
return Admin::grid(User::class, function (Grid $grid) {
$grid->disableCreateButton();
$grid->disableActions();
$grid->disableRowSelector();
$grid->id('序号')->sortable();
$grid->name('姓名');
$grid->mobile('手机号');
$grid->nickname('昵称');
$grid->login_time('登录时间');
$grid->login_ip('登录IP');
$grid->role('用户类型')->select(User::getRoleDisplayMap());
$grid->created_at('创建时间');
$grid->updated_at('更新时间');
$grid->filter(function ($filter) {
$filter->like('name', '姓名');
$filter->equal('mobile', '手机号');
$filter->equal('role', '用户类型')->radio(User::getRoleDisplayMap());
});
});
}
/**
* Make a form builder.
*
* @return Form
*/
protected function form()
{
return Admin::form(User::class, function (Form $form) {
$form->display('id', '序号');
$form->select('role', '用户类型')->options(User::getRoleDisplayMap());
$form->display('created_at', '创建时间');
$form->display('updated_at', '更新时间');
});
}
}

@ -0,0 +1,166 @@
<?php
namespace App\Admin\Controllers;
use App\Models\Classes;
use App\Models\Good;
use Encore\Admin\Form;
use Encore\Admin\Grid;
use Encore\Admin\Facades\Admin;
use Encore\Admin\Layout\Content;
use App\Http\Controllers\Controller;
use Encore\Admin\Controllers\ModelForm;
class GoodController extends Controller
{
use ModelForm;
/**
* Index interface.
*
* @return Content
*/
public function index()
{
return Admin::content(function (Content $content) {
$content->header('商品列表');
$content->description('商品管理');
$content->body($this->grid());
});
}
/**
* Edit interface.
*
* @param $id
* @return Content
*/
public function edit($id)
{
return Admin::content(function (Content $content) use ($id) {
$content->header('商品信息修改');
$content->description('商品管理');
$content->body($this->form()->edit($id));
});
}
/**
* Create interface.
*
* @return Content
*/
public function create()
{
return Admin::content(function (Content $content) {
$content->header('创建商品');
$content->description('商品管理');
$content->body($this->form());
});
}
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
return Admin::grid(Good::class, function (Grid $grid) {
$grid->id('序号')->sortable();
$grid->goods_name('商品名')->label('info')->sortable();
$grid->goods_main_image('商品主图')->image('', 75, 75);
$grid->class_id('分类')
->select(Classes::getAllClasses(true))
->sortable();
$grid->goods_price('单价');
$grid->goods_marketprice('市场价');
$grid->goods_onsaleprice('折扣价');
$grid->goods_salenum('销售量');
$grid->goods_click('点击量');
$grid->goods_carousel('轮播图片')->image('', 50, 50);
$grid->goods_description_pictures('描述图片')->image('', 50, 50);
// $grid->goods_storage('库存');
$grid->goods_state('状态')
->select(Good::getStateDispayMap());
$grid->sort('排序');
$grid->created_at('创建时间');
$grid->updated_at('更新时间');
$grid->filter(function ($filter) {
$filter->like('goods_name', '商品名');
$filter->in('class_id', '分类')
->multipleSelect(Classes::getAllClasses(true));
$filter->lt('goods_price', '单价')
->currency();
$filter->lt('goods_marketprice', '市场价')
->currency();
$filter->lt('goods_onsaleprice', '折扣价')
->currency();
$filter->between('goods_salenum', '销售量');
$filter->between('goods_click', '点击量');
// $filter->lt('goods_storage', 'Storage');
$filter->equal('goods_state', '状态')
->radio(Good::getStateDispayMap());
});
});
}
/**
* Make a form builder.
*
* @return Form
*/
protected function form()
{
return Admin::form(Good::class, function (Form $form) {
$form->display('id', '序号');
$form->text('goods_name', '商品名')
->rules('required');
$form->select('class_id', '分类')
->rules('required')
->options(Classes::getAllClasses(true));
$form->currency('goods_price', '单价')
->symbol('¥');
$form->currency('goods_marketprice', '市场价')
->symbol('¥');
$form->currency('goods_onsaleprice', '折扣价')
->symbol('¥');
$form->image('goods_main_image', '主图')
->rules('required')
->uniqueName() ;
$form->multipleImage('goods_carousel', '轮播图片')
->uniqueName();
$form->textarea('goods_desc', '描述');
$form->multipleImage('goods_description_pictures', '描述图片')
->uniqueName();
// $form->number('goods_storage', '库存');
$form->radio('goods_state', '状态')
->options(Good::getStateDispayMap())
->default(Good::STATE_NORMAL);
$form->number('sort','排序')
->default(255);
$form->display('created_at', '创建时间');
$form->display('updated_at', '更新时间');
});
}
}

@ -0,0 +1,39 @@
<?php
namespace App\Admin\Controllers;
use App\Http\Controllers\Controller;
use Encore\Admin\Controllers\Dashboard;
use Encore\Admin\Facades\Admin;
use Encore\Admin\Layout\Column;
use Encore\Admin\Layout\Content;
use Encore\Admin\Layout\Row;
class HomeController extends Controller
{
public function index()
{
return Admin::content(function (Content $content) {
$content->header('Dashboard');
$content->description('Description...');
$content->row(Dashboard::title());
$content->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());
});
});
});
}
}

@ -0,0 +1,109 @@
<?php
namespace App\Admin\Controllers;
use App\Models\News;
use Encore\Admin\Form;
use Encore\Admin\Grid;
use Encore\Admin\Facades\Admin;
use Encore\Admin\Layout\Content;
use App\Http\Controllers\Controller;
use Encore\Admin\Controllers\ModelForm;
class NewsController extends Controller
{
use ModelForm;
/**
* Index interface.
*
* @return Content
*/
public function index()
{
return Admin::content(function (Content $content) {
$content->header('新闻通知列表');
$content->description('新闻通知列表');
$content->body($this->grid());
});
}
/**
* Edit interface.
*
* @param $id
* @return Content
*/
public function edit($id)
{
return Admin::content(function (Content $content) use ($id) {
$content->header('新闻信息修改');
$content->description('新闻信息修改');
$content->body($this->form()->edit($id));
});
}
/**
* Create interface.
*
* @return Content
*/
public function create()
{
return Admin::content(function (Content $content) {
$content->header('新增新闻');
$content->description('新增新闻通知');
$content->body($this->form());
});
}
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
return Admin::grid(News::class, function (Grid $grid) {
$grid->id('ID')->sortable();
$grid->news_title('新闻标题');
$grid->news_lable('新闻标签');
$grid->news_author('新闻发布者');
$grid->news_content('新闻内容');
$grid->created_at();
$grid->updated_at();
});
}
/**
* Make a form builder.
*
* @return Form
*/
protected function form()
{
return Admin::form(News::class, function (Form $form) {
$form->display('id', 'ID');
$form->text('news_title', '新闻标题')
->rules('required');
$form->text('news_lable', '新闻标签')
->rules('required');
$form->text('news_author', '编辑作者')
->rules('required');
$form->text('news_content', '新闻内容')
->rules('required');
$form->display('created_at', 'Created At');
$form->display('updated_at', 'Updated At');
});
}
}

@ -0,0 +1,147 @@
<?php
namespace App\Admin\Controllers;
use App\Models\ProjectFuncdot;
use App\Logics\ProjectControl;
use Encore\Admin\Form;
use Encore\Admin\Grid;
use Encore\Admin\Facades\Admin;
use Encore\Admin\Layout\Content;
use App\Http\Controllers\Controller;
use Encore\Admin\Controllers\ModelForm;
class ProjectFuncDotController extends Controller
{
use ModelForm;
/**
* Index interface.
*
* @return Content
*/
public function index()
{
return Admin::content(function (Content $content) {
$content->header('功能点管理');
$content->description('功能点管理列表');
$content->body($this->grid());
});
}
/**
* Edit interface.
*
* @param $id
* @return Content
*/
public function edit($id)
{
return Admin::content(function (Content $content) use ($id) {
$content->header('功能点修改');
$content->description('功能点修改');
$content->body($this->form()->edit($id));
});
}
/**
* Create interface.
*
* @return Content
*/
public function create()
{
return Admin::content(function (Content $content) {
$content->header('功能点创建');
$content->description('功能点创建');
$content->body($this->form());
});
}
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
return Admin::grid(ProjectFuncdot::class, function (Grid $grid) {
$grid->id('序号')->sortable();
$grid->type_id('所属项目类型id');
$grid->functype_id('所属功能分类id');
$grid->column('FunctypeFid.functype_name','所属功能分类');
$grid->column('getModels.model_name','所属功能模块');
$grid->funcdot_name('功能点名');
$grid->funcdot_desc('功能点描述');
$grid->bottom_time('最低周期(h)');
$grid->time('周期(h)');
$grid->discount_price('该功能的折扣价格');
$grid->price('市场价格');
$grid->sort('排序');
$grid->status('状态')
->switch([
'on' => ['value' => 1, 'text' => '启用', 'color' => 'success'],
'off' => ['value' => 0, 'text' => '禁用', 'color' => 'danger'],
]);
$grid->created_at('创建时间');
$grid->updated_at('更新时间');
$grid->filter(function ($filter) {
// $filter->equal('functype_id', '所属功能分类id')
// ->select(Classes::getAllClasses(true));
$filter->like('model_name', '模块名');
});
});
}
/**
* Make a form builder.
*
* @return Form
*/
protected function form()
{
return Admin::form(ProjectFuncdot::class, function (Form $form) {
$form->display('id', '序号');
$form->select('type_id', '所属项目类型')
->rules("required|min:0")
->options(ProjectControl::getProjectTypes())
->default(-1)->load('functype_id', '/api/project_json/func-types', 'id', 'functype_name');
$form->select('functype_id', '所属功能分类id')->options(function ($id) {})
->load('model_id', '/api/project_json/models', 'id', 'model_name');
$form->select('model_id', '所属功能模块id')->options(function ($id) {});
$form->text('funcdot_name', '功能点名')
->rules('required');
$form->text('funcdot_desc', '功能点描述')
->rules('required|max:300')
->default('');
$form->number('bottom_time','最低周期(h)')
->default(4);
$form->number('time','周期(h)')
->default(6);
$form->currency('discount_price','该功能的折扣价格');
$form->currency('price','市场价格');
$form->number('sort','排序')
->default(255);
$form->switch('status', '是否启用')
->states([
'on' => ['value' => 1, 'text' => '启用', 'color' => 'success'],
'off' => ['value' => 0, 'text' => '禁用', 'color' => 'danger'],
])->default(1);
$form->display('created_at', '创建时间');
$form->display('updated_at', '更新时间');
});
}
}

@ -0,0 +1,126 @@
<?php
namespace App\Admin\Controllers;
use App\Logics\ProjectControl;
use App\Models\ProjectFunctype;
use Encore\Admin\Form;
use Encore\Admin\Grid;
use Encore\Admin\Facades\Admin;
use Encore\Admin\Layout\Content;
use App\Http\Controllers\Controller;
use Encore\Admin\Controllers\ModelForm;
class ProjectFuncTypeController extends Controller
{
use ModelForm;
/**
* Index interface.
*
* @return Content
*/
public function index()
{
return Admin::content(function (Content $content) {
$content->header('项目功能分类');
$content->description('项目功能分类管理');
$content->body($this->grid());
});
}
/**
* Edit interface.
*
* @param $id
* @return Content
*/
public function edit($id)
{
return Admin::content(function (Content $content) use ($id) {
$content->header('项目功能分类');
$content->description('项目功能分类修改');
$content->body($this->form()->edit($id));
});
}
/**
* Create interface.
*
* @return Content
*/
public function create()
{
return Admin::content(function (Content $content) {
$content->header('项目功能分类');
$content->description('项目功能分类创建');
$content->body($this->form());
});
}
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
return Admin::grid(ProjectFunctype::class, function (Grid $grid) {
$grid->id('序号')->sortable();
$grid->type_id('所属项目类型id')->select(ProjectControl::getProjectTypes());
$grid->functype_name('功能分类名');
$grid->functype_desc('功能分类描述');
$grid->sort('排序');
$grid->status('状态')
->switch([
'on' => ['value' => 1, 'text' => '启用', 'color' => 'success'],
'off' => ['value' => 0, 'text' => '禁用', 'color' => 'danger'],
]);
$grid->created_at('创建时间');
$grid->updated_at('更新时间');
$grid->filter(function ($filter) {
$filter->equal('type_id', '所属项目类型id')
->select(ProjectControl::getProjectTypes(0));
$filter->like('functype_name', '功能分类名');
});
});
}
/**
* Make a form builder.
*
* @return Form
*/
protected function form()
{
return Admin::form(ProjectFunctype::class, function (Form $form) {
$form->display('id', '序号');
$form->select('type_id', '所属项目类型')
->rules("required|numeric|min:0")
->options(ProjectControl::getProjectTypes())->default(-1);
$form->text('functype_name', '功能分类名')
->rules('required');
$form->text('functype_desc', '功能分类描述')
->rules('required|max:300')
->default('');
$form->number('sort','排序')
->default(255);
$form->switch('status', '是否启用')
->states([
'on' => ['value' => 1, 'text' => '启用', 'color' => 'success'],
'off' => ['value' => 0, 'text' => '禁用', 'color' => 'danger'],
])->default(1);
$form->display('created_at', '创建时间');
$form->display('updated_at', '更新时间');
});
}
}

@ -0,0 +1,124 @@
<?php
namespace App\Admin\Controllers;
use App\Models\ProjectModel;
use App\Logics\ProjectControl;
use Encore\Admin\Form;
use Encore\Admin\Grid;
use Encore\Admin\Facades\Admin;
use Encore\Admin\Layout\Content;
use App\Http\Controllers\Controller;
use Encore\Admin\Controllers\ModelForm;
class ProjectModelController extends Controller
{
use ModelForm;
/**
* Index interface.
*
* @return Content
*/
public function index()
{
return Admin::content(function (Content $content) {
$content->header('功能模块管理');
$content->description('功能模块管理列表');
$content->body($this->grid());
});
}
/**
* Edit interface.
*
* @param $id
* @return Content
*/
public function edit($id)
{
return Admin::content(function (Content $content) use ($id) {
$content->header('功能模块修改');
$content->description('功能模块修改');
$content->body($this->form()->edit($id));
});
}
/**
* Create interface.
*
* @return Content
*/
public function create()
{
return Admin::content(function (Content $content) {
$content->header('功能模块创建');
$content->description('功能模块创建');
$content->body($this->form());
});
}
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
return Admin::grid(ProjectModel::class, function (Grid $grid) {
$grid->id('序号')->sortable();
$grid->type_id('所属项目类型id');
$grid->functype_id('所属功能分类id');
$grid->model_name('模块名');
$grid->model_desc('模块描述');
$grid->created_at('创建时间');
$grid->updated_at('更新时间');
$grid->filter(function ($filter) {
// $filter->equal('functype_id', '所属功能分类id')
// ->select(Classes::getAllClasses(true));
$filter->like('model_name', '模块名');
});
});
}
/**
* Make a form builder.
*
* @return Form
*/
protected function form()
{
return Admin::form(ProjectModel::class, function (Form $form) {
$form->display('id', '序号');
$form->select('type_id', '所属项目类型')
->rules("required|min:0")
->options(ProjectControl::getProjectTypes())
->default(-1)->load('functype_id', '/api/project_json/func-types', 'id', 'functype_name');
$form->select('functype_id', '所属功能分类id')->options(function ($id) {});
$form->text('model_name', '模块名')
->rules('required');
$form->text('model_desc', '模块描述')
->rules('required|max:300')
->default('');
$form->number('sort','排序')
->default(255);
$form->switch('status', '是否启用')
->states([
'on' => ['value' => 1, 'text' => '启用', 'color' => 'success'],
'off' => ['value' => 0, 'text' => '禁用', 'color' => 'danger'],
])->default(1);
$form->display('created_at', '创建时间');
$form->display('updated_at', '更新时间');
});
}
}

@ -0,0 +1,127 @@
<?php
namespace App\Admin\Controllers;
use App\Models\ProjectType;
use App\Models\ShopBrand;
use Encore\Admin\Form;
use Encore\Admin\Grid;
use Encore\Admin\Facades\Admin;
use Encore\Admin\Layout\Content;
use App\Http\Controllers\Controller;
use Encore\Admin\Controllers\ModelForm;
class ProjectTypeController extends Controller
{
use ModelForm;
/**
* Index interface.
*
* @return Content
*/
public function index()
{
return Admin::content(function (Content $content) {
$content->header('项目类型');
$content->description('项目类型管理');
$content->body($this->grid());
});
}
/**
* Edit interface.
*
* @param $id
* @return Content
*/
public function edit($id)
{
return Admin::content(function (Content $content) use ($id) {
$content->header('项目类型');
$content->description('项目类型修改');
$content->body($this->form()->edit($id));
});
}
/**
* Create interface.
*
* @return Content
*/
public function create()
{
return Admin::content(function (Content $content) {
$content->header('项目类型');
$content->description('新增项目类型');
$content->body($this->form());
});
}
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
return Admin::grid(ProjectType::class, function (Grid $grid) {
$grid->id('序号')->sortable();
$grid->type_name('项目类型名');
$grid->type_desc('项目类型描述')->limit(100);
$grid->type_img('类型的图片')->image('', 50, 50);
$grid->brand_id('品牌id')
->select(ShopBrand::getAllClasses(true));
$grid->basal_price('该类项目的基础价格');
$grid->carousel_imgs('轮播图片')->image('', 50, 50);
$grid->created_at('创建时间');
$grid->updated_at('更新时间');
$grid->filter(function ($filter) {
$filter->like('type_name', '项目类型名');
});
});
}
/**
* Make a form builder.
*
* @return Form
*/
protected function form()
{
return Admin::form(ProjectType::class, function (Form $form) {
$form->display('id', '序号');
$form->text('type_name', '项目类型名')
->rules('required');
$form->text('type_desc', '项目类型描述')
->rules('required|max:300')
->default('');
$form->image('type_img', '类型的图片')
->rules('required')
->uniqueName();
$form->select('brand_id', '品牌id')
->rules('required')
->options(ShopBrand::getAllClasses(true));
$form->multipleImage('carousel_imgs', '轮播图片')
->uniqueName();
$form->number('salenum','下单量')
->default(10);
$form->textarea('description', '详情描述');
$form->currency('basal_price','该类项目的基础价格');
$form->display('created_at', '创建时间');
$form->display('updated_at', '更新时间');
});
}
}

@ -0,0 +1,100 @@
<?php
namespace App\Admin\Controllers\Shop;
use App\Models\ShopFeedback;
use Encore\Admin\Form;
use Encore\Admin\Grid;
use Encore\Admin\Facades\Admin;
use Encore\Admin\Layout\Content;
use App\Http\Controllers\Controller;
use Encore\Admin\Controllers\ModelForm;
class FeedbackController extends Controller
{
use ModelForm;
/**
* Index interface.
*
* @return Content
*/
public function index()
{
return Admin::content(function (Content $content) {
$content->header('用户反馈');
$content->description('用户反馈管理');
$content->body($this->grid());
});
}
/**
* Edit interface.
*
* @param $id
* @return Content
*/
public function edit($id)
{
return Admin::content(function (Content $content) use ($id) {
$content->header('用户反馈');
$content->description('用户反馈状态管理');
$content->body($this->form()->edit($id));
});
}
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
return Admin::grid(ShopFeedback::class, function (Grid $grid) {
$grid->model()->orderBy('id', 'desc');
$grid->disableRowSelector();
$grid->disableCreateButton();
$grid->disableActions();
$grid->id('序号')->sortable();
$grid->user_name('用户昵称');
$grid->user_contact('反馈用户联系方式');
$grid->column('msg_type','反馈类型')->display(function($msg_type){
return ShopFeedback::$Option[$msg_type];
});
$grid->msg_title('反馈标题');
$grid->msg_content('反馈内容');
$grid->msg_status('反馈状态')
->select(ShopFeedback::getStatusDispayMap());
$grid->message_img('反馈附加图片')->image('', 80, 80);
$grid->created_at('创建时间');
$grid->updated_at('更新时间');
$grid->filter(function ($filter) {
$filter->equal('user_contact', '反馈人手机');
$filter->equal('msg_type', '反馈类型')->select(ShopFeedback::$Option);
$filter->equal('msg_status', '反馈状态')->select(ShopFeedback::getStatusDispayMap());
});
});
}
/**
* Make a form builder.
*
* @return Form
*/
protected function form()
{
return Admin::form(ShopFeedback::class, function (Form $form) {
$form->display('id', '序号');
$form->select('msg_status', '反馈状态')
->rules('required')
->options(ShopFeedback::getStatusDispayMap());
});
}
}

@ -0,0 +1,104 @@
<?php
namespace App\Admin\Controllers\Shop;
use App\Models\ShopAttributeCategory;
use Encore\Admin\Form;
use Encore\Admin\Grid;
use Encore\Admin\Facades\Admin;
use Encore\Admin\Layout\Content;
use App\Http\Controllers\Controller;
use Encore\Admin\Controllers\ModelForm;
class ShopAttributeCategoryController extends Controller
{
use ModelForm;
/**
* Index interface.
*
* @return Content
*/
public function index()
{
return Admin::content(function (Content $content) {
$content->header('属性分类列表');
$content->description('属性分类管理');
$content->body($this->grid());
});
}
/**
* Edit interface.
*
* @param $id
* @return Content
*/
public function edit($id)
{
return Admin::content(function (Content $content) use ($id) {
$content->header('属性分类修改');
$content->description('属性分类管理');
$content->body($this->form()->edit($id));
});
}
/**
* Create interface.
*
* @return Content
*/
public function create()
{
return Admin::content(function (Content $content) {
$content->header('新增属性分类');
$content->description('属性分类管理');
$content->body($this->form());
});
}
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
return Admin::grid(ShopAttributeCategory::class, function (Grid $grid) {
$grid->id('序号')->sortable();
$grid->name('属性分类名称');
$grid->enabled('状态')
->select(ShopAttributeCategory::getEnabledDispayMap());
$grid->disableExport();// 禁用导出数据按钮
$grid->filter(function ($filter) {
$filter->like('name', '属性分类名称');
});
});
}
/**
* Make a form builder.
*
* @return Form
*/
protected function form()
{
return Admin::form(ShopAttributeCategory::class, function (Form $form) {
$form->display('id', '序号');
$form->text('name', '属性分类名称')
->rules('required');
$form->radio('enabled', '是否推荐')
->options(ShopAttributeCategory::getEnabledDispayMap())
->default(ShopAttributeCategory::STATE_ENABLED);
});
}
}

@ -0,0 +1,105 @@
<?php
namespace App\Admin\Controllers\Shop;
use App\Models\ShopAttribute;
use App\Models\ShopAttributeCategory;
use Encore\Admin\Form;
use Encore\Admin\Grid;
use Encore\Admin\Facades\Admin;
use Encore\Admin\Layout\Content;
use App\Http\Controllers\Controller;
use Encore\Admin\Controllers\ModelForm;
class ShopAttributeController extends Controller
{
use ModelForm;
/**
* Index interface.
*
* @return Content
*/
public function index()
{
return Admin::content(function (Content $content) {
$content->header('属性条目列表');
$content->description('属性条目管理');
$content->body($this->grid());
});
}
/**
* Edit interface.
*
* @param $id
* @return Content
*/
public function edit($id)
{
return Admin::content(function (Content $content) use ($id) {
$content->header('属性条目修改');
$content->description('属性条目管理');
$content->body($this->form()->edit($id));
});
}
/**
* Create interface.
*
* @return Content
*/
public function create()
{
return Admin::content(function (Content $content) {
$content->header('新增属性条目');
$content->description('属性条目管理');
$content->body($this->form());
});
}
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
return Admin::grid(ShopAttribute::class, function (Grid $grid) {
$grid->model()->orderBy('sort_order', 'asc');
$grid->id('序号')->sortable();
$grid->name('属性名称');
$grid->attribute_category_id('属性分类')->select(ShopAttributeCategory::pluck('name','id'));
$grid->disableExport();// 禁用导出数据按钮
$grid->filter(function ($filter) {
$filter->like('name', '属性名称');
$filter->equal('attribute_category_id','属性分类')->select(ShopAttributeCategory::pluck('name','id'));
});
});
}
/**
* Make a form builder.
*
* @return Form
*/
protected function form()
{
return Admin::form(ShopAttribute::class, function (Form $form) {
$form->display('id', '序号');
$form->text('name', '属性名称')
->rules('required');
$form->select('attribute_category_id', '属性分类')->options(ShopAttributeCategory::pluck('name','id'));
$form->number('sort_order','排序')
->default(255);
});
}
}

@ -0,0 +1,151 @@
<?php
namespace App\Admin\Controllers\Shop;
use App\Models\ShopCategory;
use Encore\Admin\Form;
use Encore\Admin\Grid;
use Encore\Admin\Facades\Admin;
use Encore\Admin\Layout\Content;
use Encore\Admin\Layout\Column;
use Encore\Admin\Layout\Row;
use App\Http\Controllers\Controller;
use Encore\Admin\Controllers\ModelForm;
use Encore\Admin\Tree;
use Encore\Admin\Widgets\Box;
class ShopCategoryController extends Controller
{
use ModelForm;
/**
* Index interface.
*
* @return Content
*/
public function index()
{
return Admin::content(function (Content $content) {
$content->header('商城分类');
$content->description('分类管理');
$content->row(function (Row $row) {
$row->column(6, $this->treeView()->render());
$row->column(6, function (Column $column) {
$form = new \Encore\Admin\Widgets\Form();
$form->action(admin_base_path('shop-category'));
$form->select('parent_id','上级分类')->options(ShopCategory::selectOptions())->help('目前只支持一级分类,但留有多级接口。可根据需要联系开发人员进行功能构造');
$form->text('name','分类名称')->rules('required|min:2')->help('必填');
$form->text('front_name','分类简述')->rules('required|min:2')->help('必填');
$form->number('sort_order', '排序')->default(255);
$form->text('keywords','分类关键词')->rules('required')->help('必填');
$form->textarea('front_desc','分类描述');
$form->image('icon_url','分类图标')->help('必填 推荐 62*62')->rules('required');
$form->image('banner_url','推广图片')->help('必填 推荐 600*400');
$form->image('img_url','展示图片')->help('推荐 400*400')->rules('required');
$form->display('created_at', '创建时间');
$form->display('updated_at', '更新时间');
$form->saved(function (Form $form) {
if($form->model()->id!=0){
$info = ShopCategory::find($form->model()->id);
if($info->parent_id){
$pinfo = ShopCategory::find($info->parent_id);
$info->level=$pinfo->level + 1;
$info->save();
}
}
});
$column->append((new Box(trans('新增商城分类'), $form))->style('success'));
});
});
});
}
/**
* @return \Encore\Admin\Tree
*/
protected function treeView()
{
return ShopCategory::tree(function (Tree $tree) {
$tree->disableCreate();
$tree->disableSave();
$tree->disableRefresh();
$tree->branch(function ($branch) {
$src = config('filesystems.disks.oss.url') . '/' . $branch['icon_url'] ;
$logo = "<img src='$src' style='max-width:30px;max-height:30px' class='img'/>";
return "{$branch['id']} - {$branch['name']} $logo";
});
});
}
/**
* Edit interface.
*
* @param $id
* @return Content
*/
public function edit($id)
{
return Admin::content(function (Content $content) use ($id) {
$content->header('header');
$content->description('description');
$content->body($this->form()->edit($id));
});
}
/**
* Create interface.
*
* @return Content
*/
public function create()
{
return Admin::content(function (Content $content) {
$content->header('header');
$content->description('description');
$content->body($this->form());
});
}
/**
* Make a form builder.
*
* @return Form
*/
protected function form()
{
return Admin::form(ShopCategory::class, function (Form $form) {
$form->select('parent_id','上级分类')->options(ShopCategory::selectOptions())->help('目前只支持一级分类,但留有多级接口。可根据需要联系开发人员进行功能构造');
$form->text('name','分类名称')->rules('required|min:2');
$form->text('front_name','分类简述')->rules('required|min:2')->help('必填');
$form->number('sort_order', '排序')->default(255);
$form->text('keywords','分类关键词')->help('必填')->rules('required');
$form->textarea('front_desc','分类描述')->help('必填')->rules('required');
$form->image('icon_url','分类图标')->help('必填 推荐 62*62')->rules('required');
$form->image('banner_url','推广图片')->help('必填 推荐 600*400')->rules('required');
$form->image('img_url','展示图片')->help('推荐 400*400');
$form->display('created_at', '创建时间');
$form->display('updated_at', '更新时间');
$form->saved(function (Form $form) {
if($form->model()->id!=0){
$info = ShopCategory::find($form->model()->id);
if($info->parent_id){
$pinfo = ShopCategory::find($info->parent_id);
$info->level=$pinfo->level + 1;
$info->save();
}
}
});
});
}
}

@ -0,0 +1,256 @@
<?php
namespace App\Admin\Controllers\Shop;
use App\Models\ShopCategory;
use App\Models\ShopGoods;
use App\Models\ShopBrand;
use App\Models\ShopAttribute;
use Encore\Admin\Form;
use Encore\Admin\Grid;
use Encore\Admin\Facades\Admin;
use Encore\Admin\Layout\Content;
use App\Http\Controllers\Controller;
use Encore\Admin\Controllers\ModelForm;
use Encore\Admin\Widgets\Box;
use Encore\Admin\Widgets\Tab;
use Encore\Admin\Widgets\Table;
class ShopGoodsController extends Controller
{
use ModelForm;
/**
* Index interface.
*
* @return Content
*/
public function index()
{
return Admin::content(function (Content $content) {
$content->header('商城商品列表');
$content->description('商城商品管理');
$content->body($this->grid());
});
}
/**
* Edit interface.
*
* @param $id
* @return Content
*/
public function edit($id)
{
return Admin::content(function (Content $content) use ($id) {
$content->header('商城商品列表');
$content->description('商城商品管理');
$content->body($this->form()->edit($id));
});
}
/**
* Create interface.
*
* @return Content
*/
public function create()
{
return Admin::content(function (Content $content) {
$content->header('新增商品');
$content->description('商品管理');
$content->body($this->form());
});
}
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
return Admin::grid(ShopGoods::class, function (Grid $grid) {
$grid->model()->orderBy('sort_order', 'asc');
$grid->id('序号')->sortable();
$grid->primary_pic_url('商品主图')->image('', 75, 75);
$grid->goods_name('商品名')->label('info')->limit(50);
$grid->goods_sn('商品编号')->limit(50);
$grid->category_id('商品分类')
->select(ShopCategory::getAllClasses(true));
$grid->brand_id('品牌id')
->select(ShopBrand::getAllClasses(true));
$grid->goods_number('商品库存量');
$grid->sort_order('商品排序');
$getListImg = $this;
// 这里是多个信息一起显示
$grid->column('其他信息')->expand(function () use($getListImg) {
$imgUrl = '<img src="%s" style="max-width:160px;max-height:160px" class="img img-thumbnail">';
$row_arr1 = [
[
'商品主图:' . sprintf($imgUrl,config('filesystems.disks.oss.url').'/'.$this->primary_pic_url),
],
[
'商品列表图:' .$getListImg->getListImg($this->list_pic_url,$imgUrl) ,
],
[
'商品关键词:' . $this->keywords,
],
[
'商品摘要:' . $this->goods_brief,
],
[
'专柜价格:¥' . $this->counter_price,
'附加价格:¥' . $this->extra_price,
'零售价格:¥' . $this->retail_price,
'单位价格,单价:¥' . $this->unit_price,
'运费:¥' . $this->freight_price,
],
];
$table = new Table(['其他信息'], $row_arr1);
$tab = new Tab();
$tab->add('商品基础信息', $table);
$box = new Box('商品描述',$this->goods_desc);
$tab->add('商品描述', $box);
return $tab;
}, '其他信息');
// $grid->goods_price('单价');
// $grid->goods_marketprice('市场价');
// $grid->goods_onsaleprice('折扣价');
// $grid->goods_salenum('销售量');
// $grid->goods_click('点击量');
// $grid->goods_carousel('轮播图片')->image('', 50, 50);
// $grid->goods_description_pictures('描述图片')->image('', 50, 50);
//
//// $grid->goods_storage('库存');
// $grid->goods_state('状态')
// ->select(Good::getStateDispayMap());
// $grid->sort('排序');
// $grid->created_at('创建时间');
// $grid->updated_at('更新时间');
$grid->filter(function ($filter) {
$filter->like('goods_name', '商品名');
$filter->in('class_id', '分类')
->multipleSelect(ShopCategory::getAllClasses(true));
$filter->equal('is_delete', '状态')
->radio(ShopGoods::getDeleteDispayMap());
});
});
}
/**
* Make a form builder.
*
* @return Form
*/
protected function form()
{
return Admin::form(ShopGoods::class, function (Form $form) {
$form->display('id', '序号');
$form->text('goods_name', '商品名')
->rules('required');
$form->select('category_id', '商品分类')
->rules('required')
->options(ShopCategory::selectOptions(true));
$form->select('brand_id', '品牌id')
->rules('required')
->options(ShopBrand::getAllClasses(true));
$form->currency('counter_price', '专柜价格')
->symbol('¥');
$form->currency('extra_price', '附加价格')
->symbol('¥');
$form->currency('retail_price', '零售价格')
->symbol('¥');
$form->currency('unit_price', '单位价格,单价')
->symbol('¥');
$form->currency('freight_price', '运费,单价')
->symbol('¥');
$form->textarea('keywords', '商品关键词');
$form->textarea('goods_brief', '商品摘要');
$form->editor('goods_desc', '商品描述');
$form->textarea('promotion_desc', '促销描述');
$form->text('promotion_tag', '促销标签')
->value(' ');
$form->image('primary_pic_url', '商品主图')
->rules('required')
->uniqueName()->help('建议300*300');
$form->multipleImage('list_pic_url', '商品列表图')
->uniqueName();
$form->number('goods_number', '库存')->default(10);
$form->number('sell_volume', '销售量');
$form->radio('is_on_sale', '上架状态')
->options(ShopGoods::getSaleDispayMap())
->default(ShopGoods::STATE_ON_SALE);
$form->radio('is_delete', '删除状态')
->options(ShopGoods::getDeleteDispayMap())
->default(ShopGoods::STATE_NOT_DELETE);
$form->radio('is_limited', '是否限购')
->options(ShopGoods::getLimitDispayMap())
->default(ShopGoods::STATE_SALE_NOT_LIMIT);
$form->radio('is_hot', '是否推荐')
->options(ShopGoods::getRecommendDispayMap())
->default(ShopGoods::STATE_SALE_NOT_RECOMMEND);
$form->radio('is_new', '是否新品')
->options(ShopGoods::getNewDispayMap())
->default(ShopGoods::STATE_SALE_NEW);
$form->radio('is_vip_exclusive', '是否是会员专属')
->options(ShopGoods::getVipDispayMap())
->default(ShopGoods::STATE_NOT_VIP);
$form->currency('vip_exclusive_price', '会员专享价')
->symbol('¥');
$form->number('sort_order','排序')
->default(255);
$form->hasMany('goods_attribute', '添加属性', function (Form\NestedForm $form) {
$form->select('attribute_id', '选择属性')->options(ShopAttribute::pluck('name','id'));
$form->text('value', '属性值');
});
// $form->addSpecification('attribute_category', 'wewe');
// $form->divide();
// $form->hasMany('products', '添加规格', function (Form\NestedForm $form) {
// $form->number('goods_number','库存')->default(255)->rules('required|min:1|max:20');
// $form->currency('retail_price', '单价')
// ->symbol('¥');
// });
$form->display('created_at', '创建时间');
$form->display('updated_at', '更新时间');
});
}
public function getListImg($list_pic_url,$modelUrl){
if(empty($list_pic_url) || empty($modelUrl)){
return '';
}
$url ='';
foreach($list_pic_url as $v){
$url .= sprintf($modelUrl,config('filesystems.disks.oss.url').'/'.$v);
}
return $url;
}
}

@ -0,0 +1,162 @@
<?php
namespace App\Admin\Controllers\Shop;
use App\Logic\AddressLogic;
use App\Models\ShopOrder;
use Encore\Admin\Form;
use Encore\Admin\Grid;
use Encore\Admin\Facades\Admin;
use Encore\Admin\Layout\Content;
use App\Http\Controllers\Controller;
use Encore\Admin\Controllers\ModelForm;
use Encore\Admin\Widgets\Table;
class ShopOrderController extends Controller
{
use ModelForm;
/**
* Index interface.
*
* @return Content
*/
public function index()
{
return Admin::content(function (Content $content) {
$content->header('订单列表');
$content->description('订单管理');
$content->body($this->grid());
});
}
/**
* Edit interface.
*
* @param $id
* @return Content
*/
public function edit($id)
{
$content = Admin::content(function (Content $content) use ($id) {
$content->header('订单信息修改');
$content->description('订单管理');
$content->body($this->form($id)->edit($id));
});
return $content;
}
/**
* Create interface.
*
* @return Content
*/
public function create()
{
return Admin::content(function (Content $content) {
$content->header('header');
$content->description('description');
$content->body($this->form());
});
}
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
return Admin::grid(ShopOrder::class, function (Grid $grid) {
$grid->model()->orderBy('id', 'desc');
$grid->disableRowSelector();
$grid->disableCreateButton();
$grid->actions(function ($actions){
$actions->disableDelete();
});
$grid->id('序号')->sortable();
$grid->order_sn('订单编号');
$grid->order_price('订单金额');
$grid->coupon_price('优惠金额');
$grid->actual_price('支付金额');
$grid->consignee('收件人')->limit(10);
$grid->mobile('收件人手机')->editable();
$grid->order_status('订单状态')->display(function ($status) {
switch($status){
case ShopOrder::STATUS_WAIT_PAY:
$label = 'label-danger';
break;
case ShopOrder::STATUS_ALREADY_PAID:
$label = 'label-success';
break;
default:
$label = 'label-info';
}
$status = ShopOrder::getStatusDisplayMap()[$status];
return "<span class='label {$label}'>{$status}</span>";
});
// 这里是多个信息一起显示
$grid->column('购物信息')->expand(function (){
$imgUrl = '<img src="%s" style="max-width:160px;max-height:160px" class="img img-thumbnail">';
$goodsInfo = [];
foreach($this->orderGoods as $goods){
$goodsInfo[] = [sprintf($imgUrl,config('filesystems.disks.oss.url').'/'.$goods->list_pic_url).' '.$goods->goods_name.' '.$goods->retail_price.' * '.$goods->number];
}
$row_arr1 = [
[
'收货人:' . $this->consignee,
'收件人手机:' . $this->mobile,
'收货地址:' . AddressLogic::getRegionNameById($this->province).' '.AddressLogic::getRegionNameById($this->city).' '.AddressLogic::getRegionNameById($this->district).' '.$this->address,
],
];
$row_arr1 = array_merge($goodsInfo,$row_arr1);
$table = new Table(['购物信息'], $row_arr1);
return $table;
}, '购物信息');
$grid->pay_time('付款时间');
$grid->created_at('创建时间');
$grid->updated_at('更新时间');
$grid->filter(function ($filter) {
$filter->like('order_sn', '订单编号');
$filter->equal('mobile', '收件人手机');
$filter->equal('order_status', '订单状态')->select(ShopOrder::getStatusDisplayMap());
$filter->between('pay_time', '付款时间')->datetime();
});
});
}
/**
* Make a form builder.
*
* @return Form
*/
protected function form($id='')
{
return Admin::form(ShopOrder::class, function (Form $form){
$form->display('id', '序号');
$form->display('order_sn', '订单编号');
$form->display('order_status', '订单状态')->with(function ($value) {
return ShopOrder::getStatusDisplayMap()[$value];
});
$form->display('goods_price', '商品总价');
$form->display('order_price', '订单金额');
$form->display('coupon_price', '优惠金额');
$form->display('actual_price', '支付金额');
$form->display('consignee', '收件人');
$form->display('mobile', '收件人手机号');
$form->display('uid', '下单用户ID');
$form->display('created_at', '创建时间');
$form->display('updated_at', '更新时间');
});
}
}

@ -0,0 +1,103 @@
<?php
namespace App\Admin\Controllers\Shop;
use App\Models\ShopSpecification;
use Encore\Admin\Form;
use Encore\Admin\Grid;
use Encore\Admin\Facades\Admin;
use Encore\Admin\Layout\Content;
use App\Http\Controllers\Controller;
use Encore\Admin\Controllers\ModelForm;
class ShopSpecificationController extends Controller
{
use ModelForm;
/**
* Index interface.
*
* @return Content
*/
public function index()
{
return Admin::content(function (Content $content) {
$content->header('商品规格列表');
$content->description('商品规格管理');
$content->body($this->grid());
});
}
/**
* Edit interface.
*
* @param $id
* @return Content
*/
public function edit($id)
{
return Admin::content(function (Content $content) use ($id) {
$content->header('商品规格修改');
$content->description('商品规格管理');
$content->body($this->form()->edit($id));
});
}
/**
* Create interface.
*
* @return Content
*/
public function create()
{
return Admin::content(function (Content $content) {
$content->header('新增商品规格');
$content->description('商品规格管理');
$content->body($this->form());
});
}
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
return Admin::grid(ShopSpecification::class, function (Grid $grid) {
$grid->model()->orderBy('sort_order', 'asc');
$grid->id('序号')->sortable();
$grid->name('规格');
$grid->disableExport();// 禁用导出数据按钮
$grid->filter(function ($filter) {
$filter->like('name', '规格');
});
});
}
/**
* Make a form builder.
*
* @return Form
*/
protected function form()
{
return Admin::form(ShopSpecification::class, function (Form $form) {
$form->display('id', '序号');
$form->text('name', '规格名称')
->rules('required');
$form->number('sort_order','排序')
->default(255);
});
}
}

@ -0,0 +1,152 @@
<?php
namespace App\Admin\Controllers\Shop;
use App\Models\ShopTopic;
use Encore\Admin\Form;
use Encore\Admin\Grid;
use Encore\Admin\Facades\Admin;
use Encore\Admin\Layout\Content;
use App\Http\Controllers\Controller;
use Encore\Admin\Controllers\ModelForm;
use Encore\Admin\Widgets\Box;
use Encore\Admin\Widgets\Tab;
use Encore\Admin\Widgets\Table;
class ShopTopicController extends Controller
{
use ModelForm;
/**
* Index interface.
*
* @return Content
*/
public function index()
{
return Admin::content(function (Content $content) {
$content->header('主题&专题列表');
$content->description('主题&专题管理');
$content->body($this->grid());
});
}
/**
* Edit interface.
*
* @param $id
* @return Content
*/
public function edit($id)
{
return Admin::content(function (Content $content) use ($id) {
$content->header('主题&专题列表');
$content->description('主题&专题管理');
$content->body($this->form()->edit($id));
});
}
/**
* Create interface.
*
* @return Content
*/
public function create()
{
return Admin::content(function (Content $content) {
$content->header('新增主题&专题');
$content->description('主题&专题管理');
$content->body($this->form());
});
}
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
return Admin::grid(ShopTopic::class, function (Grid $grid) {
$grid->model()->orderBy('sort_order', 'asc');
$grid->id('序号')->sortable();
$grid->title('主题标题');
$grid->subtitle('短标题');
$grid->avatar('主题图片')->image('', 75, 75);
$grid->item_pic_url('元素图片')->image('', 75, 75);
$grid->price_info('价格信息')->label('info');
$grid->read_count('阅读量');
$grid->scene_pic_url('展示图片')->image('', 75, 75);
$grid->sort_order('主题排序');
// 这里是多个信息一起显示
$grid->column('主题表述')->expand(function () {
$tab = new Tab();
$box = new Box('主题表述',$this->content);
$tab->add('主题表述', $box);
return $tab;
}, '主题表述');
$grid->is_show('状态')
->select(ShopTopic::getStateDispayMap());
$grid->filter(function ($filter) {
$filter->like('title', '主题标题');
$filter->equal('is_show', '状态')
->radio(ShopTopic::getStateDispayMap());
});
});
}
/**
* Make a form builder.
*
* @return Form
*/
protected function form()
{
return Admin::form(ShopTopic::class, function (Form $form) {
$form->display('id', '序号');
$form->text('title', '主题标题')
->rules('required');
$form->text('subtitle', '短标题')
->rules('required');
$form->image('avatar', '主题图片')
->rules('required')
->uniqueName() ;
$form->image('scene_pic_url', '展示图片')
->rules('required')
->uniqueName() ;
$form->multipleImage('item_pic_url', '元素图片')
->uniqueName();
$form->currency('price_info', '价格信息')
->symbol('¥');
$form->editor('content', '主题表述');
$form->number('read_count', '阅读量');
$form->number('sort_order','排序')
->default(255);
$form->radio('is_show', '是否展示')
->options(ShopTopic::getStateDispayMap())
->default(ShopTopic::STATE_SHOW);
});
}
}

@ -0,0 +1,140 @@
<?php
namespace App\Admin\Controllers;
use App\Models\Classes;
use App\Models\Special;
use Encore\Admin\Form;
use Encore\Admin\Grid;
use Encore\Admin\Facades\Admin;
use Encore\Admin\Layout\Content;
use App\Http\Controllers\Controller;
use Encore\Admin\Controllers\ModelForm;
class SpecialController extends Controller
{
use ModelForm;
/**
* Index interface.
*
* @return Content
*/
public function index()
{
return Admin::content(function (Content $content) {
$content->header('专题列表');
$content->description('专题管理');
$content->body($this->grid());
});
}
/**
* Edit interface.
*
* @param $id
* @return Content
*/
public function edit($id)
{
return Admin::content(function (Content $content) use ($id) {
$content->header('专题修改');
$content->description('专题管理');
$content->body($this->form()->edit($id));
});
}
/**
* Create interface.
*
* @return Content
*/
public function create()
{
return Admin::content(function (Content $content) {
$content->header('专题创建');
$content->description('专题管理');
$content->body($this->form());
});
}
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
return Admin::grid(Special::class, function (Grid $grid) {
$grid->id('序号')->sortable();
$grid->icon('图标')
->image('', 50, 50);
$grid->class_id('分类')
->select(Classes::getAllClasses(true));
$grid->link_url('链接');
$grid->special_title('标题');
$grid->special_desc('描述');
$grid->remark('备注');
$grid->sort('排序');
$grid->if_show('是否显示')
->switch(Special::getIfShowDisplayConfig());
$grid->created_at('创建时间');
$grid->updated_at('更新时间');
$grid->filter(function ($filter) {
$filter->equal('class_id', '分类')
->select(Classes::getAllClasses(true));
$filter->like('special_title', '标题');
$filter->equal('if_show', '是否显示')
->radio(Special::getIfShowDisplayMap());
});
});
}
/**
* Make a form builder.
*
* @return Form
*/
protected function form()
{
return Admin::form(Special::class, function (Form $form) {
$form->display('id', '序号');
$form->image('icon', '图标')
->rules('required');
$form->select('class_id', '分类')
->rules("required")
->options(Classes::getAllClasses(true))
->default(0);
$form->text('link_url', '链接')
->rules('required')
->rules('nullable|max:60');
$form->text('special_title', '标题')
->rules('required');
$form->text('special_desc', '描述')
->rules('required|max:300')
->default('');
$form->text('remark', '备注')
->rules('required|max:300')
->default('');
$form->number('sort','排序')
->default(255);
$form->switch('if_show', '是否显示')
->states(Special::getIfShowDisplayConfig())
->default(Special::IFSHOW_YES);
$form->display('created_at', '创建时间');
$form->display('updated_at', '更新时间');
});
}
}

@ -0,0 +1,104 @@
<?php
namespace App\Admin\Controllers;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Storage;
class UploadController extends Controller
{
const MAX_UPLOAD_NUM = 25;
const UPLOAD_PATH = 'XiaoT';
// 待优化
function uploadImg(Request $request)
{
$file = $request->file("mypic");
if (!empty($file)) {
$len = count($file);
if ($len > static::MAX_UPLOAD_NUM) {
return response()->json(['ResultData' => 6, 'info' => '最多可以上传25张图片']);
}
$m = 0;
$k = 0;
for ($i = 0; $i < $len; $i++) {
// $n 表示第几张图片
$n = $i + 1;
if ($file[$i]->isValid()) {
if (in_array(strtolower($file[$i]->extension()), ['jpeg', 'jpg', 'gif', 'gpeg', 'png'])) {
$picname = $file[$i]->getClientOriginalName();//获取上传原文件名
$ext = $file[$i]->getClientOriginalExtension();//获取上传文件的后缀名
// 重命名
$filename = time() . str_random(6) . "." . $ext;
$re = Storage::putFile(static::UPLOAD_PATH,$file[$i]);
if ($re) {
$newFileName = config('filesystems.disks.oss.url').'/'.$re;
$m = $m + 1;
// return response()->json(['ResultData' => 0, 'info' => '上传成功', 'newFileName' => $newFileName ]);
} else {
$k = $k + 1;
// return response()->json(['ResultData' => 4, 'info' => '上传失败']);
}
$msg = $m . "张图片上传成功 " . $k . "张图片上传失败<br>";
$return[] = ['ResultData' => 0, 'info' => $msg, 'newFileName' => $newFileName];
} else {
return response()->json(['ResultData' => 3, 'info' => '第' . $n . '张图片后缀名不合法!<br/>' . '只支持jpeg/jpg/png/gif格式']);
}
} else {
return response()->json(['ResultData' => 1, 'info' => '第' . $n . '张图片超过最大限制!<br/>' . '图片最大支持2M']);
}
}
} else {
return response()->json(['ResultData' => 5, 'info' => '请选择文件']);
}
return $return;
}
// 上传到服务器 待优化
function uploadImgToServer(Request $request){
$file = $request->file("mypic");
if (!empty($file)) {
$len = count($file);
foreach ($file as $key => $value) {
$len = $key;
}
if ($len > static::MAX_UPLOAD_NUM) {
return response()->json(['ResultData' => 6, 'info' => '最多可以上传25张图片']);
}
$m = 0;
$k = 0;
for ($i = 0; $i <= $len; $i++) {
// $n 表示第几张图片
$n = $i + 1;
if ($file[$i]->isValid()) {
if (in_array(strtolower($file[$i]->extension()), ['jpeg', 'jpg', 'gif', 'gpeg', 'png'])) {
$picname = $file[$i]->getClientOriginalName();//获取上传原文件名
$ext = $file[$i]->getClientOriginalExtension();//获取上传文件的后缀名
// 重命名
$filename = time() . str_random(6) . "." . $ext;
Storage::putFile($filename,$file);
if ($file[$i]->move("uploads/images", $filename)) {
$newFileName = '/' . "uploads/images" . '/' . $filename;
$m = $m + 1;
// return response()->json(['ResultData' => 0, 'info' => '上传成功', 'newFileName' => $newFileName ]);
} else {
$k = $k + 1;
// return response()->json(['ResultData' => 4, 'info' => '上传失败']);
}
$msg = $m . "张图片上传成功 " . $k . "张图片上传失败<br>";
$return[] = ['ResultData' => 0, 'info' => $msg, 'newFileName' => $newFileName];
} else {
return response()->json(['ResultData' => 3, 'info' => '第' . $n . '张图片后缀名不合法!<br/>' . '只支持jpeg/jpg/png/gif格式']);
}
} else {
return response()->json(['ResultData' => 1, 'info' => '第' . $n . '张图片超过最大限制!<br/>' . '图片最大支持2M']);
}
}
} else {
return response()->json(['ResultData' => 5, 'info' => '请选择文件']);
}
return $return;
}
}

@ -0,0 +1,132 @@
<?php
namespace App\Admin\Controllers;
use Encore\Admin\Form;
use Encore\Admin\Grid;
use Encore\Admin\Facades\Admin;
use Encore\Admin\Layout\Content;
use App\Http\Controllers\Controller;
use Encore\Admin\Controllers\ModelForm;
use Encore\Admin\Widgets\Table;
use App\User; // 引入模型
use Encore\Admin\Widgets\Tab;
class UsersController extends Controller
{
use ModelForm;
/**
* Index interface.
*
* @return Content
*/
public function index()
{
return Admin::content(function (Content $content) {
$content->header('用户管理');
$content->description('用户列表');
$content->body($this->grid());
});
}
/**
* Edit interface.
*
* @param $id
* @return Content
*/
public function edit($id)
{
return Admin::content(function (Content $content) use ($id) {
$content->header('用户的编辑');
$content->description('用户的编辑');
$content->body($this->form()->edit($id));
});
}
/**
* Create interface.
*
* @return Content
*/
public function create()
{
return Admin::content(function (Content $content) {
$content->header('用户添加');
$content->description('用户添加');
$content->body($this->form());
});
}
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
return Admin::grid(User::class, function (Grid $grid) {
$grid->id('ID')->sortable();
$grid->avatar('用户头像')->image('',50, 50);
$grid->column('name','用户名')->editable();
$grid->column('mobile','用户手机号')->label('primary');
$grid->column('nickname','用户微信昵称');
// 设置text、color、和存储值
$states = [
'on' => ['value' => 2, 'text' => '配送员', 'color' => 'primary'],
'off' => ['value' => 1, 'text' => '普通会员', 'color' => 'default'],
];
$grid->role('用户状态')->switch($states);
$grid->column('login_ip','最近登陆ip');
$grid->column('login_time','最近登陆时间');
// 搜索功能
$grid->filter(function($filter){
// 如果过滤器太多,可以使用弹出模态框来显示过滤器.
// $filter->useModal();
// 禁用id查询框
$filter->disableIdFilter();
// sql: ... WHERE `user.name` LIKE "%$name%";
$filter->like('name', '用户名');
// sql: ... WHERE `user.email` = $email;
$filter->is('mobile', '用户手机号');
});
$grid->disableExport();// 禁用导出
$grid->disableCreation();// 禁用新增
$grid->disableBatchDeletion();// 禁用批量删除
});
}
/**
* Make a form builder.
*
* @return Form
*/
protected function form()
{
return Admin::form(User::class, function (Form $form) {
$form->text('name', '用户名');
$form->mobile('mobile','用户手机号');
$states = [
'on' => ['value' => 2, 'text' => '配送员', 'color' => 'success'],
'off' => ['value' => 1, 'text' => '普通会员', 'color' => 'default'],
];
//$form->password('password', '用户密码')->help('修改用户密码');
$form->switch('role', '用户状态')->states($states);
});
}
}

@ -0,0 +1,47 @@
<?php
namespace App\Admin\Extensions\Column;
use Encore\Admin\Admin;
use Encore\Admin\Grid\Displayers\AbstractDisplayer;
class ExpandRow extends AbstractDisplayer
{
public function display(\Closure $callback = null, $btn = '')
{
$callback = $callback->bindTo($this->row);
$html = call_user_func($callback);
$script = <<<EOT
$('.grid-expand').on('click', function () {
if ($(this).data('inserted') == '0') {
var key = $(this).data('key');
var row = $(this).closest('tr');
var html = $('template.grid-expand-'+key).html();
row.after("<tr><td colspan='"+row.find('td').length+"' style='padding:0 !important; border:0px;'>"+html+"</td></tr>");
$(this).data('inserted', 1);
}
$("i", this).toggleClass("fa-caret-right fa-caret-down");
});
EOT;
Admin::script($script);
$btn = $btn ?: $this->column->getName();
$key = $this->getKey();
return <<<EOT
<a class="btn btn-xs btn-default grid-expand" data-inserted="0" data-key="{$key}" data-toggle="collapse" data-target="#grid-collapse-{$key}">
<i class="fa fa-caret-right"></i> $btn
</a>
<template class="grid-expand-{$key}">
<div id="grid-collapse-{$key}" class="collapse">$html</div>
</template>
EOT;
}
}

@ -0,0 +1,73 @@
<?php
namespace App\Admin\Extensions\Column;
use Encore\Admin\Admin;
use Encore\Admin\Grid\Displayers\AbstractDisplayer;
class OpenMap extends AbstractDisplayer
{
public function display(\Closure $callback = null, $btn = '')
{
$callback = $callback->bindTo($this->row);
list($latitude, $longitude) = call_user_func($callback);
$key = $this->getKey();
$name = $this->column->getName();
Admin::script($this->script());
return <<<EOT
<button class="btn btn-xs btn-default grid-open-map" data-key="{$key}" data-lat="$latitude" data-lng="$longitude" data-toggle="modal" data-target="#grid-modal-{$name}-{$key}">
<i class="fa fa-map-marker"></i> $btn
</button>
<div class="modal" id="grid-modal-{$name}-{$key}" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span></button>
<h4 class="modal-title">$btn</h4>
</div>
<div class="modal-body">
<div id="grid-map-$key" style="height:450px;"></div>
</div>
</div>
<!-- /.modal-content -->
</div>
<!-- /.modal-dialog -->
</div>
EOT;
}
protected function script()
{
return <<<EOT
$('.grid-open-map').on('click', function() {
var key = $(this).data('key');
var lat = $(this).data('lat');
var lng = $(this).data('lng');
var center = new qq.maps.LatLng(lat, lng);
var container = document.getElementById("grid-map-"+key);
var map = new qq.maps.Map(container, {
center: center,
zoom: 13
});
var marker = new qq.maps.Marker({
position: center,
draggable: true,
map: map
});
});
EOT;
}
}

@ -0,0 +1,37 @@
<?php
namespace App\Admin\Extensions\Form;
use Encore\Admin\Form\Field;
class AddSpecification extends Field
{
protected $view = 'admin.add-specification';
protected static $css = [
'/vendor/wangEditor-3.1.1/release/wangEditor.css',
];
protected static $js = [
'/vendor/wangEditor-3.1.1/release/wangEditor.js',
];
public function render()
{
$name = $this->formatName($this->column);
$this->script = <<<EOT
var E = window.wangEditor
var editor = new E('#{$this->id}');
editor.customConfig.zIndex = 0
editor.customConfig.uploadImgShowBase64 = true
editor.customConfig.onchange = function (html) {
$('input[name=$name]').val(html);
}
editor.create()
EOT;
return parent::render();
}
}

@ -0,0 +1,22 @@
<?php
namespace App\Admin\Extensions\Form;
use Encore\Admin\Form\Field;
class CKEditor extends Field
{
public static $js = [
'/packages/ckeditor/ckeditor.js',
'/packages/ckeditor/adapters/jquery.js',
];
protected $view = 'admin.ckeditor';
public function render()
{
$this->script = "$('textarea.{$this->getElementClass()}').ckeditor();";
return parent::render();
}
}

@ -0,0 +1,36 @@
<?php
namespace App\Admin\Extensions\Form;
use Encore\Admin\Form\Field;
class MarkdownEditor extends Field
{
protected $view = 'admin::form.editor';
protected static $css = [
'/packages/bootstrap-markdown-editor/dist/css/bootstrap-markdown-editor.css',
];
protected static $js = [
'//cdnjs.cloudflare.com/ajax/libs/ace/1.1.3/ace.js',
'//cdnjs.cloudflare.com/ajax/libs/marked/0.3.2/marked.min.js',
'/packages/bootstrap-markdown-editor/dist/js/bootstrap-markdown-editor.js',
];
public function render()
{
$this->script = <<<EOT
$('#$this->id').markdownEditor({
preview: true,
onPreview: function (content, callback) {
callback( marked(content) );
}
});
EOT;
return parent::render();
}
}

@ -0,0 +1,159 @@
<?php
namespace App\Admin\Extensions\Form;
use Encore\Admin\Form\Field;
class MyMap extends Field
{
/**
* Column name.
*
* @var array
*/
protected $column = [];
protected $view = 'admin.form.mymap';
protected $addressInput;
/**
* Get assets required by this field.
*
* @return array
*/
public static function getAssets()
{
if (config('app.locale') == 'zh-CN') {
$js = '//map.qq.com/api/js?v=2.exp';
} else {
$js = '//maps.googleapis.com/maps/api/js?v=3.exp&sensor=false&key='.env('GOOGLE_API_KEY');
}
return compact('js');
}
public function __construct($column, $arguments)
{
$this->column['lat'] = $column;
$this->column['lng'] = $arguments[0];
$this->addressInput = $arguments[2] ?? 'myAddress';
array_shift($arguments);
$this->label = $this->formatLabel($arguments);
$this->id = $this->formatId($this->column);
/*
* Google map is blocked in mainland China
* people in China can use Tencent map instead(;
*/
if (config('app.locale') == 'zh-CN') {
$this->useTencentMap();
} else {
$this->useGoogleMap();
}
}
public function useGoogleMap()
{
$this->script = <<<EOT
function initGoogleMap(name) {
var lat = $('#{$this->id['lat']}');
var lng = $('#{$this->id['lng']}');
var LatLng = new google.maps.LatLng(lat.val(), lng.val());
var options = {
zoom: 13,
center: LatLng,
panControl: false,
zoomControl: true,
scaleControl: true,
mapTypeId: google.maps.MapTypeId.ROADMAP
}
var container = document.getElementById("map_"+name);
var map = new google.maps.Map(container, options);
var marker = new google.maps.Marker({
position: LatLng,
map: map,
title: 'Drag Me!',
draggable: true
});
google.maps.event.addListener(marker, 'dragend', function (event) {
lat.val(event.latLng.lat());
lng.val(event.latLng.lng());
});
}
initGoogleMap('{$this->id['lat']}{$this->id['lng']}');
EOT;
}
public function useTencentMap()
{
$this->script = <<<EOT
function initTencentMap(name) {
var lat = $('#{$this->id['lat']}');
var lng = $('#{$this->id['lng']}');
var inputAddress = $('#{$this->addressInput}');
var center = new qq.maps.LatLng(lat.val(), lng.val());
var container = document.getElementById("map_"+name);
var map = new qq.maps.Map(container, {
center: center,
zoom: 13
});
var marker = new qq.maps.Marker({
position: center,
draggable: true,
map: map
});
if( ! lat.val() || ! lng.val()) {
var citylocation = new qq.maps.CityService({
complete : function(result){
map.setCenter(result.detail.latLng);
marker.setPosition(result.detail.latLng);
}
});
citylocation.searchLocalCity();
}
qq.maps.event.addListener(map, 'click', function(event) {
marker.setPosition(event.latLng);
});
qq.maps.event.addListener(marker, 'position_changed', function(event) {
var position = marker.getPosition();
lat.val(position.getLat());
lng.val(position.getLng());
});
var callbacks={
complete:function(results){
map.setCenter(results.detail.location);
marker.setPosition(results.detail.location);
},
}
var geocoder = new qq.maps.Geocoder(callbacks);
inputAddress.change(function () {
geocoder.getLocation($(this).val());
});
}
initTencentMap('{$this->id['lat']}{$this->id['lng']}');
EOT;
}
}

@ -0,0 +1,44 @@
<?php
namespace App\Admin\Extensions\Form;
use Encore\Admin\Form\Field;
class PHPEditor extends Field
{
protected $view = 'admin::form.editor';
protected static $js = [
'/packages/codemirror-5.20.2/lib/codemirror.js',
'/packages/codemirror-5.20.2/addon/edit/matchbrackets.js',
'/packages/codemirror-5.20.2/mode/htmlmixed/htmlmixed.js',
'/packages/codemirror-5.20.2/mode/xml/xml.js',
'/packages/codemirror-5.20.2/mode/javascript/javascript.js',
'/packages/codemirror-5.20.2/mode/css/css.js',
'/packages/codemirror-5.20.2/mode/clike/clike.js',
'/packages/codemirror-5.20.2/mode/php/php.js',
];
protected static $css = [
'/packages/codemirror-5.20.2/lib/codemirror.css',
];
public function render()
{
$this->script = <<<EOT
CodeMirror.fromTextArea(document.getElementById("{$this->id}"), {
lineNumbers: true,
mode: "text/x-php",
extraKeys: {
"Tab": function(cm){
cm.replaceSelection(" " , "end");
}
}
});
EOT;
return parent::render();
}
}

@ -0,0 +1,75 @@
<?php
namespace App\Admin\Extensions\Form;
use Encore\Admin\Form\Field;
class WangEditor extends Field
{
protected $view = 'admin.wang-editor';
protected static $css = [
'/vendor/wangEditor-3.1.1/release/wangEditor.css',
];
protected static $js = [
'/vendor/wangEditor-3.1.1/release/wangEditor.js',
];
public function render()
{
$name = $this->formatName($this->column);
$uploadUrl = route('admin-up');
$this->script = <<<EOT
var E = window.wangEditor
var editor = new E('#{$this->id}');
editor.customConfig.uploadFileName = 'mypic[]';
editor.customConfig.uploadImgHeaders = {
'X-CSRF-TOKEN': $('input[name="_token"]').val()
}
editor.customConfig.zIndex = 0;
// 上传路径
editor.customConfig.uploadImgServer = '{$uploadUrl}';
editor.customConfig.onchange = function (html) {
$('input[name=$name]').val(html);
}
editor.customConfig.uploadImgHooks = {
customInsert: function (insertImg, result, editor) {
if (typeof(result.length) != "undefined") {
for (var i = 0; i <= result.length - 1; i++) {
var j = i;
var url = result[i].newFileName;
insertImg(url);
}
toastr.success(result[j]['info']);
}
switch (result['ResultData']) {
case 6:
toastr.error("最多可以上传4张图片");
break;
case 5:
toastr.error("请选择一个文件");
break;
case 4:
toastr.error("上传失败");
break;
case 3:
toastr.error(result['info']);
break;
case 2:
toastr.error("文件类型不合法");
break;
case 1:
toastr.error(result['info']);
break;
}
}
}
editor.create()
EOT;
return parent::render();
}
}

@ -0,0 +1,30 @@
<?php
namespace App\Admin\Extensions;
use Encore\Admin\Form\Field;
class WangEditor extends Field
{
protected $view = 'admin::form.editor';
protected static $css = [
'/packages/wangEditor-2.1.23/dist/css/wangEditor.min.css',
];
protected static $js = [
'/packages/wangEditor-2.1.23/dist/js/wangEditor.min.js',
];
public function render()
{
$this->script = <<<EOT
var editor = new wangEditor('{$this->id}');
editor.create();
EOT;
return parent::render();
}
}

@ -0,0 +1,29 @@
<?php
/**
* Laravel-admin - admin builder based on Laravel.
* @author z-song <https://github.com/z-song>
*
* Bootstraper for Admin.
*
* Here you can remove builtin form field:
* Encore\Admin\Form::forget(['map', 'editor']);
*
* Or extend custom form field:
* Encore\Admin\Form::extend('php', PHPEditor::class);
*
* Or require js and css assets:
* Admin::css('/packages/prettydocs/css/styles.css');
* Admin::js('/packages/prettydocs/js/main.js');
*
*/
// sqc添加
use App\Admin\Extensions\Column\ExpandRow;
use Encore\Admin\Grid\Column;
use Encore\Admin\Form;
use App\Admin\Extensions\Form\WangEditor;
use App\Admin\Extensions\Form\AddSpecification;
Column::extend('expand', ExpandRow::class);
Form::forget(['map', 'editor']);
Form::extend('editor', WangEditor::class);
Form::extend('addSpecification', AddSpecification::class);

@ -0,0 +1,73 @@
<?php
use Illuminate\Routing\Router;
Admin::registerAuthRoutes();
Route::group([
'prefix' => config('admin.route.prefix'),
'namespace' => config('admin.route.namespace'),
'middleware' => config('admin.route.middleware'),
], function (Router $router) {
$router->get('/', 'HomeController@index');
//轮播图管理
$router->resource('carousel', CarouselController::class);
//专题管理
$router->resource('special', SpecialController::class);
//商品管理
$router->resource('goods', GoodController::class);
//商品分类管理
$router->resource('classes', ClassController::class);
// 前台用户管理
$router->resource('User', UsersController::class);
//新闻管理
$router->resource('News', NewsController::class);
//前端用户管理
// $router->resource('front-users', FrontEndUserController::class);
// 项目类型管理
$router->resource('project-type', ProjectTypeController::class);
// 项目功能分类管理
$router->resource('project-func-type', ProjectFuncTypeController::class);
// 功能模块管理
$router->resource('project-model', ProjectModelController::class);
// 功能点管理
$router->resource('project-dot', ProjectFuncDotController::class);
// 品牌管理
$router->resource('shop-brand', BrandController::class);
Route::post('uploadFile', 'UploadController@uploadImg')->name('admin-up');
/********* shop相关********/
Route::group(['namespace' => 'Shop'], function (Router $router) {
// 商品分类管理
$router->resource('shop-category', ShopCategoryController::class);
// 规格管理
$router->resource('shop-specification', ShopSpecificationController::class);
// 属性分类管理
$router->resource('shop-attribute-category', ShopAttributeCategoryController::class);
// 属性管理
$router->resource('shop-attribute', ShopAttributeController::class);
// 商品管理
$router->resource('shop-goods', ShopGoodsController::class);
// 主题&专题管理
$router->resource('shop-topics', ShopTopicController::class);
// 商城订单管理
$router->resource('shop-order', ShopOrderController::class);
// 用户反馈
$router->resource('shop-feedback', FeedbackController::class);
});
});

@ -0,0 +1,197 @@
<?php
/**************************
* 本文件是公共功能函数库
* author sqc
* @php 小T科技
*
**************************/
/**
* 获取客户端ip地址
* @return string ip地址
*/
function getClientIP()
{
if (getenv("HTTP_CLIENT_IP"))
$ip = getenv("HTTP_CLIENT_IP");
else if (getenv("HTTP_X_FORWARDED_FOR"))
$ip = getenv("HTTP_X_FORWARDED_FOR");
else if (getenv("REMOTE_ADDR"))
$ip = getenv("REMOTE_ADDR");
else $ip = "Unknow";
return $ip;
}
/**
* 价格格式化
*
* @param int $price
* @return string $price_format
*/
function PriceFormat($price)
{
$price_format = number_format($price, 2, '.', '');
return $price_format;
}
/**
* PHP精确计算 主要用于货币的计算用法
* @param $n1 第一个数
* @param $symbol 计算符号 + - * / %
* @param $n2 第二个数
* @param string $scale 精度 默认为小数点后两位
* @return string
*/
function PriceCalculate($n1, $symbol, $n2, $scale = '2')
{
$res = "";
if (function_exists("bcadd")) {
switch ($symbol) {
case "+"://加法
$res = bcadd($n1, $n2, $scale);
break;
case "-"://减法
$res = bcsub($n1, $n2, $scale);
break;
case "*"://乘法
$res = bcmul($n1, $n2, $scale);
break;
case "/"://除法
$res = bcdiv($n1, $n2, $scale);
break;
case "%"://求余、取模
$res = bcmod($n1, $n2, $scale);
break;
default:
$res = "";
break;
}
} else {
switch ($symbol) {
case "+"://加法
$res = $n1 + $n2;
break;
case "-"://减法
$res = $n1 - $n2;
break;
case "*"://乘法
$res = $n1 * $n2;
break;
case "/"://除法
$res = $n1 / $n2;
break;
case "%"://求余、取模
$res = $n1 % $n2;
break;
default:
$res = "";
break;
}
}
return $res;
}
/**
* 价格由元转分
* @param $price 金额
* @return int
*/
function ncPriceYuan2fen($price)
{
$price = (int)PriceCalculate(100, "*", PriceFormat($price));
return $price;
}
/**
* 日志记录函数 该方法是用户插入mysql库中的 (与文件型日志不冲突 该方法在于admin后台可以实时看到异常 然后及时处理)
* @param [type] $type 错误日志记录类型 如order 订单类型的错误
* @param [type] $info 错误日志记录说明
* @param integer $error_level 错误等级 1:notice 2:warn 3:error
* @param string $msg 错误内容
* @param string $node 错误节点 一般可以写当前路由$request->path();
* @param string $remark 其他备注
*/
function add_my_log($type, $info, $error_level = 1, $msg = '', $node = 'node',$goal_id = 0, $remark = '')
{
$new_log = new App\Models\ErrorsLog;
$new_log->type = $type;
$new_log->error_level = $error_level;
$new_log->info = $info;
$new_log->msg = $msg;
$new_log->node = $node;
$new_log->ip = getClientIP();
$new_log->result = 1;
$new_log->remark = $remark;
$new_log->goal_id = $goal_id;
$new_log->save();
}
/**
* 微信消息的通知
* @param [type] $order_info [订单信息]
* @param [type] $status [操作代码]
*/
function addWxMsg_toUser($orders_info, $status = '26')
{
if (empty($orders_info)) return false;
$app = EasyWeChat\Factory::officialAccount(config('wechat.official_account.default'));
$User = new App\User;
$user_info = $User->find($orders_info['uid']);
$url = env('APP_URL') . '/my-order?status=3';
if (!$user_info->openid) {
return false;
}
$data = array(
"keyword1" => array($orders_info['order_sn'], "#888888"),// 订单号
"keyword2" => array($orders_info['pay_price'], "#336699"),// 订单金额
"keyword3" =>array($orders_info['plate_number'], "#888888"),// 车辆信息
"keyword4" => array(date('Y-m-d',strtotime($orders_info['apply_time'])), "#888888"),
"remark" => array($orders_info['check_info']." 请您尽快核查~", "#5599FF"),
);
// 检测通过
if($status == App\Models\CheckStation\ApplyOrder::STATUS_PASS){
$data["first"] = array("您的车辆已检测通过", '#43CD80');
}else if($status == App\Models\CheckStation\ApplyOrder::STATUS_NO_PASS){
$data["first"] = array("您的车辆未检测通过", '#EE2C2C');
}
$app->template_message->send([
'touser' => $user_info->openid,
'template_id' => 'FQ7dAfjzepCgFtPhfLjOmONX0SkjVSuL_2zYNtLNuu8',
'url' => $url,
'data' =>$data
]);
}
//if (empty($orders_info)) return false;
//$app = EasyWeChat\Factory::officialAccount(config('wechat.official_account.default'));
//$User = new App\User;
//$user_info = $User->find($orders_info['uid']);
//$url = env('APP_URL') . '/my-order?status=3';
//if (!$user_info->openid) {
// return false;
//}
//$data = array(
// "keyword1" => array($orders_info['true_name'], "#336699"),// 客户
// "keyword2" => array($orders_info['pay_price'], "#336699"),// 订单金额
// "keyword3" => array($orders_info['order_sn'], "#888888"),// 订单号
// "keyword4" => array(date('Y-m-d H:i:s'), "#888888"),
// "remark" => array($orders_info['check_info']." 请您尽快核查~", "#5599FF"),
//);
//// 检测通过
//if($status == App\Models\CheckStation\ApplyOrder::STATUS_PASS){
// $data["first"] = array("您的车辆已检测通过", '#43CD80');
//}else if($status == App\Models\CheckStation\ApplyOrder::STATUS_NO_PASS){
// $data["first"] = array("您的车辆未检测通过", '#EE2C2C');
//}
//$app->template_message->send([
// 'touser' => $user_info->openid,
// 'template_id' => '30kgXpgxkuH-FK7f4iN3ya-l9vO4IS7wPbI5TghWr7M',
// 'url' => $url,
// 'data' =>$data
//]);
?>

@ -0,0 +1,64 @@
<?php
namespace App\Console\Commands;
use App\Models\Order;
use Carbon\Carbon;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
class AutoCompleteOrder extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'order:autocomplete';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Command description';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
//
Carbon::setToStringFormat('Y-m-d');
$inSchoolTime = Carbon::now()->subDays(5);
$outSchoolTime = Carbon::now()->subDays(10);
DB::table('order')
->where([
['status', '=', Order::STATUS_DELIVERING],
['sid', '<>', 0 ],
])
->whereDate('updated_at', '<=', $inSchoolTime)
->update(['status' => Order::STATUS_COMPLETED]);
DB::table('order')
->where([
['status', '=', Order::STATUS_DELIVERING],
['sid', '=', 0 ],
])
->whereDate('updated_at', '<=', $outSchoolTime)
->update(['status' => Order::STATUS_COMPLETED]);
}
}

@ -0,0 +1,45 @@
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
class XiaoTInstall extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'XiaoT:install';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Install XiaoT Shop';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$this->call('admin:install');
$this->call('migrate');
$this->call('db:seed');
$this->call('passport:install');
}
}

@ -0,0 +1,42 @@
<?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();
}
/**
* Register the commands for the application.
*
* @return void
*/
protected function commands()
{
$this->load(__DIR__.'/Commands');
require base_path('routes/console.php');
}
}

@ -0,0 +1,53 @@
<?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.
*
* This is a great spot to send exceptions to Sentry, Bugsnag, etc.
*
* @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);
}
}

@ -0,0 +1,135 @@
<?php
namespace App\Helpers\Api;
use Symfony\Component\HttpFoundation\Response as FoundationResponse;
use Response;
//
trait ApiResponse
{
/**
* @var int
*/
protected $statusCode = FoundationResponse::HTTP_OK;
/**
* @return mixed
*/
public function getStatusCode()
{
return $this->statusCode;
}
/**
* @param $statusCode
* @return $this
*/
public function setStatusCode($statusCode)
{
$this->statusCode = $statusCode;
return $this;
}
/**
* @param $data
* @param array $header
* @return mixed
*/
public function respond($data, $header = [])
{
return Response::json($data, $this->getStatusCode(), $header);
}
/**
* @param $status
* @param array $data
* @param null $code
* @return mixed
*/
public function status($status, array $data, $code = null)
{
if ($code) {
$this->setStatusCode($code);
}
$status = [
'status' => $status,
'code' => $this->statusCode
];
$data = array_merge($status, $data);
return $this->respond($data);
}
/**
* @param $message
* @param int $code
* @param string $status
* @return mixed
*/
public function failed($message, $code = FoundationResponse::HTTP_BAD_REQUEST, $status = 'error')
{
return $this->setStatusCode($code)->message($message, $status);
}
/**
* @param $message
* @param string $status
* @return mixed
*/
public function message($message, $status = "success")
{
return $this->status($status, [
'message' => $message
]);
}
/**
* @param string $message
* @return mixed
*/
public function internalError($message = "Internal Error!")
{
return $this->failed($message, FoundationResponse::HTTP_INTERNAL_SERVER_ERROR);
}
/**
* @param string $message
* @return mixed
*/
public function created($message = "created")
{
return $this->setStatusCode(FoundationResponse::HTTP_CREATED)
->message($message);
}
/**
* @param $data
* @param string $status
* @return mixed
*/
public function success($data, $status = "success")
{
return $this->status($status, compact('data'));
}
/**
* @param string $message
* @return mixed
*/
public function notFond($message = 'Not Fond!')
{
return $this->failed($message, Foundationresponse::HTTP_NOT_FOUND);
}
}

@ -0,0 +1,218 @@
<?php
/**
* Created by PhpStorm.
* Date: 2018/3/7
* Time: 11:28
*/
namespace App\Http\Controllers\Api;
use App\Http\Requests;
use App\Models\Address;
use App\Models\Addrjson;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Auth;
class AddressesController extends ApiController
{
// 新增校外收货地区信息
public function outsideCreate(Request $request)
{
// 表单验证
$validator = Validator::make($request->all(),
[
'provinceId' => 'required|max:10',
'cityId' => 'required|max:10',
'linkMan' => 'required|max:10',
'address' => 'required',
'mobile' => 'required',
],
[
'provinceId.required' => '省市参数缺失',
'cityId.required' => '城市参数缺失',
'linkMan.required' => '收件人参数缺失',
'address.required' => '详细地址参数缺失',
'mobile.required' => '收货人手机号参数缺失',
]
);
if ($validator->fails()) {
return $this->failed($validator->errors(), 401);
}
// 这里后面加上valicate验证
if ($request->input('id')) {
// 编辑
$Addresses = Address::find($request->input('id'));
} else {
$Addresses = new Address;
}
$Addresses->uid = \Auth::user()->id;
$Addresses->aid_p = $request->input('provinceId');
$Addresses->aid_c = $request->input('cityId');
$Addresses->aid_a = $request->input('districtId') ? $request->input('districtId') : 0;
$Addresses->province = Addrjson::find(intval($request->input('provinceId')))->area_name;
$Addresses->city = Addrjson::find(intval($request->input('cityId')))->area_name;
if (intval($request->input('districtId'))) {
$Addresses->area = Addrjson::find(intval($request->input('districtId')))->area_name;
}
$Addresses->postcode = $request->input('code', '');
$Addresses->addr = $request->input('address', '');
$Addresses->true_name = $request->input('linkMan');
$Addresses->mobile = $request->input('mobile');
$Addresses->status = 1;
$Addresses->is_default = $request->input('isDefault') ? 1 : 0;
$Addresses->save();
if ($Addresses->id) {
DB::table('addresses')
->where([
['uid' , \Auth::user()->id],
['id', '!=', $Addresses->id],
])
->update(['is_default' => 0]);
return $this->message('操作成功');
};
return $this->failed('操作失败', 401);
}
//校内地址添加和修改
public function insideCreate(Request $request)
{
// 表单验证
$validator = Validator::make($request->all(),
[
'linkMan' => 'required|max:10',
'mobile' => 'required',
'schoolID' => 'required|max:10',
'schoolName' => 'required|max:30',
'dormName' => 'required|max:30',
'dormID' => 'required|max:10',
'address' => 'required',
],
[
'linkMan.required' => '收件人参数缺失',
'mobile.required' => '收货人手机号参数缺失',
'schoolID.required' => '学校ID参数缺失',
'schoolName.required' => '学校名参数缺失',
'dormName.required' => '宿舍楼参数缺失',
'dormID.required' => '宿舍楼ID参数缺失',
'address.required' => '宿舍号参数缺失',
]
);
if ($validator->fails()) {
return $this->failed($validator->errors(), 401);
}
// 这里后面加上valicate验证
if ($request->input('id')) {
// 编辑
$addresses = Address::find($request->input('id'));
} else {
$addresses = new Address;
}
$userID = Auth::user()->id;
$schoolName = $request->input('schoolName');
$dormName = $request->input('dormName');
$addr = $schoolName.' '.$dormName.' '.$request->input('address', '');
$addresses->uid = $userID;
$addresses->sid = $request->input('schoolID');
$addresses->did = $request->input('dormID');
$addresses->school_name = $schoolName;
$addresses->dorm_name = $dormName;
$addresses->addr = $addr;
$addresses->true_name = $request->input('linkMan');
$addresses->mobile = $request->input('mobile');
$addresses->is_default = $request->input('isDefault') ? Address::ISDEFAULT_YES : Address::ISDEFAULT_NO;
$addresses->status = Address::STATE_VALID;
if ($addresses->save()) {
DB::table('addresses')
->where([
['uid' , $userID],
['id', '!=', $addresses->id],
])
->update(['is_default' => Address::ISDEFAULT_NO]);
return $this->message('操作成功');
}
return $this->failed('操作失败', 402);
}
/**
* 更新默认地址
* @param Request $request
*/
public function updateDefault(Request $request){
if($request->input('id')){
$Addresses = Address::find($request->input('id'));
$Addresses->is_default = $request->input('isDefault') ? 1 : 0;
if($Addresses->save()){
DB::table('addresses')
->where([
['uid' , \Auth::user()->id],
['id', '!=', $Addresses->id],
])
->update(['is_default' => 0]);
return $this->message('操作成功');
}
}
return $this->failed('操作失败', 401);
}
/**
* 删除
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function destroy(Request $request){
if($request->input('id') && Address::destroy($request->input('id'))){
return $this->message('操作成功');
}
return $this->failed('操作失败', 401);
}
/**
* 获取收货地址列表
* @return mixed
*/
public function getList(Request $request)
{
$where = [
'uid' => \Auth::user()->id,
];
$AddressList = Address::getAddrList($where);
if ($AddressList) {
return $this->success($AddressList);
}
return $this->failed('没有数据', 401);
}
public function getDetail(Request $request){
$address = Address::getAddr([
['uid', '=', \Auth::user()->id],
['id',$request->id]
]);
if ($address) {
return $this->success($address);
}
return $this->failed('没有数据', 200);
}
/**
* 获取默认地址
* @return mixed
*/
public function defaultAddr()
{
$defaultAddress = Address::getAddr([
['uid', '=', \Auth::user()->id],
['is_default',1]
]);
if ($defaultAddress) {
return $this->success($defaultAddress);
}
return $this->failed('没有数据', 200);
}
}

@ -0,0 +1,35 @@
<?php
namespace App\Http\Controllers\Api;
use App\Models\Addrjson;
use App\Models\Dorm;
use Illuminate\Http\Request;
class AddrjsonbController extends ApiController
{
public function city(Request $request)
{
$pid = 0;
$where = [];
$city = [];
if (isset($request->q))
{
$pid = $request->q;
}
if ($pid <= 0) return $city;
$where['area_parent_id'] = $pid;
$addr = Addrjson::select('area_id','area_name');
if (!is_null($where)) $addr = $addr->where($where);
$city = $addr->get()->toArray();
return $city;
}
public function dorm(Request $request)
{
$dorms = Dorm::select('id','name')->where('sid',$request->q)->get();
return $dorms->toArray();
}
}

@ -0,0 +1,28 @@
<?php
namespace App\Http\Controllers\Api;
use App\Helpers\Api\ApiResponse;
use App\Http\Controllers\Controller;
class ApiController extends Controller
{
use ApiResponse;
// 其他通用的Api帮助函数
/**
* 获取客户端ip地址
* @return string ip地址
*/
public function getClientIP(){
if (getenv("HTTP_CLIENT_IP"))
$ip = getenv("HTTP_CLIENT_IP");
else if(getenv("HTTP_X_FORWARDED_FOR"))
$ip = getenv("HTTP_X_FORWARDED_FOR");
else if(getenv("REMOTE_ADDR"))
$ip = getenv("REMOTE_ADDR");
else $ip = "Unknow";
return $ip;
}
}

@ -0,0 +1,105 @@
<?php
namespace App\Http\Controllers\Api;
use Carbon\Carbon;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Support\Facades\Auth;
use Laravel\Passport\Client;
use Socialite;
use GuzzleHttp\Client as HttpClient;
use App\User;
use Illuminate\Http\Request;
use Validator;
use EasyWeChat\Factory;
class AuthenticateController extends ApiController
{
use AuthenticatesUsers;
public function __construct()
{
$this->middleware('auth:api')->only([
'logout'
]);
}
public function username()
{
return 'openid';
}
public function easyWechatGetSession($code)
{
$config = config('wechat.mini_program.default');
$app = Factory::miniProgram($config);
return $app->auth->session($code);
}
/**
* 处理小程序的自动登陆和注册
* @param $oauth
*/
public function auto_login(Request $request)
{
// 获取openid
if ($request->code) {
$wx_info = $this->easyWechatGetSession($request->code);
}
if (!$request->openid && empty($wx_info['openid'])) {
return $this->failed('用户openid没有获取到', 401);
}
$openid = empty($wx_info['openid'])?$request->openid:$wx_info['openid'];
$userInfo = User::where('openid', $openid)->first();
if ($userInfo && $userInfo->toArray()) {
//执行登录
$userInfo->login_ip = $this->getClientIP();
$userInfo->login_time = Carbon::now();
$userInfo->save();
// 直接创建token
$token = $userInfo->createToken($openid)->accessToken;
return $this->success(compact('token','userInfo'));
} else {
//执行注册
return $this->register($request,$openid);
}
}
/*
* 用户注册
* @param Request $request
*/
public function register($request,$openid)
{
// 进行基本验证
$user_info = \GuzzleHttp\json_decode($request->input('rawData'),true);
//注册信息 字段名=》get到的值
$newUser = [
'openid' => $openid, //openid
'nickname' => $user_info['nickName'],// 昵称
'email' => time().'sqc157400661@163.com',// 邮箱
'name' => $user_info['nickName'],// 昵称
'avatar' =>$user_info['avatarUrl'], //头像
'unionid' => '', // unionid (可空)
'state' => 1,
'role' => 0,
'password' => bcrypt('sqcweida'),
'login_ip' => $this->getClientIP(),
'login_time' => Carbon::now()
];
//dd($newUser);
$userInfo = User::create($newUser);
// 直接创建token
$token = $userInfo->createToken($openid)->accessToken;
return $this->success(compact('token','userInfo'));
}
protected function sendFailedLoginResponse(Request $request)
{
$msg = $request['errors'];
$code = $request['code'];
return $this->setStatusCode($code)->failed($msg);
}
}

@ -0,0 +1,51 @@
<?php
namespace App\Http\Controllers\Api;
use Validator;
use App\Logic\GoodsLogic;
use App\Models\Good;
use Illuminate\Http\Request;
class GoodsController extends ApiController
{
/**
* 获取商品列表信息
*/
public function index(Request $request)
{
$where[] = ['goods_state','=',1];
if ($request->input('categoryId')) {
$where[] = ['class_id', '=', $request->input('categoryId')];
}
if ($request->input('nameLike')) {
$where[] = ['goods_name', 'like', "%{$request->input('nameLike')}%"];
}
return GoodsLogic::getGoodsList($where);
}
public function detail(Request $request)
{
$validator = Validator::make($request->all(),
[
'id' => 'required'
],
[
'id.required' => 'id is required'
]
);
if ($validator->fails()) {
return $this->failed($validator->errors(), 401);
}
$result = Good::getGoodInfoByID($request->id);
if ($result) {
return $result;
} else {
return $this->failed('This Good is not exists', 401);
}
}
}

@ -0,0 +1,42 @@
<?php
namespace App\Http\Controllers\Api;
use App\Models\Carousel;
use App\Models\Special;
use App\Logic\ShopGoodsLogic;
use App\Models\ShopTopic;
use App\Http\Resources\ShopTopic as ShopTopicResource;
class IndexController extends ApiController
{
/**
* xiaoT技术首页信息
* @return mixed
*/
public function index()
{
// 先获取当前登录的用户信息
if (empty(\Auth::user())) {
return $this->failed('用户未登录', 401);
}else{
$user_id = \Auth::user()->id;
}
$outData = [];
// 专题导航信息
$outData['specialList'] = Special::getSpecialList();
// 首页轮播
$outData['carouselInfo'] = Carousel::getCarouselByType(Carousel::BOOTH_TYPE_HOME);
// 热门
$outData['hotGoodsList'] = ShopGoodsLogic::getGoodsList(['is_hot' => 1], 6);
// 新品
$outData['newGoodsList'] = ShopGoodsLogic::getGoodsList(['is_new' => 1], 4);
// 新品
$outData['topicList'] = ShopTopicResource::collection(ShopTopic::getTopicListByPage())->additional(['code' => 200]);
return $this->success($outData);
}
}

@ -0,0 +1,90 @@
<?php
namespace App\Http\Controllers\Api;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use App\Models\ShopCart;
use App\Logic\AddressLogic;
use App\Logic\OrderLogic;
class MyOrderController extends ApiController
{
// 订单列表
public function orderList(Request $request)
{
// 先获取当前登录的用户信息
if (empty(\Auth::user())) {
return $this->failed('用户未登录', 401);
}
$user_id = \Auth::user()->id;
$orderLogic = new OrderLogic();
$where['uid'] = $user_id;
$orderList = $orderLogic->getOrderList($where);
return $this->success($orderList);
}
// 订单详情
public function orderDetail(Request $request)
{
// 先获取当前登录的用户信息
if (empty(\Auth::user())) {
return $this->failed('用户未登录', 401);
}
// 参数校验
$validator = Validator::make($request->all(),
[
'orderId' => 'required',
],
[
'orderId.required' => '订单id参数缺失',
]
);
if ($validator->fails()) {
return $this->failed($validator->errors(), 403);
}
$user_id = \Auth::user()->id;
$orderLogic = new OrderLogic();
$where['uid'] = $user_id;
$where['id'] = $request->orderId;
$orderInfo = $orderLogic->getOrderDetail($where);
return $this->success($orderInfo);
}
// 取消订单
public function orderCancel(Request $request)
{
// 先获取当前登录的用户信息
if (empty(\Auth::user())) {
return $this->failed('用户未登录', 401);
}
$user_id = \Auth::user()->id;
// 参数校验
$validator = Validator::make($request->all(),
[
'orderId' => 'required',
],
[
'orderId.required' => '订单id参数缺失',
]
);
if ($validator->fails()) {
return $this->failed($validator->errors(), 403);
}
}
// 物流详情
public function orderExpress(Request $request)
{
// 先获取当前登录的用户信息
if (empty(\Auth::user())) {
return $this->failed('用户未登录', 401);
}
$user_id = \Auth::user()->id;
}
}

@ -0,0 +1,30 @@
<?php
/**
* Created by PhpStorm.
* User: jll
* Date: 2018/3/7
* Time: 18:28
*/
namespace App\Http\Controllers\Api;
use App\Models\News;
class NewsApiController extends ApiController
{
//新闻列表
public function getList()
{
$allnews = News::orderBy('created_at','desc')->paginate(6);
return $this->success($allnews);
}
/**
* 新闻详情信息
*/
public function show($detail)
{
$news = News::find($detail);
return $this->success($news);
}
}

@ -0,0 +1,118 @@
<?php
namespace App\Http\Controllers\Api;
use Illuminate\Http\Request;
// 引入自己需要操作的数据模型
use App\Http\Requests;
use App\Logic\Buy;
use App\Models\ShopOrder;
use Carbon\Carbon;
use EasyWeChat\Factory;
use Validator;
class PaymentController extends ApiController
{
public function toPay(Request $request){
// 验证规则
$validator = Validator::make($request->all(),
[
'orderId' => 'required'
],
[
'orderId.required' => '订单号缺失'
]
);
if ($validator->fails()) {
return $this->failed($validator->errors(), 401);
}
// 先获取当前登录的用户信息
$user_id = \Auth::user()->id;
if (empty($user_id)) {
return $this->failed('用户未登录', 401);
}
// 查询订单
$order_info = ShopOrder::find($request->orderId)->toArray();
if(empty($order_info)){
return $this->failed('订单不存在', 401);
}
// 开始生成预支付订单
$buy = new Buy();
$buy_info = $buy->pay_step1($order_info,\Auth::user()->openid);
if($buy_info){
return $this->success($buy_info);
}
return $this->failed('支付失败', 401);
}
/**
* 支付提醒
*/
public function notify()
{
$this->pay_log(var_export(file_get_contents('php://input'), true));
$app = Factory::payment(config('wechat.payment.default'));
$response = $app->handlePaidNotify(function($message, $fail){
$this->pay_log('notify ' . var_export($message, true));
// 使用通知里的 "微信支付订单号" 或者 "商户订单号" 去自己的数据库找到订单
$order = Order::where(['order_sn' => $message['out_trade_no']])->first();
if (!$order) { // 如果订单不存在
return true; // 告诉微信,我已经处理完了,订单没找到,别再通知我了
}
// 如果订单存在
// 检查订单是否已经更新过支付状态
if ($order->status >= 22) {
return true; // 已经支付成功了就不再更新了
}
///////////// <- //////////
if ($message['return_code'] === 'SUCCESS') { // return_code 表示通信状态,不代表支付状态
// 用户是否支付成功
if($message['result_code'] === 'SUCCESS'){
// 判断支付金额
$order->pay_date = Carbon::now(); // 更新支付时间为当前时间
$order->trade_no = $message['transaction_id'];// 微信交易号存放到数据库【退款等会用到】
if ($message['total_fee'] == ($order->actual_price * 100)) {
// 不是已经支付状态则修改为已经支付状态
$order->status = '22';
$order->lock_state = 0;
} else {
// 测试的
// $order->status = '22';
// $order->lock_state=0;
//生产的
$order->status = '10';
$order->lock_state = 4;
//add_my_log('order', '支付金额与订单金额不符:' . $order->actual_price . '(元)=>' . $notify->total_fee . '(分)', 3, json_encode($order->toArray()), '微信支付回调');
}
}elseif($message['result_code'] === 'FAIL'){
// 用户支付失败
$order->status = '10';
$order->lock_state = 2;
}
} else { // 用户支付通讯失败
return $fail('通信失败,请稍后再通知我');
}
$order->save(); // 保存订单
return true; // 返回处理完成
});
return $response;
}
/**
* 记录日志
*/
private function pay_log($msg)
{
$msg = date('H:i:s') . "|" . $msg . "\r\n";
$msg .= '| GET:' . var_export($_GET, true) . "\r\n";
file_put_contents('./log/member_pay' . date('Y-m-d') . ".log", $msg, FILE_APPEND);
}
}

@ -0,0 +1,59 @@
<?php
namespace App\Http\Controllers\Api;
use Illuminate\Http\Request;
use App\Logics\ProjectControl;
use App\Models\ProjectType;
use Illuminate\Support\Facades\Validator;
class ProjectElementController extends ApiController
{
// 获取项目类型
public function getProjectType(Request $request)
{
$outData = ProjectControl::getJsonProjectTypes();
return $this->success($outData);
}
// 技术项目模块拼装成商品
public function getProjectGoods(Request $request)
{
// 参数校验
$validator = Validator::make($request->all(),
[
'type_id' => 'required',
],
[
'type_id.required' => '项目类型参数缺失',
]
);
if ($validator->fails()) {
return $this->failed($validator->errors(), 403);
}
$outData['info'] = ProjectType::getProjectInfo(['id' => $request->type_id]);
$outData['sku'] = ProjectControl::getJsonProjectGoodsByTypeId($request->type_id);
return $this->success($outData);
}
// 技术商品转换成商城商品
public function transform(Request $request)
{
// 参数校验
$validator = Validator::make($request->all(),
[
'type_id' => 'required',
'specificationList' => 'required',
],
[
'type_id.required' => '项目类型参数缺失',
'specificationList.required' => '未选择商品',
]
);
if ($validator->fails()) {
return $this->failed($validator->errors(), 403);
}
$outData = ProjectControl::transform($request->type_id,$request->specificationList);
return $this->success($outData);
}
}

@ -0,0 +1,44 @@
<?php
namespace App\Http\Controllers\Api;
use App\Logics\ProjectControl;
use Illuminate\Http\Request;
class ProjectJsonController extends ApiController
{
public function getProjectTypes(Request $request)
{
return ProjectControl::getJsonForProjectTypes();
}
public function getProjectFuncTypesByTypeId(Request $request)
{
$pid = 0;
$where = [];
$data = [];
if (isset($request->q))
{
$pid = $request->q;
}
if ($pid < 0) return $data;
$where = [$pid];
$data = ProjectControl::getProjectFuncTypesByOneLevel($where);
return $data;
}
public function getProjectModelsByFunctypeId(Request $request)
{
$pid = 0;
$where = [];
$data = [];
if (isset($request->q))
{
$pid = $request->q;
}
if ($pid < 0) return $data;
$where = [$pid];
$data = ProjectControl::getProjectModelsByOneLevel($where);
return $data;
}
}

@ -0,0 +1,137 @@
<?php
namespace App\Http\Controllers\Api;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use App\Logic\AddressLogic;
use App\Models\ShopAddress;
use Illuminate\Support\Facades\DB;
class ShopAddressController extends ApiController
{
// 收货地址列表
public function addressList(Request $request)
{
if (empty(\Auth::user()->id)) {
$user_id = 0;
} else {
$user_id = \Auth::user()->id;
}
$list = AddressLogic::getAddrList(['uid' => $user_id]);
return $this->success($list);
}
// 收货地址详情
public function addressDetail(Request $request)
{
// 参数校验
$validator = Validator::make($request->all(),
[
'id' => 'required',
],
[
'id.required' => 'id参数缺失',
]
);
if ($validator->fails()) {
return $this->failed($validator->errors(), 403);
}
$info = AddressLogic::getOneAddr($request->id);
return $this->success($info);
}
// 保存收货地址
public function addressSave(Request $request)
{
if (empty(\Auth::user()->id)) {
$user_id = 0;
} else {
$user_id = \Auth::user()->id;
}
// 参数校验
$validator = Validator::make($request->all(),
[
'id' => 'required',
'name' => 'required',
'mobile' => 'required',
'province_id' => 'required',
'city_id' => 'required',
'district_id' => 'required',
'address' => 'required',
'is_default' => 'required',
],
[
'id.required' => 'id参数缺失',
'name.required' => '收货人参数缺失',
'mobile.required' => '收货人手机号参数缺失',
'province_id.required' => 'province_id参数缺失',
'city_id.required' => 'city_id参数缺失',
'district_id.required' => 'district_id参数缺失',
'address.required' => '详细地址参数缺失',
'is_default.required' => 'is_default参数缺失',
]
);
if ($validator->fails()) {
return $this->failed($validator->errors(), 403);
}
if ($request->id && $request->id > 0) {
$model = ShopAddress::find($request->id);
} else {
$model = new ShopAddress();
}
$model->user_name = $request->name;
$model->mobile = $request->mobile;
$model->uid = $user_id;
$model->country_id = 1;
$model->country = '中国';
$model->province_id = $request->province_id;
$model->province = $request->province;
$model->city_id = $request->city_id;
$model->city = $request->city;
$model->district_id = $request->district_id;
$model->district = $request->district;
$model->address = $request->address;
$model->is_default = intval($request->is_default);
$model->status = ShopAddress::STATUS_ON;
// 开启事务
DB::beginTransaction();
try {
DB::table('shop_address')
->where('is_default', ShopAddress::DEFAULT_ON)
->update(['is_default' => ShopAddress::DEFAULT_OFF]);
$re = $model->save();
DB::commit();
return $this->message('操作成功');
} catch (Exception $e) {
DB::rollBack();
return $this->failed('报错失败', 403);
}
}
// 删除收货地址
public function addressDelete(Request $request)
{
// 参数校验
$validator = Validator::make($request->all(),
[
'id' => 'required',
],
[
'id.required' => 'id参数缺失',
]
);
if ($validator->fails()) {
return $this->failed($validator->errors(), 403);
}
$model = ShopAddress::find($request->id);
$re = $model->delete();
if ($re) {
return $this->message('操作成功');
}
}
}

@ -0,0 +1,36 @@
<?php
namespace App\Http\Controllers\Api;
use Illuminate\Http\Request;
use App\Models\ShopBrand;
use Illuminate\Support\Facades\Validator;
class ShopBrandController extends ApiController
{
// 获取品牌列表
public function getList(Request $request)
{
return [];
}
// 获取品牌详情
public function getDetail(Request $request)
{
// 参数校验
$validator = Validator::make($request->all(),
[
'id' => 'required',
],
[
'id.required' => '参数缺失',
]
);
if ($validator->fails()) {
return $this->failed($validator->errors(), 403);
}
$outData = ShopBrand::getDetail(['id'=>$request->id]);;
return $this->success($outData);
}
}

@ -0,0 +1,167 @@
<?php
namespace App\Http\Controllers\Api;
use Illuminate\Http\Request;
use App\Logic\CartLogic;
use App\Models\ShopGoods;
use App\Models\ShopCart;
use Illuminate\Support\Facades\Validator;
class ShopCartController extends ApiController
{
public function __construct()
{
}
// 获取购物车的数据
public function index(Request $request)
{
$where = [
'uid' =>\Auth::user()->id,
];
$cartData = CartLogic::getCartList($where);
return $this->success($cartData);
}
// 添加商品到购物车
public function add(Request $request)
{
if (empty(\Auth::user()->id)) {
$user_id = 0;
} else {
$user_id = \Auth::user()->id;
}
// 参数校验
$validator = Validator::make($request->all(),
[
'goodsId' => 'required',
'number' => 'required|numeric',
],
[
'goodsId.required' => '商品id参数缺失',
'number.required' => '购买数量参数缺失',
'number.numeric' => '购买数量需要是数字',
]
);
if ($validator->fails()) {
return $this->failed($validator->errors(), 403);
}
$goodsInfo = ShopGoods::getGoodsDetail(['id'=>$request->goodsId]);
$re = CartLogic::addCart($goodsInfo,$request->number);
if($re){
$goodsCount = ShopCart::getGoodsCount(['uid' => $user_id]);
return $this->success(['goodsCount'=>$goodsCount]);
}
return $this->failed('购物车添加失败', 201);
}
// 更新购物车的商品
public function update(Request $request)
{
// 参数校验
$validator = Validator::make($request->all(),
[
'id' => 'required',
'number' => 'required|numeric',
],
[
'id.required' => '商品id参数缺失',
'number.required' => '参数缺失',
'number.numeric' => '非法参数',
]
);
if ($validator->fails()) {
return $this->failed($validator->errors(), 403);
}
$where['id'] = $request->id;
$info = ShopCart::where($where)->first();
$info->number = $request->number;
$re = $info->save();
if($re){
return $this->message('更新成功');
}
return $this->failed('更新失败','201');
}
// 删除购物车的商品
public function delete(Request $request)
{
if (empty(\Auth::user()->id)) {
$user_id = 0;
} else {
$user_id = \Auth::user()->id;
}
// 参数校验
$validator = Validator::make($request->all(),
[
'goodsIds' => 'required',
],
[
'goodsIds.required' => '商品id参数缺失',
]
);
if ($validator->fails()) {
return $this->failed($validator->errors(), 403);
}
$where = [
'uid' =>$user_id,
'goods_id' => explode(',',$request->goodsIds)
];
ShopCart::where($where)->delete();
$cartData = CartLogic::getCartList(['uid' =>$user_id]);
return $this->success($cartData);
}
// 选择或取消选择商品
public function checked(Request $request)
{
if (empty(\Auth::user()->id)) {
$user_id = 0;
} else {
$user_id = \Auth::user()->id;
}
// 参数校验
$validator = Validator::make($request->all(),
[
'goodsIds' => 'required',
'isChecked' => 'required|numeric',
],
[
'goodsIds.required' => '商品id参数缺失',
'isChecked.required' => '参数缺失',
'isChecked.numeric' => '非法参数',
]
);
if ($validator->fails()) {
return $this->failed($validator->errors(), 403);
}
$where = [
'uid'=>$user_id,
];
ShopCart::where($where)->whereIn('goods_id',explode(',',$request->goodsIds))->update(['checked' => $request->isChecked]);
$cartData = CartLogic::getCartList(['uid' =>$user_id]);
return $this->success($cartData);
}
// 获取购物车商品件数
public function goodsCount(Request $request)
{
if (empty(\Auth::user()->id)) {
$user_id = 0;
} else {
$user_id = \Auth::user()->id;
}
$goodsCount = ShopCart::getGoodsCount(['uid' => $user_id]);
return $this->success(['goodsCount'=>$goodsCount]);
}
// 下单前信息确认
public function checkout(Request $request)
{
return $this->success([]);
}
}

@ -0,0 +1,46 @@
<?php
namespace App\Http\Controllers\Api;
use Illuminate\Http\Request;
use App\Models\ShopCategory;
use App\Http\Resources\ShopCategory as ShopCategoryResource;
use Illuminate\Support\Facades\Validator;
class ShopCategoryController extends ApiController
{
// 分类目录全部分类数据接口
public function getCatalogIndex(Request $request)
{
// 获取顶级分类
$parentCategory = ShopCategory::getParentCategory();
$currentCategory = ShopCategory::getChildrenCategoryByParentId($parentCategory[0]['id']);
$outData = [
'categoryList' => ShopCategoryResource::collection($parentCategory),
'currentCategory' =>new ShopCategoryResource($parentCategory[0]),
];
return $this->success($outData);
}
// 分类目录当前分类数据接口
public function getCatalogCurrent(Request $request)
{
// 参数校验
$validator = Validator::make($request->all(),
[
'id' => 'required',
],
[
'id.required' => '参数缺失',
]
);
if ($validator->fails()) {
return $this->failed($validator->errors(), 403);
}
$parentCategory = ShopCategory::getParentCategory(['id'=>$request->id]);
$currentCategory = new ShopCategoryResource($parentCategory[0]);
return $this->success($currentCategory);
}
}

@ -0,0 +1,93 @@
<?php
namespace App\Http\Controllers\Api;
use Illuminate\Http\Request;
use App\Models\ShopCollect;
use Illuminate\Support\Facades\Validator;
use App\Http\Resources\ShopCollect as ShopCollectResource;
class ShopCollectController extends ApiController
{
// 添加或取消收藏
public function addordelete(Request $request)
{
// 参数校验
$validator = Validator::make($request->all(),
[
'typeId' => 'required',
'valueId' => 'required|numeric',
],
[
'typeId.required' => '参数缺失',
'valueId.required' => '参数缺失',
'valueId.numeric' => '非法参数',
]
);
if ($validator->fails()) {
return $this->failed($validator->errors(), 403);
}
if(empty(\Auth::user()->id)){
$user_id = 0;
}else{
$user_id = \Auth::user()->id;
}
$where['user_id'] = $user_id;
$where['value_id'] = $request->valueId;
$where['type_id'] = $request->typeId;
$info = ShopCollect::getCollectDetail($where);
$type = 'add';
if(empty($info->value_id)){
// 添加
$newCollect = new ShopCollect();
$newCollect->user_id = $user_id;
$newCollect->value_id = $request->valueId;
$newCollect->type_id = $request->typeId;
$newCollect->add_time = time();
$newCollect->is_attention = ShopCollect::STATE_ATTENTION;
$newCollect->save();
return $this->success(['type'=>$type]);
}
if($info->is_attention == ShopCollect::STATE_ATTENTION){
$info->is_attention = ShopCollect::STATE_NOT_ATTENTION;
$info->save();
$type = 'del';
}else{
$info->is_attention = ShopCollect::STATE_ATTENTION;
$info->save();
}
return $this->success(['type'=>$type]);
}
/**
* 获取收藏列表
*/
public function getList(Request $request){
// 参数校验
$validator = Validator::make($request->all(),
[
'typeId' => 'required',
],
[
'typeId.required' => '参数缺失',
]
);
if ($validator->fails()) {
return $this->failed($validator->errors(), 403);
}
if(empty(\Auth::user()->id)){
$user_id = 0;
}else{
$user_id = \Auth::user()->id;
}
$list = ShopCollect::getList(['user_id'=>$user_id,'type_id'=>$request->typeId]);
return $this->success(ShopCollectResource::collection($list));
}
}

@ -0,0 +1,153 @@
<?php
namespace App\Http\Controllers\Api;
use Illuminate\Http\Request;
use App\Models\ShopComment;
use App\Logic\ShopCommentLogic;
use Illuminate\Support\Facades\Validator;
use Carbon\Carbon;
class ShopCommentController extends ApiController
{
function __construct()
{
}
// 获取评论列表
public function getCommentList(Request $request){
// 参数校验
$validator = Validator::make($request->all(),
[
'valueId' => 'required',
'typeId' => 'required|numeric',
'showType'=>'numeric'
],
[
'valueId.required' => '商品id参数缺失',
'typeId.required' => '评论类型参数缺失',
'typeId.numeric' => '请输入正确的评论类型',
]
);
if ($validator->fails()) {
return $this->failed($validator->errors(), 403);
}
$commentList = ShopCommentLogic::getCommentList(['value_id' =>$request->valueId,'type_id'=>$request->typeId],$request->showType,10);
return $commentList;
}
// 评论总数
public function getCommentCount(Request $request){
$validator = Validator::make($request->all(),
[
'valueId' => 'required',
'typeId' => 'required|numeric',
],
[
'valueId.required' => '商品id参数缺失',
'typeId.required' => '评论类型参数缺失',
'typeId.numeric' => '请输入正确的评论类型',
]
);
if ($validator->fails()) {
return $this->failed($validator->errors(), 403);
}
$where = [
'value_id' =>$request->valueId,
'type_id'=>$request->typeId,
'status'=>ShopComment::STATE_ON
];
$hasPicCount = ShopComment::has('get_comment_picture')->where($where)->count();
$allCount = ShopComment::where($where)->count();
return $this->success(['hasPicCount'=>$hasPicCount,'allCount'=>$allCount]);
}
// 发表评论
public function commentAdd(Request $request){
$validator = Validator::make($request->all(),
[
'valueId' => 'required',
'typeId' => 'required|numeric',
'content'=> 'required|min:5',
],
[
'valueId.required' => '商品id参数缺失',
'typeId.required' => '评论类型参数缺失',
'typeId.numeric' => '请输入正确的评论类型',
]
);
if ($validator->fails()) {
return $this->failed($validator->errors(), 403);
}
$user_id = 0;
if(!empty(\Auth::user()->id)){
$user_id = \Auth::user()->id;
}
$conmentModel = new ShopComment();
$conmentModel->type_id = $request->typeId;
$conmentModel->value_id = $request->valueId;
$conmentModel->content = $request->input('content');
$conmentModel->add_time = Carbon::now();
$conmentModel->user_id = $user_id;
$re = $conmentModel->save();
return $this->message('添加成功');
}
// 添加或取消收藏
public function addordelete(Request $request)
{
// 参数校验
$validator = Validator::make($request->all(),
[
'typeId' => 'required',
'valueId' => 'required|numeric',
],
[
'typeId.required' => '参数缺失',
'valueId.required' => '参数缺失',
'valueId.numeric' => '非法参数',
]
);
if ($validator->fails()) {
return $this->failed($validator->errors(), 403);
}
if(empty(\Auth::user()->id)){
$user_id = 0;
}else{
$user_id = \Auth::user()->id;
}
$where['user_id'] = $user_id;
$where['value_id'] = $request->valueId;
$where['type_id'] = $request->typeId;
$info = ShopCollect::getCollectDetail($where);
$type = 'add';
if(empty($info->value_id)){
// 添加
$newCollect = new ShopCollect();
$newCollect->user_id = $user_id;
$newCollect->value_id = $request->valueId;
$newCollect->type_id = $request->typeId;
$newCollect->add_time = time();
$newCollect->is_attention = ShopCollect::STATE_ATTENTION;
$newCollect->save();
return $this->success(['type'=>$type]);
}
if($info->is_attention ==ShopCollect::STATE_ATTENTION){
$info->is_attention = ShopCollect::STATE_NOT_ATTENTION;
$info->save();
$type = 'del';
}else{
$info->is_attention = ShopCollect::STATE_ATTENTION;
$info->save();
}
return $this->success(['type'=>$type]);
}
}

@ -0,0 +1,46 @@
<?php
namespace App\Http\Controllers\Api;
use Illuminate\Http\Request;
use App\Models\ShopFeedback;
use Illuminate\Support\Facades\Validator;
class ShopFeedbackController extends ApiController
{
// 获取反馈信息
public function getDataList(Request $request)
{
return $this->success(ShopFeedback::$Option);
}
// 用户进行反馈
public function feedbackHandle(Request $request)
{
// 参数校验
$validator = Validator::make($request->all(),
[
'msg_type' => 'required',
'msg_content' => 'required',
],
[
'msg_type.required' => '参数缺失',
'msg_content.required' => '内容缺失',
]
);
if ($validator->fails()) {
return $this->failed($validator->errors(), 403);
}
$model = new ShopFeedback();
$model->uid = \Auth::user()->id;
$model->user_name = \Auth::user()->name;
$model->msg_title = ShopFeedback::$Option[$request->msg_type];
$model->msg_type = $request->msg_type;
$model->user_contact = $request->user_contact;
$model->msg_status = ShopFeedback::STATUS_ON;
$model->msg_content = $request->msg_content;
$model->save();
return $this->message('反馈成功');
}
}

@ -0,0 +1,23 @@
<?php
namespace App\Http\Controllers\Api;
use Illuminate\Http\Request;
use App\Models\ShopFootprint;
use Illuminate\Support\Facades\Validator;
class ShopFootprintController extends ApiController
{
// 足迹列表
public function getList(Request $request)
{
if (empty(\Auth::user()->id)) {
$uid = 0;
} else {
$uid = \Auth::user()->id;
}
$outData = ShopFootprint::getList(['uid'=>$uid]);
return $this->success($outData);
}
}

@ -0,0 +1,152 @@
<?php
namespace App\Http\Controllers\Api;
use Illuminate\Http\Request;
use App\Logic\ShopGoodsLogic;
use App\Logic\ShopCommentLogic;
use App\Models\ShopBrand;
use Illuminate\Support\Facades\Validator;
use App\Models\ShopCategory;
use App\Models\Carousel;
class ShopGoodsController extends ApiController
{
// 商品统计
public function getGoodsCount(Request $request)
{
$outData = ShopGoodsLogic::getGoodsCount([['id', '>', 0]]);
return $this->success($outData);
}
// 获取商品列表
public function getGoodsList(Request $request)
{
// 参数校验
$validator = Validator::make($request->all(),
[
'categoryId' => 'required',
],
[
'categoryId.required' => '参数缺失',
]
);
if ($validator->fails()) {
return $this->failed($validator->errors(), 403);
}
$where = [];
if( $request->keyword){
$where[] = ['goods_name', 'like' , '%'.$request->keyword.'%'];
}
if( $request->categoryId){
$where['category_id'] = $request->categoryId;
}
// 新品
if($request->isNew){
$where['is_new'] = $request->isNew;
}
// 热门
if($request->isHot){
$where['is_hot'] = $request->isHot;
}
// 品牌
if($request->brandId){
$where['brand_id'] = $request->brandId;
}
$order = '';
$inputSort = $request->input('sort','default');
switch($inputSort){
case 'price':
$order = 'retail_price '. $request->input('order','asc');
break;
default:
$order = 'sort_order asc';
}
$outData = ShopGoodsLogic::getGoodsList($where, $request->size ? $request->size : 10,$order);
if ($outData) {
return $outData;
}
return $this->success([]);
}
// 获取商品分类列表
public function getGoodsCategory(Request $request)
{
// 参数校验
$validator = Validator::make($request->all(),
[
'id' => 'required',
],
[
'id.required' => '参数缺失',
]
);
if ($validator->fails()) {
return $this->failed($validator->errors(), 403);
}
$outData = ShopGoodsLogic::getGoodsCategory(['id' => $request->id]);
return $this->success($outData);
}
// 获取商品详情
public function getGoodsDetail(Request $request)
{
// 参数校验
$validator = Validator::make($request->all(),
[
'id' => 'required',
],
[
'id.required' => '参数缺失',
]
);
if ($validator->fails()) {
return $this->failed($validator->errors(), 403);
}
$goodsInfo = ShopGoodsLogic::getGoodsDetail(['id' => $request->id]);
$goods_where = ['goods_id'=>$goodsInfo->id];
$attribute = ShopGoodsLogic::getGoodsAttribute($goods_where);
$issueList = ShopGoodsLogic::getGoodsIssue($goods_where);
$comment = ShopCommentLogic::getCommentList(['value_id' =>$goodsInfo->id],0,10);
$brand = ShopBrand::getDetail(['id'=>$goodsInfo->brand_id]);
$userHasCollect = ShopGoodsLogic::userCollectStatus($goodsInfo->id);
ShopGoodsLogic::addFootprint($goodsInfo->id);
$outData = [
'info' => $goodsInfo, // 商品信息
'attribute' => $attribute, // 商品属性参数
'issue' => $issueList, // 商品问题
'comment' => ['data'=>$comment,'count' => $comment->total()], // 商品评论
'brand' => $brand, // 品牌信息
'specificationList' => [], // 规格信息 后期完善该项 2018.6.12
'productList' => [], // sku列表 后期完善该项 2018.6.12
'userHasCollect' => $userHasCollect, // 是否收藏
];
return $this->success($outData);
}
// 商品详情页的关联商品(大家都在看)
public function getGoodsRelated(Request $request){
$goodsInfo = ShopGoodsLogic::getGoodsDetail(['id' => $request->id]);
$relateWhere['category_id'] = $goodsInfo->category_id;
$outData = ShopGoodsLogic::getRelatedGoods($relateWhere);
return $this->success($outData);
}
// 新品
public function getGoodsNew(Request $request){
$outData['bannerInfo'] = Carousel::getCarouselByType(Carousel::BOOTH_TYPE_NEW);
// 目前只是查询二级分类 因为前段定位分类只有2级
$outData['filterCategory'] = ShopCategory::getCategoryList(['level'=>1]);
return $this->success($outData);
}
// 热门
public function getGoodsHot(Request $request){
$outData['bannerInfo'] = Carousel::getCarouselByType(Carousel::BOOTH_TYPE_HOT);
// 目前只是查询二级分类 因为前段定位分类只有2级
$outData['filterCategory'] = ShopCategory::getCategoryList(['level'=>1]);
return $this->success($outData);
}
}

@ -0,0 +1,115 @@
<?php
namespace App\Http\Controllers\Api;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use App\Logic\CartLogic;
use App\Models\ShopCart;
use App\Logic\AddressLogic;
use App\Logic\Buy;
class ShopOrderController extends ApiController
{
// 校验购物车商品
public function checkout(Request $request)
{
if (empty(\Auth::user()->id)) {
$this->user_id = 0;
} else {
$this->user_id = \Auth::user()->id;
}
// 参数校验
$validator = Validator::make($request->all(),
[
'addressId' => 'required',
],
[
'addressId.required' => '参数缺失',
]
);
if ($validator->fails()) {
return $this->failed($validator->errors(), 403);
}
$outData = CartLogic::getCheckedGoodsList($this->user_id);
$outData['checkedAddress'] = AddressLogic::getOneAddr($request->addressId, $this->user_id); // 选择地址
$outData['checkedCoupon'] = []; // 选择的优惠券
$outData['couponList'] = []; // 优惠券列表
$outData['couponPrice'] = 0.00; // 选中的优惠金额
$outData['actualPrice'] = PriceCalculate($outData['orderTotalPrice'], '-', $outData['couponPrice']); // 真实付款金额
return $this->success($outData);
}
// 立即购买
public function payNow(Request $request){
if (empty(\Auth::user()->id)) {
$this->user_id = 0;
} else {
$this->user_id = \Auth::user()->id;
}
// 参数校验
$validator = Validator::make($request->all(),
[
'addressId' => 'required',
'goodsId' => 'required',
'buynumber' => 'required',
]
);
if ($validator->fails()) {
return $this->failed($validator->errors(), 403);
}
$outData = CartLogic::getBuyGoodsById($request->goodsId,$request->buynumber);
$outData['checkedAddress'] = AddressLogic::getOneAddr($request->addressId, $this->user_id); // 选择地址
$outData['checkedCoupon'] = []; // 选择的优惠券
$outData['couponList'] = []; // 优惠券列表
$outData['couponPrice'] = 0.00; // 选中的优惠金额
$outData['actualPrice'] = PriceCalculate($outData['orderTotalPrice'], '-', $outData['couponPrice']); // 真实付款金额
return $this->success($outData);
}
// 提交订单用来生成订单
public function orderSubmit(Request $request)
{
if (empty(\Auth::user()->id)) {
$this->user_id = 0;
} else {
$this->user_id = \Auth::user()->id;
}
// 参数校验
$validator = Validator::make($request->all(),
[
'addressId' => 'required',
],
[
'addressId.required' => '参数缺失',
]
);
if ($validator->fails()) {
return $this->failed($validator->errors(), 403);
}
if($request->goodsId){
$orderData = CartLogic::getBuyGoodsById($request->goodsId,$request->buynumber,0);
}else{
$orderData = CartLogic::getCheckedGoodsList($this->user_id);
}
$checkedAddress = AddressLogic::getOneAddr($request->addressId, $this->user_id); // 选择地址
if (empty($checkedAddress)) {
return $this->failed('未查到用户收货地址,请检查您的收货地址', 401);
}
$orderData['checkedCouponId'] = $request->couponId??0; // 选择的优惠券
$orderData['checkedCoupon'] = []; // 选择的优惠券
$orderData['couponList'] = []; // 优惠券列表
$orderData['couponPrice'] = 0.00; // 选中的优惠金额
$orderData['actualPrice'] = PriceCalculate($orderData['orderTotalPrice'], '-', $orderData['couponPrice']); // 真实付款金额
$buyModel = new Buy();
$buyRe = $buyModel->buyStep($request, $orderData, $checkedAddress, $this->user_id);
if (empty($buyRe['error'])) {
return $this->success($buyRe);
}
return $this->failed($buyRe['error'], 403);
}
}

@ -0,0 +1,32 @@
<?php
namespace App\Http\Controllers\Api;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use App\Logic\AddressLogic;
class ShopRegionController extends ApiController
{
// 获取区域列表
public function regionList(Request $request)
{
// 参数校验
$validator = Validator::make($request->all(),
[
'parentId' => 'required',
],
[
'parentId.required' => '参数缺失',
]
);
if ($validator->fails()) {
return $this->failed($validator->errors(), 403);
}
$addressLogic = new AddressLogic();
$regionList = $addressLogic->getRegionList($request->parentId);
return $this->success($regionList);
}
}

@ -0,0 +1,37 @@
<?php
namespace App\Http\Controllers\Api;
use Illuminate\Http\Request;
use App\Models\ShopTopic;
use App\Http\Resources\ShopTopic as ShopTopicResource;
use Illuminate\Support\Facades\Validator;
class ShopTopicController extends ApiController
{
// 获取专题列表
public function getTopicList(Request $request)
{
return ShopTopicResource::collection(ShopTopic::getTopicListByPage())->additional(['code' => 200]);
}
// 获取专题详情
public function getTopicDetail(Request $request)
{
// 参数校验
$validator = Validator::make($request->all(),
[
'id' => 'required',
],
[
'id.required' => '参数缺失',
]
);
if ($validator->fails()) {
return $this->failed($validator->errors(), 403);
}
$outData = new ShopTopicResource(ShopTopic::getTopicDetail(['id' => $request->id]));
return $this->success($outData);
}
}

@ -0,0 +1,51 @@
<?php
namespace App\Http\Controllers\Api;
use App\Models\Carousel;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class CreateCityDataController extends ApiController
{
/**
* 根据省市生成数据
*/
public function index(Request $request)
{
if(!$request->provinceId){
return [];
}
$province = DB::table('br_area')->where('area_id', $request->provinceId)->first();
// 二级地区
$dataTwo = [];
if($province){
$citys = DB::table('br_area')->where('area_parent_id', $request->provinceId)->get();
foreach($citys as $k=>$v){
// 3级地区
$district = DB::table('br_area')->where('area_parent_id', $v->area_id)->get();
$dataThree = [];
foreach($district as $k2=>$v3){
$dataThree[] = [
'name' => $v3->area_name,
'id' => $v3->area_id,
'pid'=> $v->area_id,
];
}
$dataTwo[] = [
'name' => $v->area_name,
'id' => $v->area_id,
'pid'=> $province->area_id,
'districtList' => $dataThree
];
}
}
$dataOne = [
'name' => $province->area_name,
'id' => $province->area_id,
'cityList' =>$dataTwo
];
return json_encode($dataOne, JSON_UNESCAPED_UNICODE);
}
}

@ -0,0 +1,52 @@
<?php
namespace App\Http\Controllers\Api;
use App\Models\Iphone;
use App\User;
use Illuminate\Http\Request;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Support\Facades\DB;
class IphoneController extends ApiController
{
use AuthenticatesUsers;
public function getUserIphone(Request $request)
{
//$ll=DB::select('select * from users where openid = ?', [1231464465545885426545]);
//$ll = DB::table('users')->where('openid', '1231464465545885426545')->first();
$ll = new \App\Models\Iphone;
$info = $ll->userInfo();
if (!is_null($info->mobile))
{
return $this->message("你的手机已绑定成功");
}else {
return $this->failed('未绑定号码', 44);
}
}
public function saveUserIphone(Request $request)
{
//dd(1);
// $iphone = new Iphone();
// $this->validate(request(),[
// 'mobile'=>'required|string|11'
// ]);
// $iphone->mobile = request('mobile');
//$ll = DB::table('users')->where('openid', '1231464465545885426545')->get();
$num =DB::table('users')->where('openid', '1231464465545885426545')->update(['mobile' => 13923456889]);
//$num =DB::table('users')->insert(['mobile' => 13923456789]);
//$num=1345678123;
if ($num)
{
return $this->message("你的手机已绑定成功");
}else {
return $this->failed('未绑定号码', 44);
}
}
}

@ -0,0 +1,139 @@
<?php
namespace App\Http\Controllers\Api;
use Illuminate\Http\Request;
use App\Models\Order;
use Validator;
use App\Models\OrderGood;
use App\Logic\OrderLogic;
class OrderInfoController extends ApiController
{
private $statusConfig = [
[10], [22], [26, 32], [40]
];
// 订单列表
public function getMyOrderList(Request $request)
{
// 先获取当前登录的用户信息
$user_id = \Auth::user()->id;
if (empty($user_id)) {
return $this->failed('用户未登录', 401);
}
$condition['uid'] = $user_id;
$conditionIn= $this->statusConfig[$request->input('status', 0)];
$orders_info = Order::getOrderAndOrderGoodsList($condition,$conditionIn);
$out_info = [];
foreach ($orders_info as $k => &$order) {
$out_info['logisticsMap'][$order->id] = [
"address" => $order->addr_detail,
"cityId" => $order->aid_c,
"dateUpdate" => $order->updated_at->format('Y-m-d H:i:s'),
"districtId" => $order->aid_a,
"id" => $order->id,
"linkMan" => $order->user_name,
"mobile" => $order->user_mobile,
"provinceId" => $order->aid_p,
"status" => $order->status,
"type" => 0
];
$out_info['orderList'][] = [
"amount" => $order->total_price,
"amountLogistics" => 0.00,
"amountReal" => $order->pay_price,
"dateAdd" => $order->created_at->format('Y-m-d H:i:s'),
"dateClose" => $order->pay_date,
"goodsNumber" => $order->orderGoods->sum('num'),
"hasRefund" => false,
"id" => $order->id,
"isPay" => false,
"orderNumber" => $order->order_sn,
"remark" => $order->remark,
"status" => $order->status,
"statusStr" => Order::getStatusDisplayMap()[$order->status],
"type" => 0,
"uid" => $order->uid,
];
$order_goods = [];
foreach ($order->orderGoods as $goods_k => $goods) {
$order_goods[] = [
"amount" => $goods->goods_price,
"goodsId" => $goods->goods_id,
"goodsName" => $goods->goods_name,
"id" => $goods->id,
"number" => $goods->num,
"orderId" => $order->id,
"pic" => config('filesystems.disks.oss.url') . '/' . $goods->goods_image,
"uid" => $order->uid,
];
}
$out_info['goodsMap'][$order->id] = $order_goods;
}
if ($out_info) {
// 返回订单信息
return $this->success($out_info);
}
// 没有查到订单信息 返回空数据错误
//add_my_log('Orderinfo','用户id:'.\Auth::user()->id.')没有符合条件的订单',1,'订单内容:没有符合条件的订单','OrderinfoController@list');
return $this->failed('没有符合条件的订单', 401);
}
/**
* 取消订单
* @param Request $request
*/
public function cancelOrder(Request $request)
{
// 验证规则
$validator = Validator::make($request->all(),
[
'orderId' => 'required'
],
[
'orderId.required' => '订单号缺失'
]
);
if ($validator->fails()) {
// add_my_log('Orderinfo','用户id:'.\Auth::user()->id.')操作订单不存在',1,'订单号:'.$order_id,'OrderinfoController@cancelOrder');
return $this->failed($validator->errors(), 401);
}
$condition['id'] = $request->orderId;
$condition['uid'] = \Auth::user()->id;
$order_info = Order::where($condition)->first();
$order_info_arr = $order_info->toArray();
if (empty($order_info_arr)) {
// add_my_log('Orderinfo','用户id:'.\Auth::user()->id.')操作订单不存在',1,'订单内容:空','OrderinfoController@cancelOrder');
return $this->failed('订单不存在', 401);
}
$order_info->status = Order::STATUS_INVALID;
$order_info->save();
return $this->message('取消成功');
}
/**
* 我的订单统计
* @param Request $request
*/
public function getMyOrderStatistics(Request $request)
{
// 先获取当前登录的用户信息
$user_id = \Auth::user()->id;
if (empty($user_id)) {
return $this->failed('用户未登录', 401);
}
$statistics = [
"count_id_no_transfer" => Order::countOrder(['uid' => $user_id, 'status' => Order::STATUS_ALREADY_PAID]),
"count_id_close" => Order::countOrder(['uid' => $user_id, 'status' => Order::STATUS_INVALID]),
"count_id_no_pay" => Order::countOrder(['uid' => $user_id, 'status' => Order::STATUS_WAIT_PAY]),
"count_id_no_confirm" => Order::countOrder(['uid' => $user_id, 'status' => Order::STATUS_DELIVERING]),
"count_id_success" => Order::countOrder(['uid' => $user_id, 'status' => Order::STATUS_COMPLETED])
];
return $this->success($statistics);
}
}

@ -0,0 +1,215 @@
<?php
/**
* User: liuhao
* Date: 18-3-9
* Time: 上午9:50
*/
namespace App\Http\Controllers\Api;
use App\Logics\OrderLogic;
use App\Models\Order;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Validator;
class OrdersController extends ApiController
{
//获取配送订单列表
public function deliveryOrderList(Request $request)
{
$userID = Auth::user()->id;
if (!$userID) {
return $this->failed('非法的用户请求', 401);
}
// 参数校验
$validator = Validator::make($request->all(),
[
'status' => 'required',
],
[
'status.required' => '订单状态缺失',
]
);
if ($validator->fails()) {
return $this->failed($validator->errors(), 401);
}
$orderStatus = $request->input('status');
$orderLogic = new OrderLogic();
// $userID = 7;
list($resaultFlag, $data) = $orderLogic->getDeliveryOrderList($userID, $orderStatus);
if ($resaultFlag) {
return $this->success($data);
} else {
list($code, $errMsg) = $this->transErrMsg($data);
return $this->failed($errMsg, $code);
}
}
//确认接收订单
public function receiveOrder(Request $request)
{
// $userID = 7;
$userID = Auth::user()->id;
if (!$userID) {
return $this->failed('非法的用户请求', 401);
}
// 参数校验
$validator = Validator::make($request->all(),
[
'orderID' => 'required',
],
[
'orderID.required' => 'orderID缺失',
]
);
if ($validator->fails()) {
return $this->failed($validator->errors(), 401);
}
$orderID = $request->input('orderID');
$orderLogic = new OrderLogic();
$orderLogic->isInSchool = true;
$orderLogic->optionUserID = $userID;
list($resaultFlag, $errMsg) = $orderLogic->receiveOrder($orderID);
if ($resaultFlag) {
return $this->success([]);
} else {
list($code, $msg) = $this->transErrMsg($errMsg);
return $this->failed($msg, $code);
}
}
//确认配送订单
public function deliveryOrder(Request $request)
{
$userID = Auth::user()->id;
if (!$userID) {
return $this->failed('非法的用户请求', 401);
}
// 参数校验
$validator = Validator::make($request->all(),
[
'orderID' => 'required',
],
[
'orderID.required' => 'orderID缺失',
]
);
if ($validator->fails()) {
return $this->failed($validator->errors(), 401);
}
$orderID = $request->input('orderID');
$orderLogic = new OrderLogic();
$orderLogic->isInSchool = true;
list($resaultFlag, $errMsg) = $orderLogic->deliveryOrder($orderID);
if ($resaultFlag) {
return $this->success([]);
} else {
list($code, $msg) = $this->transErrMsg($errMsg);
return $this->failed($msg, $code);
}
}
//订单详情
public function getOrderDetail(Request $request)
{
$userID = Auth::user()->id;
if (!$userID) {
return $this->failed('非法的用户请求', 401);
}
// 参数校验
$validator = Validator::make($request->all(),
[
'orderID' => 'required',
],
[
'orderID.required' => 'orderID缺失',
]
);
if ($validator->fails()) {
return $this->failed($validator->errors(), 401);
}
$orderID = $request->input('orderID');
$orderLogic = new OrderLogic();
$orderLogic->optionUserID = $userID;
list($resaultFlag, $data) = $orderLogic->getOrderDetail($orderID);
if ($resaultFlag) {
return $this->success($data);
} else {
list($code, $msg) = $this->transErrMsg($data);
return $this->failed($msg, $code);
}
}
//用户收货
public function completeOrder(Request $request)
{
$userID = Auth::user()->id;
if (!$userID) {
return $this->failed('非法的用户请求', 401);
}
// 参数校验
$validator = Validator::make($request->all(),
[
'orderID' => 'required',
],
[
'orderID.required' => 'orderID缺失',
]
);
if ($validator->fails()) {
return $this->failed($validator->errors(), 401);
}
$orderID = $request->input('orderID');
$orderLogic = new OrderLogic();
$orderLogic->optionUserID = $userID;
list($resaultFlag, $data) = $orderLogic->completeOrder($orderID);
if ($resaultFlag) {
return $this->success($data);
} else {
list($code, $msg) = $this->transErrMsg($data);
return $this->failed($msg, $code);
}
}
protected function transErrMsg($errMsg, $code = 401)
{
$msg = $errMsg;
if (is_string($errMsg)) {
$pos = strpos($errMsg, '|');
if ($pos !== false) {
$code = substr($errMsg, 0, $pos);
$msg = substr($errMsg, $pos + 1);
}
}
return [$code, $msg];
}
}

@ -0,0 +1,32 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\SendsPasswordResetEmails;
class ForgotPasswordController extends Controller
{
/*
|--------------------------------------------------------------------------
| Password Reset Controller
|--------------------------------------------------------------------------
|
| This controller is responsible for handling password reset emails and
| includes a trait which assists in sending these notifications from
| your application to your users. Feel free to explore this trait.
|
*/
use SendsPasswordResetEmails;
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest');
}
}

@ -0,0 +1,39 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
class LoginController extends Controller
{
/*
|--------------------------------------------------------------------------
| Login Controller
|--------------------------------------------------------------------------
|
| This controller handles authenticating users for the application and
| redirecting them to your home screen. The controller uses a trait
| to conveniently provide its functionality to your applications.
|
*/
use AuthenticatesUsers;
/**
* Where to redirect users after login.
*
* @var string
*/
protected $redirectTo = '/home';
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest')->except('logout');
}
}

@ -0,0 +1,71 @@
<?php
namespace App\Http\Controllers\Auth;
use App\User;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Validator;
use Illuminate\Foundation\Auth\RegistersUsers;
class RegisterController extends Controller
{
/*
|--------------------------------------------------------------------------
| Register Controller
|--------------------------------------------------------------------------
|
| This controller handles the registration of new users as well as their
| validation and creation. By default this controller uses a trait to
| provide this functionality without requiring any additional code.
|
*/
use RegistersUsers;
/**
* Where to redirect users after registration.
*
* @var string
*/
protected $redirectTo = '/home';
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest');
}
/**
* Get a validator for an incoming registration request.
*
* @param array $data
* @return \Illuminate\Contracts\Validation\Validator
*/
protected function validator(array $data)
{
return Validator::make($data, [
'name' => 'required|string|max:255',
'email' => 'required|string|email|max:255|unique:users',
'password' => 'required|string|min:6|confirmed',
]);
}
/**
* Create a new user instance after a valid registration.
*
* @param array $data
* @return \App\User
*/
protected function create(array $data)
{
return User::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => bcrypt($data['password']),
]);
}
}

@ -0,0 +1,39 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\ResetsPasswords;
class ResetPasswordController extends Controller
{
/*
|--------------------------------------------------------------------------
| Password Reset Controller
|--------------------------------------------------------------------------
|
| This controller is responsible for handling password reset requests
| and uses a simple trait to include this behavior. You're free to
| explore this trait and override any methods you wish to tweak.
|
*/
use ResetsPasswords;
/**
* Where to redirect users after resetting their password.
*
* @var string
*/
protected $redirectTo = '/home';
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest');
}
}

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

@ -0,0 +1,61 @@
<?php
namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel
{
/**
* The application's global HTTP middleware stack.
*
* These middleware are run during every request to your application.
*
* @var array
*/
protected $middleware = [
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\TrimStrings::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
\App\Http\Middleware\TrustProxies::class,
];
/**
* The application's route middleware groups.
*
* @var array
*/
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
'api' => [
'throttle:60,1',
'bindings',
],
];
/**
* The application's route middleware.
*
* These middleware may be assigned to groups or used individually.
*
* @var array
*/
protected $routeMiddleware = [
'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
];
}

@ -0,0 +1,17 @@
<?php
namespace App\Http\Middleware;
use Illuminate\Cookie\Middleware\EncryptCookies as Middleware;
class EncryptCookies extends Middleware
{
/**
* The names of the cookies that should not be encrypted.
*
* @var array
*/
protected $except = [
//
];
}

@ -0,0 +1,26 @@
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Auth;
class RedirectIfAuthenticated
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param string|null $guard
* @return mixed
*/
public function handle($request, Closure $next, $guard = null)
{
if (Auth::guard($guard)->check()) {
return redirect('/home');
}
return $next($request);
}
}

@ -0,0 +1,18 @@
<?php
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\TrimStrings as Middleware;
class TrimStrings extends Middleware
{
/**
* The names of the attributes that should not be trimmed.
*
* @var array
*/
protected $except = [
'password',
'password_confirmation',
];
}

@ -0,0 +1,29 @@
<?php
namespace App\Http\Middleware;
use Illuminate\Http\Request;
use Fideloper\Proxy\TrustProxies as Middleware;
class TrustProxies extends Middleware
{
/**
* The trusted proxies for this application.
*
* @var array
*/
protected $proxies;
/**
* The current proxy header mappings.
*
* @var array
*/
protected $headers = [
Request::HEADER_FORWARDED => 'FORWARDED',
Request::HEADER_X_FORWARDED_FOR => 'X_FORWARDED_FOR',
Request::HEADER_X_FORWARDED_HOST => 'X_FORWARDED_HOST',
Request::HEADER_X_FORWARDED_PORT => 'X_FORWARDED_PORT',
Request::HEADER_X_FORWARDED_PROTO => 'X_FORWARDED_PROTO',
];
}

@ -0,0 +1,17 @@
<?php
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;
class VerifyCsrfToken extends Middleware
{
/**
* The URIs that should be excluded from CSRF verification.
*
* @var array
*/
protected $except = [
'api/*',
];
}

@ -0,0 +1,26 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\Resource;
class Carousel extends Resource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
"businessId"=>$this->goods_id,
"type"=> $this->booth_type,
"title"=> $this->carousel_title,
"picUrl"=> config('filesystems.disks.oss.url').'/'.$this->carousel_img,
"info"=> $this->carousel_info,
"state"=> $this->state,
];
}
}

@ -0,0 +1,36 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\Resource;
class DefaultAddr extends Resource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'id' => $this->id,
'provinceId' => $this->aid_p,
'cityId' => $this->aid_c,
'districtId' => $this->aid_a,
'provinceStr' => $this->province,
'cityStr' => $this->city,
'areaStr' => $this->area,
'linkMan' => $this->true_name,
'address' => $this->addr,
'mobile' => $this->mobile,
'code' => $this->postcode,
'isDefault' => $this->is_default,
'sid' => $this->sid,
'did' => $this->did,
'school_name' => $this->school_name,
'dorm_name' => $this->dorm_name,
];
}
}

@ -0,0 +1,41 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\Resource;
class Good extends Resource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
if (!empty($this->goods_description_pictures)) {
$pic = $this->goods_description_pictures;
foreach ($pic as $eachPic) {
$pics[] = [
'pic' => config('filesystems.disks.oss.url').'/'.$eachPic
];
}
} else {
$pics[] = [
'pic' => config('filesystems.disks.oss.url').'/'.$this->goods_main_image
];
}
return [
'id' => $this->id,
'pics' => $pics,
'name' => $this->goods_name,
'minPrice' => $this->goods_price,
'originalPrice' => $this->goods_marketprice,
'numberOrders' => $this->goods_salenum,
'pic' => config('filesystems.disks.oss.url').'/'.$this->goods_main_image,
'stores' => $this->goods_storage,
];
}
}

@ -0,0 +1,30 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\ResourceCollection;
class GoodCollection extends ResourceCollection
{
/**
* Transform the resource collection into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return parent::toArray($request);
// return [
// 'data' => $this->collection,
// 'links' => [
// 'self' => 'link-value',
// ],
// ];
// return [
// 'id' => $this->id,
// 'goods_name' => $this->goods_name,
// ];
}
}

@ -0,0 +1,63 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\Resource;
class GoodDetail extends Resource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
if (!empty($this->goods_description_pictures)) {
$pic = $this->goods_description_pictures;
foreach ($pic as $eachPic) {
$pics[] = [
'pic' => config('filesystems.disks.oss.url').'/'.$eachPic
];
}
} else {
$pics[] = [
'pic' => config('filesystems.disks.oss.url').'/'.$this->goods_main_image
];
}
if (!empty($this->goods_carousel)) {
$carouselPic = $this->goods_carousel;
foreach ($carouselPic as $eachPic) {
$carouselPics[] = [
'pic' => config('filesystems.disks.oss.url').'/'.$eachPic
];
}
} else {
$carouselPics[] = [
'pic' => config('filesystems.disks.oss.url').'/'.$this->goods_main_image
];
}
$content = '';
foreach ($pics as $eachPic) {
$content .= '<div><img src="'.$eachPic['pic'].'"></div>';
}
return [
'id' => $this->id,
'pics' => $pics,
'carousel' => $carouselPics,
'basicInfo' => [
'id' => $this->id,
'name' => $this->goods_name,
'minPrice' => $this->goods_price,
'numberOrders' => $this->goods_salenum,
'pic' => config('filesystems.disks.oss.url').'/'.$this->goods_main_image,
'stores' => $this->goods_storage,
],
'logistics' =>1, // 需要填写收货地址
'content' => $content,
];
}
}

@ -0,0 +1,38 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\Resource;
class ProjectType extends Resource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
$pics =[];
if (!empty($this->carousel_imgs)) {
$pic = $this->carousel_imgs;
foreach ($pic as $eachPic) {
$pics[] = config('filesystems.disks.oss.url').'/'.$eachPic;
}
}
return [
"id"=>$this->id,
"goods_name"=> $this->type_name,
"goods_desc"=> $this->type_desc,
"type_name"=> $this->type_name,
"title"=> $this->special_title,
"type_img"=> config('filesystems.disks.oss.url').'/'.$this->type_img,
"carousel_imgs"=> $pics,
"description"=> $this->description,
"salenum"=> $this->salenum,
"goods_price"=> $this->basal_price,
];
}
}

@ -0,0 +1,35 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\Resource;
class ShopAddress extends Resource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
"id"=>$this->id,
"name"=> $this->user_name,
"country_id"=> $this->country_id,
"country"=> $this->country,
"province_id"=> $this->province_id,
"province_name"=> $this->province,
"city_id"=> $this->city_id,
"city_name"=> $this->city,
"district_id"=> $this->district_id,
"district_name"=> $this->district,
"address"=> $this->address,
"mobile"=> $this->mobile,
"is_default"=> $this->is_default,
"full_region"=> $this->province.' '.$this->city.' '.$this->district.' ' ,
];
}
}

@ -0,0 +1,37 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\Resource;
class ShopBrand extends Resource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
$pics =[];
if (!empty($this->list_pic_url)) {
$pic = $this->list_pic_url;
foreach ($pic as $eachPic) {
$pics[] = config('filesystems.disks.oss.url').'/'.$eachPic;
}
}
return [
"id"=>$this->id,
"name"=> $this->name,
"list_pic_url"=> $pics,
"simple_desc"=> $this->simple_desc,
"pic_url"=> config('filesystems.disks.oss.url').'/'.$this->pic_url,
"is_show"=> $this->is_show,
"floor_price"=> $this->floor_price,
"new_pic_url"=> config('filesystems.disks.oss.url').'/'.$this->new_pic_url,
];
}
}

@ -0,0 +1,34 @@
<?php
namespace App\Http\Resources;
use App\Models\ShopCategory as ShopCategoryDB;
use Illuminate\Http\Resources\Json\Resource;
class ShopCart extends Resource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
"id"=>$this->id,
"user_id"=> $this->uid,
"goods_id"=> $this->goods_id,
"goods_sn"=> $this->goods_sn,
"goods_name"=> $this->goods_name,
"market_price"=> $this->market_price,
"retail_price"=> $this->shop_goods->retail_price,
"number"=> $this->number,
"checked"=> $this->checked,
'freight_price' => $this->shop_goods->freight_price,
"list_pic_url"=> config('filesystems.disks.oss.url').'/'.$this->list_pic_url,
"primary_pic_url"=> config('filesystems.disks.oss.url').'/'.$this->shop_goods->primary_pic_url,
];
}
}

@ -0,0 +1,35 @@
<?php
namespace App\Http\Resources;
use App\Models\ShopCategory as ShopCategoryDB;
use Illuminate\Http\Resources\Json\Resource;
class ShopCategory extends Resource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
$subCategoryList = ShopCategory::collection(ShopCategoryDB::getChildrenCategoryByParentId($this->id));
return [
"id"=>$this->id,
"name"=> $this->name,
"keywords"=> $this->keywords,
"front_desc"=> $this->front_desc,
"sort_order"=> $this->sort_order,
"banner_url"=> config('filesystems.disks.oss.url').'/'.$this->banner_url,
"icon_url"=> config('filesystems.disks.oss.url').'/'.$this->icon_url,
"img_url"=> config('filesystems.disks.oss.url').'/'.$this->img_url,
"wap_banner_url"=> config('filesystems.disks.oss.url').'/'.$this->img_url,
"level"=> $this->level,
"front_name"=> $this->front_name,
'subCategoryList' =>$subCategoryList
];
}
}

@ -0,0 +1,27 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\Resource;
class ShopCollect extends Resource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
"id"=>$this->id,
"name"=> $this->shop_goods['goods_name'],
"value_id"=> $this->value_id,
"retail_price"=> $this->shop_goods['retail_price'],
"list_pic_url"=> config('filesystems.disks.oss.url').'/'.$this->shop_goods['primary_pic_url'],
"goods_brief"=> $this->shop_goods['goods_brief'],
];
}
}

@ -0,0 +1,47 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\Resource;
use App\User;
class ShopComment extends Resource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
$pics =[];
if (!empty($this->get_comment_picture)) {
$pic = $this->get_comment_picture;
foreach ($pic as $eachPic) {
$pics[] = config('filesystems.disks.oss.url').'/'.$eachPic->pic_url;
}
}
$user = [
'nickname' => 'T粉',
'avatar' => '../../static/images/default.header.png'
];
if($this->user_id){
$user = User::find($this->user_id);
}
return [
"id"=>$this->id,
"value_id"=> $this->value_id,
'nickname' => $user['nickname'],
'avatar' => $user['avatar'],
"content"=> $this->content,
"user_id"=> $this->user_id,
"new_content"=> $this->new_content,
"pic_list"=> $pics,
"add_time"=>$this->created_at,
];
}
}

@ -0,0 +1,28 @@
<?php
namespace App\Http\Resources;
use App\Models\ShopCategory as ShopCategoryDB;
use Illuminate\Http\Resources\Json\Resource;
class ShopFootprint extends Resource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
"id"=>$this->id,
"goods_name"=> $this->shop_goods->goods_name,
"primary_pic_url"=> config('filesystems.disks.oss.url').'/'.$this->shop_goods->primary_pic_url,
"goods_brief"=> $this->shop_goods->goods_brief,
"retail_price"=> $this->shop_goods->retail_price,
"add_time"=> $this->add_time,
];
}
}

@ -0,0 +1,52 @@
<?php
namespace App\Http\Resources;
use App\Models\ShopCategory as ShopCategoryDB;
use Illuminate\Http\Resources\Json\Resource;
class ShopGoods extends Resource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
$pics =[];
if (!empty($this->list_pic_url)) {
$pic = $this->list_pic_url;
foreach ($pic as $eachPic) {
$pics[] = config('filesystems.disks.oss.url').'/'.$eachPic;
}
}
return [
"id"=>$this->id,
"goods_name"=> $this->goods_name,
"goods_number"=> $this->goods_number,
"keywords"=> $this->keywords,
"goods_number"=> $this->goods_number,
"goods_brief"=> $this->goods_brief,
"goods_desc"=> $this->goods_desc,
"counter_price"=> $this->counter_price,
"extra_price"=> $this->extra_price,
"is_new"=> $this->is_new,
"goods_unit"=> $this->goods_unit,
"primary_pic_url"=> config('filesystems.disks.oss.url').'/'.$this->primary_pic_url,
"list_pic_url"=> $pics,
"retail_price"=> $this->retail_price,
"sell_volume"=> $this->sell_volume,
"unit_price"=> $this->unit_price,
"promotion_desc"=> $this->promotion_desc,
"promotion_tag"=> $this->promotion_tag,
"vip_exclusive_price"=> $this->vip_exclusive_price,
"is_vip_exclusive"=> $this->is_vip_exclusive,
"is_limited"=> $this->is_limited,
"is_hot"=> $this->is_hot,
];
}
}

@ -0,0 +1,25 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\Resource;
class ShopGoodsAttribute extends Resource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
"id"=>$this->id,
"goods_id"=>$this->goods_id,
"name"=> $this->get_attribute->name,
"value"=> $this->value,
];
}
}

@ -0,0 +1,53 @@
<?php
namespace App\Http\Resources;
use App\Models\ShopOrder as ShopOrderDB;
use Illuminate\Http\Resources\Json\Resource;
use App\Logic\AddressLogic;
class ShopOrder extends Resource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
// 主表信息
"id" => $this->id,
"order_sn" => $this->order_sn,
"order_status" => $this->order_status,
"shipping_status" => $this->shipping_status,
"pay_status" => $this->pay_status,
"consignee" => $this->consignee,
"country" => $this->country,
"city" => $this->city,
"district" => $this->district,
"address" => $this->address,
"mobile" => $this->mobile,
"postscript" => $this->postscript,
"pay_name" => $this->pay_name,
"pay_id" => $this->pay_id,
"actual_price" => $this->actual_price,
"order_price" => $this->order_price,
"goods_price" => $this->goods_price,
"add_time" => $this->add_time,
"confirm_time" => $this->confirm_time,
"pay_time" => $this->pay_time,
"coupon_price" => $this->coupon_price,
"order_status_text" => ShopOrderDB::getStatusDisplayMap()[$this->order_status],
'full_region' => AddressLogic::getRegionNameById($this->province) .' '. AddressLogic::getRegionNameById($this->city).' '.AddressLogic::getRegionNameById($this->district),
"handleOption" => [
'pay' => ($this->order_status == ShopOrderDB::STATUS_WAIT_PAY) ? 1 : 0,
],
// 附表信息
"goodsList" => ShopOrderGoods::collection($this->orderGoods),
];
}
}

@ -0,0 +1,26 @@
<?php
namespace App\Http\Resources;
use App\Models\ShopOrder as ShopOrderDB;
use Illuminate\Http\Resources\Json\Resource;
class ShopOrderGoods extends Resource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
"goods_name"=> $this->goods_name,
"number"=> $this->number,
"list_pic_url"=> config('filesystems.disks.oss.url').'/'.$this->list_pic_url,
"actual_price"=> $this->actual_price,
];
}
}

@ -0,0 +1,39 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\Resource;
class ShopTopic extends Resource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
$pics =[];
if (!empty($this->item_pic_url)) {
$pic = $this->item_pic_url;
foreach ($pic as $eachPic) {
$pics[] = config('filesystems.disks.oss.url').'/'.$eachPic;
}
}
return [
"id"=>$this->id,
"title"=> $this->title,
"content"=> $this->content,
"avatar"=> config('filesystems.disks.oss.url').'/'.$this->avatar,
"price_info"=> $this->price_info,
"subtitle"=> $this->subtitle,
"read_count"=> $this->read_count,
"scene_pic_url"=> config('filesystems.disks.oss.url').'/'.$this->scene_pic_url,
"item_pic_url"=> $pics,
"sort_order"=> $this->sort_order,
];
}
}

@ -0,0 +1,25 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\Resource;
class Special extends Resource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
"id"=>$this->id,
"class_id"=> $this->class_id,
"title"=> $this->special_title,
"icon"=> config('filesystems.disks.oss.url').'/'.$this->icon,
"link_url"=> $this->link_url,
];
}
}

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

Loading…
Cancel
Save