浏览代码

wesmiler 报恩寺项目

wesmiler 3 年之前
父节点
当前提交
d4293a367f

+ 15 - 1
app/Helpers/common.php

@@ -1186,13 +1186,27 @@ if (!function_exists('message')) {
      */
     function message($msg = "操作成功", $success = true, $data = [], $code = 0)
     {
+        $msg = is_int($msg)? lang($msg, 'api') : $msg;
         $result = ['success' => $success, 'msg' => $msg, 'data' => $data];
         if ($success) {
             $result['code'] = 0;
         } else {
             $result['code'] = $code ? $code : -1;
         }
-        return $result;
+        return json_encode($result, 256);
+    }
+}
+
+if (!function_exists('lang')) {
+    /**
+     * 语言转换
+     * @param $value
+     * @return array|\Illuminate\Contracts\Translation\Translator|null|string
+     */
+    function lang($value, $app = 'api')
+    {
+        $value = $app ? $app . '.' . $value : $value;
+        return trim(trans($value), $app . '.');
     }
 }
 

+ 2 - 2
app/Http/Controllers/Api/TestController.php

@@ -10,7 +10,7 @@ use App\Services\SnapshotService;
 use Illuminate\Support\Facades\Session;
 
 /**
- * 测试控制器
+ * 测试控制器类
  * @author wesmiler
  * @since 2020/11/10
  * Class TestController
@@ -34,7 +34,7 @@ class TestController extends BaseController
 
 
 
-        return message('操作成功','true',['ddd'=> []]);
+        return message(1005,'true',['ddd'=> []]);
 
     }
 }

+ 46 - 0
app/Http/Controllers/Api/v1/ActivityController.php

@@ -0,0 +1,46 @@
+<?php
+
+namespace App\Http\Controllers\Api\v1;
+
+use App\Http\Controllers\Api\BaseController;
+use App\Http\Validator\ActivityValidator;
+use App\Services\ActivityService;
+use Illuminate\Http\Request;
+
+/**
+ * 寺院活动控制器类
+ * @author wesmiler
+ * @since 2020/11/10
+ * Class ActivityController
+ * @package App\Http\Controllers
+ */
+class ActivityController extends BaseController
+{
+    /**
+     * 构造函数
+     * @author wesmiler
+     * @since 2020/11/11
+     * ActivityController constructor.
+     */
+    public function __construct()
+    {
+        parent::__construct();
+
+        $this->service = new ActivityService();
+    }
+
+    /**
+     * 活动报名
+     * @param Request $request
+     * @param ActivityValidator $validate
+     * @return array
+     */
+    public function books(Request $request, ActivityValidator $validate){
+        $params = $validate->check($request->all(),'books');
+        if(!is_array($params)){
+            return message($params, false);
+        }
+
+        return $this->service->books($this->userId);
+    }
+}

+ 2 - 2
app/Http/Controllers/Api/v1/MemberController.php

@@ -6,10 +6,10 @@ use App\Http\Controllers\Api\BaseController;
 use App\Services\MemberService;
 
 /**
- * 会员控制器
+ * 会员控制器类
  * @author wesmiler
  * @since 2020/11/10
- * Class TestController
+ * Class MemberController
  * @package App\Http\Controllers
  */
 class MemberController extends BaseController

+ 29 - 0
app/Http/Controllers/Api/v1/SiyuanController.php

@@ -0,0 +1,29 @@
+<?php
+
+namespace App\Http\Controllers\Api\v1;
+
+use App\Http\Controllers\Api\BaseController;
+use App\Services\SiyuanService;
+
+/**
+ * 寺院控制器类
+ * @author wesmiler
+ * @since 2020/11/10
+ * Class SiyuanController
+ * @package App\Http\Controllers
+ */
+class SiyuanController extends BaseController
+{
+    /**
+     * 构造函数
+     * @author wesmiler
+     * @since 2020/11/11
+     * SiyuanController constructor.
+     */
+    public function __construct()
+    {
+        parent::__construct();
+
+        $this->service = new SiyuanService();
+    }
+}

