release
parent
b55e6881df
commit
6ecdc00dec
|
|
@ -19,7 +19,7 @@ class UserVipController extends AdminController
|
||||||
{
|
{
|
||||||
return Grid::make(UserVip::with(['user', 'vip']), function (Grid $grid) {
|
return Grid::make(UserVip::with(['user', 'vip']), function (Grid $grid) {
|
||||||
|
|
||||||
$grid->model()->where('status', 1);
|
$grid->model()->where('status', UserVip::STATUS_SUCCESS);
|
||||||
|
|
||||||
$grid->column('user.phone');
|
$grid->column('user.phone');
|
||||||
$grid->column('vip.name');
|
$grid->column('vip.name');
|
||||||
|
|
|
||||||
|
|
@ -34,25 +34,11 @@ class ArticleController extends Controller
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @param \Illuminate\Http\Request $request
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function index(Request $request)
|
public function index(Request $request)
|
||||||
{
|
{
|
||||||
$cate = (string) $request->query('cate');
|
$categoryId = (string) $request->query('cate');
|
||||||
$key = (string) $request->query('key');
|
$key = (string) $request->query('key');
|
||||||
$categoryId = Arr::get([
|
$query = Article::where('is_show', 1);
|
||||||
'help'=> app_settings('app.article_help'),
|
|
||||||
'agreement'=> app_settings('app.article_agreement'),
|
|
||||||
'health'=> app_settings('app.article_health'),
|
|
||||||
], $cate);
|
|
||||||
$query = Article::query()->with(['likesInfo'=>function ($q) use ($request) {
|
|
||||||
$user_id = $request->user()?->id;
|
|
||||||
return $q->where('user_id', $user_id ?? 0);
|
|
||||||
}])->where('is_show', 1);
|
|
||||||
if ($categoryId) {
|
if ($categoryId) {
|
||||||
$query->where('category_id', $categoryId);
|
$query->where('category_id', $categoryId);
|
||||||
}
|
}
|
||||||
|
|
@ -68,46 +54,19 @@ class ArticleController extends Controller
|
||||||
return ArticleSimpleResource::collection($list);
|
return ArticleSimpleResource::collection($list);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function healthCategory(Request $request)
|
public function category()
|
||||||
{
|
{
|
||||||
$key = (string) $request->query('key');
|
$list = ArticleCategory::whereNull('parent_id')->show()->sort()->get();
|
||||||
$categoryId = app_settings('app.article_health');
|
|
||||||
$query = ArticleCategory::query()->where('parent_id', $categoryId)->where('is_show', 1);
|
|
||||||
|
|
||||||
if ($key) {
|
return ArticleCategoryResource::collection($list);
|
||||||
$query->where('name', 'like', '%'.$key.'%');
|
|
||||||
}
|
|
||||||
|
|
||||||
$query->orderBy('is_recommend', 'desc');
|
|
||||||
$query->orderBy('sort', 'desc');
|
|
||||||
$query->orderBy('created_at', 'desc');
|
|
||||||
|
|
||||||
$categories = $query->get();
|
|
||||||
|
|
||||||
return ArticleCategoryResource::collection($categories);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function articleList($id, Request $request)
|
public function categoryTree()
|
||||||
{
|
{
|
||||||
$key = (string) $request->query('key');
|
$nodes = ArticleCategory::select(['id', 'cover', 'name', 'parent_id', 'sort'])->get();
|
||||||
$categoryId = $id;
|
$list = (new ArticleCategory())->toTree($nodes->all());
|
||||||
$query = Article::query()->with(['likesInfo'=>function ($q) use ($request) {
|
|
||||||
$user_id = $request->user()?->id;
|
|
||||||
return $q->where('user_id', $user_id ?? 0);
|
|
||||||
}])->where('is_show', 1);
|
|
||||||
if ($categoryId) {
|
|
||||||
$query->where('category_id', $categoryId);
|
|
||||||
}
|
|
||||||
if ($key) {
|
|
||||||
$query->where('title', 'like', '%'.$key.'%');
|
|
||||||
}
|
|
||||||
|
|
||||||
$query->orderBy('is_recommend', 'desc');
|
return $list;
|
||||||
$query->orderBy('sort', 'desc');
|
|
||||||
$query->orderBy('created_at', 'desc');
|
|
||||||
|
|
||||||
$list = $query->simplePaginate(PaginatorHelper::resolvePerPage('per_page', 20, 50));
|
|
||||||
return ArticleSimpleResource::collection($list);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,187 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Endpoint\Api\Http\Controllers;
|
||||||
|
|
||||||
|
use App\Endpoint\Api\Http\Resources\ArticleCategoryResource;
|
||||||
|
use App\Endpoint\Api\Http\Resources\ArticleResource;
|
||||||
|
use App\Endpoint\Api\Http\Resources\ArticleSimpleResource;
|
||||||
|
use App\Exceptions\BizException;
|
||||||
|
use App\Helpers\Paginator as PaginatorHelper;
|
||||||
|
use App\Models\Article;
|
||||||
|
use App\Models\ArticleCategory;
|
||||||
|
use App\Models\ArticleLikesLog;
|
||||||
|
use App\Models\ArticlePointsLog;
|
||||||
|
use App\Models\PointsLog;
|
||||||
|
use App\Services\PointsService;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Support\Arr;
|
||||||
|
use Illuminate\Support\Facades\DB;
|
||||||
|
use Throwable;
|
||||||
|
|
||||||
|
class ArticleController extends Controller
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* 指定文章配置:关于我们、用户推广协议、隐私协议
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function config(Request $request)
|
||||||
|
{
|
||||||
|
return response()->json([
|
||||||
|
'about_us'=>app_settings('app.article_about_us', ''),
|
||||||
|
'user_promotion_agreement'=> app_settings('app.article_user_promotion_agreement', ''),
|
||||||
|
'user_hide_agreement' => app_settings('app.article_user_hide_agreement', ''),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @param \Illuminate\Http\Request $request
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function index(Request $request)
|
||||||
|
{
|
||||||
|
$cate = (string) $request->query('cate');
|
||||||
|
$key = (string) $request->query('key');
|
||||||
|
$categoryId = Arr::get([
|
||||||
|
'help'=> app_settings('app.article_help'),
|
||||||
|
'agreement'=> app_settings('app.article_agreement'),
|
||||||
|
'health'=> app_settings('app.article_health'),
|
||||||
|
], $cate);
|
||||||
|
$query = Article::query()->with(['likesInfo'=>function ($q) use ($request) {
|
||||||
|
$user_id = $request->user()?->id;
|
||||||
|
return $q->where('user_id', $user_id ?? 0);
|
||||||
|
}])->where('is_show', 1);
|
||||||
|
if ($categoryId) {
|
||||||
|
$query->where('category_id', $categoryId);
|
||||||
|
}
|
||||||
|
if ($key) {
|
||||||
|
$query->where('title', 'like', '%'.$key.'%');
|
||||||
|
}
|
||||||
|
|
||||||
|
$query->orderBy('is_recommend', 'desc');
|
||||||
|
$query->orderBy('sort', 'desc');
|
||||||
|
$query->orderBy('created_at', 'desc');
|
||||||
|
|
||||||
|
$list = $query->simplePaginate(PaginatorHelper::resolvePerPage('per_page', 20, 50));
|
||||||
|
return ArticleSimpleResource::collection($list);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function healthCategory(Request $request)
|
||||||
|
{
|
||||||
|
$key = (string) $request->query('key');
|
||||||
|
$categoryId = app_settings('app.article_health');
|
||||||
|
$query = ArticleCategory::query()->where('parent_id', $categoryId)->where('is_show', 1);
|
||||||
|
|
||||||
|
if ($key) {
|
||||||
|
$query->where('name', 'like', '%'.$key.'%');
|
||||||
|
}
|
||||||
|
|
||||||
|
$query->orderBy('is_recommend', 'desc');
|
||||||
|
$query->orderBy('sort', 'desc');
|
||||||
|
$query->orderBy('created_at', 'desc');
|
||||||
|
|
||||||
|
$categories = $query->get();
|
||||||
|
|
||||||
|
return ArticleCategoryResource::collection($categories);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function articleList($id, Request $request)
|
||||||
|
{
|
||||||
|
$key = (string) $request->query('key');
|
||||||
|
$categoryId = $id;
|
||||||
|
$query = Article::query()->with(['likesInfo'=>function ($q) use ($request) {
|
||||||
|
$user_id = $request->user()?->id;
|
||||||
|
return $q->where('user_id', $user_id ?? 0);
|
||||||
|
}])->where('is_show', 1);
|
||||||
|
if ($categoryId) {
|
||||||
|
$query->where('category_id', $categoryId);
|
||||||
|
}
|
||||||
|
if ($key) {
|
||||||
|
$query->where('title', 'like', '%'.$key.'%');
|
||||||
|
}
|
||||||
|
|
||||||
|
$query->orderBy('is_recommend', 'desc');
|
||||||
|
$query->orderBy('sort', 'desc');
|
||||||
|
$query->orderBy('created_at', 'desc');
|
||||||
|
|
||||||
|
$list = $query->simplePaginate(PaginatorHelper::resolvePerPage('per_page', 20, 50));
|
||||||
|
return ArticleSimpleResource::collection($list);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文章详情
|
||||||
|
*
|
||||||
|
* @param [type] $id
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function show($id, Request $request)
|
||||||
|
{
|
||||||
|
$article = Article::with(['likesInfo'=>function ($q) use ($request) {
|
||||||
|
return $q->where('user_id', $request->user()->id);
|
||||||
|
}])->where('is_show', 1)->findOrFail($id);
|
||||||
|
return ArticleResource::make($article);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文章点赞
|
||||||
|
*
|
||||||
|
* @param [type] $id
|
||||||
|
* @param Request $request
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function like($id, Request $request)
|
||||||
|
{
|
||||||
|
$article = Article::where('is_show', 1)->findOrFail($id);
|
||||||
|
if (ArticleLikesLog::where('user_id', $request->user()->id)->where('article_id', $article->id)->exists()) {
|
||||||
|
throw new BizException('您已点赞过这篇文章');
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
DB::beginTransaction();
|
||||||
|
ArticleLikesLog::create([
|
||||||
|
'article_id' => $article->id,
|
||||||
|
'user_id' => $request->user()->id,
|
||||||
|
]);
|
||||||
|
$article->increment('likes');
|
||||||
|
DB::commit();
|
||||||
|
} catch (Throwable $th) {
|
||||||
|
DB::rollBack();
|
||||||
|
report($th);
|
||||||
|
throw new BizException('系统繁忙,请稍后再试');
|
||||||
|
}
|
||||||
|
return response()->noContent();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 阅读加积分接口
|
||||||
|
*
|
||||||
|
* @param [type] $id
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function read($id, Request $request, PointsService $pointsService)
|
||||||
|
{
|
||||||
|
$article = Article::where('is_show', 1)->findOrFail($id);
|
||||||
|
if ($article->points > 0) {
|
||||||
|
if (ArticlePointsLog::where('user_id', $request->user()->id)->whereDate('created_at', now())->exists()) {
|
||||||
|
throw new BizException('您今天已拿过积分了,请明天再来');
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
DB::beginTransaction();
|
||||||
|
ArticlePointsLog::create([
|
||||||
|
'user_id' => $request->user()->id,
|
||||||
|
'article_id' => $article->id,
|
||||||
|
]);
|
||||||
|
$pointsService->sendPoints(PointsLog::TYPE_READ, $request->user(), $article->points, '阅读文章送积分');
|
||||||
|
DB::commit();
|
||||||
|
} catch (Throwable $th) {
|
||||||
|
DB::rollBack();
|
||||||
|
report($th);
|
||||||
|
throw new BizException('系统繁忙,请稍后再试');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return response()->json([
|
||||||
|
'points'=>$article->points,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
namespace App\Endpoint\Api\Http\Controllers;
|
namespace App\Endpoint\Api\Http\Controllers;
|
||||||
|
|
||||||
use App\Endpoint\Api\Http\Resources\{VipResource, UserVipResource};
|
use App\Endpoint\Api\Http\Resources\{VipResource, UserVipResource};
|
||||||
use App\Models\Vip;
|
use App\Models\{Vip, UserVip};
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use Illuminate\Support\Facades\DB;
|
use Illuminate\Support\Facades\DB;
|
||||||
use App\Exceptions\BizException;
|
use App\Exceptions\BizException;
|
||||||
|
|
@ -43,7 +43,7 @@ class VipController extends Controller
|
||||||
{
|
{
|
||||||
$user = $request->user();
|
$user = $request->user();
|
||||||
|
|
||||||
$query = $user->vips()->where('status', 1);
|
$query = $user->vips()->where('status', UserVip::STATUS_SUCCESS);
|
||||||
|
|
||||||
$list = $query->paginate($request->input('per_page'));
|
$list = $query->paginate($request->input('per_page'));
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -73,13 +73,8 @@ Route::group([
|
||||||
Route::get('product/products/{product}', [ProductSkuController::class, 'show']);
|
Route::get('product/products/{product}', [ProductSkuController::class, 'show']);
|
||||||
//查看搜索热词
|
//查看搜索热词
|
||||||
Route::get('product/search-hot-keys', [ProductSkuController::class, 'searchHotKeys']);
|
Route::get('product/search-hot-keys', [ProductSkuController::class, 'searchHotKeys']);
|
||||||
//文章列表
|
|
||||||
Route::get('articles', [ArticleController::class, 'index']);
|
|
||||||
Route::get('articles/health-category', [ArticleController::class, 'healthCategory']);
|
|
||||||
Route::get('articles/by-category/{category}', [ArticleController::class, 'articleList']);
|
|
||||||
|
|
||||||
//指定文章配置
|
//指定文章配置
|
||||||
Route::get('article-config', [ArticleController::class, 'config']);
|
|
||||||
//获取最新app版本信息
|
//获取最新app版本信息
|
||||||
Route::get('app-version', [AppVersionController::class, 'index']);
|
Route::get('app-version', [AppVersionController::class, 'index']);
|
||||||
//绑定用户端cid
|
//绑定用户端cid
|
||||||
|
|
@ -170,11 +165,6 @@ Route::group([
|
||||||
// 我的优惠券
|
// 我的优惠券
|
||||||
Route::get('coupons', [UserCouponController::class, 'index']);
|
Route::get('coupons', [UserCouponController::class, 'index']);
|
||||||
|
|
||||||
//文章
|
|
||||||
Route::get('articles/{article}', [ArticleController::class, 'show']);
|
|
||||||
Route::post('articles/{article}/read', [ArticleController::class, 'read']);
|
|
||||||
Route::post('articles/{article}/like', [ArticleController::class, 'like']);
|
|
||||||
|
|
||||||
//签到
|
//签到
|
||||||
Route::get('click', [ClickController::class, 'index']);
|
Route::get('click', [ClickController::class, 'index']);
|
||||||
Route::post('click', [ClickController::class, 'click']);
|
Route::post('click', [ClickController::class, 'click']);
|
||||||
|
|
@ -224,11 +214,25 @@ Route::group([
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// 门店提货
|
||||||
Route::get('store/{id}/products', [StoreController::class, 'products']);
|
Route::get('store/{id}/products', [StoreController::class, 'products']);
|
||||||
Route::apiResource('store', StoreController::class)->only(['index', 'show']);
|
Route::apiResource('store', StoreController::class)->only(['index', 'show']);
|
||||||
|
|
||||||
|
// 门店下单
|
||||||
Route::group(['middleware' => ['auth:api', \App\Endpoint\Api\Http\Middleware\CheckUserStatus::class]], function () {
|
Route::group(['middleware' => ['auth:api', \App\Endpoint\Api\Http\Middleware\CheckUserStatus::class]], function () {
|
||||||
Route::post('order-pre', [App\Endpoint\Api\Http\Controllers\Order\OrderPreController::class, 'store']);
|
Route::post('order-pre', [App\Endpoint\Api\Http\Controllers\Order\OrderPreController::class, 'store']);
|
||||||
Route::post('order-pre/order', [App\Endpoint\Api\Http\Controllers\Order\OrderPreController::class, 'storeOrder']);
|
Route::post('order-pre/order', [App\Endpoint\Api\Http\Controllers\Order\OrderPreController::class, 'storeOrder']);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// 文章
|
||||||
|
Route::get('articles/category', [ArticleController::class, 'category']);
|
||||||
|
Route::get('articles/category-tree', [ArticleController::class, 'categoryTree']);
|
||||||
|
/** 以前的路由 */
|
||||||
|
Route::get('article-config', [ArticleController::class, 'config']);
|
||||||
|
Route::get('articles', [ArticleController::class, 'index']);
|
||||||
|
Route::group(['middleware' => ['auth:api', \App\Endpoint\Api\Http\Middleware\CheckUserStatus::class]], function () {
|
||||||
|
Route::get('articles/{article}', [ArticleController::class, 'show']);
|
||||||
|
Route::post('articles/{article}/read', [ArticleController::class, 'read']);
|
||||||
|
Route::post('articles/{article}/like', [ArticleController::class, 'like']);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -44,4 +44,14 @@ class ArticleCategory extends Model
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function scopeShow($q)
|
||||||
|
{
|
||||||
|
return $q->where('is_show', 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function scopeSort($q)
|
||||||
|
{
|
||||||
|
return $q->orderBy('is_recommend', 'desc')->orderBy('sort', 'desc')->orderBy('created_at', 'desc');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,10 @@ class UserVip extends Model
|
||||||
{
|
{
|
||||||
use HasFactory;
|
use HasFactory;
|
||||||
|
|
||||||
|
const STATUS_UNPAID = 0;
|
||||||
|
const STATUS_SUCCESS = 1;
|
||||||
|
const STATUS_PROCESSING = 2;
|
||||||
|
|
||||||
protected $fillable = ['user_id', 'vip_id', 'name', 'price', 'times', 'gift', 'status', 'success_time'];
|
protected $fillable = ['user_id', 'vip_id', 'name', 'price', 'times', 'gift', 'status', 'success_time'];
|
||||||
|
|
||||||
protected $casts = [
|
protected $casts = [
|
||||||
|
|
@ -16,6 +20,12 @@ class UserVip extends Model
|
||||||
'gift' => 'json'
|
'gift' => 'json'
|
||||||
];
|
];
|
||||||
|
|
||||||
|
public static $statusMap = [
|
||||||
|
self::STATUS_UNPAID => '待付款',
|
||||||
|
self::STATUS_SUCCESS => '已付款',
|
||||||
|
self::STATUS_PROCESSING => '处理中'
|
||||||
|
];
|
||||||
|
|
||||||
public function user()
|
public function user()
|
||||||
{
|
{
|
||||||
return $this->belongsTo(User::class, 'user_id');
|
return $this->belongsTo(User::class, 'user_id');
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,9 @@ class Vip extends Model
|
||||||
const TIME_MONTH = 'month';
|
const TIME_MONTH = 'month';
|
||||||
const TIME_DAY = 'day';
|
const TIME_DAY = 'day';
|
||||||
|
|
||||||
|
const STATUS_ENABLE = 1;
|
||||||
|
const STATUS_DISABLE = 0;
|
||||||
|
|
||||||
protected $fillable = ['name', 'times', 'sort', 'status', 'gift', 'price', 'description'];
|
protected $fillable = ['name', 'times', 'sort', 'status', 'gift', 'price', 'description'];
|
||||||
|
|
||||||
protected $casts = [
|
protected $casts = [
|
||||||
|
|
@ -29,6 +32,11 @@ class Vip extends Model
|
||||||
self::TIME_DAY => '天',
|
self::TIME_DAY => '天',
|
||||||
];
|
];
|
||||||
|
|
||||||
|
public static $statusMap = [
|
||||||
|
self::STATUS_ENABLE => '可用',
|
||||||
|
self::STATUS_DISABLE => '不可用'
|
||||||
|
];
|
||||||
|
|
||||||
protected static function booted()
|
protected static function booted()
|
||||||
{
|
{
|
||||||
static::addGlobalScope('sort', function (Builder $builder) {
|
static::addGlobalScope('sort', function (Builder $builder) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue