Răsfoiți Sursa

'1121-1853'

zory 3 săptămâni în urmă
părinte
comite
a6190c40cc

+ 144 - 0
app/controller/admin/Agent.php

@@ -0,0 +1,144 @@
+<?php
+
+namespace app\controller\admin;
+
+use app\extra\basic\Base;
+use app\extra\service\agent\UserService;
+use app\extra\tools\CodeExtend;
+use app\middleware\AuthMiddleware;
+use app\model\saas\SaasAgent;
+use app\model\system\SystemUser;
+use app\validate\user\AgentValidate;
+use DI\Attribute\Inject;
+use Hzdad\Codecheck\Codecheck;
+use LinFly\Annotation\Route\Controller;
+use LinFly\Annotation\Route\Route;
+use support\Request;
+use support\Response;
+use Webman\Annotation\Middleware;
+
+/**
+ * 代理
+ */
+#[Controller(prefix: "/api/agent"),Middleware(AuthMiddleware::class)]
+class Agent extends Base
+{
+
+
+    #[Inject]
+    protected AgentValidate $validate;
+
+    #[Inject]
+    protected SaasAgent $model;
+
+    #[Inject]
+    protected UserService $service;
+
+    protected string $scene = "edit";
+
+
+    /**
+     * 代理列表
+     */
+    #[Route(path: "list",methods: "get")]
+    public function getAgentList(Request $request): Response
+    {
+        try {
+            $param = $request->get();
+            $list = $this->service->getList($param);
+            return successTrans(100010,pageFormat($list),200);
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+
+    /**
+     * 新增/编辑代理
+     * @param Request $request
+     * @return Response
+     */
+    #[Route(path: "save",methods: "post")]
+    public function save(Request $request): Response
+    {
+        try {
+            $param = $request->post();
+            if (!isset($param['id'])) {
+                $this->scene = "add";
+                $code = (new Codecheck)->mobile($param['mobile'])->scene($param['scene'])->code($param['yzm'])->check();
+                if (!$code) return errorTrans("error.sms-err");
+                $param['user_id'] = $param['agent_id'] = CodeExtend::random(16,1,date("md"));
+                if (!empty($param['username'])) {
+                    $userName = (new SystemUser)->where("username",$param['username'])->findOrEmpty();
+                    if (!$userName->isEmpty()) return errorTrans("error.user-exist");
+                }
+            }
+            if (!$this->validate->scene($this->scene)->check($request->post())) return error($this->validate->getError());
+            $state = $this->model->setAutoData($param);
+            if (!$state) return errorTrans("error.data");
+            $this->sceneUser($param,2);
+            return successTrans("success.data");
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+
+    /**
+     * @param Request $request
+     * @return Response
+     */
+    #[Route(path: "batch",methods: "post")]
+    public function setBatchData(Request $request): Response
+    {
+        try {
+            $param = $this->_valid([
+                "id.require"        => trans("empty.require"),
+                "value.require"     => trans("empty.require"),
+                "field.require"     => trans("empty.require"),
+                "type.require"      => trans("empty.require"),
+            ],"post");
+            if (!is_array($param)) return error($param);
+            if ($param['type'] == "batch") {
+                $state = $this->model->where("id","in",$param['id'])->save([$param['field'] => $param['value']]);
+            } else {
+                $state = $this->model->where("id",$param['id'])->save([$param['field'] => $param['value']]);
+            }
+            if (!$state) return errorTrans("error.data");
+            return successTrans("success.data");
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+
+    /**
+     * 删除
+     * @param Request $request
+     * @return Response
+     */
+    #[Route(path: "del",methods: "post")]
+    public function delUser(Request $request): Response
+    {
+        try {
+            $param = $this->_valid([
+                "id.require"    => trans("empty.require"),
+                "type.default"  => "one",
+            ],"post");
+            if (!is_array($param)) return error($param);
+            if ($param['type'] == "batch") {
+                $state = $this->model->where("id","in",$param['id'])->delete();
+            } else {
+                $data = $this->model->where("id",$param['id'])->findOrEmpty();
+                if ($data->isEmpty()) return errorTrans("empty.data");
+                // 删除其他相关数据
+                $state = $data->delete();
+            }
+            if (!$state) return errorTrans("error.data");
+            return successTrans("success.data");
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+}

+ 79 - 0
app/controller/admin/Store.php

@@ -0,0 +1,79 @@
+<?php
+
+namespace app\controller\admin;
+
+use app\extra\basic\Base;
+use app\extra\service\agent\StoreService;
+use app\extra\tools\CodeExtend;
+use app\middleware\AuthMiddleware;
+use app\model\saas\SaasStore;
+use app\model\system\SystemUser;
+use app\validate\user\StoreValidate;
+use DI\Attribute\Inject;
+use Hzdad\Codecheck\Codecheck;
+use LinFly\Annotation\Route\Controller;
+use LinFly\Annotation\Route\Route;
+use support\Request;
+use support\Response;
+use Webman\Annotation\Middleware;
+
+/**
+ * 门店
+ */
+#[Controller(prefix: "/api/store"),Middleware(AuthMiddleware::class)]
+class Store extends Base
+{
+    #[Inject]
+    protected StoreService $service;
+
+    #[Inject]
+    protected StoreValidate $validate;
+
+    #[Inject]
+    protected SaasStore $model;
+
+    protected string $scene = "edit";
+
+    public function getStoreList(Request $request): Response
+    {
+        try {
+            $param = $request->get();
+            $list = $this->service->getList($param);
+            return successTrans(100010,pageFormat($list),200);
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+
+    /**
+     * 新增/编辑代理
+     * @param Request $request
+     * @return Response
+     */
+    #[Route(path: "save",methods: "post")]
+    public function save(Request $request): Response
+    {
+        try {
+            $param = $request->post();
+            if (!isset($param['id'])) {
+                $this->scene = "add";
+                $code = (new Codecheck)->mobile($param['mobile'])->scene($param['scene'])->code($param['yzm'])->check();
+                if (!$code) return errorTrans("error.sms-err");
+                $param['user_id'] = $param['agent_id'] = CodeExtend::random(16,1,date("md"));
+                if (!empty($param['username'])) {
+                    $userName = (new SystemUser)->where("username",$param['username'])->findOrEmpty();
+                    if (!$userName->isEmpty()) return errorTrans("error.user-exist");
+                }
+            }
+            if (!$this->validate->scene($this->scene)->check($request->post())) return error($this->validate->getError());
+            $state = $this->model->setAutoData($param);
+            if (!$state) return errorTrans("error.data");
+            $this->sceneUser($param,3);
+            return successTrans("success.data");
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+}

+ 146 - 0
app/controller/admin/User.php

@@ -0,0 +1,146 @@
+<?php
+
+namespace app\controller\admin;
+
+use app\extra\basic\Base;
+use app\extra\service\system\UserService;
+use app\extra\tools\CodeExtend;
+use app\middleware\AuthMiddleware;
+use app\model\system\SystemUser;
+use app\validate\user\UserValidate;
+use DI\Attribute\Inject;
+use Hzdad\Codecheck\Codecheck;
+use LinFly\Annotation\Route\Controller;
+use LinFly\Annotation\Route\Route;
+use support\Request;
+use support\Response;
+use Webman\Annotation\Middleware;
+
+/**
+ * 用户
+ */
+#[Controller(prefix: "/api/user"),Middleware(AuthMiddleware::class)]
+class User extends Base
+{
+
+    #[Inject]
+    protected UserService $service;
+
+    #[Inject]
+    protected UserValidate $validate;
+
+    #[Inject]
+    protected SystemUser $model;
+
+    protected string $scene = "edit";
+
+    /**
+     * 用户列表
+     * @param Request $request
+     * @return Response
+     */
+    #[Route(path: "list",methods: "get")]
+    public function getUserList(Request $request): Response
+    {
+        try {
+            $param = $request->get();
+            $list = $this->service->getList($param);
+            return successTrans("success.data",pageFormat($list),200);
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+
+    /**
+     * 新增/编辑代理
+     * @param Request $request
+     * @return Response
+     */
+    #[Route(path: "save",methods: "post")]
+    public function save(Request $request): Response
+    {
+        try {
+            $param = $request->post();
+            if (!isset($param['id'])) {
+                $this->scene = "add";
+                $code = (new Codecheck)->mobile($param['mobile'])->scene($param['scene'])->code($param['yzm'])->check();
+                if (!$code) return errorTrans("error.sms-err");
+                $param['type'] = 2;
+                $param['user_id'] = CodeExtend::random(16,1,date("md"));
+            }
+            $param['salt'] = strtoupper(CodeExtend::random(10,3));
+            if (!empty($param['password'])) {
+                $param['password'] = md5($param['password'].$param['salt']);
+            }
+            if (!empty($param['username'])) {
+                $userName = $this->model->where("username",$param['username'])->findOrEmpty();
+                if (!$userName->isEmpty()) return errorTrans("error.user-exist");
+            }
+            if (!$this->validate->scene($this->scene)->check($request->post())) return error($this->validate->getError());
+            $state = $this->model->setAutoData($param);
+            if (!$state) return errorTrans("error.data");
+            return successTrans("success.data");
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+    /**
+     * @param Request $request
+     * @return Response
+     */
+    #[Route(path: "batch",methods: "post")]
+    public function setBatchData(Request $request): Response
+    {
+        try {
+            $param = $this->_valid([
+                "id.require"        => trans("empty.require"),
+                "value.require"     => trans("empty.require"),
+                "field.require"     => trans("empty.require"),
+                "type.require"      => trans("empty.require"),
+            ],"post");
+            if (!is_array($param)) return error($param);
+            if ($param['type'] == "batch") {
+                $state = $this->model->where("id","in",$param['id'])->save([$param['field'] => $param['value']]);
+            } else {
+                $state = $this->model->where("id",$param['id'])->save([$param['field'] => $param['value']]);
+            }
+            if (!$state) return errorTrans("error.data");
+            return successTrans("success.data");
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+
+    /**
+     * 删除
+     * @param Request $request
+     * @return Response
+     */
+    #[Route(path: "del",methods: "post")]
+    public function delUser(Request $request): Response
+    {
+        try {
+            $param = $this->_valid([
+                "id.require"    => trans("empty.require"),
+                "type.default"  => "one",
+            ],"post");
+            if (!is_array($param)) return error($param);
+            if ($param['type'] == "batch") {
+                $state = $this->model->where("id","in",$param['id'])->delete();
+            } else {
+                $data = $this->model->where("id",$param['id'])->findOrEmpty();
+                if ($data->isEmpty()) return errorTrans("empty.data");
+                // 删除其他相关数据
+                $state = $data->delete();
+            }
+            if (!$state) return errorTrans("error.data");
+            return successTrans("success.data");
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+}

+ 1 - 1
app/controller/common/Common.php

@@ -26,7 +26,7 @@ class Common extends Base
         try {
             $captcha = Captcha::base64();
             $service = (new SystemConfig)->where("type","service")->column("value","name");
-            return successTrans("success",compact('captcha','service'));
+            return successTrans("success.data",compact('captcha','service'));
         } catch (\Throwable $throwable) {
             return error($throwable->getMessage());
         }

+ 17 - 3
app/controller/common/Login.php

@@ -5,6 +5,7 @@ namespace app\controller\common;
 use app\extra\basic\Base;
 use app\extra\service\basic\SmsService;
 use app\middleware\AuthMiddleware;
+use app\model\saas\SaasAgent;
 use app\model\system\SystemUser;
 use Hzdad\Codecheck\Codecheck;
 use LinFly\Annotation\Route\Controller;
@@ -63,7 +64,6 @@ class Login extends Base
             ],"post");
             if (!is_array($param)) return error($param);
             $code = (new Codecheck)->mobile($param['mobile'])->scene($param['scene'])->code($param['code'])->delafterok(true)->check();
-            print_r((new Codecheck)->getErrorMsg());
             if (!$code) return errorTrans("error.captcha");
             $map = ["is_deleted" => 0,"mobile" => $param['mobile']];
             [$state,$msg,$user] = $this->checkLogin($map);
@@ -87,6 +87,10 @@ class Login extends Base
         $user = (new SystemUser)->where($map)->findOrEmpty();
         if ($user->isEmpty()) return [0,trans("error.user-empty"),[]];
         if ($user['status'] <> 1) return [0,trans("error.user-status"),[]];
+        $typeUser = $this->getTypeUser($user['agent_id']);
+        if (empty($typeUser)) return [0,trans("empty.agent"),[]];
+        if ($typeUser['status'] <> 1) return [0,trans("error.agent"),[]];
+        if (time() > strtotime($typeUser['vip_at'])) return [0,trans("error.agent-out"),[]];
         if ($type == 2) {
             if (md5($param['password'].$user['salt']) <> $user['password']) return [0,trans("error.passwd"),[]];
         }
@@ -97,6 +101,15 @@ class Login extends Base
         return [1,'success',$user->toArray()];
     }
 
+    /**
+     * 获取代理信息
+     * @param int $agentId
+     * @return array
+     */
+    protected function getTypeUser(int $agentId = 0): array
+    {
+        return (new SaasAgent)->where("agent_id",$agentId)->findOrEmpty()->toArray();
+    }
 
     /**
      * @return Response
@@ -107,11 +120,12 @@ class Login extends Base
         try {
             $userData = (new Auth)->guard("admin")->user()->toArray();
             if (isset($userData['password'])) unset($userData['password']);
-            if (empty($userData['vip_at']))
+            $agent = (new SaasAgent)->where("agent_id",$userData['agent_id'])->findOrEmpty();
+            if (empty($agent['vip_at']))
             {
                 $userData['vip_at'] = 0;
             } else {
-                $userData['vip_at'] = strtotime($userData['vip_at']);
+                $userData['vip_at'] = strtotime($agent['vip_at']);
             }
             return successTrans("success.data",[
                 "username"  => $userData['username'],

+ 61 - 0
app/controller/common/Sms.php

@@ -0,0 +1,61 @@
+<?php
+
+namespace app\controller\common;
+
+use app\extra\basic\Base;
+use app\extra\service\basic\SmsService;
+use app\middleware\AuthMiddleware;
+use LinFly\Annotation\Route\Controller;
+use LinFly\Annotation\Route\Route;
+use support\Request;
+use support\Response;
+use Tinywan\Captcha\Captcha;
+use Webman\Annotation\Middleware;
+
+
+#[Controller(prefix: "/api/sms"),Middleware(AuthMiddleware::class)]
+class Sms extends Base
+{
+
+    /**
+     * 图片验证码
+     */
+    #[Route(path: "captcha",methods: "get")]
+    public function getCaptcha(): Response
+    {
+        try {
+            $captcha = Captcha::base64();
+            return successTrans("success.data",$captcha);
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+
+    /**
+     * 发送登录/注册验证码
+     * @param Request $request
+     * @return Response
+     */
+    #[Route(path: "send",methods: "post")]
+    public function getSms(Request $request): Response
+    {
+        try {
+            $param = $this->_valid([
+                "mobile.require"    => trans("empty.mobile"),
+                "mobile.mobile"     => trans("error.mobile"),
+                "code.require"      => trans("empty.code"),
+                "key.require"       => trans("empty.data"),
+                "scene.require"     => trans("empty.data"),
+            ],"post");
+            if (!is_array($param)) return error($param);
+            if (Captcha::check($param['code'],$param['key']) === false) return errorTrans("error.captcha");
+            [$state,$msg] = (new SmsService)->sendSceneSms($param['mobile'],$param['scene'], $param['scene']=='register');
+            if (!$state) return error($msg);
+            return success($msg);
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+}

+ 20 - 27
app/extra/basic/Base.php

@@ -2,6 +2,8 @@
 
 namespace app\extra\basic;
 
+use app\extra\tools\CodeExtend;
+use app\model\system\SystemUser;
 use Overtrue\EasySms\Strategies\OrderStrategy;
 use think\Validate;
 
@@ -26,6 +28,24 @@ class Base
         return $data['account_id'];
     }
 
+
+    /**
+     * 写入新用户
+     * @param array $param
+     * @return bool
+     */
+    protected function sceneUser(array $param = [],int $type = 1): bool
+    {
+        if (!isset($param['id']))
+        {
+            $param['salt'] = strtoupper(CodeExtend::random(10,3));
+            $param['password'] = md5($param['password'].$param['salt']);
+            $param['create_ip'] = request()->getRealIp() ?: '127.0.0.1';
+            $param['type'] = $type;
+        }
+        return (new SystemUser)->setAutoData($param,"agent_id");
+    }
+
     protected function getSmsChannel(): array
     {
         return [
@@ -47,33 +67,6 @@ class Base
         ];
     }
 
-    /**
-     * 短信配置
-     * @return array
-     */
-    protected function getSmsConfig(): array
-    {
-        $sms = sysconf('sms.');
-        return [
-            'enable' => true,
-            'timeout' => 5.0,
-            "default"   => [
-                "strategy"  => OrderStrategy::class,
-                "gateways"  => [$sms['sms_type']]
-            ],
-            "gateways"  => [
-                'errorlog' => [
-                    'file' => runtime_path().'/tmp/easy-sms.log',
-                ],
-                'aliyun' => [
-                    'access_key_id' => $sms['AccessKeyId'],
-                    'access_key_secret' => $sms['AccessKeySecret'],
-                    'sign_name' => trim($sms['sign']),
-                ],
-            ]
-        ];
-    }
-
     /**
      *  快捷输入并验证( 支持 规则 # 别名 )
      * @param array $rules 验证规则( 验证信息数组 )

+ 0 - 7
app/extra/basic/Service.php

@@ -93,13 +93,6 @@ class Service
             $commonFilter[] = ['create_at', '>=', $start ];
             $commonFilter[] = ['create_at', '<', $end ];
         }
-        if (!empty($param['repay'])) {
-            $times = between_time($param['repay']);
-            $start = date('Y-m-d',$times['start_time']);
-            $end = date('Y-m-d',($times['end_time'] + 86400));
-            $commonFilter[] = ['repay_time', '>=', $start ];
-            $commonFilter[] = ['repay_time', '<', $end ];
-        }
         $filter = array_merge($filter,$commonFilter);
         if (!empty($join)) {
             $this->mode =  $this->mode->alias('a')->join("{$join} {$prefix}","a.{$forKey} = {$prefix}.{$localKey}")->field($field);

+ 37 - 0
app/extra/service/agent/StoreService.php

@@ -0,0 +1,37 @@
+<?php
+
+namespace app\extra\service\agent;
+
+use app\extra\basic\Service;
+use app\model\saas\SaasStore;
+
+class StoreService extends Service
+{
+    /**
+     * 列表
+     * @param array $param
+     */
+    public function getList(array $param = [])
+    {
+        $this->mode = new SaasStore();
+        return $this->searchVal($param,$this->searchFilter($param))->with(['user' => function($query){
+            $query->field("user_id,username");
+        }])->paginate([
+            "list_rows" => $param['pageSize'],
+            "page"      => $param['page']
+        ]);
+    }
+
+
+
+    protected function searchFilter(array $param = []): array
+    {
+        $filter = [];
+        !empty($param['agent']) && $filter[] = ["agent_id", '=', $param['agent']];
+        !empty($param['store']) && $filter[] = ["store_id", '=', $param['store']];
+        !empty($param['status']) && $filter[] = ["status", '=', $param['status']];
+        !empty($param['type']) && $filter[] = ["store_type", '=', $param['type']];
+        !empty($param['title']) && $filter[] = ["title", 'like', "%{$param['title']}%"];
+        return $filter;
+    }
+}

+ 39 - 0
app/extra/service/agent/UserService.php

@@ -0,0 +1,39 @@
+<?php
+
+namespace app\extra\service\agent;
+
+use app\extra\basic\Service;
+use app\model\saas\SaasAgent;
+
+class UserService extends Service
+{
+
+    /**
+     * 列表
+     * @param array $param
+     */
+    public function getList(array $param = [])
+    {
+        $this->mode = new SaasAgent();
+        return $this->searchVal($param,$this->searchFilter($param))->with(['user' => function($query){
+            $query->field("user_id,username");
+        }])->paginate([
+            "list_rows" => $param['pageSize'],
+            "page"      => $param['page']
+        ]);
+    }
+
+
+
+    protected function searchFilter(array $param = []): array
+    {
+        $filter = [];
+        !empty($param['agent']) && $filter[] = ["agent_id", '=', $param['agent']];
+        !empty($param['store']) && $filter[] = ["store_id", '=', $param['store']];
+        !empty($param['status']) && $filter[] = ["status", '=', $param['status']];
+        !empty($param['type']) && $filter[] = ["store_type", '=', $param['type']];
+        !empty($param['title']) && $filter[] = ["title", 'like', "%{$param['title']}%"];
+        return $filter;
+    }
+
+}

+ 2 - 2
app/extra/service/basic/KeyService.php

@@ -5,9 +5,9 @@ namespace app\extra\service\basic;
 class KeyService
 {
 
-    public static function smsKey(int $mobile): string
+    public static function smsKey(int $mobile,string $scene = "login"): string
     {
-        return "sms_{$mobile}";
+        return "sms_{$mobile}_{$scene}";
     }
 
 }

+ 2 - 2
app/extra/service/basic/SmsService.php

@@ -24,7 +24,7 @@ class SmsService extends Service
             $mobileUser =(new SystemUser)->where("mobile",$mobile)->findOrEmpty();
             if (!$empty && $mobileUser->isEmpty()) return [0,trans("error.mobile-empty")];
             if ($empty && !$mobileUser->isEmpty()) return [0,trans("error.mobile-exist")];
-            $cacheCode = Cache::get(KeyService::smsKey($mobile));
+            $cacheCode = Cache::get(KeyService::smsKey($mobile,$scene));
             if (!empty($cacheCode)) return [0,trans("error.sms-repeat")];
             $code = (new Codecheck)->mobile($mobile)->scene($scene)->create();
             if (!in_array($mobile,$this->mobileWhite)) {
@@ -40,7 +40,7 @@ class SmsService extends Service
             } else {
                 $msg = "当前号码为测试号码,验证码为{$code}";
             }
-            Cache::set(KeyService::smsKey($mobile),$code,60);
+            Cache::set(KeyService::smsKey($mobile,$scene),$code,60);
             return [1,$msg];
         } catch (\Throwable $throwable) {
             return [0,$throwable->getMessage()];

+ 37 - 0
app/extra/service/system/UserService.php

@@ -0,0 +1,37 @@
+<?php
+
+namespace app\extra\service\system;
+
+use app\extra\basic\Service;
+use app\model\system\SystemUser;
+
+class UserService extends Service
+{
+
+    /**
+     * 列表
+     * @param array $param
+     */
+    public function getList(array $param = [])
+    {
+        $this->mode = new SystemUser();
+        return $this->searchVal($param,$this->searchFilter($param))->paginate([
+            "list_rows" => $param['pageSize'],
+            "page"      => $param['page']
+        ]);
+    }
+
+
+
+    protected function searchFilter(array $param = []): array
+    {
+        $filter = [];
+        !empty($param['agent']) && $filter[] = ["agent_id", '=', $param['agent']];
+        !empty($param['store']) && $filter[] = ["store_id", '=', $param['store']];
+        !empty($param['status']) && $filter[] = ["status", '=', ($param['status']-1)];
+        !empty($param['mobile']) && $filter[] = ["mobile", 'like', "%{$param['mobile']}%"];
+        !empty($param['username']) && $filter[] = ["username", 'like', "%{$param['username']}%"];
+        return $filter;
+    }
+
+}

+ 55 - 0
app/model/saas/SaasAgent.php

@@ -0,0 +1,55 @@
+<?php
+
+namespace app\model\saas;
+
+use app\extra\basic\Model;
+
+
+/**
+ * @property integer $id (主键)
+ * @property string $truename 
+ * @property integer $agent_id 
+ * @property string $contact 
+ * @property mixed $mobile 
+ * @property integer $mall_type 1系统2自定义
+ * @property mixed $vip_at 
+ * @property integer $status 1正常2冻结3到期
+ * @property mixed $create_at
+ */
+class SaasAgent extends Model
+{
+    /**
+     * The connection name for the model.
+     *
+     * @var string|null
+     */
+    protected $connection = 'mysql';
+    
+    /**
+     * The table associated with the model.
+     *
+     * @var string
+     */
+    protected string $table = "saas_agent";
+    
+    /**
+     * The primary key associated with the table.
+     *
+     * @var string
+     */
+    protected string $primaryKey = "id";
+    
+    /**
+     * Indicates if the model should be timestamped.
+     *
+     * @var bool
+     */
+    public bool $timestamps = false;
+
+
+    public function user()
+    {
+        return $this->hasOne("app\model\system\SystemUser","user_id","agent_id");
+    }
+
+}

+ 44 - 0
app/model/saas/SaasFactory.php

@@ -0,0 +1,44 @@
+<?php
+
+namespace app\model\saas;
+
+use app\extra\basic\Model;
+
+
+/**
+ * @property integer $id (主键)
+ * @property integer $factory_id 
+ * @property mixed $create_at
+ */
+class SaasFactory extends Model
+{
+    /**
+     * The connection name for the model.
+     *
+     * @var string|null
+     */
+    protected $connection = 'mysql';
+    
+    /**
+     * The table associated with the model.
+     *
+     * @var string
+     */
+    protected string $table = "saas_factory";
+    
+    /**
+     * The primary key associated with the table.
+     *
+     * @var string
+     */
+    protected string $primaryKey = "id";
+    
+    /**
+     * Indicates if the model should be timestamped.
+     *
+     * @var bool
+     */
+    public bool $timestamps = false;
+
+
+}

+ 44 - 0
app/model/saas/SaasStore.php

@@ -0,0 +1,44 @@
+<?php
+
+namespace app\model\saas;
+
+use app\extra\basic\Model;
+
+
+/**
+ * @property integer $id (主键)
+ * @property integer $store_id 
+ * @property mixed $create_at
+ */
+class SaasStore extends Model
+{
+    /**
+     * The connection name for the model.
+     *
+     * @var string|null
+     */
+    protected $connection = 'mysql';
+    
+    /**
+     * The table associated with the model.
+     *
+     * @var string
+     */
+    protected string $table = "saas_store";
+    
+    /**
+     * The primary key associated with the table.
+     *
+     * @var string
+     */
+    protected string $primaryKey = "id";
+    
+    /**
+     * Indicates if the model should be timestamped.
+     *
+     * @var bool
+     */
+    public bool $timestamps = false;
+
+
+}

+ 42 - 0
app/validate/user/AgentValidate.php

@@ -0,0 +1,42 @@
+<?php
+
+namespace app\validate\user;
+
+use support\Translation;
+use think\Validate;
+
+class AgentValidate extends Validate
+{
+
+    protected $rule = [
+        "truename"  => "require",
+        "contact"   => "require",
+        "mobile"    => "require|mobile",
+        "yzm"       => "require|number",
+        "vip_at"    => "require|date",
+        "mall_type" => "require",
+        "password"  => "require",
+        "scene"     => "require"
+    ];
+
+
+    protected $message = [
+        "truename.require"  => "请输入代理名称",
+        "contact.require"   => "请输入联系人",
+        "mobile.require"    => "请输入手机号码",
+        "mobile.mobile"     => "手机号码格式错误",
+        "yzm.require"       => "请输入短信验证码",
+        "yzm.number"        => "短信验证码为纯数字",
+        "vip_at.require"    => "请选择到期时间",
+        "vip_at.date"       => "到期时间格式错误",
+        "mall_type.require" => "请选择商城小程序类型",
+        "password.require"  => "请输入密码",
+        "scene.require"     => "存在遗漏参数",
+    ];
+
+
+    protected $scene = [
+        "edit"  => ["truename","contact","mall_type","vip_at"]
+    ];
+
+}

+ 48 - 0
app/validate/user/StoreValidate.php

@@ -0,0 +1,48 @@
+<?php
+
+namespace app\validate\user;
+
+use think\Validate;
+
+class StoreValidate extends Validate
+{
+
+
+    protected $rule = [
+        "agent_id"          => "require",
+        "truename"          => "require",
+        "store_mch"         => "require",
+        "store_type"        => "require",
+        "wash_type"         => "require|date",
+        "store_address"     => "require",
+        "license"           => "require",
+        "store_status"      => "require",
+        "store_goods"       => "require",
+        "store_system"      => "require",
+        "store_order"       => "require",
+        "mobile"            => "require|mobile",
+        "yzm"               => "requir|number",
+        "password"          => "require"
+    ];
+
+
+    protected $message = [
+        "truename.require"  => "请输入代理名称",
+        "contact.require"   => "请输入联系人",
+        "mobile.require"    => "请输入手机号码",
+        "mobile.mobile"     => "手机号码格式错误",
+        "yzm.require"       => "请输入短信验证码",
+        "yzm.number"        => "短信验证码为纯数字",
+        "vip_at.require"    => "请选择到期时间",
+        "vip_at.date"       => "到期时间格式错误",
+        "mall_type.require" => "请选择商城小程序类型",
+        "password.require"  => "请输入密码",
+        "scene.require"     => "存在遗漏参数",
+    ];
+
+
+    protected $scene = [
+        "edit"  => ["truename","contact","mall_type","vip_at"]
+    ];
+
+}

+ 35 - 0
app/validate/user/UserValidate.php

@@ -0,0 +1,35 @@
+<?php
+
+namespace app\validate\user;
+
+use think\Validate;
+
+class UserValidate extends Validate
+{
+
+
+    protected $rule = [
+        "truename"  => "require",
+        "mobile"    => "require|mobile",
+        "yzm"       => "require|number",
+        "password"  => "require",
+        "scene"     => "require"
+    ];
+
+
+    protected $message = [
+        "truename.require"  => "请输入代理名称",
+        "mobile.require"    => "请输入手机号码",
+        "mobile.mobile"     => "手机号码格式错误",
+        "yzm.require"       => "请输入短信验证码",
+        "yzm.number"        => "短信验证码为纯数字",
+        "password.require"  => "请输入密码",
+        "scene.require"     => "存在遗漏参数",
+    ];
+
+
+    protected $scene = [
+        "edit"  => ["truename","password"]
+    ];
+
+}

+ 7 - 2
resource/translations/zh_CN/messages.php

@@ -8,7 +8,8 @@ return [
         "passwd"    => "请输入登陆密码",
         "code"      => "请输入验证码",
         "data"      => "数据不存在",
-        "require"   => "参数不能为空"
+        "require"   => "参数不能为空",
+        "agent"     => "未绑定代理信息"
     ],
     "error"     => [
         "data"          => "操作失败",
@@ -19,11 +20,15 @@ return [
         "mobile-empty"  => "手机号未注册,请开通后再重试",
         "mobile-exist"  => "手机号已被注册",
         "user-empty"    => "登录账号不存在",
+        "user-exist"    => "登录账号已存在,请更换",
         "user-status"   => "该账号已被冻结,请联系管理员",
         "passwd"        => "登录密码错误",
         "param"         => "不合法的参数",
         "request"       => "不合法的请求格式",
-        "login"         => "登录已过期,请重新登录"
+        "login"         => "登录已过期,请重新登录",
+        "sms-err"       => "短信验证码错误",
+        "agent"         => "代理状态异常,请联系管理员",
+        "agent-out"     => "权限已到期,请联系管理员"
     ],
     "success"   => [
         "data"  => "操作成功",