+ 49 - 0
app/Http/Validator/ActivityValidator.php

@@ -0,0 +1,49 @@
+<?php
+namespace App\Http\Validator;
+class ActivityValidator extends BaseValidator
+{
+    // 当前模型所有验证规则
+    public static $rules = [
+        'id' => 'required',
+        'coupon_give' => 'required|string|min:1|max:10',
+        'gd_name' => 'required|string|min:2|max:30',
+        'ws_name' => 'required|string|min:2|max:30',
+        'xy_content' => 'string|min:4|max:200',
+    ];
+
+    // 当前模型所有错误提示信息
+    public static $msgs = [
+        'required' => ':attribute不能为空',
+        'string' => ':attribute必须是字符串',
+        'min' => ':attribute长度不能小于:min位',
+        'max' => ':attribute长度不能大于:max位',
+        'exists' => ':attribute不存在',
+        'rule' => ':attribute格式不正确',
+    ];
+
+    // 当前模型所有验证字段
+    public static $fields = [
+        'id' => '活动ID',
+        'coupon' => '随喜券数',
+        'gd_name' => '功德主',
+        'ws_name' => '往生者',
+        'xy_content' => '心愿',
+    ];
+
+    // 当前模型所有验证场景
+    public static $scenes = [
+        'info'=> ['id'],
+        'books'=> ['id','gd_name','ws_name','xy_content'],
+    ];
+
+    /**
+     * 验证
+     * @param $request
+     * @param string $scene
+     * @return int|mixed
+     */
+    public static function check($request, $scene=''){
+        $validator = new BaseValidator(self::$rules, self::$msgs, self::$fields, self::$scenes);
+        return $validator->checkParams($request, $scene);
+    }
+}

+ 56 - 0
app/Http/Validator/BaseValidator.php

@@ -0,0 +1,56 @@
+<?php
+namespace App\Http\Validator;
+use Illuminate\Support\Facades\Validator;
+class BaseValidator extends Validator
+{
+    // 当前模型所有验证规则
+    public static $rules = [];
+
+    // 当前模型所有错误提示信息
+    public static $msgs = [];
+
+    // 当前模型所有验证字段
+    public static $fields = [];
+
+    // 当前模型所有验证场景
+    public static $scenes = [];
+
+    public function __construct($rules=[], $msgs=[], $fields=[], $scens=[])
+    {
+        self::$rules = $rules;
+        self::$msgs = $msgs;
+        self::$fields = $fields;
+        self::$scenes = $scens;
+    }
+
+    /**
+     * 验证表单或请求参数
+     * @param $request 请求数据
+     * @param string $scene 场景,为空则全部验证
+     * @return int|mixed
+     */
+    public function checkParams($request, $scene=''){
+        // 存在验证场景
+        if($scene){
+            $sceneFields = isset(self::$scenes[$scene])? self::$scenes[$scene] : [];
+            if(empty($sceneFields)){
+                return 1007;
+            }
+
+            foreach (self::$rules as $key => $rule){
+                if(!in_array($key, $sceneFields)){
+                    unset(self::$rules[$key]);
+                    unset(self::$fields[$key]);
+                }
+            }
+        }
+
+        // 验证数据
+        $validator = Validator::make($request, self::$rules, self::$msgs, self::$fields);
+        if ($validator->fails()) {
+            return getValidatorError($validator);
+        }
+
+        return $request;
+    }
+}

+ 42 - 0
app/Http/Validator/TestValidator.php

