Zory 1 månad sedan
förälder
incheckning
35ebcca9ce

+ 128 - 0
app/controller/admin/Combo.php

@@ -0,0 +1,128 @@
+<?php
+
+namespace app\controller\admin;
+
+use app\extra\basic\Base;
+use app\extra\service\saas\ComboService;
+use app\extra\tools\CodeExtend;
+use app\middleware\AuthMiddleware;
+use app\model\saas\SaasCombo;
+use app\model\system\SystemUser;
+use app\validate\saas\ComboValidate;
+use DI\Attribute\Inject;
+use LinFly\Annotation\Route\Controller;
+use LinFly\Annotation\Route\Route;
+use support\Request;
+use support\Response;
+use Webman\Annotation\Middleware;
+
+
+#[Controller(prefix: "/api/combo"),Middleware(AuthMiddleware::class)]
+class Combo extends Base
+{
+
+    #[Inject]
+    protected ComboValidate $validate;
+
+    #[Inject]
+    protected SaasCombo $model;
+
+    #[Inject]
+    protected ComboService $service;
+
+
+    #[Route(path: "list",methods: "get")]
+    public function getStoreList(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 (!empty($param['money'])) $param['money'] = $param['money'] * 100;
+            if (!empty($param['old_money'])) $param['old_money'] = $param['old_money'] * 100;
+            if (!$this->validate->check($param)) return error($this->validate->getError());
+            $state = $this->model->setAutoData($param);
+            if (!$state) return errorTrans("error.data");
+            return successTrans("success.data");
+        } catch (\Throwable $throwable) {
+            echo $throwable->getMessage()."\n";
+            echo $throwable->getFile()."\n";
+            echo $throwable->getLine()."\n";
+            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());
+        }
+    }
+
+}

+ 34 - 0
app/controller/admin/Shop.php

@@ -7,6 +7,7 @@ use app\extra\service\saas\ShopService;
 use app\extra\tools\CodeExtend;
 use app\middleware\AuthMiddleware;
 use app\model\saas\SaasAgent;
+use app\model\saas\SaasCombo;
 use app\model\saas\SaasStore;
 use app\model\saas\SaasStoreShop;
 use app\model\system\SystemUser;
@@ -65,6 +66,7 @@ class Shop extends Base
             if (!$this->validate->check($param)) return error($this->validate->getError());
             $state = $this->model->setAutoData($param);
             if (!$state) return errorTrans("error.data");
+            $param['truename'] = $param['shop_name'];
             $this->sceneUser($param,2,"id");
             return successTrans("success.data");
         } catch (\Throwable $throwable) {
@@ -75,6 +77,38 @@ class Shop extends Base
         }
     }
 
+    /**
+     * 充值套餐
+     * @param Request $request
+     * @return Response
+     */
+    #[Route(path: "combo",methods: "post")]
+    public function comboData(Request $request): Response
+    {
+        try {
+            $param = $request->post();
+            if (empty($param['combo'])) return errorTrans("empty.require");
+            if (empty($param['shop_id'])) return errorTrans("empty.require");
+            $combo = (new SaasCombo)->where("id",$param['combo'])->findOrEmpty();
+            if ($combo->isEmpty()) return errorTrans("empty.data");
+            $shop = (new SaasAgent)->where("agent_id",$param['shop_id'])->findOrEmpty();
+            if ($shop->isEmpty()) return errorTrans("empty.data");
+            if ($combo['unit'] == 1) { // 天
+                $shop->vip_end = date('Y-m-d H:i:s',strtotime("+{$combo['time']} day"));
+            } else {
+                $shop->vip_end = date('Y-m-d H:i:s',strtotime("+{$combo['time']} year"));
+            }
+            $state = $shop->save();
+            if (!$state) return errorTrans("error.data");
+            return successTrans("success.data");
+        } catch (\Throwable $throwable) {
+            echo $throwable->getMessage()."\n";
+            echo $throwable->getFile()."\n";
+            echo $throwable->getLine()."\n";
+            return error($throwable->getMessage());
+        }
+    }
+
     /**
      * 新增/编辑代理
      * @param Request $request

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

@@ -0,0 +1,185 @@
+<?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\saas\UserValidate;
+use DI\Attribute\Inject;
+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 SystemUser $model;
+
+    #[Inject]
+    protected UserValidate $validate;
+
+    protected string $scene = "edit";
+
+    #[Route(path: "list",methods: "get")]
+    public function getStoreList(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: "passwd",methods: "post")]
+    public function setUserPasswd(Request $request): Response
+    {
+        try {
+            $param = $this->_valid([
+                "id.require"        => trans(20010),
+                "password.require"  => trans(20010)
+            ],"post");
+            if (!is_array($param)) return error($param);
+            $user = $this->model->where("id",$param['id'])->findOrEmpty();
+            if ($user->isEmpty()) return errorTrans("empty.error");
+            $user->password = md5($param['password'].$user['salt']);
+            $state = $user->save();
+            if (!$state) return errorTrans("error.data");
+            return successTrans("success.data");
+        } 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();
+            $param['salt'] = strtoupper(CodeExtend::random(10,3));
+            $param['password'] = md5($param['password'].$param['salt']);
+            if (!$this->validate->check($param)) return error($this->validate->getError());
+            $user = $this->model->where("username",$param['username'])->findOrEmpty();
+            if (!$user->isEmpty()) return errorTrans("error.user-exist");
+            $state = $this->model->setAutoData($param);
+            if (!$state) return errorTrans("error.data");
+            return successTrans("success.data");
+        } catch (\Throwable $throwable) {
+            echo $throwable->getMessage()."\n";
+            echo $throwable->getFile()."\n";
+            echo $throwable->getLine()."\n";
+            return error($throwable->getMessage());
+        }
+    }
+
+    /**
+     * 修改密码
+     * @param Request $request
+     * @return Response
+     */
+    #[Route(path: "state",methods: "post")]
+    public function setUserState(Request $request): Response
+    {
+        try {
+            $param = $this->_valid([
+                "id.require"        => trans(20010)
+            ],"post");
+            if (!is_array($param)) return error($param);
+            $user = $this->model->where("id",$param['id'])->findOrEmpty();
+            if ($user->isEmpty()) return errorTrans("empty.error");
+            if ($user['status'] == 1) {
+                $user->status = 0;
+            } else {
+                $user->status = 1;
+            }
+            $user->updated_at = getDateFull();
+            $state = $user->save();
+            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());
+        }
+    }
+
+
+}