@@ -0,0 +1,42 @@
+<?php
+namespace App\Http\Validator;
+class TestValidator extends BaseValidator
+{
+    // 当前模型所有验证规则
+    public static $rules = [
+        'params' => 'required|string|min:4|max:500',
+        'key' => 'required|string|min:16|max:32',
+    ];
+
+    // 当前模型所有错误提示信息
+    public static $msgs = [
+        'required' => ':attribute不能为空',
+        'string' => ':attribute必须是字符串',
+        'min' => ':attribute长度不能小于:min位',
+        'max' => ':attribute长度不能大于:max位',
+        'exists' => ':attribute不存在',
+        'rule' => ':attribute格式不正确',
+    ];
+
+    // 当前模型所有验证字段
+    public static $fields = [
+        'params' => '请求参数',
+        'key' => '签名参数',
+    ];
+
+    // 当前模型所有验证场景
+    public static $scenes = [
+        'auth'=> ['params','key'],
+    ];
+
+    /**
+     * 验证
+     * @param $request
+     * @param string $scene
+     * @return int|mixed
+     */
+    public static function check($request, $scene=''){
+        $validator = new BaseValidator(self::$rules, self::$msgs, self::$fields, self::$scenes);
+        return $validator->checkParams($request, $scene);
+    }
+}

+ 113 - 0
app/Services/ActivityService.php

@@ -11,7 +11,11 @@
 
 namespace App\Services;
 
+use App\Models\ActivityBooksModel;
 use App\Models\ActivityModel;
+use App\Models\MemberModel;
+use App\Models\TradeModel;
+use Illuminate\Support\Facades\DB;
 
 /**
  * 寺院活动管理-服务类
@@ -22,6 +26,8 @@ use App\Models\ActivityModel;
  */
 class ActivityService extends BaseService
 {
+    protected static $instance = null;
+
     /**
      * 构造函数
      * @author wesmiler
@@ -31,6 +37,21 @@ class ActivityService extends BaseService
     public function __construct()
     {
         $this->model = new ActivityModel();
+        $this->bookModel = new ActivityBooksModel();
+        $this->memberModel = new MemberModel();
+        $this->tradeModel = new TradeModel();
+    }
+
+    /**
+     * 静态入口
+     * @return ActivityService()|null
+     */
+    public static function make(){
+        if(!self::$instance){
+            self::$instance = new ActivityService();
+        }
+
+        return self::$instance;
     }
 
     /**
@@ -71,4 +92,96 @@ class ActivityService extends BaseService
         return parent::edit($data); // TODO: Change the autogenerated stub
     }
 
+    /**
+     * 报名处理
+     * @param $userId 用户ID
+     * @return array
+     */
+    public function books($userId){
+        $params = request()->all();
+        $gdName = isset($params['gd_name'])? trim($params['gd_name']) : '';
+        $wsName = isset($params['ws_name'])? trim($params['ws_name']) : '';
+        $couponGive = isset($params['coupon_give'])? intval($params['coupon_give']) : 0;
+        $xyContent = isset($params['xy_content'])? trim($params['xy_content']) : '';
+
+        // 验证活动
+        $aid = isset($params['id'])? intval($params['id']) : 0;
+        $activityInfo = $this->model::where(['id'=> $aid, 'status'=> 1, 'mark'=> 1])
+            ->select(['id','type','price','status','publish_at'])
+            ->first();
+
+        $activityInfo = $activityInfo? $activityInfo->toArray() : [];
+        if(empty($activityInfo)){
+            return message('活动不存在或已取消', false);
+        }
+
+        $coupon = isset($activityInfo['price'])? $activityInfo['price'] : 0;
+        $publishAt = isset($activityInfo['publish_at'])? $activityInfo['publish_at'] : '';
+        $type = isset($activityInfo['type'])? $activityInfo['type'] : 1;
+        $times = $publishAt? explode('-', $publishAt) : [];
+        $timeStart = isset($times[0])? $times[0] : '';
+        $timeEnd = isset($times[1])? $times[1] : '';
+        $curDate = date('m-d');
+        if($timeStart && $timeEnd && ($curDate< $timeStart || $curDate > $timeEnd)){
+            return message('活动已结束', false);
+        }
+
+        // 验证账户
+        $couponTotal = intval($couponGive+$coupon);
+        $memberInfo = $this->memberModel::where(['id'=> $userId, 'status'=>1])->select(['id','coupon','nickname'])->first();
+        if(!$memberInfo){
+            return message('当前账户已冻结或用户不存在无法操作', false);
+        }
+
+        $memberCoupon = $memberInfo->coupon;
+        if($memberCoupon < $couponTotal){
+            return message('您的账户不足,请先充值', false,[],'1003');
+        }
+
+        $data = [
+            'aid'=> $aid,
+            'user_id'=> $userId,
+            'order_sn'=> get_order_num('B'),
+            'coupon'=> $coupon,
+            'coupon_give'=> $couponGive,
+            'gd_name'=> $gdName,
+            'ws_name'=> $wsName,
+            'xy_content'=> $xyContent,
+            'create_time'=> time(),
+            'status'=> 1,
+        ];
+
+        // 扣款和处理
+        DB::beginTransaction();
+        if(!$this->memberModel::where(['id'=> $userId, 'status'=>1])->decrement('coupon', $couponTotal)){
+            DB::rollBack();
+            return message('账户扣除失败', false);
+        }
+
+        // 交易明细
+        $types = [1=>'代订', 2=>'助印',3=>'供奉'];
+        $typeName = isset($types[$type])? $types[$type] : '参加寺院活动';
+        $tradeData = [
+            'user_id'=> $userId,
+            'type'=> 1,
+            'money'=> $couponTotal,
+            'balance'=> $memberCoupon,
+            'create_time'=> time(),
+            'remark'=> "用户{$memberInfo->nickname}{$typeName}消费{$couponTotal}券",
+        ];
+
+        if(!$this->tradeModel::insert($tradeData)){
+            DB::rollBack();
+            return message('交易处理失败', false);
+        }
+
+        // 报名记录
+        if(!$bid = $this->bookModel::insert($data)){
+            DB::rollBack();
+            return message('报名处理失败', false);
+        }
+
+        DB::commit();
+        return message('请上传活动图片', true, ['id'=> $bid]);
+    }
 }

+ 14 - 0
app/Services/MemberService.php

@@ -25,6 +25,8 @@ use App\Models\SiyuanModel;
  */
 class MemberService extends BaseService
 {
+    protected  static  $instance = null;
+
     /**
      * 构造函数
      * @author wesmiler
@@ -38,6 +40,18 @@ class MemberService extends BaseService
     }
 
     /**
+     * 静态入口
+     * @return MemberService|null
+     */
+    public static function make(){
+        if(!self::$instance){
+            self::$instance = new MemberService();
+        }
+
+        return self::$instance;
+    }
+
+    /**
      * 添加会编辑会员
      * @return array
      * @since 2020/11/11

+ 12 - 0
resources/lang/en/api.php

@@ -0,0 +1,12 @@
+<?php
+/**
+ * 错误码
+ */
+return [
+    // 公共
+    '1005' => '获取数据成功',
+    '1006' => '获取数据失败',
+    '1007' => '操作成功',
+    '1008' => '操作失败',
+
+];

+ 12 - 1
routes/api.php

@@ -19,7 +19,7 @@ Route::middleware('auth:api')->get('/user', function (Request $request) {
 });
 
 // 接口路由
-Route::post('/test', [\App\Http\Controllers\Api\TestController::class, 'index']);
+Route::any('/test', [\App\Http\Controllers\Api\TestController::class, 'index']);
 Route::get('/logout', [\App\Http\Controllers\Api\TestController::class, 'logout']);
 
 // 授权登陆
@@ -29,3 +29,14 @@ Route::post('/auth/weixin', [\App\Http\Controllers\Api\AuthController::class, 'c
 
 // 用户
 Route::post('/member/info', [\App\Http\Controllers\Api\v1\MemberController::class, 'info']);
+
+// 寺院
+Route::post('/siyuan/list', [\App\Http\Controllers\Api\v1\SiyuanController::class, 'list']);
+Route::post('/siyuan/info', [\App\Http\Controllers\Api\v1\SiyuanController::class, 'info']);
+
+
+// 寺院活动
+Route::post('/activity/list', [\App\Http\Controllers\Api\v1\ActivityController::class, 'index']);
+Route::post('/activity/info', [\App\Http\Controllers\Api\v1\ActivityController::class, 'info']);
+Route::post('/activity/books', [\App\Http\Controllers\Api\v1\ActivityController::class, 'books']);
+