+ 34 - 0
app/extra/service/saas/ComboService.php

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

+ 1 - 1
app/extra/service/system/UserService.php

@@ -16,7 +16,7 @@ class UserService extends Service
     {
         $this->mode = new SystemUser();
         return $this->searchVal($param,$this->searchFilter($param))->with(['account' => function ($query) {
-            $query->field("store_id,store_name");
+            $query->field("agent_id,shop_name");
         }])->paginate([
             "list_rows" => $param['pageSize'],
             "page"      => $param['page']

+ 62 - 0
app/model/saas/SaasCombo.php

@@ -0,0 +1,62 @@
+<?php
+
+namespace app\model\saas;
+
+use app\extra\basic\Model;
+
+
+/**
+ * @property integer $id (主键)
+ * @property string $name 
+ * @property integer $sort 
+ * @property integer $time 
+ * @property integer $unit 1天2年
+ * @property integer $money 金额
+ * @property integer $old_money 原价
+ * @property integer $status 
+ * @property mixed $create_at
+ */
+class SaasCombo 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_combo";
+    
+    /**
+     * 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 getMoneyAttr($data): string
+    {
+        if (empty($data)) return "0.00";
+        return format_money($data/100,2,"");
+    }
+
+    public function getOldMoneyAttr($data): string
+    {
+        if (empty($data)) return "0.00";
+        return format_money($data/100,2,"");
+    }
+
+}

+ 21 - 16
app/model/system/SystemUser.php

@@ -3,25 +3,26 @@
 namespace app\model\system;
 
 use app\extra\basic\Model;
+use think\model\relation\HasOne;
 
 
 /**
- * @property integer $id (主键)
- * @property integer $agent_id 代理ID
- * @property string $username 用户名
- * @property string $truename 真实姓名
- * @property string $password 密码
- * @property mixed $salt 密钥串
- * @property integer $status 状态
- * @property integer $type 1管理员2代理子账号3店铺账号
- * @property integer $is_deleted 删除状态
- * @property integer $is_super 
- * @property string $remark 备注
- * @property string $login_ip 登录IP
- * @property mixed $login_at 登录时间
- * @property integer $login_num 
- * @property string $create_ip 
- * @property mixed $updated_at 更新时间
+ * @property integer $id (主键)
+ * @property integer $agent_id 代理ID
+ * @property string $username 用户名
+ * @property string $truename 真实姓名
+ * @property string $password 密码
+ * @property mixed $salt 密钥串
+ * @property integer $status 状态
+ * @property integer $type 1管理员2代理子账号3店铺账号
+ * @property integer $is_deleted 删除状态
+ * @property integer $is_super 
+ * @property string $remark 备注
+ * @property string $login_ip 登录IP
+ * @property mixed $login_at 登录时间
+ * @property integer $login_num 
+ * @property string $create_ip 
+ * @property mixed $updated_at 更新时间
  * @property mixed $create_at 创建时间
  */
 class SystemUser extends Model
@@ -54,5 +55,9 @@ class SystemUser extends Model
      */
     public bool $timestamps = false;
 
+    public function account(): HasOne
+    {
+        return $this->hasOne("app\model\saas\SaasAgent","agent_id","agent_id");
+    }
 
 }

+ 27 - 0
app/validate/saas/ComboValidate.php

@@ -0,0 +1,27 @@
+<?php
+
+namespace app\validate\saas;
+
+use think\Validate;
+
+class ComboValidate extends Validate
+{
+
+    protected $rule = [
+        "name"          => "require",
+        "time"          => "require",
+        "unit"          => "require",
+        "money"         => "require",
+        "old_money"     => "require",
+    ];
+
+
+    protected $message = [
+        "name.require"      => "请输入套餐名称",
+        "time.require"      => "请输入时长",
+        "unit.require"      => "请选择类型",
+        "money.require"     => "请输入套餐金额",
+        "old_money.require" => "请输入套餐划线金额",
+    ];
+
+}

+ 2 - 2
app/validate/saas/UserValidate.php

@@ -8,14 +8,14 @@ class UserValidate extends Validate
 {
 
     protected $rule = [
-        "agent_id"      => "require",
+        "username"      => "require",
         "password"      => "require",
         "salt"          => "require",
     ];
 
 
     protected $message = [
-        "agent_id.require"      => "请选择代理",
+        "username.require"      => "请输入登录账号",
         "password.require"      => "请输入密码",
         "salt.require"          => "数据加密失败",
     ];

+ 0 - 1
config/plugin/linfly/annotation/route.php

@@ -12,7 +12,6 @@ namespace LinFly\Annotation\Handle;
 
 use LinFly\Annotation\Bootstrap\AnnotationBootstrap;
 
-
 if (!AnnotationBootstrap::isIgnoreProcess()) {
     RouteAnnotationHandle::createRoute();
 }

+ 0 - 0
webman